@swapkit/toolboxes 4.0.0-beta.43 → 4.0.0-beta.44

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.
@@ -1,6 +1,6 @@
1
- var OZ={};FZ(OZ,{validateZcashAddress:()=>XX,toLegacyAddress:()=>x,toCashAddress:()=>c,stripToCashAddress:()=>f,stripPrefix:()=>l,nonSegwitChains:()=>n,isValidAddress:()=>jX,getUtxoToolbox:()=>IZ,getUtxoNetwork:()=>_,getUtxoApi:()=>F,getUTXOAddressValidator:()=>gX,getScriptTypeForAddress:()=>p,getOutputSize:()=>u,getInputSize:()=>k,getDustThreshold:()=>i,getCreateKeysForPath:()=>d,detectAddressNetwork:()=>BX,createZcashToolbox:()=>UX,createUTXOToolbox:()=>w,createCustomUtxoApi:()=>aX,createBCHToolbox:()=>TX,compileMemo:()=>R,calculateTxSize:()=>g,bchValidateAddress:()=>K,addressFromKeysGetter:()=>MX,accumulative:()=>A,UtxoNetwork:()=>qX,UTXOScriptType:()=>s,TX_OVERHEAD:()=>a,OutputSizes:()=>o,OP_RETURN_OVERHEAD:()=>VX,MIN_TX_FEE:()=>JZ,InputSizes:()=>t});module.exports=_Z(OZ);var P=require("@swapkit/helpers");var h=require("@psf/bitcoincashjs-lib"),v=require("@swapkit/helpers"),hX=require("bitcoinjs-lib");var D=require("@swapkit/helpers"),_X=require("bitcoinjs-lib");var E=S(require("coininfo"));async function uX({chain:X,txHash:Z}){let G=D.SKConfig.get("rpcUrls")[X],J=JSON.stringify({jsonrpc:"2.0",method:"sendrawtransaction",params:[Z],id:IX()}),Q=await D.RequestClient.post(G,{headers:{"Content-Type":"application/json"},body:J});if(Q.error)throw new D.SwapKitError("toolbox_utxo_broadcast_failed",{error:Q.error?.message});if(Q.result.includes('"code":-26'))throw new D.SwapKitError("toolbox_utxo_invalid_transaction",{error:"Transaction amount was too low"});return Q.result}function QX(X){return`https://api.blockchair.com/${pX(X)}`}function vX(X){switch(X){case D.Chain.Bitcoin:return 5;case D.Chain.Dogecoin:return 1e4;case D.Chain.Litecoin:return 1;case D.Chain.Zcash:return 1;default:return 2}}function pX(X){switch(X){case D.Chain.BitcoinCash:return"bitcoin-cash";case D.Chain.Litecoin:return"litecoin";case D.Chain.Dash:return"dash";case D.Chain.Dogecoin:return"dogecoin";case D.Chain.Zcash:return"zcash";case D.Chain.Polkadot:return"polkadot";default:return"bitcoin"}}async function oX(X){try{let{feePerKb:Z}=await D.RequestClient.get(`https://app.bitgo.com/api/v2/${X.toLowerCase()}/tx/fee`),G=Z/1000;return Math.max(G,vX(X))}catch(Z){return vX(X)}}async function $X(X,Z){try{let G=await D.RequestClient.get(X);if(!G||G.context.code!==200)throw new D.SwapKitError("toolbox_utxo_api_error",{error:`Failed to query ${X}`});return G.data}catch(G){if(!Z)throw G;let J=await D.RequestClient.get(`${X}${Z?`&key=${Z}`:""}`);if(!J||J.context.code!==200)throw new D.SwapKitError("toolbox_utxo_api_error",{error:`Failed to query ${X}`});return J.data}}async function FX({address:X,chain:Z,apiKey:G}){if(!X)throw new D.SwapKitError("toolbox_utxo_invalid_params",{error:"Address is required"});try{return(await $X(`${QX(Z)}/dashboards/address/${X}?transaction_details=true`,G))[X]}catch(J){return{utxo:[],address:{balance:0,transaction_count:0}}}}async function nX({address:X,chain:Z,apiKey:G}){return(await FX({address:X,chain:Z,apiKey:G}))?.address.balance||0}async function OX({chain:X,apiKey:Z,txHash:G}){if(!G)throw new D.SwapKitError("toolbox_utxo_invalid_params",{error:"TxHash is required"});try{return(await $X(`${QX(X)}/raw/transaction/${G}`,Z))?.[G]?.raw_transaction||""}catch(J){return console.error("Failed to fetch raw transaction:",J),""}}async function dX({chain:X,address:Z,apiKey:G,offset:J=0,limit:Q=100}){return(await $X(`${QX(X)}/outputs?q=is_spent(false),recipient(${Z})&limit=${Q}&offset=${J}`,G)).filter(({is_spent:W})=>!W).map(({script_hex:W,block_id:q,transaction_hash:B,index:U,value:M,spending_signature_hex:z})=>({hash:B,index:U,value:M,txHex:z,script_hex:W,is_confirmed:q!==-1}))}async function NX({chain:X,address:Z,apiKey:G,offset:J=0,limit:Q=100}){if(!Z)throw new D.SwapKitError("toolbox_utxo_invalid_params",{error:"Address is required"});try{let L=await dX({chain:X,address:Z,apiKey:G,offset:J,limit:Q});if(L.length<=Q)return L;let $=await NX({chain:X,address:Z,apiKey:G,offset:J+Q,limit:Q});return[...L,...$]}catch(L){return console.error("Failed to fetch unspent UTXOs:",L),[]}}async function rX({address:X,chain:Z,apiKey:G,fetchTxHex:J=!0}){let Q=await NX({chain:Z,address:X,apiKey:G}),L=[];for(let{hash:$,index:W,script_hex:q,value:B}of Q){let U;if(J)U=await OX({txHash:$,chain:Z,apiKey:G});L.push({address:X,hash:$,index:W,txHex:U,value:B,witnessUtxo:{value:B,script:Buffer.from(q,"hex")}})}return L}function iX(X){let Z=D.SKConfig.get("apiKeys").blockchair||"";return D.warnOnce(!Z,"No Blockchair API key found. Functionality will be limited."),{broadcastTx:(G)=>uX({txHash:G,chain:X}),getRawTx:(G)=>OX({txHash:G,chain:X,apiKey:Z}),getSuggestedTxFee:()=>oX(X),getBalance:(G)=>nX({address:G,chain:X,apiKey:Z}),getAddressData:(G)=>FX({address:G,chain:X,apiKey:Z}),scanUTXOs:(G)=>rX({...G,chain:X,apiKey:Z})}}function aX(X){return X}function F(X){let Z=D.SKConfig.get("apis")[X];if(Z)return D.warnOnce(!0,"Using custom UTXO API. Be sure to implement all methods to avoid issues."),Z;return iX(X)}var sX={messagePrefix:`\x19Zcash Signed Message:
1
+ var OZ={};FZ(OZ,{validateZcashAddress:()=>XX,toLegacyAddress:()=>x,toCashAddress:()=>c,stripToCashAddress:()=>f,stripPrefix:()=>l,nonSegwitChains:()=>n,isValidAddress:()=>jX,getUtxoToolbox:()=>IZ,getUtxoNetwork:()=>_,getUtxoApi:()=>F,getUTXOAddressValidator:()=>gX,getScriptTypeForAddress:()=>p,getOutputSize:()=>u,getInputSize:()=>k,getDustThreshold:()=>i,getCreateKeysForPath:()=>d,detectAddressNetwork:()=>BX,createZcashToolbox:()=>UX,createUTXOToolbox:()=>K,createCustomUtxoApi:()=>aX,createBCHToolbox:()=>TX,compileMemo:()=>R,calculateTxSize:()=>g,bchValidateAddress:()=>w,addressFromKeysGetter:()=>MX,accumulative:()=>A,UtxoNetwork:()=>WX,UTXOScriptType:()=>s,TX_OVERHEAD:()=>a,OutputSizes:()=>o,OP_RETURN_OVERHEAD:()=>VX,MIN_TX_FEE:()=>JZ,InputSizes:()=>t});module.exports=_Z(OZ);var P=require("@swapkit/helpers");var h=require("@psf/bitcoincashjs-lib"),v=require("@swapkit/helpers"),hX=require("bitcoinjs-lib");var U=require("@swapkit/helpers"),_X=require("bitcoinjs-lib");var E=S(require("coininfo"));async function uX({chain:X,txHash:Z}){let G=U.SKConfig.get("rpcUrls")[X],J=JSON.stringify({jsonrpc:"2.0",method:"sendrawtransaction",params:[Z],id:IX()}),Q=await U.RequestClient.post(G,{headers:{"Content-Type":"application/json"},body:J});if(Q.error)throw new U.SwapKitError("toolbox_utxo_broadcast_failed",{error:Q.error?.message});if(Q.result.includes('"code":-26'))throw new U.SwapKitError("toolbox_utxo_invalid_transaction",{error:"Transaction amount was too low"});return Q.result}function QX(X){return`https://api.blockchair.com/${pX(X)}`}function vX(X){switch(X){case U.Chain.Bitcoin:return 5;case U.Chain.Dogecoin:return 1e4;case U.Chain.Litecoin:return 1;case U.Chain.Zcash:return 1;default:return 2}}function pX(X){switch(X){case U.Chain.BitcoinCash:return"bitcoin-cash";case U.Chain.Litecoin:return"litecoin";case U.Chain.Dash:return"dash";case U.Chain.Dogecoin:return"dogecoin";case U.Chain.Zcash:return"zcash";case U.Chain.Polkadot:return"polkadot";default:return"bitcoin"}}async function oX(X){try{let{feePerKb:Z}=await U.RequestClient.get(`https://app.bitgo.com/api/v2/${X.toLowerCase()}/tx/fee`),G=Z/1000;return Math.max(G,vX(X))}catch(Z){return vX(X)}}async function $X(X,Z){let G=await U.RequestClient.get(`${X}${Z?`${X.includes("?")?"&":"?"}key=${Z}`:""}`);if(!G||G.context.code!==200)throw new U.SwapKitError("toolbox_utxo_api_error",{error:`Failed to query ${X}`});return G.data}async function FX({address:X,chain:Z,apiKey:G}){if(!X)throw new U.SwapKitError("toolbox_utxo_invalid_params",{error:"Address is required"});try{return(await $X(`${QX(Z)}/dashboards/address/${X}?transaction_details=true`,G))[X]}catch(J){return{utxo:[],address:{balance:0,transaction_count:0}}}}async function nX({address:X,chain:Z,apiKey:G}){return(await FX({address:X,chain:Z,apiKey:G}))?.address.balance||0}async function OX({chain:X,apiKey:Z,txHash:G}){if(!G)throw new U.SwapKitError("toolbox_utxo_invalid_params",{error:"TxHash is required"});try{return(await $X(`${QX(X)}/raw/transaction/${G}`,Z))?.[G]?.raw_transaction||""}catch(J){return console.error("Failed to fetch raw transaction:",J),""}}async function dX({chain:X,address:Z,apiKey:G,offset:J=0,limit:Q=100}){return(await $X(`${QX(X)}/outputs?q=is_spent(false),recipient(${Z})&limit=${Q}&offset=${J}`,G)).filter(({is_spent:L})=>!L).map(({script_hex:L,block_id:W,transaction_hash:B,index:D,value:M,spending_signature_hex:z})=>({hash:B,index:D,value:M,txHex:z,script_hex:L,is_confirmed:W!==-1}))}async function NX({chain:X,address:Z,apiKey:G,offset:J=0,limit:Q=100}){if(!Z)throw new U.SwapKitError("toolbox_utxo_invalid_params",{error:"Address is required"});try{let q=await dX({chain:X,address:Z,apiKey:G,offset:J,limit:Q});if(q.length<=Q)return q;let $=await NX({chain:X,address:Z,apiKey:G,offset:J+Q,limit:Q});return[...q,...$]}catch(q){return console.error("Failed to fetch unspent UTXOs:",q),[]}}async function rX({address:X,chain:Z,apiKey:G,fetchTxHex:J=!0}){let Q=await NX({chain:Z,address:X,apiKey:G}),q=[];for(let{hash:$,index:L,script_hex:W,value:B}of Q){let D;if(J)D=await OX({txHash:$,chain:Z,apiKey:G});q.push({address:X,hash:$,index:L,txHex:D,value:B,witnessUtxo:{value:B,script:Buffer.from(W,"hex")}})}return q}function iX(X){let Z=U.SKConfig.get("apiKeys").blockchair||"";return U.warnOnce(!Z,"No Blockchair API key found. Functionality will be limited."),{broadcastTx:(G)=>uX({txHash:G,chain:X}),getRawTx:(G)=>OX({txHash:G,chain:X,apiKey:Z}),getSuggestedTxFee:()=>oX(X),getBalance:(G)=>nX({address:G,chain:X,apiKey:Z}),getAddressData:(G)=>FX({address:G,chain:X,apiKey:Z}),scanUTXOs:(G)=>rX({...G,chain:X,apiKey:Z})}}function aX(X){return X}function F(X){let Z=U.SKConfig.get("apis")[X];if(Z)return U.warnOnce(!0,"Using custom UTXO API. Be sure to implement all methods to avoid issues."),Z;return iX(X)}var sX={messagePrefix:`\x19Zcash Signed Message:
2
2
  `,bech32:"zc",bip32:{public:76067358,private:76066276},pubKeyHash:28,scriptHash:28,wif:128},tX={messagePrefix:`\x19Zcash Signed Message:
3
- `,bech32:"ztestsapling",bip32:{public:70617039,private:70615956},pubKeyHash:29,scriptHash:28,wif:239};function _(){return function X(Z){switch(Z){case D.Chain.Bitcoin:return _X.networks.bitcoin;case D.Chain.BitcoinCash:return E.default.bitcoincash.main.toBitcoinJS();case D.Chain.Dash:return E.default.dash.main.toBitcoinJS();case D.Chain.Litecoin:return E.default.litecoin.main.toBitcoinJS();case D.Chain.Dogecoin:{let G={private:70615956,public:70617039},J=E.default.dogecoin.test;return J.versions.bip32=G,E.default.dogecoin.main.toBitcoinJS()}case D.Chain.Zcash:{let{isStagenet:G}=D.SKConfig.get("envs");return G?tX:sX}default:throw new D.SwapKitError("toolbox_utxo_not_supported",{chain:Z})}}}var b=require("@swapkit/helpers"),LX=S(require("bs58check")),WX=S(require("cashaddrjs"));var qX;((G)=>{G.Mainnet="mainnet";G.Testnet="testnet"})(qX||={});var T={["legacy"]:{["mainnet"]:{["p2pkh"]:0,["p2sh"]:5},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}},["bitpay"]:{["mainnet"]:{["p2pkh"]:28,["p2sh"]:40},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}}};function jX(X){try{return r(X),!0}catch(Z){return!1}}function BX(X){return r(X)?.network}function x(X){let Z=r(X);if(Z?.format==="legacy")return X;return ZZ(Z)}function c(X){let Z=r(X);return GZ(Z)}function r(X){try{return eX(X)}catch(Z){}try{return XZ(X)}catch(Z){}throw new b.SwapKitError("toolbox_utxo_invalid_address",{address:X})}function eX(X){try{let Z=LX.default.decode(X);if(Z.length!==21)throw new b.SwapKitError("toolbox_utxo_invalid_address",{address:X});let G=Z[0],J=Array.prototype.slice.call(Z,1);switch(G){case T.legacy.mainnet.p2pkh:return{hash:J,format:"legacy",network:"mainnet",type:"p2pkh"};case T.legacy.mainnet.p2sh:return{hash:J,format:"legacy",network:"mainnet",type:"p2sh"};case T.legacy.testnet.p2pkh:return{hash:J,format:"legacy",network:"testnet",type:"p2pkh"};case T.legacy.testnet.p2sh:return{hash:J,format:"legacy",network:"testnet",type:"p2sh"};case T.bitpay.mainnet.p2pkh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2pkh"};case T.bitpay.mainnet.p2sh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2sh"};default:throw new b.SwapKitError("toolbox_utxo_invalid_address",{address:X})}}catch(Z){throw new b.SwapKitError("toolbox_utxo_invalid_address",{address:X})}}function XZ(X){if(X.indexOf(":")!==-1)try{return yX(X)}catch(Z){}else{let Z=["bitcoincash","bchtest","bchreg"];for(let G of Z)try{return yX(`${G}:${X}`)}catch(J){}}throw new b.SwapKitError("toolbox_utxo_invalid_address",{address:X})}function yX(X){try{let{hash:Z,prefix:G,type:J}=WX.default.decode(X);return{format:"cashaddr",hash:Array.prototype.slice.call(Z,0),network:G==="bitcoincash"?"mainnet":"testnet",type:J==="P2PKH"?"p2pkh":"p2sh"}}catch(Z){throw new b.SwapKitError("toolbox_utxo_invalid_address",{address:X})}}function ZZ(X){let Z=T.legacy[X.network][X.type],G=Buffer.alloc(1+X.hash.length);return G[0]=Z,G.set(X.hash,1),LX.default.encode(G)}function GZ(X){let Z=X.network==="mainnet"?"bitcoincash":"bchtest",G=X.type==="p2pkh"?"P2PKH":"P2SH",J=new Uint8Array(X.hash);return WX.default.encode(Z,G,J)}var N=require("@swapkit/helpers");var i=(X)=>{switch(X){case N.Chain.Bitcoin:case N.Chain.BitcoinCash:return 550;case N.Chain.Dash:case N.Chain.Litecoin:return 5500;case N.Chain.Dogecoin:return 1e5;case N.Chain.Zcash:return 546;default:throw new N.SwapKitError("toolbox_utxo_not_supported",{chain:X})}},A=({inputs:X,outputs:Z,feeRate:G=1,chain:J=N.Chain.Bitcoin})=>{let Q=Math.ceil(G),L=X[0]&&"address"in X[0]&&X[0].address?p(X[0].address):"P2PKH",$=X.filter((z)=>k(z)*Q<=z.value),W=a+Z.reduce((z,H)=>z+u(H,L),0),q=Z.reduce((z,H)=>z+H.value,0),B=W*Q,U=0,M=[];for(let z of $){let H=k(z),Y=Q*H;B+=Y,U+=z.value,M.push(z);let I=B+q;if(U<I)continue;let V=U-I,YX=Q*u({address:"",value:0},L);if(V>YX){let HX=YX+B,CX=U-(q+HX);if(CX>Math.max(k({})*Q,i(J)))return{inputs:M,outputs:Z.concat({value:CX,address:""}),fee:HX}}return{inputs:M,outputs:Z,fee:B}}return{fee:Q*g({inputs:X,outputs:Z,feeRate:Q})}};var PX=require("@swapkit/helpers"),e=require("bitcoinjs-lib"),JZ=1000,a=10,VX=10,QZ=41,$Z=107;function R(X){let Z=Buffer.from(X,"utf8");return e.script.compile([e.opcodes.OP_RETURN,Z])}var s;((G)=>{G.P2PKH="P2PKH";G.P2WPKH="P2WPKH"})(s||={});var t={["P2PKH"]:148,["P2WPKH"]:68},o={["P2PKH"]:34,["P2WPKH"]:31},p=(X)=>{if(X.startsWith("bc1")||X.startsWith("ltc1"))return"P2WPKH";if(X.startsWith("1")||X.startsWith("3")||X.startsWith("L")||X.startsWith("M")||X.startsWith("X")||X.startsWith("D")||X.startsWith("bitcoincash:q")||X.startsWith("q"))return"P2PKH";throw new PX.SwapKitError("toolbox_utxo_invalid_address",{address:X})},g=({inputs:X,outputs:Z,feeRate:G})=>{let J=X[0]&&"address"in X[0]&&X[0].address?p(X[0].address):"P2PKH",Q=X.filter(($)=>$.value>=t["type"in $?$.type:"P2PKH"]*Math.ceil(G)).reduce(($,W)=>$+k(W),0),L=Z?.reduce(($,W)=>$+u(W),0)||o[J];return a+Q+L},k=(X)=>{if("type"in X)return t[X.type];if("address"in X&&X.address)return t[p(X.address)];return QZ+$Z},u=(X,Z)=>{if(X?.script)return VX+X.script.length+(X.script.length>=74?2:1);if(Z)return o[Z];return o.P2PKH};var j=require("@swapkit/helpers"),y=require("bitcoinjs-lib"),EX=require("ecpair");var ZX=S(require("@bitcoinerlab/secp256k1")),GX=require("@psf/bitcoincashjs-lib"),SX=require("@scure/bip32"),zX=require("@scure/bip39");var kX=S(require("@bitcoinerlab/secp256k1")),AX=require("@scure/bip32"),RX=require("@scure/bip39"),C=require("@swapkit/helpers"),bX=require("bitcoinjs-lib/src/crypto"),DX=S(require("bs58check")),wX=require("ecpair"),m=require("ts-pattern");var LZ=C.Chain.Zcash,KX=_()(LZ);function WZ(X,Z=!1){let G=bX.hash160(X),J=Z?Buffer.from([28,186]):Buffer.from([28,184]),Q=Buffer.concat([J,G]);return DX.default.encode(Q)}function XX(X){try{if(X.startsWith("z"))return console.warn("Shielded Zcash addresses (z-addresses) are not supported. Use transparent addresses (t1/t3) only."),!1;let Z=X.startsWith("t1"),G=X.startsWith("t3");if(!(Z||G))return!1;let{isStagenet:J}=C.SKConfig.get("envs");if(Z&&J||G&&!J)return!1;return qZ(X,KX)}catch{return!1}}function qZ(X,Z){try{let G=DX.default.decode(X);if(G.length<21)return!1;let J=G[0];return J===Z.pubKeyHash||J===Z.scriptHash}catch{return!1}}var jZ=wX.ECPairFactory(kX.default);async function BZ({phrase:X,derivationPathString:Z}){let G=RX.mnemonicToSeedSync(X),Q=AX.HDKey.fromMasterSeed(G).derive(Z);if(!Q.privateKey)throw new Error("Unable to derive private key");let L=jZ.fromPrivateKey(Buffer.from(Q.privateKey),{network:KX}),{isStagenet:$}=C.SKConfig.get("envs"),W=WZ(L.publicKey,$);return{getAddress(){return Promise.resolve(W)},signTransaction(q){for(let B=0;B<q.inputCount;B++)q.signInput(B,L);return Promise.resolve(q)}}}async function UX(X){let Z=await m.match(X).with({signer:m.P.not(m.P.nullish)},({signer:W})=>Promise.resolve(W)).with({phrase:m.P.string},({phrase:W,derivationPath:q,index:B=0})=>{let U=q||C.NetworkDerivationPath[C.Chain.Zcash]||[44,133,0,0,0],M=C.updateDerivationPath(U,{index:B}),z=C.derivationPathToString(M);return BZ({phrase:W,derivationPathString:z})}).otherwise(()=>Promise.resolve(void 0)),{getFeeRates:G,broadcastTx:J,...Q}=await w({chain:C.Chain.Zcash,signer:Z});function L(W){return W.getAddress()}async function $({recipient:W,assetValue:q,feeOptionKey:B=C.FeeOption.Fast,...U}){let M=await Z?.getAddress();if(!(Z&&M))throw new C.SwapKitError("toolbox_utxo_no_signer");let z=U.feeRate||(await G())[B],H={...U,assetValue:q,feeRate:z,recipient:W,sender:M},{psbt:Y}=await Q.createTransaction(H),I=await Z.signTransaction(Y);I.finalizeAllInputs();let V=I.extractTransaction().toHex();return J(V)}return{...Q,broadcastTx:J,getFeeRates:G,transfer:$,getAddressFromKeys:L,validateAddress:XX}}var n=[j.Chain.Dash,j.Chain.Dogecoin];function DZ({inputs:X,outputs:Z,chain:G,psbt:J,sender:Q,compiledMemo:L}){for(let $ of X){let W=!!$.witnessUtxo&&!n.includes(G)&&{witnessUtxo:$.witnessUtxo},q=n.includes(G)&&{nonWitnessUtxo:$.txHex?Buffer.from($.txHex,"hex"):void 0};J.addInput({hash:$.hash,index:$.index,...W,...q})}for(let $ of Z){let W="address"in $&&$.address?$.address:Q,q=$.script;if(q&&!L)continue;let B=q?{script:L,value:0}:{address:W,value:$.value};y.initEccLib(ZX.default),J.addOutput(B)}return{psbt:J,inputs:X}}async function xX({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q,fetchTxHex:L=!1}){let $=X.chain,W=G?await R(G):null,q=await lX({assetValue:X,recipient:Z,memo:G,sender:Q,fetchTxHex:L}),{inputs:B,outputs:U}=A({...q,feeRate:J,chain:$});if(!(B&&U))throw new j.SwapKitError("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let M=await _(),z=new y.Psbt({network:M($)});if($===j.Chain.Dogecoin)z.setMaximumFeeRate(650000000);let{psbt:H,inputs:Y}=await DZ({inputs:B,outputs:U,chain:$,psbt:z,sender:Q,compiledMemo:W});return{psbt:H,utxos:q.inputs,inputs:Y}}async function gX(){let X=await _();return function Z({address:G,chain:J}){if(J===j.Chain.BitcoinCash)return K(G);if(J===j.Chain.Zcash)return XX(G);try{return y.initEccLib(ZX.default),y.address.toOutputScript(G,X(J)),!0}catch(Q){return!1}}}async function UZ({chain:X,phrase:Z,derivationPath:G}){let J=(await d(X))({phrase:Z,derivationPath:G});async function Q($){return await $.signAllInputs(J),$}async function L(){return(await MX(X))(J)}return{getAddress:L,signTransaction:Q}}async function w({chain:X,...Z}){let G="phrase"in Z?Z.phrase:void 0,J="index"in Z?Z.index||0:0,Q=j.derivationPathToString("derivationPath"in Z&&Z.derivationPath?Z.derivationPath:j.updateDerivationPath(j.NetworkDerivationPath[X],{index:J})),L=G?await UZ({chain:X,phrase:G,derivationPath:Q}):("signer"in Z)?Z.signer:void 0;function $(){return Promise.resolve(L?.getAddress())}let W=await MX(X),q=await gX(),B=await d(X);return{accumulative:A,calculateTxSize:g,getAddressFromKeys:W,getAddress:$,validateAddress:(U)=>q({address:U,chain:X}),broadcastTx:(U)=>F(X).broadcastTx(U),createTransaction:xX,createKeysForPath:B,getFeeRates:()=>JX(X),getInputsOutputsFee:mX,transfer:TZ(L),getPrivateKeyFromMnemonic:(U)=>{return B(U).toWIF()},getBalance:fX(X),estimateTransactionFee:MZ(X),estimateMaxSendableAmount:zZ(X)}}async function mX({assetValue:X,feeOptionKey:Z=j.FeeOption.Fast,feeRate:G,memo:J,sender:Q,recipient:L}){let $=X.chain,W=await lX({assetValue:X,sender:Q,memo:J,recipient:L}),q=G?Math.floor(G):(await JX($))[Z];return A({...W,feeRate:q,chain:$})}function zZ(X){return async function Z({from:G,memo:J,feeRate:Q,feeOptionKey:L=j.FeeOption.Fast,recipients:$=1}){let W=await F(X).getAddressData(G),q=Q?Math.ceil(Q):(await JX(X))[L],B=W?.utxo.map((Y)=>({...Y,type:"P2PKH",hash:""})).filter((Y)=>Y.value>Math.max(i(X),k(Y)*q));if(!B?.length)return j.AssetValue.from({chain:X});let U=j.AssetValue.from({chain:X,value:B.reduce((Y,I)=>Y+I.value,0)}),M=typeof $==="number"?Array.from({length:$},()=>({address:G,value:0})):$;if(J){let Y=await R(J);M.push({address:G,script:Y,value:0})}let H=g({inputs:B,outputs:M,feeRate:q})*q;return U.sub(H)}}function MZ(X){return async(Z)=>{let G=await mX(Z);return j.AssetValue.from({chain:X,value:j.SwapKitNumber.fromBigInt(BigInt(G.fee),8).getValue("string")})}}async function d(X){let Z=await _();switch(X){case j.Chain.BitcoinCash:return function G({phrase:J,derivationPath:Q=`${j.DerivationPath.BCH}/0`,wif:L}){let $=Z(X);if(L)return GX.ECPair.fromWIF(L,$);if(!J)throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"No phrase provided"});return GX.HDNode.fromSeedBuffer(Buffer.from(zX.mnemonicToSeedSync(J)),$).derivePath(Q).keyPair};case j.Chain.Bitcoin:case j.Chain.Dogecoin:case j.Chain.Litecoin:case j.Chain.Zcash:case j.Chain.Dash:return function G({phrase:J,wif:Q,derivationPath:L}){if(!(Q||J))throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"Either phrase or wif must be provided"});let $=EX.ECPairFactory(ZX.default),W=Z(X);if(Q)return $.fromWIF(Q,W);let q=zX.mnemonicToSeedSync(J),B=SX.HDKey.fromMasterSeed(q,W).derive(L);if(!B.privateKey)throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"Could not get private key from phrase"});return $.fromPrivateKey(Buffer.from(B.privateKey),{network:W})};default:throw new j.SwapKitError("toolbox_utxo_not_supported",{chain:X})}}async function MX(X){let Z=await _();return function G(J){if(!J)throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"Keys must be provided"});let Q=n.includes(X)?y.payments.p2pkh:y.payments.p2wpkh,{address:L}=Q({pubkey:J.publicKey,network:Z(X)});if(!L)throw new j.SwapKitError("toolbox_utxo_invalid_address",{error:"Address not defined"});return L}}function TZ(X){return async function Z({memo:G,recipient:J,feeOptionKey:Q,feeRate:L,assetValue:$}){let W=await X?.getAddress(),q=$.chain;if(!(X&&W))throw new j.SwapKitError("toolbox_utxo_no_signer");if(!J)throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let B=L||(await JX(q))[Q||j.FeeOption.Fast],{psbt:U}=await xX({recipient:J,feeRate:B,sender:W,assetValue:$,memo:G}),M=await X.signTransaction(U);return M.finalizeAllInputs(),F(q).broadcastTx(M.extractTransaction().toHex())}}async function JX(X){let Z=await F(X).getSuggestedTxFee();return{[j.FeeOption.Average]:Z,[j.FeeOption.Fast]:j.applyFeeMultiplier(Z,j.FeeOption.Fast),[j.FeeOption.Fastest]:j.applyFeeMultiplier(Z,j.FeeOption.Fastest)}}async function lX({assetValue:X,recipient:Z,memo:G,sender:J,fetchTxHex:Q=!1}){let L=X.chain,$=Q||n.includes(L);return{inputs:await F(L).scanUTXOs({address:J,fetchTxHex:$}),outputs:[{address:Z,value:Number(X.bigIntValue)},...G?[{address:"",script:await R(G),value:0}]:[]]}}var O=v.Chain.BitcoinCash;function l(X){return X.replace(/(bchtest:|bitcoincash:)/,"")}function K(X){let Z=l(X);return jX(Z)&&BX(Z)==="mainnet"}function f(X){return l(c(X))}async function YZ(X){async function Z({builder:J,utxos:Q}){return Q.forEach((L,$)=>{J.sign($,X,void 0,65,L.witnessUtxo?.value)}),J.build()}return{getAddress:()=>{let J=X.getAddress(0);return Promise.resolve(f(J))},signTransaction:Z}}async function TX(X){let Z="phrase"in X?X.phrase:void 0,G="index"in X?X.index||0:0,J=v.derivationPathToString("derivationPath"in X&&X.derivationPath?X.derivationPath:v.updateDerivationPath(v.NetworkDerivationPath[O],{index:G})),Q=(await d(O))({phrase:Z,derivationPath:J}),L=Q?await YZ(Q):("signer"in X)?X.signer:void 0;function $(){return Promise.resolve(L?.getAddress())}let{getBalance:W,getFeeRates:q,broadcastTx:B,...U}=await w({chain:O});function M(z,H=!0){return W(l(c(z)))}return{...U,getAddress:$,broadcastTx:B,createTransaction:cX,buildTx:CZ,getAddressFromKeys:vZ,getBalance:M,getFeeRates:q,stripPrefix:l,stripToCashAddress:f,validateAddress:K,transfer:HZ({getFeeRates:q,broadcastTx:B,signer:L})}}async function cX({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q}){if(!K(Z))throw new v.SwapKitError("toolbox_utxo_invalid_address",{address:Z});let L=await F(O).scanUTXOs({address:f(Q),fetchTxHex:!0}),$=G?await R(G):null,W=[];W.push({address:Z,value:X.getBaseValue("number")});let{inputs:q,outputs:B}=A({inputs:L,outputs:W,feeRate:J,chain:O});if(!(q&&B))throw new v.SwapKitError("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let U=await _(),M=new h.TransactionBuilder(U(O));await Promise.all(q.map(async(z)=>{let H=await F(O).getRawTx(z.hash);M.addInput(h.Transaction.fromBuffer(Buffer.from(H,"hex")),z.index)}));for(let z of B){let H="address"in z&&z.address?z.address:x(Q),Y=await _(),I=h.address.toOutputScript(x(H),Y(O));M.addOutput(I,z.value)}if($)M.addOutput($,0);return{builder:M,utxos:q}}function HZ({broadcastTx:X,getFeeRates:Z,signer:G}){return async function J({recipient:Q,assetValue:L,feeOptionKey:$=v.FeeOption.Fast,...W}){let q=await G?.getAddress();if(!(G&&q))throw new v.SwapKitError("toolbox_utxo_no_signer");if(!Q)throw new v.SwapKitError("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let B=W.feeRate||(await Z())[$],{builder:U,utxos:M}=await cX({...W,assetValue:L,feeRate:B,recipient:Q,sender:q}),H=(await G.signTransaction({builder:U,utxos:M})).toHex();return X(H)}}async function CZ({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q}){let L=c(Z);if(!K(L))throw new v.SwapKitError("toolbox_utxo_invalid_address",{address:L});let $=await F(O).scanUTXOs({address:f(Q),fetchTxHex:!0}),W=Number(J.toFixed(0)),q=G?await R(G):null,B=[];if(B.push({address:x(Z),value:X.getBaseValue("number")}),q)B.push({script:q,value:0});let{inputs:U,outputs:M}=A({inputs:$,outputs:B,feeRate:W,chain:O});if(!(U&&M))throw new v.SwapKitError("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let z=await _(),H=new hX.Psbt({network:z(O)});for(let{hash:Y,index:I,witnessUtxo:V}of U)H.addInput({hash:Y,index:I,witnessUtxo:V});for(let Y of M){let I="address"in Y&&Y.address?Y.address:x(Q),V=Y.script?q?{script:q,value:0}:void 0:{address:I,value:Y.value};if(V)H.addOutput(V)}return{psbt:H,utxos:$,inputs:U}}function vZ(X){let Z=X.getAddress(0);return f(Z)}async function IZ(X,Z){switch(X){case P.Chain.BitcoinCash:return await TX(Z);case P.Chain.Zcash:return await UX(Z);case P.Chain.Bitcoin:case P.Chain.Dogecoin:case P.Chain.Litecoin:case P.Chain.Dash:return await w({chain:X,...Z});default:throw new P.SwapKitError("toolbox_utxo_not_supported",{chain:X})}}
3
+ `,bech32:"ztestsapling",bip32:{public:70617039,private:70615956},pubKeyHash:29,scriptHash:28,wif:239};function _(){return function X(Z){switch(Z){case U.Chain.Bitcoin:return _X.networks.bitcoin;case U.Chain.BitcoinCash:return E.default.bitcoincash.main.toBitcoinJS();case U.Chain.Dash:return E.default.dash.main.toBitcoinJS();case U.Chain.Litecoin:return E.default.litecoin.main.toBitcoinJS();case U.Chain.Dogecoin:{let G={private:70615956,public:70617039},J=E.default.dogecoin.test;return J.versions.bip32=G,E.default.dogecoin.main.toBitcoinJS()}case U.Chain.Zcash:{let{isStagenet:G}=U.SKConfig.get("envs");return G?tX:sX}default:throw new U.SwapKitError("toolbox_utxo_not_supported",{chain:Z})}}}var b=require("@swapkit/helpers"),qX=S(require("bs58check")),LX=S(require("cashaddrjs"));var WX;((G)=>{G.Mainnet="mainnet";G.Testnet="testnet"})(WX||={});var T={["legacy"]:{["mainnet"]:{["p2pkh"]:0,["p2sh"]:5},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}},["bitpay"]:{["mainnet"]:{["p2pkh"]:28,["p2sh"]:40},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}}};function jX(X){try{return r(X),!0}catch(Z){return!1}}function BX(X){return r(X)?.network}function x(X){let Z=r(X);if(Z?.format==="legacy")return X;return ZZ(Z)}function c(X){let Z=r(X);return GZ(Z)}function r(X){try{return eX(X)}catch(Z){}try{return XZ(X)}catch(Z){}throw new b.SwapKitError("toolbox_utxo_invalid_address",{address:X})}function eX(X){try{let Z=qX.default.decode(X);if(Z.length!==21)throw new b.SwapKitError("toolbox_utxo_invalid_address",{address:X});let G=Z[0],J=Array.prototype.slice.call(Z,1);switch(G){case T.legacy.mainnet.p2pkh:return{hash:J,format:"legacy",network:"mainnet",type:"p2pkh"};case T.legacy.mainnet.p2sh:return{hash:J,format:"legacy",network:"mainnet",type:"p2sh"};case T.legacy.testnet.p2pkh:return{hash:J,format:"legacy",network:"testnet",type:"p2pkh"};case T.legacy.testnet.p2sh:return{hash:J,format:"legacy",network:"testnet",type:"p2sh"};case T.bitpay.mainnet.p2pkh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2pkh"};case T.bitpay.mainnet.p2sh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2sh"};default:throw new b.SwapKitError("toolbox_utxo_invalid_address",{address:X})}}catch(Z){throw new b.SwapKitError("toolbox_utxo_invalid_address",{address:X})}}function XZ(X){if(X.indexOf(":")!==-1)try{return yX(X)}catch(Z){}else{let Z=["bitcoincash","bchtest","bchreg"];for(let G of Z)try{return yX(`${G}:${X}`)}catch(J){}}throw new b.SwapKitError("toolbox_utxo_invalid_address",{address:X})}function yX(X){try{let{hash:Z,prefix:G,type:J}=LX.default.decode(X);return{format:"cashaddr",hash:Array.prototype.slice.call(Z,0),network:G==="bitcoincash"?"mainnet":"testnet",type:J==="P2PKH"?"p2pkh":"p2sh"}}catch(Z){throw new b.SwapKitError("toolbox_utxo_invalid_address",{address:X})}}function ZZ(X){let Z=T.legacy[X.network][X.type],G=Buffer.alloc(1+X.hash.length);return G[0]=Z,G.set(X.hash,1),qX.default.encode(G)}function GZ(X){let Z=X.network==="mainnet"?"bitcoincash":"bchtest",G=X.type==="p2pkh"?"P2PKH":"P2SH",J=new Uint8Array(X.hash);return LX.default.encode(Z,G,J)}var N=require("@swapkit/helpers");var i=(X)=>{switch(X){case N.Chain.Bitcoin:case N.Chain.BitcoinCash:return 550;case N.Chain.Dash:case N.Chain.Litecoin:return 5500;case N.Chain.Dogecoin:return 1e5;case N.Chain.Zcash:return 546;default:throw new N.SwapKitError("toolbox_utxo_not_supported",{chain:X})}},A=({inputs:X,outputs:Z,feeRate:G=1,chain:J=N.Chain.Bitcoin})=>{let Q=Math.ceil(G),q=X[0]&&"address"in X[0]&&X[0].address?p(X[0].address):"P2PKH",$=X.filter((z)=>k(z)*Q<=z.value),L=a+Z.reduce((z,H)=>z+u(H,q),0),W=Z.reduce((z,H)=>z+H.value,0),B=L*Q,D=0,M=[];for(let z of $){let H=k(z),Y=Q*H;B+=Y,D+=z.value,M.push(z);let I=B+W;if(D<I)continue;let V=D-I,YX=Q*u({address:"",value:0},q);if(V>YX){let HX=YX+B,CX=D-(W+HX);if(CX>Math.max(k({})*Q,i(J)))return{inputs:M,outputs:Z.concat({value:CX,address:""}),fee:HX}}return{inputs:M,outputs:Z,fee:B}}return{fee:Q*g({inputs:X,outputs:Z,feeRate:Q})}};var PX=require("@swapkit/helpers"),e=require("bitcoinjs-lib"),JZ=1000,a=10,VX=10,QZ=41,$Z=107;function R(X){let Z=Buffer.from(X,"utf8");return e.script.compile([e.opcodes.OP_RETURN,Z])}var s;((G)=>{G.P2PKH="P2PKH";G.P2WPKH="P2WPKH"})(s||={});var t={["P2PKH"]:148,["P2WPKH"]:68},o={["P2PKH"]:34,["P2WPKH"]:31},p=(X)=>{if(X.startsWith("bc1")||X.startsWith("ltc1"))return"P2WPKH";if(X.startsWith("1")||X.startsWith("3")||X.startsWith("L")||X.startsWith("M")||X.startsWith("X")||X.startsWith("D")||X.startsWith("bitcoincash:q")||X.startsWith("q"))return"P2PKH";throw new PX.SwapKitError("toolbox_utxo_invalid_address",{address:X})},g=({inputs:X,outputs:Z,feeRate:G})=>{let J=X[0]&&"address"in X[0]&&X[0].address?p(X[0].address):"P2PKH",Q=X.filter(($)=>$.value>=t["type"in $?$.type:"P2PKH"]*Math.ceil(G)).reduce(($,L)=>$+k(L),0),q=Z?.reduce(($,L)=>$+u(L),0)||o[J];return a+Q+q},k=(X)=>{if("type"in X)return t[X.type];if("address"in X&&X.address)return t[p(X.address)];return QZ+$Z},u=(X,Z)=>{if(X?.script)return VX+X.script.length+(X.script.length>=74?2:1);if(Z)return o[Z];return o.P2PKH};var j=require("@swapkit/helpers"),y=require("bitcoinjs-lib"),EX=require("ecpair");var ZX=S(require("@bitcoinerlab/secp256k1")),GX=require("@psf/bitcoincashjs-lib"),SX=require("@scure/bip32"),zX=require("@scure/bip39");var kX=S(require("@bitcoinerlab/secp256k1")),AX=require("@scure/bip32"),RX=require("@scure/bip39"),C=require("@swapkit/helpers"),bX=require("bitcoinjs-lib/src/crypto"),DX=S(require("bs58check")),KX=require("ecpair"),m=require("ts-pattern");var qZ=C.Chain.Zcash,wX=_()(qZ);function LZ(X,Z=!1){let G=bX.hash160(X),J=Z?Buffer.from([28,186]):Buffer.from([28,184]),Q=Buffer.concat([J,G]);return DX.default.encode(Q)}function XX(X){try{if(X.startsWith("z"))return console.warn("Shielded Zcash addresses (z-addresses) are not supported. Use transparent addresses (t1/t3) only."),!1;let Z=X.startsWith("t1"),G=X.startsWith("t3");if(!(Z||G))return!1;let{isStagenet:J}=C.SKConfig.get("envs");if(Z&&J||G&&!J)return!1;return WZ(X,wX)}catch{return!1}}function WZ(X,Z){try{let G=DX.default.decode(X);if(G.length<21)return!1;let J=G[0];return J===Z.pubKeyHash||J===Z.scriptHash}catch{return!1}}var jZ=KX.ECPairFactory(kX.default);async function BZ({phrase:X,derivationPathString:Z}){let G=RX.mnemonicToSeedSync(X),Q=AX.HDKey.fromMasterSeed(G).derive(Z);if(!Q.privateKey)throw new Error("Unable to derive private key");let q=jZ.fromPrivateKey(Buffer.from(Q.privateKey),{network:wX}),{isStagenet:$}=C.SKConfig.get("envs"),L=LZ(q.publicKey,$);return{getAddress(){return Promise.resolve(L)},signTransaction(W){for(let B=0;B<W.inputCount;B++)W.signInput(B,q);return Promise.resolve(W)}}}async function UX(X){let Z=await m.match(X).with({signer:m.P.not(m.P.nullish)},({signer:L})=>Promise.resolve(L)).with({phrase:m.P.string},({phrase:L,derivationPath:W,index:B=0})=>{let D=W||C.NetworkDerivationPath[C.Chain.Zcash]||[44,133,0,0,0],M=C.updateDerivationPath(D,{index:B}),z=C.derivationPathToString(M);return BZ({phrase:L,derivationPathString:z})}).otherwise(()=>Promise.resolve(void 0)),{getFeeRates:G,broadcastTx:J,...Q}=await K({chain:C.Chain.Zcash,signer:Z});function q(L){return L.getAddress()}async function $({recipient:L,assetValue:W,feeOptionKey:B=C.FeeOption.Fast,...D}){let M=await Z?.getAddress();if(!(Z&&M))throw new C.SwapKitError("toolbox_utxo_no_signer");let z=D.feeRate||(await G())[B],H={...D,assetValue:W,feeRate:z,recipient:L,sender:M},{psbt:Y}=await Q.createTransaction(H),I=await Z.signTransaction(Y);I.finalizeAllInputs();let V=I.extractTransaction().toHex();return J(V)}return{...Q,broadcastTx:J,getFeeRates:G,transfer:$,getAddressFromKeys:q,validateAddress:XX}}var n=[j.Chain.Dash,j.Chain.Dogecoin];function DZ({inputs:X,outputs:Z,chain:G,psbt:J,sender:Q,compiledMemo:q}){for(let $ of X){let L=!!$.witnessUtxo&&!n.includes(G)&&{witnessUtxo:$.witnessUtxo},W=n.includes(G)&&{nonWitnessUtxo:$.txHex?Buffer.from($.txHex,"hex"):void 0};J.addInput({hash:$.hash,index:$.index,...L,...W})}for(let $ of Z){let L="address"in $&&$.address?$.address:Q,W=$.script;if(W&&!q)continue;let B=W?{script:q,value:0}:{address:L,value:$.value};y.initEccLib(ZX.default),J.addOutput(B)}return{psbt:J,inputs:X}}async function xX({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q,fetchTxHex:q=!1}){let $=X.chain,L=G?await R(G):null,W=await lX({assetValue:X,recipient:Z,memo:G,sender:Q,fetchTxHex:q}),{inputs:B,outputs:D}=A({...W,feeRate:J,chain:$});if(!(B&&D))throw new j.SwapKitError("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let M=await _(),z=new y.Psbt({network:M($)});if($===j.Chain.Dogecoin)z.setMaximumFeeRate(650000000);let{psbt:H,inputs:Y}=await DZ({inputs:B,outputs:D,chain:$,psbt:z,sender:Q,compiledMemo:L});return{psbt:H,utxos:W.inputs,inputs:Y}}async function gX(){let X=await _();return function Z({address:G,chain:J}){if(J===j.Chain.BitcoinCash)return w(G);if(J===j.Chain.Zcash)return XX(G);try{return y.initEccLib(ZX.default),y.address.toOutputScript(G,X(J)),!0}catch(Q){return!1}}}async function UZ({chain:X,phrase:Z,derivationPath:G}){let J=(await d(X))({phrase:Z,derivationPath:G});async function Q($){return await $.signAllInputs(J),$}async function q(){return(await MX(X))(J)}return{getAddress:q,signTransaction:Q}}async function K({chain:X,...Z}){let G="phrase"in Z?Z.phrase:void 0,J="index"in Z?Z.index||0:0,Q=j.derivationPathToString("derivationPath"in Z&&Z.derivationPath?Z.derivationPath:j.updateDerivationPath(j.NetworkDerivationPath[X],{index:J})),q=G?await UZ({chain:X,phrase:G,derivationPath:Q}):("signer"in Z)?Z.signer:void 0;function $(){return Promise.resolve(q?.getAddress())}let L=await MX(X),W=await gX(),B=await d(X);return{accumulative:A,calculateTxSize:g,getAddressFromKeys:L,getAddress:$,validateAddress:(D)=>W({address:D,chain:X}),broadcastTx:(D)=>F(X).broadcastTx(D),createTransaction:xX,createKeysForPath:B,getFeeRates:()=>JX(X),getInputsOutputsFee:mX,transfer:TZ(q),getPrivateKeyFromMnemonic:(D)=>{return B(D).toWIF()},getBalance:fX(X),estimateTransactionFee:MZ(X),estimateMaxSendableAmount:zZ(X)}}async function mX({assetValue:X,feeOptionKey:Z=j.FeeOption.Fast,feeRate:G,memo:J,sender:Q,recipient:q}){let $=X.chain,L=await lX({assetValue:X,sender:Q,memo:J,recipient:q}),W=G?Math.floor(G):(await JX($))[Z];return A({...L,feeRate:W,chain:$})}function zZ(X){return async function Z({from:G,memo:J,feeRate:Q,feeOptionKey:q=j.FeeOption.Fast,recipients:$=1}){let L=await F(X).getAddressData(G),W=Q?Math.ceil(Q):(await JX(X))[q],B=L?.utxo.map((Y)=>({...Y,type:"P2PKH",hash:""})).filter((Y)=>Y.value>Math.max(i(X),k(Y)*W));if(!B?.length)return j.AssetValue.from({chain:X});let D=j.AssetValue.from({chain:X,value:B.reduce((Y,I)=>Y+I.value,0)}),M=typeof $==="number"?Array.from({length:$},()=>({address:G,value:0})):$;if(J){let Y=await R(J);M.push({address:G,script:Y,value:0})}let H=g({inputs:B,outputs:M,feeRate:W})*W;return D.sub(H)}}function MZ(X){return async(Z)=>{let G=await mX(Z);return j.AssetValue.from({chain:X,value:j.SwapKitNumber.fromBigInt(BigInt(G.fee),8).getValue("string")})}}async function d(X){let Z=await _();switch(X){case j.Chain.BitcoinCash:return function G({phrase:J,derivationPath:Q=`${j.DerivationPath.BCH}/0`,wif:q}){let $=Z(X);if(q)return GX.ECPair.fromWIF(q,$);if(!J)throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"No phrase provided"});return GX.HDNode.fromSeedBuffer(Buffer.from(zX.mnemonicToSeedSync(J)),$).derivePath(Q).keyPair};case j.Chain.Bitcoin:case j.Chain.Dogecoin:case j.Chain.Litecoin:case j.Chain.Zcash:case j.Chain.Dash:return function G({phrase:J,wif:Q,derivationPath:q}){if(!(Q||J))throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"Either phrase or wif must be provided"});let $=EX.ECPairFactory(ZX.default),L=Z(X);if(Q)return $.fromWIF(Q,L);let W=zX.mnemonicToSeedSync(J),B=SX.HDKey.fromMasterSeed(W,L).derive(q);if(!B.privateKey)throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"Could not get private key from phrase"});return $.fromPrivateKey(Buffer.from(B.privateKey),{network:L})};default:throw new j.SwapKitError("toolbox_utxo_not_supported",{chain:X})}}async function MX(X){let Z=await _();return function G(J){if(!J)throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"Keys must be provided"});let Q=n.includes(X)?y.payments.p2pkh:y.payments.p2wpkh,{address:q}=Q({pubkey:J.publicKey,network:Z(X)});if(!q)throw new j.SwapKitError("toolbox_utxo_invalid_address",{error:"Address not defined"});return q}}function TZ(X){return async function Z({memo:G,recipient:J,feeOptionKey:Q,feeRate:q,assetValue:$}){let L=await X?.getAddress(),W=$.chain;if(!(X&&L))throw new j.SwapKitError("toolbox_utxo_no_signer");if(!J)throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let B=q||(await JX(W))[Q||j.FeeOption.Fast],{psbt:D}=await xX({recipient:J,feeRate:B,sender:L,assetValue:$,memo:G}),M=await X.signTransaction(D);return M.finalizeAllInputs(),F(W).broadcastTx(M.extractTransaction().toHex())}}async function JX(X){let Z=await F(X).getSuggestedTxFee();return{[j.FeeOption.Average]:Z,[j.FeeOption.Fast]:j.applyFeeMultiplier(Z,j.FeeOption.Fast),[j.FeeOption.Fastest]:j.applyFeeMultiplier(Z,j.FeeOption.Fastest)}}async function lX({assetValue:X,recipient:Z,memo:G,sender:J,fetchTxHex:Q=!1}){let q=X.chain,$=Q||n.includes(q);return{inputs:await F(q).scanUTXOs({address:J,fetchTxHex:$}),outputs:[{address:Z,value:Number(X.bigIntValue)},...G?[{address:"",script:await R(G),value:0}]:[]]}}var O=v.Chain.BitcoinCash;function l(X){return X.replace(/(bchtest:|bitcoincash:)/,"")}function w(X){let Z=l(X);return jX(Z)&&BX(Z)==="mainnet"}function f(X){return l(c(X))}async function YZ(X){async function Z({builder:J,utxos:Q}){return Q.forEach((q,$)=>{J.sign($,X,void 0,65,q.witnessUtxo?.value)}),J.build()}return{getAddress:()=>{let J=X.getAddress(0);return Promise.resolve(f(J))},signTransaction:Z}}async function TX(X){let Z="phrase"in X?X.phrase:void 0,G="index"in X?X.index||0:0,J=v.derivationPathToString("derivationPath"in X&&X.derivationPath?X.derivationPath:v.updateDerivationPath(v.NetworkDerivationPath[O],{index:G})),Q=(await d(O))({phrase:Z,derivationPath:J}),q=Q?await YZ(Q):("signer"in X)?X.signer:void 0;function $(){return Promise.resolve(q?.getAddress())}let{getBalance:L,getFeeRates:W,broadcastTx:B,...D}=await K({chain:O});function M(z,H=!0){return L(l(c(z)))}return{...D,getAddress:$,broadcastTx:B,createTransaction:cX,buildTx:CZ,getAddressFromKeys:vZ,getBalance:M,getFeeRates:W,stripPrefix:l,stripToCashAddress:f,validateAddress:w,transfer:HZ({getFeeRates:W,broadcastTx:B,signer:q})}}async function cX({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q}){if(!w(Z))throw new v.SwapKitError("toolbox_utxo_invalid_address",{address:Z});let q=await F(O).scanUTXOs({address:f(Q),fetchTxHex:!0}),$=G?await R(G):null,L=[];L.push({address:Z,value:X.getBaseValue("number")});let{inputs:W,outputs:B}=A({inputs:q,outputs:L,feeRate:J,chain:O});if(!(W&&B))throw new v.SwapKitError("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let D=await _(),M=new h.TransactionBuilder(D(O));await Promise.all(W.map(async(z)=>{let H=await F(O).getRawTx(z.hash);M.addInput(h.Transaction.fromBuffer(Buffer.from(H,"hex")),z.index)}));for(let z of B){let H="address"in z&&z.address?z.address:x(Q),Y=await _(),I=h.address.toOutputScript(x(H),Y(O));M.addOutput(I,z.value)}if($)M.addOutput($,0);return{builder:M,utxos:W}}function HZ({broadcastTx:X,getFeeRates:Z,signer:G}){return async function J({recipient:Q,assetValue:q,feeOptionKey:$=v.FeeOption.Fast,...L}){let W=await G?.getAddress();if(!(G&&W))throw new v.SwapKitError("toolbox_utxo_no_signer");if(!Q)throw new v.SwapKitError("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let B=L.feeRate||(await Z())[$],{builder:D,utxos:M}=await cX({...L,assetValue:q,feeRate:B,recipient:Q,sender:W}),H=(await G.signTransaction({builder:D,utxos:M})).toHex();return X(H)}}async function CZ({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q}){let q=c(Z);if(!w(q))throw new v.SwapKitError("toolbox_utxo_invalid_address",{address:q});let $=await F(O).scanUTXOs({address:f(Q),fetchTxHex:!0}),L=Number(J.toFixed(0)),W=G?await R(G):null,B=[];if(B.push({address:x(Z),value:X.getBaseValue("number")}),W)B.push({script:W,value:0});let{inputs:D,outputs:M}=A({inputs:$,outputs:B,feeRate:L,chain:O});if(!(D&&M))throw new v.SwapKitError("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let z=await _(),H=new hX.Psbt({network:z(O)});for(let{hash:Y,index:I,witnessUtxo:V}of D)H.addInput({hash:Y,index:I,witnessUtxo:V});for(let Y of M){let I="address"in Y&&Y.address?Y.address:x(Q),V=Y.script?W?{script:W,value:0}:void 0:{address:I,value:Y.value};if(V)H.addOutput(V)}return{psbt:H,utxos:$,inputs:D}}function vZ(X){let Z=X.getAddress(0);return f(Z)}async function IZ(X,Z){switch(X){case P.Chain.BitcoinCash:return await TX(Z);case P.Chain.Zcash:return await UX(Z);case P.Chain.Bitcoin:case P.Chain.Dogecoin:case P.Chain.Litecoin:case P.Chain.Dash:return await K({chain:X,...Z});default:throw new P.SwapKitError("toolbox_utxo_not_supported",{chain:X})}}
4
4
 
5
- //# debugId=988C4CBF716921D464756E2164756E21
5
+ //# debugId=676D39E74BD3B40764756E2164756E21
6
6
  //# sourceMappingURL=index.cjs.map
@@ -4,14 +4,14 @@
4
4
  "sourcesContent": [
5
5
  "import {\n Chain,\n type ChainSigner,\n type DerivationPathArray,\n SwapKitError,\n type UTXOChain,\n} from \"@swapkit/helpers\";\nimport type { Psbt } from \"bitcoinjs-lib\";\n\nimport type { TransactionBuilderType, TransactionType, UTXOType } from \"../types\";\nimport { createBCHToolbox } from \"./bitcoinCash\";\nimport { createUTXOToolbox } from \"./utxo\";\nimport { createZcashToolbox } from \"./zcash\";\n\ntype BCHToolbox = Awaited<ReturnType<typeof createBCHToolbox>>;\ntype CommonUTXOToolbox = Awaited<\n ReturnType<typeof createUTXOToolbox<Exclude<UTXOChain, Chain.BitcoinCash | Chain.Zcash>>>\n>;\ntype ZcashToolbox = Awaited<ReturnType<typeof createZcashToolbox>>;\n\nexport type UTXOToolboxes = {\n [Chain.BitcoinCash]: BCHToolbox;\n [Chain.Bitcoin]: CommonUTXOToolbox;\n [Chain.Dogecoin]: CommonUTXOToolbox;\n [Chain.Litecoin]: CommonUTXOToolbox;\n [Chain.Dash]: CommonUTXOToolbox;\n [Chain.Zcash]: ZcashToolbox;\n};\n\nexport type UTXOWallets = {\n [key in keyof UTXOToolboxes]: UTXOToolboxes[key];\n};\n\nexport type UtxoToolboxParams = {\n [Chain.BitcoinCash]: {\n signer: ChainSigner<{ builder: TransactionBuilderType; utxos: UTXOType[] }, TransactionType>;\n };\n [Chain.Bitcoin]: { signer: ChainSigner<Psbt, Psbt> };\n [Chain.Dogecoin]: { signer: ChainSigner<Psbt, Psbt> };\n [Chain.Litecoin]: { signer: ChainSigner<Psbt, Psbt> };\n [Chain.Dash]: { signer: ChainSigner<Psbt, Psbt> };\n [Chain.Zcash]: {\n signer?: ChainSigner<Psbt, Psbt>;\n };\n};\n\nexport async function getUtxoToolbox<T extends keyof UTXOToolboxes>(\n chain: T,\n params?:\n | UtxoToolboxParams[T]\n | {\n phrase?: string;\n derivationPath?: DerivationPathArray;\n index?: number;\n },\n): Promise<UTXOToolboxes[T]> {\n switch (chain) {\n case Chain.BitcoinCash: {\n const toolbox = await createBCHToolbox(params as UtxoToolboxParams[Chain.BitcoinCash]);\n return toolbox as UTXOToolboxes[T];\n }\n\n case Chain.Zcash: {\n const toolbox = await createZcashToolbox(params as UtxoToolboxParams[Chain.Zcash]);\n return toolbox as UTXOToolboxes[T];\n }\n\n case Chain.Bitcoin:\n case Chain.Dogecoin:\n case Chain.Litecoin:\n case Chain.Dash: {\n const toolbox = await createUTXOToolbox({\n chain,\n ...(params as UtxoToolboxParams[Exclude<T, Chain.BitcoinCash | Chain.Zcash>]),\n });\n return toolbox as UTXOToolboxes[Exclude<T, Chain.BitcoinCash | Chain.Zcash>];\n }\n\n default:\n throw new SwapKitError(\"toolbox_utxo_not_supported\", { chain });\n }\n}\n\nexport {\n stripToCashAddress,\n stripPrefix,\n bchValidateAddress,\n} from \"./bitcoinCash\";\n",
6
6
  "import {\n Transaction,\n TransactionBuilder,\n address as bchAddress,\n // @ts-ignore\n} from \"@psf/bitcoincashjs-lib\";\nimport {\n Chain,\n type ChainSigner,\n type DerivationPathArray,\n FeeOption,\n NetworkDerivationPath,\n SwapKitError,\n derivationPathToString,\n updateDerivationPath,\n} from \"@swapkit/helpers\";\nimport { Psbt } from \"bitcoinjs-lib\";\nimport type { UtxoToolboxParams } from \".\";\nimport {\n accumulative,\n UtxoNetwork as bchNetwork,\n compileMemo,\n detectAddressNetwork,\n getUtxoApi,\n getUtxoNetwork,\n isValidAddress,\n toCashAddress,\n toLegacyAddress,\n} from \"../helpers\";\nimport type {\n BchECPair,\n TargetOutput,\n TransactionBuilderType,\n TransactionType,\n UTXOBuildTxParams,\n UTXOTransferParams,\n UTXOType,\n} from \"../types\";\nimport { createUTXOToolbox, getCreateKeysForPath } from \"./utxo\";\n\nconst chain = Chain.BitcoinCash;\n\nexport function stripPrefix(address: string) {\n return address.replace(/(bchtest:|bitcoincash:)/, \"\");\n}\n\nexport function bchValidateAddress(address: string) {\n const strippedAddress = stripPrefix(address);\n return (\n isValidAddress(strippedAddress) && detectAddressNetwork(strippedAddress) === bchNetwork.Mainnet\n );\n}\n\nexport function stripToCashAddress(address: string) {\n return stripPrefix(toCashAddress(address));\n}\n\nasync function createSignerWithKeys(keys: BchECPair) {\n async function signTransaction({\n builder,\n utxos,\n }: { builder: TransactionBuilderType; utxos: UTXOType[] }) {\n utxos.forEach((utxo, index) => {\n builder.sign(index, keys, undefined, 0x41, utxo.witnessUtxo?.value);\n });\n\n return builder.build();\n }\n\n const getAddress = () => {\n const address = keys.getAddress(0);\n return Promise.resolve(stripToCashAddress(address));\n };\n\n return {\n getAddress,\n signTransaction,\n };\n}\n\nexport async function createBCHToolbox<T extends Chain.BitcoinCash>(\n toolboxParams:\n | UtxoToolboxParams[T]\n | {\n phrase?: string;\n derivationPath?: DerivationPathArray;\n index?: number;\n },\n) {\n const phrase = \"phrase\" in toolboxParams ? toolboxParams.phrase : undefined;\n\n const index = \"index\" in toolboxParams ? toolboxParams.index || 0 : 0;\n\n const derivationPath = derivationPathToString(\n \"derivationPath\" in toolboxParams && toolboxParams.derivationPath\n ? toolboxParams.derivationPath\n : updateDerivationPath(NetworkDerivationPath[chain], { index }),\n );\n\n const keys = (await getCreateKeysForPath(chain))({ phrase, derivationPath });\n\n const signer = keys\n ? await createSignerWithKeys(keys)\n : \"signer\" in toolboxParams\n ? toolboxParams.signer\n : undefined;\n\n function getAddress() {\n return Promise.resolve(signer?.getAddress());\n }\n\n const { getBalance, getFeeRates, broadcastTx, ...toolbox } = await createUTXOToolbox({ chain });\n\n function handleGetBalance(address: string, _scamFilter = true) {\n return getBalance(stripPrefix(toCashAddress(address)));\n }\n\n return {\n ...toolbox,\n getAddress,\n broadcastTx,\n createTransaction,\n buildTx,\n getAddressFromKeys,\n getBalance: handleGetBalance,\n getFeeRates,\n stripPrefix,\n stripToCashAddress,\n validateAddress: bchValidateAddress,\n transfer: transfer({ getFeeRates, broadcastTx, signer }),\n };\n}\n\nasync function createTransaction({\n assetValue,\n recipient,\n memo,\n feeRate,\n sender,\n}: UTXOBuildTxParams) {\n if (!bchValidateAddress(recipient))\n throw new SwapKitError(\"toolbox_utxo_invalid_address\", { address: recipient });\n const utxos = await getUtxoApi(chain).scanUTXOs({\n address: stripToCashAddress(sender),\n fetchTxHex: true,\n });\n\n const compiledMemo = memo ? await compileMemo(memo) : null;\n\n const targetOutputs: TargetOutput[] = [];\n // output to recipient\n targetOutputs.push({\n address: recipient,\n value: assetValue.getBaseValue(\"number\"),\n });\n const { inputs, outputs } = accumulative({\n inputs: utxos,\n outputs: targetOutputs,\n feeRate,\n chain,\n });\n\n // .inputs and .outputs will be undefined if no solution was found\n if (!(inputs && outputs))\n throw new SwapKitError(\"toolbox_utxo_insufficient_balance\", { sender, assetValue });\n const getNetwork = await getUtxoNetwork();\n const builder = new TransactionBuilder(getNetwork(chain)) as TransactionBuilderType;\n\n await Promise.all(\n inputs.map(async (utxo: UTXOType) => {\n const txHex = await getUtxoApi(chain).getRawTx(utxo.hash);\n\n builder.addInput(Transaction.fromBuffer(Buffer.from(txHex, \"hex\")), utxo.index);\n }),\n );\n\n for (const output of outputs) {\n const address =\n \"address\" in output && output.address ? output.address : toLegacyAddress(sender);\n const getNetwork = await getUtxoNetwork();\n const outputScript = bchAddress.toOutputScript(toLegacyAddress(address), getNetwork(chain));\n\n builder.addOutput(outputScript, output.value);\n }\n\n // add output for memo\n if (compiledMemo) {\n builder.addOutput(compiledMemo, 0); // Add OP_RETURN {script, value}\n }\n\n return { builder, utxos: inputs };\n}\n\nfunction transfer({\n broadcastTx,\n getFeeRates,\n signer,\n}: {\n broadcastTx: (txHash: string) => Promise<string>;\n getFeeRates: () => Promise<Record<FeeOption, number>>;\n signer?: ChainSigner<{ builder: TransactionBuilderType; utxos: UTXOType[] }, TransactionType>;\n}) {\n return async function transfer({\n recipient,\n assetValue,\n feeOptionKey = FeeOption.Fast,\n ...rest\n }: UTXOTransferParams) {\n const from = await signer?.getAddress();\n if (!(signer && from)) throw new SwapKitError(\"toolbox_utxo_no_signer\");\n if (!recipient)\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", {\n error: \"Recipient address must be provided\",\n });\n\n const feeRate = rest.feeRate || (await getFeeRates())[feeOptionKey];\n\n // try out if psbt tx is faster/better/nicer\n const { builder, utxos } = await createTransaction({\n ...rest,\n assetValue,\n feeRate,\n recipient,\n sender: from,\n });\n\n const tx = await signer.signTransaction({ builder, utxos });\n const txHex = tx.toHex();\n\n return broadcastTx(txHex);\n };\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO: refactor\nasync function buildTx({ assetValue, recipient, memo, feeRate, sender }: UTXOBuildTxParams) {\n const recipientCashAddress = toCashAddress(recipient);\n if (!bchValidateAddress(recipientCashAddress))\n throw new SwapKitError(\"toolbox_utxo_invalid_address\", { address: recipientCashAddress });\n\n const utxos = await getUtxoApi(chain).scanUTXOs({\n address: stripToCashAddress(sender),\n fetchTxHex: true,\n });\n\n const feeRateWhole = Number(feeRate.toFixed(0));\n const compiledMemo = memo ? await compileMemo(memo) : null;\n\n const targetOutputs = [] as TargetOutput[];\n\n // output to recipient\n targetOutputs.push({\n address: toLegacyAddress(recipient),\n value: assetValue.getBaseValue(\"number\"),\n });\n\n //2. add output memo to targets (optional)\n if (compiledMemo) {\n targetOutputs.push({ script: compiledMemo, value: 0 });\n }\n\n const { inputs, outputs } = accumulative({\n inputs: utxos,\n outputs: targetOutputs,\n feeRate: feeRateWhole,\n chain,\n });\n\n // .inputs and .outputs will be undefined if no solution was found\n if (!(inputs && outputs))\n throw new SwapKitError(\"toolbox_utxo_insufficient_balance\", { sender, assetValue });\n const getNetwork = await getUtxoNetwork();\n const psbt = new Psbt({ network: getNetwork(chain) }); // Network-specific\n\n for (const { hash, index, witnessUtxo } of inputs) {\n psbt.addInput({ hash, index, witnessUtxo });\n }\n\n // Outputs\n for (const output of outputs) {\n const address =\n \"address\" in output && output.address ? output.address : toLegacyAddress(sender);\n const params = output.script\n ? compiledMemo\n ? { script: compiledMemo, value: 0 }\n : undefined\n : { address, value: output.value };\n\n if (params) {\n psbt.addOutput(params);\n }\n }\n\n return { psbt, utxos, inputs: inputs as UTXOType[] };\n}\n\nfunction getAddressFromKeys(keys: { getAddress: (index?: number) => string }) {\n const address = keys.getAddress(0);\n return stripToCashAddress(address);\n}\n",
7
- "import {\n Chain,\n RequestClient,\n SKConfig,\n SwapKitError,\n type UTXOChain,\n warnOnce,\n} from \"@swapkit/helpers\";\nimport { networks } from \"bitcoinjs-lib\";\nimport { uniqid } from \"../../utils\";\n\n// @ts-ignore\nimport coininfo from \"coininfo\";\n\ntype BlockchairParams<T> = T & { chain: Chain; apiKey?: string };\ntype BlockchairFetchUnspentUtxoParams = BlockchairParams<{\n offset?: number;\n limit?: number;\n address: string;\n}>;\n\nasync function broadcastUTXOTx({ chain, txHash }: { chain: Chain; txHash: string }) {\n const rpcUrl = SKConfig.get(\"rpcUrls\")[chain];\n const body = JSON.stringify({\n jsonrpc: \"2.0\",\n method: \"sendrawtransaction\",\n params: [txHash],\n id: uniqid(),\n });\n\n const response = await RequestClient.post<{\n id: string;\n result: string;\n error: { message: string; code?: number } | null;\n }>(rpcUrl, { headers: { \"Content-Type\": \"application/json\" }, body });\n\n if (response.error) {\n throw new SwapKitError(\"toolbox_utxo_broadcast_failed\", { error: response.error?.message });\n }\n\n if (response.result.includes('\"code\":-26')) {\n throw new SwapKitError(\"toolbox_utxo_invalid_transaction\", {\n error: \"Transaction amount was too low\",\n });\n }\n\n return response.result;\n}\n\nfunction baseUrl(chain: Chain) {\n return `https://api.blockchair.com/${mapChainToBlockchairChain(chain)}`;\n}\n\nfunction getDefaultTxFeeByChain(chain: Chain) {\n switch (chain) {\n case Chain.Bitcoin:\n return 5;\n case Chain.Dogecoin:\n return 10000;\n case Chain.Litecoin:\n return 1;\n case Chain.Zcash:\n return 1;\n default:\n return 2;\n }\n}\n\nfunction mapChainToBlockchairChain(chain: Chain) {\n switch (chain) {\n case Chain.BitcoinCash:\n return \"bitcoin-cash\";\n case Chain.Litecoin:\n return \"litecoin\";\n case Chain.Dash:\n return \"dash\";\n case Chain.Dogecoin:\n return \"dogecoin\";\n case Chain.Zcash:\n return \"zcash\";\n case Chain.Polkadot:\n return \"polkadot\";\n default:\n return \"bitcoin\";\n }\n}\n\nasync function getSuggestedTxFee(chain: Chain) {\n try {\n //Use Bitgo API for fee estimation\n //Refer: https://app.bitgo.com/docs/#operation/v2.tx.getfeeestimate\n const { feePerKb } = await RequestClient.get<{\n feePerKb: number;\n cpfpFeePerKb: number;\n numBlocks: number;\n feeByBlockTarget: { 1: number; 3: number };\n }>(`https://app.bitgo.com/api/v2/${chain.toLowerCase()}/tx/fee`);\n const suggestedFee = feePerKb / 1000;\n\n return Math.max(suggestedFee, getDefaultTxFeeByChain(chain));\n } catch (_error) {\n return getDefaultTxFeeByChain(chain);\n }\n}\n\nasync function blockchairRequest<T>(url: string, apiKey?: string): Promise<T> {\n try {\n const response = await RequestClient.get<BlockchairResponse<T>>(url);\n if (!response || response.context.code !== 200)\n throw new SwapKitError(\"toolbox_utxo_api_error\", { error: `Failed to query ${url}` });\n\n return response.data as T;\n } catch (error) {\n if (!apiKey) throw error;\n const response = await RequestClient.get<BlockchairResponse<T>>(\n `${url}${apiKey ? `&key=${apiKey}` : \"\"}`,\n );\n\n if (!response || response.context.code !== 200)\n throw new SwapKitError(\"toolbox_utxo_api_error\", { error: `Failed to query ${url}` });\n\n return response.data as T;\n }\n}\n\nasync function getAddressData({ address, chain, apiKey }: BlockchairParams<{ address?: string }>) {\n if (!address)\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", { error: \"Address is required\" });\n\n try {\n const response = await blockchairRequest<BlockchairAddressResponse>(\n `${baseUrl(chain)}/dashboards/address/${address}?transaction_details=true`,\n apiKey,\n );\n\n return response[address];\n } catch (_error) {\n return { utxo: [], address: { balance: 0, transaction_count: 0 } };\n }\n}\n\nasync function getUnconfirmedBalance({\n address,\n chain,\n apiKey,\n}: BlockchairParams<{ address?: string }>) {\n const response = await getAddressData({ address, chain, apiKey });\n\n return response?.address.balance || 0;\n}\n\nasync function getRawTx({ chain, apiKey, txHash }: BlockchairParams<{ txHash?: string }>) {\n if (!txHash)\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", { error: \"TxHash is required\" });\n\n try {\n const rawTxResponse = await blockchairRequest<BlockchairRawTransactionResponse>(\n `${baseUrl(chain)}/raw/transaction/${txHash}`,\n apiKey,\n );\n return rawTxResponse?.[txHash]?.raw_transaction || \"\";\n } catch (error) {\n console.error(\"Failed to fetch raw transaction:\", error);\n return \"\";\n }\n}\n\nasync function fetchUnspentUtxoBatch({\n chain,\n address,\n apiKey,\n offset = 0,\n limit = 100,\n}: BlockchairFetchUnspentUtxoParams) {\n const response = await blockchairRequest<BlockchairOutputsResponse[]>(\n `${baseUrl(chain)}/outputs?q=is_spent(false),recipient(${address})&limit=${limit}&offset=${offset}`,\n apiKey,\n );\n\n const txs = response\n .filter(({ is_spent }) => !is_spent)\n .map(({ script_hex, block_id, transaction_hash, index, value, spending_signature_hex }) => ({\n hash: transaction_hash,\n index,\n value,\n txHex: spending_signature_hex,\n script_hex,\n is_confirmed: block_id !== -1,\n }));\n\n return txs;\n}\n\nasync function getUnspentUtxos({\n chain,\n address,\n apiKey,\n offset = 0,\n limit = 100,\n}: BlockchairFetchUnspentUtxoParams): Promise<Awaited<ReturnType<typeof fetchUnspentUtxoBatch>>> {\n if (!address)\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", { error: \"Address is required\" });\n\n try {\n const txs = await fetchUnspentUtxoBatch({ chain, address, apiKey, offset, limit });\n\n if (txs.length <= limit) return txs;\n\n const nextBatch = await getUnspentUtxos({\n chain,\n address,\n apiKey,\n offset: offset + limit,\n limit,\n });\n\n return [...txs, ...nextBatch];\n } catch (error) {\n console.error(\"Failed to fetch unspent UTXOs:\", error);\n return [];\n }\n}\n\nasync function scanUTXOs({\n address,\n chain,\n apiKey,\n fetchTxHex = true,\n}: BlockchairParams<{ address: string; fetchTxHex?: boolean }>) {\n const utxos = await getUnspentUtxos({ chain, address, apiKey });\n const results = [];\n\n for (const { hash, index, script_hex, value } of utxos) {\n let txHex: string | undefined;\n if (fetchTxHex) {\n txHex = await getRawTx({ txHash: hash, chain, apiKey });\n }\n results.push({\n address,\n hash,\n index,\n txHex,\n value,\n witnessUtxo: { value, script: Buffer.from(script_hex, \"hex\") },\n });\n }\n return results;\n}\n\nfunction utxoApi(chain: UTXOChain) {\n const apiKey = SKConfig.get(\"apiKeys\").blockchair || \"\";\n\n warnOnce(!apiKey, \"No Blockchair API key found. Functionality will be limited.\");\n\n return {\n broadcastTx: (txHash: string) => broadcastUTXOTx({ txHash, chain }),\n getRawTx: (txHash: string) => getRawTx({ txHash, chain, apiKey }),\n getSuggestedTxFee: () => getSuggestedTxFee(chain),\n getBalance: (address: string) => getUnconfirmedBalance({ address, chain, apiKey }),\n getAddressData: (address: string) => getAddressData({ address, chain, apiKey }),\n scanUTXOs: (params: { address: string; fetchTxHex?: boolean }) =>\n scanUTXOs({ ...params, chain, apiKey }),\n };\n}\n\n/**\n * \"Factory\" to ensure typing for custom UTXO APIs\n */\nexport function createCustomUtxoApi(methods: ReturnType<typeof utxoApi>) {\n return methods;\n}\n\nexport function getUtxoApi(chain: UTXOChain) {\n const customUtxoApi = SKConfig.get(\"apis\")[chain];\n\n if (customUtxoApi) {\n warnOnce(true, \"Using custom UTXO API. Be sure to implement all methods to avoid issues.\");\n return customUtxoApi as ReturnType<typeof utxoApi>;\n }\n\n return utxoApi(chain);\n}\n\n// Define Zcash network objects that match ECPair's expected interface\nconst ZCASH_MAINNET = {\n messagePrefix: \"\\x19Zcash Signed Message:\\n\",\n bech32: \"zc\",\n bip32: {\n public: 0x0488b21e,\n private: 0x0488ade4,\n },\n pubKeyHash: 0x1c, // 28 in decimal - correct for Zcash mainnet\n scriptHash: 0x1c, // 28 in decimal\n wif: 0x80, // 128 in decimal\n};\n\nconst ZCASH_TESTNET = {\n messagePrefix: \"\\x19Zcash Signed Message:\\n\",\n bech32: \"ztestsapling\",\n bip32: {\n public: 0x043587cf,\n private: 0x04358394,\n },\n pubKeyHash: 0x1d, // 29 in decimal - correct for Zcash testnet\n scriptHash: 0x1c, // 28 in decimal\n wif: 0xef, // 239 in decimal\n};\n\nexport function getUtxoNetwork() {\n return function getNetwork(chain: Chain) {\n switch (chain) {\n case Chain.Bitcoin:\n return networks.bitcoin;\n case Chain.BitcoinCash:\n return coininfo.bitcoincash.main.toBitcoinJS();\n case Chain.Dash:\n return coininfo.dash.main.toBitcoinJS();\n case Chain.Litecoin:\n return coininfo.litecoin.main.toBitcoinJS();\n\n case Chain.Dogecoin: {\n const bip32 = { private: 0x04358394, public: 0x043587cf };\n const test = coininfo.dogecoin.test;\n test.versions.bip32 = bip32;\n return coininfo.dogecoin.main.toBitcoinJS();\n }\n\n case Chain.Zcash: {\n // Get Zcash network configuration using our custom objects\n const { isStagenet } = SKConfig.get(\"envs\");\n return isStagenet ? ZCASH_TESTNET : ZCASH_MAINNET;\n }\n\n default:\n throw new SwapKitError(\"toolbox_utxo_not_supported\", { chain });\n }\n };\n}\n\ninterface BlockchairVin {\n txid: string;\n vout: number;\n scriptSig: {\n asm: string;\n hex: string;\n };\n sequence: number;\n}\n\ninterface BlockchairVout {\n value: number;\n n: number;\n scriptPubKey: {\n asm: string;\n hex: string;\n address: string;\n type: string;\n addresses: string[];\n reqSigs: number;\n };\n}\n\ninterface BlockchairTransaction {\n block_id: number;\n hash: string;\n time: string;\n balance_change: number;\n}\n\ninterface BlockchairUtxo {\n block_id: number;\n transaction_hash: string;\n index: number;\n value: number;\n}\n\ninterface BlockchairAddressCoreData {\n type: string;\n script_hex: string;\n balance: number;\n balance_usd: number;\n received: number;\n received_usd: number;\n spent: number;\n spent_usd: number;\n output_count: number;\n unspent_output_count: number;\n first_seen_receiving: string;\n last_seen_receiving: string;\n first_seen_spending: null | string;\n last_seen_spending: null | string;\n transaction_count: number;\n scripthash_type: null | string;\n}\n\ninterface BlockchairInputOutputCommonData {\n block_id: number;\n transaction_id: number;\n index: number;\n transaction_hash: string;\n date: string;\n time: string;\n value: number;\n value_usd: number;\n recipient: string;\n type: string;\n script_hex: string;\n is_from_coinbase: boolean;\n is_spendable: boolean | null;\n is_spent: boolean;\n lifespan: number | null;\n cdd: number | null;\n}\n\ninterface BlockchairSpendingBlockData {\n spending_block_id: number | null;\n spending_transaction_id: number | null;\n spending_index: number | null;\n spending_transaction_hash: string | null;\n spending_date: string | null;\n spending_time: string | null;\n spending_value_usd: number | null;\n spending_sequence: number | null;\n spending_signature_hex: string | null;\n spending_witness: string | null;\n}\n\ninterface BlockchairAddressResponse {\n [key: string]: {\n address: BlockchairAddressCoreData;\n transactions: BlockchairTransaction[];\n utxo: BlockchairUtxo[];\n };\n}\n\ninterface BlockchairOutputsResponse\n extends BlockchairSpendingBlockData,\n BlockchairInputOutputCommonData {}\n\ninterface BlockchairRawTransactionResponse {\n [key: string]: {\n raw_transaction: string;\n decoded_raw_transaction: {\n txid: string;\n hash: string;\n version: number;\n size: number;\n vsize: number;\n weight: number;\n locktime: number;\n vin: BlockchairVin[];\n vout: BlockchairVout[];\n };\n };\n}\n\ninterface BlockchairResponse<T> {\n data: T;\n context: {\n code: number;\n source: string;\n results: number;\n state: number;\n market_price_usd: number;\n cache: {\n live: boolean;\n duration: number;\n since: string;\n until: string;\n time: any;\n };\n api: {\n version: string;\n last_major_update: string;\n next_major_update: null | string;\n documentation: string;\n notice: string;\n };\n servers: string;\n time: number;\n render_time: number;\n full_time: number;\n request_cost: number;\n };\n}\n",
7
+ "import {\n Chain,\n RequestClient,\n SKConfig,\n SwapKitError,\n type UTXOChain,\n warnOnce,\n} from \"@swapkit/helpers\";\nimport { networks } from \"bitcoinjs-lib\";\nimport { uniqid } from \"../../utils\";\n\n// @ts-ignore\nimport coininfo from \"coininfo\";\n\ntype BlockchairParams<T> = T & { chain: Chain; apiKey?: string };\ntype BlockchairFetchUnspentUtxoParams = BlockchairParams<{\n offset?: number;\n limit?: number;\n address: string;\n}>;\n\nasync function broadcastUTXOTx({ chain, txHash }: { chain: Chain; txHash: string }) {\n const rpcUrl = SKConfig.get(\"rpcUrls\")[chain];\n const body = JSON.stringify({\n jsonrpc: \"2.0\",\n method: \"sendrawtransaction\",\n params: [txHash],\n id: uniqid(),\n });\n\n const response = await RequestClient.post<{\n id: string;\n result: string;\n error: { message: string; code?: number } | null;\n }>(rpcUrl, { headers: { \"Content-Type\": \"application/json\" }, body });\n\n if (response.error) {\n throw new SwapKitError(\"toolbox_utxo_broadcast_failed\", { error: response.error?.message });\n }\n\n if (response.result.includes('\"code\":-26')) {\n throw new SwapKitError(\"toolbox_utxo_invalid_transaction\", {\n error: \"Transaction amount was too low\",\n });\n }\n\n return response.result;\n}\n\nfunction baseUrl(chain: Chain) {\n return `https://api.blockchair.com/${mapChainToBlockchairChain(chain)}`;\n}\n\nfunction getDefaultTxFeeByChain(chain: Chain) {\n switch (chain) {\n case Chain.Bitcoin:\n return 5;\n case Chain.Dogecoin:\n return 10000;\n case Chain.Litecoin:\n return 1;\n case Chain.Zcash:\n return 1;\n default:\n return 2;\n }\n}\n\nfunction mapChainToBlockchairChain(chain: Chain) {\n switch (chain) {\n case Chain.BitcoinCash:\n return \"bitcoin-cash\";\n case Chain.Litecoin:\n return \"litecoin\";\n case Chain.Dash:\n return \"dash\";\n case Chain.Dogecoin:\n return \"dogecoin\";\n case Chain.Zcash:\n return \"zcash\";\n case Chain.Polkadot:\n return \"polkadot\";\n default:\n return \"bitcoin\";\n }\n}\n\nasync function getSuggestedTxFee(chain: Chain) {\n try {\n //Use Bitgo API for fee estimation\n //Refer: https://app.bitgo.com/docs/#operation/v2.tx.getfeeestimate\n const { feePerKb } = await RequestClient.get<{\n feePerKb: number;\n cpfpFeePerKb: number;\n numBlocks: number;\n feeByBlockTarget: { 1: number; 3: number };\n }>(`https://app.bitgo.com/api/v2/${chain.toLowerCase()}/tx/fee`);\n const suggestedFee = feePerKb / 1000;\n\n return Math.max(suggestedFee, getDefaultTxFeeByChain(chain));\n } catch (_error) {\n return getDefaultTxFeeByChain(chain);\n }\n}\n\nasync function blockchairRequest<T>(url: string, apiKey?: string): Promise<T> {\n const response = await RequestClient.get<BlockchairResponse<T>>(\n `${url}${apiKey ? `${url.includes(\"?\") ? \"&\" : \"?\"}key=${apiKey}` : \"\"}`,\n );\n\n if (!response || response.context.code !== 200)\n throw new SwapKitError(\"toolbox_utxo_api_error\", { error: `Failed to query ${url}` });\n\n return response.data as T;\n}\n\nasync function getAddressData({ address, chain, apiKey }: BlockchairParams<{ address?: string }>) {\n if (!address)\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", { error: \"Address is required\" });\n\n try {\n const response = await blockchairRequest<BlockchairAddressResponse>(\n `${baseUrl(chain)}/dashboards/address/${address}?transaction_details=true`,\n apiKey,\n );\n\n return response[address];\n } catch (_error) {\n return { utxo: [], address: { balance: 0, transaction_count: 0 } };\n }\n}\n\nasync function getUnconfirmedBalance({\n address,\n chain,\n apiKey,\n}: BlockchairParams<{ address?: string }>) {\n const response = await getAddressData({ address, chain, apiKey });\n\n return response?.address.balance || 0;\n}\n\nasync function getRawTx({ chain, apiKey, txHash }: BlockchairParams<{ txHash?: string }>) {\n if (!txHash)\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", { error: \"TxHash is required\" });\n\n try {\n const rawTxResponse = await blockchairRequest<BlockchairRawTransactionResponse>(\n `${baseUrl(chain)}/raw/transaction/${txHash}`,\n apiKey,\n );\n return rawTxResponse?.[txHash]?.raw_transaction || \"\";\n } catch (error) {\n console.error(\"Failed to fetch raw transaction:\", error);\n return \"\";\n }\n}\n\nasync function fetchUnspentUtxoBatch({\n chain,\n address,\n apiKey,\n offset = 0,\n limit = 100,\n}: BlockchairFetchUnspentUtxoParams) {\n const response = await blockchairRequest<BlockchairOutputsResponse[]>(\n `${baseUrl(chain)}/outputs?q=is_spent(false),recipient(${address})&limit=${limit}&offset=${offset}`,\n apiKey,\n );\n\n const txs = response\n .filter(({ is_spent }) => !is_spent)\n .map(({ script_hex, block_id, transaction_hash, index, value, spending_signature_hex }) => ({\n hash: transaction_hash,\n index,\n value,\n txHex: spending_signature_hex,\n script_hex,\n is_confirmed: block_id !== -1,\n }));\n\n return txs;\n}\n\nasync function getUnspentUtxos({\n chain,\n address,\n apiKey,\n offset = 0,\n limit = 100,\n}: BlockchairFetchUnspentUtxoParams): Promise<Awaited<ReturnType<typeof fetchUnspentUtxoBatch>>> {\n if (!address)\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", { error: \"Address is required\" });\n\n try {\n const txs = await fetchUnspentUtxoBatch({ chain, address, apiKey, offset, limit });\n\n if (txs.length <= limit) return txs;\n\n const nextBatch = await getUnspentUtxos({\n chain,\n address,\n apiKey,\n offset: offset + limit,\n limit,\n });\n\n return [...txs, ...nextBatch];\n } catch (error) {\n console.error(\"Failed to fetch unspent UTXOs:\", error);\n return [];\n }\n}\n\nasync function scanUTXOs({\n address,\n chain,\n apiKey,\n fetchTxHex = true,\n}: BlockchairParams<{ address: string; fetchTxHex?: boolean }>) {\n const utxos = await getUnspentUtxos({ chain, address, apiKey });\n const results = [];\n\n for (const { hash, index, script_hex, value } of utxos) {\n let txHex: string | undefined;\n if (fetchTxHex) {\n txHex = await getRawTx({ txHash: hash, chain, apiKey });\n }\n results.push({\n address,\n hash,\n index,\n txHex,\n value,\n witnessUtxo: { value, script: Buffer.from(script_hex, \"hex\") },\n });\n }\n return results;\n}\n\nfunction utxoApi(chain: UTXOChain) {\n const apiKey = SKConfig.get(\"apiKeys\").blockchair || \"\";\n\n warnOnce(!apiKey, \"No Blockchair API key found. Functionality will be limited.\");\n\n return {\n broadcastTx: (txHash: string) => broadcastUTXOTx({ txHash, chain }),\n getRawTx: (txHash: string) => getRawTx({ txHash, chain, apiKey }),\n getSuggestedTxFee: () => getSuggestedTxFee(chain),\n getBalance: (address: string) => getUnconfirmedBalance({ address, chain, apiKey }),\n getAddressData: (address: string) => getAddressData({ address, chain, apiKey }),\n scanUTXOs: (params: { address: string; fetchTxHex?: boolean }) =>\n scanUTXOs({ ...params, chain, apiKey }),\n };\n}\n\n/**\n * \"Factory\" to ensure typing for custom UTXO APIs\n */\nexport function createCustomUtxoApi(methods: ReturnType<typeof utxoApi>) {\n return methods;\n}\n\nexport function getUtxoApi(chain: UTXOChain) {\n const customUtxoApi = SKConfig.get(\"apis\")[chain];\n\n if (customUtxoApi) {\n warnOnce(true, \"Using custom UTXO API. Be sure to implement all methods to avoid issues.\");\n return customUtxoApi as ReturnType<typeof utxoApi>;\n }\n\n return utxoApi(chain);\n}\n\n// Define Zcash network objects that match ECPair's expected interface\nconst ZCASH_MAINNET = {\n messagePrefix: \"\\x19Zcash Signed Message:\\n\",\n bech32: \"zc\",\n bip32: {\n public: 0x0488b21e,\n private: 0x0488ade4,\n },\n pubKeyHash: 0x1c, // 28 in decimal - correct for Zcash mainnet\n scriptHash: 0x1c, // 28 in decimal\n wif: 0x80, // 128 in decimal\n};\n\nconst ZCASH_TESTNET = {\n messagePrefix: \"\\x19Zcash Signed Message:\\n\",\n bech32: \"ztestsapling\",\n bip32: {\n public: 0x043587cf,\n private: 0x04358394,\n },\n pubKeyHash: 0x1d, // 29 in decimal - correct for Zcash testnet\n scriptHash: 0x1c, // 28 in decimal\n wif: 0xef, // 239 in decimal\n};\n\nexport function getUtxoNetwork() {\n return function getNetwork(chain: Chain) {\n switch (chain) {\n case Chain.Bitcoin:\n return networks.bitcoin;\n case Chain.BitcoinCash:\n return coininfo.bitcoincash.main.toBitcoinJS();\n case Chain.Dash:\n return coininfo.dash.main.toBitcoinJS();\n case Chain.Litecoin:\n return coininfo.litecoin.main.toBitcoinJS();\n\n case Chain.Dogecoin: {\n const bip32 = { private: 0x04358394, public: 0x043587cf };\n const test = coininfo.dogecoin.test;\n test.versions.bip32 = bip32;\n return coininfo.dogecoin.main.toBitcoinJS();\n }\n\n case Chain.Zcash: {\n // Get Zcash network configuration using our custom objects\n const { isStagenet } = SKConfig.get(\"envs\");\n return isStagenet ? ZCASH_TESTNET : ZCASH_MAINNET;\n }\n\n default:\n throw new SwapKitError(\"toolbox_utxo_not_supported\", { chain });\n }\n };\n}\n\ninterface BlockchairVin {\n txid: string;\n vout: number;\n scriptSig: {\n asm: string;\n hex: string;\n };\n sequence: number;\n}\n\ninterface BlockchairVout {\n value: number;\n n: number;\n scriptPubKey: {\n asm: string;\n hex: string;\n address: string;\n type: string;\n addresses: string[];\n reqSigs: number;\n };\n}\n\ninterface BlockchairTransaction {\n block_id: number;\n hash: string;\n time: string;\n balance_change: number;\n}\n\ninterface BlockchairUtxo {\n block_id: number;\n transaction_hash: string;\n index: number;\n value: number;\n}\n\ninterface BlockchairAddressCoreData {\n type: string;\n script_hex: string;\n balance: number;\n balance_usd: number;\n received: number;\n received_usd: number;\n spent: number;\n spent_usd: number;\n output_count: number;\n unspent_output_count: number;\n first_seen_receiving: string;\n last_seen_receiving: string;\n first_seen_spending: null | string;\n last_seen_spending: null | string;\n transaction_count: number;\n scripthash_type: null | string;\n}\n\ninterface BlockchairInputOutputCommonData {\n block_id: number;\n transaction_id: number;\n index: number;\n transaction_hash: string;\n date: string;\n time: string;\n value: number;\n value_usd: number;\n recipient: string;\n type: string;\n script_hex: string;\n is_from_coinbase: boolean;\n is_spendable: boolean | null;\n is_spent: boolean;\n lifespan: number | null;\n cdd: number | null;\n}\n\ninterface BlockchairSpendingBlockData {\n spending_block_id: number | null;\n spending_transaction_id: number | null;\n spending_index: number | null;\n spending_transaction_hash: string | null;\n spending_date: string | null;\n spending_time: string | null;\n spending_value_usd: number | null;\n spending_sequence: number | null;\n spending_signature_hex: string | null;\n spending_witness: string | null;\n}\n\ninterface BlockchairAddressResponse {\n [key: string]: {\n address: BlockchairAddressCoreData;\n transactions: BlockchairTransaction[];\n utxo: BlockchairUtxo[];\n };\n}\n\ninterface BlockchairOutputsResponse\n extends BlockchairSpendingBlockData,\n BlockchairInputOutputCommonData {}\n\ninterface BlockchairRawTransactionResponse {\n [key: string]: {\n raw_transaction: string;\n decoded_raw_transaction: {\n txid: string;\n hash: string;\n version: number;\n size: number;\n vsize: number;\n weight: number;\n locktime: number;\n vin: BlockchairVin[];\n vout: BlockchairVout[];\n };\n };\n}\n\ninterface BlockchairResponse<T> {\n data: T;\n context: {\n code: number;\n source: string;\n results: number;\n state: number;\n market_price_usd: number;\n cache: {\n live: boolean;\n duration: number;\n since: string;\n until: string;\n time: any;\n };\n api: {\n version: string;\n last_major_update: string;\n next_major_update: null | string;\n documentation: string;\n notice: string;\n };\n servers: string;\n time: number;\n render_time: number;\n full_time: number;\n request_cost: number;\n };\n}\n",
8
8
  "import { SwapKitError } from \"@swapkit/helpers\";\nimport base58check from \"bs58check\";\n// @ts-ignore\nimport cashaddr from \"cashaddrjs\";\n\nenum Format {\n Legacy = \"legacy\",\n Bitpay = \"bitpay\",\n Cashaddr = \"cashaddr\",\n}\nenum UtxoNetwork {\n Mainnet = \"mainnet\",\n Testnet = \"testnet\",\n}\nenum Type {\n P2PKH = \"p2pkh\",\n P2SH = \"p2sh\",\n}\n\nconst VERSION_BYTE = {\n [Format.Legacy]: {\n [UtxoNetwork.Mainnet]: {\n [Type.P2PKH]: 0,\n [Type.P2SH]: 5,\n },\n [UtxoNetwork.Testnet]: {\n [Type.P2PKH]: 111,\n [Type.P2SH]: 196,\n },\n },\n [Format.Bitpay]: {\n [UtxoNetwork.Mainnet]: {\n [Type.P2PKH]: 28,\n [Type.P2SH]: 40,\n },\n [UtxoNetwork.Testnet]: {\n [Type.P2PKH]: 111,\n [Type.P2SH]: 196,\n },\n },\n};\n\ntype DecodedType = {\n format: Format;\n network: UtxoNetwork;\n type: Type;\n hash: any;\n};\n\nfunction isValidAddress(input: any) {\n try {\n decodeAddress(input);\n return true;\n } catch (_error) {\n return false;\n }\n}\n\nfunction detectAddressNetwork(address: string) {\n return decodeAddress(address)?.network;\n}\n\nfunction toLegacyAddress(address: string): string {\n const decoded = decodeAddress(address);\n if (decoded?.format === Format.Legacy) {\n return address;\n }\n return encodeAsLegacy(decoded);\n}\n\nfunction toCashAddress(address: string): string {\n const decoded = decodeAddress(address);\n return encodeAsCashaddr(decoded);\n}\n\nfunction decodeAddress(address: string) {\n try {\n return decodeBase58Address(address);\n } catch (_error) {\n // Try to decode as cashaddr if base58 decoding fails.\n }\n try {\n return decodeCashAddress(address);\n } catch (_error) {\n // Try to decode as bitpay if cashaddr decoding fails.\n }\n throw new SwapKitError(\"toolbox_utxo_invalid_address\", { address });\n}\n\nfunction decodeBase58Address(address: string) {\n try {\n const payload = base58check.decode(address);\n\n // BASE_58_CHECK_PAYLOAD_LENGTH\n if (payload.length !== 21) throw new SwapKitError(\"toolbox_utxo_invalid_address\", { address });\n const versionByte = payload[0];\n const hash = Array.prototype.slice.call(payload, 1);\n\n switch (versionByte) {\n case VERSION_BYTE[Format.Legacy][UtxoNetwork.Mainnet][Type.P2PKH]:\n return { hash, format: Format.Legacy, network: UtxoNetwork.Mainnet, type: Type.P2PKH };\n\n case VERSION_BYTE[Format.Legacy][UtxoNetwork.Mainnet][Type.P2SH]:\n return { hash, format: Format.Legacy, network: UtxoNetwork.Mainnet, type: Type.P2SH };\n\n case VERSION_BYTE[Format.Legacy][UtxoNetwork.Testnet][Type.P2PKH]:\n return { hash, format: Format.Legacy, network: UtxoNetwork.Testnet, type: Type.P2PKH };\n\n case VERSION_BYTE[Format.Legacy][UtxoNetwork.Testnet][Type.P2SH]:\n return { hash, format: Format.Legacy, network: UtxoNetwork.Testnet, type: Type.P2SH };\n\n case VERSION_BYTE[Format.Bitpay][UtxoNetwork.Mainnet][Type.P2PKH]:\n return { hash, format: Format.Bitpay, network: UtxoNetwork.Mainnet, type: Type.P2PKH };\n\n case VERSION_BYTE[Format.Bitpay][UtxoNetwork.Mainnet][Type.P2SH]:\n return { hash, format: Format.Bitpay, network: UtxoNetwork.Mainnet, type: Type.P2SH };\n\n default:\n throw new SwapKitError(\"toolbox_utxo_invalid_address\", { address });\n }\n } catch (_error) {\n throw new SwapKitError(\"toolbox_utxo_invalid_address\", { address });\n }\n}\n\nfunction decodeCashAddress(address: string) {\n if (address.indexOf(\":\") !== -1) {\n try {\n return decodeCashAddressWithPrefix(address);\n } catch (_error) {\n // Try to decode as legacy if cashaddr decoding fails.\n }\n } else {\n const prefixes = [\"bitcoincash\", \"bchtest\", \"bchreg\"];\n for (const prefix of prefixes) {\n try {\n return decodeCashAddressWithPrefix(`${prefix}:${address}`);\n } catch (_error) {\n // Try next prefix if decoding fails.\n }\n }\n }\n\n throw new SwapKitError(\"toolbox_utxo_invalid_address\", { address });\n}\n\nfunction decodeCashAddressWithPrefix(address: string): DecodedType {\n try {\n const { hash, prefix, type } = cashaddr.decode(address);\n\n return {\n format: Format.Cashaddr,\n hash: Array.prototype.slice.call(hash, 0),\n network: prefix === \"bitcoincash\" ? UtxoNetwork.Mainnet : UtxoNetwork.Testnet,\n type: type === \"P2PKH\" ? Type.P2PKH : Type.P2SH,\n };\n } catch (_error) {\n throw new SwapKitError(\"toolbox_utxo_invalid_address\", { address });\n }\n}\n\nfunction encodeAsLegacy(decoded: DecodedType) {\n const versionByte = VERSION_BYTE[Format.Legacy][decoded.network][decoded.type];\n const buffer = Buffer.alloc(1 + decoded.hash.length);\n buffer[0] = versionByte;\n buffer.set(decoded.hash, 1);\n return base58check.encode(buffer);\n}\n\nfunction encodeAsCashaddr(decoded: DecodedType) {\n const prefix = decoded.network === UtxoNetwork.Mainnet ? \"bitcoincash\" : \"bchtest\";\n const type = decoded.type === Type.P2PKH ? \"P2PKH\" : \"P2SH\";\n const hash = new Uint8Array(decoded.hash);\n return cashaddr.encode(prefix, type, hash);\n}\n\nexport { detectAddressNetwork, isValidAddress, UtxoNetwork, toCashAddress, toLegacyAddress };\n",
9
9
  "import { Chain, SwapKitError, type UTXOChain } from \"@swapkit/helpers\";\n\nimport {\n TX_OVERHEAD,\n UTXOScriptType,\n calculateTxSize,\n getInputSize,\n getOutputSize,\n getScriptTypeForAddress,\n} from \"../helpers\";\nimport type { TargetOutput, UTXOCalculateTxSizeParams, UTXOType } from \"../types\";\n\nexport const getDustThreshold = (chain: UTXOChain) => {\n switch (chain) {\n case Chain.Bitcoin:\n case Chain.BitcoinCash:\n return 550;\n case Chain.Dash:\n case Chain.Litecoin:\n return 5500;\n case Chain.Dogecoin:\n return 100000;\n case Chain.Zcash:\n return 546;\n default:\n throw new SwapKitError(\"toolbox_utxo_not_supported\", { chain });\n }\n};\n\nexport const accumulative = ({\n inputs,\n outputs,\n feeRate: initialFeeRate = 1,\n chain = Chain.Bitcoin,\n}: UTXOCalculateTxSizeParams & { outputs: TargetOutput[]; chain: UTXOChain }) => {\n const feeRate = Math.ceil(initialFeeRate);\n\n const newTxType =\n inputs[0] && \"address\" in inputs[0] && inputs[0].address\n ? getScriptTypeForAddress(inputs[0].address)\n : UTXOScriptType.P2PKH;\n // skip input if adding it would cost more than input is worth\n const filteredInputs = inputs.filter((input) => getInputSize(input) * feeRate <= input.value);\n\n const txSizeWithoutInputs =\n TX_OVERHEAD + outputs.reduce((total, output) => total + getOutputSize(output, newTxType), 0);\n\n const amountToSend = outputs.reduce((total, output) => total + output.value, 0);\n\n let fees = txSizeWithoutInputs * feeRate;\n let inputsValue = 0;\n const inputsToUse: typeof inputs = [];\n\n for (const input of filteredInputs) {\n const inputSize = getInputSize(input);\n const inputFee = feeRate * inputSize;\n\n fees += inputFee;\n inputsValue += input.value;\n\n inputsToUse.push(input);\n\n const totalCost = fees + amountToSend;\n\n // we need more inputs\n if (inputsValue < totalCost) continue;\n\n const remainder = inputsValue - totalCost;\n\n const feeForExtraOutput = feeRate * getOutputSize({ address: \"\", value: 0 }, newTxType);\n\n // potential change address\n if (remainder > feeForExtraOutput) {\n const feeAfterExtraOutput = feeForExtraOutput + fees;\n const remainderAfterExtraOutput = inputsValue - (amountToSend + feeAfterExtraOutput);\n\n // is it worth a change output aka can we send it in the future?\n if (\n remainderAfterExtraOutput >\n Math.max(getInputSize({} as UTXOType) * feeRate, getDustThreshold(chain))\n ) {\n return {\n inputs: inputsToUse,\n outputs: outputs.concat({ value: remainderAfterExtraOutput, address: \"\" }),\n fee: feeAfterExtraOutput,\n };\n }\n }\n return {\n inputs: inputsToUse,\n outputs,\n fee: fees,\n };\n }\n\n // We don't have enough inputs, let's calculate transaction fee accrude to the last input\n return { fee: feeRate * calculateTxSize({ inputs, outputs, feeRate }) };\n};\n",
10
10
  "import { SwapKitError } from \"@swapkit/helpers\";\nimport { opcodes, script } from \"bitcoinjs-lib\";\nimport type {\n TargetOutput,\n UTXOCalculateTxSizeParams,\n UTXOInputWithScriptType,\n UTXOType,\n} from \"../types\";\n\n/**\n * Minimum transaction fee\n * 1000 satoshi/kB (similar to current `minrelaytxfee`)\n * @see https://github.com/bitcoin/bitcoin/blob/db88db47278d2e7208c50d16ab10cb355067d071/src/validation.h#L56\n */\nexport const MIN_TX_FEE = 1000;\nexport const TX_OVERHEAD = 4 + 1 + 1 + 4; //10\nexport const OP_RETURN_OVERHEAD = 1 + 8 + 1; //10\nconst TX_INPUT_BASE = 32 + 4 + 1 + 4; // 41\nconst TX_INPUT_PUBKEYHASH = 107;\n\nexport function compileMemo(memo: string) {\n const data = Buffer.from(memo, \"utf8\"); // converts MEMO to buffer\n return script.compile([opcodes.OP_RETURN as number, data]); // Compile OP_RETURN script\n}\n\nexport enum UTXOScriptType {\n P2PKH = \"P2PKH\", // legacy\n // P2SH = 'P2SH', // multisig\n P2WPKH = \"P2WPKH\", // bech32 - native segwit\n // P2TR = \"P2TR\", // taproot\n}\n\nexport const InputSizes: Record<UTXOScriptType, number> = {\n [UTXOScriptType.P2PKH]: 148,\n // [UTXOScriptType.P2SH]: 91,\n [UTXOScriptType.P2WPKH]: 68,\n};\n\nexport const OutputSizes: Record<UTXOScriptType, number> = {\n [UTXOScriptType.P2PKH]: 34,\n // [UTXOScriptType.P2SH]: 91,\n [UTXOScriptType.P2WPKH]: 31,\n};\n\nexport const getScriptTypeForAddress = (address: string) => {\n if (address.startsWith(\"bc1\") || address.startsWith(\"ltc1\")) {\n return UTXOScriptType.P2WPKH;\n }\n // if (address.startsWith('3') || address.startsWith('M')) {\n // return UTXOScriptType.P2SH;\n // }\n if (\n address.startsWith(\"1\") ||\n address.startsWith(\"3\") ||\n address.startsWith(\"L\") ||\n address.startsWith(\"M\") ||\n address.startsWith(\"X\") ||\n address.startsWith(\"D\") ||\n address.startsWith(\"bitcoincash:q\") ||\n address.startsWith(\"q\")\n ) {\n return UTXOScriptType.P2PKH;\n }\n throw new SwapKitError(\"toolbox_utxo_invalid_address\", { address });\n};\n\nexport const calculateTxSize = ({ inputs, outputs, feeRate }: UTXOCalculateTxSizeParams) => {\n const newTxType =\n inputs[0] && \"address\" in inputs[0] && inputs[0].address\n ? getScriptTypeForAddress(inputs[0].address)\n : UTXOScriptType.P2PKH;\n const inputSize = inputs\n .filter(\n (utxo) =>\n utxo.value >=\n InputSizes[\"type\" in utxo ? utxo.type : UTXOScriptType.P2PKH] * Math.ceil(feeRate),\n )\n .reduce((total, utxo) => total + getInputSize(utxo), 0);\n\n const outputSize =\n outputs?.reduce((total, output) => total + getOutputSize(output), 0) || OutputSizes[newTxType];\n\n return TX_OVERHEAD + inputSize + outputSize;\n};\n\nexport const getInputSize = (input: UTXOInputWithScriptType | UTXOType) => {\n if (\"type\" in input) {\n return InputSizes[input.type];\n }\n if (\"address\" in input && input.address) {\n return InputSizes[getScriptTypeForAddress(input.address as string)];\n }\n return TX_INPUT_BASE + TX_INPUT_PUBKEYHASH;\n};\n\nexport const getOutputSize = (output: TargetOutput, scriptType?: UTXOScriptType) => {\n if (output?.script) {\n return OP_RETURN_OVERHEAD + output.script.length + (output.script.length >= 74 ? 2 : 1);\n }\n if (scriptType) {\n return OutputSizes[scriptType];\n }\n return OutputSizes[UTXOScriptType.P2PKH];\n};\n",
11
11
  "import {\n AssetValue,\n Chain,\n type ChainSigner,\n DerivationPath,\n type DerivationPathArray,\n FeeOption,\n NetworkDerivationPath,\n SwapKitError,\n SwapKitNumber,\n type UTXOChain,\n applyFeeMultiplier,\n derivationPathToString,\n updateDerivationPath,\n} from \"@swapkit/helpers\";\nimport { Psbt, address as btcLibAddress, initEccLib, payments } from \"bitcoinjs-lib\";\nimport type { ECPairInterface } from \"ecpair\";\nimport { ECPairFactory } from \"ecpair\";\nimport type { UtxoToolboxParams } from \".\";\nimport { getBalance } from \"../../utils\";\nimport {\n UTXOScriptType,\n accumulative,\n calculateTxSize,\n compileMemo,\n getDustThreshold,\n getInputSize,\n getUtxoApi,\n getUtxoNetwork,\n} from \"../helpers\";\nimport type {\n BchECPair,\n TargetOutput,\n UTXOBuildTxParams,\n UTXOTransferParams,\n UTXOType,\n} from \"../types\";\nimport { bchValidateAddress } from \"./bitcoinCash\";\n\nimport secp256k1 from \"@bitcoinerlab/secp256k1\";\n// @ts-ignore\nimport { ECPair, HDNode } from \"@psf/bitcoincashjs-lib\";\nimport { HDKey } from \"@scure/bip32\";\nimport { mnemonicToSeedSync } from \"@scure/bip39\";\nimport { validateZcashAddress } from \"./zcash\";\n\nexport const nonSegwitChains = [Chain.Dash, Chain.Dogecoin];\n\nfunction addInputsAndOutputs({\n inputs,\n outputs,\n chain,\n psbt,\n sender,\n compiledMemo,\n}: {\n inputs: UTXOType[];\n outputs: TargetOutput[];\n chain: UTXOChain;\n psbt: Psbt;\n sender: string;\n compiledMemo: Buffer<ArrayBufferLike> | null;\n}) {\n for (const utxo of inputs) {\n const witnessInfo = !!utxo.witnessUtxo &&\n !nonSegwitChains.includes(chain) && { witnessUtxo: utxo.witnessUtxo };\n\n const nonWitnessInfo = nonSegwitChains.includes(chain) && {\n nonWitnessUtxo: utxo.txHex ? Buffer.from(utxo.txHex, \"hex\") : undefined,\n };\n\n psbt.addInput({ hash: utxo.hash, index: utxo.index, ...witnessInfo, ...nonWitnessInfo });\n }\n\n for (const output of outputs) {\n const address = \"address\" in output && output.address ? output.address : sender;\n const hasOutputScript = output.script;\n\n if (hasOutputScript && !compiledMemo) {\n continue;\n }\n\n const mappedOutput = hasOutputScript\n ? {\n script: compiledMemo as Buffer<ArrayBufferLike>,\n value: 0,\n }\n : {\n address,\n value: output.value,\n };\n\n initEccLib(secp256k1);\n psbt.addOutput(mappedOutput);\n }\n\n return { psbt, inputs };\n}\n\nasync function createTransaction({\n assetValue,\n recipient,\n memo,\n feeRate,\n sender,\n fetchTxHex = false,\n}: UTXOBuildTxParams): Promise<{\n psbt: Psbt;\n utxos: UTXOType[];\n inputs: UTXOType[];\n}> {\n const chain = assetValue.chain as UTXOChain;\n const compiledMemo = memo ? await compileMemo(memo) : null;\n\n const inputsAndOutputs = await getInputsAndTargetOutputs({\n assetValue,\n recipient,\n memo,\n sender,\n fetchTxHex,\n });\n\n const { inputs, outputs } = accumulative({ ...inputsAndOutputs, feeRate, chain });\n\n // .inputs and .outputs will be undefined if no solution was found\n if (!(inputs && outputs))\n throw new SwapKitError(\"toolbox_utxo_insufficient_balance\", { sender, assetValue });\n const getNetwork = await getUtxoNetwork();\n const psbt = new Psbt({ network: getNetwork(chain) });\n\n if (chain === Chain.Dogecoin) psbt.setMaximumFeeRate(650000000);\n\n const { psbt: mappedPsbt, inputs: mappedInputs } = await addInputsAndOutputs({\n inputs,\n outputs,\n chain,\n psbt,\n sender,\n compiledMemo,\n });\n\n return {\n psbt: mappedPsbt,\n utxos: inputsAndOutputs.inputs,\n inputs: mappedInputs,\n };\n}\n\nexport async function getUTXOAddressValidator() {\n const getNetwork = await getUtxoNetwork();\n\n return function validateAddress({ address, chain }: { address: string; chain: UTXOChain }) {\n if (chain === Chain.BitcoinCash) {\n return bchValidateAddress(address);\n }\n\n if (chain === Chain.Zcash) {\n return validateZcashAddress(address);\n }\n\n try {\n initEccLib(secp256k1);\n btcLibAddress.toOutputScript(address, getNetwork(chain));\n return true;\n } catch (_error) {\n return false;\n }\n };\n}\n\nasync function createSignerWithKeys({\n chain,\n phrase,\n derivationPath,\n}: { chain: UTXOChain; phrase: string; derivationPath: string }) {\n const keyPair = (await getCreateKeysForPath(chain as Chain.Bitcoin))({ phrase, derivationPath });\n\n async function signTransaction(psbt: Psbt) {\n await psbt.signAllInputs(keyPair);\n return psbt;\n }\n\n async function getAddress() {\n const addressGetter = await addressFromKeysGetter(chain);\n return addressGetter(keyPair);\n }\n\n return {\n getAddress,\n signTransaction,\n };\n}\n\nexport async function createUTXOToolbox<T extends UTXOChain>({\n chain,\n ...toolboxParams\n}: (\n | UtxoToolboxParams[T]\n | {\n phrase?: string;\n derivationPath?: DerivationPathArray;\n index?: number;\n }\n) & { chain: T }) {\n const phrase = \"phrase\" in toolboxParams ? toolboxParams.phrase : undefined;\n\n const index = \"index\" in toolboxParams ? toolboxParams.index || 0 : 0;\n\n const derivationPath = derivationPathToString(\n \"derivationPath\" in toolboxParams && toolboxParams.derivationPath\n ? toolboxParams.derivationPath\n : updateDerivationPath(NetworkDerivationPath[chain], { index }),\n );\n\n const signer = phrase\n ? await createSignerWithKeys({ chain, phrase, derivationPath })\n : \"signer\" in toolboxParams\n ? toolboxParams.signer\n : undefined;\n\n function getAddress() {\n return Promise.resolve(signer?.getAddress());\n }\n\n // const { signer } = params || {};\n const getAddressFromKeys = await addressFromKeysGetter(chain);\n const validateAddress = await getUTXOAddressValidator();\n const createKeysForPath = await getCreateKeysForPath(chain);\n\n return {\n accumulative,\n calculateTxSize,\n getAddressFromKeys,\n getAddress,\n validateAddress: (address: string) => validateAddress({ address, chain }),\n broadcastTx: (txHash: string) => getUtxoApi(chain).broadcastTx(txHash),\n createTransaction,\n createKeysForPath,\n getFeeRates: () => getFeeRates(chain),\n getInputsOutputsFee,\n transfer: transfer(signer as UtxoToolboxParams[\"BTC\"][\"signer\"]),\n getPrivateKeyFromMnemonic: (params: { phrase: string; derivationPath: string }) => {\n const keys = createKeysForPath(params);\n return keys.toWIF();\n },\n\n getBalance: getBalance(chain),\n estimateTransactionFee: estimateTransactionFee(chain),\n estimateMaxSendableAmount: estimateMaxSendableAmount(chain),\n };\n}\n\nasync function getInputsOutputsFee({\n assetValue,\n feeOptionKey = FeeOption.Fast,\n feeRate,\n memo,\n sender,\n recipient,\n}: Omit<UTXOBuildTxParams, \"feeRate\"> & {\n feeOptionKey?: FeeOption;\n feeRate?: number;\n}) {\n const chain = assetValue.chain as UTXOChain;\n\n const inputsAndOutputs = await getInputsAndTargetOutputs({\n assetValue,\n sender,\n memo,\n recipient,\n });\n\n const feeRateWhole = feeRate ? Math.floor(feeRate) : (await getFeeRates(chain))[feeOptionKey];\n\n return accumulative({ ...inputsAndOutputs, feeRate: feeRateWhole, chain });\n}\n\nfunction estimateMaxSendableAmount(chain: UTXOChain) {\n return async function estimateMaxSendableAmount({\n from,\n memo,\n feeRate,\n feeOptionKey = FeeOption.Fast,\n recipients = 1,\n }: {\n from: string;\n memo?: string;\n feeRate?: number;\n feeOptionKey?: FeeOption;\n recipients?: number | TargetOutput[];\n }) {\n const addressData = await getUtxoApi(chain).getAddressData(from);\n const feeRateWhole = feeRate ? Math.ceil(feeRate) : (await getFeeRates(chain))[feeOptionKey];\n\n const inputs = addressData?.utxo\n .map((utxo) => ({\n ...utxo,\n // type: utxo.witnessUtxo ? UTXOScriptType.P2WPKH : UTXOScriptType.P2PKH,\n type: UTXOScriptType.P2PKH,\n hash: \"\",\n }))\n .filter(\n (utxo) => utxo.value > Math.max(getDustThreshold(chain), getInputSize(utxo) * feeRateWhole),\n );\n\n if (!inputs?.length) return AssetValue.from({ chain });\n\n const balance = AssetValue.from({\n chain,\n value: inputs.reduce((sum, utxo) => sum + utxo.value, 0),\n });\n\n const outputs =\n typeof recipients === \"number\"\n ? (Array.from({ length: recipients }, () => ({\n address: from,\n value: 0,\n })) as TargetOutput[])\n : recipients;\n\n if (memo) {\n const script = await compileMemo(memo);\n outputs.push({ address: from, script, value: 0 });\n }\n\n const txSize = calculateTxSize({ inputs, outputs, feeRate: feeRateWhole });\n\n const fee = txSize * feeRateWhole;\n\n return balance.sub(fee);\n };\n}\n\nfunction estimateTransactionFee(chain: UTXOChain) {\n return async (params: {\n assetValue: AssetValue;\n recipient: string;\n sender: string;\n memo?: string;\n feeOptionKey?: FeeOption;\n feeRate?: number;\n fetchTxHex?: boolean;\n }) => {\n const inputFees = await getInputsOutputsFee(params);\n\n return AssetValue.from({\n chain,\n value: SwapKitNumber.fromBigInt(BigInt(inputFees.fee), 8).getValue(\"string\"),\n });\n };\n}\n\ntype CreateKeysForPathReturnType = {\n [Chain.BitcoinCash]: BchECPair;\n [Chain.Bitcoin]: ECPairInterface;\n [Chain.Dash]: ECPairInterface;\n [Chain.Dogecoin]: ECPairInterface;\n [Chain.Litecoin]: ECPairInterface;\n [Chain.Zcash]: ECPairInterface;\n};\n\nexport async function getCreateKeysForPath<T extends keyof CreateKeysForPathReturnType>(\n chain: T,\n): Promise<\n (params: {\n wif?: string;\n phrase?: string;\n derivationPath?: string;\n }) => CreateKeysForPathReturnType[T]\n> {\n const getNetwork = await getUtxoNetwork();\n\n switch (chain) {\n case Chain.BitcoinCash: {\n return function createKeysForPath({\n phrase,\n derivationPath = `${DerivationPath.BCH}/0`,\n wif,\n }: { wif?: string; phrase?: string; derivationPath?: string }) {\n const network = getNetwork(chain);\n\n if (wif) {\n return ECPair.fromWIF(wif, network) as BchECPair;\n }\n if (!phrase)\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", { error: \"No phrase provided\" });\n\n const masterHDNode = HDNode.fromSeedBuffer(\n Buffer.from(mnemonicToSeedSync(phrase)),\n network,\n );\n const keyPair = masterHDNode.derivePath(derivationPath).keyPair;\n\n return keyPair as BchECPair;\n } as (params: {\n wif?: string;\n phrase?: string;\n derivationPath?: string;\n }) => CreateKeysForPathReturnType[T];\n }\n case Chain.Bitcoin:\n case Chain.Dogecoin:\n case Chain.Litecoin:\n case Chain.Zcash:\n case Chain.Dash: {\n return function createKeysForPath({\n phrase,\n wif,\n derivationPath,\n }: { phrase?: string; wif?: string; derivationPath: string }) {\n if (!(wif || phrase))\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", {\n error: \"Either phrase or wif must be provided\",\n });\n\n const factory = ECPairFactory(secp256k1);\n const network = getNetwork(chain);\n\n if (wif) return factory.fromWIF(wif, network);\n\n const seed = mnemonicToSeedSync(phrase as string);\n const master = HDKey.fromMasterSeed(seed, network).derive(derivationPath);\n if (!master.privateKey)\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", {\n error: \"Could not get private key from phrase\",\n });\n\n return factory.fromPrivateKey(Buffer.from(master.privateKey), { network });\n } as (params: {\n wif?: string;\n phrase?: string;\n derivationPath?: string;\n }) => CreateKeysForPathReturnType[T];\n }\n default:\n throw new SwapKitError(\"toolbox_utxo_not_supported\", { chain });\n }\n}\n\nexport async function addressFromKeysGetter(chain: UTXOChain) {\n const getNetwork = await getUtxoNetwork();\n\n return function getAddressFromKeys(keys: ECPairInterface | BchECPair) {\n if (!keys)\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", { error: \"Keys must be provided\" });\n\n const method = nonSegwitChains.includes(chain) ? payments.p2pkh : payments.p2wpkh;\n const { address } = method({ pubkey: keys.publicKey as Buffer, network: getNetwork(chain) });\n if (!address)\n throw new SwapKitError(\"toolbox_utxo_invalid_address\", { error: \"Address not defined\" });\n\n return address;\n };\n}\n\nfunction transfer(signer?: ChainSigner<Psbt, Psbt>) {\n return async function transfer({\n memo,\n recipient,\n feeOptionKey,\n feeRate,\n assetValue,\n }: UTXOTransferParams) {\n const from = await signer?.getAddress();\n\n const chain = assetValue.chain as UTXOChain;\n\n if (!(signer && from)) throw new SwapKitError(\"toolbox_utxo_no_signer\");\n if (!recipient)\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", {\n error: \"Recipient address must be provided\",\n });\n const txFeeRate = feeRate || (await getFeeRates(chain))[feeOptionKey || FeeOption.Fast];\n\n const { psbt } = await createTransaction({\n recipient,\n feeRate: txFeeRate,\n sender: from,\n assetValue,\n memo,\n });\n const signedPsbt = await signer.signTransaction(psbt);\n signedPsbt.finalizeAllInputs(); // Finalise inputs\n // TX extracted and formatted to hex\n return getUtxoApi(chain).broadcastTx(signedPsbt.extractTransaction().toHex());\n };\n}\n\nasync function getFeeRates(chain: UTXOChain) {\n const suggestedFeeRate = await getUtxoApi(chain).getSuggestedTxFee();\n\n return {\n [FeeOption.Average]: suggestedFeeRate,\n [FeeOption.Fast]: applyFeeMultiplier(suggestedFeeRate, FeeOption.Fast),\n [FeeOption.Fastest]: applyFeeMultiplier(suggestedFeeRate, FeeOption.Fastest),\n };\n}\n\nasync function getInputsAndTargetOutputs({\n assetValue,\n recipient,\n memo,\n sender,\n fetchTxHex: fetchTxOverwrite = false,\n}: Omit<UTXOBuildTxParams, \"feeRate\">) {\n const chain = assetValue.chain as UTXOChain;\n\n const fetchTxHex = fetchTxOverwrite || nonSegwitChains.includes(chain);\n\n const inputs = await getUtxoApi(chain).scanUTXOs({ address: sender, fetchTxHex });\n\n //1. add output amount and recipient to targets\n //2. add output memo to targets (optional)\n\n return {\n inputs,\n outputs: [\n { address: recipient, value: Number(assetValue.bigIntValue) },\n ...(memo ? [{ address: \"\", script: await compileMemo(memo), value: 0 }] : []),\n ],\n };\n}\n",
12
12
  "import secp256k1 from \"@bitcoinerlab/secp256k1\";\nimport { HDKey } from \"@scure/bip32\";\nimport { mnemonicToSeedSync } from \"@scure/bip39\";\nimport {\n Chain,\n type ChainSigner,\n type DerivationPathArray,\n FeeOption,\n NetworkDerivationPath,\n SKConfig,\n SwapKitError,\n derivationPathToString,\n updateDerivationPath,\n} from \"@swapkit/helpers\";\nimport type { Psbt } from \"bitcoinjs-lib\";\nimport { hash160 } from \"bitcoinjs-lib/src/crypto\";\nimport bs58check from \"bs58check\";\nimport { ECPairFactory } from \"ecpair\";\nimport { P, match } from \"ts-pattern\";\nimport { getUtxoNetwork } from \"../helpers\";\nimport type { UTXOBuildTxParams, UTXOTransferParams } from \"../types\";\nimport { createUTXOToolbox } from \"./utxo\";\n\nconst chain = Chain.Zcash;\nconst network = getUtxoNetwork()(chain);\n\n/**\n * Custom Zcash address generation that handles 2-byte prefixes\n *\n * Zcash transparent addresses use 2-byte version prefixes, unlike Bitcoin's single byte.\n * This is incompatible with bitcoinjs-lib's payment methods which expect UInt8 values.\n *\n * @param publicKey - The public key buffer to generate address from\n * @param isTestnet - Whether to generate testnet or mainnet address\n * @returns A valid Zcash transparent address (t1... for mainnet, tm... for testnet)\n */\nfunction generateZcashAddress(publicKey: Buffer, isTestnet = false): string {\n // Hash the public key using RIPEMD160(SHA256(pubkey))\n const publicKeyHash = hash160(publicKey);\n\n // Zcash uses 2-byte prefixes for transparent addresses\n // These prefixes ensure addresses start with expected characters when base58 encoded\n const prefix = isTestnet\n ? Buffer.from([0x1c, 0xba]) // testnet prefix (results in tm... addresses)\n : Buffer.from([0x1c, 0xb8]); // mainnet prefix (results in t1... addresses)\n\n // Combine prefix + hash (22 bytes total: 2 byte prefix + 20 byte hash)\n const payload = Buffer.concat([prefix, publicKeyHash]);\n\n // Encode with base58check for final address\n return bs58check.encode(payload);\n}\n\nexport function validateZcashAddress(address: string) {\n try {\n // Shielded addresses are not supported\n if (address.startsWith(\"z\")) {\n console.warn(\n \"Shielded Zcash addresses (z-addresses) are not supported. Use transparent addresses (t1/t3) only.\",\n );\n return false;\n }\n\n const isMainnet = address.startsWith(\"t1\");\n const isTestnet = address.startsWith(\"t3\");\n\n if (!(isMainnet || isTestnet)) {\n return false;\n }\n\n // Verify network matches address type\n const { isStagenet } = SKConfig.get(\"envs\");\n if ((isMainnet && isStagenet) || (isTestnet && !isStagenet)) {\n return false;\n }\n\n return validateBase58Check(address, network);\n } catch {\n return false;\n }\n}\n\nfunction validateBase58Check(\n address: string,\n network: ReturnType<ReturnType<typeof getUtxoNetwork>>,\n) {\n try {\n const decoded = bs58check.decode(address);\n\n if (decoded.length < 21) {\n return false;\n }\n\n const version = decoded[0];\n return version === network.pubKeyHash || version === network.scriptHash;\n } catch {\n return false;\n }\n}\n\nconst ECPair = ECPairFactory(secp256k1);\n\ntype ZcashSigner = ChainSigner<Psbt, Psbt>;\n\nasync function createZcashSignerFromPhrase({\n phrase,\n derivationPathString,\n}: {\n phrase: string;\n derivationPathString: string;\n}) {\n const seed = mnemonicToSeedSync(phrase);\n const root = HDKey.fromMasterSeed(seed);\n\n const node = root.derive(derivationPathString);\n\n if (!node.privateKey) {\n throw new Error(\"Unable to derive private key\");\n }\n\n const keyPair = ECPair.fromPrivateKey(Buffer.from(node.privateKey), { network });\n\n const { isStagenet } = SKConfig.get(\"envs\");\n const address = generateZcashAddress(keyPair.publicKey, isStagenet);\n\n return {\n getAddress() {\n return Promise.resolve(address);\n },\n\n signTransaction(psbt: Psbt) {\n for (let i = 0; i < psbt.inputCount; i++) {\n psbt.signInput(i, keyPair);\n }\n return Promise.resolve(psbt);\n },\n };\n}\n\nexport async function createZcashToolbox(\n toolboxParams:\n | {\n signer?: ZcashSigner;\n }\n | {\n phrase?: string;\n derivationPath?: DerivationPathArray;\n index?: number;\n },\n) {\n const signer = await match(toolboxParams)\n .with({ signer: P.not(P.nullish) }, ({ signer }) => Promise.resolve(signer))\n .with({ phrase: P.string }, ({ phrase, derivationPath, index = 0 }) => {\n // Handle derivation path processing at toolbox level\n const baseDerivationPath = derivationPath ||\n NetworkDerivationPath[Chain.Zcash] || [44, 133, 0, 0, 0];\n const updatedDerivationPath = updateDerivationPath(baseDerivationPath, { index });\n const derivationPathString = derivationPathToString(updatedDerivationPath);\n\n return createZcashSignerFromPhrase({ phrase, derivationPathString });\n })\n .otherwise(() => Promise.resolve(undefined));\n\n const { getFeeRates, broadcastTx, ...toolbox } = await createUTXOToolbox({\n chain: Chain.Zcash,\n signer,\n });\n\n function getAddressFromKeys(keys: { getAddress: () => string }) {\n return keys.getAddress();\n }\n\n async function transfer({\n recipient,\n assetValue,\n feeOptionKey = FeeOption.Fast,\n ...rest\n }: UTXOTransferParams) {\n const from = await signer?.getAddress();\n if (!(signer && from)) throw new SwapKitError(\"toolbox_utxo_no_signer\");\n\n const feeRate = rest.feeRate || (await getFeeRates())[feeOptionKey];\n\n const buildTxParams: UTXOBuildTxParams = {\n ...rest,\n assetValue,\n feeRate,\n recipient,\n sender: from,\n };\n\n const { psbt } = await toolbox.createTransaction(buildTxParams);\n const signedPsbt = await signer.signTransaction(psbt);\n signedPsbt.finalizeAllInputs();\n const txHex = signedPsbt.extractTransaction().toHex();\n\n return broadcastTx(txHex);\n }\n\n return {\n ...toolbox,\n broadcastTx,\n getFeeRates,\n transfer,\n getAddressFromKeys,\n validateAddress: validateZcashAddress,\n };\n}\n"
13
13
  ],
14
- "mappings": "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",
15
- "debugId": "988C4CBF716921D464756E2164756E21",
14
+ "mappings": "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",
15
+ "debugId": "676D39E74BD3B40764756E2164756E21",
16
16
  "names": []
17
17
  }
@@ -1,6 +1,6 @@
1
- import{a as DX,b as AX}from"../../chunk-0h4xdrwz.js";import"../../chunk-s47y8512.js";import{Chain as E,SwapKitError as aZ}from"@swapkit/helpers";import{Transaction as xZ,TransactionBuilder as gZ,address as mZ}from"@psf/bitcoincashjs-lib";import{Chain as lZ,FeeOption as hZ,NetworkDerivationPath as cZ,SwapKitError as K,derivationPathToString as uZ,updateDerivationPath as pZ}from"@swapkit/helpers";import{Psbt as oZ}from"bitcoinjs-lib";import{Chain as Y,RequestClient as l,SKConfig as h,SwapKitError as N,warnOnce as UX}from"@swapkit/helpers";import{networks as xX}from"bitcoinjs-lib";import S from"coininfo";async function gX({chain:X,txHash:Z}){let G=h.get("rpcUrls")[X],J=JSON.stringify({jsonrpc:"2.0",method:"sendrawtransaction",params:[Z],id:DX()}),Q=await l.post(G,{headers:{"Content-Type":"application/json"},body:J});if(Q.error)throw new N("toolbox_utxo_broadcast_failed",{error:Q.error?.message});if(Q.result.includes('"code":-26'))throw new N("toolbox_utxo_invalid_transaction",{error:"Transaction amount was too low"});return Q.result}function a(X){return`https://api.blockchair.com/${mX(X)}`}function BX(X){switch(X){case Y.Bitcoin:return 5;case Y.Dogecoin:return 1e4;case Y.Litecoin:return 1;case Y.Zcash:return 1;default:return 2}}function mX(X){switch(X){case Y.BitcoinCash:return"bitcoin-cash";case Y.Litecoin:return"litecoin";case Y.Dash:return"dash";case Y.Dogecoin:return"dogecoin";case Y.Zcash:return"zcash";case Y.Polkadot:return"polkadot";default:return"bitcoin"}}async function lX(X){try{let{feePerKb:Z}=await l.get(`https://app.bitgo.com/api/v2/${X.toLowerCase()}/tx/fee`),G=Z/1000;return Math.max(G,BX(X))}catch(Z){return BX(X)}}async function s(X,Z){try{let G=await l.get(X);if(!G||G.context.code!==200)throw new N("toolbox_utxo_api_error",{error:`Failed to query ${X}`});return G.data}catch(G){if(!Z)throw G;let J=await l.get(`${X}${Z?`&key=${Z}`:""}`);if(!J||J.context.code!==200)throw new N("toolbox_utxo_api_error",{error:`Failed to query ${X}`});return J.data}}async function zX({address:X,chain:Z,apiKey:G}){if(!X)throw new N("toolbox_utxo_invalid_params",{error:"Address is required"});try{return(await s(`${a(Z)}/dashboards/address/${X}?transaction_details=true`,G))[X]}catch(J){return{utxo:[],address:{balance:0,transaction_count:0}}}}async function hX({address:X,chain:Z,apiKey:G}){return(await zX({address:X,chain:Z,apiKey:G}))?.address.balance||0}async function MX({chain:X,apiKey:Z,txHash:G}){if(!G)throw new N("toolbox_utxo_invalid_params",{error:"TxHash is required"});try{return(await s(`${a(X)}/raw/transaction/${G}`,Z))?.[G]?.raw_transaction||""}catch(J){return console.error("Failed to fetch raw transaction:",J),""}}async function cX({chain:X,address:Z,apiKey:G,offset:J=0,limit:Q=100}){return(await s(`${a(X)}/outputs?q=is_spent(false),recipient(${Z})&limit=${Q}&offset=${J}`,G)).filter(({is_spent:W})=>!W).map(({script_hex:W,block_id:q,transaction_hash:j,index:B,value:U,spending_signature_hex:D})=>({hash:j,index:B,value:U,txHex:D,script_hex:W,is_confirmed:q!==-1}))}async function TX({chain:X,address:Z,apiKey:G,offset:J=0,limit:Q=100}){if(!Z)throw new N("toolbox_utxo_invalid_params",{error:"Address is required"});try{let L=await cX({chain:X,address:Z,apiKey:G,offset:J,limit:Q});if(L.length<=Q)return L;let $=await TX({chain:X,address:Z,apiKey:G,offset:J+Q,limit:Q});return[...L,...$]}catch(L){return console.error("Failed to fetch unspent UTXOs:",L),[]}}async function uX({address:X,chain:Z,apiKey:G,fetchTxHex:J=!0}){let Q=await TX({chain:Z,address:X,apiKey:G}),L=[];for(let{hash:$,index:W,script_hex:q,value:j}of Q){let B;if(J)B=await MX({txHash:$,chain:Z,apiKey:G});L.push({address:X,hash:$,index:W,txHex:B,value:j,witnessUtxo:{value:j,script:Buffer.from(q,"hex")}})}return L}function pX(X){let Z=h.get("apiKeys").blockchair||"";return UX(!Z,"No Blockchair API key found. Functionality will be limited."),{broadcastTx:(G)=>gX({txHash:G,chain:X}),getRawTx:(G)=>MX({txHash:G,chain:X,apiKey:Z}),getSuggestedTxFee:()=>lX(X),getBalance:(G)=>hX({address:G,chain:X,apiKey:Z}),getAddressData:(G)=>zX({address:G,chain:X,apiKey:Z}),scanUTXOs:(G)=>uX({...G,chain:X,apiKey:Z})}}function ZG(X){return X}function _(X){let Z=h.get("apis")[X];if(Z)return UX(!0,"Using custom UTXO API. Be sure to implement all methods to avoid issues."),Z;return pX(X)}var oX={messagePrefix:`\x19Zcash Signed Message:
1
+ import{a as DX,b as AX}from"../../chunk-0h4xdrwz.js";import"../../chunk-s47y8512.js";import{Chain as E,SwapKitError as aZ}from"@swapkit/helpers";import{Transaction as xZ,TransactionBuilder as gZ,address as mZ}from"@psf/bitcoincashjs-lib";import{Chain as lZ,FeeOption as hZ,NetworkDerivationPath as cZ,SwapKitError as w,derivationPathToString as uZ,updateDerivationPath as pZ}from"@swapkit/helpers";import{Psbt as oZ}from"bitcoinjs-lib";import{Chain as Y,RequestClient as i,SKConfig as l,SwapKitError as y,warnOnce as UX}from"@swapkit/helpers";import{networks as xX}from"bitcoinjs-lib";import S from"coininfo";async function gX({chain:X,txHash:Z}){let G=l.get("rpcUrls")[X],J=JSON.stringify({jsonrpc:"2.0",method:"sendrawtransaction",params:[Z],id:DX()}),Q=await i.post(G,{headers:{"Content-Type":"application/json"},body:J});if(Q.error)throw new y("toolbox_utxo_broadcast_failed",{error:Q.error?.message});if(Q.result.includes('"code":-26'))throw new y("toolbox_utxo_invalid_transaction",{error:"Transaction amount was too low"});return Q.result}function a(X){return`https://api.blockchair.com/${mX(X)}`}function BX(X){switch(X){case Y.Bitcoin:return 5;case Y.Dogecoin:return 1e4;case Y.Litecoin:return 1;case Y.Zcash:return 1;default:return 2}}function mX(X){switch(X){case Y.BitcoinCash:return"bitcoin-cash";case Y.Litecoin:return"litecoin";case Y.Dash:return"dash";case Y.Dogecoin:return"dogecoin";case Y.Zcash:return"zcash";case Y.Polkadot:return"polkadot";default:return"bitcoin"}}async function lX(X){try{let{feePerKb:Z}=await i.get(`https://app.bitgo.com/api/v2/${X.toLowerCase()}/tx/fee`),G=Z/1000;return Math.max(G,BX(X))}catch(Z){return BX(X)}}async function s(X,Z){let G=await i.get(`${X}${Z?`${X.includes("?")?"&":"?"}key=${Z}`:""}`);if(!G||G.context.code!==200)throw new y("toolbox_utxo_api_error",{error:`Failed to query ${X}`});return G.data}async function zX({address:X,chain:Z,apiKey:G}){if(!X)throw new y("toolbox_utxo_invalid_params",{error:"Address is required"});try{return(await s(`${a(Z)}/dashboards/address/${X}?transaction_details=true`,G))[X]}catch(J){return{utxo:[],address:{balance:0,transaction_count:0}}}}async function hX({address:X,chain:Z,apiKey:G}){return(await zX({address:X,chain:Z,apiKey:G}))?.address.balance||0}async function MX({chain:X,apiKey:Z,txHash:G}){if(!G)throw new y("toolbox_utxo_invalid_params",{error:"TxHash is required"});try{return(await s(`${a(X)}/raw/transaction/${G}`,Z))?.[G]?.raw_transaction||""}catch(J){return console.error("Failed to fetch raw transaction:",J),""}}async function cX({chain:X,address:Z,apiKey:G,offset:J=0,limit:Q=100}){return(await s(`${a(X)}/outputs?q=is_spent(false),recipient(${Z})&limit=${Q}&offset=${J}`,G)).filter(({is_spent:L})=>!L).map(({script_hex:L,block_id:W,transaction_hash:j,index:B,value:U,spending_signature_hex:D})=>({hash:j,index:B,value:U,txHex:D,script_hex:L,is_confirmed:W!==-1}))}async function TX({chain:X,address:Z,apiKey:G,offset:J=0,limit:Q=100}){if(!Z)throw new y("toolbox_utxo_invalid_params",{error:"Address is required"});try{let q=await cX({chain:X,address:Z,apiKey:G,offset:J,limit:Q});if(q.length<=Q)return q;let $=await TX({chain:X,address:Z,apiKey:G,offset:J+Q,limit:Q});return[...q,...$]}catch(q){return console.error("Failed to fetch unspent UTXOs:",q),[]}}async function uX({address:X,chain:Z,apiKey:G,fetchTxHex:J=!0}){let Q=await TX({chain:Z,address:X,apiKey:G}),q=[];for(let{hash:$,index:L,script_hex:W,value:j}of Q){let B;if(J)B=await MX({txHash:$,chain:Z,apiKey:G});q.push({address:X,hash:$,index:L,txHex:B,value:j,witnessUtxo:{value:j,script:Buffer.from(W,"hex")}})}return q}function pX(X){let Z=l.get("apiKeys").blockchair||"";return UX(!Z,"No Blockchair API key found. Functionality will be limited."),{broadcastTx:(G)=>gX({txHash:G,chain:X}),getRawTx:(G)=>MX({txHash:G,chain:X,apiKey:Z}),getSuggestedTxFee:()=>lX(X),getBalance:(G)=>hX({address:G,chain:X,apiKey:Z}),getAddressData:(G)=>zX({address:G,chain:X,apiKey:Z}),scanUTXOs:(G)=>uX({...G,chain:X,apiKey:Z})}}function ZG(X){return X}function _(X){let Z=l.get("apis")[X];if(Z)return UX(!0,"Using custom UTXO API. Be sure to implement all methods to avoid issues."),Z;return pX(X)}var oX={messagePrefix:`\x19Zcash Signed Message:
2
2
  `,bech32:"zc",bip32:{public:76067358,private:76066276},pubKeyHash:28,scriptHash:28,wif:128},nX={messagePrefix:`\x19Zcash Signed Message:
3
- `,bech32:"ztestsapling",bip32:{public:70617039,private:70615956},pubKeyHash:29,scriptHash:28,wif:239};function C(){return function X(Z){switch(Z){case Y.Bitcoin:return xX.bitcoin;case Y.BitcoinCash:return S.bitcoincash.main.toBitcoinJS();case Y.Dash:return S.dash.main.toBitcoinJS();case Y.Litecoin:return S.litecoin.main.toBitcoinJS();case Y.Dogecoin:{let G={private:70615956,public:70617039},J=S.dogecoin.test;return J.versions.bip32=G,S.dogecoin.main.toBitcoinJS()}case Y.Zcash:{let{isStagenet:G}=h.get("envs");return G?nX:oX}default:throw new N("toolbox_utxo_not_supported",{chain:Z})}}}import{SwapKitError as R}from"@swapkit/helpers";import HX from"bs58check";import CX from"cashaddrjs";var vX;((G)=>{G.Mainnet="mainnet";G.Testnet="testnet"})(vX||={});var z={["legacy"]:{["mainnet"]:{["p2pkh"]:0,["p2sh"]:5},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}},["bitpay"]:{["mainnet"]:{["p2pkh"]:28,["p2sh"]:40},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}}};function IX(X){try{return u(X),!0}catch(Z){return!1}}function _X(X){return u(X)?.network}function x(X){let Z=u(X);if(Z?.format==="legacy")return X;return iX(Z)}function c(X){let Z=u(X);return aX(Z)}function u(X){try{return dX(X)}catch(Z){}try{return rX(X)}catch(Z){}throw new R("toolbox_utxo_invalid_address",{address:X})}function dX(X){try{let Z=HX.decode(X);if(Z.length!==21)throw new R("toolbox_utxo_invalid_address",{address:X});let G=Z[0],J=Array.prototype.slice.call(Z,1);switch(G){case z.legacy.mainnet.p2pkh:return{hash:J,format:"legacy",network:"mainnet",type:"p2pkh"};case z.legacy.mainnet.p2sh:return{hash:J,format:"legacy",network:"mainnet",type:"p2sh"};case z.legacy.testnet.p2pkh:return{hash:J,format:"legacy",network:"testnet",type:"p2pkh"};case z.legacy.testnet.p2sh:return{hash:J,format:"legacy",network:"testnet",type:"p2sh"};case z.bitpay.mainnet.p2pkh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2pkh"};case z.bitpay.mainnet.p2sh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2sh"};default:throw new R("toolbox_utxo_invalid_address",{address:X})}}catch(Z){throw new R("toolbox_utxo_invalid_address",{address:X})}}function rX(X){if(X.indexOf(":")!==-1)try{return YX(X)}catch(Z){}else{let Z=["bitcoincash","bchtest","bchreg"];for(let G of Z)try{return YX(`${G}:${X}`)}catch(J){}}throw new R("toolbox_utxo_invalid_address",{address:X})}function YX(X){try{let{hash:Z,prefix:G,type:J}=CX.decode(X);return{format:"cashaddr",hash:Array.prototype.slice.call(Z,0),network:G==="bitcoincash"?"mainnet":"testnet",type:J==="P2PKH"?"p2pkh":"p2sh"}}catch(Z){throw new R("toolbox_utxo_invalid_address",{address:X})}}function iX(X){let Z=z.legacy[X.network][X.type],G=Buffer.alloc(1+X.hash.length);return G[0]=Z,G.set(X.hash,1),HX.encode(G)}function aX(X){let Z=X.network==="mainnet"?"bitcoincash":"bchtest",G=X.type==="p2pkh"?"P2PKH":"P2SH",J=new Uint8Array(X.hash);return CX.encode(Z,G,J)}import{Chain as P,SwapKitError as sX}from"@swapkit/helpers";var t=(X)=>{switch(X){case P.Bitcoin:case P.BitcoinCash:return 550;case P.Dash:case P.Litecoin:return 5500;case P.Dogecoin:return 1e5;case P.Zcash:return 546;default:throw new sX("toolbox_utxo_not_supported",{chain:X})}},k=({inputs:X,outputs:Z,feeRate:G=1,chain:J=P.Bitcoin})=>{let Q=Math.ceil(G),L=X[0]&&"address"in X[0]&&X[0].address?o(X[0].address):"P2PKH",$=X.filter((D)=>V(D)*Q<=D.value),W=e+Z.reduce((D,T)=>D+p(T,L),0),q=Z.reduce((D,T)=>D+T.value,0),j=W*Q,B=0,U=[];for(let D of $){let T=V(D),M=Q*T;j+=M,B+=D.value,U.push(D);let H=j+q;if(B<H)continue;let O=B-H,WX=Q*p({address:"",value:0},L);if(O>WX){let qX=WX+j,jX=B-(q+qX);if(jX>Math.max(V({})*Q,t(J)))return{inputs:U,outputs:Z.concat({value:jX,address:""}),fee:qX}}return{inputs:U,outputs:Z,fee:j}}return{fee:Q*g({inputs:X,outputs:Z,feeRate:Q})}};import{SwapKitError as tX}from"@swapkit/helpers";import{opcodes as eX,script as XZ}from"bitcoinjs-lib";var UG=1000,e=10,ZZ=10,GZ=41,JZ=107;function A(X){let Z=Buffer.from(X,"utf8");return XZ.compile([eX.OP_RETURN,Z])}var XX;((G)=>{G.P2PKH="P2PKH";G.P2WPKH="P2WPKH"})(XX||={});var ZX={["P2PKH"]:148,["P2WPKH"]:68},n={["P2PKH"]:34,["P2WPKH"]:31},o=(X)=>{if(X.startsWith("bc1")||X.startsWith("ltc1"))return"P2WPKH";if(X.startsWith("1")||X.startsWith("3")||X.startsWith("L")||X.startsWith("M")||X.startsWith("X")||X.startsWith("D")||X.startsWith("bitcoincash:q")||X.startsWith("q"))return"P2PKH";throw new tX("toolbox_utxo_invalid_address",{address:X})},g=({inputs:X,outputs:Z,feeRate:G})=>{let J=X[0]&&"address"in X[0]&&X[0].address?o(X[0].address):"P2PKH",Q=X.filter(($)=>$.value>=ZX["type"in $?$.type:"P2PKH"]*Math.ceil(G)).reduce(($,W)=>$+V(W),0),L=Z?.reduce(($,W)=>$+p(W),0)||n[J];return e+Q+L},V=(X)=>{if("type"in X)return ZX[X.type];if("address"in X&&X.address)return ZX[o(X.address)];return GZ+JZ},p=(X,Z)=>{if(X?.script)return ZZ+X.script.length+(X.script.length>=74?2:1);if(Z)return n[Z];return n.P2PKH};import{AssetValue as $X,Chain as v,DerivationPath as IZ,FeeOption as y,NetworkDerivationPath as _Z,SwapKitError as F,SwapKitNumber as FZ,applyFeeMultiplier as PX,derivationPathToString as OZ,updateDerivationPath as NZ}from"@swapkit/helpers";import{Psbt as yZ,address as PZ,initEccLib as RX,payments as VX}from"bitcoinjs-lib";import{ECPairFactory as VZ}from"ecpair";import LX from"@bitcoinerlab/secp256k1";import{ECPair as kZ,HDNode as AZ}from"@psf/bitcoincashjs-lib";import{HDKey as RZ}from"@scure/bip32";import{mnemonicToSeedSync as kX}from"@scure/bip39";import QZ from"@bitcoinerlab/secp256k1";import{HDKey as $Z}from"@scure/bip32";import{mnemonicToSeedSync as LZ}from"@scure/bip39";import{Chain as JX,FeeOption as WZ,NetworkDerivationPath as qZ,SKConfig as FX,SwapKitError as jZ,derivationPathToString as BZ,updateDerivationPath as DZ}from"@swapkit/helpers";import{hash160 as UZ}from"bitcoinjs-lib/src/crypto";import OX from"bs58check";import{ECPairFactory as zZ}from"ecpair";import{P as GX,match as MZ}from"ts-pattern";var TZ=JX.Zcash,NX=C()(TZ);function YZ(X,Z=!1){let G=UZ(X),J=Z?Buffer.from([28,186]):Buffer.from([28,184]),Q=Buffer.concat([J,G]);return OX.encode(Q)}function QX(X){try{if(X.startsWith("z"))return console.warn("Shielded Zcash addresses (z-addresses) are not supported. Use transparent addresses (t1/t3) only."),!1;let Z=X.startsWith("t1"),G=X.startsWith("t3");if(!(Z||G))return!1;let{isStagenet:J}=FX.get("envs");if(Z&&J||G&&!J)return!1;return HZ(X,NX)}catch{return!1}}function HZ(X,Z){try{let G=OX.decode(X);if(G.length<21)return!1;let J=G[0];return J===Z.pubKeyHash||J===Z.scriptHash}catch{return!1}}var CZ=zZ(QZ);async function vZ({phrase:X,derivationPathString:Z}){let G=LZ(X),Q=$Z.fromMasterSeed(G).derive(Z);if(!Q.privateKey)throw new Error("Unable to derive private key");let L=CZ.fromPrivateKey(Buffer.from(Q.privateKey),{network:NX}),{isStagenet:$}=FX.get("envs"),W=YZ(L.publicKey,$);return{getAddress(){return Promise.resolve(W)},signTransaction(q){for(let j=0;j<q.inputCount;j++)q.signInput(j,L);return Promise.resolve(q)}}}async function yX(X){let Z=await MZ(X).with({signer:GX.not(GX.nullish)},({signer:W})=>Promise.resolve(W)).with({phrase:GX.string},({phrase:W,derivationPath:q,index:j=0})=>{let B=q||qZ[JX.Zcash]||[44,133,0,0,0],U=DZ(B,{index:j}),D=BZ(U);return vZ({phrase:W,derivationPathString:D})}).otherwise(()=>Promise.resolve(void 0)),{getFeeRates:G,broadcastTx:J,...Q}=await b({chain:JX.Zcash,signer:Z});function L(W){return W.getAddress()}async function $({recipient:W,assetValue:q,feeOptionKey:j=WZ.Fast,...B}){let U=await Z?.getAddress();if(!(Z&&U))throw new jZ("toolbox_utxo_no_signer");let D=B.feeRate||(await G())[j],T={...B,assetValue:q,feeRate:D,recipient:W,sender:U},{psbt:M}=await Q.createTransaction(T),H=await Z.signTransaction(M);H.finalizeAllInputs();let O=H.extractTransaction().toHex();return J(O)}return{...Q,broadcastTx:J,getFeeRates:G,transfer:$,getAddressFromKeys:L,validateAddress:QX}}var d=[v.Dash,v.Dogecoin];function bZ({inputs:X,outputs:Z,chain:G,psbt:J,sender:Q,compiledMemo:L}){for(let $ of X){let W=!!$.witnessUtxo&&!d.includes(G)&&{witnessUtxo:$.witnessUtxo},q=d.includes(G)&&{nonWitnessUtxo:$.txHex?Buffer.from($.txHex,"hex"):void 0};J.addInput({hash:$.hash,index:$.index,...W,...q})}for(let $ of Z){let W="address"in $&&$.address?$.address:Q,q=$.script;if(q&&!L)continue;let j=q?{script:L,value:0}:{address:W,value:$.value};RX(LX),J.addOutput(j)}return{psbt:J,inputs:X}}async function bX({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q,fetchTxHex:L=!1}){let $=X.chain,W=G?await A(G):null,q=await fX({assetValue:X,recipient:Z,memo:G,sender:Q,fetchTxHex:L}),{inputs:j,outputs:B}=k({...q,feeRate:J,chain:$});if(!(j&&B))throw new F("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let U=await C(),D=new yZ({network:U($)});if($===v.Dogecoin)D.setMaximumFeeRate(650000000);let{psbt:T,inputs:M}=await bZ({inputs:j,outputs:B,chain:$,psbt:D,sender:Q,compiledMemo:W});return{psbt:T,utxos:q.inputs,inputs:M}}async function wZ(){let X=await C();return function Z({address:G,chain:J}){if(J===v.BitcoinCash)return w(G);if(J===v.Zcash)return QX(G);try{return RX(LX),PZ.toOutputScript(G,X(J)),!0}catch(Q){return!1}}}async function KZ({chain:X,phrase:Z,derivationPath:G}){let J=(await r(X))({phrase:Z,derivationPath:G});async function Q($){return await $.signAllInputs(J),$}async function L(){return(await KX(X))(J)}return{getAddress:L,signTransaction:Q}}async function b({chain:X,...Z}){let G="phrase"in Z?Z.phrase:void 0,J="index"in Z?Z.index||0:0,Q=OZ("derivationPath"in Z&&Z.derivationPath?Z.derivationPath:NZ(_Z[X],{index:J})),L=G?await KZ({chain:X,phrase:G,derivationPath:Q}):("signer"in Z)?Z.signer:void 0;function $(){return Promise.resolve(L?.getAddress())}let W=await KX(X),q=await wZ(),j=await r(X);return{accumulative:k,calculateTxSize:g,getAddressFromKeys:W,getAddress:$,validateAddress:(B)=>q({address:B,chain:X}),broadcastTx:(B)=>_(X).broadcastTx(B),createTransaction:bX,createKeysForPath:j,getFeeRates:()=>i(X),getInputsOutputsFee:wX,transfer:SZ(L),getPrivateKeyFromMnemonic:(B)=>{return j(B).toWIF()},getBalance:AX(X),estimateTransactionFee:EZ(X),estimateMaxSendableAmount:fZ(X)}}async function wX({assetValue:X,feeOptionKey:Z=y.Fast,feeRate:G,memo:J,sender:Q,recipient:L}){let $=X.chain,W=await fX({assetValue:X,sender:Q,memo:J,recipient:L}),q=G?Math.floor(G):(await i($))[Z];return k({...W,feeRate:q,chain:$})}function fZ(X){return async function Z({from:G,memo:J,feeRate:Q,feeOptionKey:L=y.Fast,recipients:$=1}){let W=await _(X).getAddressData(G),q=Q?Math.ceil(Q):(await i(X))[L],j=W?.utxo.map((M)=>({...M,type:"P2PKH",hash:""})).filter((M)=>M.value>Math.max(t(X),V(M)*q));if(!j?.length)return $X.from({chain:X});let B=$X.from({chain:X,value:j.reduce((M,H)=>M+H.value,0)}),U=typeof $==="number"?Array.from({length:$},()=>({address:G,value:0})):$;if(J){let M=await A(J);U.push({address:G,script:M,value:0})}let T=g({inputs:j,outputs:U,feeRate:q})*q;return B.sub(T)}}function EZ(X){return async(Z)=>{let G=await wX(Z);return $X.from({chain:X,value:FZ.fromBigInt(BigInt(G.fee),8).getValue("string")})}}async function r(X){let Z=await C();switch(X){case v.BitcoinCash:return function G({phrase:J,derivationPath:Q=`${IZ.BCH}/0`,wif:L}){let $=Z(X);if(L)return kZ.fromWIF(L,$);if(!J)throw new F("toolbox_utxo_invalid_params",{error:"No phrase provided"});return AZ.fromSeedBuffer(Buffer.from(kX(J)),$).derivePath(Q).keyPair};case v.Bitcoin:case v.Dogecoin:case v.Litecoin:case v.Zcash:case v.Dash:return function G({phrase:J,wif:Q,derivationPath:L}){if(!(Q||J))throw new F("toolbox_utxo_invalid_params",{error:"Either phrase or wif must be provided"});let $=VZ(LX),W=Z(X);if(Q)return $.fromWIF(Q,W);let q=kX(J),j=RZ.fromMasterSeed(q,W).derive(L);if(!j.privateKey)throw new F("toolbox_utxo_invalid_params",{error:"Could not get private key from phrase"});return $.fromPrivateKey(Buffer.from(j.privateKey),{network:W})};default:throw new F("toolbox_utxo_not_supported",{chain:X})}}async function KX(X){let Z=await C();return function G(J){if(!J)throw new F("toolbox_utxo_invalid_params",{error:"Keys must be provided"});let Q=d.includes(X)?VX.p2pkh:VX.p2wpkh,{address:L}=Q({pubkey:J.publicKey,network:Z(X)});if(!L)throw new F("toolbox_utxo_invalid_address",{error:"Address not defined"});return L}}function SZ(X){return async function Z({memo:G,recipient:J,feeOptionKey:Q,feeRate:L,assetValue:$}){let W=await X?.getAddress(),q=$.chain;if(!(X&&W))throw new F("toolbox_utxo_no_signer");if(!J)throw new F("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let j=L||(await i(q))[Q||y.Fast],{psbt:B}=await bX({recipient:J,feeRate:j,sender:W,assetValue:$,memo:G}),U=await X.signTransaction(B);return U.finalizeAllInputs(),_(q).broadcastTx(U.extractTransaction().toHex())}}async function i(X){let Z=await _(X).getSuggestedTxFee();return{[y.Average]:Z,[y.Fast]:PX(Z,y.Fast),[y.Fastest]:PX(Z,y.Fastest)}}async function fX({assetValue:X,recipient:Z,memo:G,sender:J,fetchTxHex:Q=!1}){let L=X.chain,$=Q||d.includes(L);return{inputs:await _(L).scanUTXOs({address:J,fetchTxHex:$}),outputs:[{address:Z,value:Number(X.bigIntValue)},...G?[{address:"",script:await A(G),value:0}]:[]]}}var I=lZ.BitcoinCash;function m(X){return X.replace(/(bchtest:|bitcoincash:)/,"")}function w(X){let Z=m(X);return IX(Z)&&_X(Z)==="mainnet"}function f(X){return m(c(X))}async function nZ(X){async function Z({builder:J,utxos:Q}){return Q.forEach((L,$)=>{J.sign($,X,void 0,65,L.witnessUtxo?.value)}),J.build()}return{getAddress:()=>{let J=X.getAddress(0);return Promise.resolve(f(J))},signTransaction:Z}}async function EX(X){let Z="phrase"in X?X.phrase:void 0,G="index"in X?X.index||0:0,J=uZ("derivationPath"in X&&X.derivationPath?X.derivationPath:pZ(cZ[I],{index:G})),Q=(await r(I))({phrase:Z,derivationPath:J}),L=Q?await nZ(Q):("signer"in X)?X.signer:void 0;function $(){return Promise.resolve(L?.getAddress())}let{getBalance:W,getFeeRates:q,broadcastTx:j,...B}=await b({chain:I});function U(D,T=!0){return W(m(c(D)))}return{...B,getAddress:$,broadcastTx:j,createTransaction:SX,buildTx:rZ,getAddressFromKeys:iZ,getBalance:U,getFeeRates:q,stripPrefix:m,stripToCashAddress:f,validateAddress:w,transfer:dZ({getFeeRates:q,broadcastTx:j,signer:L})}}async function SX({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q}){if(!w(Z))throw new K("toolbox_utxo_invalid_address",{address:Z});let L=await _(I).scanUTXOs({address:f(Q),fetchTxHex:!0}),$=G?await A(G):null,W=[];W.push({address:Z,value:X.getBaseValue("number")});let{inputs:q,outputs:j}=k({inputs:L,outputs:W,feeRate:J,chain:I});if(!(q&&j))throw new K("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let B=await C(),U=new gZ(B(I));await Promise.all(q.map(async(D)=>{let T=await _(I).getRawTx(D.hash);U.addInput(xZ.fromBuffer(Buffer.from(T,"hex")),D.index)}));for(let D of j){let T="address"in D&&D.address?D.address:x(Q),M=await C(),H=mZ.toOutputScript(x(T),M(I));U.addOutput(H,D.value)}if($)U.addOutput($,0);return{builder:U,utxos:q}}function dZ({broadcastTx:X,getFeeRates:Z,signer:G}){return async function J({recipient:Q,assetValue:L,feeOptionKey:$=hZ.Fast,...W}){let q=await G?.getAddress();if(!(G&&q))throw new K("toolbox_utxo_no_signer");if(!Q)throw new K("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let j=W.feeRate||(await Z())[$],{builder:B,utxos:U}=await SX({...W,assetValue:L,feeRate:j,recipient:Q,sender:q}),T=(await G.signTransaction({builder:B,utxos:U})).toHex();return X(T)}}async function rZ({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q}){let L=c(Z);if(!w(L))throw new K("toolbox_utxo_invalid_address",{address:L});let $=await _(I).scanUTXOs({address:f(Q),fetchTxHex:!0}),W=Number(J.toFixed(0)),q=G?await A(G):null,j=[];if(j.push({address:x(Z),value:X.getBaseValue("number")}),q)j.push({script:q,value:0});let{inputs:B,outputs:U}=k({inputs:$,outputs:j,feeRate:W,chain:I});if(!(B&&U))throw new K("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let D=await C(),T=new oZ({network:D(I)});for(let{hash:M,index:H,witnessUtxo:O}of B)T.addInput({hash:M,index:H,witnessUtxo:O});for(let M of U){let H="address"in M&&M.address?M.address:x(Q),O=M.script?q?{script:q,value:0}:void 0:{address:H,value:M.value};if(O)T.addOutput(O)}return{psbt:T,utxos:$,inputs:B}}function iZ(X){let Z=X.getAddress(0);return f(Z)}async function tG(X,Z){switch(X){case E.BitcoinCash:return await EX(Z);case E.Zcash:return await yX(Z);case E.Bitcoin:case E.Dogecoin:case E.Litecoin:case E.Dash:return await b({chain:X,...Z});default:throw new aZ("toolbox_utxo_not_supported",{chain:X})}}export{QX as validateZcashAddress,x as toLegacyAddress,c as toCashAddress,f as stripToCashAddress,m as stripPrefix,d as nonSegwitChains,IX as isValidAddress,tG as getUtxoToolbox,C as getUtxoNetwork,_ as getUtxoApi,wZ as getUTXOAddressValidator,o as getScriptTypeForAddress,p as getOutputSize,V as getInputSize,t as getDustThreshold,r as getCreateKeysForPath,_X as detectAddressNetwork,yX as createZcashToolbox,b as createUTXOToolbox,ZG as createCustomUtxoApi,EX as createBCHToolbox,A as compileMemo,g as calculateTxSize,w as bchValidateAddress,KX as addressFromKeysGetter,k as accumulative,vX as UtxoNetwork,XX as UTXOScriptType,e as TX_OVERHEAD,n as OutputSizes,ZZ as OP_RETURN_OVERHEAD,UG as MIN_TX_FEE,ZX as InputSizes};
3
+ `,bech32:"ztestsapling",bip32:{public:70617039,private:70615956},pubKeyHash:29,scriptHash:28,wif:239};function C(){return function X(Z){switch(Z){case Y.Bitcoin:return xX.bitcoin;case Y.BitcoinCash:return S.bitcoincash.main.toBitcoinJS();case Y.Dash:return S.dash.main.toBitcoinJS();case Y.Litecoin:return S.litecoin.main.toBitcoinJS();case Y.Dogecoin:{let G={private:70615956,public:70617039},J=S.dogecoin.test;return J.versions.bip32=G,S.dogecoin.main.toBitcoinJS()}case Y.Zcash:{let{isStagenet:G}=l.get("envs");return G?nX:oX}default:throw new y("toolbox_utxo_not_supported",{chain:Z})}}}import{SwapKitError as R}from"@swapkit/helpers";import HX from"bs58check";import CX from"cashaddrjs";var vX;((G)=>{G.Mainnet="mainnet";G.Testnet="testnet"})(vX||={});var z={["legacy"]:{["mainnet"]:{["p2pkh"]:0,["p2sh"]:5},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}},["bitpay"]:{["mainnet"]:{["p2pkh"]:28,["p2sh"]:40},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}}};function IX(X){try{return c(X),!0}catch(Z){return!1}}function _X(X){return c(X)?.network}function x(X){let Z=c(X);if(Z?.format==="legacy")return X;return iX(Z)}function h(X){let Z=c(X);return aX(Z)}function c(X){try{return dX(X)}catch(Z){}try{return rX(X)}catch(Z){}throw new R("toolbox_utxo_invalid_address",{address:X})}function dX(X){try{let Z=HX.decode(X);if(Z.length!==21)throw new R("toolbox_utxo_invalid_address",{address:X});let G=Z[0],J=Array.prototype.slice.call(Z,1);switch(G){case z.legacy.mainnet.p2pkh:return{hash:J,format:"legacy",network:"mainnet",type:"p2pkh"};case z.legacy.mainnet.p2sh:return{hash:J,format:"legacy",network:"mainnet",type:"p2sh"};case z.legacy.testnet.p2pkh:return{hash:J,format:"legacy",network:"testnet",type:"p2pkh"};case z.legacy.testnet.p2sh:return{hash:J,format:"legacy",network:"testnet",type:"p2sh"};case z.bitpay.mainnet.p2pkh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2pkh"};case z.bitpay.mainnet.p2sh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2sh"};default:throw new R("toolbox_utxo_invalid_address",{address:X})}}catch(Z){throw new R("toolbox_utxo_invalid_address",{address:X})}}function rX(X){if(X.indexOf(":")!==-1)try{return YX(X)}catch(Z){}else{let Z=["bitcoincash","bchtest","bchreg"];for(let G of Z)try{return YX(`${G}:${X}`)}catch(J){}}throw new R("toolbox_utxo_invalid_address",{address:X})}function YX(X){try{let{hash:Z,prefix:G,type:J}=CX.decode(X);return{format:"cashaddr",hash:Array.prototype.slice.call(Z,0),network:G==="bitcoincash"?"mainnet":"testnet",type:J==="P2PKH"?"p2pkh":"p2sh"}}catch(Z){throw new R("toolbox_utxo_invalid_address",{address:X})}}function iX(X){let Z=z.legacy[X.network][X.type],G=Buffer.alloc(1+X.hash.length);return G[0]=Z,G.set(X.hash,1),HX.encode(G)}function aX(X){let Z=X.network==="mainnet"?"bitcoincash":"bchtest",G=X.type==="p2pkh"?"P2PKH":"P2SH",J=new Uint8Array(X.hash);return CX.encode(Z,G,J)}import{Chain as P,SwapKitError as sX}from"@swapkit/helpers";var t=(X)=>{switch(X){case P.Bitcoin:case P.BitcoinCash:return 550;case P.Dash:case P.Litecoin:return 5500;case P.Dogecoin:return 1e5;case P.Zcash:return 546;default:throw new sX("toolbox_utxo_not_supported",{chain:X})}},k=({inputs:X,outputs:Z,feeRate:G=1,chain:J=P.Bitcoin})=>{let Q=Math.ceil(G),q=X[0]&&"address"in X[0]&&X[0].address?p(X[0].address):"P2PKH",$=X.filter((D)=>V(D)*Q<=D.value),L=e+Z.reduce((D,T)=>D+u(T,q),0),W=Z.reduce((D,T)=>D+T.value,0),j=L*Q,B=0,U=[];for(let D of $){let T=V(D),M=Q*T;j+=M,B+=D.value,U.push(D);let H=j+W;if(B<H)continue;let O=B-H,LX=Q*u({address:"",value:0},q);if(O>LX){let WX=LX+j,jX=B-(W+WX);if(jX>Math.max(V({})*Q,t(J)))return{inputs:U,outputs:Z.concat({value:jX,address:""}),fee:WX}}return{inputs:U,outputs:Z,fee:j}}return{fee:Q*g({inputs:X,outputs:Z,feeRate:Q})}};import{SwapKitError as tX}from"@swapkit/helpers";import{opcodes as eX,script as XZ}from"bitcoinjs-lib";var UG=1000,e=10,ZZ=10,GZ=41,JZ=107;function A(X){let Z=Buffer.from(X,"utf8");return XZ.compile([eX.OP_RETURN,Z])}var XX;((G)=>{G.P2PKH="P2PKH";G.P2WPKH="P2WPKH"})(XX||={});var ZX={["P2PKH"]:148,["P2WPKH"]:68},o={["P2PKH"]:34,["P2WPKH"]:31},p=(X)=>{if(X.startsWith("bc1")||X.startsWith("ltc1"))return"P2WPKH";if(X.startsWith("1")||X.startsWith("3")||X.startsWith("L")||X.startsWith("M")||X.startsWith("X")||X.startsWith("D")||X.startsWith("bitcoincash:q")||X.startsWith("q"))return"P2PKH";throw new tX("toolbox_utxo_invalid_address",{address:X})},g=({inputs:X,outputs:Z,feeRate:G})=>{let J=X[0]&&"address"in X[0]&&X[0].address?p(X[0].address):"P2PKH",Q=X.filter(($)=>$.value>=ZX["type"in $?$.type:"P2PKH"]*Math.ceil(G)).reduce(($,L)=>$+V(L),0),q=Z?.reduce(($,L)=>$+u(L),0)||o[J];return e+Q+q},V=(X)=>{if("type"in X)return ZX[X.type];if("address"in X&&X.address)return ZX[p(X.address)];return GZ+JZ},u=(X,Z)=>{if(X?.script)return ZZ+X.script.length+(X.script.length>=74?2:1);if(Z)return o[Z];return o.P2PKH};import{AssetValue as $X,Chain as v,DerivationPath as IZ,FeeOption as N,NetworkDerivationPath as _Z,SwapKitError as F,SwapKitNumber as FZ,applyFeeMultiplier as PX,derivationPathToString as OZ,updateDerivationPath as NZ}from"@swapkit/helpers";import{Psbt as yZ,address as PZ,initEccLib as RX,payments as VX}from"bitcoinjs-lib";import{ECPairFactory as VZ}from"ecpair";import qX from"@bitcoinerlab/secp256k1";import{ECPair as kZ,HDNode as AZ}from"@psf/bitcoincashjs-lib";import{HDKey as RZ}from"@scure/bip32";import{mnemonicToSeedSync as kX}from"@scure/bip39";import QZ from"@bitcoinerlab/secp256k1";import{HDKey as $Z}from"@scure/bip32";import{mnemonicToSeedSync as qZ}from"@scure/bip39";import{Chain as JX,FeeOption as LZ,NetworkDerivationPath as WZ,SKConfig as FX,SwapKitError as jZ,derivationPathToString as BZ,updateDerivationPath as DZ}from"@swapkit/helpers";import{hash160 as UZ}from"bitcoinjs-lib/src/crypto";import OX from"bs58check";import{ECPairFactory as zZ}from"ecpair";import{P as GX,match as MZ}from"ts-pattern";var TZ=JX.Zcash,NX=C()(TZ);function YZ(X,Z=!1){let G=UZ(X),J=Z?Buffer.from([28,186]):Buffer.from([28,184]),Q=Buffer.concat([J,G]);return OX.encode(Q)}function QX(X){try{if(X.startsWith("z"))return console.warn("Shielded Zcash addresses (z-addresses) are not supported. Use transparent addresses (t1/t3) only."),!1;let Z=X.startsWith("t1"),G=X.startsWith("t3");if(!(Z||G))return!1;let{isStagenet:J}=FX.get("envs");if(Z&&J||G&&!J)return!1;return HZ(X,NX)}catch{return!1}}function HZ(X,Z){try{let G=OX.decode(X);if(G.length<21)return!1;let J=G[0];return J===Z.pubKeyHash||J===Z.scriptHash}catch{return!1}}var CZ=zZ(QZ);async function vZ({phrase:X,derivationPathString:Z}){let G=qZ(X),Q=$Z.fromMasterSeed(G).derive(Z);if(!Q.privateKey)throw new Error("Unable to derive private key");let q=CZ.fromPrivateKey(Buffer.from(Q.privateKey),{network:NX}),{isStagenet:$}=FX.get("envs"),L=YZ(q.publicKey,$);return{getAddress(){return Promise.resolve(L)},signTransaction(W){for(let j=0;j<W.inputCount;j++)W.signInput(j,q);return Promise.resolve(W)}}}async function yX(X){let Z=await MZ(X).with({signer:GX.not(GX.nullish)},({signer:L})=>Promise.resolve(L)).with({phrase:GX.string},({phrase:L,derivationPath:W,index:j=0})=>{let B=W||WZ[JX.Zcash]||[44,133,0,0,0],U=DZ(B,{index:j}),D=BZ(U);return vZ({phrase:L,derivationPathString:D})}).otherwise(()=>Promise.resolve(void 0)),{getFeeRates:G,broadcastTx:J,...Q}=await b({chain:JX.Zcash,signer:Z});function q(L){return L.getAddress()}async function $({recipient:L,assetValue:W,feeOptionKey:j=LZ.Fast,...B}){let U=await Z?.getAddress();if(!(Z&&U))throw new jZ("toolbox_utxo_no_signer");let D=B.feeRate||(await G())[j],T={...B,assetValue:W,feeRate:D,recipient:L,sender:U},{psbt:M}=await Q.createTransaction(T),H=await Z.signTransaction(M);H.finalizeAllInputs();let O=H.extractTransaction().toHex();return J(O)}return{...Q,broadcastTx:J,getFeeRates:G,transfer:$,getAddressFromKeys:q,validateAddress:QX}}var n=[v.Dash,v.Dogecoin];function bZ({inputs:X,outputs:Z,chain:G,psbt:J,sender:Q,compiledMemo:q}){for(let $ of X){let L=!!$.witnessUtxo&&!n.includes(G)&&{witnessUtxo:$.witnessUtxo},W=n.includes(G)&&{nonWitnessUtxo:$.txHex?Buffer.from($.txHex,"hex"):void 0};J.addInput({hash:$.hash,index:$.index,...L,...W})}for(let $ of Z){let L="address"in $&&$.address?$.address:Q,W=$.script;if(W&&!q)continue;let j=W?{script:q,value:0}:{address:L,value:$.value};RX(qX),J.addOutput(j)}return{psbt:J,inputs:X}}async function bX({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q,fetchTxHex:q=!1}){let $=X.chain,L=G?await A(G):null,W=await fX({assetValue:X,recipient:Z,memo:G,sender:Q,fetchTxHex:q}),{inputs:j,outputs:B}=k({...W,feeRate:J,chain:$});if(!(j&&B))throw new F("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let U=await C(),D=new yZ({network:U($)});if($===v.Dogecoin)D.setMaximumFeeRate(650000000);let{psbt:T,inputs:M}=await bZ({inputs:j,outputs:B,chain:$,psbt:D,sender:Q,compiledMemo:L});return{psbt:T,utxos:W.inputs,inputs:M}}async function KZ(){let X=await C();return function Z({address:G,chain:J}){if(J===v.BitcoinCash)return K(G);if(J===v.Zcash)return QX(G);try{return RX(qX),PZ.toOutputScript(G,X(J)),!0}catch(Q){return!1}}}async function wZ({chain:X,phrase:Z,derivationPath:G}){let J=(await d(X))({phrase:Z,derivationPath:G});async function Q($){return await $.signAllInputs(J),$}async function q(){return(await wX(X))(J)}return{getAddress:q,signTransaction:Q}}async function b({chain:X,...Z}){let G="phrase"in Z?Z.phrase:void 0,J="index"in Z?Z.index||0:0,Q=OZ("derivationPath"in Z&&Z.derivationPath?Z.derivationPath:NZ(_Z[X],{index:J})),q=G?await wZ({chain:X,phrase:G,derivationPath:Q}):("signer"in Z)?Z.signer:void 0;function $(){return Promise.resolve(q?.getAddress())}let L=await wX(X),W=await KZ(),j=await d(X);return{accumulative:k,calculateTxSize:g,getAddressFromKeys:L,getAddress:$,validateAddress:(B)=>W({address:B,chain:X}),broadcastTx:(B)=>_(X).broadcastTx(B),createTransaction:bX,createKeysForPath:j,getFeeRates:()=>r(X),getInputsOutputsFee:KX,transfer:SZ(q),getPrivateKeyFromMnemonic:(B)=>{return j(B).toWIF()},getBalance:AX(X),estimateTransactionFee:EZ(X),estimateMaxSendableAmount:fZ(X)}}async function KX({assetValue:X,feeOptionKey:Z=N.Fast,feeRate:G,memo:J,sender:Q,recipient:q}){let $=X.chain,L=await fX({assetValue:X,sender:Q,memo:J,recipient:q}),W=G?Math.floor(G):(await r($))[Z];return k({...L,feeRate:W,chain:$})}function fZ(X){return async function Z({from:G,memo:J,feeRate:Q,feeOptionKey:q=N.Fast,recipients:$=1}){let L=await _(X).getAddressData(G),W=Q?Math.ceil(Q):(await r(X))[q],j=L?.utxo.map((M)=>({...M,type:"P2PKH",hash:""})).filter((M)=>M.value>Math.max(t(X),V(M)*W));if(!j?.length)return $X.from({chain:X});let B=$X.from({chain:X,value:j.reduce((M,H)=>M+H.value,0)}),U=typeof $==="number"?Array.from({length:$},()=>({address:G,value:0})):$;if(J){let M=await A(J);U.push({address:G,script:M,value:0})}let T=g({inputs:j,outputs:U,feeRate:W})*W;return B.sub(T)}}function EZ(X){return async(Z)=>{let G=await KX(Z);return $X.from({chain:X,value:FZ.fromBigInt(BigInt(G.fee),8).getValue("string")})}}async function d(X){let Z=await C();switch(X){case v.BitcoinCash:return function G({phrase:J,derivationPath:Q=`${IZ.BCH}/0`,wif:q}){let $=Z(X);if(q)return kZ.fromWIF(q,$);if(!J)throw new F("toolbox_utxo_invalid_params",{error:"No phrase provided"});return AZ.fromSeedBuffer(Buffer.from(kX(J)),$).derivePath(Q).keyPair};case v.Bitcoin:case v.Dogecoin:case v.Litecoin:case v.Zcash:case v.Dash:return function G({phrase:J,wif:Q,derivationPath:q}){if(!(Q||J))throw new F("toolbox_utxo_invalid_params",{error:"Either phrase or wif must be provided"});let $=VZ(qX),L=Z(X);if(Q)return $.fromWIF(Q,L);let W=kX(J),j=RZ.fromMasterSeed(W,L).derive(q);if(!j.privateKey)throw new F("toolbox_utxo_invalid_params",{error:"Could not get private key from phrase"});return $.fromPrivateKey(Buffer.from(j.privateKey),{network:L})};default:throw new F("toolbox_utxo_not_supported",{chain:X})}}async function wX(X){let Z=await C();return function G(J){if(!J)throw new F("toolbox_utxo_invalid_params",{error:"Keys must be provided"});let Q=n.includes(X)?VX.p2pkh:VX.p2wpkh,{address:q}=Q({pubkey:J.publicKey,network:Z(X)});if(!q)throw new F("toolbox_utxo_invalid_address",{error:"Address not defined"});return q}}function SZ(X){return async function Z({memo:G,recipient:J,feeOptionKey:Q,feeRate:q,assetValue:$}){let L=await X?.getAddress(),W=$.chain;if(!(X&&L))throw new F("toolbox_utxo_no_signer");if(!J)throw new F("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let j=q||(await r(W))[Q||N.Fast],{psbt:B}=await bX({recipient:J,feeRate:j,sender:L,assetValue:$,memo:G}),U=await X.signTransaction(B);return U.finalizeAllInputs(),_(W).broadcastTx(U.extractTransaction().toHex())}}async function r(X){let Z=await _(X).getSuggestedTxFee();return{[N.Average]:Z,[N.Fast]:PX(Z,N.Fast),[N.Fastest]:PX(Z,N.Fastest)}}async function fX({assetValue:X,recipient:Z,memo:G,sender:J,fetchTxHex:Q=!1}){let q=X.chain,$=Q||n.includes(q);return{inputs:await _(q).scanUTXOs({address:J,fetchTxHex:$}),outputs:[{address:Z,value:Number(X.bigIntValue)},...G?[{address:"",script:await A(G),value:0}]:[]]}}var I=lZ.BitcoinCash;function m(X){return X.replace(/(bchtest:|bitcoincash:)/,"")}function K(X){let Z=m(X);return IX(Z)&&_X(Z)==="mainnet"}function f(X){return m(h(X))}async function nZ(X){async function Z({builder:J,utxos:Q}){return Q.forEach((q,$)=>{J.sign($,X,void 0,65,q.witnessUtxo?.value)}),J.build()}return{getAddress:()=>{let J=X.getAddress(0);return Promise.resolve(f(J))},signTransaction:Z}}async function EX(X){let Z="phrase"in X?X.phrase:void 0,G="index"in X?X.index||0:0,J=uZ("derivationPath"in X&&X.derivationPath?X.derivationPath:pZ(cZ[I],{index:G})),Q=(await d(I))({phrase:Z,derivationPath:J}),q=Q?await nZ(Q):("signer"in X)?X.signer:void 0;function $(){return Promise.resolve(q?.getAddress())}let{getBalance:L,getFeeRates:W,broadcastTx:j,...B}=await b({chain:I});function U(D,T=!0){return L(m(h(D)))}return{...B,getAddress:$,broadcastTx:j,createTransaction:SX,buildTx:rZ,getAddressFromKeys:iZ,getBalance:U,getFeeRates:W,stripPrefix:m,stripToCashAddress:f,validateAddress:K,transfer:dZ({getFeeRates:W,broadcastTx:j,signer:q})}}async function SX({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q}){if(!K(Z))throw new w("toolbox_utxo_invalid_address",{address:Z});let q=await _(I).scanUTXOs({address:f(Q),fetchTxHex:!0}),$=G?await A(G):null,L=[];L.push({address:Z,value:X.getBaseValue("number")});let{inputs:W,outputs:j}=k({inputs:q,outputs:L,feeRate:J,chain:I});if(!(W&&j))throw new w("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let B=await C(),U=new gZ(B(I));await Promise.all(W.map(async(D)=>{let T=await _(I).getRawTx(D.hash);U.addInput(xZ.fromBuffer(Buffer.from(T,"hex")),D.index)}));for(let D of j){let T="address"in D&&D.address?D.address:x(Q),M=await C(),H=mZ.toOutputScript(x(T),M(I));U.addOutput(H,D.value)}if($)U.addOutput($,0);return{builder:U,utxos:W}}function dZ({broadcastTx:X,getFeeRates:Z,signer:G}){return async function J({recipient:Q,assetValue:q,feeOptionKey:$=hZ.Fast,...L}){let W=await G?.getAddress();if(!(G&&W))throw new w("toolbox_utxo_no_signer");if(!Q)throw new w("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let j=L.feeRate||(await Z())[$],{builder:B,utxos:U}=await SX({...L,assetValue:q,feeRate:j,recipient:Q,sender:W}),T=(await G.signTransaction({builder:B,utxos:U})).toHex();return X(T)}}async function rZ({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q}){let q=h(Z);if(!K(q))throw new w("toolbox_utxo_invalid_address",{address:q});let $=await _(I).scanUTXOs({address:f(Q),fetchTxHex:!0}),L=Number(J.toFixed(0)),W=G?await A(G):null,j=[];if(j.push({address:x(Z),value:X.getBaseValue("number")}),W)j.push({script:W,value:0});let{inputs:B,outputs:U}=k({inputs:$,outputs:j,feeRate:L,chain:I});if(!(B&&U))throw new w("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let D=await C(),T=new oZ({network:D(I)});for(let{hash:M,index:H,witnessUtxo:O}of B)T.addInput({hash:M,index:H,witnessUtxo:O});for(let M of U){let H="address"in M&&M.address?M.address:x(Q),O=M.script?W?{script:W,value:0}:void 0:{address:H,value:M.value};if(O)T.addOutput(O)}return{psbt:T,utxos:$,inputs:B}}function iZ(X){let Z=X.getAddress(0);return f(Z)}async function tG(X,Z){switch(X){case E.BitcoinCash:return await EX(Z);case E.Zcash:return await yX(Z);case E.Bitcoin:case E.Dogecoin:case E.Litecoin:case E.Dash:return await b({chain:X,...Z});default:throw new aZ("toolbox_utxo_not_supported",{chain:X})}}export{QX as validateZcashAddress,x as toLegacyAddress,h as toCashAddress,f as stripToCashAddress,m as stripPrefix,n as nonSegwitChains,IX as isValidAddress,tG as getUtxoToolbox,C as getUtxoNetwork,_ as getUtxoApi,KZ as getUTXOAddressValidator,p as getScriptTypeForAddress,u as getOutputSize,V as getInputSize,t as getDustThreshold,d as getCreateKeysForPath,_X as detectAddressNetwork,yX as createZcashToolbox,b as createUTXOToolbox,ZG as createCustomUtxoApi,EX as createBCHToolbox,A as compileMemo,g as calculateTxSize,K as bchValidateAddress,wX as addressFromKeysGetter,k as accumulative,vX as UtxoNetwork,XX as UTXOScriptType,e as TX_OVERHEAD,o as OutputSizes,ZZ as OP_RETURN_OVERHEAD,UG as MIN_TX_FEE,ZX as InputSizes};
4
4
 
5
- //# debugId=57E42E1F305AB10A64756E2164756E21
5
+ //# debugId=547CB235D14B555D64756E2164756E21
6
6
  //# sourceMappingURL=index.js.map
@@ -4,14 +4,14 @@
4
4
  "sourcesContent": [
5
5
  "import {\n Chain,\n type ChainSigner,\n type DerivationPathArray,\n SwapKitError,\n type UTXOChain,\n} from \"@swapkit/helpers\";\nimport type { Psbt } from \"bitcoinjs-lib\";\n\nimport type { TransactionBuilderType, TransactionType, UTXOType } from \"../types\";\nimport { createBCHToolbox } from \"./bitcoinCash\";\nimport { createUTXOToolbox } from \"./utxo\";\nimport { createZcashToolbox } from \"./zcash\";\n\ntype BCHToolbox = Awaited<ReturnType<typeof createBCHToolbox>>;\ntype CommonUTXOToolbox = Awaited<\n ReturnType<typeof createUTXOToolbox<Exclude<UTXOChain, Chain.BitcoinCash | Chain.Zcash>>>\n>;\ntype ZcashToolbox = Awaited<ReturnType<typeof createZcashToolbox>>;\n\nexport type UTXOToolboxes = {\n [Chain.BitcoinCash]: BCHToolbox;\n [Chain.Bitcoin]: CommonUTXOToolbox;\n [Chain.Dogecoin]: CommonUTXOToolbox;\n [Chain.Litecoin]: CommonUTXOToolbox;\n [Chain.Dash]: CommonUTXOToolbox;\n [Chain.Zcash]: ZcashToolbox;\n};\n\nexport type UTXOWallets = {\n [key in keyof UTXOToolboxes]: UTXOToolboxes[key];\n};\n\nexport type UtxoToolboxParams = {\n [Chain.BitcoinCash]: {\n signer: ChainSigner<{ builder: TransactionBuilderType; utxos: UTXOType[] }, TransactionType>;\n };\n [Chain.Bitcoin]: { signer: ChainSigner<Psbt, Psbt> };\n [Chain.Dogecoin]: { signer: ChainSigner<Psbt, Psbt> };\n [Chain.Litecoin]: { signer: ChainSigner<Psbt, Psbt> };\n [Chain.Dash]: { signer: ChainSigner<Psbt, Psbt> };\n [Chain.Zcash]: {\n signer?: ChainSigner<Psbt, Psbt>;\n };\n};\n\nexport async function getUtxoToolbox<T extends keyof UTXOToolboxes>(\n chain: T,\n params?:\n | UtxoToolboxParams[T]\n | {\n phrase?: string;\n derivationPath?: DerivationPathArray;\n index?: number;\n },\n): Promise<UTXOToolboxes[T]> {\n switch (chain) {\n case Chain.BitcoinCash: {\n const toolbox = await createBCHToolbox(params as UtxoToolboxParams[Chain.BitcoinCash]);\n return toolbox as UTXOToolboxes[T];\n }\n\n case Chain.Zcash: {\n const toolbox = await createZcashToolbox(params as UtxoToolboxParams[Chain.Zcash]);\n return toolbox as UTXOToolboxes[T];\n }\n\n case Chain.Bitcoin:\n case Chain.Dogecoin:\n case Chain.Litecoin:\n case Chain.Dash: {\n const toolbox = await createUTXOToolbox({\n chain,\n ...(params as UtxoToolboxParams[Exclude<T, Chain.BitcoinCash | Chain.Zcash>]),\n });\n return toolbox as UTXOToolboxes[Exclude<T, Chain.BitcoinCash | Chain.Zcash>];\n }\n\n default:\n throw new SwapKitError(\"toolbox_utxo_not_supported\", { chain });\n }\n}\n\nexport {\n stripToCashAddress,\n stripPrefix,\n bchValidateAddress,\n} from \"./bitcoinCash\";\n",
6
6
  "import {\n Transaction,\n TransactionBuilder,\n address as bchAddress,\n // @ts-ignore\n} from \"@psf/bitcoincashjs-lib\";\nimport {\n Chain,\n type ChainSigner,\n type DerivationPathArray,\n FeeOption,\n NetworkDerivationPath,\n SwapKitError,\n derivationPathToString,\n updateDerivationPath,\n} from \"@swapkit/helpers\";\nimport { Psbt } from \"bitcoinjs-lib\";\nimport type { UtxoToolboxParams } from \".\";\nimport {\n accumulative,\n UtxoNetwork as bchNetwork,\n compileMemo,\n detectAddressNetwork,\n getUtxoApi,\n getUtxoNetwork,\n isValidAddress,\n toCashAddress,\n toLegacyAddress,\n} from \"../helpers\";\nimport type {\n BchECPair,\n TargetOutput,\n TransactionBuilderType,\n TransactionType,\n UTXOBuildTxParams,\n UTXOTransferParams,\n UTXOType,\n} from \"../types\";\nimport { createUTXOToolbox, getCreateKeysForPath } from \"./utxo\";\n\nconst chain = Chain.BitcoinCash;\n\nexport function stripPrefix(address: string) {\n return address.replace(/(bchtest:|bitcoincash:)/, \"\");\n}\n\nexport function bchValidateAddress(address: string) {\n const strippedAddress = stripPrefix(address);\n return (\n isValidAddress(strippedAddress) && detectAddressNetwork(strippedAddress) === bchNetwork.Mainnet\n );\n}\n\nexport function stripToCashAddress(address: string) {\n return stripPrefix(toCashAddress(address));\n}\n\nasync function createSignerWithKeys(keys: BchECPair) {\n async function signTransaction({\n builder,\n utxos,\n }: { builder: TransactionBuilderType; utxos: UTXOType[] }) {\n utxos.forEach((utxo, index) => {\n builder.sign(index, keys, undefined, 0x41, utxo.witnessUtxo?.value);\n });\n\n return builder.build();\n }\n\n const getAddress = () => {\n const address = keys.getAddress(0);\n return Promise.resolve(stripToCashAddress(address));\n };\n\n return {\n getAddress,\n signTransaction,\n };\n}\n\nexport async function createBCHToolbox<T extends Chain.BitcoinCash>(\n toolboxParams:\n | UtxoToolboxParams[T]\n | {\n phrase?: string;\n derivationPath?: DerivationPathArray;\n index?: number;\n },\n) {\n const phrase = \"phrase\" in toolboxParams ? toolboxParams.phrase : undefined;\n\n const index = \"index\" in toolboxParams ? toolboxParams.index || 0 : 0;\n\n const derivationPath = derivationPathToString(\n \"derivationPath\" in toolboxParams && toolboxParams.derivationPath\n ? toolboxParams.derivationPath\n : updateDerivationPath(NetworkDerivationPath[chain], { index }),\n );\n\n const keys = (await getCreateKeysForPath(chain))({ phrase, derivationPath });\n\n const signer = keys\n ? await createSignerWithKeys(keys)\n : \"signer\" in toolboxParams\n ? toolboxParams.signer\n : undefined;\n\n function getAddress() {\n return Promise.resolve(signer?.getAddress());\n }\n\n const { getBalance, getFeeRates, broadcastTx, ...toolbox } = await createUTXOToolbox({ chain });\n\n function handleGetBalance(address: string, _scamFilter = true) {\n return getBalance(stripPrefix(toCashAddress(address)));\n }\n\n return {\n ...toolbox,\n getAddress,\n broadcastTx,\n createTransaction,\n buildTx,\n getAddressFromKeys,\n getBalance: handleGetBalance,\n getFeeRates,\n stripPrefix,\n stripToCashAddress,\n validateAddress: bchValidateAddress,\n transfer: transfer({ getFeeRates, broadcastTx, signer }),\n };\n}\n\nasync function createTransaction({\n assetValue,\n recipient,\n memo,\n feeRate,\n sender,\n}: UTXOBuildTxParams) {\n if (!bchValidateAddress(recipient))\n throw new SwapKitError(\"toolbox_utxo_invalid_address\", { address: recipient });\n const utxos = await getUtxoApi(chain).scanUTXOs({\n address: stripToCashAddress(sender),\n fetchTxHex: true,\n });\n\n const compiledMemo = memo ? await compileMemo(memo) : null;\n\n const targetOutputs: TargetOutput[] = [];\n // output to recipient\n targetOutputs.push({\n address: recipient,\n value: assetValue.getBaseValue(\"number\"),\n });\n const { inputs, outputs } = accumulative({\n inputs: utxos,\n outputs: targetOutputs,\n feeRate,\n chain,\n });\n\n // .inputs and .outputs will be undefined if no solution was found\n if (!(inputs && outputs))\n throw new SwapKitError(\"toolbox_utxo_insufficient_balance\", { sender, assetValue });\n const getNetwork = await getUtxoNetwork();\n const builder = new TransactionBuilder(getNetwork(chain)) as TransactionBuilderType;\n\n await Promise.all(\n inputs.map(async (utxo: UTXOType) => {\n const txHex = await getUtxoApi(chain).getRawTx(utxo.hash);\n\n builder.addInput(Transaction.fromBuffer(Buffer.from(txHex, \"hex\")), utxo.index);\n }),\n );\n\n for (const output of outputs) {\n const address =\n \"address\" in output && output.address ? output.address : toLegacyAddress(sender);\n const getNetwork = await getUtxoNetwork();\n const outputScript = bchAddress.toOutputScript(toLegacyAddress(address), getNetwork(chain));\n\n builder.addOutput(outputScript, output.value);\n }\n\n // add output for memo\n if (compiledMemo) {\n builder.addOutput(compiledMemo, 0); // Add OP_RETURN {script, value}\n }\n\n return { builder, utxos: inputs };\n}\n\nfunction transfer({\n broadcastTx,\n getFeeRates,\n signer,\n}: {\n broadcastTx: (txHash: string) => Promise<string>;\n getFeeRates: () => Promise<Record<FeeOption, number>>;\n signer?: ChainSigner<{ builder: TransactionBuilderType; utxos: UTXOType[] }, TransactionType>;\n}) {\n return async function transfer({\n recipient,\n assetValue,\n feeOptionKey = FeeOption.Fast,\n ...rest\n }: UTXOTransferParams) {\n const from = await signer?.getAddress();\n if (!(signer && from)) throw new SwapKitError(\"toolbox_utxo_no_signer\");\n if (!recipient)\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", {\n error: \"Recipient address must be provided\",\n });\n\n const feeRate = rest.feeRate || (await getFeeRates())[feeOptionKey];\n\n // try out if psbt tx is faster/better/nicer\n const { builder, utxos } = await createTransaction({\n ...rest,\n assetValue,\n feeRate,\n recipient,\n sender: from,\n });\n\n const tx = await signer.signTransaction({ builder, utxos });\n const txHex = tx.toHex();\n\n return broadcastTx(txHex);\n };\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO: refactor\nasync function buildTx({ assetValue, recipient, memo, feeRate, sender }: UTXOBuildTxParams) {\n const recipientCashAddress = toCashAddress(recipient);\n if (!bchValidateAddress(recipientCashAddress))\n throw new SwapKitError(\"toolbox_utxo_invalid_address\", { address: recipientCashAddress });\n\n const utxos = await getUtxoApi(chain).scanUTXOs({\n address: stripToCashAddress(sender),\n fetchTxHex: true,\n });\n\n const feeRateWhole = Number(feeRate.toFixed(0));\n const compiledMemo = memo ? await compileMemo(memo) : null;\n\n const targetOutputs = [] as TargetOutput[];\n\n // output to recipient\n targetOutputs.push({\n address: toLegacyAddress(recipient),\n value: assetValue.getBaseValue(\"number\"),\n });\n\n //2. add output memo to targets (optional)\n if (compiledMemo) {\n targetOutputs.push({ script: compiledMemo, value: 0 });\n }\n\n const { inputs, outputs } = accumulative({\n inputs: utxos,\n outputs: targetOutputs,\n feeRate: feeRateWhole,\n chain,\n });\n\n // .inputs and .outputs will be undefined if no solution was found\n if (!(inputs && outputs))\n throw new SwapKitError(\"toolbox_utxo_insufficient_balance\", { sender, assetValue });\n const getNetwork = await getUtxoNetwork();\n const psbt = new Psbt({ network: getNetwork(chain) }); // Network-specific\n\n for (const { hash, index, witnessUtxo } of inputs) {\n psbt.addInput({ hash, index, witnessUtxo });\n }\n\n // Outputs\n for (const output of outputs) {\n const address =\n \"address\" in output && output.address ? output.address : toLegacyAddress(sender);\n const params = output.script\n ? compiledMemo\n ? { script: compiledMemo, value: 0 }\n : undefined\n : { address, value: output.value };\n\n if (params) {\n psbt.addOutput(params);\n }\n }\n\n return { psbt, utxos, inputs: inputs as UTXOType[] };\n}\n\nfunction getAddressFromKeys(keys: { getAddress: (index?: number) => string }) {\n const address = keys.getAddress(0);\n return stripToCashAddress(address);\n}\n",
7
- "import {\n Chain,\n RequestClient,\n SKConfig,\n SwapKitError,\n type UTXOChain,\n warnOnce,\n} from \"@swapkit/helpers\";\nimport { networks } from \"bitcoinjs-lib\";\nimport { uniqid } from \"../../utils\";\n\n// @ts-ignore\nimport coininfo from \"coininfo\";\n\ntype BlockchairParams<T> = T & { chain: Chain; apiKey?: string };\ntype BlockchairFetchUnspentUtxoParams = BlockchairParams<{\n offset?: number;\n limit?: number;\n address: string;\n}>;\n\nasync function broadcastUTXOTx({ chain, txHash }: { chain: Chain; txHash: string }) {\n const rpcUrl = SKConfig.get(\"rpcUrls\")[chain];\n const body = JSON.stringify({\n jsonrpc: \"2.0\",\n method: \"sendrawtransaction\",\n params: [txHash],\n id: uniqid(),\n });\n\n const response = await RequestClient.post<{\n id: string;\n result: string;\n error: { message: string; code?: number } | null;\n }>(rpcUrl, { headers: { \"Content-Type\": \"application/json\" }, body });\n\n if (response.error) {\n throw new SwapKitError(\"toolbox_utxo_broadcast_failed\", { error: response.error?.message });\n }\n\n if (response.result.includes('\"code\":-26')) {\n throw new SwapKitError(\"toolbox_utxo_invalid_transaction\", {\n error: \"Transaction amount was too low\",\n });\n }\n\n return response.result;\n}\n\nfunction baseUrl(chain: Chain) {\n return `https://api.blockchair.com/${mapChainToBlockchairChain(chain)}`;\n}\n\nfunction getDefaultTxFeeByChain(chain: Chain) {\n switch (chain) {\n case Chain.Bitcoin:\n return 5;\n case Chain.Dogecoin:\n return 10000;\n case Chain.Litecoin:\n return 1;\n case Chain.Zcash:\n return 1;\n default:\n return 2;\n }\n}\n\nfunction mapChainToBlockchairChain(chain: Chain) {\n switch (chain) {\n case Chain.BitcoinCash:\n return \"bitcoin-cash\";\n case Chain.Litecoin:\n return \"litecoin\";\n case Chain.Dash:\n return \"dash\";\n case Chain.Dogecoin:\n return \"dogecoin\";\n case Chain.Zcash:\n return \"zcash\";\n case Chain.Polkadot:\n return \"polkadot\";\n default:\n return \"bitcoin\";\n }\n}\n\nasync function getSuggestedTxFee(chain: Chain) {\n try {\n //Use Bitgo API for fee estimation\n //Refer: https://app.bitgo.com/docs/#operation/v2.tx.getfeeestimate\n const { feePerKb } = await RequestClient.get<{\n feePerKb: number;\n cpfpFeePerKb: number;\n numBlocks: number;\n feeByBlockTarget: { 1: number; 3: number };\n }>(`https://app.bitgo.com/api/v2/${chain.toLowerCase()}/tx/fee`);\n const suggestedFee = feePerKb / 1000;\n\n return Math.max(suggestedFee, getDefaultTxFeeByChain(chain));\n } catch (_error) {\n return getDefaultTxFeeByChain(chain);\n }\n}\n\nasync function blockchairRequest<T>(url: string, apiKey?: string): Promise<T> {\n try {\n const response = await RequestClient.get<BlockchairResponse<T>>(url);\n if (!response || response.context.code !== 200)\n throw new SwapKitError(\"toolbox_utxo_api_error\", { error: `Failed to query ${url}` });\n\n return response.data as T;\n } catch (error) {\n if (!apiKey) throw error;\n const response = await RequestClient.get<BlockchairResponse<T>>(\n `${url}${apiKey ? `&key=${apiKey}` : \"\"}`,\n );\n\n if (!response || response.context.code !== 200)\n throw new SwapKitError(\"toolbox_utxo_api_error\", { error: `Failed to query ${url}` });\n\n return response.data as T;\n }\n}\n\nasync function getAddressData({ address, chain, apiKey }: BlockchairParams<{ address?: string }>) {\n if (!address)\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", { error: \"Address is required\" });\n\n try {\n const response = await blockchairRequest<BlockchairAddressResponse>(\n `${baseUrl(chain)}/dashboards/address/${address}?transaction_details=true`,\n apiKey,\n );\n\n return response[address];\n } catch (_error) {\n return { utxo: [], address: { balance: 0, transaction_count: 0 } };\n }\n}\n\nasync function getUnconfirmedBalance({\n address,\n chain,\n apiKey,\n}: BlockchairParams<{ address?: string }>) {\n const response = await getAddressData({ address, chain, apiKey });\n\n return response?.address.balance || 0;\n}\n\nasync function getRawTx({ chain, apiKey, txHash }: BlockchairParams<{ txHash?: string }>) {\n if (!txHash)\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", { error: \"TxHash is required\" });\n\n try {\n const rawTxResponse = await blockchairRequest<BlockchairRawTransactionResponse>(\n `${baseUrl(chain)}/raw/transaction/${txHash}`,\n apiKey,\n );\n return rawTxResponse?.[txHash]?.raw_transaction || \"\";\n } catch (error) {\n console.error(\"Failed to fetch raw transaction:\", error);\n return \"\";\n }\n}\n\nasync function fetchUnspentUtxoBatch({\n chain,\n address,\n apiKey,\n offset = 0,\n limit = 100,\n}: BlockchairFetchUnspentUtxoParams) {\n const response = await blockchairRequest<BlockchairOutputsResponse[]>(\n `${baseUrl(chain)}/outputs?q=is_spent(false),recipient(${address})&limit=${limit}&offset=${offset}`,\n apiKey,\n );\n\n const txs = response\n .filter(({ is_spent }) => !is_spent)\n .map(({ script_hex, block_id, transaction_hash, index, value, spending_signature_hex }) => ({\n hash: transaction_hash,\n index,\n value,\n txHex: spending_signature_hex,\n script_hex,\n is_confirmed: block_id !== -1,\n }));\n\n return txs;\n}\n\nasync function getUnspentUtxos({\n chain,\n address,\n apiKey,\n offset = 0,\n limit = 100,\n}: BlockchairFetchUnspentUtxoParams): Promise<Awaited<ReturnType<typeof fetchUnspentUtxoBatch>>> {\n if (!address)\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", { error: \"Address is required\" });\n\n try {\n const txs = await fetchUnspentUtxoBatch({ chain, address, apiKey, offset, limit });\n\n if (txs.length <= limit) return txs;\n\n const nextBatch = await getUnspentUtxos({\n chain,\n address,\n apiKey,\n offset: offset + limit,\n limit,\n });\n\n return [...txs, ...nextBatch];\n } catch (error) {\n console.error(\"Failed to fetch unspent UTXOs:\", error);\n return [];\n }\n}\n\nasync function scanUTXOs({\n address,\n chain,\n apiKey,\n fetchTxHex = true,\n}: BlockchairParams<{ address: string; fetchTxHex?: boolean }>) {\n const utxos = await getUnspentUtxos({ chain, address, apiKey });\n const results = [];\n\n for (const { hash, index, script_hex, value } of utxos) {\n let txHex: string | undefined;\n if (fetchTxHex) {\n txHex = await getRawTx({ txHash: hash, chain, apiKey });\n }\n results.push({\n address,\n hash,\n index,\n txHex,\n value,\n witnessUtxo: { value, script: Buffer.from(script_hex, \"hex\") },\n });\n }\n return results;\n}\n\nfunction utxoApi(chain: UTXOChain) {\n const apiKey = SKConfig.get(\"apiKeys\").blockchair || \"\";\n\n warnOnce(!apiKey, \"No Blockchair API key found. Functionality will be limited.\");\n\n return {\n broadcastTx: (txHash: string) => broadcastUTXOTx({ txHash, chain }),\n getRawTx: (txHash: string) => getRawTx({ txHash, chain, apiKey }),\n getSuggestedTxFee: () => getSuggestedTxFee(chain),\n getBalance: (address: string) => getUnconfirmedBalance({ address, chain, apiKey }),\n getAddressData: (address: string) => getAddressData({ address, chain, apiKey }),\n scanUTXOs: (params: { address: string; fetchTxHex?: boolean }) =>\n scanUTXOs({ ...params, chain, apiKey }),\n };\n}\n\n/**\n * \"Factory\" to ensure typing for custom UTXO APIs\n */\nexport function createCustomUtxoApi(methods: ReturnType<typeof utxoApi>) {\n return methods;\n}\n\nexport function getUtxoApi(chain: UTXOChain) {\n const customUtxoApi = SKConfig.get(\"apis\")[chain];\n\n if (customUtxoApi) {\n warnOnce(true, \"Using custom UTXO API. Be sure to implement all methods to avoid issues.\");\n return customUtxoApi as ReturnType<typeof utxoApi>;\n }\n\n return utxoApi(chain);\n}\n\n// Define Zcash network objects that match ECPair's expected interface\nconst ZCASH_MAINNET = {\n messagePrefix: \"\\x19Zcash Signed Message:\\n\",\n bech32: \"zc\",\n bip32: {\n public: 0x0488b21e,\n private: 0x0488ade4,\n },\n pubKeyHash: 0x1c, // 28 in decimal - correct for Zcash mainnet\n scriptHash: 0x1c, // 28 in decimal\n wif: 0x80, // 128 in decimal\n};\n\nconst ZCASH_TESTNET = {\n messagePrefix: \"\\x19Zcash Signed Message:\\n\",\n bech32: \"ztestsapling\",\n bip32: {\n public: 0x043587cf,\n private: 0x04358394,\n },\n pubKeyHash: 0x1d, // 29 in decimal - correct for Zcash testnet\n scriptHash: 0x1c, // 28 in decimal\n wif: 0xef, // 239 in decimal\n};\n\nexport function getUtxoNetwork() {\n return function getNetwork(chain: Chain) {\n switch (chain) {\n case Chain.Bitcoin:\n return networks.bitcoin;\n case Chain.BitcoinCash:\n return coininfo.bitcoincash.main.toBitcoinJS();\n case Chain.Dash:\n return coininfo.dash.main.toBitcoinJS();\n case Chain.Litecoin:\n return coininfo.litecoin.main.toBitcoinJS();\n\n case Chain.Dogecoin: {\n const bip32 = { private: 0x04358394, public: 0x043587cf };\n const test = coininfo.dogecoin.test;\n test.versions.bip32 = bip32;\n return coininfo.dogecoin.main.toBitcoinJS();\n }\n\n case Chain.Zcash: {\n // Get Zcash network configuration using our custom objects\n const { isStagenet } = SKConfig.get(\"envs\");\n return isStagenet ? ZCASH_TESTNET : ZCASH_MAINNET;\n }\n\n default:\n throw new SwapKitError(\"toolbox_utxo_not_supported\", { chain });\n }\n };\n}\n\ninterface BlockchairVin {\n txid: string;\n vout: number;\n scriptSig: {\n asm: string;\n hex: string;\n };\n sequence: number;\n}\n\ninterface BlockchairVout {\n value: number;\n n: number;\n scriptPubKey: {\n asm: string;\n hex: string;\n address: string;\n type: string;\n addresses: string[];\n reqSigs: number;\n };\n}\n\ninterface BlockchairTransaction {\n block_id: number;\n hash: string;\n time: string;\n balance_change: number;\n}\n\ninterface BlockchairUtxo {\n block_id: number;\n transaction_hash: string;\n index: number;\n value: number;\n}\n\ninterface BlockchairAddressCoreData {\n type: string;\n script_hex: string;\n balance: number;\n balance_usd: number;\n received: number;\n received_usd: number;\n spent: number;\n spent_usd: number;\n output_count: number;\n unspent_output_count: number;\n first_seen_receiving: string;\n last_seen_receiving: string;\n first_seen_spending: null | string;\n last_seen_spending: null | string;\n transaction_count: number;\n scripthash_type: null | string;\n}\n\ninterface BlockchairInputOutputCommonData {\n block_id: number;\n transaction_id: number;\n index: number;\n transaction_hash: string;\n date: string;\n time: string;\n value: number;\n value_usd: number;\n recipient: string;\n type: string;\n script_hex: string;\n is_from_coinbase: boolean;\n is_spendable: boolean | null;\n is_spent: boolean;\n lifespan: number | null;\n cdd: number | null;\n}\n\ninterface BlockchairSpendingBlockData {\n spending_block_id: number | null;\n spending_transaction_id: number | null;\n spending_index: number | null;\n spending_transaction_hash: string | null;\n spending_date: string | null;\n spending_time: string | null;\n spending_value_usd: number | null;\n spending_sequence: number | null;\n spending_signature_hex: string | null;\n spending_witness: string | null;\n}\n\ninterface BlockchairAddressResponse {\n [key: string]: {\n address: BlockchairAddressCoreData;\n transactions: BlockchairTransaction[];\n utxo: BlockchairUtxo[];\n };\n}\n\ninterface BlockchairOutputsResponse\n extends BlockchairSpendingBlockData,\n BlockchairInputOutputCommonData {}\n\ninterface BlockchairRawTransactionResponse {\n [key: string]: {\n raw_transaction: string;\n decoded_raw_transaction: {\n txid: string;\n hash: string;\n version: number;\n size: number;\n vsize: number;\n weight: number;\n locktime: number;\n vin: BlockchairVin[];\n vout: BlockchairVout[];\n };\n };\n}\n\ninterface BlockchairResponse<T> {\n data: T;\n context: {\n code: number;\n source: string;\n results: number;\n state: number;\n market_price_usd: number;\n cache: {\n live: boolean;\n duration: number;\n since: string;\n until: string;\n time: any;\n };\n api: {\n version: string;\n last_major_update: string;\n next_major_update: null | string;\n documentation: string;\n notice: string;\n };\n servers: string;\n time: number;\n render_time: number;\n full_time: number;\n request_cost: number;\n };\n}\n",
7
+ "import {\n Chain,\n RequestClient,\n SKConfig,\n SwapKitError,\n type UTXOChain,\n warnOnce,\n} from \"@swapkit/helpers\";\nimport { networks } from \"bitcoinjs-lib\";\nimport { uniqid } from \"../../utils\";\n\n// @ts-ignore\nimport coininfo from \"coininfo\";\n\ntype BlockchairParams<T> = T & { chain: Chain; apiKey?: string };\ntype BlockchairFetchUnspentUtxoParams = BlockchairParams<{\n offset?: number;\n limit?: number;\n address: string;\n}>;\n\nasync function broadcastUTXOTx({ chain, txHash }: { chain: Chain; txHash: string }) {\n const rpcUrl = SKConfig.get(\"rpcUrls\")[chain];\n const body = JSON.stringify({\n jsonrpc: \"2.0\",\n method: \"sendrawtransaction\",\n params: [txHash],\n id: uniqid(),\n });\n\n const response = await RequestClient.post<{\n id: string;\n result: string;\n error: { message: string; code?: number } | null;\n }>(rpcUrl, { headers: { \"Content-Type\": \"application/json\" }, body });\n\n if (response.error) {\n throw new SwapKitError(\"toolbox_utxo_broadcast_failed\", { error: response.error?.message });\n }\n\n if (response.result.includes('\"code\":-26')) {\n throw new SwapKitError(\"toolbox_utxo_invalid_transaction\", {\n error: \"Transaction amount was too low\",\n });\n }\n\n return response.result;\n}\n\nfunction baseUrl(chain: Chain) {\n return `https://api.blockchair.com/${mapChainToBlockchairChain(chain)}`;\n}\n\nfunction getDefaultTxFeeByChain(chain: Chain) {\n switch (chain) {\n case Chain.Bitcoin:\n return 5;\n case Chain.Dogecoin:\n return 10000;\n case Chain.Litecoin:\n return 1;\n case Chain.Zcash:\n return 1;\n default:\n return 2;\n }\n}\n\nfunction mapChainToBlockchairChain(chain: Chain) {\n switch (chain) {\n case Chain.BitcoinCash:\n return \"bitcoin-cash\";\n case Chain.Litecoin:\n return \"litecoin\";\n case Chain.Dash:\n return \"dash\";\n case Chain.Dogecoin:\n return \"dogecoin\";\n case Chain.Zcash:\n return \"zcash\";\n case Chain.Polkadot:\n return \"polkadot\";\n default:\n return \"bitcoin\";\n }\n}\n\nasync function getSuggestedTxFee(chain: Chain) {\n try {\n //Use Bitgo API for fee estimation\n //Refer: https://app.bitgo.com/docs/#operation/v2.tx.getfeeestimate\n const { feePerKb } = await RequestClient.get<{\n feePerKb: number;\n cpfpFeePerKb: number;\n numBlocks: number;\n feeByBlockTarget: { 1: number; 3: number };\n }>(`https://app.bitgo.com/api/v2/${chain.toLowerCase()}/tx/fee`);\n const suggestedFee = feePerKb / 1000;\n\n return Math.max(suggestedFee, getDefaultTxFeeByChain(chain));\n } catch (_error) {\n return getDefaultTxFeeByChain(chain);\n }\n}\n\nasync function blockchairRequest<T>(url: string, apiKey?: string): Promise<T> {\n const response = await RequestClient.get<BlockchairResponse<T>>(\n `${url}${apiKey ? `${url.includes(\"?\") ? \"&\" : \"?\"}key=${apiKey}` : \"\"}`,\n );\n\n if (!response || response.context.code !== 200)\n throw new SwapKitError(\"toolbox_utxo_api_error\", { error: `Failed to query ${url}` });\n\n return response.data as T;\n}\n\nasync function getAddressData({ address, chain, apiKey }: BlockchairParams<{ address?: string }>) {\n if (!address)\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", { error: \"Address is required\" });\n\n try {\n const response = await blockchairRequest<BlockchairAddressResponse>(\n `${baseUrl(chain)}/dashboards/address/${address}?transaction_details=true`,\n apiKey,\n );\n\n return response[address];\n } catch (_error) {\n return { utxo: [], address: { balance: 0, transaction_count: 0 } };\n }\n}\n\nasync function getUnconfirmedBalance({\n address,\n chain,\n apiKey,\n}: BlockchairParams<{ address?: string }>) {\n const response = await getAddressData({ address, chain, apiKey });\n\n return response?.address.balance || 0;\n}\n\nasync function getRawTx({ chain, apiKey, txHash }: BlockchairParams<{ txHash?: string }>) {\n if (!txHash)\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", { error: \"TxHash is required\" });\n\n try {\n const rawTxResponse = await blockchairRequest<BlockchairRawTransactionResponse>(\n `${baseUrl(chain)}/raw/transaction/${txHash}`,\n apiKey,\n );\n return rawTxResponse?.[txHash]?.raw_transaction || \"\";\n } catch (error) {\n console.error(\"Failed to fetch raw transaction:\", error);\n return \"\";\n }\n}\n\nasync function fetchUnspentUtxoBatch({\n chain,\n address,\n apiKey,\n offset = 0,\n limit = 100,\n}: BlockchairFetchUnspentUtxoParams) {\n const response = await blockchairRequest<BlockchairOutputsResponse[]>(\n `${baseUrl(chain)}/outputs?q=is_spent(false),recipient(${address})&limit=${limit}&offset=${offset}`,\n apiKey,\n );\n\n const txs = response\n .filter(({ is_spent }) => !is_spent)\n .map(({ script_hex, block_id, transaction_hash, index, value, spending_signature_hex }) => ({\n hash: transaction_hash,\n index,\n value,\n txHex: spending_signature_hex,\n script_hex,\n is_confirmed: block_id !== -1,\n }));\n\n return txs;\n}\n\nasync function getUnspentUtxos({\n chain,\n address,\n apiKey,\n offset = 0,\n limit = 100,\n}: BlockchairFetchUnspentUtxoParams): Promise<Awaited<ReturnType<typeof fetchUnspentUtxoBatch>>> {\n if (!address)\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", { error: \"Address is required\" });\n\n try {\n const txs = await fetchUnspentUtxoBatch({ chain, address, apiKey, offset, limit });\n\n if (txs.length <= limit) return txs;\n\n const nextBatch = await getUnspentUtxos({\n chain,\n address,\n apiKey,\n offset: offset + limit,\n limit,\n });\n\n return [...txs, ...nextBatch];\n } catch (error) {\n console.error(\"Failed to fetch unspent UTXOs:\", error);\n return [];\n }\n}\n\nasync function scanUTXOs({\n address,\n chain,\n apiKey,\n fetchTxHex = true,\n}: BlockchairParams<{ address: string; fetchTxHex?: boolean }>) {\n const utxos = await getUnspentUtxos({ chain, address, apiKey });\n const results = [];\n\n for (const { hash, index, script_hex, value } of utxos) {\n let txHex: string | undefined;\n if (fetchTxHex) {\n txHex = await getRawTx({ txHash: hash, chain, apiKey });\n }\n results.push({\n address,\n hash,\n index,\n txHex,\n value,\n witnessUtxo: { value, script: Buffer.from(script_hex, \"hex\") },\n });\n }\n return results;\n}\n\nfunction utxoApi(chain: UTXOChain) {\n const apiKey = SKConfig.get(\"apiKeys\").blockchair || \"\";\n\n warnOnce(!apiKey, \"No Blockchair API key found. Functionality will be limited.\");\n\n return {\n broadcastTx: (txHash: string) => broadcastUTXOTx({ txHash, chain }),\n getRawTx: (txHash: string) => getRawTx({ txHash, chain, apiKey }),\n getSuggestedTxFee: () => getSuggestedTxFee(chain),\n getBalance: (address: string) => getUnconfirmedBalance({ address, chain, apiKey }),\n getAddressData: (address: string) => getAddressData({ address, chain, apiKey }),\n scanUTXOs: (params: { address: string; fetchTxHex?: boolean }) =>\n scanUTXOs({ ...params, chain, apiKey }),\n };\n}\n\n/**\n * \"Factory\" to ensure typing for custom UTXO APIs\n */\nexport function createCustomUtxoApi(methods: ReturnType<typeof utxoApi>) {\n return methods;\n}\n\nexport function getUtxoApi(chain: UTXOChain) {\n const customUtxoApi = SKConfig.get(\"apis\")[chain];\n\n if (customUtxoApi) {\n warnOnce(true, \"Using custom UTXO API. Be sure to implement all methods to avoid issues.\");\n return customUtxoApi as ReturnType<typeof utxoApi>;\n }\n\n return utxoApi(chain);\n}\n\n// Define Zcash network objects that match ECPair's expected interface\nconst ZCASH_MAINNET = {\n messagePrefix: \"\\x19Zcash Signed Message:\\n\",\n bech32: \"zc\",\n bip32: {\n public: 0x0488b21e,\n private: 0x0488ade4,\n },\n pubKeyHash: 0x1c, // 28 in decimal - correct for Zcash mainnet\n scriptHash: 0x1c, // 28 in decimal\n wif: 0x80, // 128 in decimal\n};\n\nconst ZCASH_TESTNET = {\n messagePrefix: \"\\x19Zcash Signed Message:\\n\",\n bech32: \"ztestsapling\",\n bip32: {\n public: 0x043587cf,\n private: 0x04358394,\n },\n pubKeyHash: 0x1d, // 29 in decimal - correct for Zcash testnet\n scriptHash: 0x1c, // 28 in decimal\n wif: 0xef, // 239 in decimal\n};\n\nexport function getUtxoNetwork() {\n return function getNetwork(chain: Chain) {\n switch (chain) {\n case Chain.Bitcoin:\n return networks.bitcoin;\n case Chain.BitcoinCash:\n return coininfo.bitcoincash.main.toBitcoinJS();\n case Chain.Dash:\n return coininfo.dash.main.toBitcoinJS();\n case Chain.Litecoin:\n return coininfo.litecoin.main.toBitcoinJS();\n\n case Chain.Dogecoin: {\n const bip32 = { private: 0x04358394, public: 0x043587cf };\n const test = coininfo.dogecoin.test;\n test.versions.bip32 = bip32;\n return coininfo.dogecoin.main.toBitcoinJS();\n }\n\n case Chain.Zcash: {\n // Get Zcash network configuration using our custom objects\n const { isStagenet } = SKConfig.get(\"envs\");\n return isStagenet ? ZCASH_TESTNET : ZCASH_MAINNET;\n }\n\n default:\n throw new SwapKitError(\"toolbox_utxo_not_supported\", { chain });\n }\n };\n}\n\ninterface BlockchairVin {\n txid: string;\n vout: number;\n scriptSig: {\n asm: string;\n hex: string;\n };\n sequence: number;\n}\n\ninterface BlockchairVout {\n value: number;\n n: number;\n scriptPubKey: {\n asm: string;\n hex: string;\n address: string;\n type: string;\n addresses: string[];\n reqSigs: number;\n };\n}\n\ninterface BlockchairTransaction {\n block_id: number;\n hash: string;\n time: string;\n balance_change: number;\n}\n\ninterface BlockchairUtxo {\n block_id: number;\n transaction_hash: string;\n index: number;\n value: number;\n}\n\ninterface BlockchairAddressCoreData {\n type: string;\n script_hex: string;\n balance: number;\n balance_usd: number;\n received: number;\n received_usd: number;\n spent: number;\n spent_usd: number;\n output_count: number;\n unspent_output_count: number;\n first_seen_receiving: string;\n last_seen_receiving: string;\n first_seen_spending: null | string;\n last_seen_spending: null | string;\n transaction_count: number;\n scripthash_type: null | string;\n}\n\ninterface BlockchairInputOutputCommonData {\n block_id: number;\n transaction_id: number;\n index: number;\n transaction_hash: string;\n date: string;\n time: string;\n value: number;\n value_usd: number;\n recipient: string;\n type: string;\n script_hex: string;\n is_from_coinbase: boolean;\n is_spendable: boolean | null;\n is_spent: boolean;\n lifespan: number | null;\n cdd: number | null;\n}\n\ninterface BlockchairSpendingBlockData {\n spending_block_id: number | null;\n spending_transaction_id: number | null;\n spending_index: number | null;\n spending_transaction_hash: string | null;\n spending_date: string | null;\n spending_time: string | null;\n spending_value_usd: number | null;\n spending_sequence: number | null;\n spending_signature_hex: string | null;\n spending_witness: string | null;\n}\n\ninterface BlockchairAddressResponse {\n [key: string]: {\n address: BlockchairAddressCoreData;\n transactions: BlockchairTransaction[];\n utxo: BlockchairUtxo[];\n };\n}\n\ninterface BlockchairOutputsResponse\n extends BlockchairSpendingBlockData,\n BlockchairInputOutputCommonData {}\n\ninterface BlockchairRawTransactionResponse {\n [key: string]: {\n raw_transaction: string;\n decoded_raw_transaction: {\n txid: string;\n hash: string;\n version: number;\n size: number;\n vsize: number;\n weight: number;\n locktime: number;\n vin: BlockchairVin[];\n vout: BlockchairVout[];\n };\n };\n}\n\ninterface BlockchairResponse<T> {\n data: T;\n context: {\n code: number;\n source: string;\n results: number;\n state: number;\n market_price_usd: number;\n cache: {\n live: boolean;\n duration: number;\n since: string;\n until: string;\n time: any;\n };\n api: {\n version: string;\n last_major_update: string;\n next_major_update: null | string;\n documentation: string;\n notice: string;\n };\n servers: string;\n time: number;\n render_time: number;\n full_time: number;\n request_cost: number;\n };\n}\n",
8
8
  "import { SwapKitError } from \"@swapkit/helpers\";\nimport base58check from \"bs58check\";\n// @ts-ignore\nimport cashaddr from \"cashaddrjs\";\n\nenum Format {\n Legacy = \"legacy\",\n Bitpay = \"bitpay\",\n Cashaddr = \"cashaddr\",\n}\nenum UtxoNetwork {\n Mainnet = \"mainnet\",\n Testnet = \"testnet\",\n}\nenum Type {\n P2PKH = \"p2pkh\",\n P2SH = \"p2sh\",\n}\n\nconst VERSION_BYTE = {\n [Format.Legacy]: {\n [UtxoNetwork.Mainnet]: {\n [Type.P2PKH]: 0,\n [Type.P2SH]: 5,\n },\n [UtxoNetwork.Testnet]: {\n [Type.P2PKH]: 111,\n [Type.P2SH]: 196,\n },\n },\n [Format.Bitpay]: {\n [UtxoNetwork.Mainnet]: {\n [Type.P2PKH]: 28,\n [Type.P2SH]: 40,\n },\n [UtxoNetwork.Testnet]: {\n [Type.P2PKH]: 111,\n [Type.P2SH]: 196,\n },\n },\n};\n\ntype DecodedType = {\n format: Format;\n network: UtxoNetwork;\n type: Type;\n hash: any;\n};\n\nfunction isValidAddress(input: any) {\n try {\n decodeAddress(input);\n return true;\n } catch (_error) {\n return false;\n }\n}\n\nfunction detectAddressNetwork(address: string) {\n return decodeAddress(address)?.network;\n}\n\nfunction toLegacyAddress(address: string): string {\n const decoded = decodeAddress(address);\n if (decoded?.format === Format.Legacy) {\n return address;\n }\n return encodeAsLegacy(decoded);\n}\n\nfunction toCashAddress(address: string): string {\n const decoded = decodeAddress(address);\n return encodeAsCashaddr(decoded);\n}\n\nfunction decodeAddress(address: string) {\n try {\n return decodeBase58Address(address);\n } catch (_error) {\n // Try to decode as cashaddr if base58 decoding fails.\n }\n try {\n return decodeCashAddress(address);\n } catch (_error) {\n // Try to decode as bitpay if cashaddr decoding fails.\n }\n throw new SwapKitError(\"toolbox_utxo_invalid_address\", { address });\n}\n\nfunction decodeBase58Address(address: string) {\n try {\n const payload = base58check.decode(address);\n\n // BASE_58_CHECK_PAYLOAD_LENGTH\n if (payload.length !== 21) throw new SwapKitError(\"toolbox_utxo_invalid_address\", { address });\n const versionByte = payload[0];\n const hash = Array.prototype.slice.call(payload, 1);\n\n switch (versionByte) {\n case VERSION_BYTE[Format.Legacy][UtxoNetwork.Mainnet][Type.P2PKH]:\n return { hash, format: Format.Legacy, network: UtxoNetwork.Mainnet, type: Type.P2PKH };\n\n case VERSION_BYTE[Format.Legacy][UtxoNetwork.Mainnet][Type.P2SH]:\n return { hash, format: Format.Legacy, network: UtxoNetwork.Mainnet, type: Type.P2SH };\n\n case VERSION_BYTE[Format.Legacy][UtxoNetwork.Testnet][Type.P2PKH]:\n return { hash, format: Format.Legacy, network: UtxoNetwork.Testnet, type: Type.P2PKH };\n\n case VERSION_BYTE[Format.Legacy][UtxoNetwork.Testnet][Type.P2SH]:\n return { hash, format: Format.Legacy, network: UtxoNetwork.Testnet, type: Type.P2SH };\n\n case VERSION_BYTE[Format.Bitpay][UtxoNetwork.Mainnet][Type.P2PKH]:\n return { hash, format: Format.Bitpay, network: UtxoNetwork.Mainnet, type: Type.P2PKH };\n\n case VERSION_BYTE[Format.Bitpay][UtxoNetwork.Mainnet][Type.P2SH]:\n return { hash, format: Format.Bitpay, network: UtxoNetwork.Mainnet, type: Type.P2SH };\n\n default:\n throw new SwapKitError(\"toolbox_utxo_invalid_address\", { address });\n }\n } catch (_error) {\n throw new SwapKitError(\"toolbox_utxo_invalid_address\", { address });\n }\n}\n\nfunction decodeCashAddress(address: string) {\n if (address.indexOf(\":\") !== -1) {\n try {\n return decodeCashAddressWithPrefix(address);\n } catch (_error) {\n // Try to decode as legacy if cashaddr decoding fails.\n }\n } else {\n const prefixes = [\"bitcoincash\", \"bchtest\", \"bchreg\"];\n for (const prefix of prefixes) {\n try {\n return decodeCashAddressWithPrefix(`${prefix}:${address}`);\n } catch (_error) {\n // Try next prefix if decoding fails.\n }\n }\n }\n\n throw new SwapKitError(\"toolbox_utxo_invalid_address\", { address });\n}\n\nfunction decodeCashAddressWithPrefix(address: string): DecodedType {\n try {\n const { hash, prefix, type } = cashaddr.decode(address);\n\n return {\n format: Format.Cashaddr,\n hash: Array.prototype.slice.call(hash, 0),\n network: prefix === \"bitcoincash\" ? UtxoNetwork.Mainnet : UtxoNetwork.Testnet,\n type: type === \"P2PKH\" ? Type.P2PKH : Type.P2SH,\n };\n } catch (_error) {\n throw new SwapKitError(\"toolbox_utxo_invalid_address\", { address });\n }\n}\n\nfunction encodeAsLegacy(decoded: DecodedType) {\n const versionByte = VERSION_BYTE[Format.Legacy][decoded.network][decoded.type];\n const buffer = Buffer.alloc(1 + decoded.hash.length);\n buffer[0] = versionByte;\n buffer.set(decoded.hash, 1);\n return base58check.encode(buffer);\n}\n\nfunction encodeAsCashaddr(decoded: DecodedType) {\n const prefix = decoded.network === UtxoNetwork.Mainnet ? \"bitcoincash\" : \"bchtest\";\n const type = decoded.type === Type.P2PKH ? \"P2PKH\" : \"P2SH\";\n const hash = new Uint8Array(decoded.hash);\n return cashaddr.encode(prefix, type, hash);\n}\n\nexport { detectAddressNetwork, isValidAddress, UtxoNetwork, toCashAddress, toLegacyAddress };\n",
9
9
  "import { Chain, SwapKitError, type UTXOChain } from \"@swapkit/helpers\";\n\nimport {\n TX_OVERHEAD,\n UTXOScriptType,\n calculateTxSize,\n getInputSize,\n getOutputSize,\n getScriptTypeForAddress,\n} from \"../helpers\";\nimport type { TargetOutput, UTXOCalculateTxSizeParams, UTXOType } from \"../types\";\n\nexport const getDustThreshold = (chain: UTXOChain) => {\n switch (chain) {\n case Chain.Bitcoin:\n case Chain.BitcoinCash:\n return 550;\n case Chain.Dash:\n case Chain.Litecoin:\n return 5500;\n case Chain.Dogecoin:\n return 100000;\n case Chain.Zcash:\n return 546;\n default:\n throw new SwapKitError(\"toolbox_utxo_not_supported\", { chain });\n }\n};\n\nexport const accumulative = ({\n inputs,\n outputs,\n feeRate: initialFeeRate = 1,\n chain = Chain.Bitcoin,\n}: UTXOCalculateTxSizeParams & { outputs: TargetOutput[]; chain: UTXOChain }) => {\n const feeRate = Math.ceil(initialFeeRate);\n\n const newTxType =\n inputs[0] && \"address\" in inputs[0] && inputs[0].address\n ? getScriptTypeForAddress(inputs[0].address)\n : UTXOScriptType.P2PKH;\n // skip input if adding it would cost more than input is worth\n const filteredInputs = inputs.filter((input) => getInputSize(input) * feeRate <= input.value);\n\n const txSizeWithoutInputs =\n TX_OVERHEAD + outputs.reduce((total, output) => total + getOutputSize(output, newTxType), 0);\n\n const amountToSend = outputs.reduce((total, output) => total + output.value, 0);\n\n let fees = txSizeWithoutInputs * feeRate;\n let inputsValue = 0;\n const inputsToUse: typeof inputs = [];\n\n for (const input of filteredInputs) {\n const inputSize = getInputSize(input);\n const inputFee = feeRate * inputSize;\n\n fees += inputFee;\n inputsValue += input.value;\n\n inputsToUse.push(input);\n\n const totalCost = fees + amountToSend;\n\n // we need more inputs\n if (inputsValue < totalCost) continue;\n\n const remainder = inputsValue - totalCost;\n\n const feeForExtraOutput = feeRate * getOutputSize({ address: \"\", value: 0 }, newTxType);\n\n // potential change address\n if (remainder > feeForExtraOutput) {\n const feeAfterExtraOutput = feeForExtraOutput + fees;\n const remainderAfterExtraOutput = inputsValue - (amountToSend + feeAfterExtraOutput);\n\n // is it worth a change output aka can we send it in the future?\n if (\n remainderAfterExtraOutput >\n Math.max(getInputSize({} as UTXOType) * feeRate, getDustThreshold(chain))\n ) {\n return {\n inputs: inputsToUse,\n outputs: outputs.concat({ value: remainderAfterExtraOutput, address: \"\" }),\n fee: feeAfterExtraOutput,\n };\n }\n }\n return {\n inputs: inputsToUse,\n outputs,\n fee: fees,\n };\n }\n\n // We don't have enough inputs, let's calculate transaction fee accrude to the last input\n return { fee: feeRate * calculateTxSize({ inputs, outputs, feeRate }) };\n};\n",
10
10
  "import { SwapKitError } from \"@swapkit/helpers\";\nimport { opcodes, script } from \"bitcoinjs-lib\";\nimport type {\n TargetOutput,\n UTXOCalculateTxSizeParams,\n UTXOInputWithScriptType,\n UTXOType,\n} from \"../types\";\n\n/**\n * Minimum transaction fee\n * 1000 satoshi/kB (similar to current `minrelaytxfee`)\n * @see https://github.com/bitcoin/bitcoin/blob/db88db47278d2e7208c50d16ab10cb355067d071/src/validation.h#L56\n */\nexport const MIN_TX_FEE = 1000;\nexport const TX_OVERHEAD = 4 + 1 + 1 + 4; //10\nexport const OP_RETURN_OVERHEAD = 1 + 8 + 1; //10\nconst TX_INPUT_BASE = 32 + 4 + 1 + 4; // 41\nconst TX_INPUT_PUBKEYHASH = 107;\n\nexport function compileMemo(memo: string) {\n const data = Buffer.from(memo, \"utf8\"); // converts MEMO to buffer\n return script.compile([opcodes.OP_RETURN as number, data]); // Compile OP_RETURN script\n}\n\nexport enum UTXOScriptType {\n P2PKH = \"P2PKH\", // legacy\n // P2SH = 'P2SH', // multisig\n P2WPKH = \"P2WPKH\", // bech32 - native segwit\n // P2TR = \"P2TR\", // taproot\n}\n\nexport const InputSizes: Record<UTXOScriptType, number> = {\n [UTXOScriptType.P2PKH]: 148,\n // [UTXOScriptType.P2SH]: 91,\n [UTXOScriptType.P2WPKH]: 68,\n};\n\nexport const OutputSizes: Record<UTXOScriptType, number> = {\n [UTXOScriptType.P2PKH]: 34,\n // [UTXOScriptType.P2SH]: 91,\n [UTXOScriptType.P2WPKH]: 31,\n};\n\nexport const getScriptTypeForAddress = (address: string) => {\n if (address.startsWith(\"bc1\") || address.startsWith(\"ltc1\")) {\n return UTXOScriptType.P2WPKH;\n }\n // if (address.startsWith('3') || address.startsWith('M')) {\n // return UTXOScriptType.P2SH;\n // }\n if (\n address.startsWith(\"1\") ||\n address.startsWith(\"3\") ||\n address.startsWith(\"L\") ||\n address.startsWith(\"M\") ||\n address.startsWith(\"X\") ||\n address.startsWith(\"D\") ||\n address.startsWith(\"bitcoincash:q\") ||\n address.startsWith(\"q\")\n ) {\n return UTXOScriptType.P2PKH;\n }\n throw new SwapKitError(\"toolbox_utxo_invalid_address\", { address });\n};\n\nexport const calculateTxSize = ({ inputs, outputs, feeRate }: UTXOCalculateTxSizeParams) => {\n const newTxType =\n inputs[0] && \"address\" in inputs[0] && inputs[0].address\n ? getScriptTypeForAddress(inputs[0].address)\n : UTXOScriptType.P2PKH;\n const inputSize = inputs\n .filter(\n (utxo) =>\n utxo.value >=\n InputSizes[\"type\" in utxo ? utxo.type : UTXOScriptType.P2PKH] * Math.ceil(feeRate),\n )\n .reduce((total, utxo) => total + getInputSize(utxo), 0);\n\n const outputSize =\n outputs?.reduce((total, output) => total + getOutputSize(output), 0) || OutputSizes[newTxType];\n\n return TX_OVERHEAD + inputSize + outputSize;\n};\n\nexport const getInputSize = (input: UTXOInputWithScriptType | UTXOType) => {\n if (\"type\" in input) {\n return InputSizes[input.type];\n }\n if (\"address\" in input && input.address) {\n return InputSizes[getScriptTypeForAddress(input.address as string)];\n }\n return TX_INPUT_BASE + TX_INPUT_PUBKEYHASH;\n};\n\nexport const getOutputSize = (output: TargetOutput, scriptType?: UTXOScriptType) => {\n if (output?.script) {\n return OP_RETURN_OVERHEAD + output.script.length + (output.script.length >= 74 ? 2 : 1);\n }\n if (scriptType) {\n return OutputSizes[scriptType];\n }\n return OutputSizes[UTXOScriptType.P2PKH];\n};\n",
11
11
  "import {\n AssetValue,\n Chain,\n type ChainSigner,\n DerivationPath,\n type DerivationPathArray,\n FeeOption,\n NetworkDerivationPath,\n SwapKitError,\n SwapKitNumber,\n type UTXOChain,\n applyFeeMultiplier,\n derivationPathToString,\n updateDerivationPath,\n} from \"@swapkit/helpers\";\nimport { Psbt, address as btcLibAddress, initEccLib, payments } from \"bitcoinjs-lib\";\nimport type { ECPairInterface } from \"ecpair\";\nimport { ECPairFactory } from \"ecpair\";\nimport type { UtxoToolboxParams } from \".\";\nimport { getBalance } from \"../../utils\";\nimport {\n UTXOScriptType,\n accumulative,\n calculateTxSize,\n compileMemo,\n getDustThreshold,\n getInputSize,\n getUtxoApi,\n getUtxoNetwork,\n} from \"../helpers\";\nimport type {\n BchECPair,\n TargetOutput,\n UTXOBuildTxParams,\n UTXOTransferParams,\n UTXOType,\n} from \"../types\";\nimport { bchValidateAddress } from \"./bitcoinCash\";\n\nimport secp256k1 from \"@bitcoinerlab/secp256k1\";\n// @ts-ignore\nimport { ECPair, HDNode } from \"@psf/bitcoincashjs-lib\";\nimport { HDKey } from \"@scure/bip32\";\nimport { mnemonicToSeedSync } from \"@scure/bip39\";\nimport { validateZcashAddress } from \"./zcash\";\n\nexport const nonSegwitChains = [Chain.Dash, Chain.Dogecoin];\n\nfunction addInputsAndOutputs({\n inputs,\n outputs,\n chain,\n psbt,\n sender,\n compiledMemo,\n}: {\n inputs: UTXOType[];\n outputs: TargetOutput[];\n chain: UTXOChain;\n psbt: Psbt;\n sender: string;\n compiledMemo: Buffer<ArrayBufferLike> | null;\n}) {\n for (const utxo of inputs) {\n const witnessInfo = !!utxo.witnessUtxo &&\n !nonSegwitChains.includes(chain) && { witnessUtxo: utxo.witnessUtxo };\n\n const nonWitnessInfo = nonSegwitChains.includes(chain) && {\n nonWitnessUtxo: utxo.txHex ? Buffer.from(utxo.txHex, \"hex\") : undefined,\n };\n\n psbt.addInput({ hash: utxo.hash, index: utxo.index, ...witnessInfo, ...nonWitnessInfo });\n }\n\n for (const output of outputs) {\n const address = \"address\" in output && output.address ? output.address : sender;\n const hasOutputScript = output.script;\n\n if (hasOutputScript && !compiledMemo) {\n continue;\n }\n\n const mappedOutput = hasOutputScript\n ? {\n script: compiledMemo as Buffer<ArrayBufferLike>,\n value: 0,\n }\n : {\n address,\n value: output.value,\n };\n\n initEccLib(secp256k1);\n psbt.addOutput(mappedOutput);\n }\n\n return { psbt, inputs };\n}\n\nasync function createTransaction({\n assetValue,\n recipient,\n memo,\n feeRate,\n sender,\n fetchTxHex = false,\n}: UTXOBuildTxParams): Promise<{\n psbt: Psbt;\n utxos: UTXOType[];\n inputs: UTXOType[];\n}> {\n const chain = assetValue.chain as UTXOChain;\n const compiledMemo = memo ? await compileMemo(memo) : null;\n\n const inputsAndOutputs = await getInputsAndTargetOutputs({\n assetValue,\n recipient,\n memo,\n sender,\n fetchTxHex,\n });\n\n const { inputs, outputs } = accumulative({ ...inputsAndOutputs, feeRate, chain });\n\n // .inputs and .outputs will be undefined if no solution was found\n if (!(inputs && outputs))\n throw new SwapKitError(\"toolbox_utxo_insufficient_balance\", { sender, assetValue });\n const getNetwork = await getUtxoNetwork();\n const psbt = new Psbt({ network: getNetwork(chain) });\n\n if (chain === Chain.Dogecoin) psbt.setMaximumFeeRate(650000000);\n\n const { psbt: mappedPsbt, inputs: mappedInputs } = await addInputsAndOutputs({\n inputs,\n outputs,\n chain,\n psbt,\n sender,\n compiledMemo,\n });\n\n return {\n psbt: mappedPsbt,\n utxos: inputsAndOutputs.inputs,\n inputs: mappedInputs,\n };\n}\n\nexport async function getUTXOAddressValidator() {\n const getNetwork = await getUtxoNetwork();\n\n return function validateAddress({ address, chain }: { address: string; chain: UTXOChain }) {\n if (chain === Chain.BitcoinCash) {\n return bchValidateAddress(address);\n }\n\n if (chain === Chain.Zcash) {\n return validateZcashAddress(address);\n }\n\n try {\n initEccLib(secp256k1);\n btcLibAddress.toOutputScript(address, getNetwork(chain));\n return true;\n } catch (_error) {\n return false;\n }\n };\n}\n\nasync function createSignerWithKeys({\n chain,\n phrase,\n derivationPath,\n}: { chain: UTXOChain; phrase: string; derivationPath: string }) {\n const keyPair = (await getCreateKeysForPath(chain as Chain.Bitcoin))({ phrase, derivationPath });\n\n async function signTransaction(psbt: Psbt) {\n await psbt.signAllInputs(keyPair);\n return psbt;\n }\n\n async function getAddress() {\n const addressGetter = await addressFromKeysGetter(chain);\n return addressGetter(keyPair);\n }\n\n return {\n getAddress,\n signTransaction,\n };\n}\n\nexport async function createUTXOToolbox<T extends UTXOChain>({\n chain,\n ...toolboxParams\n}: (\n | UtxoToolboxParams[T]\n | {\n phrase?: string;\n derivationPath?: DerivationPathArray;\n index?: number;\n }\n) & { chain: T }) {\n const phrase = \"phrase\" in toolboxParams ? toolboxParams.phrase : undefined;\n\n const index = \"index\" in toolboxParams ? toolboxParams.index || 0 : 0;\n\n const derivationPath = derivationPathToString(\n \"derivationPath\" in toolboxParams && toolboxParams.derivationPath\n ? toolboxParams.derivationPath\n : updateDerivationPath(NetworkDerivationPath[chain], { index }),\n );\n\n const signer = phrase\n ? await createSignerWithKeys({ chain, phrase, derivationPath })\n : \"signer\" in toolboxParams\n ? toolboxParams.signer\n : undefined;\n\n function getAddress() {\n return Promise.resolve(signer?.getAddress());\n }\n\n // const { signer } = params || {};\n const getAddressFromKeys = await addressFromKeysGetter(chain);\n const validateAddress = await getUTXOAddressValidator();\n const createKeysForPath = await getCreateKeysForPath(chain);\n\n return {\n accumulative,\n calculateTxSize,\n getAddressFromKeys,\n getAddress,\n validateAddress: (address: string) => validateAddress({ address, chain }),\n broadcastTx: (txHash: string) => getUtxoApi(chain).broadcastTx(txHash),\n createTransaction,\n createKeysForPath,\n getFeeRates: () => getFeeRates(chain),\n getInputsOutputsFee,\n transfer: transfer(signer as UtxoToolboxParams[\"BTC\"][\"signer\"]),\n getPrivateKeyFromMnemonic: (params: { phrase: string; derivationPath: string }) => {\n const keys = createKeysForPath(params);\n return keys.toWIF();\n },\n\n getBalance: getBalance(chain),\n estimateTransactionFee: estimateTransactionFee(chain),\n estimateMaxSendableAmount: estimateMaxSendableAmount(chain),\n };\n}\n\nasync function getInputsOutputsFee({\n assetValue,\n feeOptionKey = FeeOption.Fast,\n feeRate,\n memo,\n sender,\n recipient,\n}: Omit<UTXOBuildTxParams, \"feeRate\"> & {\n feeOptionKey?: FeeOption;\n feeRate?: number;\n}) {\n const chain = assetValue.chain as UTXOChain;\n\n const inputsAndOutputs = await getInputsAndTargetOutputs({\n assetValue,\n sender,\n memo,\n recipient,\n });\n\n const feeRateWhole = feeRate ? Math.floor(feeRate) : (await getFeeRates(chain))[feeOptionKey];\n\n return accumulative({ ...inputsAndOutputs, feeRate: feeRateWhole, chain });\n}\n\nfunction estimateMaxSendableAmount(chain: UTXOChain) {\n return async function estimateMaxSendableAmount({\n from,\n memo,\n feeRate,\n feeOptionKey = FeeOption.Fast,\n recipients = 1,\n }: {\n from: string;\n memo?: string;\n feeRate?: number;\n feeOptionKey?: FeeOption;\n recipients?: number | TargetOutput[];\n }) {\n const addressData = await getUtxoApi(chain).getAddressData(from);\n const feeRateWhole = feeRate ? Math.ceil(feeRate) : (await getFeeRates(chain))[feeOptionKey];\n\n const inputs = addressData?.utxo\n .map((utxo) => ({\n ...utxo,\n // type: utxo.witnessUtxo ? UTXOScriptType.P2WPKH : UTXOScriptType.P2PKH,\n type: UTXOScriptType.P2PKH,\n hash: \"\",\n }))\n .filter(\n (utxo) => utxo.value > Math.max(getDustThreshold(chain), getInputSize(utxo) * feeRateWhole),\n );\n\n if (!inputs?.length) return AssetValue.from({ chain });\n\n const balance = AssetValue.from({\n chain,\n value: inputs.reduce((sum, utxo) => sum + utxo.value, 0),\n });\n\n const outputs =\n typeof recipients === \"number\"\n ? (Array.from({ length: recipients }, () => ({\n address: from,\n value: 0,\n })) as TargetOutput[])\n : recipients;\n\n if (memo) {\n const script = await compileMemo(memo);\n outputs.push({ address: from, script, value: 0 });\n }\n\n const txSize = calculateTxSize({ inputs, outputs, feeRate: feeRateWhole });\n\n const fee = txSize * feeRateWhole;\n\n return balance.sub(fee);\n };\n}\n\nfunction estimateTransactionFee(chain: UTXOChain) {\n return async (params: {\n assetValue: AssetValue;\n recipient: string;\n sender: string;\n memo?: string;\n feeOptionKey?: FeeOption;\n feeRate?: number;\n fetchTxHex?: boolean;\n }) => {\n const inputFees = await getInputsOutputsFee(params);\n\n return AssetValue.from({\n chain,\n value: SwapKitNumber.fromBigInt(BigInt(inputFees.fee), 8).getValue(\"string\"),\n });\n };\n}\n\ntype CreateKeysForPathReturnType = {\n [Chain.BitcoinCash]: BchECPair;\n [Chain.Bitcoin]: ECPairInterface;\n [Chain.Dash]: ECPairInterface;\n [Chain.Dogecoin]: ECPairInterface;\n [Chain.Litecoin]: ECPairInterface;\n [Chain.Zcash]: ECPairInterface;\n};\n\nexport async function getCreateKeysForPath<T extends keyof CreateKeysForPathReturnType>(\n chain: T,\n): Promise<\n (params: {\n wif?: string;\n phrase?: string;\n derivationPath?: string;\n }) => CreateKeysForPathReturnType[T]\n> {\n const getNetwork = await getUtxoNetwork();\n\n switch (chain) {\n case Chain.BitcoinCash: {\n return function createKeysForPath({\n phrase,\n derivationPath = `${DerivationPath.BCH}/0`,\n wif,\n }: { wif?: string; phrase?: string; derivationPath?: string }) {\n const network = getNetwork(chain);\n\n if (wif) {\n return ECPair.fromWIF(wif, network) as BchECPair;\n }\n if (!phrase)\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", { error: \"No phrase provided\" });\n\n const masterHDNode = HDNode.fromSeedBuffer(\n Buffer.from(mnemonicToSeedSync(phrase)),\n network,\n );\n const keyPair = masterHDNode.derivePath(derivationPath).keyPair;\n\n return keyPair as BchECPair;\n } as (params: {\n wif?: string;\n phrase?: string;\n derivationPath?: string;\n }) => CreateKeysForPathReturnType[T];\n }\n case Chain.Bitcoin:\n case Chain.Dogecoin:\n case Chain.Litecoin:\n case Chain.Zcash:\n case Chain.Dash: {\n return function createKeysForPath({\n phrase,\n wif,\n derivationPath,\n }: { phrase?: string; wif?: string; derivationPath: string }) {\n if (!(wif || phrase))\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", {\n error: \"Either phrase or wif must be provided\",\n });\n\n const factory = ECPairFactory(secp256k1);\n const network = getNetwork(chain);\n\n if (wif) return factory.fromWIF(wif, network);\n\n const seed = mnemonicToSeedSync(phrase as string);\n const master = HDKey.fromMasterSeed(seed, network).derive(derivationPath);\n if (!master.privateKey)\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", {\n error: \"Could not get private key from phrase\",\n });\n\n return factory.fromPrivateKey(Buffer.from(master.privateKey), { network });\n } as (params: {\n wif?: string;\n phrase?: string;\n derivationPath?: string;\n }) => CreateKeysForPathReturnType[T];\n }\n default:\n throw new SwapKitError(\"toolbox_utxo_not_supported\", { chain });\n }\n}\n\nexport async function addressFromKeysGetter(chain: UTXOChain) {\n const getNetwork = await getUtxoNetwork();\n\n return function getAddressFromKeys(keys: ECPairInterface | BchECPair) {\n if (!keys)\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", { error: \"Keys must be provided\" });\n\n const method = nonSegwitChains.includes(chain) ? payments.p2pkh : payments.p2wpkh;\n const { address } = method({ pubkey: keys.publicKey as Buffer, network: getNetwork(chain) });\n if (!address)\n throw new SwapKitError(\"toolbox_utxo_invalid_address\", { error: \"Address not defined\" });\n\n return address;\n };\n}\n\nfunction transfer(signer?: ChainSigner<Psbt, Psbt>) {\n return async function transfer({\n memo,\n recipient,\n feeOptionKey,\n feeRate,\n assetValue,\n }: UTXOTransferParams) {\n const from = await signer?.getAddress();\n\n const chain = assetValue.chain as UTXOChain;\n\n if (!(signer && from)) throw new SwapKitError(\"toolbox_utxo_no_signer\");\n if (!recipient)\n throw new SwapKitError(\"toolbox_utxo_invalid_params\", {\n error: \"Recipient address must be provided\",\n });\n const txFeeRate = feeRate || (await getFeeRates(chain))[feeOptionKey || FeeOption.Fast];\n\n const { psbt } = await createTransaction({\n recipient,\n feeRate: txFeeRate,\n sender: from,\n assetValue,\n memo,\n });\n const signedPsbt = await signer.signTransaction(psbt);\n signedPsbt.finalizeAllInputs(); // Finalise inputs\n // TX extracted and formatted to hex\n return getUtxoApi(chain).broadcastTx(signedPsbt.extractTransaction().toHex());\n };\n}\n\nasync function getFeeRates(chain: UTXOChain) {\n const suggestedFeeRate = await getUtxoApi(chain).getSuggestedTxFee();\n\n return {\n [FeeOption.Average]: suggestedFeeRate,\n [FeeOption.Fast]: applyFeeMultiplier(suggestedFeeRate, FeeOption.Fast),\n [FeeOption.Fastest]: applyFeeMultiplier(suggestedFeeRate, FeeOption.Fastest),\n };\n}\n\nasync function getInputsAndTargetOutputs({\n assetValue,\n recipient,\n memo,\n sender,\n fetchTxHex: fetchTxOverwrite = false,\n}: Omit<UTXOBuildTxParams, \"feeRate\">) {\n const chain = assetValue.chain as UTXOChain;\n\n const fetchTxHex = fetchTxOverwrite || nonSegwitChains.includes(chain);\n\n const inputs = await getUtxoApi(chain).scanUTXOs({ address: sender, fetchTxHex });\n\n //1. add output amount and recipient to targets\n //2. add output memo to targets (optional)\n\n return {\n inputs,\n outputs: [\n { address: recipient, value: Number(assetValue.bigIntValue) },\n ...(memo ? [{ address: \"\", script: await compileMemo(memo), value: 0 }] : []),\n ],\n };\n}\n",
12
12
  "import secp256k1 from \"@bitcoinerlab/secp256k1\";\nimport { HDKey } from \"@scure/bip32\";\nimport { mnemonicToSeedSync } from \"@scure/bip39\";\nimport {\n Chain,\n type ChainSigner,\n type DerivationPathArray,\n FeeOption,\n NetworkDerivationPath,\n SKConfig,\n SwapKitError,\n derivationPathToString,\n updateDerivationPath,\n} from \"@swapkit/helpers\";\nimport type { Psbt } from \"bitcoinjs-lib\";\nimport { hash160 } from \"bitcoinjs-lib/src/crypto\";\nimport bs58check from \"bs58check\";\nimport { ECPairFactory } from \"ecpair\";\nimport { P, match } from \"ts-pattern\";\nimport { getUtxoNetwork } from \"../helpers\";\nimport type { UTXOBuildTxParams, UTXOTransferParams } from \"../types\";\nimport { createUTXOToolbox } from \"./utxo\";\n\nconst chain = Chain.Zcash;\nconst network = getUtxoNetwork()(chain);\n\n/**\n * Custom Zcash address generation that handles 2-byte prefixes\n *\n * Zcash transparent addresses use 2-byte version prefixes, unlike Bitcoin's single byte.\n * This is incompatible with bitcoinjs-lib's payment methods which expect UInt8 values.\n *\n * @param publicKey - The public key buffer to generate address from\n * @param isTestnet - Whether to generate testnet or mainnet address\n * @returns A valid Zcash transparent address (t1... for mainnet, tm... for testnet)\n */\nfunction generateZcashAddress(publicKey: Buffer, isTestnet = false): string {\n // Hash the public key using RIPEMD160(SHA256(pubkey))\n const publicKeyHash = hash160(publicKey);\n\n // Zcash uses 2-byte prefixes for transparent addresses\n // These prefixes ensure addresses start with expected characters when base58 encoded\n const prefix = isTestnet\n ? Buffer.from([0x1c, 0xba]) // testnet prefix (results in tm... addresses)\n : Buffer.from([0x1c, 0xb8]); // mainnet prefix (results in t1... addresses)\n\n // Combine prefix + hash (22 bytes total: 2 byte prefix + 20 byte hash)\n const payload = Buffer.concat([prefix, publicKeyHash]);\n\n // Encode with base58check for final address\n return bs58check.encode(payload);\n}\n\nexport function validateZcashAddress(address: string) {\n try {\n // Shielded addresses are not supported\n if (address.startsWith(\"z\")) {\n console.warn(\n \"Shielded Zcash addresses (z-addresses) are not supported. Use transparent addresses (t1/t3) only.\",\n );\n return false;\n }\n\n const isMainnet = address.startsWith(\"t1\");\n const isTestnet = address.startsWith(\"t3\");\n\n if (!(isMainnet || isTestnet)) {\n return false;\n }\n\n // Verify network matches address type\n const { isStagenet } = SKConfig.get(\"envs\");\n if ((isMainnet && isStagenet) || (isTestnet && !isStagenet)) {\n return false;\n }\n\n return validateBase58Check(address, network);\n } catch {\n return false;\n }\n}\n\nfunction validateBase58Check(\n address: string,\n network: ReturnType<ReturnType<typeof getUtxoNetwork>>,\n) {\n try {\n const decoded = bs58check.decode(address);\n\n if (decoded.length < 21) {\n return false;\n }\n\n const version = decoded[0];\n return version === network.pubKeyHash || version === network.scriptHash;\n } catch {\n return false;\n }\n}\n\nconst ECPair = ECPairFactory(secp256k1);\n\ntype ZcashSigner = ChainSigner<Psbt, Psbt>;\n\nasync function createZcashSignerFromPhrase({\n phrase,\n derivationPathString,\n}: {\n phrase: string;\n derivationPathString: string;\n}) {\n const seed = mnemonicToSeedSync(phrase);\n const root = HDKey.fromMasterSeed(seed);\n\n const node = root.derive(derivationPathString);\n\n if (!node.privateKey) {\n throw new Error(\"Unable to derive private key\");\n }\n\n const keyPair = ECPair.fromPrivateKey(Buffer.from(node.privateKey), { network });\n\n const { isStagenet } = SKConfig.get(\"envs\");\n const address = generateZcashAddress(keyPair.publicKey, isStagenet);\n\n return {\n getAddress() {\n return Promise.resolve(address);\n },\n\n signTransaction(psbt: Psbt) {\n for (let i = 0; i < psbt.inputCount; i++) {\n psbt.signInput(i, keyPair);\n }\n return Promise.resolve(psbt);\n },\n };\n}\n\nexport async function createZcashToolbox(\n toolboxParams:\n | {\n signer?: ZcashSigner;\n }\n | {\n phrase?: string;\n derivationPath?: DerivationPathArray;\n index?: number;\n },\n) {\n const signer = await match(toolboxParams)\n .with({ signer: P.not(P.nullish) }, ({ signer }) => Promise.resolve(signer))\n .with({ phrase: P.string }, ({ phrase, derivationPath, index = 0 }) => {\n // Handle derivation path processing at toolbox level\n const baseDerivationPath = derivationPath ||\n NetworkDerivationPath[Chain.Zcash] || [44, 133, 0, 0, 0];\n const updatedDerivationPath = updateDerivationPath(baseDerivationPath, { index });\n const derivationPathString = derivationPathToString(updatedDerivationPath);\n\n return createZcashSignerFromPhrase({ phrase, derivationPathString });\n })\n .otherwise(() => Promise.resolve(undefined));\n\n const { getFeeRates, broadcastTx, ...toolbox } = await createUTXOToolbox({\n chain: Chain.Zcash,\n signer,\n });\n\n function getAddressFromKeys(keys: { getAddress: () => string }) {\n return keys.getAddress();\n }\n\n async function transfer({\n recipient,\n assetValue,\n feeOptionKey = FeeOption.Fast,\n ...rest\n }: UTXOTransferParams) {\n const from = await signer?.getAddress();\n if (!(signer && from)) throw new SwapKitError(\"toolbox_utxo_no_signer\");\n\n const feeRate = rest.feeRate || (await getFeeRates())[feeOptionKey];\n\n const buildTxParams: UTXOBuildTxParams = {\n ...rest,\n assetValue,\n feeRate,\n recipient,\n sender: from,\n };\n\n const { psbt } = await toolbox.createTransaction(buildTxParams);\n const signedPsbt = await signer.signTransaction(psbt);\n signedPsbt.finalizeAllInputs();\n const txHex = signedPsbt.extractTransaction().toHex();\n\n return broadcastTx(txHex);\n }\n\n return {\n ...toolbox,\n broadcastTx,\n getFeeRates,\n transfer,\n getAddressFromKeys,\n validateAddress: validateZcashAddress,\n };\n}\n"
13
13
  ],
14
- "mappings": "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",
15
- "debugId": "57E42E1F305AB10A64756E2164756E21",
14
+ "mappings": "uFAAA,cACE,kBAGA,0BCJF,sBACE,yBACA,cACA,gCAGF,gBACE,gBAGA,4BACA,mBACA,4BACA,2BACA,0BAEF,eAAS,uBChBT,gBACE,mBACA,cACA,kBACA,cAEA,0BAEF,mBAAS,uBAIT,wBASA,eAAe,EAAe,EAAG,QAAO,UAA4C,CAClF,IAAM,EAAS,EAAS,IAAI,SAAS,EAAE,GACjC,EAAO,KAAK,UAAU,CAC1B,QAAS,MACT,OAAQ,qBACR,OAAQ,CAAC,CAAM,EACf,GAAI,GAAO,CACb,CAAC,EAEK,EAAW,MAAM,EAAc,KAIlC,EAAQ,CAAE,QAAS,CAAE,eAAgB,kBAAmB,EAAG,MAAK,CAAC,EAEpE,GAAI,EAAS,MACX,MAAM,IAAI,EAAa,gCAAiC,CAAE,MAAO,EAAS,OAAO,OAAQ,CAAC,EAG5F,GAAI,EAAS,OAAO,SAAS,YAAY,EACvC,MAAM,IAAI,EAAa,mCAAoC,CACzD,MAAO,gCACT,CAAC,EAGH,OAAO,EAAS,OAGlB,SAAS,CAAO,CAAC,EAAc,CAC7B,MAAO,8BAA8B,GAA0B,CAAK,IAGtE,SAAS,EAAsB,CAAC,EAAc,CAC5C,OAAQ,QACD,EAAM,QACT,MAAO,QACJ,EAAM,SACT,MAAO,UACJ,EAAM,SACT,MAAO,QACJ,EAAM,MACT,MAAO,WAEP,MAAO,IAIb,SAAS,EAAyB,CAAC,EAAc,CAC/C,OAAQ,QACD,EAAM,YACT,MAAO,oBACJ,EAAM,SACT,MAAO,gBACJ,EAAM,KACT,MAAO,YACJ,EAAM,SACT,MAAO,gBACJ,EAAM,MACT,MAAO,aACJ,EAAM,SACT,MAAO,mBAEP,MAAO,WAIb,eAAe,EAAiB,CAAC,EAAc,CAC7C,GAAI,CAGF,IAAQ,YAAa,MAAM,EAAc,IAKtC,gCAAgC,EAAM,YAAY,UAAU,EACzD,EAAe,EAAW,KAEhC,OAAO,KAAK,IAAI,EAAc,GAAuB,CAAK,CAAC,EAC3D,MAAO,EAAQ,CACf,OAAO,GAAuB,CAAK,GAIvC,eAAe,CAAoB,CAAC,EAAa,EAA6B,CAC5E,IAAM,EAAW,MAAM,EAAc,IACnC,GAAG,IAAM,EAAS,GAAG,EAAI,SAAS,GAAG,EAAI,IAAM,UAAU,IAAW,IACtE,EAEA,IAAK,GAAY,EAAS,QAAQ,OAAS,IACzC,MAAM,IAAI,EAAa,yBAA0B,CAAE,MAAO,mBAAmB,GAAM,CAAC,EAEtF,OAAO,EAAS,KAGlB,eAAe,EAAc,EAAG,UAAS,QAAO,UAAkD,CAChG,IAAK,EACH,MAAM,IAAI,EAAa,8BAA+B,CAAE,MAAO,qBAAsB,CAAC,EAExF,GAAI,CAMF,OALiB,MAAM,EACrB,GAAG,EAAQ,CAAK,wBAAwB,6BACxC,CACF,GAEgB,GAChB,MAAO,EAAQ,CACf,MAAO,CAAE,KAAM,CAAC,EAAG,QAAS,CAAE,QAAS,EAAG,kBAAmB,CAAE,CAAE,GAIrE,eAAe,EAAqB,EAClC,UACA,QACA,UACyC,CAGzC,OAFiB,MAAM,GAAe,CAAE,UAAS,QAAO,QAAO,CAAC,IAE/C,QAAQ,SAAW,EAGtC,eAAe,EAAQ,EAAG,QAAO,SAAQ,UAAiD,CACxF,IAAK,EACH,MAAM,IAAI,EAAa,8BAA+B,CAAE,MAAO,oBAAqB,CAAC,EAEvF,GAAI,CAKF,OAJsB,MAAM,EAC1B,GAAG,EAAQ,CAAK,qBAAqB,IACrC,CACF,KACuB,IAAS,iBAAmB,GACnD,MAAO,EAAO,CAEd,OADA,QAAQ,MAAM,mCAAoC,CAAK,EAChD,IAIX,eAAe,EAAqB,EAClC,QACA,UACA,SACA,SAAS,EACT,QAAQ,KAC2B,CAiBnC,OAhBiB,MAAM,EACrB,GAAG,EAAQ,CAAK,yCAAyC,YAAkB,YAAgB,IAC3F,CACF,GAGG,OAAO,EAAG,eAAgB,CAAQ,EAClC,IAAI,EAAG,aAAY,WAAU,mBAAkB,QAAO,QAAO,6BAA8B,CAC1F,KAAM,EACN,QACA,QACA,MAAO,EACP,aACA,aAAc,IAAa,EAC7B,EAAE,EAKN,eAAe,EAAe,EAC5B,QACA,UACA,SACA,SAAS,EACT,QAAQ,KACuF,CAC/F,IAAK,EACH,MAAM,IAAI,EAAa,8BAA+B,CAAE,MAAO,qBAAsB,CAAC,EAExF,GAAI,CACF,IAAM,EAAM,MAAM,GAAsB,CAAE,QAAO,UAAS,SAAQ,SAAQ,OAAM,CAAC,EAEjF,GAAI,EAAI,QAAU,EAAO,OAAO,EAEhC,IAAM,EAAY,MAAM,GAAgB,CACtC,QACA,UACA,SACA,OAAQ,EAAS,EACjB,OACF,CAAC,EAED,MAAO,CAAC,GAAG,EAAK,GAAG,CAAS,EAC5B,MAAO,EAAO,CAEd,OADA,QAAQ,MAAM,iCAAkC,CAAK,EAC9C,CAAC,GAIZ,eAAe,EAAS,EACtB,UACA,QACA,SACA,aAAa,IACiD,CAC9D,IAAM,EAAQ,MAAM,GAAgB,CAAE,QAAO,UAAS,QAAO,CAAC,EACxD,EAAU,CAAC,EAEjB,QAAa,OAAM,QAAO,aAAY,WAAW,EAAO,CACtD,IAAI,EACJ,GAAI,EACF,EAAQ,MAAM,GAAS,CAAE,OAAQ,EAAM,QAAO,QAAO,CAAC,EAExD,EAAQ,KAAK,CACX,UACA,OACA,QACA,QACA,QACA,YAAa,CAAE,QAAO,OAAQ,OAAO,KAAK,EAAY,KAAK,CAAE,CAC/D,CAAC,EAEH,OAAO,EAGT,SAAS,EAAO,CAAC,EAAkB,CACjC,IAAM,EAAS,EAAS,IAAI,SAAS,EAAE,YAAc,GAIrD,OAFA,IAAU,EAAQ,6DAA6D,EAExE,CACL,YAAa,CAAC,IAAmB,GAAgB,CAAE,SAAQ,OAAM,CAAC,EAClE,SAAU,CAAC,IAAmB,GAAS,CAAE,SAAQ,QAAO,QAAO,CAAC,EAChE,kBAAmB,IAAM,GAAkB,CAAK,EAChD,WAAY,CAAC,IAAoB,GAAsB,CAAE,UAAS,QAAO,QAAO,CAAC,EACjF,eAAgB,CAAC,IAAoB,GAAe,CAAE,UAAS,QAAO,QAAO,CAAC,EAC9E,UAAW,CAAC,IACV,GAAU,IAAK,EAAQ,QAAO,QAAO,CAAC,CAC1C,EAMK,SAAS,EAAmB,CAAC,EAAqC,CACvE,OAAO,EAGF,SAAS,CAAU,CAAC,EAAkB,CAC3C,IAAM,EAAgB,EAAS,IAAI,MAAM,EAAE,GAE3C,GAAI,EAEF,OADA,GAAS,GAAM,0EAA0E,EAClF,EAGT,OAAO,GAAQ,CAAK,EAItB,IAAM,GAAgB,CACpB,cAAe;AAAA,EACf,OAAQ,KACR,MAAO,CACL,OAAQ,SACR,QAAS,QACX,EACA,WAAY,GACZ,WAAY,GACZ,IAAK,GACP,EAEM,GAAgB,CACpB,cAAe;AAAA,EACf,OAAQ,eACR,MAAO,CACL,OAAQ,SACR,QAAS,QACX,EACA,WAAY,GACZ,WAAY,GACZ,IAAK,GACP,EAEO,SAAS,CAAc,EAAG,CAC/B,OAAO,SAAS,CAAU,CAAC,EAAc,CACvC,OAAQ,QACD,EAAM,QACT,OAAO,GAAS,aACb,EAAM,YACT,OAAO,EAAS,YAAY,KAAK,YAAY,OAC1C,EAAM,KACT,OAAO,EAAS,KAAK,KAAK,YAAY,OACnC,EAAM,SACT,OAAO,EAAS,SAAS,KAAK,YAAY,OAEvC,EAAM,SAAU,CACnB,IAAM,EAAQ,CAAE,QAAS,SAAY,OAAQ,QAAW,EAClD,EAAO,EAAS,SAAS,KAE/B,OADA,EAAK,SAAS,MAAQ,EACf,EAAS,SAAS,KAAK,YAAY,CAC5C,MAEK,EAAM,MAAO,CAEhB,IAAQ,cAAe,EAAS,IAAI,MAAM,EAC1C,OAAO,EAAa,GAAgB,EACtC,SAGE,MAAM,IAAI,EAAa,6BAA8B,CAAE,OAAM,CAAC,ICrUtE,uBAAS,yBACT,0BAEA,2BAOA,IAAK,IAAL,CAAK,IAAL,CACE,UAAU,UACV,UAAU,YAFP,SASL,IAAM,EAAe,EAClB,UAAgB,EACd,WAAsB,EACpB,SAAa,GACb,QAAY,CACf,GACC,WAAsB,EACpB,SAAa,KACb,QAAY,GACf,CACF,GACC,UAAgB,EACd,WAAsB,EACpB,SAAa,IACb,QAAY,EACf,GACC,WAAsB,EACpB,SAAa,KACb,QAAY,GACf,CACF,CACF,EASA,SAAS,EAAc,CAAC,EAAY,CAClC,GAAI,CAEF,OADA,EAAc,CAAK,EACZ,GACP,MAAO,EAAQ,CACf,MAAO,IAIX,SAAS,EAAoB,CAAC,EAAiB,CAC7C,OAAO,EAAc,CAAO,GAAG,QAGjC,SAAS,CAAe,CAAC,EAAyB,CAChD,IAAM,EAAU,EAAc,CAAO,EACrC,GAAI,GAAS,SAAW,SACtB,OAAO,EAET,OAAO,GAAe,CAAO,EAG/B,SAAS,CAAa,CAAC,EAAyB,CAC9C,IAAM,EAAU,EAAc,CAAO,EACrC,OAAO,GAAiB,CAAO,EAGjC,SAAS,CAAa,CAAC,EAAiB,CACtC,GAAI,CACF,OAAO,GAAoB,CAAO,EAClC,MAAO,EAAQ,EAGjB,GAAI,CACF,OAAO,GAAkB,CAAO,EAChC,MAAO,EAAQ,EAGjB,MAAM,IAAI,EAAa,+BAAgC,CAAE,SAAQ,CAAC,EAGpE,SAAS,EAAmB,CAAC,EAAiB,CAC5C,GAAI,CACF,IAAM,EAAU,GAAY,OAAO,CAAO,EAG1C,GAAI,EAAQ,SAAW,GAAI,MAAM,IAAI,EAAa,+BAAgC,CAAE,SAAQ,CAAC,EAC7F,IAAM,EAAc,EAAQ,GACtB,EAAO,MAAM,UAAU,MAAM,KAAK,EAAS,CAAC,EAElD,OAAQ,QACD,EAAa,OAAe,QAAqB,MACpD,MAAO,CAAE,OAAM,OAAQ,SAAe,QAAS,UAAqB,KAAM,OAAW,OAElF,EAAa,OAAe,QAAqB,KACpD,MAAO,CAAE,OAAM,OAAQ,SAAe,QAAS,UAAqB,KAAM,MAAU,OAEjF,EAAa,OAAe,QAAqB,MACpD,MAAO,CAAE,OAAM,OAAQ,SAAe,QAAS,UAAqB,KAAM,OAAW,OAElF,EAAa,OAAe,QAAqB,KACpD,MAAO,CAAE,OAAM,OAAQ,SAAe,QAAS,UAAqB,KAAM,MAAU,OAEjF,EAAa,OAAe,QAAqB,MACpD,MAAO,CAAE,OAAM,OAAQ,SAAe,QAAS,UAAqB,KAAM,OAAW,OAElF,EAAa,OAAe,QAAqB,KACpD,MAAO,CAAE,OAAM,OAAQ,SAAe,QAAS,UAAqB,KAAM,MAAU,UAGpF,MAAM,IAAI,EAAa,+BAAgC,CAAE,SAAQ,CAAC,GAEtE,MAAO,EAAQ,CACf,MAAM,IAAI,EAAa,+BAAgC,CAAE,SAAQ,CAAC,GAItE,SAAS,EAAiB,CAAC,EAAiB,CAC1C,GAAI,EAAQ,QAAQ,GAAG,IAAM,GAC3B,GAAI,CACF,OAAO,GAA4B,CAAO,EAC1C,MAAO,EAAQ,EAGZ,KACL,IAAM,EAAW,CAAC,cAAe,UAAW,QAAQ,EACpD,QAAW,KAAU,EACnB,GAAI,CACF,OAAO,GAA4B,GAAG,KAAU,GAAS,EACzD,MAAO,EAAQ,GAMrB,MAAM,IAAI,EAAa,+BAAgC,CAAE,SAAQ,CAAC,EAGpE,SAAS,EAA2B,CAAC,EAA8B,CACjE,GAAI,CACF,IAAQ,OAAM,SAAQ,QAAS,GAAS,OAAO,CAAO,EAEtD,MAAO,CACL,OAAQ,WACR,KAAM,MAAM,UAAU,MAAM,KAAK,EAAM,CAAC,EACxC,QAAS,IAAW,cAAgB,UAAsB,UAC1D,KAAM,IAAS,QAAU,QAAa,MACxC,EACA,MAAO,EAAQ,CACf,MAAM,IAAI,EAAa,+BAAgC,CAAE,SAAQ,CAAC,GAItE,SAAS,EAAc,CAAC,EAAsB,CAC5C,IAAM,EAAc,EAAa,OAAe,EAAQ,SAAS,EAAQ,MACnE,EAAS,OAAO,MAAM,EAAI,EAAQ,KAAK,MAAM,EAGnD,OAFA,EAAO,GAAK,EACZ,EAAO,IAAI,EAAQ,KAAM,CAAC,EACnB,GAAY,OAAO,CAAM,EAGlC,SAAS,EAAgB,CAAC,EAAsB,CAC9C,IAAM,EAAS,EAAQ,UAAY,UAAsB,cAAgB,UACnE,EAAO,EAAQ,OAAS,QAAa,QAAU,OAC/C,EAAO,IAAI,WAAW,EAAQ,IAAI,EACxC,OAAO,GAAS,OAAO,EAAQ,EAAM,CAAI,EC7K3C,gBAAS,kBAAO,0BAYT,IAAM,EAAmB,CAAC,IAAqB,CACpD,OAAQ,QACD,EAAM,aACN,EAAM,YACT,MAAO,UACJ,EAAM,UACN,EAAM,SACT,MAAO,WACJ,EAAM,SACT,MAAO,UACJ,EAAM,MACT,MAAO,aAEP,MAAM,IAAI,GAAa,6BAA8B,CAAE,OAAM,CAAC,IAIvD,EAAe,EAC1B,SACA,UACA,QAAS,EAAiB,EAC1B,QAAQ,EAAM,WACiE,CAC/E,IAAM,EAAU,KAAK,KAAK,CAAc,EAElC,EACJ,EAAO,IAAM,YAAa,EAAO,IAAM,EAAO,GAAG,QAC7C,EAAwB,EAAO,GAAG,OAAO,UAGzC,EAAiB,EAAO,OAAO,CAAC,IAAU,EAAa,CAAK,EAAI,GAAW,EAAM,KAAK,EAEtF,EACJ,EAAc,EAAQ,OAAO,CAAC,EAAO,IAAW,EAAQ,EAAc,EAAQ,CAAS,EAAG,CAAC,EAEvF,EAAe,EAAQ,OAAO,CAAC,EAAO,IAAW,EAAQ,EAAO,MAAO,CAAC,EAE1E,EAAO,EAAsB,EAC7B,EAAc,EACZ,EAA6B,CAAC,EAEpC,QAAW,KAAS,EAAgB,CAClC,IAAM,EAAY,EAAa,CAAK,EAC9B,EAAW,EAAU,EAE3B,GAAQ,EACR,GAAe,EAAM,MAErB,EAAY,KAAK,CAAK,EAEtB,IAAM,EAAY,EAAO,EAGzB,GAAI,EAAc,EAAW,SAE7B,IAAM,EAAY,EAAc,EAE1B,GAAoB,EAAU,EAAc,CAAE,QAAS,GAAI,MAAO,CAAE,EAAG,CAAS,EAGtF,GAAI,EAAY,GAAmB,CACjC,IAAM,GAAsB,GAAoB,EAC1C,GAA4B,GAAe,EAAe,IAGhE,GACE,GACA,KAAK,IAAI,EAAa,CAAC,CAAa,EAAI,EAAS,EAAiB,CAAK,CAAC,EAExE,MAAO,CACL,OAAQ,EACR,QAAS,EAAQ,OAAO,CAAE,MAAO,GAA2B,QAAS,EAAG,CAAC,EACzE,IAAK,EACP,EAGJ,MAAO,CACL,OAAQ,EACR,UACA,IAAK,CACP,EAIF,MAAO,CAAE,IAAK,EAAU,EAAgB,CAAE,SAAQ,UAAS,SAAQ,CAAC,CAAE,GChGxE,uBAAS,0BACT,kBAAS,aAAS,uBAaX,IAAM,GAAa,KACb,EAAc,GACd,GAAqB,GAC5B,GAAgB,GAChB,GAAsB,IAErB,SAAS,CAAW,CAAC,EAAc,CACxC,IAAM,EAAO,OAAO,KAAK,EAAM,MAAM,EACrC,OAAO,GAAO,QAAQ,CAAC,GAAQ,UAAqB,CAAI,CAAC,EAGpD,IAAK,IAAL,CAAK,IAAL,CACL,QAAQ,QAER,SAAS,WAHC,SAOL,IAAM,GAA6C,EACvD,SAAuB,KAEvB,UAAwB,EAC3B,EAEa,EAA8C,EACxD,SAAuB,IAEvB,UAAwB,EAC3B,EAEa,EAA0B,CAAC,IAAoB,CAC1D,GAAI,EAAQ,WAAW,KAAK,GAAK,EAAQ,WAAW,MAAM,EACxD,MAAO,SAKT,GACE,EAAQ,WAAW,GAAG,GACtB,EAAQ,WAAW,GAAG,GACtB,EAAQ,WAAW,GAAG,GACtB,EAAQ,WAAW,GAAG,GACtB,EAAQ,WAAW,GAAG,GACtB,EAAQ,WAAW,GAAG,GACtB,EAAQ,WAAW,eAAe,GAClC,EAAQ,WAAW,GAAG,EAEtB,MAAO,QAET,MAAM,IAAI,GAAa,+BAAgC,CAAE,SAAQ,CAAC,GAGvD,EAAkB,EAAG,SAAQ,UAAS,aAAyC,CAC1F,IAAM,EACJ,EAAO,IAAM,YAAa,EAAO,IAAM,EAAO,GAAG,QAC7C,EAAwB,EAAO,GAAG,OAAO,EACzC,QACA,EAAY,EACf,OACC,CAAC,IACC,EAAK,OACL,GAAW,SAAU,EAAO,EAAK,KAAO,SAAwB,KAAK,KAAK,CAAO,CACrF,EACC,OAAO,CAAC,EAAO,IAAS,EAAQ,EAAa,CAAI,EAAG,CAAC,EAElD,EACJ,GAAS,OAAO,CAAC,EAAO,IAAW,EAAQ,EAAc,CAAM,EAAG,CAAC,GAAK,EAAY,GAEtF,OAAO,EAAc,EAAY,GAGtB,EAAe,CAAC,IAA8C,CACzE,GAAI,SAAU,EACZ,OAAO,GAAW,EAAM,MAE1B,GAAI,YAAa,GAAS,EAAM,QAC9B,OAAO,GAAW,EAAwB,EAAM,OAAiB,GAEnE,OAAO,GAAgB,IAGZ,EAAgB,CAAC,EAAsB,IAAgC,CAClF,GAAI,GAAQ,OACV,OAAO,GAAqB,EAAO,OAAO,QAAU,EAAO,OAAO,QAAU,GAAK,EAAI,GAEvF,GAAI,EACF,OAAO,EAAY,GAErB,OAAO,EAAY,OCtGrB,qBACE,YACA,oBAEA,gBAEA,2BACA,mBACA,mBACA,yBAEA,6BACA,2BACA,0BAEF,eAAS,cAAM,iBAA0B,eAAY,uBAErD,wBAAS,gBAsBT,wCAEA,iBAAS,aAAQ,gCACjB,gBAAS,sBACT,6BAAS,sBC3CT,wCACA,gBAAS,sBACT,6BAAS,sBACT,gBACE,gBAGA,4BACA,eACA,mBACA,6BACA,2BACA,0BAGF,kBAAS,kCACT,0BACA,wBAAS,gBACT,YAAS,YAAG,oBAKZ,IAAM,GAAQ,GAAM,MACd,GAAU,EAAe,EAAE,EAAK,EAYtC,SAAS,EAAoB,CAAC,EAAmB,EAAY,GAAe,CAE1E,IAAM,EAAgB,GAAQ,CAAS,EAIjC,EAAS,EACX,OAAO,KAAK,CAAC,GAAM,GAAI,CAAC,EACxB,OAAO,KAAK,CAAC,GAAM,GAAI,CAAC,EAGtB,EAAU,OAAO,OAAO,CAAC,EAAQ,CAAa,CAAC,EAGrD,OAAO,GAAU,OAAO,CAAO,EAG1B,SAAS,EAAoB,CAAC,EAAiB,CACpD,GAAI,CAEF,GAAI,EAAQ,WAAW,GAAG,EAIxB,OAHA,QAAQ,KACN,mGACF,EACO,GAGT,IAAM,EAAY,EAAQ,WAAW,IAAI,EACnC,EAAY,EAAQ,WAAW,IAAI,EAEzC,KAAM,GAAa,GACjB,MAAO,GAIT,IAAQ,cAAe,GAAS,IAAI,MAAM,EAC1C,GAAK,GAAa,GAAgB,IAAc,EAC9C,MAAO,GAGT,OAAO,GAAoB,EAAS,EAAO,EAC3C,KAAM,CACN,MAAO,IAIX,SAAS,EAAmB,CAC1B,EACA,EACA,CACA,GAAI,CACF,IAAM,EAAU,GAAU,OAAO,CAAO,EAExC,GAAI,EAAQ,OAAS,GACnB,MAAO,GAGT,IAAM,EAAU,EAAQ,GACxB,OAAO,IAAY,EAAQ,YAAc,IAAY,EAAQ,WAC7D,KAAM,CACN,MAAO,IAIX,IAAM,GAAS,GAAc,EAAS,EAItC,eAAe,EAA2B,EACxC,SACA,wBAIC,CACD,IAAM,EAAO,GAAmB,CAAM,EAGhC,EAFO,GAAM,eAAe,CAAI,EAEpB,OAAO,CAAoB,EAE7C,IAAK,EAAK,WACR,MAAM,IAAI,MAAM,8BAA8B,EAGhD,IAAM,EAAU,GAAO,eAAe,OAAO,KAAK,EAAK,UAAU,EAAG,CAAE,UAAQ,CAAC,GAEvE,cAAe,GAAS,IAAI,MAAM,EACpC,EAAU,GAAqB,EAAQ,UAAW,CAAU,EAElE,MAAO,CACL,UAAU,EAAG,CACX,OAAO,QAAQ,QAAQ,CAAO,GAGhC,eAAe,CAAC,EAAY,CAC1B,QAAS,EAAI,EAAG,EAAI,EAAK,WAAY,IACnC,EAAK,UAAU,EAAG,CAAO,EAE3B,OAAO,QAAQ,QAAQ,CAAI,EAE/B,EAGF,eAAsB,EAAkB,CACtC,EASA,CACA,IAAM,EAAS,MAAM,GAAM,CAAa,EACrC,KAAK,CAAE,OAAQ,GAAE,IAAI,GAAE,OAAO,CAAE,EAAG,EAAG,YAAa,QAAQ,QAAQ,CAAM,CAAC,EAC1E,KAAK,CAAE,OAAQ,GAAE,MAAO,EAAG,EAAG,SAAQ,iBAAgB,QAAQ,KAAQ,CAErE,IAAM,EAAqB,GACzB,GAAsB,GAAM,QAAU,CAAC,GAAI,IAAK,EAAG,EAAG,CAAC,EACnD,EAAwB,GAAqB,EAAoB,CAAE,OAAM,CAAC,EAC1E,EAAuB,GAAuB,CAAqB,EAEzE,OAAO,GAA4B,CAAE,SAAQ,sBAAqB,CAAC,EACpE,EACA,UAAU,IAAM,QAAQ,QAAQ,MAAS,CAAC,GAErC,cAAa,iBAAgB,GAAY,MAAM,EAAkB,CACvE,MAAO,GAAM,MACb,QACF,CAAC,EAED,SAAS,CAAkB,CAAC,EAAoC,CAC9D,OAAO,EAAK,WAAW,EAGzB,eAAe,CAAQ,EACrB,YACA,aACA,eAAe,GAAU,QACtB,GACkB,CACrB,IAAM,EAAO,MAAM,GAAQ,WAAW,EACtC,KAAM,GAAU,GAAO,MAAM,IAAI,GAAa,wBAAwB,EAEtE,IAAM,EAAU,EAAK,UAAY,MAAM,EAAY,GAAG,GAEhD,EAAmC,IACpC,EACH,aACA,UACA,YACA,OAAQ,CACV,GAEQ,QAAS,MAAM,EAAQ,kBAAkB,CAAa,EACxD,EAAa,MAAM,EAAO,gBAAgB,CAAI,EACpD,EAAW,kBAAkB,EAC7B,IAAM,EAAQ,EAAW,mBAAmB,EAAE,MAAM,EAEpD,OAAO,EAAY,CAAK,EAG1B,MAAO,IACF,EACH,cACA,cACA,WACA,qBACA,gBAAiB,EACnB,EDhKK,IAAM,EAAkB,CAAC,EAAM,KAAM,EAAM,QAAQ,EAE1D,SAAS,EAAmB,EAC1B,SACA,UACA,QACA,OACA,SACA,gBAQC,CACD,QAAW,KAAQ,EAAQ,CACzB,IAAM,IAAgB,EAAK,cACxB,EAAgB,SAAS,CAAK,GAAK,CAAE,YAAa,EAAK,WAAY,EAEhE,EAAiB,EAAgB,SAAS,CAAK,GAAK,CACxD,eAAgB,EAAK,MAAQ,OAAO,KAAK,EAAK,MAAO,KAAK,EAAI,MAChE,EAEA,EAAK,SAAS,CAAE,KAAM,EAAK,KAAM,MAAO,EAAK,SAAU,KAAgB,CAAe,CAAC,EAGzF,QAAW,KAAU,EAAS,CAC5B,IAAM,EAAU,YAAa,GAAU,EAAO,QAAU,EAAO,QAAU,EACnE,EAAkB,EAAO,OAE/B,GAAI,IAAoB,EACtB,SAGF,IAAM,EAAe,EACjB,CACE,OAAQ,EACR,MAAO,CACT,EACA,CACE,UACA,MAAO,EAAO,KAChB,EAEJ,GAAW,EAAS,EACpB,EAAK,UAAU,CAAY,EAG7B,MAAO,CAAE,OAAM,QAAO,EAGxB,eAAe,EAAiB,EAC9B,aACA,YACA,OACA,UACA,SACA,aAAa,IAKZ,CACD,IAAM,EAAQ,EAAW,MACnB,EAAe,EAAO,MAAM,EAAY,CAAI,EAAI,KAEhD,EAAmB,MAAM,GAA0B,CACvD,aACA,YACA,OACA,SACA,YACF,CAAC,GAEO,SAAQ,WAAY,EAAa,IAAK,EAAkB,UAAS,OAAM,CAAC,EAGhF,KAAM,GAAU,GACd,MAAM,IAAI,EAAa,oCAAqC,CAAE,SAAQ,YAAW,CAAC,EACpF,IAAM,EAAa,MAAM,EAAe,EAClC,EAAO,IAAI,GAAK,CAAE,QAAS,EAAW,CAAK,CAAE,CAAC,EAEpD,GAAI,IAAU,EAAM,SAAU,EAAK,kBAAkB,SAAS,EAE9D,IAAQ,KAAM,EAAY,OAAQ,GAAiB,MAAM,GAAoB,CAC3E,SACA,UACA,QACA,OACA,SACA,cACF,CAAC,EAED,MAAO,CACL,KAAM,EACN,MAAO,EAAiB,OACxB,OAAQ,CACV,EAGF,eAAsB,EAAuB,EAAG,CAC9C,IAAM,EAAa,MAAM,EAAe,EAExC,OAAO,SAAS,CAAe,EAAG,UAAS,SAAgD,CACzF,GAAI,IAAU,EAAM,YAClB,OAAO,EAAmB,CAAO,EAGnC,GAAI,IAAU,EAAM,MAClB,OAAO,GAAqB,CAAO,EAGrC,GAAI,CAGF,OAFA,GAAW,EAAS,EACpB,GAAc,eAAe,EAAS,EAAW,CAAK,CAAC,EAChD,GACP,MAAO,EAAQ,CACf,MAAO,KAKb,eAAe,EAAoB,EACjC,QACA,SACA,kBAC+D,CAC/D,IAAM,GAAW,MAAM,EAAqB,CAAsB,GAAG,CAAE,SAAQ,gBAAe,CAAC,EAE/F,eAAe,CAAe,CAAC,EAAY,CAEzC,OADA,MAAM,EAAK,cAAc,CAAO,EACzB,EAGT,eAAe,CAAU,EAAG,CAE1B,OADsB,MAAM,GAAsB,CAAK,GAClC,CAAO,EAG9B,MAAO,CACL,aACA,iBACF,EAGF,eAAsB,CAAsC,EAC1D,WACG,GAQa,CAChB,IAAM,EAAS,WAAY,EAAgB,EAAc,OAAS,OAE5D,EAAQ,UAAW,EAAgB,EAAc,OAAS,EAAI,EAE9D,EAAiB,GACrB,mBAAoB,GAAiB,EAAc,eAC/C,EAAc,eACd,GAAqB,GAAsB,GAAQ,CAAE,OAAM,CAAC,CAClE,EAEM,EAAS,EACX,MAAM,GAAqB,CAAE,QAAO,SAAQ,gBAAe,CAAC,GAC5D,WAAY,GACV,EAAc,OACd,OAEN,SAAS,CAAU,EAAG,CACpB,OAAO,QAAQ,QAAQ,GAAQ,WAAW,CAAC,EAI7C,IAAM,EAAqB,MAAM,GAAsB,CAAK,EACtD,EAAkB,MAAM,GAAwB,EAChD,EAAoB,MAAM,EAAqB,CAAK,EAE1D,MAAO,CACL,eACA,kBACA,qBACA,aACA,gBAAiB,CAAC,IAAoB,EAAgB,CAAE,UAAS,OAAM,CAAC,EACxE,YAAa,CAAC,IAAmB,EAAW,CAAK,EAAE,YAAY,CAAM,EACrE,qBACA,oBACA,YAAa,IAAM,EAAY,CAAK,EACpC,uBACA,SAAU,GAAS,CAA4C,EAC/D,0BAA2B,CAAC,IAAuD,CAEjF,OADa,EAAkB,CAAM,EACzB,MAAM,GAGpB,WAAY,GAAW,CAAK,EAC5B,uBAAwB,GAAuB,CAAK,EACpD,0BAA2B,GAA0B,CAAK,CAC5D,EAGF,eAAe,EAAmB,EAChC,aACA,eAAe,EAAU,KACzB,UACA,OACA,SACA,aAIC,CACD,IAAM,EAAQ,EAAW,MAEnB,EAAmB,MAAM,GAA0B,CACvD,aACA,SACA,OACA,WACF,CAAC,EAEK,EAAe,EAAU,KAAK,MAAM,CAAO,GAAK,MAAM,EAAY,CAAK,GAAG,GAEhF,OAAO,EAAa,IAAK,EAAkB,QAAS,EAAc,OAAM,CAAC,EAG3E,SAAS,EAAyB,CAAC,EAAkB,CACnD,OAAO,eAAe,CAAyB,EAC7C,OACA,OACA,UACA,eAAe,EAAU,KACzB,aAAa,GAOZ,CACD,IAAM,EAAc,MAAM,EAAW,CAAK,EAAE,eAAe,CAAI,EACzD,EAAe,EAAU,KAAK,KAAK,CAAO,GAAK,MAAM,EAAY,CAAK,GAAG,GAEzE,EAAS,GAAa,KACzB,IAAI,CAAC,KAAU,IACX,EAEH,aACA,KAAM,EACR,EAAE,EACD,OACC,CAAC,IAAS,EAAK,MAAQ,KAAK,IAAI,EAAiB,CAAK,EAAG,EAAa,CAAI,EAAI,CAAY,CAC5F,EAEF,IAAK,GAAQ,OAAQ,OAAO,GAAW,KAAK,CAAE,OAAM,CAAC,EAErD,IAAM,EAAU,GAAW,KAAK,CAC9B,QACA,MAAO,EAAO,OAAO,CAAC,EAAK,IAAS,EAAM,EAAK,MAAO,CAAC,CACzD,CAAC,EAEK,EACJ,OAAO,IAAe,SACjB,MAAM,KAAK,CAAE,OAAQ,CAAW,EAAG,KAAO,CACzC,QAAS,EACT,MAAO,CACT,EAAE,EACF,EAEN,GAAI,EAAM,CACR,IAAM,EAAS,MAAM,EAAY,CAAI,EACrC,EAAQ,KAAK,CAAE,QAAS,EAAM,SAAQ,MAAO,CAAE,CAAC,EAKlD,IAAM,EAFS,EAAgB,CAAE,SAAQ,UAAS,QAAS,CAAa,CAAC,EAEpD,EAErB,OAAO,EAAQ,IAAI,CAAG,GAI1B,SAAS,EAAsB,CAAC,EAAkB,CAChD,MAAO,OAAO,IAQR,CACJ,IAAM,EAAY,MAAM,GAAoB,CAAM,EAElD,OAAO,GAAW,KAAK,CACrB,QACA,MAAO,GAAc,WAAW,OAAO,EAAU,GAAG,EAAG,CAAC,EAAE,SAAS,QAAQ,CAC7E,CAAC,GAaL,eAAsB,CAAiE,CACrF,EAOA,CACA,IAAM,EAAa,MAAM,EAAe,EAExC,OAAQ,QACD,EAAM,YACT,OAAO,SAAS,CAAiB,EAC/B,SACA,iBAAiB,GAAG,GAAe,QACnC,OAC6D,CAC7D,IAAM,EAAU,EAAW,CAAK,EAEhC,GAAI,EACF,OAAO,GAAO,QAAQ,EAAK,CAAO,EAEpC,IAAK,EACH,MAAM,IAAI,EAAa,8BAA+B,CAAE,MAAO,oBAAqB,CAAC,EAQvF,OANqB,GAAO,eAC1B,OAAO,KAAK,GAAmB,CAAM,CAAC,EACtC,CACF,EAC6B,WAAW,CAAc,EAAE,cASvD,EAAM,aACN,EAAM,cACN,EAAM,cACN,EAAM,WACN,EAAM,KACT,OAAO,SAAS,CAAiB,EAC/B,SACA,MACA,kBAC4D,CAC5D,KAAM,GAAO,GACX,MAAM,IAAI,EAAa,8BAA+B,CACpD,MAAO,uCACT,CAAC,EAEH,IAAM,EAAU,GAAc,EAAS,EACjC,EAAU,EAAW,CAAK,EAEhC,GAAI,EAAK,OAAO,EAAQ,QAAQ,EAAK,CAAO,EAE5C,IAAM,EAAO,GAAmB,CAAgB,EAC1C,EAAS,GAAM,eAAe,EAAM,CAAO,EAAE,OAAO,CAAc,EACxE,IAAK,EAAO,WACV,MAAM,IAAI,EAAa,8BAA+B,CACpD,MAAO,uCACT,CAAC,EAEH,OAAO,EAAQ,eAAe,OAAO,KAAK,EAAO,UAAU,EAAG,CAAE,SAAQ,CAAC,WAQ3E,MAAM,IAAI,EAAa,6BAA8B,CAAE,OAAM,CAAC,GAIpE,eAAsB,EAAqB,CAAC,EAAkB,CAC5D,IAAM,EAAa,MAAM,EAAe,EAExC,OAAO,SAAS,CAAkB,CAAC,EAAmC,CACpE,IAAK,EACH,MAAM,IAAI,EAAa,8BAA+B,CAAE,MAAO,uBAAwB,CAAC,EAE1F,IAAM,EAAS,EAAgB,SAAS,CAAK,EAAI,GAAS,MAAQ,GAAS,QACnE,WAAY,EAAO,CAAE,OAAQ,EAAK,UAAqB,QAAS,EAAW,CAAK,CAAE,CAAC,EAC3F,IAAK,EACH,MAAM,IAAI,EAAa,+BAAgC,CAAE,MAAO,qBAAsB,CAAC,EAEzF,OAAO,GAIX,SAAS,EAAQ,CAAC,EAAkC,CAClD,OAAO,eAAe,CAAQ,EAC5B,OACA,YACA,eACA,UACA,cACqB,CACrB,IAAM,EAAO,MAAM,GAAQ,WAAW,EAEhC,EAAQ,EAAW,MAEzB,KAAM,GAAU,GAAO,MAAM,IAAI,EAAa,wBAAwB,EACtE,IAAK,EACH,MAAM,IAAI,EAAa,8BAA+B,CACpD,MAAO,oCACT,CAAC,EACH,IAAM,EAAY,IAAY,MAAM,EAAY,CAAK,GAAG,GAAgB,EAAU,OAE1E,QAAS,MAAM,GAAkB,CACvC,YACA,QAAS,EACT,OAAQ,EACR,aACA,MACF,CAAC,EACK,EAAa,MAAM,EAAO,gBAAgB,CAAI,EAGpD,OAFA,EAAW,kBAAkB,EAEtB,EAAW,CAAK,EAAE,YAAY,EAAW,mBAAmB,EAAE,MAAM,CAAC,GAIhF,eAAe,CAAW,CAAC,EAAkB,CAC3C,IAAM,EAAmB,MAAM,EAAW,CAAK,EAAE,kBAAkB,EAEnE,MAAO,EACJ,EAAU,SAAU,GACpB,EAAU,MAAO,GAAmB,EAAkB,EAAU,IAAI,GACpE,EAAU,SAAU,GAAmB,EAAkB,EAAU,OAAO,CAC7E,EAGF,eAAe,EAAyB,EACtC,aACA,YACA,OACA,SACA,WAAY,EAAmB,IACM,CACrC,IAAM,EAAQ,EAAW,MAEnB,EAAa,GAAoB,EAAgB,SAAS,CAAK,EAOrE,MAAO,CACL,OANa,MAAM,EAAW,CAAK,EAAE,UAAU,CAAE,QAAS,EAAQ,YAAW,CAAC,EAO9E,QAAS,CACP,CAAE,QAAS,EAAW,MAAO,OAAO,EAAW,WAAW,CAAE,EAC5D,GAAI,EAAO,CAAC,CAAE,QAAS,GAAI,OAAQ,MAAM,EAAY,CAAI,EAAG,MAAO,CAAE,CAAC,EAAI,CAAC,CAC7E,CACF,ELheF,IAAM,EAAQ,GAAM,YAEb,SAAS,CAAW,CAAC,EAAiB,CAC3C,OAAO,EAAQ,QAAQ,0BAA2B,EAAE,EAG/C,SAAS,CAAkB,CAAC,EAAiB,CAClD,IAAM,EAAkB,EAAY,CAAO,EAC3C,OACE,GAAe,CAAe,GAAK,GAAqB,CAAe,cAIpE,SAAS,CAAkB,CAAC,EAAiB,CAClD,OAAO,EAAY,EAAc,CAAO,CAAC,EAG3C,eAAe,EAAoB,CAAC,EAAiB,CACnD,eAAe,CAAe,EAC5B,UACA,SACyD,CAKzD,OAJA,EAAM,QAAQ,CAAC,EAAM,IAAU,CAC7B,EAAQ,KAAK,EAAO,EAAM,OAAW,GAAM,EAAK,aAAa,KAAK,EACnE,EAEM,EAAQ,MAAM,EAQvB,MAAO,CACL,WANiB,IAAM,CACvB,IAAM,EAAU,EAAK,WAAW,CAAC,EACjC,OAAO,QAAQ,QAAQ,EAAmB,CAAO,CAAC,GAKlD,iBACF,EAGF,eAAsB,EAA6C,CACjE,EAOA,CACA,IAAM,EAAS,WAAY,EAAgB,EAAc,OAAS,OAE5D,EAAQ,UAAW,EAAgB,EAAc,OAAS,EAAI,EAE9D,EAAiB,GACrB,mBAAoB,GAAiB,EAAc,eAC/C,EAAc,eACd,GAAqB,GAAsB,GAAQ,CAAE,OAAM,CAAC,CAClE,EAEM,GAAQ,MAAM,EAAqB,CAAK,GAAG,CAAE,SAAQ,gBAAe,CAAC,EAErE,EAAS,EACX,MAAM,GAAqB,CAAI,GAC/B,WAAY,GACV,EAAc,OACd,OAEN,SAAS,CAAU,EAAG,CACpB,OAAO,QAAQ,QAAQ,GAAQ,WAAW,CAAC,EAG7C,IAAQ,aAAY,cAAa,iBAAgB,GAAY,MAAM,EAAkB,CAAE,OAAM,CAAC,EAE9F,SAAS,CAAgB,CAAC,EAAiB,EAAc,GAAM,CAC7D,OAAO,EAAW,EAAY,EAAc,CAAO,CAAC,CAAC,EAGvD,MAAO,IACF,EACH,aACA,cACA,qBACA,WACA,sBACA,WAAY,EACZ,cACA,cACA,qBACA,gBAAiB,EACjB,SAAU,GAAS,CAAE,cAAa,cAAa,QAAO,CAAC,CACzD,EAGF,eAAe,EAAiB,EAC9B,aACA,YACA,OACA,UACA,UACoB,CACpB,IAAK,EAAmB,CAAS,EAC/B,MAAM,IAAI,EAAa,+BAAgC,CAAE,QAAS,CAAU,CAAC,EAC/E,IAAM,EAAQ,MAAM,EAAW,CAAK,EAAE,UAAU,CAC9C,QAAS,EAAmB,CAAM,EAClC,WAAY,EACd,CAAC,EAEK,EAAe,EAAO,MAAM,EAAY,CAAI,EAAI,KAEhD,EAAgC,CAAC,EAEvC,EAAc,KAAK,CACjB,QAAS,EACT,MAAO,EAAW,aAAa,QAAQ,CACzC,CAAC,EACD,IAAQ,SAAQ,WAAY,EAAa,CACvC,OAAQ,EACR,QAAS,EACT,UACA,OACF,CAAC,EAGD,KAAM,GAAU,GACd,MAAM,IAAI,EAAa,oCAAqC,CAAE,SAAQ,YAAW,CAAC,EACpF,IAAM,EAAa,MAAM,EAAe,EAClC,EAAU,IAAI,GAAmB,EAAW,CAAK,CAAC,EAExD,MAAM,QAAQ,IACZ,EAAO,IAAI,MAAO,IAAmB,CACnC,IAAM,EAAQ,MAAM,EAAW,CAAK,EAAE,SAAS,EAAK,IAAI,EAExD,EAAQ,SAAS,GAAY,WAAW,OAAO,KAAK,EAAO,KAAK,CAAC,EAAG,EAAK,KAAK,EAC/E,CACH,EAEA,QAAW,KAAU,EAAS,CAC5B,IAAM,EACJ,YAAa,GAAU,EAAO,QAAU,EAAO,QAAU,EAAgB,CAAM,EAC3E,EAAa,MAAM,EAAe,EAClC,EAAe,GAAW,eAAe,EAAgB,CAAO,EAAG,EAAW,CAAK,CAAC,EAE1F,EAAQ,UAAU,EAAc,EAAO,KAAK,EAI9C,GAAI,EACF,EAAQ,UAAU,EAAc,CAAC,EAGnC,MAAO,CAAE,UAAS,MAAO,CAAO,EAGlC,SAAS,EAAQ,EACf,cACA,cACA,UAKC,CACD,OAAO,eAAe,CAAQ,EAC5B,YACA,aACA,eAAe,GAAU,QACtB,GACkB,CACrB,IAAM,EAAO,MAAM,GAAQ,WAAW,EACtC,KAAM,GAAU,GAAO,MAAM,IAAI,EAAa,wBAAwB,EACtE,IAAK,EACH,MAAM,IAAI,EAAa,8BAA+B,CACpD,MAAO,oCACT,CAAC,EAEH,IAAM,EAAU,EAAK,UAAY,MAAM,EAAY,GAAG,IAG9C,UAAS,SAAU,MAAM,GAAkB,IAC9C,EACH,aACA,UACA,YACA,OAAQ,CACV,CAAC,EAGK,GADK,MAAM,EAAO,gBAAgB,CAAE,UAAS,OAAM,CAAC,GACzC,MAAM,EAEvB,OAAO,EAAY,CAAK,GAK5B,eAAe,EAAO,EAAG,aAAY,YAAW,OAAM,UAAS,UAA6B,CAC1F,IAAM,EAAuB,EAAc,CAAS,EACpD,IAAK,EAAmB,CAAoB,EAC1C,MAAM,IAAI,EAAa,+BAAgC,CAAE,QAAS,CAAqB,CAAC,EAE1F,IAAM,EAAQ,MAAM,EAAW,CAAK,EAAE,UAAU,CAC9C,QAAS,EAAmB,CAAM,EAClC,WAAY,EACd,CAAC,EAEK,EAAe,OAAO,EAAQ,QAAQ,CAAC,CAAC,EACxC,EAAe,EAAO,MAAM,EAAY,CAAI,EAAI,KAEhD,EAAgB,CAAC,EASvB,GANA,EAAc,KAAK,CACjB,QAAS,EAAgB,CAAS,EAClC,MAAO,EAAW,aAAa,QAAQ,CACzC,CAAC,EAGG,EACF,EAAc,KAAK,CAAE,OAAQ,EAAc,MAAO,CAAE,CAAC,EAGvD,IAAQ,SAAQ,WAAY,EAAa,CACvC,OAAQ,EACR,QAAS,EACT,QAAS,EACT,OACF,CAAC,EAGD,KAAM,GAAU,GACd,MAAM,IAAI,EAAa,oCAAqC,CAAE,SAAQ,YAAW,CAAC,EACpF,IAAM,EAAa,MAAM,EAAe,EAClC,EAAO,IAAI,GAAK,CAAE,QAAS,EAAW,CAAK,CAAE,CAAC,EAEpD,QAAa,OAAM,QAAO,iBAAiB,EACzC,EAAK,SAAS,CAAE,OAAM,QAAO,aAAY,CAAC,EAI5C,QAAW,KAAU,EAAS,CAC5B,IAAM,EACJ,YAAa,GAAU,EAAO,QAAU,EAAO,QAAU,EAAgB,CAAM,EAC3E,EAAS,EAAO,OAClB,EACE,CAAE,OAAQ,EAAc,MAAO,CAAE,EACjC,OACF,CAAE,UAAS,MAAO,EAAO,KAAM,EAEnC,GAAI,EACF,EAAK,UAAU,CAAM,EAIzB,MAAO,CAAE,OAAM,QAAO,OAAQ,CAAqB,EAGrD,SAAS,EAAkB,CAAC,EAAkD,CAC5E,IAAM,EAAU,EAAK,WAAW,CAAC,EACjC,OAAO,EAAmB,CAAO,ED3PnC,eAAsB,EAA6C,CACjE,EACA,EAO2B,CAC3B,OAAQ,QACD,EAAM,YAET,OADgB,MAAM,GAAiB,CAA8C,OAIlF,EAAM,MAET,OADgB,MAAM,GAAmB,CAAwC,OAI9E,EAAM,aACN,EAAM,cACN,EAAM,cACN,EAAM,KAKT,OAJgB,MAAM,EAAkB,CACtC,WACI,CACN,CAAC,UAKD,MAAM,IAAI,GAAa,6BAA8B,CAAE,OAAM,CAAC",
15
+ "debugId": "547CB235D14B555D64756E2164756E21",
16
16
  "names": []
17
17
  }
package/package.json CHANGED
@@ -155,5 +155,5 @@
155
155
  "type-check:go": "tsgo"
156
156
  },
157
157
  "type": "module",
158
- "version": "4.0.0-beta.43"
158
+ "version": "4.0.0-beta.44"
159
159
  }
@@ -104,23 +104,14 @@ async function getSuggestedTxFee(chain: Chain) {
104
104
  }
105
105
 
106
106
  async function blockchairRequest<T>(url: string, apiKey?: string): Promise<T> {
107
- try {
108
- const response = await RequestClient.get<BlockchairResponse<T>>(url);
109
- if (!response || response.context.code !== 200)
110
- throw new SwapKitError("toolbox_utxo_api_error", { error: `Failed to query ${url}` });
111
-
112
- return response.data as T;
113
- } catch (error) {
114
- if (!apiKey) throw error;
115
- const response = await RequestClient.get<BlockchairResponse<T>>(
116
- `${url}${apiKey ? `&key=${apiKey}` : ""}`,
117
- );
107
+ const response = await RequestClient.get<BlockchairResponse<T>>(
108
+ `${url}${apiKey ? `${url.includes("?") ? "&" : "?"}key=${apiKey}` : ""}`,
109
+ );
118
110
 
119
- if (!response || response.context.code !== 200)
120
- throw new SwapKitError("toolbox_utxo_api_error", { error: `Failed to query ${url}` });
111
+ if (!response || response.context.code !== 200)
112
+ throw new SwapKitError("toolbox_utxo_api_error", { error: `Failed to query ${url}` });
121
113
 
122
- return response.data as T;
123
- }
114
+ return response.data as T;
124
115
  }
125
116
 
126
117
  async function getAddressData({ address, chain, apiKey }: BlockchairParams<{ address?: string }>) {