@swapkit/wallet-hardware 4.9.7 → 4.9.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/trezor/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var Dj={};n(Dj,{trezorWallet:()=>o,TREZOR_SUPPORTED_CHAINS:()=>Wj});module.exports=a(Dj);var s=require("@scure/bip32"),j=require("@swapkit/helpers"),M=require("@swapkit/toolboxes/utxo"),y=require("@swapkit/utxo-signer"),p=require("@swapkit/wallet-core"),t=new Set(["auto","iframe","popup","suite-desktop","suite-web"]),e=new Set(["BridgeTransport","WebUsbTransport","NodeUsbTransport"]),i=new Map,l;async function jj(){i.clear();let q=(async()=>{try{await(await import("@trezor/connect-web")).default.dispose()}catch{}})();if(l=q,await q,l===q)l=void 0}function qj(q){return typeof q==="string"&&t.has(q)?q:void 0}function Bj(q){if(!Array.isArray(q))return;let B=q.filter((Z)=>typeof Z==="string"&&e.has(Z));return B.length>0?B:void 0}function r(q){if(q.length<2||q[0]!==106)return null;let B=q[1];if(B===void 0||q.length<2+B)return null;return Buffer.from(q.slice(2,2+B)).toString("hex")}function Gj(q){switch(q[0]){case 84:return{input:"SPENDWITNESS",output:"PAYTOWITNESS"};case 49:return{input:"SPENDP2SHWITNESS",output:"PAYTOP2SHWITNESS"};case 44:return{input:"SPENDADDRESS",output:"PAYTOADDRESS"};default:return null}}function x(q){return q.map((B,Z)=>Z<3?(B|2147483648)>>>0:B)}function Jj(q){return Array.isArray(q)&&q[0]instanceof Uint8Array&&typeof q[1]==="object"&&q[1]!==null&&typeof q[1].fingerprint==="number"&&Array.isArray(q[1].path)}function Qj(q){if(!Array.isArray(q.bip32Derivation))return;let[B]=q.bip32Derivation;return Jj(B)?B:void 0}function Uj(q){if(q.witnessUtxo?.amount!==void 0)return q.witnessUtxo.amount.toString();let B=q.index!==void 0?q.nonWitnessUtxo?.outputs?.[q.index]:void 0;if(B?.amount!==void 0)return B.amount.toString();return}function Xj(q){let B=Buffer.from(q,"hex"),Z=B[1]!==void 0?B[1]+2:void 0;if(Z!==void 0&&B.length===Z)return new Uint8Array([...B,1]);return new Uint8Array(B)}function Yj(q,B,Z){let S=[];for(let $=0;$<q.inputsLength;$++){let G=q.getInput($);S.push({address_n:B,amount:G.value.toString(),prev_hash:Z.encode(new Uint8Array([...G.txid].reverse())),prev_index:G.index,script_type:"SPENDADDRESS"})}return S}async function Zj(q,B,Z,S){let $=[];for(let G=0;G<q.outputsLength;G++){let U=q.getOutput(G),Y=U.scriptPubkey;if(U.value===0n&&Y?.length>0&&Y[0]===106){let Q=r(Y);if(Q){$.push({amount:"0",op_return_data:Q,script_type:"PAYTOOPRETURN"});continue}throw new j.SwapKitError({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:S,error:"Malformed OP_RETURN output cannot be signed"}})}let D=await $j(Y);if(!D&&U.value>0n)throw new j.SwapKitError({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:S,error:"Unable to decode output address from scriptPubkey"}});if(D===Z)$.push({address_n:B,amount:U.value.toString(),script_type:"PAYTOADDRESS"});else $.push({address:D,amount:U.value.toString(),script_type:"PAYTOADDRESS"})}return $}async function $j(q){try{let{OutScript:B,Address:Z}=await import("@swapkit/utxo-signer"),S=B.decode(q);if(S.type==="pkh"||S.type==="pk")return Z(y.NETWORKS.zcash).encode(S)}catch{}return}async function Sj(q,B){let{ZcashTransaction:Z,Script:S}=await import("@swapkit/utxo-signer"),$=Z.fromHex(q,{allowUnknownOutputs:!0}),G=B.clone();for(let U=0;U<$.inputsLength;U++){let D=$.getInput(U).script;if(D&&D.length>0){let P=S.decode(D);if(P.length>=2)G.addSignature(U,P[1],P[0])}}return G}function Nj(q,B,Z,S){let $=[];for(let G=0;G<q.inputsLength;G++){let U=q.getInput(G),Y=B[G];$.push({address_n:Z,amount:Y?.value?.toString()||"0",prev_hash:U.txid?S.encode(new Uint8Array([...U.txid].reverse())):"",prev_index:U.index??0,script_type:"SPENDADDRESS"})}return $}function Vj(q,B,Z,S){let $=[];for(let G=0;G<q.outputsLength;G++){let U=q.getOutput(G),Y=q.getOutputAddress(G,y.NETWORKS.zcash),D=U.script;if(U.amount===0n&&D?.length>0&&D[0]===106){let F=r(D);if(F){$.push({amount:"0",op_return_data:F,script_type:"PAYTOOPRETURN"});continue}continue}if(!Y&&(U.amount??0n)>0n)throw new j.SwapKitError({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:S,error:"Unable to decode output address"}});let Q=Y===Z||!Y?{address_n:B}:{address:Y};$.push({...Q,amount:U.amount?.toString()||"0",script_type:"PAYTOADDRESS"})}return $}function d(q,B,Z,S,$,G,U,Y,D){let P=[];for(let Q=0;Q<q.outputsLength;Q++){let F=q.getOutput(Q),R=q.getOutputAddress(Q,B);if(!R){let T=F.script?r(F.script):null;if(T!==null||$){P.push({amount:"0",op_return_data:T??Buffer.from($).toString("hex"),script_type:"PAYTOOPRETURN"});continue}throw new j.SwapKitError({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:G,error:"Unable to decode output address from scriptPubkey"}})}if(F.amount===void 0)throw new j.SwapKitError({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:G,error:"Output amount is missing"}});let z=G===j.Chain.BitcoinCash,H=z?Y(R):R,v=z?D(H)===D(S):H===S;P.push(v?{address_n:Z,amount:F.amount.toString(),script_type:U.output}:{address:H,amount:F.amount.toString(),script_type:"PAYTOADDRESS"})}return P}async function Ej({chain:q,derivationPath:B}){switch(q){case j.Chain.Arbitrum:case j.Chain.Aurora:case j.Chain.Avalanche:case j.Chain.Base:case j.Chain.Berachain:case j.Chain.BinanceSmartChain:case j.Chain.Ethereum:case j.Chain.Gnosis:case j.Chain.Monad:case j.Chain.Optimism:case j.Chain.Polygon:case j.Chain.XLayer:{let{getProvider:Z,getEvmToolboxAsync:S}=await import("@swapkit/toolboxes/evm"),{getEVMSigner:$}=await import("../chunk-d54qkn5p.js"),G=await Z(q),U=await $({chain:q,derivationPath:B,provider:G}),Y=await U.getAddress();return{...await S(q,{provider:G,signer:U}),address:Y}}case j.Chain.Zcash:{let{getUtxoToolbox:Z}=await import("@swapkit/toolboxes/utxo"),S=j.derivationPathToString(B),G=await(async()=>{let Q=(await import("@trezor/connect-web")).default,{success:F,payload:R}=await Q.getAddress({coin:"zcash",path:S});if(!F)throw new j.SwapKitError({errorKey:"wallet_trezor_failed_to_get_address",info:{chain:q,error:R.error||"Unknown error"}});return R.address})(),U={getAddress:async()=>G,signPCZT:async(Q)=>{let F=(await import("@trezor/connect-web")).default,{hex:R}=await import("@scure/base"),z=x(B),H=Q.getGlobal(),v=Yj(Q,z,R),T=await Zj(Q,z,G,q),b=await F.signTransaction({branchId:H.consensusBranchId,coin:"zcash",expiry:H.expiryHeight,inputs:v,locktime:H.lockTime,outputs:T,overwintered:!0,version:H.txVersion,versionGroupId:H.versionGroupId});if(!b.success)throw new j.SwapKitError({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:q,error:b.payload.error}});return Sj(b.payload.serializedTx,Q)},signTransaction:async(Q,F)=>{let R=(await import("@trezor/connect-web")).default,{hex:z}=await import("@scure/base"),H=x(B),v=Nj(Q,F,H,z),T=Vj(Q,H,G,q),b=await R.signTransaction({branchId:y.ZcashConsensusBranchId.NU6,coin:"zcash",expiry:0,inputs:v,locktime:0,outputs:T,overwintered:!0,version:4,versionGroupId:y.ZcashVersionGroupId.SAPLING});if(b.success)return b.payload.serializedTx;throw new j.SwapKitError({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:q,error:b.payload.error}})}},Y=Z(j.Chain.Zcash),D=async(Q)=>{if(!(G&&Q.recipient))throw new j.SwapKitError({errorKey:"wallet_missing_params",info:{address:G,recipient:Q.recipient,wallet:j.WalletOption.TREZOR}});let F=Q.feeRate||(await Y.getFeeRates())[Q.feeOptionKey||j.FeeOption.Fast],{tx:R,inputs:z}=await Y.createTransaction({...Q,feeRate:F,fetchTxHex:!1,sender:G}),H=await U.signTransaction(R,z);return await Y.broadcastTx(H)},P=async(Q)=>{if(!(G&&Q.recipient))throw new j.SwapKitError({errorKey:"wallet_missing_params",info:{address:G,recipient:Q.recipient,wallet:j.WalletOption.TREZOR}});let{createPCZT:F,OutScript:R}=await import("@swapkit/utxo-signer"),{hex:z}=await import("@scure/base"),{getUtxoApi:H}=await import("@swapkit/toolboxes/utxo"),v=Q.feeRate||(await Y.getFeeRates())[Q.feeOptionKey||j.FeeOption.Fast],T=await H(j.Chain.Zcash).getUtxos({address:G}),{tx:b,inputs:m}=await Y.createTransaction({...Q,feeRate:v,fetchTxHex:!1,sender:G}),I=F();for(let J of m){let N=T.find((X)=>X.hash===J.hash&&X.index===J.index),E=N?.witnessUtxo?.script?new Uint8Array(N.witnessUtxo.script):R.encode({hash:z.decode(J.address||""),type:"pkh"});I.addInput({index:J.index,scriptPubkey:E,txid:z.decode(J.hash).reverse(),value:BigInt(J.value)})}for(let J=0;J<b.outputsLength;J++){let N=b.getOutput(J);I.addOutput({scriptPubkey:N.script||new Uint8Array,value:N.amount||0n})}let f=await U.signPCZT(I);f.finalizeAllInputs();let h=f.extract();return await Y.broadcastTx(h.toHex())};return{...Y,address:G,signPCZT:U.signPCZT,signTransaction:U.signTransaction,transfer:D,transferWithPCZT:P}}case j.Chain.Bitcoin:case j.Chain.BitcoinCash:case j.Chain.Dash:case j.Chain.Dogecoin:case j.Chain.Litecoin:{let I=function(J={}){return m(J)},{toCashAddress:Z,getUtxoToolbox:S,stripPrefix:$}=await import("@swapkit/toolboxes/utxo"),G=q,U=Gj(B);if(!U)throw new j.SwapKitError({errorKey:"wallet_trezor_derivation_path_not_supported",info:{derivationPath:B}});let Y=q.toLowerCase(),D=async(J=B)=>{let N=(await import("@trezor/connect-web")).default,{success:E,payload:X}=await N.getAddress({coin:Y,path:j.derivationPathToString(J),showOnTrezor:!1});if(!E)throw new j.SwapKitError({errorKey:"wallet_trezor_failed_to_get_address",info:{chain:q,error:X.error||"Unknown error"}});if(q===j.Chain.BitcoinCash)return $(X.address);return X.address};async function P(){let J=await m(),N=Number(B[4]??0),E=Boolean(B[3]??0);try{let X=M.deriveAddressesFromXpub({accountIndex:J.accountIndex,chain:G,count:1,startIndex:N,xpub:J.xpub}).find((w)=>w.change===E&&w.index===N);if(!X)throw new j.SwapKitError({errorKey:"wallet_trezor_failed_to_get_address",info:{chain:q,error:"Unable to derive address from Trezor account public key"}});return X.address}catch(X){if(X instanceof j.SwapKitError)throw X;throw new j.SwapKitError({errorKey:"wallet_trezor_failed_to_get_address",info:{chain:q,error:X instanceof Error?X.message:"Unable to derive address from Trezor xpub"}})}}let Q=q===j.Chain.Bitcoin||q===j.Chain.Litecoin?await P():await D(),F=S(q),R=async(J,N,E="")=>{let X=(await import("@trezor/connect-web")).default,w=x(B),O=M.getNetworkForChain(q),k=d(J,O,w,Q,E,q,U,Z,$),_=N.map(({hash:C,index:V,value:W})=>({address_n:w,amount:W,prev_hash:C,prev_index:V,script_type:U.input})),L=await X.signTransaction({coin:Y,inputs:_,outputs:k});if(L.success)return L.payload.serializedTx;let K=L.payload;throw new j.SwapKitError({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:q,code:K?.code??"unknown",error:K?.error??"unknown",payload:K}})},z=async(J)=>{let N=(await import("@trezor/connect-web")).default,{hex:E}=await import("@scure/base"),X=x(B),w=M.getNetworkForChain(q),O;async function k(){if(!O){let V=await m(),A=s.HDKey.fromExtendedKey(V.xpub).derive(`m/${Number(B[3]??0)}/${Number(B[4]??0)}`);if(!A.publicKey)throw new j.SwapKitError({errorKey:"wallet_trezor_failed_to_get_public_key",info:{chain:q,error:"Unable to derive Trezor leaf public key from account xpub"}});O=A.publicKey}return[O,{fingerprint:0,path:X}]}let _=[],L=[];for(let V=0;V<J.inputsLength;V++){let W=J.getInput(V),A=Qj(W),g=A??await k(),u=Uj(W);if(!W.txid||W.index===void 0||!u)throw new j.SwapKitError({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:q,error:`Input ${V} is missing prevout data required by Trezor`}});if(_[V]=g[0],!A)J.updateInput(V,{bip32Derivation:[g]});L.push({address_n:g[1].path,amount:u,prev_hash:E.encode(W.txid),prev_index:W.index,script_type:U.input,...W.sequence!==void 0?{sequence:W.sequence}:{}})}let K=d(J,w,X,Q,"",q,U,Z,$),C=await N.signTransaction({coin:Y,inputs:L,locktime:J.lockTime,outputs:K,version:J.version});if(!C.success){let V=C.payload;throw new j.SwapKitError({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:q,code:V?.code??"unknown",error:V?.error??"unknown",payload:V}})}return C.payload.signatures.forEach((V,W)=>{let A=_[W];if(!(V&&A))return;J.updateInput(W,{partialSig:[[A,Xj(V)]]})}),J},H=async(J,N,E="")=>{let X=(await import("@trezor/connect-web")).default,w=M.getNetworkForChain(q),O=x(B.slice(0,3)),k=d(J,w,O,Q,E,q,U,Z,$),_=N.map(({hash:K,index:C,value:V,derivationIndex:W,isChange:A})=>{let g=A?1:0;return{address_n:[...O,g,W],amount:V,prev_hash:K,prev_index:C,script_type:U.input}}),L=await X.signTransaction({coin:Y,inputs:_,outputs:k});if(L.success)return L.payload.serializedTx;throw new j.SwapKitError({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:q,error:L.payload.error}})},v=async({utxos:J,recipient:N,assetValue:E,memo:X,feeRate:w,feeOptionKey:O})=>{let k=S(q),_=w||(await k.getFeeRates())[O||j.FeeOption.Fast],{tx:L,inputs:K}=await k.createTransaction({assetValue:E,feeRate:_,fetchTxHex:!0,memo:X,recipient:N,sender:Q}),C=K.map((W)=>{let A=J.find((g)=>g.hash===W.hash&&g.index===W.index);return{...W,derivationIndex:A?.derivationIndex??0,isChange:A?.isChange??!1}}),V=await H(L,C,X);return k.broadcastTx(V)},T=async({recipient:J,feeOptionKey:N,feeRate:E,memo:X,...w})=>{if(!(Q&&J))throw new j.SwapKitError({errorKey:"wallet_missing_params",info:{address:Q,memo:X,recipient:J,wallet:j.WalletOption.TREZOR}});let O=S(q),k=E||(await O.getFeeRates())[N||j.FeeOption.Fast],_=O.createTransaction,{tx:L,inputs:K}=await _({...w,feeRate:k,fetchTxHex:!0,memo:X,recipient:J,sender:Q}),C=await R(L,K,X);return await O.broadcastTx(C)},b=q===j.Chain.Bitcoin||q===j.Chain.Litecoin?await S(G,{signer:{getAddress:async()=>Q,signTransaction:z}}):F;async function m({accountIndex:J}={}){let N=(await import("@trezor/connect-web")).default,E=M.getUTXOAccountPath({accountIndex:J,chain:G,derivationPath:B}),X=j.derivationPathToString(E),w=`${q}:${X}`,O=i.get(w);if(O)return O;let{success:k,payload:_}=await N.getPublicKey({coin:Y,path:X});if(!k)throw new j.SwapKitError({errorKey:"wallet_trezor_failed_to_get_public_key",info:{chain:q,error:_.error||"Unknown error"}});let L={accountIndex:M.getUTXOAccountIndexFromPath(E),chainCode:_.chainCode,depth:_.depth,fingerprint:_.fingerprint,path:_.serializedPath,publicKey:_.publicKey,xpub:_.xpub,xpubSegwit:_.xpubSegwit};return i.set(w,L),L}async function f({accountIndex:J,index:N,change:E=!1}){M.assertDerivationIndex("index",N);let X=(await import("@trezor/connect-web")).default,w=M.getUTXOAccountPath({accountIndex:J,chain:G,derivationPath:B}),O=`${j.derivationPathToString(w)}/${Number(E)}/${N}`,{success:k,payload:_}=await X.getAddress({coin:Y,path:O,showOnTrezor:!1});if(!k)return;let L=_.address;if(q===j.Chain.BitcoinCash)L=(await S(q)).stripPrefix(_.address);let K=await X.getPublicKey({coin:Y,path:O}),C=K.success?K.payload.publicKey:"";return{accountIndex:M.getUTXOAccountIndexFromPath(w),address:L,change:E,index:N,path:O,pubkey:C}}async function h({accountIndex:J,count:N,startIndex:E=0,change:X=!1}){M.assertDerivationIndex("count",N),M.assertDerivationIndex("startIndex",E);let w=(await import("@trezor/connect-web")).default,O=M.getUTXOAccountPath({accountIndex:J,chain:G,derivationPath:B}),k=j.derivationPathToString(O),_=Array.from({length:N},(V,W)=>({coin:Y,path:`${k}/${Number(X)}/${E+W}`,showOnTrezor:!1})),{success:L,payload:K}=await w.getAddress({bundle:_});if(!L||!Array.isArray(K))return[];return await Promise.all(K.map(async(V,W)=>{let A=V.address;if(q===j.Chain.BitcoinCash)A=(await S(q)).stripPrefix(V.address);return{accountIndex:M.getUTXOAccountIndexFromPath(O),address:A,change:X,index:E+W,path:`${k}/${Number(X)}/${E+W}`,pubkey:""}}))}let c=M.createHDWalletHelpers({chain:q,deriveAddress:f,getBalance:b.getBalance,getUtxos:(J)=>M.getUtxoApi(q).getUtxos({address:J,fetchTxHex:!0})});return{...b,...c,address:Q,deriveAddressAtIndex:f,deriveAddresses:h,getExtendedPublicKey:I,getExtendedPublicKeyInfo:m,signTransaction:R,signTransactionWithMultipleInputs:H,transfer:T,transferFromMultipleAddresses:v}}default:throw new j.SwapKitError({errorKey:"wallet_chain_not_supported",info:{chain:q,wallet:j.WalletOption.TREZOR}})}}var o=p.createWallet({connect:({addChain:q,supportedChains:B,walletType:Z})=>async function($,G){let[U]=j.filterSupportedChains({chains:$,supportedChains:B,walletType:Z});if(!U)throw new j.SwapKitError({errorKey:"wallet_chain_not_supported",info:{chain:U,wallet:j.WalletOption.TREZOR}});let Y=(await import("@trezor/connect-web")).default,D=j.SKConfig.get("integrations").trezor,{connectSrc:P,coreMode:Q,debug:F,interactionTimeout:R,lazyLoad:z,pendingTransportEvent:H,popup:v,transportReconnect:T,transports:b,...m}=D??{},I={...m,appName:String(D?.appName||"SwapKit"),appUrl:String(D?.appUrl||""),email:String(D?.email||"")},f=typeof globalThis.location<"u"&&["localhost","127.0.0.1"].includes(globalThis.location.hostname),h=f?"popup":qj(Q),c=f?["WebUsbTransport"]:Bj(b);if(l)await l;if(f)await Y.dispose();await Y.init({connectSrc:P,coreMode:h,debug:F,interactionTimeout:R,lazyLoad:f?!1:z??!0,manifest:I,pendingTransportEvent:H,popup:f?!0:v,transportReconnect:T,transports:c});let J=await Ej({chain:U,derivationPath:G});return q({...J,chain:U,disconnect:jj,walletType:Z}),!0},directSigningSupport:{[j.Chain.Arbitrum]:!0,[j.Chain.Aurora]:!0,[j.Chain.Avalanche]:!0,[j.Chain.Base]:!0,[j.Chain.Berachain]:!0,[j.Chain.BinanceSmartChain]:!0,[j.Chain.Bitcoin]:!0,[j.Chain.Ethereum]:!0,[j.Chain.Gnosis]:!0,[j.Chain.Litecoin]:!0,[j.Chain.Monad]:!0,[j.Chain.Optimism]:!0,[j.Chain.Polygon]:!0,[j.Chain.XLayer]:!0},name:"connectTrezor",supportedChains:[j.Chain.Arbitrum,j.Chain.Aurora,j.Chain.Avalanche,j.Chain.Base,j.Chain.Berachain,j.Chain.BinanceSmartChain,j.Chain.Bitcoin,j.Chain.BitcoinCash,j.Chain.Dash,j.Chain.Dogecoin,j.Chain.Ethereum,j.Chain.Gnosis,j.Chain.Litecoin,j.Chain.Monad,j.Chain.Optimism,j.Chain.Polygon,j.Chain.XLayer,j.Chain.Zcash],walletType:j.WalletOption.TREZOR}),Wj=p.getWalletSupportedChains(o);
|
|
1
|
+
var Fj={};e(Fj,{trezorWallet:()=>n,TREZOR_SUPPORTED_CHAINS:()=>_j});module.exports=t(Fj);var a=require("@scure/bip32"),q=require("@swapkit/helpers"),M=require("@swapkit/toolboxes/utxo"),y=require("@swapkit/utxo-signer"),p=require("@swapkit/wallet-core"),jj=new Set(["auto","iframe","popup","suite-desktop","suite-web"]),qj=new Set(["BridgeTransport","WebUsbTransport","NodeUsbTransport"]),s={appName:"SwapKit",appUrl:"https://swapkit.dev",email:"support@swapkit.dev"},Bj=["WebUsbTransport"],r=new Map,l;async function Gj(){r.clear();let j=(async()=>{try{await(await import("@trezor/connect-web")).default.dispose()}catch{}})();if(l=j,await j,l===j)l=void 0}function Jj(j){return typeof j==="string"&&jj.has(j)?j:void 0}function Qj(j){if(!Array.isArray(j))return;let B=j.filter((Z)=>typeof Z==="string"&&qj.has(Z));return B.length>0?B:void 0}function d(j,B){return typeof j==="string"&&j.trim()?j:B}function Uj(){return typeof globalThis.location<"u"&&globalThis.location.origin?globalThis.location.origin:s.appUrl}function o(j){if(j.length<2||j[0]!==106)return null;let B=j[1];if(B===void 0||j.length<2+B)return null;return Buffer.from(j.slice(2,2+B)).toString("hex")}function Xj(j){switch(j[0]){case 84:return{input:"SPENDWITNESS",output:"PAYTOWITNESS"};case 49:return{input:"SPENDP2SHWITNESS",output:"PAYTOP2SHWITNESS"};case 44:return{input:"SPENDADDRESS",output:"PAYTOADDRESS"};default:return null}}function x(j){return j.map((B,Z)=>Z<3?(B|2147483648)>>>0:B)}function Yj(j){return Array.isArray(j)&&j[0]instanceof Uint8Array&&typeof j[1]==="object"&&j[1]!==null&&typeof j[1].fingerprint==="number"&&Array.isArray(j[1].path)}function Zj(j){if(!Array.isArray(j.bip32Derivation))return;let[B]=j.bip32Derivation;return Yj(B)?B:void 0}function $j(j){if(j.witnessUtxo?.amount!==void 0)return j.witnessUtxo.amount.toString();let B=j.index!==void 0?j.nonWitnessUtxo?.outputs?.[j.index]:void 0;if(B?.amount!==void 0)return B.amount.toString();return}function Sj(j){let B=Buffer.from(j,"hex"),Z=B[1]!==void 0?B[1]+2:void 0;if(Z!==void 0&&B.length===Z)return new Uint8Array([...B,1]);return new Uint8Array(B)}function Lj(j,B,Z){let S=[];for(let $=0;$<j.inputsLength;$++){let G=j.getInput($);S.push({address_n:B,amount:G.value.toString(),prev_hash:Z.encode(new Uint8Array([...G.txid].reverse())),prev_index:G.index,script_type:"SPENDADDRESS"})}return S}async function Nj(j,B,Z,S){let $=[];for(let G=0;G<j.outputsLength;G++){let U=j.getOutput(G),Y=U.scriptPubkey;if(U.value===0n&&Y?.length>0&&Y[0]===106){let Q=o(Y);if(Q){$.push({amount:"0",op_return_data:Q,script_type:"PAYTOOPRETURN"});continue}throw new q.SwapKitError({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:S,error:"Malformed OP_RETURN output cannot be signed"}})}let W=await Vj(Y);if(!W&&U.value>0n)throw new q.SwapKitError({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:S,error:"Unable to decode output address from scriptPubkey"}});if(W===Z)$.push({address_n:B,amount:U.value.toString(),script_type:"PAYTOADDRESS"});else $.push({address:W,amount:U.value.toString(),script_type:"PAYTOADDRESS"})}return $}async function Vj(j){try{let{OutScript:B,Address:Z}=await import("@swapkit/utxo-signer"),S=B.decode(j);if(S.type==="pkh"||S.type==="pk")return Z(y.NETWORKS.zcash).encode(S)}catch{}return}async function Ej(j,B){let{ZcashTransaction:Z,Script:S}=await import("@swapkit/utxo-signer"),$=Z.fromHex(j,{allowUnknownOutputs:!0}),G=B.clone();for(let U=0;U<$.inputsLength;U++){let W=$.getInput(U).script;if(W&&W.length>0){let P=S.decode(W);if(P.length>=2)G.addSignature(U,P[1],P[0])}}return G}function Wj(j,B,Z,S){let $=[];for(let G=0;G<j.inputsLength;G++){let U=j.getInput(G),Y=B[G];$.push({address_n:Z,amount:Y?.value?.toString()||"0",prev_hash:U.txid?S.encode(new Uint8Array([...U.txid].reverse())):"",prev_index:U.index??0,script_type:"SPENDADDRESS"})}return $}function Dj(j,B,Z,S){let $=[];for(let G=0;G<j.outputsLength;G++){let U=j.getOutput(G),Y=j.getOutputAddress(G,y.NETWORKS.zcash),W=U.script;if(U.amount===0n&&W?.length>0&&W[0]===106){let _=o(W);if(_){$.push({amount:"0",op_return_data:_,script_type:"PAYTOOPRETURN"});continue}continue}if(!Y&&(U.amount??0n)>0n)throw new q.SwapKitError({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:S,error:"Unable to decode output address"}});let Q=Y===Z||!Y?{address_n:B}:{address:Y};$.push({...Q,amount:U.amount?.toString()||"0",script_type:"PAYTOADDRESS"})}return $}function i(j,B,Z,S,$,G,U,Y,W){let P=[];for(let Q=0;Q<j.outputsLength;Q++){let _=j.getOutput(Q),R=j.getOutputAddress(Q,B);if(!R){let T=_.script?o(_.script):null;if(T!==null||$){P.push({amount:"0",op_return_data:T??Buffer.from($).toString("hex"),script_type:"PAYTOOPRETURN"});continue}throw new q.SwapKitError({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:G,error:"Unable to decode output address from scriptPubkey"}})}if(_.amount===void 0)throw new q.SwapKitError({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:G,error:"Output amount is missing"}});let z=G===q.Chain.BitcoinCash,H=z?Y(R):R,v=z?W(H)===W(S):H===S;P.push(v?{address_n:Z,amount:_.amount.toString(),script_type:U.output}:{address:H,amount:_.amount.toString(),script_type:"PAYTOADDRESS"})}return P}async function Oj({chain:j,derivationPath:B}){switch(j){case q.Chain.Arbitrum:case q.Chain.Aurora:case q.Chain.Avalanche:case q.Chain.Base:case q.Chain.Berachain:case q.Chain.BinanceSmartChain:case q.Chain.Ethereum:case q.Chain.Gnosis:case q.Chain.Monad:case q.Chain.Optimism:case q.Chain.Polygon:case q.Chain.XLayer:{let{getProvider:Z,getEvmToolboxAsync:S}=await import("@swapkit/toolboxes/evm"),{getEVMSigner:$}=await import("../chunk-d54qkn5p.js"),G=await Z(j),U=await $({chain:j,derivationPath:B,provider:G}),Y=await U.getAddress();return{...await S(j,{provider:G,signer:U}),address:Y}}case q.Chain.Zcash:{let{getUtxoToolbox:Z}=await import("@swapkit/toolboxes/utxo"),S=q.derivationPathToString(B),G=await(async()=>{let Q=(await import("@trezor/connect-web")).default,{success:_,payload:R}=await Q.getAddress({coin:"zcash",path:S});if(!_)throw new q.SwapKitError({errorKey:"wallet_trezor_failed_to_get_address",info:{chain:j,error:R.error||"Unknown error"}});return R.address})(),U={getAddress:async()=>G,signPCZT:async(Q)=>{let _=(await import("@trezor/connect-web")).default,{hex:R}=await import("@scure/base"),z=x(B),H=Q.getGlobal(),v=Lj(Q,z,R),T=await Nj(Q,z,G,j),b=await _.signTransaction({branchId:H.consensusBranchId,coin:"zcash",expiry:H.expiryHeight,inputs:v,locktime:H.lockTime,outputs:T,overwintered:!0,version:H.txVersion,versionGroupId:H.versionGroupId});if(!b.success)throw new q.SwapKitError({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:j,error:b.payload.error}});return Ej(b.payload.serializedTx,Q)},signTransaction:async(Q,_)=>{let R=(await import("@trezor/connect-web")).default,{hex:z}=await import("@scure/base"),H=x(B),v=Wj(Q,_,H,z),T=Dj(Q,H,G,j),b=await R.signTransaction({branchId:y.ZcashConsensusBranchId.NU6,coin:"zcash",expiry:0,inputs:v,locktime:0,outputs:T,overwintered:!0,version:4,versionGroupId:y.ZcashVersionGroupId.SAPLING});if(b.success)return b.payload.serializedTx;throw new q.SwapKitError({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:j,error:b.payload.error}})}},Y=Z(q.Chain.Zcash),W=async(Q)=>{if(!(G&&Q.recipient))throw new q.SwapKitError({errorKey:"wallet_missing_params",info:{address:G,recipient:Q.recipient,wallet:q.WalletOption.TREZOR}});let _=Q.feeRate||(await Y.getFeeRates())[Q.feeOptionKey||q.FeeOption.Fast],{tx:R,inputs:z}=await Y.createTransaction({...Q,feeRate:_,fetchTxHex:!1,sender:G}),H=await U.signTransaction(R,z);return await Y.broadcastTx(H)},P=async(Q)=>{if(!(G&&Q.recipient))throw new q.SwapKitError({errorKey:"wallet_missing_params",info:{address:G,recipient:Q.recipient,wallet:q.WalletOption.TREZOR}});let{createPCZT:_,OutScript:R}=await import("@swapkit/utxo-signer"),{hex:z}=await import("@scure/base"),{getUtxoApi:H}=await import("@swapkit/toolboxes/utxo"),v=Q.feeRate||(await Y.getFeeRates())[Q.feeOptionKey||q.FeeOption.Fast],T=await H(q.Chain.Zcash).getUtxos({address:G}),{tx:b,inputs:g}=await Y.createTransaction({...Q,feeRate:v,fetchTxHex:!1,sender:G}),m=_();for(let J of g){let L=T.find((X)=>X.hash===J.hash&&X.index===J.index),V=L?.witnessUtxo?.script?new Uint8Array(L.witnessUtxo.script):R.encode({hash:z.decode(J.address||""),type:"pkh"});m.addInput({index:J.index,scriptPubkey:V,txid:z.decode(J.hash).reverse(),value:BigInt(J.value)})}for(let J=0;J<b.outputsLength;J++){let L=b.getOutput(J);m.addOutput({scriptPubkey:L.script||new Uint8Array,value:L.amount||0n})}let I=await U.signPCZT(m);I.finalizeAllInputs();let h=I.extract();return await Y.broadcastTx(h.toHex())};return{...Y,address:G,signPCZT:U.signPCZT,signTransaction:U.signTransaction,transfer:W,transferWithPCZT:P}}case q.Chain.Bitcoin:case q.Chain.BitcoinCash:case q.Chain.Dash:case q.Chain.Dogecoin:case q.Chain.Litecoin:{let m=function(J={}){return g(J)},{toCashAddress:Z,getUtxoToolbox:S,stripPrefix:$}=await import("@swapkit/toolboxes/utxo"),G=j,U=Xj(B);if(!U)throw new q.SwapKitError({errorKey:"wallet_trezor_derivation_path_not_supported",info:{derivationPath:B}});let Y=j.toLowerCase(),W=async(J=B)=>{let L=(await import("@trezor/connect-web")).default,{success:V,payload:X}=await L.getAddress({coin:Y,path:q.derivationPathToString(J),showOnTrezor:!1});if(!V)throw new q.SwapKitError({errorKey:"wallet_trezor_failed_to_get_address",info:{chain:j,error:X.error||"Unknown error"}});if(j===q.Chain.BitcoinCash)return $(X.address);return X.address};async function P(){let J=await g(),L=Number(B[4]??0),V=Boolean(B[3]??0);try{let X=M.deriveAddressesFromXpub({accountIndex:J.accountIndex,chain:G,count:1,startIndex:L,xpub:J.xpub}).find((w)=>w.change===V&&w.index===L);if(!X)throw new q.SwapKitError({errorKey:"wallet_trezor_failed_to_get_address",info:{chain:j,error:"Unable to derive address from Trezor account public key"}});return X.address}catch(X){if(X instanceof q.SwapKitError)throw X;throw new q.SwapKitError({errorKey:"wallet_trezor_failed_to_get_address",info:{chain:j,error:X instanceof Error?X.message:"Unable to derive address from Trezor xpub"}})}}let Q=j===q.Chain.Bitcoin||j===q.Chain.Litecoin?await P():await W(),_=S(j),R=async(J,L,V="")=>{let X=(await import("@trezor/connect-web")).default,w=x(B),D=M.getNetworkForChain(j),k=i(J,D,w,Q,V,j,U,Z,$),O=L.map(({hash:C,index:N,value:E})=>({address_n:w,amount:E,prev_hash:C,prev_index:N,script_type:U.input})),F=await X.signTransaction({coin:Y,inputs:O,outputs:k});if(F.success)return F.payload.serializedTx;let K=F.payload;throw new q.SwapKitError({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:j,code:K?.code??"unknown",error:K?.error??"unknown",payload:K}})},z=async(J)=>{let L=(await import("@trezor/connect-web")).default,{hex:V}=await import("@scure/base"),X=x(B),w=M.getNetworkForChain(j),D;async function k(){if(!D){let N=await g(),A=a.HDKey.fromExtendedKey(N.xpub).derive(`m/${Number(B[3]??0)}/${Number(B[4]??0)}`);if(!A.publicKey)throw new q.SwapKitError({errorKey:"wallet_trezor_failed_to_get_public_key",info:{chain:j,error:"Unable to derive Trezor leaf public key from account xpub"}});D=A.publicKey}return[D,{fingerprint:0,path:X}]}let O=[],F=[];for(let N=0;N<J.inputsLength;N++){let E=J.getInput(N),A=Zj(E),f=A??await k(),u=$j(E);if(!E.txid||E.index===void 0||!u)throw new q.SwapKitError({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:j,error:`Input ${N} is missing prevout data required by Trezor`}});if(O[N]=f[0],!A)J.updateInput(N,{bip32Derivation:[f]});F.push({address_n:f[1].path,amount:u,prev_hash:V.encode(E.txid),prev_index:E.index,script_type:U.input,...E.sequence!==void 0?{sequence:E.sequence}:{}})}let K=i(J,w,X,Q,"",j,U,Z,$),C=await L.signTransaction({coin:Y,inputs:F,locktime:J.lockTime,outputs:K,version:J.version});if(!C.success){let N=C.payload;throw new q.SwapKitError({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:j,code:N?.code??"unknown",error:N?.error??"unknown",payload:N}})}return C.payload.signatures.forEach((N,E)=>{let A=O[E];if(!(N&&A))return;J.updateInput(E,{partialSig:[[A,Sj(N)]]})}),J},H=async(J,L,V="")=>{let X=(await import("@trezor/connect-web")).default,w=M.getNetworkForChain(j),D=x(B.slice(0,3)),k=i(J,w,D,Q,V,j,U,Z,$),O=L.map(({hash:K,index:C,value:N,derivationIndex:E,isChange:A})=>{let f=A?1:0;return{address_n:[...D,f,E],amount:N,prev_hash:K,prev_index:C,script_type:U.input}}),F=await X.signTransaction({coin:Y,inputs:O,outputs:k});if(F.success)return F.payload.serializedTx;throw new q.SwapKitError({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:j,error:F.payload.error}})},v=async({utxos:J,recipient:L,assetValue:V,memo:X,feeRate:w,feeOptionKey:D})=>{let k=S(j),O=w||(await k.getFeeRates())[D||q.FeeOption.Fast],{tx:F,inputs:K}=await k.createTransaction({assetValue:V,feeRate:O,fetchTxHex:!0,memo:X,recipient:L,sender:Q}),C=K.map((E)=>{let A=J.find((f)=>f.hash===E.hash&&f.index===E.index);return{...E,derivationIndex:A?.derivationIndex??0,isChange:A?.isChange??!1}}),N=await H(F,C,X);return k.broadcastTx(N)},T=async({recipient:J,feeOptionKey:L,feeRate:V,memo:X,...w})=>{if(!(Q&&J))throw new q.SwapKitError({errorKey:"wallet_missing_params",info:{address:Q,memo:X,recipient:J,wallet:q.WalletOption.TREZOR}});let D=S(j),k=V||(await D.getFeeRates())[L||q.FeeOption.Fast],O=D.createTransaction,{tx:F,inputs:K}=await O({...w,feeRate:k,fetchTxHex:!0,memo:X,recipient:J,sender:Q}),C=await R(F,K,X);return await D.broadcastTx(C)},b=j===q.Chain.Bitcoin||j===q.Chain.Litecoin?await S(G,{signer:{getAddress:async()=>Q,signTransaction:z}}):_;async function g({accountIndex:J}={}){let L=(await import("@trezor/connect-web")).default,V=M.getUTXOAccountPath({accountIndex:J,chain:G,derivationPath:B}),X=q.derivationPathToString(V),w=`${j}:${X}`,D=r.get(w);if(D)return D;let{success:k,payload:O}=await L.getPublicKey({coin:Y,path:X});if(!k)throw new q.SwapKitError({errorKey:"wallet_trezor_failed_to_get_public_key",info:{chain:j,error:O.error||"Unknown error"}});let F={accountIndex:M.getUTXOAccountIndexFromPath(V),chainCode:O.chainCode,depth:O.depth,fingerprint:O.fingerprint,path:O.serializedPath,publicKey:O.publicKey,xpub:O.xpub,xpubSegwit:O.xpubSegwit};return r.set(w,F),F}async function I({accountIndex:J,index:L,change:V=!1}){M.assertDerivationIndex("index",L);let X=(await import("@trezor/connect-web")).default,w=M.getUTXOAccountPath({accountIndex:J,chain:G,derivationPath:B}),D=`${q.derivationPathToString(w)}/${Number(V)}/${L}`,{success:k,payload:O}=await X.getAddress({coin:Y,path:D,showOnTrezor:!1});if(!k)return;let F=O.address;if(j===q.Chain.BitcoinCash)F=(await S(j)).stripPrefix(O.address);let K=await X.getPublicKey({coin:Y,path:D}),C=K.success?K.payload.publicKey:"";return{accountIndex:M.getUTXOAccountIndexFromPath(w),address:F,change:V,index:L,path:D,pubkey:C}}async function h({accountIndex:J,count:L,startIndex:V=0,change:X=!1}){M.assertDerivationIndex("count",L),M.assertDerivationIndex("startIndex",V);let w=(await import("@trezor/connect-web")).default,D=M.getUTXOAccountPath({accountIndex:J,chain:G,derivationPath:B}),k=q.derivationPathToString(D),O=Array.from({length:L},(N,E)=>({coin:Y,path:`${k}/${Number(X)}/${V+E}`,showOnTrezor:!1})),{success:F,payload:K}=await w.getAddress({bundle:O});if(!F||!Array.isArray(K))return[];return await Promise.all(K.map(async(N,E)=>{let A=N.address;if(j===q.Chain.BitcoinCash)A=(await S(j)).stripPrefix(N.address);return{accountIndex:M.getUTXOAccountIndexFromPath(D),address:A,change:X,index:V+E,path:`${k}/${Number(X)}/${V+E}`,pubkey:""}}))}let c=M.createHDWalletHelpers({chain:j,deriveAddress:I,getBalance:b.getBalance,getUtxos:(J)=>M.getUtxoApi(j).getUtxos({address:J,fetchTxHex:!0})});return{...b,...c,address:Q,deriveAddressAtIndex:I,deriveAddresses:h,getExtendedPublicKey:m,getExtendedPublicKeyInfo:g,signTransaction:R,signTransactionWithMultipleInputs:H,transfer:T,transferFromMultipleAddresses:v}}default:throw new q.SwapKitError({errorKey:"wallet_chain_not_supported",info:{chain:j,wallet:q.WalletOption.TREZOR}})}}var n=p.createWallet({connect:({addChain:j,supportedChains:B,walletType:Z})=>async function($,G){let[U]=q.filterSupportedChains({chains:$,supportedChains:B,walletType:Z});if(!U)throw new q.SwapKitError({errorKey:"wallet_chain_not_supported",info:{chain:U,wallet:q.WalletOption.TREZOR}});let Y=(await import("@trezor/connect-web")).default,W=q.SKConfig.get("integrations").trezor,{connectSrc:P,coreMode:Q,debug:_,interactionTimeout:R,lazyLoad:z,pendingTransportEvent:H,popup:v,transportReconnect:T,transports:b,...g}=W??{},m={...g,appName:d(W?.appName,s.appName),appUrl:d(W?.appUrl,Uj()),email:d(W?.email,s.email)},I=typeof globalThis.location<"u"&&["localhost","127.0.0.1"].includes(globalThis.location.hostname),h=Jj(Q)??"popup",c=Qj(b)??Bj;if(l)await l;if(I)await Y.dispose();await Y.init({connectSrc:P,coreMode:h,debug:_,interactionTimeout:R,lazyLoad:z??!1,manifest:m,pendingTransportEvent:H,popup:v??!0,transportReconnect:T,transports:c});let J=await Oj({chain:U,derivationPath:G});return j({...J,chain:U,disconnect:Gj,walletType:Z}),!0},directSigningSupport:{[q.Chain.Arbitrum]:!0,[q.Chain.Aurora]:!0,[q.Chain.Avalanche]:!0,[q.Chain.Base]:!0,[q.Chain.Berachain]:!0,[q.Chain.BinanceSmartChain]:!0,[q.Chain.Bitcoin]:!0,[q.Chain.Ethereum]:!0,[q.Chain.Gnosis]:!0,[q.Chain.Litecoin]:!0,[q.Chain.Monad]:!0,[q.Chain.Optimism]:!0,[q.Chain.Polygon]:!0,[q.Chain.XLayer]:!0},name:"connectTrezor",supportedChains:[q.Chain.Arbitrum,q.Chain.Aurora,q.Chain.Avalanche,q.Chain.Base,q.Chain.Berachain,q.Chain.BinanceSmartChain,q.Chain.Bitcoin,q.Chain.BitcoinCash,q.Chain.Dash,q.Chain.Dogecoin,q.Chain.Ethereum,q.Chain.Gnosis,q.Chain.Litecoin,q.Chain.Monad,q.Chain.Optimism,q.Chain.Polygon,q.Chain.XLayer,q.Chain.Zcash],walletType:q.WalletOption.TREZOR}),_j=p.getWalletSupportedChains(n);
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=EA2F0D19307EFA5064756E2164756E21
|
|
4
4
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/trezor/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { HDKey } from \"@scure/bip32\";\nimport {\n Chain,\n type DerivationPathArray,\n derivationPathToString,\n FeeOption,\n filterSupportedChains,\n type GenericTransferParams,\n SKConfig,\n SwapKitError,\n type UTXOChain,\n WalletOption,\n} from \"@swapkit/helpers\";\nimport {\n assertDerivationIndex,\n createHDWalletHelpers,\n deriveAddressesFromXpub,\n getNetworkForChain,\n getUTXOAccountIndexFromPath,\n getUTXOAccountPath,\n getUtxoApi,\n type UTXOToolboxes,\n type UTXOType,\n} from \"@swapkit/toolboxes/utxo\";\nimport type { BTCNetwork, PCZT, Transaction, ZcashTransaction } from \"@swapkit/utxo-signer\";\nimport { NETWORKS, ZcashConsensusBranchId, ZcashVersionGroupId } from \"@swapkit/utxo-signer\";\nimport { createWallet, getWalletSupportedChains } from \"@swapkit/wallet-core\";\n\ntype TrezorBip32Derivation = [Uint8Array, { fingerprint: number; path: number[] }];\ntype TrezorCoreMode = \"auto\" | \"iframe\" | \"popup\" | \"suite-desktop\" | \"suite-web\";\ntype TrezorTransport = \"BridgeTransport\" | \"WebUsbTransport\" | \"NodeUsbTransport\";\ntype TrezorExtendedPublicKeyInfo = {\n accountIndex: number;\n chainCode?: string;\n depth?: number;\n fingerprint?: number;\n path: string;\n publicKey?: string;\n xpub: string;\n xpubSegwit?: string;\n};\n\nconst TREZOR_CORE_MODES = new Set<TrezorCoreMode>([\"auto\", \"iframe\", \"popup\", \"suite-desktop\", \"suite-web\"]);\nconst TREZOR_TRANSPORTS = new Set<TrezorTransport>([\"BridgeTransport\", \"WebUsbTransport\", \"NodeUsbTransport\"]);\nconst trezorXpubCache = new Map<string, TrezorExtendedPublicKeyInfo>();\nlet trezorSessionDispose: Promise<void> | undefined;\n\nasync function disconnectTrezorSession() {\n trezorXpubCache.clear();\n\n const dispose = (async () => {\n try {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n await TrezorConnect.dispose();\n } catch {\n // Ignore stale or already-disposed sessions.\n }\n })();\n\n trezorSessionDispose = dispose;\n await dispose;\n\n if (trezorSessionDispose === dispose) {\n trezorSessionDispose = undefined;\n }\n}\n\nfunction normalizeTrezorCoreMode(coreMode: unknown): TrezorCoreMode | undefined {\n return typeof coreMode === \"string\" && TREZOR_CORE_MODES.has(coreMode as TrezorCoreMode)\n ? (coreMode as TrezorCoreMode)\n : undefined;\n}\n\nfunction normalizeTrezorTransports(transports: unknown): TrezorTransport[] | undefined {\n if (!Array.isArray(transports)) return undefined;\n\n const normalized = transports.filter(\n (transport): transport is TrezorTransport =>\n typeof transport === \"string\" && TREZOR_TRANSPORTS.has(transport as TrezorTransport),\n );\n\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction decodeOpReturnData(script: Uint8Array): string | null {\n if (script.length < 2 || script[0] !== 0x6a) return null;\n const dataLen = script[1];\n if (dataLen === undefined || script.length < 2 + dataLen) return null;\n return Buffer.from(script.slice(2, 2 + dataLen)).toString(\"hex\");\n}\n\nfunction getScriptType(derivationPath: DerivationPathArray) {\n switch (derivationPath[0]) {\n case 84:\n return { input: \"SPENDWITNESS\", output: \"PAYTOWITNESS\" } as const;\n case 49:\n return { input: \"SPENDP2SHWITNESS\", output: \"PAYTOP2SHWITNESS\" } as const;\n case 44:\n return { input: \"SPENDADDRESS\", output: \"PAYTOADDRESS\" } as const;\n default:\n return null;\n }\n}\n\nfunction hardenDerivationPath(derivationPath: DerivationPathArray): number[] {\n return derivationPath.map((pathElement, index) =>\n index < 3 ? ((pathElement as number) | 0x80000000) >>> 0 : (pathElement as number),\n );\n}\n\nfunction isTrezorBip32Derivation(value: unknown): value is TrezorBip32Derivation {\n return (\n Array.isArray(value) &&\n value[0] instanceof Uint8Array &&\n typeof value[1] === \"object\" &&\n value[1] !== null &&\n typeof (value[1] as { fingerprint?: unknown }).fingerprint === \"number\" &&\n Array.isArray((value[1] as { path?: unknown }).path)\n );\n}\n\nfunction getFirstBip32Derivation(input: { bip32Derivation?: unknown }): TrezorBip32Derivation | undefined {\n if (!Array.isArray(input.bip32Derivation)) return undefined;\n const [firstDerivation] = input.bip32Derivation;\n\n return isTrezorBip32Derivation(firstDerivation) ? firstDerivation : undefined;\n}\n\nfunction getPrevoutAmount(input: {\n index?: number;\n nonWitnessUtxo?: { outputs?: Array<{ amount?: bigint | number }> };\n witnessUtxo?: { amount?: bigint | number };\n}) {\n if (input.witnessUtxo?.amount !== undefined) return input.witnessUtxo.amount.toString();\n\n const prevout = input.index !== undefined ? input.nonWitnessUtxo?.outputs?.[input.index] : undefined;\n if (prevout?.amount !== undefined) return prevout.amount.toString();\n\n return undefined;\n}\n\nfunction normalizeTrezorSignature(signatureHex: string) {\n const signature = Buffer.from(signatureHex, \"hex\");\n const derLength = signature[1] !== undefined ? signature[1] + 2 : undefined;\n\n if (derLength !== undefined && signature.length === derLength) {\n return new Uint8Array([...signature, 0x01]);\n }\n\n return new Uint8Array(signature);\n}\n\nfunction buildPCZTInputsForTrezor(\n pczt: PCZT,\n address_n: number[],\n hexEncode: { encode: (data: Uint8Array) => string },\n) {\n const inputs = [];\n for (let i = 0; i < pczt.inputsLength; i++) {\n const input = pczt.getInput(i);\n inputs.push({\n address_n,\n amount: input.value.toString(),\n prev_hash: hexEncode.encode(new Uint8Array([...input.txid].reverse())),\n prev_index: input.index,\n script_type: \"SPENDADDRESS\" as const,\n });\n }\n return inputs;\n}\n\nasync function buildPCZTOutputsForTrezor(pczt: PCZT, address_n: number[], myAddress: string, chain: Chain) {\n const outputs = [];\n for (let i = 0; i < pczt.outputsLength; i++) {\n const output = pczt.getOutput(i);\n const script = output.scriptPubkey;\n\n if (output.value === 0n && script?.length > 0 && script[0] === 0x6a) {\n const opReturnData = decodeOpReturnData(script);\n if (opReturnData) {\n outputs.push({ amount: \"0\", op_return_data: opReturnData, script_type: \"PAYTOOPRETURN\" as const });\n continue;\n }\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Malformed OP_RETURN output cannot be signed\" },\n });\n }\n\n const outputAddress = await decodeOutputAddress(script);\n\n if (!outputAddress && output.value > 0n) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Unable to decode output address from scriptPubkey\" },\n });\n }\n\n const isChangeAddress = outputAddress === myAddress;\n\n if (isChangeAddress) {\n outputs.push({ address_n, amount: output.value.toString(), script_type: \"PAYTOADDRESS\" as const });\n } else {\n outputs.push({ address: outputAddress, amount: output.value.toString(), script_type: \"PAYTOADDRESS\" as const });\n }\n }\n return outputs;\n}\n\nasync function decodeOutputAddress(script: Uint8Array): Promise<string | undefined> {\n try {\n const { OutScript, Address } = await import(\"@swapkit/utxo-signer\");\n const decoded = OutScript.decode(script);\n if (decoded.type === \"pkh\" || decoded.type === \"pk\") {\n return Address(NETWORKS.zcash).encode(decoded);\n }\n } catch {\n // ignore decode errors\n }\n return undefined;\n}\n\nasync function extractSignaturesFromSignedTx(signedTxHex: string, pczt: PCZT): Promise<PCZT> {\n const { ZcashTransaction: ZcashTx, Script } = await import(\"@swapkit/utxo-signer\");\n const signedTx = ZcashTx.fromHex(signedTxHex, { allowUnknownOutputs: true });\n const signedPczt = pczt.clone();\n\n for (let i = 0; i < signedTx.inputsLength; i++) {\n const signedInput = signedTx.getInput(i);\n const script = signedInput.script;\n if (script && script.length > 0) {\n const scriptParts = Script.decode(script);\n if (scriptParts.length >= 2) {\n signedPczt.addSignature(i, scriptParts[1] as Uint8Array, scriptParts[0] as Uint8Array);\n }\n }\n }\n return signedPczt;\n}\n\nfunction buildZcashTxInputsForTrezor(\n tx: ZcashTransaction,\n utxoInputs: UTXOType[],\n address_n: number[],\n hexEncode: { encode: (data: Uint8Array) => string },\n) {\n const inputs = [];\n for (let i = 0; i < tx.inputsLength; i++) {\n const input = tx.getInput(i);\n const utxoInfo = utxoInputs[i];\n inputs.push({\n address_n,\n amount: utxoInfo?.value?.toString() || \"0\",\n prev_hash: input.txid ? hexEncode.encode(new Uint8Array([...input.txid].reverse())) : \"\",\n prev_index: input.index ?? 0,\n script_type: \"SPENDADDRESS\" as const,\n });\n }\n return inputs;\n}\n\nfunction buildZcashTxOutputsForTrezor(tx: ZcashTransaction, address_n: number[], myAddress: string, chain: Chain) {\n const outputs = [];\n for (let i = 0; i < tx.outputsLength; i++) {\n const output = tx.getOutput(i);\n const outputAddress = tx.getOutputAddress(i, NETWORKS.zcash);\n const script = output.script;\n\n if (output.amount === 0n && script?.length > 0 && script[0] === 0x6a) {\n const opReturnData = decodeOpReturnData(script);\n if (opReturnData) {\n outputs.push({ amount: \"0\", op_return_data: opReturnData, script_type: \"PAYTOOPRETURN\" as const });\n continue;\n }\n continue;\n }\n\n if (!outputAddress && (output.amount ?? 0n) > 0n) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Unable to decode output address\" },\n });\n }\n\n const isChangeAddress = outputAddress === myAddress;\n const outputParam = isChangeAddress || !outputAddress ? { address_n } : { address: outputAddress };\n outputs.push({ ...outputParam, amount: output.amount?.toString() || \"0\", script_type: \"PAYTOADDRESS\" as const });\n }\n return outputs;\n}\n\nfunction buildUtxoOutputsForTrezor(\n tx: Transaction,\n network: BTCNetwork,\n address_n: number[],\n myAddress: string,\n memo: string,\n chain: Chain,\n scriptType: { input: string; output: string },\n toCashAddress: (addr: string) => string,\n stripPrefix: (addr: string) => string,\n) {\n const outputs: any[] = [];\n for (let i = 0; i < tx.outputsLength; i++) {\n const output = tx.getOutput(i);\n const outputAddress = tx.getOutputAddress(i, network);\n\n if (!outputAddress) {\n const opReturnData = output.script ? decodeOpReturnData(output.script) : null;\n if (opReturnData !== null || memo) {\n outputs.push({\n amount: \"0\",\n op_return_data: opReturnData ?? Buffer.from(memo).toString(\"hex\"),\n script_type: \"PAYTOOPRETURN\",\n });\n continue;\n }\n\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Unable to decode output address from scriptPubkey\" },\n });\n }\n\n if (output.amount === undefined) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Output amount is missing\" },\n });\n }\n\n const isBch = chain === Chain.BitcoinCash;\n const cashAddrWithPrefix = isBch ? toCashAddress(outputAddress) : outputAddress;\n const isChangeAddress = isBch\n ? stripPrefix(cashAddrWithPrefix) === stripPrefix(myAddress)\n : cashAddrWithPrefix === myAddress;\n\n outputs.push(\n isChangeAddress\n ? { address_n, amount: output.amount.toString(), script_type: scriptType.output }\n : { address: cashAddrWithPrefix, amount: output.amount.toString(), script_type: \"PAYTOADDRESS\" },\n );\n }\n return outputs;\n}\n\nasync function getTrezorWallet<T extends Chain>({\n chain,\n derivationPath,\n}: {\n chain: T;\n derivationPath: DerivationPathArray;\n}) {\n switch (chain) {\n case Chain.Arbitrum:\n case Chain.Aurora:\n case Chain.Avalanche:\n case Chain.Base:\n case Chain.Berachain:\n case Chain.BinanceSmartChain:\n case Chain.Ethereum:\n case Chain.Gnosis:\n case Chain.Monad:\n case Chain.Optimism:\n case Chain.Polygon:\n case Chain.XLayer: {\n const { getProvider, getEvmToolboxAsync } = await import(\"@swapkit/toolboxes/evm\");\n const { getEVMSigner } = await import(\"./evmSigner\");\n\n const provider = await getProvider(chain);\n const signer = await getEVMSigner({ chain, derivationPath, provider });\n const address = await signer.getAddress();\n const toolbox = await getEvmToolboxAsync(chain, { provider, signer });\n\n return { ...toolbox, address };\n }\n\n case Chain.Zcash: {\n const { getUtxoToolbox } = await import(\"@swapkit/toolboxes/utxo\");\n\n const derivationPathStr = derivationPathToString(derivationPath);\n\n const getAddress = async () => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { success, payload } = await TrezorConnect.getAddress({ coin: \"zcash\", path: derivationPathStr });\n\n if (!success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { chain, error: (payload as { error: string; code?: string }).error || \"Unknown error\" },\n });\n }\n\n return payload.address;\n };\n\n const address = await getAddress();\n\n const signer = {\n getAddress: async () => address,\n\n signPCZT: async (pczt: PCZT): Promise<PCZT> => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { hex: hexEncode } = await import(\"@scure/base\");\n const address_n = hardenDerivationPath(derivationPath);\n const global = pczt.getGlobal();\n\n const inputs = buildPCZTInputsForTrezor(pczt, address_n, hexEncode);\n const outputs = await buildPCZTOutputsForTrezor(pczt, address_n, address, chain);\n\n const result = await TrezorConnect.signTransaction({\n branchId: global.consensusBranchId,\n coin: \"zcash\",\n expiry: global.expiryHeight,\n inputs,\n locktime: global.lockTime,\n outputs: outputs as any,\n overwintered: true,\n version: global.txVersion,\n versionGroupId: global.versionGroupId,\n });\n\n if (!result.success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: (result.payload as { error: string; code?: string }).error },\n });\n }\n\n return extractSignaturesFromSignedTx(result.payload.serializedTx, pczt);\n },\n\n signTransaction: async (tx: ZcashTransaction, utxoInputs: UTXOType[]) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { hex: hexEncode } = await import(\"@scure/base\");\n const address_n = hardenDerivationPath(derivationPath);\n\n const inputs = buildZcashTxInputsForTrezor(tx, utxoInputs, address_n, hexEncode);\n const outputs = buildZcashTxOutputsForTrezor(tx, address_n, address, chain);\n\n const result = await TrezorConnect.signTransaction({\n branchId: ZcashConsensusBranchId.NU6,\n coin: \"zcash\",\n expiry: 0,\n inputs,\n locktime: 0,\n outputs: outputs as any,\n overwintered: true,\n version: 4,\n versionGroupId: ZcashVersionGroupId.SAPLING,\n });\n\n if (result.success) {\n return result.payload.serializedTx;\n }\n\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: (result.payload as { error: string; code?: string }).error },\n });\n },\n };\n\n const toolbox = getUtxoToolbox(Chain.Zcash);\n\n const transfer = async (params: GenericTransferParams) => {\n if (!(address && params.recipient)) {\n throw new SwapKitError({\n errorKey: \"wallet_missing_params\",\n info: { address, recipient: params.recipient, wallet: WalletOption.TREZOR },\n });\n }\n\n const feeRate = params.feeRate || (await toolbox.getFeeRates())[params.feeOptionKey || FeeOption.Fast];\n\n const { tx, inputs: txInputs } = await toolbox.createTransaction({\n ...params,\n feeRate,\n fetchTxHex: false,\n sender: address,\n });\n\n const txHex = await signer.signTransaction(tx, txInputs);\n const broadcastResult = await toolbox.broadcastTx(txHex);\n\n return broadcastResult;\n };\n\n const transferWithPCZT = async (params: GenericTransferParams) => {\n if (!(address && params.recipient)) {\n throw new SwapKitError({\n errorKey: \"wallet_missing_params\",\n info: { address, recipient: params.recipient, wallet: WalletOption.TREZOR },\n });\n }\n\n const { createPCZT, OutScript } = await import(\"@swapkit/utxo-signer\");\n const { hex: hexEncode } = await import(\"@scure/base\");\n const { getUtxoApi } = await import(\"@swapkit/toolboxes/utxo\");\n\n const feeRate = params.feeRate || (await toolbox.getFeeRates())[params.feeOptionKey || FeeOption.Fast];\n\n const utxos = await getUtxoApi(Chain.Zcash).getUtxos({ address });\n\n const { tx, inputs: txInputs } = await toolbox.createTransaction({\n ...params,\n feeRate,\n fetchTxHex: false,\n sender: address,\n });\n\n const pczt = createPCZT();\n\n for (const utxoInput of txInputs) {\n const utxo = utxos.find((u) => u.hash === utxoInput.hash && u.index === utxoInput.index);\n const scriptPubkey = utxo?.witnessUtxo?.script\n ? new Uint8Array(utxo.witnessUtxo.script)\n : OutScript.encode({ hash: hexEncode.decode((utxoInput as any).address || \"\"), type: \"pkh\" });\n\n pczt.addInput({\n index: utxoInput.index,\n scriptPubkey,\n txid: hexEncode.decode(utxoInput.hash).reverse() as unknown as Uint8Array,\n value: BigInt(utxoInput.value),\n });\n }\n\n for (let i = 0; i < tx.outputsLength; i++) {\n const output = tx.getOutput(i);\n pczt.addOutput({ scriptPubkey: output.script || new Uint8Array(), value: output.amount || 0n });\n }\n\n const signedPczt = await signer.signPCZT(pczt);\n signedPczt.finalizeAllInputs();\n const finalTx = signedPczt.extract();\n const broadcastResult = await toolbox.broadcastTx(finalTx.toHex());\n\n return broadcastResult;\n };\n\n return {\n ...toolbox,\n address,\n signPCZT: signer.signPCZT,\n signTransaction: signer.signTransaction,\n transfer,\n transferWithPCZT,\n };\n }\n\n case Chain.Bitcoin:\n case Chain.BitcoinCash:\n case Chain.Dash:\n case Chain.Dogecoin:\n case Chain.Litecoin: {\n const { toCashAddress, getUtxoToolbox, stripPrefix } = await import(\"@swapkit/toolboxes/utxo\");\n const utxoChain = chain as UTXOChain;\n const scriptType = getScriptType(derivationPath);\n\n if (!scriptType) {\n throw new SwapKitError({ errorKey: \"wallet_trezor_derivation_path_not_supported\", info: { derivationPath } });\n }\n\n const coin = chain.toLowerCase();\n\n const getAddress = async (path: DerivationPathArray = derivationPath) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { success, payload } = await TrezorConnect.getAddress({\n coin,\n path: derivationPathToString(path),\n showOnTrezor: false,\n });\n\n if (!success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { chain, error: (payload as { error: string; code?: string }).error || \"Unknown error\" },\n });\n }\n\n if (chain === Chain.BitcoinCash) {\n return stripPrefix(payload.address);\n }\n\n return payload.address;\n };\n\n async function getAddressFromExtendedPublicKey() {\n const accountInfo = await getExtendedPublicKeyInfo();\n const addressIndex = Number(derivationPath[4] ?? 0);\n const change = Boolean(derivationPath[3] ?? 0);\n\n try {\n // deriveAddressesFromXpub returns both external and change branches for each index.\n const derivedAddress = deriveAddressesFromXpub({\n accountIndex: accountInfo.accountIndex,\n chain: utxoChain,\n count: 1,\n startIndex: addressIndex,\n xpub: accountInfo.xpub,\n }).find((derived) => derived.change === change && derived.index === addressIndex);\n\n if (!derivedAddress) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { chain, error: \"Unable to derive address from Trezor account public key\" },\n });\n }\n\n return derivedAddress.address;\n } catch (error) {\n if (error instanceof SwapKitError) throw error;\n\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: {\n chain,\n error: error instanceof Error ? error.message : \"Unable to derive address from Trezor xpub\",\n },\n });\n }\n }\n\n const address =\n chain === Chain.Bitcoin || chain === Chain.Litecoin\n ? await getAddressFromExtendedPublicKey()\n : await getAddress();\n const baseToolbox = getUtxoToolbox(chain);\n\n const signTransaction = async (tx: Transaction, inputs: UTXOType[], memo = \"\") => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const address_n = hardenDerivationPath(derivationPath);\n const network = getNetworkForChain(chain as UTXOChain);\n\n const outputs = buildUtxoOutputsForTrezor(\n tx,\n network,\n address_n,\n address,\n memo,\n chain,\n scriptType,\n toCashAddress,\n stripPrefix,\n );\n\n const trezorInputs = inputs.map(({ hash, index, value }) => ({\n address_n,\n amount: value,\n prev_hash: hash,\n prev_index: index,\n script_type: scriptType.input,\n }));\n\n const result = await TrezorConnect.signTransaction({ coin, inputs: trezorInputs, outputs });\n\n if (result.success) {\n return result.payload.serializedTx;\n }\n\n const payload = result.payload as { error?: string; code?: string };\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, code: payload?.code ?? \"unknown\", error: payload?.error ?? \"unknown\", payload },\n });\n };\n\n const signPsbtTransaction = async (tx: Transaction): Promise<Transaction> => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { hex: hexEncode } = await import(\"@scure/base\");\n const address_n = hardenDerivationPath(derivationPath);\n const network = getNetworkForChain(chain as UTXOChain);\n let fallbackPublicKey: Uint8Array | undefined;\n\n async function getFallbackDerivation(): Promise<TrezorBip32Derivation> {\n if (!fallbackPublicKey) {\n const accountInfo = await getExtendedPublicKeyInfo();\n const accountKey = HDKey.fromExtendedKey(accountInfo.xpub);\n const leaf = accountKey.derive(`m/${Number(derivationPath[3] ?? 0)}/${Number(derivationPath[4] ?? 0)}`);\n\n if (!leaf.publicKey) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_public_key\",\n info: { chain, error: \"Unable to derive Trezor leaf public key from account xpub\" },\n });\n }\n\n fallbackPublicKey = leaf.publicKey;\n }\n\n return [fallbackPublicKey, { fingerprint: 0, path: address_n }];\n }\n\n const signerPubkeys: Uint8Array[] = [];\n const trezorInputs = [];\n\n for (let inputIndex = 0; inputIndex < tx.inputsLength; inputIndex++) {\n const input = tx.getInput(inputIndex);\n const existingDerivation = getFirstBip32Derivation(input);\n const derivation = existingDerivation ?? (await getFallbackDerivation());\n const amount = getPrevoutAmount(input);\n\n if (!input.txid || input.index === undefined || !amount) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: `Input ${inputIndex} is missing prevout data required by Trezor` },\n });\n }\n\n signerPubkeys[inputIndex] = derivation[0];\n\n if (!existingDerivation) {\n tx.updateInput(inputIndex, { bip32Derivation: [derivation] });\n }\n\n trezorInputs.push({\n address_n: derivation[1].path,\n amount,\n prev_hash: hexEncode.encode(input.txid),\n prev_index: input.index,\n script_type: scriptType.input,\n ...(input.sequence !== undefined ? { sequence: input.sequence } : {}),\n });\n }\n\n const outputs = buildUtxoOutputsForTrezor(\n tx,\n network,\n address_n,\n address,\n \"\",\n chain,\n scriptType,\n toCashAddress,\n stripPrefix,\n );\n\n const result = await TrezorConnect.signTransaction({\n coin,\n inputs: trezorInputs,\n locktime: tx.lockTime,\n outputs,\n version: tx.version,\n });\n\n if (!result.success) {\n const payload = result.payload as { error?: string; code?: string };\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, code: payload?.code ?? \"unknown\", error: payload?.error ?? \"unknown\", payload },\n });\n }\n\n result.payload.signatures.forEach((signatureHex, inputIndex) => {\n const pubkey = signerPubkeys[inputIndex];\n if (!(signatureHex && pubkey)) return;\n\n tx.updateInput(inputIndex, { partialSig: [[pubkey, normalizeTrezorSignature(signatureHex)]] });\n });\n\n return tx;\n };\n\n const signTransactionWithMultipleInputs = async (\n tx: Transaction,\n inputs: Array<{ hash: string; index: number; value: number; derivationIndex: number; isChange: boolean }>,\n memo = \"\",\n ) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const network = getNetworkForChain(chain as UTXOChain);\n const baseAddressN = hardenDerivationPath(derivationPath.slice(0, 3) as DerivationPathArray);\n\n const outputs = buildUtxoOutputsForTrezor(\n tx,\n network,\n baseAddressN,\n address,\n memo,\n chain,\n scriptType,\n toCashAddress,\n stripPrefix,\n );\n\n const trezorInputs = inputs.map(({ hash, index: inputIndex, value, derivationIndex, isChange }) => {\n const changePath = isChange ? 1 : 0;\n const inputAddressN = [...baseAddressN, changePath, derivationIndex];\n return {\n address_n: inputAddressN,\n amount: value,\n prev_hash: hash,\n prev_index: inputIndex,\n script_type: scriptType.input,\n };\n });\n\n const result = await TrezorConnect.signTransaction({ coin, inputs: trezorInputs, outputs });\n\n if (result.success) {\n return result.payload.serializedTx;\n }\n\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: (result.payload as { error: string; code?: string }).error },\n });\n };\n\n const transferFromMultipleAddresses = async ({\n utxos,\n recipient,\n assetValue,\n memo,\n feeRate,\n feeOptionKey,\n }: {\n utxos: Array<{\n hash: string;\n index: number;\n value: number;\n txHex?: string;\n derivationIndex: number;\n isChange: boolean;\n address: string;\n }>;\n recipient: string;\n assetValue: { getBaseValue: (unit: string) => number; chain: string };\n memo?: string;\n feeRate?: number;\n feeOptionKey?: (typeof FeeOption)[keyof typeof FeeOption];\n }) => {\n const toolbox = getUtxoToolbox(chain);\n const txFeeRate = feeRate || (await toolbox.getFeeRates())[feeOptionKey || FeeOption.Fast];\n\n const { tx, inputs: selectedInputs } = await toolbox.createTransaction({\n assetValue: assetValue as any,\n feeRate: txFeeRate,\n fetchTxHex: true,\n memo,\n recipient,\n sender: address,\n });\n\n const inputsWithDerivation = selectedInputs.map((input: { hash: string; index: number; value: number }) => {\n const utxoInfo = utxos.find((u) => u.hash === input.hash && u.index === input.index);\n return { ...input, derivationIndex: utxoInfo?.derivationIndex ?? 0, isChange: utxoInfo?.isChange ?? false };\n });\n\n const signedTxHex = await signTransactionWithMultipleInputs(tx as Transaction, inputsWithDerivation, memo);\n return toolbox.broadcastTx(signedTxHex);\n };\n\n const transfer = async ({\n recipient,\n feeOptionKey,\n feeRate: paramFeeRate,\n memo,\n ...rest\n }: GenericTransferParams) => {\n if (!(address && recipient)) {\n throw new SwapKitError({\n errorKey: \"wallet_missing_params\",\n info: { address, memo, recipient, wallet: WalletOption.TREZOR },\n });\n }\n\n const toolbox = getUtxoToolbox(chain);\n\n const feeRate = paramFeeRate || (await toolbox.getFeeRates())[feeOptionKey || FeeOption.Fast];\n\n const createTxMethod = (toolbox as UTXOToolboxes[\"BTC\"]).createTransaction;\n\n const { tx, inputs } = await createTxMethod({\n ...rest,\n feeRate,\n fetchTxHex: true,\n memo,\n recipient,\n sender: address,\n });\n\n const signedTxHex = await signTransaction(tx, inputs, memo);\n const txHash = await toolbox.broadcastTx(signedTxHex);\n\n return txHash;\n };\n\n const toolbox =\n chain === Chain.Bitcoin || chain === Chain.Litecoin\n ? await getUtxoToolbox(utxoChain, {\n signer: { getAddress: async () => address, signTransaction: signPsbtTransaction },\n })\n : baseToolbox;\n\n async function getExtendedPublicKeyInfo({ accountIndex }: { accountIndex?: number } = {}) {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const resolvedAccountPath = getUTXOAccountPath({ accountIndex, chain: utxoChain, derivationPath });\n const path = derivationPathToString(resolvedAccountPath);\n const cacheKey = `${chain}:${path}`;\n const cached = trezorXpubCache.get(cacheKey);\n if (cached) return cached;\n\n const { success, payload } = await TrezorConnect.getPublicKey({ coin, path });\n\n if (!success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_public_key\",\n info: { chain, error: (payload as { error: string; code?: string }).error || \"Unknown error\" },\n });\n }\n\n const info = {\n accountIndex: getUTXOAccountIndexFromPath(resolvedAccountPath),\n chainCode: payload.chainCode,\n depth: payload.depth,\n fingerprint: payload.fingerprint,\n path: payload.serializedPath,\n publicKey: payload.publicKey,\n xpub: payload.xpub,\n xpubSegwit: payload.xpubSegwit,\n };\n\n trezorXpubCache.set(cacheKey, info);\n return info;\n }\n\n function getExtendedPublicKey(params: { accountIndex?: number } = {}) {\n return getExtendedPublicKeyInfo(params);\n }\n\n async function deriveAddressAtIndex({\n accountIndex,\n index,\n change = false,\n }: {\n accountIndex?: number;\n index: number;\n change?: boolean;\n }) {\n assertDerivationIndex(\"index\", index);\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const resolvedAccountPath = getUTXOAccountPath({ accountIndex, chain: utxoChain, derivationPath });\n const fullPath = `${derivationPathToString(resolvedAccountPath)}/${Number(change)}/${index}`;\n\n const { success, payload } = await TrezorConnect.getAddress({ coin, path: fullPath, showOnTrezor: false });\n\n if (!success) {\n return undefined;\n }\n\n let finalAddress = payload.address;\n if (chain === Chain.BitcoinCash) {\n const bchToolbox = await getUtxoToolbox(chain as typeof Chain.BitcoinCash);\n finalAddress = bchToolbox.stripPrefix(payload.address);\n }\n\n const pubKeyResult = await TrezorConnect.getPublicKey({ coin, path: fullPath });\n const pubkey = pubKeyResult.success ? pubKeyResult.payload.publicKey : \"\";\n\n return {\n accountIndex: getUTXOAccountIndexFromPath(resolvedAccountPath),\n address: finalAddress,\n change,\n index,\n path: fullPath,\n pubkey,\n };\n }\n\n async function deriveAddressesBatch({\n accountIndex,\n count,\n startIndex = 0,\n change = false,\n }: {\n accountIndex?: number;\n count: number;\n startIndex?: number;\n change?: boolean;\n }) {\n assertDerivationIndex(\"count\", count);\n assertDerivationIndex(\"startIndex\", startIndex);\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const resolvedAccountPath = getUTXOAccountPath({ accountIndex, chain: utxoChain, derivationPath });\n const accountPath = derivationPathToString(resolvedAccountPath);\n\n const paths = Array.from({ length: count }, (_, i) => ({\n coin,\n path: `${accountPath}/${Number(change)}/${startIndex + i}`,\n showOnTrezor: false,\n }));\n\n const { success, payload } = await TrezorConnect.getAddress({ bundle: paths });\n\n if (!success || !Array.isArray(payload)) {\n return [];\n }\n\n const addresses = await Promise.all(\n payload.map(async (result, i) => {\n let finalAddress = result.address;\n if (chain === Chain.BitcoinCash) {\n const bchToolbox = await getUtxoToolbox(chain as typeof Chain.BitcoinCash);\n finalAddress = bchToolbox.stripPrefix(result.address);\n }\n\n return {\n accountIndex: getUTXOAccountIndexFromPath(resolvedAccountPath),\n address: finalAddress,\n change,\n index: startIndex + i,\n path: `${accountPath}/${Number(change)}/${startIndex + i}`,\n pubkey: \"\",\n };\n }),\n );\n\n return addresses;\n }\n\n const hdHelpers = createHDWalletHelpers({\n chain,\n deriveAddress: deriveAddressAtIndex,\n getBalance: toolbox.getBalance,\n getUtxos: (addr: string) => getUtxoApi(chain).getUtxos({ address: addr, fetchTxHex: true }),\n });\n\n return {\n ...toolbox,\n ...hdHelpers,\n address,\n deriveAddressAtIndex,\n deriveAddresses: deriveAddressesBatch,\n getExtendedPublicKey,\n getExtendedPublicKeyInfo,\n signTransaction,\n signTransactionWithMultipleInputs,\n transfer,\n transferFromMultipleAddresses,\n };\n }\n\n default:\n throw new SwapKitError({ errorKey: \"wallet_chain_not_supported\", info: { chain, wallet: WalletOption.TREZOR } });\n }\n}\n\nexport const trezorWallet = createWallet({\n connect: ({ addChain, supportedChains, walletType }) =>\n async function connectTrezor(chains: Chain[], derivationPath: DerivationPathArray) {\n const [chain] = filterSupportedChains({ chains, supportedChains, walletType });\n if (!chain) {\n throw new SwapKitError({\n errorKey: \"wallet_chain_not_supported\",\n info: { chain, wallet: WalletOption.TREZOR },\n });\n }\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n\n const trezorConfig = SKConfig.get(\"integrations\").trezor as Record<string, unknown> | undefined;\n const {\n connectSrc,\n coreMode,\n debug,\n interactionTimeout,\n lazyLoad,\n pendingTransportEvent,\n popup,\n transportReconnect,\n transports,\n ...manifestConfig\n } = trezorConfig ?? {};\n const manifest = {\n ...manifestConfig,\n appName: String(trezorConfig?.appName || \"SwapKit\"),\n appUrl: String(trezorConfig?.appUrl || \"\"),\n email: String(trezorConfig?.email || \"\"),\n };\n const isLocalhost =\n typeof globalThis.location !== \"undefined\" && [\"localhost\", \"127.0.0.1\"].includes(globalThis.location.hostname);\n const resolvedCoreMode = isLocalhost ? \"popup\" : normalizeTrezorCoreMode(coreMode);\n const resolvedTransports = isLocalhost ? [\"WebUsbTransport\" as const] : normalizeTrezorTransports(transports);\n\n if (trezorSessionDispose) {\n await trezorSessionDispose;\n }\n\n if (isLocalhost) {\n await TrezorConnect.dispose();\n }\n\n await TrezorConnect.init({\n connectSrc: connectSrc as string | undefined,\n coreMode: resolvedCoreMode,\n debug: debug as boolean | undefined,\n interactionTimeout: interactionTimeout as number | undefined,\n lazyLoad: isLocalhost ? false : ((lazyLoad as boolean | undefined) ?? true),\n manifest,\n pendingTransportEvent: pendingTransportEvent as boolean | undefined,\n popup: isLocalhost ? true : (popup as boolean | undefined),\n transportReconnect: transportReconnect as boolean | undefined,\n transports: resolvedTransports,\n });\n\n const wallet = await getTrezorWallet({ chain, derivationPath });\n\n addChain({ ...wallet, chain, disconnect: disconnectTrezorSession, walletType });\n\n return true;\n },\n directSigningSupport: {\n [Chain.Arbitrum]: true,\n [Chain.Aurora]: true,\n [Chain.Avalanche]: true,\n [Chain.Base]: true,\n [Chain.Berachain]: true,\n [Chain.BinanceSmartChain]: true,\n [Chain.Bitcoin]: true,\n [Chain.Ethereum]: true,\n [Chain.Gnosis]: true,\n [Chain.Litecoin]: true,\n [Chain.Monad]: true,\n [Chain.Optimism]: true,\n [Chain.Polygon]: true,\n [Chain.XLayer]: true,\n // BCH/DASH/DOGE/ZEC: pending PSBT→TrezorConnect converter (V3 plan PR)\n },\n name: \"connectTrezor\",\n supportedChains: [\n Chain.Arbitrum,\n Chain.Aurora,\n Chain.Avalanche,\n Chain.Base,\n Chain.Berachain,\n Chain.BinanceSmartChain,\n Chain.Bitcoin,\n Chain.BitcoinCash,\n Chain.Dash,\n Chain.Dogecoin,\n Chain.Ethereum,\n Chain.Gnosis,\n Chain.Litecoin,\n Chain.Monad,\n Chain.Optimism,\n Chain.Polygon,\n Chain.XLayer,\n Chain.Zcash,\n ],\n walletType: WalletOption.TREZOR,\n});\n\nexport const TREZOR_SUPPORTED_CHAINS = getWalletSupportedChains(trezorWallet);\n"
|
|
5
|
+
"import { HDKey } from \"@scure/bip32\";\nimport {\n Chain,\n type DerivationPathArray,\n derivationPathToString,\n FeeOption,\n filterSupportedChains,\n type GenericTransferParams,\n SKConfig,\n SwapKitError,\n type UTXOChain,\n WalletOption,\n} from \"@swapkit/helpers\";\nimport {\n assertDerivationIndex,\n createHDWalletHelpers,\n deriveAddressesFromXpub,\n getNetworkForChain,\n getUTXOAccountIndexFromPath,\n getUTXOAccountPath,\n getUtxoApi,\n type UTXOToolboxes,\n type UTXOType,\n} from \"@swapkit/toolboxes/utxo\";\nimport type { BTCNetwork, PCZT, Transaction, ZcashTransaction } from \"@swapkit/utxo-signer\";\nimport { NETWORKS, ZcashConsensusBranchId, ZcashVersionGroupId } from \"@swapkit/utxo-signer\";\nimport { createWallet, getWalletSupportedChains } from \"@swapkit/wallet-core\";\n\ntype TrezorBip32Derivation = [Uint8Array, { fingerprint: number; path: number[] }];\ntype TrezorCoreMode = \"auto\" | \"iframe\" | \"popup\" | \"suite-desktop\" | \"suite-web\";\ntype TrezorTransport = \"BridgeTransport\" | \"WebUsbTransport\" | \"NodeUsbTransport\";\ntype TrezorExtendedPublicKeyInfo = {\n accountIndex: number;\n chainCode?: string;\n depth?: number;\n fingerprint?: number;\n path: string;\n publicKey?: string;\n xpub: string;\n xpubSegwit?: string;\n};\n\nconst TREZOR_CORE_MODES = new Set<TrezorCoreMode>([\"auto\", \"iframe\", \"popup\", \"suite-desktop\", \"suite-web\"]);\nconst TREZOR_TRANSPORTS = new Set<TrezorTransport>([\"BridgeTransport\", \"WebUsbTransport\", \"NodeUsbTransport\"]);\nconst DEFAULT_TREZOR_MANIFEST = { appName: \"SwapKit\", appUrl: \"https://swapkit.dev\", email: \"support@swapkit.dev\" };\nconst DEFAULT_TREZOR_TRANSPORTS = [\"WebUsbTransport\" as const];\nconst trezorXpubCache = new Map<string, TrezorExtendedPublicKeyInfo>();\nlet trezorSessionDispose: Promise<void> | undefined;\n\nasync function disconnectTrezorSession() {\n trezorXpubCache.clear();\n\n const dispose = (async () => {\n try {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n await TrezorConnect.dispose();\n } catch {\n // Ignore stale or already-disposed sessions.\n }\n })();\n\n trezorSessionDispose = dispose;\n await dispose;\n\n if (trezorSessionDispose === dispose) {\n trezorSessionDispose = undefined;\n }\n}\n\nfunction normalizeTrezorCoreMode(coreMode: unknown): TrezorCoreMode | undefined {\n return typeof coreMode === \"string\" && TREZOR_CORE_MODES.has(coreMode as TrezorCoreMode)\n ? (coreMode as TrezorCoreMode)\n : undefined;\n}\n\nfunction normalizeTrezorTransports(transports: unknown): TrezorTransport[] | undefined {\n if (!Array.isArray(transports)) return undefined;\n\n const normalized = transports.filter(\n (transport): transport is TrezorTransport =>\n typeof transport === \"string\" && TREZOR_TRANSPORTS.has(transport as TrezorTransport),\n );\n\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction getTrezorManifestValue(value: unknown, fallback: string) {\n return typeof value === \"string\" && value.trim() ? value : fallback;\n}\n\nfunction getDefaultTrezorAppUrl() {\n return typeof globalThis.location !== \"undefined\" && globalThis.location.origin\n ? globalThis.location.origin\n : DEFAULT_TREZOR_MANIFEST.appUrl;\n}\n\nfunction decodeOpReturnData(script: Uint8Array): string | null {\n if (script.length < 2 || script[0] !== 0x6a) return null;\n const dataLen = script[1];\n if (dataLen === undefined || script.length < 2 + dataLen) return null;\n return Buffer.from(script.slice(2, 2 + dataLen)).toString(\"hex\");\n}\n\nfunction getScriptType(derivationPath: DerivationPathArray) {\n switch (derivationPath[0]) {\n case 84:\n return { input: \"SPENDWITNESS\", output: \"PAYTOWITNESS\" } as const;\n case 49:\n return { input: \"SPENDP2SHWITNESS\", output: \"PAYTOP2SHWITNESS\" } as const;\n case 44:\n return { input: \"SPENDADDRESS\", output: \"PAYTOADDRESS\" } as const;\n default:\n return null;\n }\n}\n\nfunction hardenDerivationPath(derivationPath: DerivationPathArray): number[] {\n return derivationPath.map((pathElement, index) =>\n index < 3 ? ((pathElement as number) | 0x80000000) >>> 0 : (pathElement as number),\n );\n}\n\nfunction isTrezorBip32Derivation(value: unknown): value is TrezorBip32Derivation {\n return (\n Array.isArray(value) &&\n value[0] instanceof Uint8Array &&\n typeof value[1] === \"object\" &&\n value[1] !== null &&\n typeof (value[1] as { fingerprint?: unknown }).fingerprint === \"number\" &&\n Array.isArray((value[1] as { path?: unknown }).path)\n );\n}\n\nfunction getFirstBip32Derivation(input: { bip32Derivation?: unknown }): TrezorBip32Derivation | undefined {\n if (!Array.isArray(input.bip32Derivation)) return undefined;\n const [firstDerivation] = input.bip32Derivation;\n\n return isTrezorBip32Derivation(firstDerivation) ? firstDerivation : undefined;\n}\n\nfunction getPrevoutAmount(input: {\n index?: number;\n nonWitnessUtxo?: { outputs?: Array<{ amount?: bigint | number }> };\n witnessUtxo?: { amount?: bigint | number };\n}) {\n if (input.witnessUtxo?.amount !== undefined) return input.witnessUtxo.amount.toString();\n\n const prevout = input.index !== undefined ? input.nonWitnessUtxo?.outputs?.[input.index] : undefined;\n if (prevout?.amount !== undefined) return prevout.amount.toString();\n\n return undefined;\n}\n\nfunction normalizeTrezorSignature(signatureHex: string) {\n const signature = Buffer.from(signatureHex, \"hex\");\n const derLength = signature[1] !== undefined ? signature[1] + 2 : undefined;\n\n if (derLength !== undefined && signature.length === derLength) {\n return new Uint8Array([...signature, 0x01]);\n }\n\n return new Uint8Array(signature);\n}\n\nfunction buildPCZTInputsForTrezor(\n pczt: PCZT,\n address_n: number[],\n hexEncode: { encode: (data: Uint8Array) => string },\n) {\n const inputs = [];\n for (let i = 0; i < pczt.inputsLength; i++) {\n const input = pczt.getInput(i);\n inputs.push({\n address_n,\n amount: input.value.toString(),\n prev_hash: hexEncode.encode(new Uint8Array([...input.txid].reverse())),\n prev_index: input.index,\n script_type: \"SPENDADDRESS\" as const,\n });\n }\n return inputs;\n}\n\nasync function buildPCZTOutputsForTrezor(pczt: PCZT, address_n: number[], myAddress: string, chain: Chain) {\n const outputs = [];\n for (let i = 0; i < pczt.outputsLength; i++) {\n const output = pczt.getOutput(i);\n const script = output.scriptPubkey;\n\n if (output.value === 0n && script?.length > 0 && script[0] === 0x6a) {\n const opReturnData = decodeOpReturnData(script);\n if (opReturnData) {\n outputs.push({ amount: \"0\", op_return_data: opReturnData, script_type: \"PAYTOOPRETURN\" as const });\n continue;\n }\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Malformed OP_RETURN output cannot be signed\" },\n });\n }\n\n const outputAddress = await decodeOutputAddress(script);\n\n if (!outputAddress && output.value > 0n) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Unable to decode output address from scriptPubkey\" },\n });\n }\n\n const isChangeAddress = outputAddress === myAddress;\n\n if (isChangeAddress) {\n outputs.push({ address_n, amount: output.value.toString(), script_type: \"PAYTOADDRESS\" as const });\n } else {\n outputs.push({ address: outputAddress, amount: output.value.toString(), script_type: \"PAYTOADDRESS\" as const });\n }\n }\n return outputs;\n}\n\nasync function decodeOutputAddress(script: Uint8Array): Promise<string | undefined> {\n try {\n const { OutScript, Address } = await import(\"@swapkit/utxo-signer\");\n const decoded = OutScript.decode(script);\n if (decoded.type === \"pkh\" || decoded.type === \"pk\") {\n return Address(NETWORKS.zcash).encode(decoded);\n }\n } catch {\n // ignore decode errors\n }\n return undefined;\n}\n\nasync function extractSignaturesFromSignedTx(signedTxHex: string, pczt: PCZT): Promise<PCZT> {\n const { ZcashTransaction: ZcashTx, Script } = await import(\"@swapkit/utxo-signer\");\n const signedTx = ZcashTx.fromHex(signedTxHex, { allowUnknownOutputs: true });\n const signedPczt = pczt.clone();\n\n for (let i = 0; i < signedTx.inputsLength; i++) {\n const signedInput = signedTx.getInput(i);\n const script = signedInput.script;\n if (script && script.length > 0) {\n const scriptParts = Script.decode(script);\n if (scriptParts.length >= 2) {\n signedPczt.addSignature(i, scriptParts[1] as Uint8Array, scriptParts[0] as Uint8Array);\n }\n }\n }\n return signedPczt;\n}\n\nfunction buildZcashTxInputsForTrezor(\n tx: ZcashTransaction,\n utxoInputs: UTXOType[],\n address_n: number[],\n hexEncode: { encode: (data: Uint8Array) => string },\n) {\n const inputs = [];\n for (let i = 0; i < tx.inputsLength; i++) {\n const input = tx.getInput(i);\n const utxoInfo = utxoInputs[i];\n inputs.push({\n address_n,\n amount: utxoInfo?.value?.toString() || \"0\",\n prev_hash: input.txid ? hexEncode.encode(new Uint8Array([...input.txid].reverse())) : \"\",\n prev_index: input.index ?? 0,\n script_type: \"SPENDADDRESS\" as const,\n });\n }\n return inputs;\n}\n\nfunction buildZcashTxOutputsForTrezor(tx: ZcashTransaction, address_n: number[], myAddress: string, chain: Chain) {\n const outputs = [];\n for (let i = 0; i < tx.outputsLength; i++) {\n const output = tx.getOutput(i);\n const outputAddress = tx.getOutputAddress(i, NETWORKS.zcash);\n const script = output.script;\n\n if (output.amount === 0n && script?.length > 0 && script[0] === 0x6a) {\n const opReturnData = decodeOpReturnData(script);\n if (opReturnData) {\n outputs.push({ amount: \"0\", op_return_data: opReturnData, script_type: \"PAYTOOPRETURN\" as const });\n continue;\n }\n continue;\n }\n\n if (!outputAddress && (output.amount ?? 0n) > 0n) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Unable to decode output address\" },\n });\n }\n\n const isChangeAddress = outputAddress === myAddress;\n const outputParam = isChangeAddress || !outputAddress ? { address_n } : { address: outputAddress };\n outputs.push({ ...outputParam, amount: output.amount?.toString() || \"0\", script_type: \"PAYTOADDRESS\" as const });\n }\n return outputs;\n}\n\nfunction buildUtxoOutputsForTrezor(\n tx: Transaction,\n network: BTCNetwork,\n address_n: number[],\n myAddress: string,\n memo: string,\n chain: Chain,\n scriptType: { input: string; output: string },\n toCashAddress: (addr: string) => string,\n stripPrefix: (addr: string) => string,\n) {\n const outputs: any[] = [];\n for (let i = 0; i < tx.outputsLength; i++) {\n const output = tx.getOutput(i);\n const outputAddress = tx.getOutputAddress(i, network);\n\n if (!outputAddress) {\n const opReturnData = output.script ? decodeOpReturnData(output.script) : null;\n if (opReturnData !== null || memo) {\n outputs.push({\n amount: \"0\",\n op_return_data: opReturnData ?? Buffer.from(memo).toString(\"hex\"),\n script_type: \"PAYTOOPRETURN\",\n });\n continue;\n }\n\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Unable to decode output address from scriptPubkey\" },\n });\n }\n\n if (output.amount === undefined) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Output amount is missing\" },\n });\n }\n\n const isBch = chain === Chain.BitcoinCash;\n const cashAddrWithPrefix = isBch ? toCashAddress(outputAddress) : outputAddress;\n const isChangeAddress = isBch\n ? stripPrefix(cashAddrWithPrefix) === stripPrefix(myAddress)\n : cashAddrWithPrefix === myAddress;\n\n outputs.push(\n isChangeAddress\n ? { address_n, amount: output.amount.toString(), script_type: scriptType.output }\n : { address: cashAddrWithPrefix, amount: output.amount.toString(), script_type: \"PAYTOADDRESS\" },\n );\n }\n return outputs;\n}\n\nasync function getTrezorWallet<T extends Chain>({\n chain,\n derivationPath,\n}: {\n chain: T;\n derivationPath: DerivationPathArray;\n}) {\n switch (chain) {\n case Chain.Arbitrum:\n case Chain.Aurora:\n case Chain.Avalanche:\n case Chain.Base:\n case Chain.Berachain:\n case Chain.BinanceSmartChain:\n case Chain.Ethereum:\n case Chain.Gnosis:\n case Chain.Monad:\n case Chain.Optimism:\n case Chain.Polygon:\n case Chain.XLayer: {\n const { getProvider, getEvmToolboxAsync } = await import(\"@swapkit/toolboxes/evm\");\n const { getEVMSigner } = await import(\"./evmSigner\");\n\n const provider = await getProvider(chain);\n const signer = await getEVMSigner({ chain, derivationPath, provider });\n const address = await signer.getAddress();\n const toolbox = await getEvmToolboxAsync(chain, { provider, signer });\n\n return { ...toolbox, address };\n }\n\n case Chain.Zcash: {\n const { getUtxoToolbox } = await import(\"@swapkit/toolboxes/utxo\");\n\n const derivationPathStr = derivationPathToString(derivationPath);\n\n const getAddress = async () => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { success, payload } = await TrezorConnect.getAddress({ coin: \"zcash\", path: derivationPathStr });\n\n if (!success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { chain, error: (payload as { error: string; code?: string }).error || \"Unknown error\" },\n });\n }\n\n return payload.address;\n };\n\n const address = await getAddress();\n\n const signer = {\n getAddress: async () => address,\n\n signPCZT: async (pczt: PCZT): Promise<PCZT> => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { hex: hexEncode } = await import(\"@scure/base\");\n const address_n = hardenDerivationPath(derivationPath);\n const global = pczt.getGlobal();\n\n const inputs = buildPCZTInputsForTrezor(pczt, address_n, hexEncode);\n const outputs = await buildPCZTOutputsForTrezor(pczt, address_n, address, chain);\n\n const result = await TrezorConnect.signTransaction({\n branchId: global.consensusBranchId,\n coin: \"zcash\",\n expiry: global.expiryHeight,\n inputs,\n locktime: global.lockTime,\n outputs: outputs as any,\n overwintered: true,\n version: global.txVersion,\n versionGroupId: global.versionGroupId,\n });\n\n if (!result.success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: (result.payload as { error: string; code?: string }).error },\n });\n }\n\n return extractSignaturesFromSignedTx(result.payload.serializedTx, pczt);\n },\n\n signTransaction: async (tx: ZcashTransaction, utxoInputs: UTXOType[]) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { hex: hexEncode } = await import(\"@scure/base\");\n const address_n = hardenDerivationPath(derivationPath);\n\n const inputs = buildZcashTxInputsForTrezor(tx, utxoInputs, address_n, hexEncode);\n const outputs = buildZcashTxOutputsForTrezor(tx, address_n, address, chain);\n\n const result = await TrezorConnect.signTransaction({\n branchId: ZcashConsensusBranchId.NU6,\n coin: \"zcash\",\n expiry: 0,\n inputs,\n locktime: 0,\n outputs: outputs as any,\n overwintered: true,\n version: 4,\n versionGroupId: ZcashVersionGroupId.SAPLING,\n });\n\n if (result.success) {\n return result.payload.serializedTx;\n }\n\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: (result.payload as { error: string; code?: string }).error },\n });\n },\n };\n\n const toolbox = getUtxoToolbox(Chain.Zcash);\n\n const transfer = async (params: GenericTransferParams) => {\n if (!(address && params.recipient)) {\n throw new SwapKitError({\n errorKey: \"wallet_missing_params\",\n info: { address, recipient: params.recipient, wallet: WalletOption.TREZOR },\n });\n }\n\n const feeRate = params.feeRate || (await toolbox.getFeeRates())[params.feeOptionKey || FeeOption.Fast];\n\n const { tx, inputs: txInputs } = await toolbox.createTransaction({\n ...params,\n feeRate,\n fetchTxHex: false,\n sender: address,\n });\n\n const txHex = await signer.signTransaction(tx, txInputs);\n const broadcastResult = await toolbox.broadcastTx(txHex);\n\n return broadcastResult;\n };\n\n const transferWithPCZT = async (params: GenericTransferParams) => {\n if (!(address && params.recipient)) {\n throw new SwapKitError({\n errorKey: \"wallet_missing_params\",\n info: { address, recipient: params.recipient, wallet: WalletOption.TREZOR },\n });\n }\n\n const { createPCZT, OutScript } = await import(\"@swapkit/utxo-signer\");\n const { hex: hexEncode } = await import(\"@scure/base\");\n const { getUtxoApi } = await import(\"@swapkit/toolboxes/utxo\");\n\n const feeRate = params.feeRate || (await toolbox.getFeeRates())[params.feeOptionKey || FeeOption.Fast];\n\n const utxos = await getUtxoApi(Chain.Zcash).getUtxos({ address });\n\n const { tx, inputs: txInputs } = await toolbox.createTransaction({\n ...params,\n feeRate,\n fetchTxHex: false,\n sender: address,\n });\n\n const pczt = createPCZT();\n\n for (const utxoInput of txInputs) {\n const utxo = utxos.find((u) => u.hash === utxoInput.hash && u.index === utxoInput.index);\n const scriptPubkey = utxo?.witnessUtxo?.script\n ? new Uint8Array(utxo.witnessUtxo.script)\n : OutScript.encode({ hash: hexEncode.decode((utxoInput as any).address || \"\"), type: \"pkh\" });\n\n pczt.addInput({\n index: utxoInput.index,\n scriptPubkey,\n txid: hexEncode.decode(utxoInput.hash).reverse() as unknown as Uint8Array,\n value: BigInt(utxoInput.value),\n });\n }\n\n for (let i = 0; i < tx.outputsLength; i++) {\n const output = tx.getOutput(i);\n pczt.addOutput({ scriptPubkey: output.script || new Uint8Array(), value: output.amount || 0n });\n }\n\n const signedPczt = await signer.signPCZT(pczt);\n signedPczt.finalizeAllInputs();\n const finalTx = signedPczt.extract();\n const broadcastResult = await toolbox.broadcastTx(finalTx.toHex());\n\n return broadcastResult;\n };\n\n return {\n ...toolbox,\n address,\n signPCZT: signer.signPCZT,\n signTransaction: signer.signTransaction,\n transfer,\n transferWithPCZT,\n };\n }\n\n case Chain.Bitcoin:\n case Chain.BitcoinCash:\n case Chain.Dash:\n case Chain.Dogecoin:\n case Chain.Litecoin: {\n const { toCashAddress, getUtxoToolbox, stripPrefix } = await import(\"@swapkit/toolboxes/utxo\");\n const utxoChain = chain as UTXOChain;\n const scriptType = getScriptType(derivationPath);\n\n if (!scriptType) {\n throw new SwapKitError({ errorKey: \"wallet_trezor_derivation_path_not_supported\", info: { derivationPath } });\n }\n\n const coin = chain.toLowerCase();\n\n const getAddress = async (path: DerivationPathArray = derivationPath) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { success, payload } = await TrezorConnect.getAddress({\n coin,\n path: derivationPathToString(path),\n showOnTrezor: false,\n });\n\n if (!success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { chain, error: (payload as { error: string; code?: string }).error || \"Unknown error\" },\n });\n }\n\n if (chain === Chain.BitcoinCash) {\n return stripPrefix(payload.address);\n }\n\n return payload.address;\n };\n\n async function getAddressFromExtendedPublicKey() {\n const accountInfo = await getExtendedPublicKeyInfo();\n const addressIndex = Number(derivationPath[4] ?? 0);\n const change = Boolean(derivationPath[3] ?? 0);\n\n try {\n // deriveAddressesFromXpub returns both external and change branches for each index.\n const derivedAddress = deriveAddressesFromXpub({\n accountIndex: accountInfo.accountIndex,\n chain: utxoChain,\n count: 1,\n startIndex: addressIndex,\n xpub: accountInfo.xpub,\n }).find((derived) => derived.change === change && derived.index === addressIndex);\n\n if (!derivedAddress) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { chain, error: \"Unable to derive address from Trezor account public key\" },\n });\n }\n\n return derivedAddress.address;\n } catch (error) {\n if (error instanceof SwapKitError) throw error;\n\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: {\n chain,\n error: error instanceof Error ? error.message : \"Unable to derive address from Trezor xpub\",\n },\n });\n }\n }\n\n const address =\n chain === Chain.Bitcoin || chain === Chain.Litecoin\n ? await getAddressFromExtendedPublicKey()\n : await getAddress();\n const baseToolbox = getUtxoToolbox(chain);\n\n const signTransaction = async (tx: Transaction, inputs: UTXOType[], memo = \"\") => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const address_n = hardenDerivationPath(derivationPath);\n const network = getNetworkForChain(chain as UTXOChain);\n\n const outputs = buildUtxoOutputsForTrezor(\n tx,\n network,\n address_n,\n address,\n memo,\n chain,\n scriptType,\n toCashAddress,\n stripPrefix,\n );\n\n const trezorInputs = inputs.map(({ hash, index, value }) => ({\n address_n,\n amount: value,\n prev_hash: hash,\n prev_index: index,\n script_type: scriptType.input,\n }));\n\n const result = await TrezorConnect.signTransaction({ coin, inputs: trezorInputs, outputs });\n\n if (result.success) {\n return result.payload.serializedTx;\n }\n\n const payload = result.payload as { error?: string; code?: string };\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, code: payload?.code ?? \"unknown\", error: payload?.error ?? \"unknown\", payload },\n });\n };\n\n const signPsbtTransaction = async (tx: Transaction): Promise<Transaction> => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { hex: hexEncode } = await import(\"@scure/base\");\n const address_n = hardenDerivationPath(derivationPath);\n const network = getNetworkForChain(chain as UTXOChain);\n let fallbackPublicKey: Uint8Array | undefined;\n\n async function getFallbackDerivation(): Promise<TrezorBip32Derivation> {\n if (!fallbackPublicKey) {\n const accountInfo = await getExtendedPublicKeyInfo();\n const accountKey = HDKey.fromExtendedKey(accountInfo.xpub);\n const leaf = accountKey.derive(`m/${Number(derivationPath[3] ?? 0)}/${Number(derivationPath[4] ?? 0)}`);\n\n if (!leaf.publicKey) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_public_key\",\n info: { chain, error: \"Unable to derive Trezor leaf public key from account xpub\" },\n });\n }\n\n fallbackPublicKey = leaf.publicKey;\n }\n\n return [fallbackPublicKey, { fingerprint: 0, path: address_n }];\n }\n\n const signerPubkeys: Uint8Array[] = [];\n const trezorInputs = [];\n\n for (let inputIndex = 0; inputIndex < tx.inputsLength; inputIndex++) {\n const input = tx.getInput(inputIndex);\n const existingDerivation = getFirstBip32Derivation(input);\n const derivation = existingDerivation ?? (await getFallbackDerivation());\n const amount = getPrevoutAmount(input);\n\n if (!input.txid || input.index === undefined || !amount) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: `Input ${inputIndex} is missing prevout data required by Trezor` },\n });\n }\n\n signerPubkeys[inputIndex] = derivation[0];\n\n if (!existingDerivation) {\n tx.updateInput(inputIndex, { bip32Derivation: [derivation] });\n }\n\n trezorInputs.push({\n address_n: derivation[1].path,\n amount,\n prev_hash: hexEncode.encode(input.txid),\n prev_index: input.index,\n script_type: scriptType.input,\n ...(input.sequence !== undefined ? { sequence: input.sequence } : {}),\n });\n }\n\n const outputs = buildUtxoOutputsForTrezor(\n tx,\n network,\n address_n,\n address,\n \"\",\n chain,\n scriptType,\n toCashAddress,\n stripPrefix,\n );\n\n const result = await TrezorConnect.signTransaction({\n coin,\n inputs: trezorInputs,\n locktime: tx.lockTime,\n outputs,\n version: tx.version,\n });\n\n if (!result.success) {\n const payload = result.payload as { error?: string; code?: string };\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, code: payload?.code ?? \"unknown\", error: payload?.error ?? \"unknown\", payload },\n });\n }\n\n result.payload.signatures.forEach((signatureHex, inputIndex) => {\n const pubkey = signerPubkeys[inputIndex];\n if (!(signatureHex && pubkey)) return;\n\n tx.updateInput(inputIndex, { partialSig: [[pubkey, normalizeTrezorSignature(signatureHex)]] });\n });\n\n return tx;\n };\n\n const signTransactionWithMultipleInputs = async (\n tx: Transaction,\n inputs: Array<{ hash: string; index: number; value: number; derivationIndex: number; isChange: boolean }>,\n memo = \"\",\n ) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const network = getNetworkForChain(chain as UTXOChain);\n const baseAddressN = hardenDerivationPath(derivationPath.slice(0, 3) as DerivationPathArray);\n\n const outputs = buildUtxoOutputsForTrezor(\n tx,\n network,\n baseAddressN,\n address,\n memo,\n chain,\n scriptType,\n toCashAddress,\n stripPrefix,\n );\n\n const trezorInputs = inputs.map(({ hash, index: inputIndex, value, derivationIndex, isChange }) => {\n const changePath = isChange ? 1 : 0;\n const inputAddressN = [...baseAddressN, changePath, derivationIndex];\n return {\n address_n: inputAddressN,\n amount: value,\n prev_hash: hash,\n prev_index: inputIndex,\n script_type: scriptType.input,\n };\n });\n\n const result = await TrezorConnect.signTransaction({ coin, inputs: trezorInputs, outputs });\n\n if (result.success) {\n return result.payload.serializedTx;\n }\n\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: (result.payload as { error: string; code?: string }).error },\n });\n };\n\n const transferFromMultipleAddresses = async ({\n utxos,\n recipient,\n assetValue,\n memo,\n feeRate,\n feeOptionKey,\n }: {\n utxos: Array<{\n hash: string;\n index: number;\n value: number;\n txHex?: string;\n derivationIndex: number;\n isChange: boolean;\n address: string;\n }>;\n recipient: string;\n assetValue: { getBaseValue: (unit: string) => number; chain: string };\n memo?: string;\n feeRate?: number;\n feeOptionKey?: (typeof FeeOption)[keyof typeof FeeOption];\n }) => {\n const toolbox = getUtxoToolbox(chain);\n const txFeeRate = feeRate || (await toolbox.getFeeRates())[feeOptionKey || FeeOption.Fast];\n\n const { tx, inputs: selectedInputs } = await toolbox.createTransaction({\n assetValue: assetValue as any,\n feeRate: txFeeRate,\n fetchTxHex: true,\n memo,\n recipient,\n sender: address,\n });\n\n const inputsWithDerivation = selectedInputs.map((input: { hash: string; index: number; value: number }) => {\n const utxoInfo = utxos.find((u) => u.hash === input.hash && u.index === input.index);\n return { ...input, derivationIndex: utxoInfo?.derivationIndex ?? 0, isChange: utxoInfo?.isChange ?? false };\n });\n\n const signedTxHex = await signTransactionWithMultipleInputs(tx as Transaction, inputsWithDerivation, memo);\n return toolbox.broadcastTx(signedTxHex);\n };\n\n const transfer = async ({\n recipient,\n feeOptionKey,\n feeRate: paramFeeRate,\n memo,\n ...rest\n }: GenericTransferParams) => {\n if (!(address && recipient)) {\n throw new SwapKitError({\n errorKey: \"wallet_missing_params\",\n info: { address, memo, recipient, wallet: WalletOption.TREZOR },\n });\n }\n\n const toolbox = getUtxoToolbox(chain);\n\n const feeRate = paramFeeRate || (await toolbox.getFeeRates())[feeOptionKey || FeeOption.Fast];\n\n const createTxMethod = (toolbox as UTXOToolboxes[\"BTC\"]).createTransaction;\n\n const { tx, inputs } = await createTxMethod({\n ...rest,\n feeRate,\n fetchTxHex: true,\n memo,\n recipient,\n sender: address,\n });\n\n const signedTxHex = await signTransaction(tx, inputs, memo);\n const txHash = await toolbox.broadcastTx(signedTxHex);\n\n return txHash;\n };\n\n const toolbox =\n chain === Chain.Bitcoin || chain === Chain.Litecoin\n ? await getUtxoToolbox(utxoChain, {\n signer: { getAddress: async () => address, signTransaction: signPsbtTransaction },\n })\n : baseToolbox;\n\n async function getExtendedPublicKeyInfo({ accountIndex }: { accountIndex?: number } = {}) {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const resolvedAccountPath = getUTXOAccountPath({ accountIndex, chain: utxoChain, derivationPath });\n const path = derivationPathToString(resolvedAccountPath);\n const cacheKey = `${chain}:${path}`;\n const cached = trezorXpubCache.get(cacheKey);\n if (cached) return cached;\n\n const { success, payload } = await TrezorConnect.getPublicKey({ coin, path });\n\n if (!success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_public_key\",\n info: { chain, error: (payload as { error: string; code?: string }).error || \"Unknown error\" },\n });\n }\n\n const info = {\n accountIndex: getUTXOAccountIndexFromPath(resolvedAccountPath),\n chainCode: payload.chainCode,\n depth: payload.depth,\n fingerprint: payload.fingerprint,\n path: payload.serializedPath,\n publicKey: payload.publicKey,\n xpub: payload.xpub,\n xpubSegwit: payload.xpubSegwit,\n };\n\n trezorXpubCache.set(cacheKey, info);\n return info;\n }\n\n function getExtendedPublicKey(params: { accountIndex?: number } = {}) {\n return getExtendedPublicKeyInfo(params);\n }\n\n async function deriveAddressAtIndex({\n accountIndex,\n index,\n change = false,\n }: {\n accountIndex?: number;\n index: number;\n change?: boolean;\n }) {\n assertDerivationIndex(\"index\", index);\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const resolvedAccountPath = getUTXOAccountPath({ accountIndex, chain: utxoChain, derivationPath });\n const fullPath = `${derivationPathToString(resolvedAccountPath)}/${Number(change)}/${index}`;\n\n const { success, payload } = await TrezorConnect.getAddress({ coin, path: fullPath, showOnTrezor: false });\n\n if (!success) {\n return undefined;\n }\n\n let finalAddress = payload.address;\n if (chain === Chain.BitcoinCash) {\n const bchToolbox = await getUtxoToolbox(chain as typeof Chain.BitcoinCash);\n finalAddress = bchToolbox.stripPrefix(payload.address);\n }\n\n const pubKeyResult = await TrezorConnect.getPublicKey({ coin, path: fullPath });\n const pubkey = pubKeyResult.success ? pubKeyResult.payload.publicKey : \"\";\n\n return {\n accountIndex: getUTXOAccountIndexFromPath(resolvedAccountPath),\n address: finalAddress,\n change,\n index,\n path: fullPath,\n pubkey,\n };\n }\n\n async function deriveAddressesBatch({\n accountIndex,\n count,\n startIndex = 0,\n change = false,\n }: {\n accountIndex?: number;\n count: number;\n startIndex?: number;\n change?: boolean;\n }) {\n assertDerivationIndex(\"count\", count);\n assertDerivationIndex(\"startIndex\", startIndex);\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const resolvedAccountPath = getUTXOAccountPath({ accountIndex, chain: utxoChain, derivationPath });\n const accountPath = derivationPathToString(resolvedAccountPath);\n\n const paths = Array.from({ length: count }, (_, i) => ({\n coin,\n path: `${accountPath}/${Number(change)}/${startIndex + i}`,\n showOnTrezor: false,\n }));\n\n const { success, payload } = await TrezorConnect.getAddress({ bundle: paths });\n\n if (!success || !Array.isArray(payload)) {\n return [];\n }\n\n const addresses = await Promise.all(\n payload.map(async (result, i) => {\n let finalAddress = result.address;\n if (chain === Chain.BitcoinCash) {\n const bchToolbox = await getUtxoToolbox(chain as typeof Chain.BitcoinCash);\n finalAddress = bchToolbox.stripPrefix(result.address);\n }\n\n return {\n accountIndex: getUTXOAccountIndexFromPath(resolvedAccountPath),\n address: finalAddress,\n change,\n index: startIndex + i,\n path: `${accountPath}/${Number(change)}/${startIndex + i}`,\n pubkey: \"\",\n };\n }),\n );\n\n return addresses;\n }\n\n const hdHelpers = createHDWalletHelpers({\n chain,\n deriveAddress: deriveAddressAtIndex,\n getBalance: toolbox.getBalance,\n getUtxos: (addr: string) => getUtxoApi(chain).getUtxos({ address: addr, fetchTxHex: true }),\n });\n\n return {\n ...toolbox,\n ...hdHelpers,\n address,\n deriveAddressAtIndex,\n deriveAddresses: deriveAddressesBatch,\n getExtendedPublicKey,\n getExtendedPublicKeyInfo,\n signTransaction,\n signTransactionWithMultipleInputs,\n transfer,\n transferFromMultipleAddresses,\n };\n }\n\n default:\n throw new SwapKitError({ errorKey: \"wallet_chain_not_supported\", info: { chain, wallet: WalletOption.TREZOR } });\n }\n}\n\nexport const trezorWallet = createWallet({\n connect: ({ addChain, supportedChains, walletType }) =>\n async function connectTrezor(chains: Chain[], derivationPath: DerivationPathArray) {\n const [chain] = filterSupportedChains({ chains, supportedChains, walletType });\n if (!chain) {\n throw new SwapKitError({\n errorKey: \"wallet_chain_not_supported\",\n info: { chain, wallet: WalletOption.TREZOR },\n });\n }\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n\n const trezorConfig = SKConfig.get(\"integrations\").trezor as Record<string, unknown> | undefined;\n const {\n connectSrc,\n coreMode,\n debug,\n interactionTimeout,\n lazyLoad,\n pendingTransportEvent,\n popup,\n transportReconnect,\n transports,\n ...manifestConfig\n } = trezorConfig ?? {};\n const manifest = {\n ...manifestConfig,\n appName: getTrezorManifestValue(trezorConfig?.appName, DEFAULT_TREZOR_MANIFEST.appName),\n appUrl: getTrezorManifestValue(trezorConfig?.appUrl, getDefaultTrezorAppUrl()),\n email: getTrezorManifestValue(trezorConfig?.email, DEFAULT_TREZOR_MANIFEST.email),\n };\n const isLocalhost =\n typeof globalThis.location !== \"undefined\" && [\"localhost\", \"127.0.0.1\"].includes(globalThis.location.hostname);\n const resolvedCoreMode = normalizeTrezorCoreMode(coreMode) ?? \"popup\";\n const resolvedTransports = normalizeTrezorTransports(transports) ?? DEFAULT_TREZOR_TRANSPORTS;\n\n if (trezorSessionDispose) {\n await trezorSessionDispose;\n }\n\n if (isLocalhost) {\n await TrezorConnect.dispose();\n }\n\n await TrezorConnect.init({\n connectSrc: connectSrc as string | undefined,\n coreMode: resolvedCoreMode,\n debug: debug as boolean | undefined,\n interactionTimeout: interactionTimeout as number | undefined,\n lazyLoad: (lazyLoad as boolean | undefined) ?? false,\n manifest,\n pendingTransportEvent: pendingTransportEvent as boolean | undefined,\n popup: (popup as boolean | undefined) ?? true,\n transportReconnect: transportReconnect as boolean | undefined,\n transports: resolvedTransports,\n });\n\n const wallet = await getTrezorWallet({ chain, derivationPath });\n\n addChain({ ...wallet, chain, disconnect: disconnectTrezorSession, walletType });\n\n return true;\n },\n directSigningSupport: {\n [Chain.Arbitrum]: true,\n [Chain.Aurora]: true,\n [Chain.Avalanche]: true,\n [Chain.Base]: true,\n [Chain.Berachain]: true,\n [Chain.BinanceSmartChain]: true,\n [Chain.Bitcoin]: true,\n [Chain.Ethereum]: true,\n [Chain.Gnosis]: true,\n [Chain.Litecoin]: true,\n [Chain.Monad]: true,\n [Chain.Optimism]: true,\n [Chain.Polygon]: true,\n [Chain.XLayer]: true,\n // BCH/DASH/DOGE/ZEC: pending PSBT→TrezorConnect converter (V3 plan PR)\n },\n name: \"connectTrezor\",\n supportedChains: [\n Chain.Arbitrum,\n Chain.Aurora,\n Chain.Avalanche,\n Chain.Base,\n Chain.Berachain,\n Chain.BinanceSmartChain,\n Chain.Bitcoin,\n Chain.BitcoinCash,\n Chain.Dash,\n Chain.Dogecoin,\n Chain.Ethereum,\n Chain.Gnosis,\n Chain.Litecoin,\n Chain.Monad,\n Chain.Optimism,\n Chain.Polygon,\n Chain.XLayer,\n Chain.Zcash,\n ],\n walletType: WalletOption.TREZOR,\n});\n\nexport const TREZOR_SUPPORTED_CHAINS = getWalletSupportedChains(trezorWallet);\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "EA2F0D19307EFA5064756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/trezor/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{d as F}from"../chunk-n05bv2n5.js";import{HDKey as qj}from"@scure/bip32";import{Chain as q,derivationPathToString as l,FeeOption as d,filterSupportedChains as Bj,SKConfig as Gj,SwapKitError as L,WalletOption as h}from"@swapkit/helpers";import{assertDerivationIndex as r,createHDWalletHelpers as Jj,deriveAddressesFromXpub as Qj,getNetworkForChain as s,getUTXOAccountIndexFromPath as o,getUTXOAccountPath as a,getUtxoApi as Uj}from"@swapkit/toolboxes/utxo";import{NETWORKS as jj,ZcashConsensusBranchId as Xj,ZcashVersionGroupId as Yj}from"@swapkit/utxo-signer";import{createWallet as Zj,getWalletSupportedChains as $j}from"@swapkit/wallet-core";var Sj=new Set(["auto","iframe","popup","suite-desktop","suite-web"]),Nj=new Set(["BridgeTransport","WebUsbTransport","NodeUsbTransport"]),t=new Map,p;async function Vj(){t.clear();let j=(async()=>{try{await(await import("@trezor/connect-web")).default.dispose()}catch{}})();if(p=j,await j,p===j)p=void 0}function Ej(j){return typeof j==="string"&&Sj.has(j)?j:void 0}function Wj(j){if(!Array.isArray(j))return;let B=j.filter((Z)=>typeof Z==="string"&&Nj.has(Z));return B.length>0?B:void 0}function e(j){if(j.length<2||j[0]!==106)return null;let B=j[1];if(B===void 0||j.length<2+B)return null;return Buffer.from(j.slice(2,2+B)).toString("hex")}function Dj(j){switch(j[0]){case 84:return{input:"SPENDWITNESS",output:"PAYTOWITNESS"};case 49:return{input:"SPENDP2SHWITNESS",output:"PAYTOP2SHWITNESS"};case 44:return{input:"SPENDADDRESS",output:"PAYTOADDRESS"};default:return null}}function c(j){return j.map((B,Z)=>Z<3?(B|2147483648)>>>0:B)}function Oj(j){return Array.isArray(j)&&j[0]instanceof Uint8Array&&typeof j[1]==="object"&&j[1]!==null&&typeof j[1].fingerprint==="number"&&Array.isArray(j[1].path)}function _j(j){if(!Array.isArray(j.bip32Derivation))return;let[B]=j.bip32Derivation;return Oj(B)?B:void 0}function Fj(j){if(j.witnessUtxo?.amount!==void 0)return j.witnessUtxo.amount.toString();let B=j.index!==void 0?j.nonWitnessUtxo?.outputs?.[j.index]:void 0;if(B?.amount!==void 0)return B.amount.toString();return}function Lj(j){let B=Buffer.from(j,"hex"),Z=B[1]!==void 0?B[1]+2:void 0;if(Z!==void 0&&B.length===Z)return new Uint8Array([...B,1]);return new Uint8Array(B)}function Mj(j,B,Z){let S=[];for(let $=0;$<j.inputsLength;$++){let G=j.getInput($);S.push({address_n:B,amount:G.value.toString(),prev_hash:Z.encode(new Uint8Array([...G.txid].reverse())),prev_index:G.index,script_type:"SPENDADDRESS"})}return S}async function Hj(j,B,Z,S){let $=[];for(let G=0;G<j.outputsLength;G++){let U=j.getOutput(G),Y=U.scriptPubkey;if(U.value===0n&&Y?.length>0&&Y[0]===106){let Q=e(Y);if(Q){$.push({amount:"0",op_return_data:Q,script_type:"PAYTOOPRETURN"});continue}throw new L({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:S,error:"Malformed OP_RETURN output cannot be signed"}})}let D=await wj(Y);if(!D&&U.value>0n)throw new L({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:S,error:"Unable to decode output address from scriptPubkey"}});if(D===Z)$.push({address_n:B,amount:U.value.toString(),script_type:"PAYTOADDRESS"});else $.push({address:D,amount:U.value.toString(),script_type:"PAYTOADDRESS"})}return $}async function wj(j){try{let{OutScript:B,Address:Z}=await import("@swapkit/utxo-signer"),S=B.decode(j);if(S.type==="pkh"||S.type==="pk")return Z(jj.zcash).encode(S)}catch{}return}async function Rj(j,B){let{ZcashTransaction:Z,Script:S}=await import("@swapkit/utxo-signer"),$=Z.fromHex(j,{allowUnknownOutputs:!0}),G=B.clone();for(let U=0;U<$.inputsLength;U++){let D=$.getInput(U).script;if(D&&D.length>0){let b=S.decode(D);if(b.length>=2)G.addSignature(U,b[1],b[0])}}return G}function kj(j,B,Z,S){let $=[];for(let G=0;G<j.inputsLength;G++){let U=j.getInput(G),Y=B[G];$.push({address_n:Z,amount:Y?.value?.toString()||"0",prev_hash:U.txid?S.encode(new Uint8Array([...U.txid].reverse())):"",prev_index:U.index??0,script_type:"SPENDADDRESS"})}return $}function Kj(j,B,Z,S){let $=[];for(let G=0;G<j.outputsLength;G++){let U=j.getOutput(G),Y=j.getOutputAddress(G,jj.zcash),D=U.script;if(U.amount===0n&&D?.length>0&&D[0]===106){let M=e(D);if(M){$.push({amount:"0",op_return_data:M,script_type:"PAYTOOPRETURN"});continue}continue}if(!Y&&(U.amount??0n)>0n)throw new L({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:S,error:"Unable to decode output address"}});let Q=Y===Z||!Y?{address_n:B}:{address:Y};$.push({...Q,amount:U.amount?.toString()||"0",script_type:"PAYTOADDRESS"})}return $}function n(j,B,Z,S,$,G,U,Y,D){let b=[];for(let Q=0;Q<j.outputsLength;Q++){let M=j.getOutput(Q),k=j.getOutputAddress(Q,B);if(!k){let f=M.script?e(M.script):null;if(f!==null||$){b.push({amount:"0",op_return_data:f??Buffer.from($).toString("hex"),script_type:"PAYTOOPRETURN"});continue}throw new L({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:G,error:"Unable to decode output address from scriptPubkey"}})}if(M.amount===void 0)throw new L({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:G,error:"Output amount is missing"}});let A=G===q.BitcoinCash,w=A?Y(k):k,T=A?D(w)===D(S):w===S;b.push(T?{address_n:Z,amount:M.amount.toString(),script_type:U.output}:{address:w,amount:M.amount.toString(),script_type:"PAYTOADDRESS"})}return b}async function zj({chain:j,derivationPath:B}){switch(j){case q.Arbitrum:case q.Aurora:case q.Avalanche:case q.Base:case q.Berachain:case q.BinanceSmartChain:case q.Ethereum:case q.Gnosis:case q.Monad:case q.Optimism:case q.Polygon:case q.XLayer:{let{getProvider:Z,getEvmToolboxAsync:S}=await import("@swapkit/toolboxes/evm"),{getEVMSigner:$}=await import("../chunk-9tg9jj9j.js"),G=await Z(j),U=await $({chain:j,derivationPath:B,provider:G}),Y=await U.getAddress();return{...await S(j,{provider:G,signer:U}),address:Y}}case q.Zcash:{let{getUtxoToolbox:Z}=await import("@swapkit/toolboxes/utxo"),S=l(B),G=await(async()=>{let Q=(await import("@trezor/connect-web")).default,{success:M,payload:k}=await Q.getAddress({coin:"zcash",path:S});if(!M)throw new L({errorKey:"wallet_trezor_failed_to_get_address",info:{chain:j,error:k.error||"Unknown error"}});return k.address})(),U={getAddress:async()=>G,signPCZT:async(Q)=>{let M=(await import("@trezor/connect-web")).default,{hex:k}=await import("@scure/base"),A=c(B),w=Q.getGlobal(),T=Mj(Q,A,k),f=await Hj(Q,A,G,j),C=await M.signTransaction({branchId:w.consensusBranchId,coin:"zcash",expiry:w.expiryHeight,inputs:T,locktime:w.lockTime,outputs:f,overwintered:!0,version:w.txVersion,versionGroupId:w.versionGroupId});if(!C.success)throw new L({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:j,error:C.payload.error}});return Rj(C.payload.serializedTx,Q)},signTransaction:async(Q,M)=>{let k=(await import("@trezor/connect-web")).default,{hex:A}=await import("@scure/base"),w=c(B),T=kj(Q,M,w,A),f=Kj(Q,w,G,j),C=await k.signTransaction({branchId:Xj.NU6,coin:"zcash",expiry:0,inputs:T,locktime:0,outputs:f,overwintered:!0,version:4,versionGroupId:Yj.SAPLING});if(C.success)return C.payload.serializedTx;throw new L({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:j,error:C.payload.error}})}},Y=Z(q.Zcash),D=async(Q)=>{if(!(G&&Q.recipient))throw new L({errorKey:"wallet_missing_params",info:{address:G,recipient:Q.recipient,wallet:h.TREZOR}});let M=Q.feeRate||(await Y.getFeeRates())[Q.feeOptionKey||d.Fast],{tx:k,inputs:A}=await Y.createTransaction({...Q,feeRate:M,fetchTxHex:!1,sender:G}),w=await U.signTransaction(k,A);return await Y.broadcastTx(w)},b=async(Q)=>{if(!(G&&Q.recipient))throw new L({errorKey:"wallet_missing_params",info:{address:G,recipient:Q.recipient,wallet:h.TREZOR}});let{createPCZT:M,OutScript:k}=await import("@swapkit/utxo-signer"),{hex:A}=await import("@scure/base"),{getUtxoApi:w}=await import("@swapkit/toolboxes/utxo"),T=Q.feeRate||(await Y.getFeeRates())[Q.feeOptionKey||d.Fast],f=await w(q.Zcash).getUtxos({address:G}),{tx:C,inputs:I}=await Y.createTransaction({...Q,feeRate:T,fetchTxHex:!1,sender:G}),y=M();for(let J of I){let N=f.find((X)=>X.hash===J.hash&&X.index===J.index),E=N?.witnessUtxo?.script?new Uint8Array(N.witnessUtxo.script):k.encode({hash:A.decode(J.address||""),type:"pkh"});y.addInput({index:J.index,scriptPubkey:E,txid:A.decode(J.hash).reverse(),value:BigInt(J.value)})}for(let J=0;J<C.outputsLength;J++){let N=C.getOutput(J);y.addOutput({scriptPubkey:N.script||new Uint8Array,value:N.amount||0n})}let g=await U.signPCZT(y);g.finalizeAllInputs();let x=g.extract();return await Y.broadcastTx(x.toHex())};return{...Y,address:G,signPCZT:U.signPCZT,signTransaction:U.signTransaction,transfer:D,transferWithPCZT:b}}case q.Bitcoin:case q.BitcoinCash:case q.Dash:case q.Dogecoin:case q.Litecoin:{let y=function(J={}){return I(J)},{toCashAddress:Z,getUtxoToolbox:S,stripPrefix:$}=await import("@swapkit/toolboxes/utxo"),G=j,U=Dj(B);if(!U)throw new L({errorKey:"wallet_trezor_derivation_path_not_supported",info:{derivationPath:B}});let Y=j.toLowerCase(),D=async(J=B)=>{let N=(await import("@trezor/connect-web")).default,{success:E,payload:X}=await N.getAddress({coin:Y,path:l(J),showOnTrezor:!1});if(!E)throw new L({errorKey:"wallet_trezor_failed_to_get_address",info:{chain:j,error:X.error||"Unknown error"}});if(j===q.BitcoinCash)return $(X.address);return X.address};async function b(){let J=await I(),N=Number(B[4]??0),E=Boolean(B[3]??0);try{let X=Qj({accountIndex:J.accountIndex,chain:G,count:1,startIndex:N,xpub:J.xpub}).find((R)=>R.change===E&&R.index===N);if(!X)throw new L({errorKey:"wallet_trezor_failed_to_get_address",info:{chain:j,error:"Unable to derive address from Trezor account public key"}});return X.address}catch(X){if(X instanceof L)throw X;throw new L({errorKey:"wallet_trezor_failed_to_get_address",info:{chain:j,error:X instanceof Error?X.message:"Unable to derive address from Trezor xpub"}})}}let Q=j===q.Bitcoin||j===q.Litecoin?await b():await D(),M=S(j),k=async(J,N,E="")=>{let X=(await import("@trezor/connect-web")).default,R=c(B),O=s(j),K=n(J,O,R,Q,E,j,U,Z,$),_=N.map(({hash:v,index:V,value:W})=>({address_n:R,amount:W,prev_hash:v,prev_index:V,script_type:U.input})),H=await X.signTransaction({coin:Y,inputs:_,outputs:K});if(H.success)return H.payload.serializedTx;let z=H.payload;throw new L({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:j,code:z?.code??"unknown",error:z?.error??"unknown",payload:z}})},A=async(J)=>{let N=(await import("@trezor/connect-web")).default,{hex:E}=await import("@scure/base"),X=c(B),R=s(j),O;async function K(){if(!O){let V=await I(),P=qj.fromExtendedKey(V.xpub).derive(`m/${Number(B[3]??0)}/${Number(B[4]??0)}`);if(!P.publicKey)throw new L({errorKey:"wallet_trezor_failed_to_get_public_key",info:{chain:j,error:"Unable to derive Trezor leaf public key from account xpub"}});O=P.publicKey}return[O,{fingerprint:0,path:X}]}let _=[],H=[];for(let V=0;V<J.inputsLength;V++){let W=J.getInput(V),P=_j(W),m=P??await K(),i=Fj(W);if(!W.txid||W.index===void 0||!i)throw new L({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:j,error:`Input ${V} is missing prevout data required by Trezor`}});if(_[V]=m[0],!P)J.updateInput(V,{bip32Derivation:[m]});H.push({address_n:m[1].path,amount:i,prev_hash:E.encode(W.txid),prev_index:W.index,script_type:U.input,...W.sequence!==void 0?{sequence:W.sequence}:{}})}let z=n(J,R,X,Q,"",j,U,Z,$),v=await N.signTransaction({coin:Y,inputs:H,locktime:J.lockTime,outputs:z,version:J.version});if(!v.success){let V=v.payload;throw new L({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:j,code:V?.code??"unknown",error:V?.error??"unknown",payload:V}})}return v.payload.signatures.forEach((V,W)=>{let P=_[W];if(!(V&&P))return;J.updateInput(W,{partialSig:[[P,Lj(V)]]})}),J},w=async(J,N,E="")=>{let X=(await import("@trezor/connect-web")).default,R=s(j),O=c(B.slice(0,3)),K=n(J,R,O,Q,E,j,U,Z,$),_=N.map(({hash:z,index:v,value:V,derivationIndex:W,isChange:P})=>{let m=P?1:0;return{address_n:[...O,m,W],amount:V,prev_hash:z,prev_index:v,script_type:U.input}}),H=await X.signTransaction({coin:Y,inputs:_,outputs:K});if(H.success)return H.payload.serializedTx;throw new L({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:j,error:H.payload.error}})},T=async({utxos:J,recipient:N,assetValue:E,memo:X,feeRate:R,feeOptionKey:O})=>{let K=S(j),_=R||(await K.getFeeRates())[O||d.Fast],{tx:H,inputs:z}=await K.createTransaction({assetValue:E,feeRate:_,fetchTxHex:!0,memo:X,recipient:N,sender:Q}),v=z.map((W)=>{let P=J.find((m)=>m.hash===W.hash&&m.index===W.index);return{...W,derivationIndex:P?.derivationIndex??0,isChange:P?.isChange??!1}}),V=await w(H,v,X);return K.broadcastTx(V)},f=async({recipient:J,feeOptionKey:N,feeRate:E,memo:X,...R})=>{if(!(Q&&J))throw new L({errorKey:"wallet_missing_params",info:{address:Q,memo:X,recipient:J,wallet:h.TREZOR}});let O=S(j),K=E||(await O.getFeeRates())[N||d.Fast],_=O.createTransaction,{tx:H,inputs:z}=await _({...R,feeRate:K,fetchTxHex:!0,memo:X,recipient:J,sender:Q}),v=await k(H,z,X);return await O.broadcastTx(v)},C=j===q.Bitcoin||j===q.Litecoin?await S(G,{signer:{getAddress:async()=>Q,signTransaction:A}}):M;async function I({accountIndex:J}={}){let N=(await import("@trezor/connect-web")).default,E=a({accountIndex:J,chain:G,derivationPath:B}),X=l(E),R=`${j}:${X}`,O=t.get(R);if(O)return O;let{success:K,payload:_}=await N.getPublicKey({coin:Y,path:X});if(!K)throw new L({errorKey:"wallet_trezor_failed_to_get_public_key",info:{chain:j,error:_.error||"Unknown error"}});let H={accountIndex:o(E),chainCode:_.chainCode,depth:_.depth,fingerprint:_.fingerprint,path:_.serializedPath,publicKey:_.publicKey,xpub:_.xpub,xpubSegwit:_.xpubSegwit};return t.set(R,H),H}async function g({accountIndex:J,index:N,change:E=!1}){r("index",N);let X=(await import("@trezor/connect-web")).default,R=a({accountIndex:J,chain:G,derivationPath:B}),O=`${l(R)}/${Number(E)}/${N}`,{success:K,payload:_}=await X.getAddress({coin:Y,path:O,showOnTrezor:!1});if(!K)return;let H=_.address;if(j===q.BitcoinCash)H=(await S(j)).stripPrefix(_.address);let z=await X.getPublicKey({coin:Y,path:O}),v=z.success?z.payload.publicKey:"";return{accountIndex:o(R),address:H,change:E,index:N,path:O,pubkey:v}}async function x({accountIndex:J,count:N,startIndex:E=0,change:X=!1}){r("count",N),r("startIndex",E);let R=(await import("@trezor/connect-web")).default,O=a({accountIndex:J,chain:G,derivationPath:B}),K=l(O),_=Array.from({length:N},(V,W)=>({coin:Y,path:`${K}/${Number(X)}/${E+W}`,showOnTrezor:!1})),{success:H,payload:z}=await R.getAddress({bundle:_});if(!H||!Array.isArray(z))return[];return await Promise.all(z.map(async(V,W)=>{let P=V.address;if(j===q.BitcoinCash)P=(await S(j)).stripPrefix(V.address);return{accountIndex:o(O),address:P,change:X,index:E+W,path:`${K}/${Number(X)}/${E+W}`,pubkey:""}}))}let u=Jj({chain:j,deriveAddress:g,getBalance:C.getBalance,getUtxos:(J)=>Uj(j).getUtxos({address:J,fetchTxHex:!0})});return{...C,...u,address:Q,deriveAddressAtIndex:g,deriveAddresses:x,getExtendedPublicKey:y,getExtendedPublicKeyInfo:I,signTransaction:k,signTransactionWithMultipleInputs:w,transfer:f,transferFromMultipleAddresses:T}}default:throw new L({errorKey:"wallet_chain_not_supported",info:{chain:j,wallet:h.TREZOR}})}}var Aj=Zj({connect:({addChain:j,supportedChains:B,walletType:Z})=>async function($,G){let[U]=Bj({chains:$,supportedChains:B,walletType:Z});if(!U)throw new L({errorKey:"wallet_chain_not_supported",info:{chain:U,wallet:h.TREZOR}});let Y=(await import("@trezor/connect-web")).default,D=Gj.get("integrations").trezor,{connectSrc:b,coreMode:Q,debug:M,interactionTimeout:k,lazyLoad:A,pendingTransportEvent:w,popup:T,transportReconnect:f,transports:C,...I}=D??{},y={...I,appName:String(D?.appName||"SwapKit"),appUrl:String(D?.appUrl||""),email:String(D?.email||"")},g=typeof globalThis.location<"u"&&["localhost","127.0.0.1"].includes(globalThis.location.hostname),x=g?"popup":Ej(Q),u=g?["WebUsbTransport"]:Wj(C);if(p)await p;if(g)await Y.dispose();await Y.init({connectSrc:b,coreMode:x,debug:M,interactionTimeout:k,lazyLoad:g?!1:A??!0,manifest:y,pendingTransportEvent:w,popup:g?!0:T,transportReconnect:f,transports:u});let J=await zj({chain:U,derivationPath:G});return j({...J,chain:U,disconnect:Vj,walletType:Z}),!0},directSigningSupport:{[q.Arbitrum]:!0,[q.Aurora]:!0,[q.Avalanche]:!0,[q.Base]:!0,[q.Berachain]:!0,[q.BinanceSmartChain]:!0,[q.Bitcoin]:!0,[q.Ethereum]:!0,[q.Gnosis]:!0,[q.Litecoin]:!0,[q.Monad]:!0,[q.Optimism]:!0,[q.Polygon]:!0,[q.XLayer]:!0},name:"connectTrezor",supportedChains:[q.Arbitrum,q.Aurora,q.Avalanche,q.Base,q.Berachain,q.BinanceSmartChain,q.Bitcoin,q.BitcoinCash,q.Dash,q.Dogecoin,q.Ethereum,q.Gnosis,q.Litecoin,q.Monad,q.Optimism,q.Polygon,q.XLayer,q.Zcash],walletType:h.TREZOR}),fj=$j(Aj);export{Aj as trezorWallet,fj as TREZOR_SUPPORTED_CHAINS};
|
|
1
|
+
import{d as _}from"../chunk-n05bv2n5.js";import{HDKey as Gj}from"@scure/bip32";import{Chain as q,derivationPathToString as l,FeeOption as d,filterSupportedChains as Jj,SKConfig as Qj,SwapKitError as F,WalletOption as h}from"@swapkit/helpers";import{assertDerivationIndex as s,createHDWalletHelpers as Uj,deriveAddressesFromXpub as Xj,getNetworkForChain as r,getUTXOAccountIndexFromPath as o,getUTXOAccountPath as a,getUtxoApi as Yj}from"@swapkit/toolboxes/utxo";import{NETWORKS as Bj,ZcashConsensusBranchId as Zj,ZcashVersionGroupId as $j}from"@swapkit/utxo-signer";import{createWallet as Sj,getWalletSupportedChains as Lj}from"@swapkit/wallet-core";var Nj=new Set(["auto","iframe","popup","suite-desktop","suite-web"]),Vj=new Set(["BridgeTransport","WebUsbTransport","NodeUsbTransport"]),e={appName:"SwapKit",appUrl:"https://swapkit.dev",email:"support@swapkit.dev"},Ej=["WebUsbTransport"],jj=new Map,p;async function Wj(){jj.clear();let j=(async()=>{try{await(await import("@trezor/connect-web")).default.dispose()}catch{}})();if(p=j,await j,p===j)p=void 0}function Dj(j){return typeof j==="string"&&Nj.has(j)?j:void 0}function Oj(j){if(!Array.isArray(j))return;let B=j.filter((Z)=>typeof Z==="string"&&Vj.has(Z));return B.length>0?B:void 0}function n(j,B){return typeof j==="string"&&j.trim()?j:B}function _j(){return typeof globalThis.location<"u"&&globalThis.location.origin?globalThis.location.origin:e.appUrl}function qj(j){if(j.length<2||j[0]!==106)return null;let B=j[1];if(B===void 0||j.length<2+B)return null;return Buffer.from(j.slice(2,2+B)).toString("hex")}function Fj(j){switch(j[0]){case 84:return{input:"SPENDWITNESS",output:"PAYTOWITNESS"};case 49:return{input:"SPENDP2SHWITNESS",output:"PAYTOP2SHWITNESS"};case 44:return{input:"SPENDADDRESS",output:"PAYTOADDRESS"};default:return null}}function c(j){return j.map((B,Z)=>Z<3?(B|2147483648)>>>0:B)}function Mj(j){return Array.isArray(j)&&j[0]instanceof Uint8Array&&typeof j[1]==="object"&&j[1]!==null&&typeof j[1].fingerprint==="number"&&Array.isArray(j[1].path)}function Hj(j){if(!Array.isArray(j.bip32Derivation))return;let[B]=j.bip32Derivation;return Mj(B)?B:void 0}function wj(j){if(j.witnessUtxo?.amount!==void 0)return j.witnessUtxo.amount.toString();let B=j.index!==void 0?j.nonWitnessUtxo?.outputs?.[j.index]:void 0;if(B?.amount!==void 0)return B.amount.toString();return}function Rj(j){let B=Buffer.from(j,"hex"),Z=B[1]!==void 0?B[1]+2:void 0;if(Z!==void 0&&B.length===Z)return new Uint8Array([...B,1]);return new Uint8Array(B)}function kj(j,B,Z){let S=[];for(let $=0;$<j.inputsLength;$++){let G=j.getInput($);S.push({address_n:B,amount:G.value.toString(),prev_hash:Z.encode(new Uint8Array([...G.txid].reverse())),prev_index:G.index,script_type:"SPENDADDRESS"})}return S}async function Kj(j,B,Z,S){let $=[];for(let G=0;G<j.outputsLength;G++){let U=j.getOutput(G),Y=U.scriptPubkey;if(U.value===0n&&Y?.length>0&&Y[0]===106){let Q=qj(Y);if(Q){$.push({amount:"0",op_return_data:Q,script_type:"PAYTOOPRETURN"});continue}throw new F({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:S,error:"Malformed OP_RETURN output cannot be signed"}})}let W=await zj(Y);if(!W&&U.value>0n)throw new F({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:S,error:"Unable to decode output address from scriptPubkey"}});if(W===Z)$.push({address_n:B,amount:U.value.toString(),script_type:"PAYTOADDRESS"});else $.push({address:W,amount:U.value.toString(),script_type:"PAYTOADDRESS"})}return $}async function zj(j){try{let{OutScript:B,Address:Z}=await import("@swapkit/utxo-signer"),S=B.decode(j);if(S.type==="pkh"||S.type==="pk")return Z(Bj.zcash).encode(S)}catch{}return}async function Aj(j,B){let{ZcashTransaction:Z,Script:S}=await import("@swapkit/utxo-signer"),$=Z.fromHex(j,{allowUnknownOutputs:!0}),G=B.clone();for(let U=0;U<$.inputsLength;U++){let W=$.getInput(U).script;if(W&&W.length>0){let b=S.decode(W);if(b.length>=2)G.addSignature(U,b[1],b[0])}}return G}function Pj(j,B,Z,S){let $=[];for(let G=0;G<j.inputsLength;G++){let U=j.getInput(G),Y=B[G];$.push({address_n:Z,amount:Y?.value?.toString()||"0",prev_hash:U.txid?S.encode(new Uint8Array([...U.txid].reverse())):"",prev_index:U.index??0,script_type:"SPENDADDRESS"})}return $}function bj(j,B,Z,S){let $=[];for(let G=0;G<j.outputsLength;G++){let U=j.getOutput(G),Y=j.getOutputAddress(G,Bj.zcash),W=U.script;if(U.amount===0n&&W?.length>0&&W[0]===106){let M=qj(W);if(M){$.push({amount:"0",op_return_data:M,script_type:"PAYTOOPRETURN"});continue}continue}if(!Y&&(U.amount??0n)>0n)throw new F({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:S,error:"Unable to decode output address"}});let Q=Y===Z||!Y?{address_n:B}:{address:Y};$.push({...Q,amount:U.amount?.toString()||"0",script_type:"PAYTOADDRESS"})}return $}function t(j,B,Z,S,$,G,U,Y,W){let b=[];for(let Q=0;Q<j.outputsLength;Q++){let M=j.getOutput(Q),k=j.getOutputAddress(Q,B);if(!k){let f=M.script?qj(M.script):null;if(f!==null||$){b.push({amount:"0",op_return_data:f??Buffer.from($).toString("hex"),script_type:"PAYTOOPRETURN"});continue}throw new F({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:G,error:"Unable to decode output address from scriptPubkey"}})}if(M.amount===void 0)throw new F({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:G,error:"Output amount is missing"}});let A=G===q.BitcoinCash,w=A?Y(k):k,T=A?W(w)===W(S):w===S;b.push(T?{address_n:Z,amount:M.amount.toString(),script_type:U.output}:{address:w,amount:M.amount.toString(),script_type:"PAYTOADDRESS"})}return b}async function Cj({chain:j,derivationPath:B}){switch(j){case q.Arbitrum:case q.Aurora:case q.Avalanche:case q.Base:case q.Berachain:case q.BinanceSmartChain:case q.Ethereum:case q.Gnosis:case q.Monad:case q.Optimism:case q.Polygon:case q.XLayer:{let{getProvider:Z,getEvmToolboxAsync:S}=await import("@swapkit/toolboxes/evm"),{getEVMSigner:$}=await import("../chunk-9tg9jj9j.js"),G=await Z(j),U=await $({chain:j,derivationPath:B,provider:G}),Y=await U.getAddress();return{...await S(j,{provider:G,signer:U}),address:Y}}case q.Zcash:{let{getUtxoToolbox:Z}=await import("@swapkit/toolboxes/utxo"),S=l(B),G=await(async()=>{let Q=(await import("@trezor/connect-web")).default,{success:M,payload:k}=await Q.getAddress({coin:"zcash",path:S});if(!M)throw new F({errorKey:"wallet_trezor_failed_to_get_address",info:{chain:j,error:k.error||"Unknown error"}});return k.address})(),U={getAddress:async()=>G,signPCZT:async(Q)=>{let M=(await import("@trezor/connect-web")).default,{hex:k}=await import("@scure/base"),A=c(B),w=Q.getGlobal(),T=kj(Q,A,k),f=await Kj(Q,A,G,j),C=await M.signTransaction({branchId:w.consensusBranchId,coin:"zcash",expiry:w.expiryHeight,inputs:T,locktime:w.lockTime,outputs:f,overwintered:!0,version:w.txVersion,versionGroupId:w.versionGroupId});if(!C.success)throw new F({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:j,error:C.payload.error}});return Aj(C.payload.serializedTx,Q)},signTransaction:async(Q,M)=>{let k=(await import("@trezor/connect-web")).default,{hex:A}=await import("@scure/base"),w=c(B),T=Pj(Q,M,w,A),f=bj(Q,w,G,j),C=await k.signTransaction({branchId:Zj.NU6,coin:"zcash",expiry:0,inputs:T,locktime:0,outputs:f,overwintered:!0,version:4,versionGroupId:$j.SAPLING});if(C.success)return C.payload.serializedTx;throw new F({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:j,error:C.payload.error}})}},Y=Z(q.Zcash),W=async(Q)=>{if(!(G&&Q.recipient))throw new F({errorKey:"wallet_missing_params",info:{address:G,recipient:Q.recipient,wallet:h.TREZOR}});let M=Q.feeRate||(await Y.getFeeRates())[Q.feeOptionKey||d.Fast],{tx:k,inputs:A}=await Y.createTransaction({...Q,feeRate:M,fetchTxHex:!1,sender:G}),w=await U.signTransaction(k,A);return await Y.broadcastTx(w)},b=async(Q)=>{if(!(G&&Q.recipient))throw new F({errorKey:"wallet_missing_params",info:{address:G,recipient:Q.recipient,wallet:h.TREZOR}});let{createPCZT:M,OutScript:k}=await import("@swapkit/utxo-signer"),{hex:A}=await import("@scure/base"),{getUtxoApi:w}=await import("@swapkit/toolboxes/utxo"),T=Q.feeRate||(await Y.getFeeRates())[Q.feeOptionKey||d.Fast],f=await w(q.Zcash).getUtxos({address:G}),{tx:C,inputs:m}=await Y.createTransaction({...Q,feeRate:T,fetchTxHex:!1,sender:G}),I=M();for(let J of m){let L=f.find((X)=>X.hash===J.hash&&X.index===J.index),V=L?.witnessUtxo?.script?new Uint8Array(L.witnessUtxo.script):k.encode({hash:A.decode(J.address||""),type:"pkh"});I.addInput({index:J.index,scriptPubkey:V,txid:A.decode(J.hash).reverse(),value:BigInt(J.value)})}for(let J=0;J<C.outputsLength;J++){let L=C.getOutput(J);I.addOutput({scriptPubkey:L.script||new Uint8Array,value:L.amount||0n})}let y=await U.signPCZT(I);y.finalizeAllInputs();let x=y.extract();return await Y.broadcastTx(x.toHex())};return{...Y,address:G,signPCZT:U.signPCZT,signTransaction:U.signTransaction,transfer:W,transferWithPCZT:b}}case q.Bitcoin:case q.BitcoinCash:case q.Dash:case q.Dogecoin:case q.Litecoin:{let I=function(J={}){return m(J)},{toCashAddress:Z,getUtxoToolbox:S,stripPrefix:$}=await import("@swapkit/toolboxes/utxo"),G=j,U=Fj(B);if(!U)throw new F({errorKey:"wallet_trezor_derivation_path_not_supported",info:{derivationPath:B}});let Y=j.toLowerCase(),W=async(J=B)=>{let L=(await import("@trezor/connect-web")).default,{success:V,payload:X}=await L.getAddress({coin:Y,path:l(J),showOnTrezor:!1});if(!V)throw new F({errorKey:"wallet_trezor_failed_to_get_address",info:{chain:j,error:X.error||"Unknown error"}});if(j===q.BitcoinCash)return $(X.address);return X.address};async function b(){let J=await m(),L=Number(B[4]??0),V=Boolean(B[3]??0);try{let X=Xj({accountIndex:J.accountIndex,chain:G,count:1,startIndex:L,xpub:J.xpub}).find((R)=>R.change===V&&R.index===L);if(!X)throw new F({errorKey:"wallet_trezor_failed_to_get_address",info:{chain:j,error:"Unable to derive address from Trezor account public key"}});return X.address}catch(X){if(X instanceof F)throw X;throw new F({errorKey:"wallet_trezor_failed_to_get_address",info:{chain:j,error:X instanceof Error?X.message:"Unable to derive address from Trezor xpub"}})}}let Q=j===q.Bitcoin||j===q.Litecoin?await b():await W(),M=S(j),k=async(J,L,V="")=>{let X=(await import("@trezor/connect-web")).default,R=c(B),D=r(j),K=t(J,D,R,Q,V,j,U,Z,$),O=L.map(({hash:v,index:N,value:E})=>({address_n:R,amount:E,prev_hash:v,prev_index:N,script_type:U.input})),H=await X.signTransaction({coin:Y,inputs:O,outputs:K});if(H.success)return H.payload.serializedTx;let z=H.payload;throw new F({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:j,code:z?.code??"unknown",error:z?.error??"unknown",payload:z}})},A=async(J)=>{let L=(await import("@trezor/connect-web")).default,{hex:V}=await import("@scure/base"),X=c(B),R=r(j),D;async function K(){if(!D){let N=await m(),P=Gj.fromExtendedKey(N.xpub).derive(`m/${Number(B[3]??0)}/${Number(B[4]??0)}`);if(!P.publicKey)throw new F({errorKey:"wallet_trezor_failed_to_get_public_key",info:{chain:j,error:"Unable to derive Trezor leaf public key from account xpub"}});D=P.publicKey}return[D,{fingerprint:0,path:X}]}let O=[],H=[];for(let N=0;N<J.inputsLength;N++){let E=J.getInput(N),P=Hj(E),g=P??await K(),i=wj(E);if(!E.txid||E.index===void 0||!i)throw new F({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:j,error:`Input ${N} is missing prevout data required by Trezor`}});if(O[N]=g[0],!P)J.updateInput(N,{bip32Derivation:[g]});H.push({address_n:g[1].path,amount:i,prev_hash:V.encode(E.txid),prev_index:E.index,script_type:U.input,...E.sequence!==void 0?{sequence:E.sequence}:{}})}let z=t(J,R,X,Q,"",j,U,Z,$),v=await L.signTransaction({coin:Y,inputs:H,locktime:J.lockTime,outputs:z,version:J.version});if(!v.success){let N=v.payload;throw new F({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:j,code:N?.code??"unknown",error:N?.error??"unknown",payload:N}})}return v.payload.signatures.forEach((N,E)=>{let P=O[E];if(!(N&&P))return;J.updateInput(E,{partialSig:[[P,Rj(N)]]})}),J},w=async(J,L,V="")=>{let X=(await import("@trezor/connect-web")).default,R=r(j),D=c(B.slice(0,3)),K=t(J,R,D,Q,V,j,U,Z,$),O=L.map(({hash:z,index:v,value:N,derivationIndex:E,isChange:P})=>{let g=P?1:0;return{address_n:[...D,g,E],amount:N,prev_hash:z,prev_index:v,script_type:U.input}}),H=await X.signTransaction({coin:Y,inputs:O,outputs:K});if(H.success)return H.payload.serializedTx;throw new F({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:j,error:H.payload.error}})},T=async({utxos:J,recipient:L,assetValue:V,memo:X,feeRate:R,feeOptionKey:D})=>{let K=S(j),O=R||(await K.getFeeRates())[D||d.Fast],{tx:H,inputs:z}=await K.createTransaction({assetValue:V,feeRate:O,fetchTxHex:!0,memo:X,recipient:L,sender:Q}),v=z.map((E)=>{let P=J.find((g)=>g.hash===E.hash&&g.index===E.index);return{...E,derivationIndex:P?.derivationIndex??0,isChange:P?.isChange??!1}}),N=await w(H,v,X);return K.broadcastTx(N)},f=async({recipient:J,feeOptionKey:L,feeRate:V,memo:X,...R})=>{if(!(Q&&J))throw new F({errorKey:"wallet_missing_params",info:{address:Q,memo:X,recipient:J,wallet:h.TREZOR}});let D=S(j),K=V||(await D.getFeeRates())[L||d.Fast],O=D.createTransaction,{tx:H,inputs:z}=await O({...R,feeRate:K,fetchTxHex:!0,memo:X,recipient:J,sender:Q}),v=await k(H,z,X);return await D.broadcastTx(v)},C=j===q.Bitcoin||j===q.Litecoin?await S(G,{signer:{getAddress:async()=>Q,signTransaction:A}}):M;async function m({accountIndex:J}={}){let L=(await import("@trezor/connect-web")).default,V=a({accountIndex:J,chain:G,derivationPath:B}),X=l(V),R=`${j}:${X}`,D=jj.get(R);if(D)return D;let{success:K,payload:O}=await L.getPublicKey({coin:Y,path:X});if(!K)throw new F({errorKey:"wallet_trezor_failed_to_get_public_key",info:{chain:j,error:O.error||"Unknown error"}});let H={accountIndex:o(V),chainCode:O.chainCode,depth:O.depth,fingerprint:O.fingerprint,path:O.serializedPath,publicKey:O.publicKey,xpub:O.xpub,xpubSegwit:O.xpubSegwit};return jj.set(R,H),H}async function y({accountIndex:J,index:L,change:V=!1}){s("index",L);let X=(await import("@trezor/connect-web")).default,R=a({accountIndex:J,chain:G,derivationPath:B}),D=`${l(R)}/${Number(V)}/${L}`,{success:K,payload:O}=await X.getAddress({coin:Y,path:D,showOnTrezor:!1});if(!K)return;let H=O.address;if(j===q.BitcoinCash)H=(await S(j)).stripPrefix(O.address);let z=await X.getPublicKey({coin:Y,path:D}),v=z.success?z.payload.publicKey:"";return{accountIndex:o(R),address:H,change:V,index:L,path:D,pubkey:v}}async function x({accountIndex:J,count:L,startIndex:V=0,change:X=!1}){s("count",L),s("startIndex",V);let R=(await import("@trezor/connect-web")).default,D=a({accountIndex:J,chain:G,derivationPath:B}),K=l(D),O=Array.from({length:L},(N,E)=>({coin:Y,path:`${K}/${Number(X)}/${V+E}`,showOnTrezor:!1})),{success:H,payload:z}=await R.getAddress({bundle:O});if(!H||!Array.isArray(z))return[];return await Promise.all(z.map(async(N,E)=>{let P=N.address;if(j===q.BitcoinCash)P=(await S(j)).stripPrefix(N.address);return{accountIndex:o(D),address:P,change:X,index:V+E,path:`${K}/${Number(X)}/${V+E}`,pubkey:""}}))}let u=Uj({chain:j,deriveAddress:y,getBalance:C.getBalance,getUtxos:(J)=>Yj(j).getUtxos({address:J,fetchTxHex:!0})});return{...C,...u,address:Q,deriveAddressAtIndex:y,deriveAddresses:x,getExtendedPublicKey:I,getExtendedPublicKeyInfo:m,signTransaction:k,signTransactionWithMultipleInputs:w,transfer:f,transferFromMultipleAddresses:T}}default:throw new F({errorKey:"wallet_chain_not_supported",info:{chain:j,wallet:h.TREZOR}})}}var vj=Sj({connect:({addChain:j,supportedChains:B,walletType:Z})=>async function($,G){let[U]=Jj({chains:$,supportedChains:B,walletType:Z});if(!U)throw new F({errorKey:"wallet_chain_not_supported",info:{chain:U,wallet:h.TREZOR}});let Y=(await import("@trezor/connect-web")).default,W=Qj.get("integrations").trezor,{connectSrc:b,coreMode:Q,debug:M,interactionTimeout:k,lazyLoad:A,pendingTransportEvent:w,popup:T,transportReconnect:f,transports:C,...m}=W??{},I={...m,appName:n(W?.appName,e.appName),appUrl:n(W?.appUrl,_j()),email:n(W?.email,e.email)},y=typeof globalThis.location<"u"&&["localhost","127.0.0.1"].includes(globalThis.location.hostname),x=Dj(Q)??"popup",u=Oj(C)??Ej;if(p)await p;if(y)await Y.dispose();await Y.init({connectSrc:b,coreMode:x,debug:M,interactionTimeout:k,lazyLoad:A??!1,manifest:I,pendingTransportEvent:w,popup:T??!0,transportReconnect:f,transports:u});let J=await Cj({chain:U,derivationPath:G});return j({...J,chain:U,disconnect:Wj,walletType:Z}),!0},directSigningSupport:{[q.Arbitrum]:!0,[q.Aurora]:!0,[q.Avalanche]:!0,[q.Base]:!0,[q.Berachain]:!0,[q.BinanceSmartChain]:!0,[q.Bitcoin]:!0,[q.Ethereum]:!0,[q.Gnosis]:!0,[q.Litecoin]:!0,[q.Monad]:!0,[q.Optimism]:!0,[q.Polygon]:!0,[q.XLayer]:!0},name:"connectTrezor",supportedChains:[q.Arbitrum,q.Aurora,q.Avalanche,q.Base,q.Berachain,q.BinanceSmartChain,q.Bitcoin,q.BitcoinCash,q.Dash,q.Dogecoin,q.Ethereum,q.Gnosis,q.Litecoin,q.Monad,q.Optimism,q.Polygon,q.XLayer,q.Zcash],walletType:h.TREZOR}),yj=Lj(vj);export{vj as trezorWallet,yj as TREZOR_SUPPORTED_CHAINS};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=CC2564B1AB08006E64756E2164756E21
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/trezor/index.js.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/trezor/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { HDKey } from \"@scure/bip32\";\nimport {\n Chain,\n type DerivationPathArray,\n derivationPathToString,\n FeeOption,\n filterSupportedChains,\n type GenericTransferParams,\n SKConfig,\n SwapKitError,\n type UTXOChain,\n WalletOption,\n} from \"@swapkit/helpers\";\nimport {\n assertDerivationIndex,\n createHDWalletHelpers,\n deriveAddressesFromXpub,\n getNetworkForChain,\n getUTXOAccountIndexFromPath,\n getUTXOAccountPath,\n getUtxoApi,\n type UTXOToolboxes,\n type UTXOType,\n} from \"@swapkit/toolboxes/utxo\";\nimport type { BTCNetwork, PCZT, Transaction, ZcashTransaction } from \"@swapkit/utxo-signer\";\nimport { NETWORKS, ZcashConsensusBranchId, ZcashVersionGroupId } from \"@swapkit/utxo-signer\";\nimport { createWallet, getWalletSupportedChains } from \"@swapkit/wallet-core\";\n\ntype TrezorBip32Derivation = [Uint8Array, { fingerprint: number; path: number[] }];\ntype TrezorCoreMode = \"auto\" | \"iframe\" | \"popup\" | \"suite-desktop\" | \"suite-web\";\ntype TrezorTransport = \"BridgeTransport\" | \"WebUsbTransport\" | \"NodeUsbTransport\";\ntype TrezorExtendedPublicKeyInfo = {\n accountIndex: number;\n chainCode?: string;\n depth?: number;\n fingerprint?: number;\n path: string;\n publicKey?: string;\n xpub: string;\n xpubSegwit?: string;\n};\n\nconst TREZOR_CORE_MODES = new Set<TrezorCoreMode>([\"auto\", \"iframe\", \"popup\", \"suite-desktop\", \"suite-web\"]);\nconst TREZOR_TRANSPORTS = new Set<TrezorTransport>([\"BridgeTransport\", \"WebUsbTransport\", \"NodeUsbTransport\"]);\nconst trezorXpubCache = new Map<string, TrezorExtendedPublicKeyInfo>();\nlet trezorSessionDispose: Promise<void> | undefined;\n\nasync function disconnectTrezorSession() {\n trezorXpubCache.clear();\n\n const dispose = (async () => {\n try {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n await TrezorConnect.dispose();\n } catch {\n // Ignore stale or already-disposed sessions.\n }\n })();\n\n trezorSessionDispose = dispose;\n await dispose;\n\n if (trezorSessionDispose === dispose) {\n trezorSessionDispose = undefined;\n }\n}\n\nfunction normalizeTrezorCoreMode(coreMode: unknown): TrezorCoreMode | undefined {\n return typeof coreMode === \"string\" && TREZOR_CORE_MODES.has(coreMode as TrezorCoreMode)\n ? (coreMode as TrezorCoreMode)\n : undefined;\n}\n\nfunction normalizeTrezorTransports(transports: unknown): TrezorTransport[] | undefined {\n if (!Array.isArray(transports)) return undefined;\n\n const normalized = transports.filter(\n (transport): transport is TrezorTransport =>\n typeof transport === \"string\" && TREZOR_TRANSPORTS.has(transport as TrezorTransport),\n );\n\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction decodeOpReturnData(script: Uint8Array): string | null {\n if (script.length < 2 || script[0] !== 0x6a) return null;\n const dataLen = script[1];\n if (dataLen === undefined || script.length < 2 + dataLen) return null;\n return Buffer.from(script.slice(2, 2 + dataLen)).toString(\"hex\");\n}\n\nfunction getScriptType(derivationPath: DerivationPathArray) {\n switch (derivationPath[0]) {\n case 84:\n return { input: \"SPENDWITNESS\", output: \"PAYTOWITNESS\" } as const;\n case 49:\n return { input: \"SPENDP2SHWITNESS\", output: \"PAYTOP2SHWITNESS\" } as const;\n case 44:\n return { input: \"SPENDADDRESS\", output: \"PAYTOADDRESS\" } as const;\n default:\n return null;\n }\n}\n\nfunction hardenDerivationPath(derivationPath: DerivationPathArray): number[] {\n return derivationPath.map((pathElement, index) =>\n index < 3 ? ((pathElement as number) | 0x80000000) >>> 0 : (pathElement as number),\n );\n}\n\nfunction isTrezorBip32Derivation(value: unknown): value is TrezorBip32Derivation {\n return (\n Array.isArray(value) &&\n value[0] instanceof Uint8Array &&\n typeof value[1] === \"object\" &&\n value[1] !== null &&\n typeof (value[1] as { fingerprint?: unknown }).fingerprint === \"number\" &&\n Array.isArray((value[1] as { path?: unknown }).path)\n );\n}\n\nfunction getFirstBip32Derivation(input: { bip32Derivation?: unknown }): TrezorBip32Derivation | undefined {\n if (!Array.isArray(input.bip32Derivation)) return undefined;\n const [firstDerivation] = input.bip32Derivation;\n\n return isTrezorBip32Derivation(firstDerivation) ? firstDerivation : undefined;\n}\n\nfunction getPrevoutAmount(input: {\n index?: number;\n nonWitnessUtxo?: { outputs?: Array<{ amount?: bigint | number }> };\n witnessUtxo?: { amount?: bigint | number };\n}) {\n if (input.witnessUtxo?.amount !== undefined) return input.witnessUtxo.amount.toString();\n\n const prevout = input.index !== undefined ? input.nonWitnessUtxo?.outputs?.[input.index] : undefined;\n if (prevout?.amount !== undefined) return prevout.amount.toString();\n\n return undefined;\n}\n\nfunction normalizeTrezorSignature(signatureHex: string) {\n const signature = Buffer.from(signatureHex, \"hex\");\n const derLength = signature[1] !== undefined ? signature[1] + 2 : undefined;\n\n if (derLength !== undefined && signature.length === derLength) {\n return new Uint8Array([...signature, 0x01]);\n }\n\n return new Uint8Array(signature);\n}\n\nfunction buildPCZTInputsForTrezor(\n pczt: PCZT,\n address_n: number[],\n hexEncode: { encode: (data: Uint8Array) => string },\n) {\n const inputs = [];\n for (let i = 0; i < pczt.inputsLength; i++) {\n const input = pczt.getInput(i);\n inputs.push({\n address_n,\n amount: input.value.toString(),\n prev_hash: hexEncode.encode(new Uint8Array([...input.txid].reverse())),\n prev_index: input.index,\n script_type: \"SPENDADDRESS\" as const,\n });\n }\n return inputs;\n}\n\nasync function buildPCZTOutputsForTrezor(pczt: PCZT, address_n: number[], myAddress: string, chain: Chain) {\n const outputs = [];\n for (let i = 0; i < pczt.outputsLength; i++) {\n const output = pczt.getOutput(i);\n const script = output.scriptPubkey;\n\n if (output.value === 0n && script?.length > 0 && script[0] === 0x6a) {\n const opReturnData = decodeOpReturnData(script);\n if (opReturnData) {\n outputs.push({ amount: \"0\", op_return_data: opReturnData, script_type: \"PAYTOOPRETURN\" as const });\n continue;\n }\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Malformed OP_RETURN output cannot be signed\" },\n });\n }\n\n const outputAddress = await decodeOutputAddress(script);\n\n if (!outputAddress && output.value > 0n) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Unable to decode output address from scriptPubkey\" },\n });\n }\n\n const isChangeAddress = outputAddress === myAddress;\n\n if (isChangeAddress) {\n outputs.push({ address_n, amount: output.value.toString(), script_type: \"PAYTOADDRESS\" as const });\n } else {\n outputs.push({ address: outputAddress, amount: output.value.toString(), script_type: \"PAYTOADDRESS\" as const });\n }\n }\n return outputs;\n}\n\nasync function decodeOutputAddress(script: Uint8Array): Promise<string | undefined> {\n try {\n const { OutScript, Address } = await import(\"@swapkit/utxo-signer\");\n const decoded = OutScript.decode(script);\n if (decoded.type === \"pkh\" || decoded.type === \"pk\") {\n return Address(NETWORKS.zcash).encode(decoded);\n }\n } catch {\n // ignore decode errors\n }\n return undefined;\n}\n\nasync function extractSignaturesFromSignedTx(signedTxHex: string, pczt: PCZT): Promise<PCZT> {\n const { ZcashTransaction: ZcashTx, Script } = await import(\"@swapkit/utxo-signer\");\n const signedTx = ZcashTx.fromHex(signedTxHex, { allowUnknownOutputs: true });\n const signedPczt = pczt.clone();\n\n for (let i = 0; i < signedTx.inputsLength; i++) {\n const signedInput = signedTx.getInput(i);\n const script = signedInput.script;\n if (script && script.length > 0) {\n const scriptParts = Script.decode(script);\n if (scriptParts.length >= 2) {\n signedPczt.addSignature(i, scriptParts[1] as Uint8Array, scriptParts[0] as Uint8Array);\n }\n }\n }\n return signedPczt;\n}\n\nfunction buildZcashTxInputsForTrezor(\n tx: ZcashTransaction,\n utxoInputs: UTXOType[],\n address_n: number[],\n hexEncode: { encode: (data: Uint8Array) => string },\n) {\n const inputs = [];\n for (let i = 0; i < tx.inputsLength; i++) {\n const input = tx.getInput(i);\n const utxoInfo = utxoInputs[i];\n inputs.push({\n address_n,\n amount: utxoInfo?.value?.toString() || \"0\",\n prev_hash: input.txid ? hexEncode.encode(new Uint8Array([...input.txid].reverse())) : \"\",\n prev_index: input.index ?? 0,\n script_type: \"SPENDADDRESS\" as const,\n });\n }\n return inputs;\n}\n\nfunction buildZcashTxOutputsForTrezor(tx: ZcashTransaction, address_n: number[], myAddress: string, chain: Chain) {\n const outputs = [];\n for (let i = 0; i < tx.outputsLength; i++) {\n const output = tx.getOutput(i);\n const outputAddress = tx.getOutputAddress(i, NETWORKS.zcash);\n const script = output.script;\n\n if (output.amount === 0n && script?.length > 0 && script[0] === 0x6a) {\n const opReturnData = decodeOpReturnData(script);\n if (opReturnData) {\n outputs.push({ amount: \"0\", op_return_data: opReturnData, script_type: \"PAYTOOPRETURN\" as const });\n continue;\n }\n continue;\n }\n\n if (!outputAddress && (output.amount ?? 0n) > 0n) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Unable to decode output address\" },\n });\n }\n\n const isChangeAddress = outputAddress === myAddress;\n const outputParam = isChangeAddress || !outputAddress ? { address_n } : { address: outputAddress };\n outputs.push({ ...outputParam, amount: output.amount?.toString() || \"0\", script_type: \"PAYTOADDRESS\" as const });\n }\n return outputs;\n}\n\nfunction buildUtxoOutputsForTrezor(\n tx: Transaction,\n network: BTCNetwork,\n address_n: number[],\n myAddress: string,\n memo: string,\n chain: Chain,\n scriptType: { input: string; output: string },\n toCashAddress: (addr: string) => string,\n stripPrefix: (addr: string) => string,\n) {\n const outputs: any[] = [];\n for (let i = 0; i < tx.outputsLength; i++) {\n const output = tx.getOutput(i);\n const outputAddress = tx.getOutputAddress(i, network);\n\n if (!outputAddress) {\n const opReturnData = output.script ? decodeOpReturnData(output.script) : null;\n if (opReturnData !== null || memo) {\n outputs.push({\n amount: \"0\",\n op_return_data: opReturnData ?? Buffer.from(memo).toString(\"hex\"),\n script_type: \"PAYTOOPRETURN\",\n });\n continue;\n }\n\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Unable to decode output address from scriptPubkey\" },\n });\n }\n\n if (output.amount === undefined) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Output amount is missing\" },\n });\n }\n\n const isBch = chain === Chain.BitcoinCash;\n const cashAddrWithPrefix = isBch ? toCashAddress(outputAddress) : outputAddress;\n const isChangeAddress = isBch\n ? stripPrefix(cashAddrWithPrefix) === stripPrefix(myAddress)\n : cashAddrWithPrefix === myAddress;\n\n outputs.push(\n isChangeAddress\n ? { address_n, amount: output.amount.toString(), script_type: scriptType.output }\n : { address: cashAddrWithPrefix, amount: output.amount.toString(), script_type: \"PAYTOADDRESS\" },\n );\n }\n return outputs;\n}\n\nasync function getTrezorWallet<T extends Chain>({\n chain,\n derivationPath,\n}: {\n chain: T;\n derivationPath: DerivationPathArray;\n}) {\n switch (chain) {\n case Chain.Arbitrum:\n case Chain.Aurora:\n case Chain.Avalanche:\n case Chain.Base:\n case Chain.Berachain:\n case Chain.BinanceSmartChain:\n case Chain.Ethereum:\n case Chain.Gnosis:\n case Chain.Monad:\n case Chain.Optimism:\n case Chain.Polygon:\n case Chain.XLayer: {\n const { getProvider, getEvmToolboxAsync } = await import(\"@swapkit/toolboxes/evm\");\n const { getEVMSigner } = await import(\"./evmSigner\");\n\n const provider = await getProvider(chain);\n const signer = await getEVMSigner({ chain, derivationPath, provider });\n const address = await signer.getAddress();\n const toolbox = await getEvmToolboxAsync(chain, { provider, signer });\n\n return { ...toolbox, address };\n }\n\n case Chain.Zcash: {\n const { getUtxoToolbox } = await import(\"@swapkit/toolboxes/utxo\");\n\n const derivationPathStr = derivationPathToString(derivationPath);\n\n const getAddress = async () => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { success, payload } = await TrezorConnect.getAddress({ coin: \"zcash\", path: derivationPathStr });\n\n if (!success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { chain, error: (payload as { error: string; code?: string }).error || \"Unknown error\" },\n });\n }\n\n return payload.address;\n };\n\n const address = await getAddress();\n\n const signer = {\n getAddress: async () => address,\n\n signPCZT: async (pczt: PCZT): Promise<PCZT> => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { hex: hexEncode } = await import(\"@scure/base\");\n const address_n = hardenDerivationPath(derivationPath);\n const global = pczt.getGlobal();\n\n const inputs = buildPCZTInputsForTrezor(pczt, address_n, hexEncode);\n const outputs = await buildPCZTOutputsForTrezor(pczt, address_n, address, chain);\n\n const result = await TrezorConnect.signTransaction({\n branchId: global.consensusBranchId,\n coin: \"zcash\",\n expiry: global.expiryHeight,\n inputs,\n locktime: global.lockTime,\n outputs: outputs as any,\n overwintered: true,\n version: global.txVersion,\n versionGroupId: global.versionGroupId,\n });\n\n if (!result.success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: (result.payload as { error: string; code?: string }).error },\n });\n }\n\n return extractSignaturesFromSignedTx(result.payload.serializedTx, pczt);\n },\n\n signTransaction: async (tx: ZcashTransaction, utxoInputs: UTXOType[]) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { hex: hexEncode } = await import(\"@scure/base\");\n const address_n = hardenDerivationPath(derivationPath);\n\n const inputs = buildZcashTxInputsForTrezor(tx, utxoInputs, address_n, hexEncode);\n const outputs = buildZcashTxOutputsForTrezor(tx, address_n, address, chain);\n\n const result = await TrezorConnect.signTransaction({\n branchId: ZcashConsensusBranchId.NU6,\n coin: \"zcash\",\n expiry: 0,\n inputs,\n locktime: 0,\n outputs: outputs as any,\n overwintered: true,\n version: 4,\n versionGroupId: ZcashVersionGroupId.SAPLING,\n });\n\n if (result.success) {\n return result.payload.serializedTx;\n }\n\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: (result.payload as { error: string; code?: string }).error },\n });\n },\n };\n\n const toolbox = getUtxoToolbox(Chain.Zcash);\n\n const transfer = async (params: GenericTransferParams) => {\n if (!(address && params.recipient)) {\n throw new SwapKitError({\n errorKey: \"wallet_missing_params\",\n info: { address, recipient: params.recipient, wallet: WalletOption.TREZOR },\n });\n }\n\n const feeRate = params.feeRate || (await toolbox.getFeeRates())[params.feeOptionKey || FeeOption.Fast];\n\n const { tx, inputs: txInputs } = await toolbox.createTransaction({\n ...params,\n feeRate,\n fetchTxHex: false,\n sender: address,\n });\n\n const txHex = await signer.signTransaction(tx, txInputs);\n const broadcastResult = await toolbox.broadcastTx(txHex);\n\n return broadcastResult;\n };\n\n const transferWithPCZT = async (params: GenericTransferParams) => {\n if (!(address && params.recipient)) {\n throw new SwapKitError({\n errorKey: \"wallet_missing_params\",\n info: { address, recipient: params.recipient, wallet: WalletOption.TREZOR },\n });\n }\n\n const { createPCZT, OutScript } = await import(\"@swapkit/utxo-signer\");\n const { hex: hexEncode } = await import(\"@scure/base\");\n const { getUtxoApi } = await import(\"@swapkit/toolboxes/utxo\");\n\n const feeRate = params.feeRate || (await toolbox.getFeeRates())[params.feeOptionKey || FeeOption.Fast];\n\n const utxos = await getUtxoApi(Chain.Zcash).getUtxos({ address });\n\n const { tx, inputs: txInputs } = await toolbox.createTransaction({\n ...params,\n feeRate,\n fetchTxHex: false,\n sender: address,\n });\n\n const pczt = createPCZT();\n\n for (const utxoInput of txInputs) {\n const utxo = utxos.find((u) => u.hash === utxoInput.hash && u.index === utxoInput.index);\n const scriptPubkey = utxo?.witnessUtxo?.script\n ? new Uint8Array(utxo.witnessUtxo.script)\n : OutScript.encode({ hash: hexEncode.decode((utxoInput as any).address || \"\"), type: \"pkh\" });\n\n pczt.addInput({\n index: utxoInput.index,\n scriptPubkey,\n txid: hexEncode.decode(utxoInput.hash).reverse() as unknown as Uint8Array,\n value: BigInt(utxoInput.value),\n });\n }\n\n for (let i = 0; i < tx.outputsLength; i++) {\n const output = tx.getOutput(i);\n pczt.addOutput({ scriptPubkey: output.script || new Uint8Array(), value: output.amount || 0n });\n }\n\n const signedPczt = await signer.signPCZT(pczt);\n signedPczt.finalizeAllInputs();\n const finalTx = signedPczt.extract();\n const broadcastResult = await toolbox.broadcastTx(finalTx.toHex());\n\n return broadcastResult;\n };\n\n return {\n ...toolbox,\n address,\n signPCZT: signer.signPCZT,\n signTransaction: signer.signTransaction,\n transfer,\n transferWithPCZT,\n };\n }\n\n case Chain.Bitcoin:\n case Chain.BitcoinCash:\n case Chain.Dash:\n case Chain.Dogecoin:\n case Chain.Litecoin: {\n const { toCashAddress, getUtxoToolbox, stripPrefix } = await import(\"@swapkit/toolboxes/utxo\");\n const utxoChain = chain as UTXOChain;\n const scriptType = getScriptType(derivationPath);\n\n if (!scriptType) {\n throw new SwapKitError({ errorKey: \"wallet_trezor_derivation_path_not_supported\", info: { derivationPath } });\n }\n\n const coin = chain.toLowerCase();\n\n const getAddress = async (path: DerivationPathArray = derivationPath) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { success, payload } = await TrezorConnect.getAddress({\n coin,\n path: derivationPathToString(path),\n showOnTrezor: false,\n });\n\n if (!success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { chain, error: (payload as { error: string; code?: string }).error || \"Unknown error\" },\n });\n }\n\n if (chain === Chain.BitcoinCash) {\n return stripPrefix(payload.address);\n }\n\n return payload.address;\n };\n\n async function getAddressFromExtendedPublicKey() {\n const accountInfo = await getExtendedPublicKeyInfo();\n const addressIndex = Number(derivationPath[4] ?? 0);\n const change = Boolean(derivationPath[3] ?? 0);\n\n try {\n // deriveAddressesFromXpub returns both external and change branches for each index.\n const derivedAddress = deriveAddressesFromXpub({\n accountIndex: accountInfo.accountIndex,\n chain: utxoChain,\n count: 1,\n startIndex: addressIndex,\n xpub: accountInfo.xpub,\n }).find((derived) => derived.change === change && derived.index === addressIndex);\n\n if (!derivedAddress) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { chain, error: \"Unable to derive address from Trezor account public key\" },\n });\n }\n\n return derivedAddress.address;\n } catch (error) {\n if (error instanceof SwapKitError) throw error;\n\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: {\n chain,\n error: error instanceof Error ? error.message : \"Unable to derive address from Trezor xpub\",\n },\n });\n }\n }\n\n const address =\n chain === Chain.Bitcoin || chain === Chain.Litecoin\n ? await getAddressFromExtendedPublicKey()\n : await getAddress();\n const baseToolbox = getUtxoToolbox(chain);\n\n const signTransaction = async (tx: Transaction, inputs: UTXOType[], memo = \"\") => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const address_n = hardenDerivationPath(derivationPath);\n const network = getNetworkForChain(chain as UTXOChain);\n\n const outputs = buildUtxoOutputsForTrezor(\n tx,\n network,\n address_n,\n address,\n memo,\n chain,\n scriptType,\n toCashAddress,\n stripPrefix,\n );\n\n const trezorInputs = inputs.map(({ hash, index, value }) => ({\n address_n,\n amount: value,\n prev_hash: hash,\n prev_index: index,\n script_type: scriptType.input,\n }));\n\n const result = await TrezorConnect.signTransaction({ coin, inputs: trezorInputs, outputs });\n\n if (result.success) {\n return result.payload.serializedTx;\n }\n\n const payload = result.payload as { error?: string; code?: string };\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, code: payload?.code ?? \"unknown\", error: payload?.error ?? \"unknown\", payload },\n });\n };\n\n const signPsbtTransaction = async (tx: Transaction): Promise<Transaction> => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { hex: hexEncode } = await import(\"@scure/base\");\n const address_n = hardenDerivationPath(derivationPath);\n const network = getNetworkForChain(chain as UTXOChain);\n let fallbackPublicKey: Uint8Array | undefined;\n\n async function getFallbackDerivation(): Promise<TrezorBip32Derivation> {\n if (!fallbackPublicKey) {\n const accountInfo = await getExtendedPublicKeyInfo();\n const accountKey = HDKey.fromExtendedKey(accountInfo.xpub);\n const leaf = accountKey.derive(`m/${Number(derivationPath[3] ?? 0)}/${Number(derivationPath[4] ?? 0)}`);\n\n if (!leaf.publicKey) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_public_key\",\n info: { chain, error: \"Unable to derive Trezor leaf public key from account xpub\" },\n });\n }\n\n fallbackPublicKey = leaf.publicKey;\n }\n\n return [fallbackPublicKey, { fingerprint: 0, path: address_n }];\n }\n\n const signerPubkeys: Uint8Array[] = [];\n const trezorInputs = [];\n\n for (let inputIndex = 0; inputIndex < tx.inputsLength; inputIndex++) {\n const input = tx.getInput(inputIndex);\n const existingDerivation = getFirstBip32Derivation(input);\n const derivation = existingDerivation ?? (await getFallbackDerivation());\n const amount = getPrevoutAmount(input);\n\n if (!input.txid || input.index === undefined || !amount) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: `Input ${inputIndex} is missing prevout data required by Trezor` },\n });\n }\n\n signerPubkeys[inputIndex] = derivation[0];\n\n if (!existingDerivation) {\n tx.updateInput(inputIndex, { bip32Derivation: [derivation] });\n }\n\n trezorInputs.push({\n address_n: derivation[1].path,\n amount,\n prev_hash: hexEncode.encode(input.txid),\n prev_index: input.index,\n script_type: scriptType.input,\n ...(input.sequence !== undefined ? { sequence: input.sequence } : {}),\n });\n }\n\n const outputs = buildUtxoOutputsForTrezor(\n tx,\n network,\n address_n,\n address,\n \"\",\n chain,\n scriptType,\n toCashAddress,\n stripPrefix,\n );\n\n const result = await TrezorConnect.signTransaction({\n coin,\n inputs: trezorInputs,\n locktime: tx.lockTime,\n outputs,\n version: tx.version,\n });\n\n if (!result.success) {\n const payload = result.payload as { error?: string; code?: string };\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, code: payload?.code ?? \"unknown\", error: payload?.error ?? \"unknown\", payload },\n });\n }\n\n result.payload.signatures.forEach((signatureHex, inputIndex) => {\n const pubkey = signerPubkeys[inputIndex];\n if (!(signatureHex && pubkey)) return;\n\n tx.updateInput(inputIndex, { partialSig: [[pubkey, normalizeTrezorSignature(signatureHex)]] });\n });\n\n return tx;\n };\n\n const signTransactionWithMultipleInputs = async (\n tx: Transaction,\n inputs: Array<{ hash: string; index: number; value: number; derivationIndex: number; isChange: boolean }>,\n memo = \"\",\n ) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const network = getNetworkForChain(chain as UTXOChain);\n const baseAddressN = hardenDerivationPath(derivationPath.slice(0, 3) as DerivationPathArray);\n\n const outputs = buildUtxoOutputsForTrezor(\n tx,\n network,\n baseAddressN,\n address,\n memo,\n chain,\n scriptType,\n toCashAddress,\n stripPrefix,\n );\n\n const trezorInputs = inputs.map(({ hash, index: inputIndex, value, derivationIndex, isChange }) => {\n const changePath = isChange ? 1 : 0;\n const inputAddressN = [...baseAddressN, changePath, derivationIndex];\n return {\n address_n: inputAddressN,\n amount: value,\n prev_hash: hash,\n prev_index: inputIndex,\n script_type: scriptType.input,\n };\n });\n\n const result = await TrezorConnect.signTransaction({ coin, inputs: trezorInputs, outputs });\n\n if (result.success) {\n return result.payload.serializedTx;\n }\n\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: (result.payload as { error: string; code?: string }).error },\n });\n };\n\n const transferFromMultipleAddresses = async ({\n utxos,\n recipient,\n assetValue,\n memo,\n feeRate,\n feeOptionKey,\n }: {\n utxos: Array<{\n hash: string;\n index: number;\n value: number;\n txHex?: string;\n derivationIndex: number;\n isChange: boolean;\n address: string;\n }>;\n recipient: string;\n assetValue: { getBaseValue: (unit: string) => number; chain: string };\n memo?: string;\n feeRate?: number;\n feeOptionKey?: (typeof FeeOption)[keyof typeof FeeOption];\n }) => {\n const toolbox = getUtxoToolbox(chain);\n const txFeeRate = feeRate || (await toolbox.getFeeRates())[feeOptionKey || FeeOption.Fast];\n\n const { tx, inputs: selectedInputs } = await toolbox.createTransaction({\n assetValue: assetValue as any,\n feeRate: txFeeRate,\n fetchTxHex: true,\n memo,\n recipient,\n sender: address,\n });\n\n const inputsWithDerivation = selectedInputs.map((input: { hash: string; index: number; value: number }) => {\n const utxoInfo = utxos.find((u) => u.hash === input.hash && u.index === input.index);\n return { ...input, derivationIndex: utxoInfo?.derivationIndex ?? 0, isChange: utxoInfo?.isChange ?? false };\n });\n\n const signedTxHex = await signTransactionWithMultipleInputs(tx as Transaction, inputsWithDerivation, memo);\n return toolbox.broadcastTx(signedTxHex);\n };\n\n const transfer = async ({\n recipient,\n feeOptionKey,\n feeRate: paramFeeRate,\n memo,\n ...rest\n }: GenericTransferParams) => {\n if (!(address && recipient)) {\n throw new SwapKitError({\n errorKey: \"wallet_missing_params\",\n info: { address, memo, recipient, wallet: WalletOption.TREZOR },\n });\n }\n\n const toolbox = getUtxoToolbox(chain);\n\n const feeRate = paramFeeRate || (await toolbox.getFeeRates())[feeOptionKey || FeeOption.Fast];\n\n const createTxMethod = (toolbox as UTXOToolboxes[\"BTC\"]).createTransaction;\n\n const { tx, inputs } = await createTxMethod({\n ...rest,\n feeRate,\n fetchTxHex: true,\n memo,\n recipient,\n sender: address,\n });\n\n const signedTxHex = await signTransaction(tx, inputs, memo);\n const txHash = await toolbox.broadcastTx(signedTxHex);\n\n return txHash;\n };\n\n const toolbox =\n chain === Chain.Bitcoin || chain === Chain.Litecoin\n ? await getUtxoToolbox(utxoChain, {\n signer: { getAddress: async () => address, signTransaction: signPsbtTransaction },\n })\n : baseToolbox;\n\n async function getExtendedPublicKeyInfo({ accountIndex }: { accountIndex?: number } = {}) {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const resolvedAccountPath = getUTXOAccountPath({ accountIndex, chain: utxoChain, derivationPath });\n const path = derivationPathToString(resolvedAccountPath);\n const cacheKey = `${chain}:${path}`;\n const cached = trezorXpubCache.get(cacheKey);\n if (cached) return cached;\n\n const { success, payload } = await TrezorConnect.getPublicKey({ coin, path });\n\n if (!success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_public_key\",\n info: { chain, error: (payload as { error: string; code?: string }).error || \"Unknown error\" },\n });\n }\n\n const info = {\n accountIndex: getUTXOAccountIndexFromPath(resolvedAccountPath),\n chainCode: payload.chainCode,\n depth: payload.depth,\n fingerprint: payload.fingerprint,\n path: payload.serializedPath,\n publicKey: payload.publicKey,\n xpub: payload.xpub,\n xpubSegwit: payload.xpubSegwit,\n };\n\n trezorXpubCache.set(cacheKey, info);\n return info;\n }\n\n function getExtendedPublicKey(params: { accountIndex?: number } = {}) {\n return getExtendedPublicKeyInfo(params);\n }\n\n async function deriveAddressAtIndex({\n accountIndex,\n index,\n change = false,\n }: {\n accountIndex?: number;\n index: number;\n change?: boolean;\n }) {\n assertDerivationIndex(\"index\", index);\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const resolvedAccountPath = getUTXOAccountPath({ accountIndex, chain: utxoChain, derivationPath });\n const fullPath = `${derivationPathToString(resolvedAccountPath)}/${Number(change)}/${index}`;\n\n const { success, payload } = await TrezorConnect.getAddress({ coin, path: fullPath, showOnTrezor: false });\n\n if (!success) {\n return undefined;\n }\n\n let finalAddress = payload.address;\n if (chain === Chain.BitcoinCash) {\n const bchToolbox = await getUtxoToolbox(chain as typeof Chain.BitcoinCash);\n finalAddress = bchToolbox.stripPrefix(payload.address);\n }\n\n const pubKeyResult = await TrezorConnect.getPublicKey({ coin, path: fullPath });\n const pubkey = pubKeyResult.success ? pubKeyResult.payload.publicKey : \"\";\n\n return {\n accountIndex: getUTXOAccountIndexFromPath(resolvedAccountPath),\n address: finalAddress,\n change,\n index,\n path: fullPath,\n pubkey,\n };\n }\n\n async function deriveAddressesBatch({\n accountIndex,\n count,\n startIndex = 0,\n change = false,\n }: {\n accountIndex?: number;\n count: number;\n startIndex?: number;\n change?: boolean;\n }) {\n assertDerivationIndex(\"count\", count);\n assertDerivationIndex(\"startIndex\", startIndex);\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const resolvedAccountPath = getUTXOAccountPath({ accountIndex, chain: utxoChain, derivationPath });\n const accountPath = derivationPathToString(resolvedAccountPath);\n\n const paths = Array.from({ length: count }, (_, i) => ({\n coin,\n path: `${accountPath}/${Number(change)}/${startIndex + i}`,\n showOnTrezor: false,\n }));\n\n const { success, payload } = await TrezorConnect.getAddress({ bundle: paths });\n\n if (!success || !Array.isArray(payload)) {\n return [];\n }\n\n const addresses = await Promise.all(\n payload.map(async (result, i) => {\n let finalAddress = result.address;\n if (chain === Chain.BitcoinCash) {\n const bchToolbox = await getUtxoToolbox(chain as typeof Chain.BitcoinCash);\n finalAddress = bchToolbox.stripPrefix(result.address);\n }\n\n return {\n accountIndex: getUTXOAccountIndexFromPath(resolvedAccountPath),\n address: finalAddress,\n change,\n index: startIndex + i,\n path: `${accountPath}/${Number(change)}/${startIndex + i}`,\n pubkey: \"\",\n };\n }),\n );\n\n return addresses;\n }\n\n const hdHelpers = createHDWalletHelpers({\n chain,\n deriveAddress: deriveAddressAtIndex,\n getBalance: toolbox.getBalance,\n getUtxos: (addr: string) => getUtxoApi(chain).getUtxos({ address: addr, fetchTxHex: true }),\n });\n\n return {\n ...toolbox,\n ...hdHelpers,\n address,\n deriveAddressAtIndex,\n deriveAddresses: deriveAddressesBatch,\n getExtendedPublicKey,\n getExtendedPublicKeyInfo,\n signTransaction,\n signTransactionWithMultipleInputs,\n transfer,\n transferFromMultipleAddresses,\n };\n }\n\n default:\n throw new SwapKitError({ errorKey: \"wallet_chain_not_supported\", info: { chain, wallet: WalletOption.TREZOR } });\n }\n}\n\nexport const trezorWallet = createWallet({\n connect: ({ addChain, supportedChains, walletType }) =>\n async function connectTrezor(chains: Chain[], derivationPath: DerivationPathArray) {\n const [chain] = filterSupportedChains({ chains, supportedChains, walletType });\n if (!chain) {\n throw new SwapKitError({\n errorKey: \"wallet_chain_not_supported\",\n info: { chain, wallet: WalletOption.TREZOR },\n });\n }\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n\n const trezorConfig = SKConfig.get(\"integrations\").trezor as Record<string, unknown> | undefined;\n const {\n connectSrc,\n coreMode,\n debug,\n interactionTimeout,\n lazyLoad,\n pendingTransportEvent,\n popup,\n transportReconnect,\n transports,\n ...manifestConfig\n } = trezorConfig ?? {};\n const manifest = {\n ...manifestConfig,\n appName: String(trezorConfig?.appName || \"SwapKit\"),\n appUrl: String(trezorConfig?.appUrl || \"\"),\n email: String(trezorConfig?.email || \"\"),\n };\n const isLocalhost =\n typeof globalThis.location !== \"undefined\" && [\"localhost\", \"127.0.0.1\"].includes(globalThis.location.hostname);\n const resolvedCoreMode = isLocalhost ? \"popup\" : normalizeTrezorCoreMode(coreMode);\n const resolvedTransports = isLocalhost ? [\"WebUsbTransport\" as const] : normalizeTrezorTransports(transports);\n\n if (trezorSessionDispose) {\n await trezorSessionDispose;\n }\n\n if (isLocalhost) {\n await TrezorConnect.dispose();\n }\n\n await TrezorConnect.init({\n connectSrc: connectSrc as string | undefined,\n coreMode: resolvedCoreMode,\n debug: debug as boolean | undefined,\n interactionTimeout: interactionTimeout as number | undefined,\n lazyLoad: isLocalhost ? false : ((lazyLoad as boolean | undefined) ?? true),\n manifest,\n pendingTransportEvent: pendingTransportEvent as boolean | undefined,\n popup: isLocalhost ? true : (popup as boolean | undefined),\n transportReconnect: transportReconnect as boolean | undefined,\n transports: resolvedTransports,\n });\n\n const wallet = await getTrezorWallet({ chain, derivationPath });\n\n addChain({ ...wallet, chain, disconnect: disconnectTrezorSession, walletType });\n\n return true;\n },\n directSigningSupport: {\n [Chain.Arbitrum]: true,\n [Chain.Aurora]: true,\n [Chain.Avalanche]: true,\n [Chain.Base]: true,\n [Chain.Berachain]: true,\n [Chain.BinanceSmartChain]: true,\n [Chain.Bitcoin]: true,\n [Chain.Ethereum]: true,\n [Chain.Gnosis]: true,\n [Chain.Litecoin]: true,\n [Chain.Monad]: true,\n [Chain.Optimism]: true,\n [Chain.Polygon]: true,\n [Chain.XLayer]: true,\n // BCH/DASH/DOGE/ZEC: pending PSBT→TrezorConnect converter (V3 plan PR)\n },\n name: \"connectTrezor\",\n supportedChains: [\n Chain.Arbitrum,\n Chain.Aurora,\n Chain.Avalanche,\n Chain.Base,\n Chain.Berachain,\n Chain.BinanceSmartChain,\n Chain.Bitcoin,\n Chain.BitcoinCash,\n Chain.Dash,\n Chain.Dogecoin,\n Chain.Ethereum,\n Chain.Gnosis,\n Chain.Litecoin,\n Chain.Monad,\n Chain.Optimism,\n Chain.Polygon,\n Chain.XLayer,\n Chain.Zcash,\n ],\n walletType: WalletOption.TREZOR,\n});\n\nexport const TREZOR_SUPPORTED_CHAINS = getWalletSupportedChains(trezorWallet);\n"
|
|
5
|
+
"import { HDKey } from \"@scure/bip32\";\nimport {\n Chain,\n type DerivationPathArray,\n derivationPathToString,\n FeeOption,\n filterSupportedChains,\n type GenericTransferParams,\n SKConfig,\n SwapKitError,\n type UTXOChain,\n WalletOption,\n} from \"@swapkit/helpers\";\nimport {\n assertDerivationIndex,\n createHDWalletHelpers,\n deriveAddressesFromXpub,\n getNetworkForChain,\n getUTXOAccountIndexFromPath,\n getUTXOAccountPath,\n getUtxoApi,\n type UTXOToolboxes,\n type UTXOType,\n} from \"@swapkit/toolboxes/utxo\";\nimport type { BTCNetwork, PCZT, Transaction, ZcashTransaction } from \"@swapkit/utxo-signer\";\nimport { NETWORKS, ZcashConsensusBranchId, ZcashVersionGroupId } from \"@swapkit/utxo-signer\";\nimport { createWallet, getWalletSupportedChains } from \"@swapkit/wallet-core\";\n\ntype TrezorBip32Derivation = [Uint8Array, { fingerprint: number; path: number[] }];\ntype TrezorCoreMode = \"auto\" | \"iframe\" | \"popup\" | \"suite-desktop\" | \"suite-web\";\ntype TrezorTransport = \"BridgeTransport\" | \"WebUsbTransport\" | \"NodeUsbTransport\";\ntype TrezorExtendedPublicKeyInfo = {\n accountIndex: number;\n chainCode?: string;\n depth?: number;\n fingerprint?: number;\n path: string;\n publicKey?: string;\n xpub: string;\n xpubSegwit?: string;\n};\n\nconst TREZOR_CORE_MODES = new Set<TrezorCoreMode>([\"auto\", \"iframe\", \"popup\", \"suite-desktop\", \"suite-web\"]);\nconst TREZOR_TRANSPORTS = new Set<TrezorTransport>([\"BridgeTransport\", \"WebUsbTransport\", \"NodeUsbTransport\"]);\nconst DEFAULT_TREZOR_MANIFEST = { appName: \"SwapKit\", appUrl: \"https://swapkit.dev\", email: \"support@swapkit.dev\" };\nconst DEFAULT_TREZOR_TRANSPORTS = [\"WebUsbTransport\" as const];\nconst trezorXpubCache = new Map<string, TrezorExtendedPublicKeyInfo>();\nlet trezorSessionDispose: Promise<void> | undefined;\n\nasync function disconnectTrezorSession() {\n trezorXpubCache.clear();\n\n const dispose = (async () => {\n try {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n await TrezorConnect.dispose();\n } catch {\n // Ignore stale or already-disposed sessions.\n }\n })();\n\n trezorSessionDispose = dispose;\n await dispose;\n\n if (trezorSessionDispose === dispose) {\n trezorSessionDispose = undefined;\n }\n}\n\nfunction normalizeTrezorCoreMode(coreMode: unknown): TrezorCoreMode | undefined {\n return typeof coreMode === \"string\" && TREZOR_CORE_MODES.has(coreMode as TrezorCoreMode)\n ? (coreMode as TrezorCoreMode)\n : undefined;\n}\n\nfunction normalizeTrezorTransports(transports: unknown): TrezorTransport[] | undefined {\n if (!Array.isArray(transports)) return undefined;\n\n const normalized = transports.filter(\n (transport): transport is TrezorTransport =>\n typeof transport === \"string\" && TREZOR_TRANSPORTS.has(transport as TrezorTransport),\n );\n\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction getTrezorManifestValue(value: unknown, fallback: string) {\n return typeof value === \"string\" && value.trim() ? value : fallback;\n}\n\nfunction getDefaultTrezorAppUrl() {\n return typeof globalThis.location !== \"undefined\" && globalThis.location.origin\n ? globalThis.location.origin\n : DEFAULT_TREZOR_MANIFEST.appUrl;\n}\n\nfunction decodeOpReturnData(script: Uint8Array): string | null {\n if (script.length < 2 || script[0] !== 0x6a) return null;\n const dataLen = script[1];\n if (dataLen === undefined || script.length < 2 + dataLen) return null;\n return Buffer.from(script.slice(2, 2 + dataLen)).toString(\"hex\");\n}\n\nfunction getScriptType(derivationPath: DerivationPathArray) {\n switch (derivationPath[0]) {\n case 84:\n return { input: \"SPENDWITNESS\", output: \"PAYTOWITNESS\" } as const;\n case 49:\n return { input: \"SPENDP2SHWITNESS\", output: \"PAYTOP2SHWITNESS\" } as const;\n case 44:\n return { input: \"SPENDADDRESS\", output: \"PAYTOADDRESS\" } as const;\n default:\n return null;\n }\n}\n\nfunction hardenDerivationPath(derivationPath: DerivationPathArray): number[] {\n return derivationPath.map((pathElement, index) =>\n index < 3 ? ((pathElement as number) | 0x80000000) >>> 0 : (pathElement as number),\n );\n}\n\nfunction isTrezorBip32Derivation(value: unknown): value is TrezorBip32Derivation {\n return (\n Array.isArray(value) &&\n value[0] instanceof Uint8Array &&\n typeof value[1] === \"object\" &&\n value[1] !== null &&\n typeof (value[1] as { fingerprint?: unknown }).fingerprint === \"number\" &&\n Array.isArray((value[1] as { path?: unknown }).path)\n );\n}\n\nfunction getFirstBip32Derivation(input: { bip32Derivation?: unknown }): TrezorBip32Derivation | undefined {\n if (!Array.isArray(input.bip32Derivation)) return undefined;\n const [firstDerivation] = input.bip32Derivation;\n\n return isTrezorBip32Derivation(firstDerivation) ? firstDerivation : undefined;\n}\n\nfunction getPrevoutAmount(input: {\n index?: number;\n nonWitnessUtxo?: { outputs?: Array<{ amount?: bigint | number }> };\n witnessUtxo?: { amount?: bigint | number };\n}) {\n if (input.witnessUtxo?.amount !== undefined) return input.witnessUtxo.amount.toString();\n\n const prevout = input.index !== undefined ? input.nonWitnessUtxo?.outputs?.[input.index] : undefined;\n if (prevout?.amount !== undefined) return prevout.amount.toString();\n\n return undefined;\n}\n\nfunction normalizeTrezorSignature(signatureHex: string) {\n const signature = Buffer.from(signatureHex, \"hex\");\n const derLength = signature[1] !== undefined ? signature[1] + 2 : undefined;\n\n if (derLength !== undefined && signature.length === derLength) {\n return new Uint8Array([...signature, 0x01]);\n }\n\n return new Uint8Array(signature);\n}\n\nfunction buildPCZTInputsForTrezor(\n pczt: PCZT,\n address_n: number[],\n hexEncode: { encode: (data: Uint8Array) => string },\n) {\n const inputs = [];\n for (let i = 0; i < pczt.inputsLength; i++) {\n const input = pczt.getInput(i);\n inputs.push({\n address_n,\n amount: input.value.toString(),\n prev_hash: hexEncode.encode(new Uint8Array([...input.txid].reverse())),\n prev_index: input.index,\n script_type: \"SPENDADDRESS\" as const,\n });\n }\n return inputs;\n}\n\nasync function buildPCZTOutputsForTrezor(pczt: PCZT, address_n: number[], myAddress: string, chain: Chain) {\n const outputs = [];\n for (let i = 0; i < pczt.outputsLength; i++) {\n const output = pczt.getOutput(i);\n const script = output.scriptPubkey;\n\n if (output.value === 0n && script?.length > 0 && script[0] === 0x6a) {\n const opReturnData = decodeOpReturnData(script);\n if (opReturnData) {\n outputs.push({ amount: \"0\", op_return_data: opReturnData, script_type: \"PAYTOOPRETURN\" as const });\n continue;\n }\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Malformed OP_RETURN output cannot be signed\" },\n });\n }\n\n const outputAddress = await decodeOutputAddress(script);\n\n if (!outputAddress && output.value > 0n) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Unable to decode output address from scriptPubkey\" },\n });\n }\n\n const isChangeAddress = outputAddress === myAddress;\n\n if (isChangeAddress) {\n outputs.push({ address_n, amount: output.value.toString(), script_type: \"PAYTOADDRESS\" as const });\n } else {\n outputs.push({ address: outputAddress, amount: output.value.toString(), script_type: \"PAYTOADDRESS\" as const });\n }\n }\n return outputs;\n}\n\nasync function decodeOutputAddress(script: Uint8Array): Promise<string | undefined> {\n try {\n const { OutScript, Address } = await import(\"@swapkit/utxo-signer\");\n const decoded = OutScript.decode(script);\n if (decoded.type === \"pkh\" || decoded.type === \"pk\") {\n return Address(NETWORKS.zcash).encode(decoded);\n }\n } catch {\n // ignore decode errors\n }\n return undefined;\n}\n\nasync function extractSignaturesFromSignedTx(signedTxHex: string, pczt: PCZT): Promise<PCZT> {\n const { ZcashTransaction: ZcashTx, Script } = await import(\"@swapkit/utxo-signer\");\n const signedTx = ZcashTx.fromHex(signedTxHex, { allowUnknownOutputs: true });\n const signedPczt = pczt.clone();\n\n for (let i = 0; i < signedTx.inputsLength; i++) {\n const signedInput = signedTx.getInput(i);\n const script = signedInput.script;\n if (script && script.length > 0) {\n const scriptParts = Script.decode(script);\n if (scriptParts.length >= 2) {\n signedPczt.addSignature(i, scriptParts[1] as Uint8Array, scriptParts[0] as Uint8Array);\n }\n }\n }\n return signedPczt;\n}\n\nfunction buildZcashTxInputsForTrezor(\n tx: ZcashTransaction,\n utxoInputs: UTXOType[],\n address_n: number[],\n hexEncode: { encode: (data: Uint8Array) => string },\n) {\n const inputs = [];\n for (let i = 0; i < tx.inputsLength; i++) {\n const input = tx.getInput(i);\n const utxoInfo = utxoInputs[i];\n inputs.push({\n address_n,\n amount: utxoInfo?.value?.toString() || \"0\",\n prev_hash: input.txid ? hexEncode.encode(new Uint8Array([...input.txid].reverse())) : \"\",\n prev_index: input.index ?? 0,\n script_type: \"SPENDADDRESS\" as const,\n });\n }\n return inputs;\n}\n\nfunction buildZcashTxOutputsForTrezor(tx: ZcashTransaction, address_n: number[], myAddress: string, chain: Chain) {\n const outputs = [];\n for (let i = 0; i < tx.outputsLength; i++) {\n const output = tx.getOutput(i);\n const outputAddress = tx.getOutputAddress(i, NETWORKS.zcash);\n const script = output.script;\n\n if (output.amount === 0n && script?.length > 0 && script[0] === 0x6a) {\n const opReturnData = decodeOpReturnData(script);\n if (opReturnData) {\n outputs.push({ amount: \"0\", op_return_data: opReturnData, script_type: \"PAYTOOPRETURN\" as const });\n continue;\n }\n continue;\n }\n\n if (!outputAddress && (output.amount ?? 0n) > 0n) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Unable to decode output address\" },\n });\n }\n\n const isChangeAddress = outputAddress === myAddress;\n const outputParam = isChangeAddress || !outputAddress ? { address_n } : { address: outputAddress };\n outputs.push({ ...outputParam, amount: output.amount?.toString() || \"0\", script_type: \"PAYTOADDRESS\" as const });\n }\n return outputs;\n}\n\nfunction buildUtxoOutputsForTrezor(\n tx: Transaction,\n network: BTCNetwork,\n address_n: number[],\n myAddress: string,\n memo: string,\n chain: Chain,\n scriptType: { input: string; output: string },\n toCashAddress: (addr: string) => string,\n stripPrefix: (addr: string) => string,\n) {\n const outputs: any[] = [];\n for (let i = 0; i < tx.outputsLength; i++) {\n const output = tx.getOutput(i);\n const outputAddress = tx.getOutputAddress(i, network);\n\n if (!outputAddress) {\n const opReturnData = output.script ? decodeOpReturnData(output.script) : null;\n if (opReturnData !== null || memo) {\n outputs.push({\n amount: \"0\",\n op_return_data: opReturnData ?? Buffer.from(memo).toString(\"hex\"),\n script_type: \"PAYTOOPRETURN\",\n });\n continue;\n }\n\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Unable to decode output address from scriptPubkey\" },\n });\n }\n\n if (output.amount === undefined) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Output amount is missing\" },\n });\n }\n\n const isBch = chain === Chain.BitcoinCash;\n const cashAddrWithPrefix = isBch ? toCashAddress(outputAddress) : outputAddress;\n const isChangeAddress = isBch\n ? stripPrefix(cashAddrWithPrefix) === stripPrefix(myAddress)\n : cashAddrWithPrefix === myAddress;\n\n outputs.push(\n isChangeAddress\n ? { address_n, amount: output.amount.toString(), script_type: scriptType.output }\n : { address: cashAddrWithPrefix, amount: output.amount.toString(), script_type: \"PAYTOADDRESS\" },\n );\n }\n return outputs;\n}\n\nasync function getTrezorWallet<T extends Chain>({\n chain,\n derivationPath,\n}: {\n chain: T;\n derivationPath: DerivationPathArray;\n}) {\n switch (chain) {\n case Chain.Arbitrum:\n case Chain.Aurora:\n case Chain.Avalanche:\n case Chain.Base:\n case Chain.Berachain:\n case Chain.BinanceSmartChain:\n case Chain.Ethereum:\n case Chain.Gnosis:\n case Chain.Monad:\n case Chain.Optimism:\n case Chain.Polygon:\n case Chain.XLayer: {\n const { getProvider, getEvmToolboxAsync } = await import(\"@swapkit/toolboxes/evm\");\n const { getEVMSigner } = await import(\"./evmSigner\");\n\n const provider = await getProvider(chain);\n const signer = await getEVMSigner({ chain, derivationPath, provider });\n const address = await signer.getAddress();\n const toolbox = await getEvmToolboxAsync(chain, { provider, signer });\n\n return { ...toolbox, address };\n }\n\n case Chain.Zcash: {\n const { getUtxoToolbox } = await import(\"@swapkit/toolboxes/utxo\");\n\n const derivationPathStr = derivationPathToString(derivationPath);\n\n const getAddress = async () => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { success, payload } = await TrezorConnect.getAddress({ coin: \"zcash\", path: derivationPathStr });\n\n if (!success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { chain, error: (payload as { error: string; code?: string }).error || \"Unknown error\" },\n });\n }\n\n return payload.address;\n };\n\n const address = await getAddress();\n\n const signer = {\n getAddress: async () => address,\n\n signPCZT: async (pczt: PCZT): Promise<PCZT> => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { hex: hexEncode } = await import(\"@scure/base\");\n const address_n = hardenDerivationPath(derivationPath);\n const global = pczt.getGlobal();\n\n const inputs = buildPCZTInputsForTrezor(pczt, address_n, hexEncode);\n const outputs = await buildPCZTOutputsForTrezor(pczt, address_n, address, chain);\n\n const result = await TrezorConnect.signTransaction({\n branchId: global.consensusBranchId,\n coin: \"zcash\",\n expiry: global.expiryHeight,\n inputs,\n locktime: global.lockTime,\n outputs: outputs as any,\n overwintered: true,\n version: global.txVersion,\n versionGroupId: global.versionGroupId,\n });\n\n if (!result.success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: (result.payload as { error: string; code?: string }).error },\n });\n }\n\n return extractSignaturesFromSignedTx(result.payload.serializedTx, pczt);\n },\n\n signTransaction: async (tx: ZcashTransaction, utxoInputs: UTXOType[]) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { hex: hexEncode } = await import(\"@scure/base\");\n const address_n = hardenDerivationPath(derivationPath);\n\n const inputs = buildZcashTxInputsForTrezor(tx, utxoInputs, address_n, hexEncode);\n const outputs = buildZcashTxOutputsForTrezor(tx, address_n, address, chain);\n\n const result = await TrezorConnect.signTransaction({\n branchId: ZcashConsensusBranchId.NU6,\n coin: \"zcash\",\n expiry: 0,\n inputs,\n locktime: 0,\n outputs: outputs as any,\n overwintered: true,\n version: 4,\n versionGroupId: ZcashVersionGroupId.SAPLING,\n });\n\n if (result.success) {\n return result.payload.serializedTx;\n }\n\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: (result.payload as { error: string; code?: string }).error },\n });\n },\n };\n\n const toolbox = getUtxoToolbox(Chain.Zcash);\n\n const transfer = async (params: GenericTransferParams) => {\n if (!(address && params.recipient)) {\n throw new SwapKitError({\n errorKey: \"wallet_missing_params\",\n info: { address, recipient: params.recipient, wallet: WalletOption.TREZOR },\n });\n }\n\n const feeRate = params.feeRate || (await toolbox.getFeeRates())[params.feeOptionKey || FeeOption.Fast];\n\n const { tx, inputs: txInputs } = await toolbox.createTransaction({\n ...params,\n feeRate,\n fetchTxHex: false,\n sender: address,\n });\n\n const txHex = await signer.signTransaction(tx, txInputs);\n const broadcastResult = await toolbox.broadcastTx(txHex);\n\n return broadcastResult;\n };\n\n const transferWithPCZT = async (params: GenericTransferParams) => {\n if (!(address && params.recipient)) {\n throw new SwapKitError({\n errorKey: \"wallet_missing_params\",\n info: { address, recipient: params.recipient, wallet: WalletOption.TREZOR },\n });\n }\n\n const { createPCZT, OutScript } = await import(\"@swapkit/utxo-signer\");\n const { hex: hexEncode } = await import(\"@scure/base\");\n const { getUtxoApi } = await import(\"@swapkit/toolboxes/utxo\");\n\n const feeRate = params.feeRate || (await toolbox.getFeeRates())[params.feeOptionKey || FeeOption.Fast];\n\n const utxos = await getUtxoApi(Chain.Zcash).getUtxos({ address });\n\n const { tx, inputs: txInputs } = await toolbox.createTransaction({\n ...params,\n feeRate,\n fetchTxHex: false,\n sender: address,\n });\n\n const pczt = createPCZT();\n\n for (const utxoInput of txInputs) {\n const utxo = utxos.find((u) => u.hash === utxoInput.hash && u.index === utxoInput.index);\n const scriptPubkey = utxo?.witnessUtxo?.script\n ? new Uint8Array(utxo.witnessUtxo.script)\n : OutScript.encode({ hash: hexEncode.decode((utxoInput as any).address || \"\"), type: \"pkh\" });\n\n pczt.addInput({\n index: utxoInput.index,\n scriptPubkey,\n txid: hexEncode.decode(utxoInput.hash).reverse() as unknown as Uint8Array,\n value: BigInt(utxoInput.value),\n });\n }\n\n for (let i = 0; i < tx.outputsLength; i++) {\n const output = tx.getOutput(i);\n pczt.addOutput({ scriptPubkey: output.script || new Uint8Array(), value: output.amount || 0n });\n }\n\n const signedPczt = await signer.signPCZT(pczt);\n signedPczt.finalizeAllInputs();\n const finalTx = signedPczt.extract();\n const broadcastResult = await toolbox.broadcastTx(finalTx.toHex());\n\n return broadcastResult;\n };\n\n return {\n ...toolbox,\n address,\n signPCZT: signer.signPCZT,\n signTransaction: signer.signTransaction,\n transfer,\n transferWithPCZT,\n };\n }\n\n case Chain.Bitcoin:\n case Chain.BitcoinCash:\n case Chain.Dash:\n case Chain.Dogecoin:\n case Chain.Litecoin: {\n const { toCashAddress, getUtxoToolbox, stripPrefix } = await import(\"@swapkit/toolboxes/utxo\");\n const utxoChain = chain as UTXOChain;\n const scriptType = getScriptType(derivationPath);\n\n if (!scriptType) {\n throw new SwapKitError({ errorKey: \"wallet_trezor_derivation_path_not_supported\", info: { derivationPath } });\n }\n\n const coin = chain.toLowerCase();\n\n const getAddress = async (path: DerivationPathArray = derivationPath) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { success, payload } = await TrezorConnect.getAddress({\n coin,\n path: derivationPathToString(path),\n showOnTrezor: false,\n });\n\n if (!success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { chain, error: (payload as { error: string; code?: string }).error || \"Unknown error\" },\n });\n }\n\n if (chain === Chain.BitcoinCash) {\n return stripPrefix(payload.address);\n }\n\n return payload.address;\n };\n\n async function getAddressFromExtendedPublicKey() {\n const accountInfo = await getExtendedPublicKeyInfo();\n const addressIndex = Number(derivationPath[4] ?? 0);\n const change = Boolean(derivationPath[3] ?? 0);\n\n try {\n // deriveAddressesFromXpub returns both external and change branches for each index.\n const derivedAddress = deriveAddressesFromXpub({\n accountIndex: accountInfo.accountIndex,\n chain: utxoChain,\n count: 1,\n startIndex: addressIndex,\n xpub: accountInfo.xpub,\n }).find((derived) => derived.change === change && derived.index === addressIndex);\n\n if (!derivedAddress) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { chain, error: \"Unable to derive address from Trezor account public key\" },\n });\n }\n\n return derivedAddress.address;\n } catch (error) {\n if (error instanceof SwapKitError) throw error;\n\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: {\n chain,\n error: error instanceof Error ? error.message : \"Unable to derive address from Trezor xpub\",\n },\n });\n }\n }\n\n const address =\n chain === Chain.Bitcoin || chain === Chain.Litecoin\n ? await getAddressFromExtendedPublicKey()\n : await getAddress();\n const baseToolbox = getUtxoToolbox(chain);\n\n const signTransaction = async (tx: Transaction, inputs: UTXOType[], memo = \"\") => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const address_n = hardenDerivationPath(derivationPath);\n const network = getNetworkForChain(chain as UTXOChain);\n\n const outputs = buildUtxoOutputsForTrezor(\n tx,\n network,\n address_n,\n address,\n memo,\n chain,\n scriptType,\n toCashAddress,\n stripPrefix,\n );\n\n const trezorInputs = inputs.map(({ hash, index, value }) => ({\n address_n,\n amount: value,\n prev_hash: hash,\n prev_index: index,\n script_type: scriptType.input,\n }));\n\n const result = await TrezorConnect.signTransaction({ coin, inputs: trezorInputs, outputs });\n\n if (result.success) {\n return result.payload.serializedTx;\n }\n\n const payload = result.payload as { error?: string; code?: string };\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, code: payload?.code ?? \"unknown\", error: payload?.error ?? \"unknown\", payload },\n });\n };\n\n const signPsbtTransaction = async (tx: Transaction): Promise<Transaction> => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { hex: hexEncode } = await import(\"@scure/base\");\n const address_n = hardenDerivationPath(derivationPath);\n const network = getNetworkForChain(chain as UTXOChain);\n let fallbackPublicKey: Uint8Array | undefined;\n\n async function getFallbackDerivation(): Promise<TrezorBip32Derivation> {\n if (!fallbackPublicKey) {\n const accountInfo = await getExtendedPublicKeyInfo();\n const accountKey = HDKey.fromExtendedKey(accountInfo.xpub);\n const leaf = accountKey.derive(`m/${Number(derivationPath[3] ?? 0)}/${Number(derivationPath[4] ?? 0)}`);\n\n if (!leaf.publicKey) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_public_key\",\n info: { chain, error: \"Unable to derive Trezor leaf public key from account xpub\" },\n });\n }\n\n fallbackPublicKey = leaf.publicKey;\n }\n\n return [fallbackPublicKey, { fingerprint: 0, path: address_n }];\n }\n\n const signerPubkeys: Uint8Array[] = [];\n const trezorInputs = [];\n\n for (let inputIndex = 0; inputIndex < tx.inputsLength; inputIndex++) {\n const input = tx.getInput(inputIndex);\n const existingDerivation = getFirstBip32Derivation(input);\n const derivation = existingDerivation ?? (await getFallbackDerivation());\n const amount = getPrevoutAmount(input);\n\n if (!input.txid || input.index === undefined || !amount) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: `Input ${inputIndex} is missing prevout data required by Trezor` },\n });\n }\n\n signerPubkeys[inputIndex] = derivation[0];\n\n if (!existingDerivation) {\n tx.updateInput(inputIndex, { bip32Derivation: [derivation] });\n }\n\n trezorInputs.push({\n address_n: derivation[1].path,\n amount,\n prev_hash: hexEncode.encode(input.txid),\n prev_index: input.index,\n script_type: scriptType.input,\n ...(input.sequence !== undefined ? { sequence: input.sequence } : {}),\n });\n }\n\n const outputs = buildUtxoOutputsForTrezor(\n tx,\n network,\n address_n,\n address,\n \"\",\n chain,\n scriptType,\n toCashAddress,\n stripPrefix,\n );\n\n const result = await TrezorConnect.signTransaction({\n coin,\n inputs: trezorInputs,\n locktime: tx.lockTime,\n outputs,\n version: tx.version,\n });\n\n if (!result.success) {\n const payload = result.payload as { error?: string; code?: string };\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, code: payload?.code ?? \"unknown\", error: payload?.error ?? \"unknown\", payload },\n });\n }\n\n result.payload.signatures.forEach((signatureHex, inputIndex) => {\n const pubkey = signerPubkeys[inputIndex];\n if (!(signatureHex && pubkey)) return;\n\n tx.updateInput(inputIndex, { partialSig: [[pubkey, normalizeTrezorSignature(signatureHex)]] });\n });\n\n return tx;\n };\n\n const signTransactionWithMultipleInputs = async (\n tx: Transaction,\n inputs: Array<{ hash: string; index: number; value: number; derivationIndex: number; isChange: boolean }>,\n memo = \"\",\n ) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const network = getNetworkForChain(chain as UTXOChain);\n const baseAddressN = hardenDerivationPath(derivationPath.slice(0, 3) as DerivationPathArray);\n\n const outputs = buildUtxoOutputsForTrezor(\n tx,\n network,\n baseAddressN,\n address,\n memo,\n chain,\n scriptType,\n toCashAddress,\n stripPrefix,\n );\n\n const trezorInputs = inputs.map(({ hash, index: inputIndex, value, derivationIndex, isChange }) => {\n const changePath = isChange ? 1 : 0;\n const inputAddressN = [...baseAddressN, changePath, derivationIndex];\n return {\n address_n: inputAddressN,\n amount: value,\n prev_hash: hash,\n prev_index: inputIndex,\n script_type: scriptType.input,\n };\n });\n\n const result = await TrezorConnect.signTransaction({ coin, inputs: trezorInputs, outputs });\n\n if (result.success) {\n return result.payload.serializedTx;\n }\n\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: (result.payload as { error: string; code?: string }).error },\n });\n };\n\n const transferFromMultipleAddresses = async ({\n utxos,\n recipient,\n assetValue,\n memo,\n feeRate,\n feeOptionKey,\n }: {\n utxos: Array<{\n hash: string;\n index: number;\n value: number;\n txHex?: string;\n derivationIndex: number;\n isChange: boolean;\n address: string;\n }>;\n recipient: string;\n assetValue: { getBaseValue: (unit: string) => number; chain: string };\n memo?: string;\n feeRate?: number;\n feeOptionKey?: (typeof FeeOption)[keyof typeof FeeOption];\n }) => {\n const toolbox = getUtxoToolbox(chain);\n const txFeeRate = feeRate || (await toolbox.getFeeRates())[feeOptionKey || FeeOption.Fast];\n\n const { tx, inputs: selectedInputs } = await toolbox.createTransaction({\n assetValue: assetValue as any,\n feeRate: txFeeRate,\n fetchTxHex: true,\n memo,\n recipient,\n sender: address,\n });\n\n const inputsWithDerivation = selectedInputs.map((input: { hash: string; index: number; value: number }) => {\n const utxoInfo = utxos.find((u) => u.hash === input.hash && u.index === input.index);\n return { ...input, derivationIndex: utxoInfo?.derivationIndex ?? 0, isChange: utxoInfo?.isChange ?? false };\n });\n\n const signedTxHex = await signTransactionWithMultipleInputs(tx as Transaction, inputsWithDerivation, memo);\n return toolbox.broadcastTx(signedTxHex);\n };\n\n const transfer = async ({\n recipient,\n feeOptionKey,\n feeRate: paramFeeRate,\n memo,\n ...rest\n }: GenericTransferParams) => {\n if (!(address && recipient)) {\n throw new SwapKitError({\n errorKey: \"wallet_missing_params\",\n info: { address, memo, recipient, wallet: WalletOption.TREZOR },\n });\n }\n\n const toolbox = getUtxoToolbox(chain);\n\n const feeRate = paramFeeRate || (await toolbox.getFeeRates())[feeOptionKey || FeeOption.Fast];\n\n const createTxMethod = (toolbox as UTXOToolboxes[\"BTC\"]).createTransaction;\n\n const { tx, inputs } = await createTxMethod({\n ...rest,\n feeRate,\n fetchTxHex: true,\n memo,\n recipient,\n sender: address,\n });\n\n const signedTxHex = await signTransaction(tx, inputs, memo);\n const txHash = await toolbox.broadcastTx(signedTxHex);\n\n return txHash;\n };\n\n const toolbox =\n chain === Chain.Bitcoin || chain === Chain.Litecoin\n ? await getUtxoToolbox(utxoChain, {\n signer: { getAddress: async () => address, signTransaction: signPsbtTransaction },\n })\n : baseToolbox;\n\n async function getExtendedPublicKeyInfo({ accountIndex }: { accountIndex?: number } = {}) {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const resolvedAccountPath = getUTXOAccountPath({ accountIndex, chain: utxoChain, derivationPath });\n const path = derivationPathToString(resolvedAccountPath);\n const cacheKey = `${chain}:${path}`;\n const cached = trezorXpubCache.get(cacheKey);\n if (cached) return cached;\n\n const { success, payload } = await TrezorConnect.getPublicKey({ coin, path });\n\n if (!success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_public_key\",\n info: { chain, error: (payload as { error: string; code?: string }).error || \"Unknown error\" },\n });\n }\n\n const info = {\n accountIndex: getUTXOAccountIndexFromPath(resolvedAccountPath),\n chainCode: payload.chainCode,\n depth: payload.depth,\n fingerprint: payload.fingerprint,\n path: payload.serializedPath,\n publicKey: payload.publicKey,\n xpub: payload.xpub,\n xpubSegwit: payload.xpubSegwit,\n };\n\n trezorXpubCache.set(cacheKey, info);\n return info;\n }\n\n function getExtendedPublicKey(params: { accountIndex?: number } = {}) {\n return getExtendedPublicKeyInfo(params);\n }\n\n async function deriveAddressAtIndex({\n accountIndex,\n index,\n change = false,\n }: {\n accountIndex?: number;\n index: number;\n change?: boolean;\n }) {\n assertDerivationIndex(\"index\", index);\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const resolvedAccountPath = getUTXOAccountPath({ accountIndex, chain: utxoChain, derivationPath });\n const fullPath = `${derivationPathToString(resolvedAccountPath)}/${Number(change)}/${index}`;\n\n const { success, payload } = await TrezorConnect.getAddress({ coin, path: fullPath, showOnTrezor: false });\n\n if (!success) {\n return undefined;\n }\n\n let finalAddress = payload.address;\n if (chain === Chain.BitcoinCash) {\n const bchToolbox = await getUtxoToolbox(chain as typeof Chain.BitcoinCash);\n finalAddress = bchToolbox.stripPrefix(payload.address);\n }\n\n const pubKeyResult = await TrezorConnect.getPublicKey({ coin, path: fullPath });\n const pubkey = pubKeyResult.success ? pubKeyResult.payload.publicKey : \"\";\n\n return {\n accountIndex: getUTXOAccountIndexFromPath(resolvedAccountPath),\n address: finalAddress,\n change,\n index,\n path: fullPath,\n pubkey,\n };\n }\n\n async function deriveAddressesBatch({\n accountIndex,\n count,\n startIndex = 0,\n change = false,\n }: {\n accountIndex?: number;\n count: number;\n startIndex?: number;\n change?: boolean;\n }) {\n assertDerivationIndex(\"count\", count);\n assertDerivationIndex(\"startIndex\", startIndex);\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const resolvedAccountPath = getUTXOAccountPath({ accountIndex, chain: utxoChain, derivationPath });\n const accountPath = derivationPathToString(resolvedAccountPath);\n\n const paths = Array.from({ length: count }, (_, i) => ({\n coin,\n path: `${accountPath}/${Number(change)}/${startIndex + i}`,\n showOnTrezor: false,\n }));\n\n const { success, payload } = await TrezorConnect.getAddress({ bundle: paths });\n\n if (!success || !Array.isArray(payload)) {\n return [];\n }\n\n const addresses = await Promise.all(\n payload.map(async (result, i) => {\n let finalAddress = result.address;\n if (chain === Chain.BitcoinCash) {\n const bchToolbox = await getUtxoToolbox(chain as typeof Chain.BitcoinCash);\n finalAddress = bchToolbox.stripPrefix(result.address);\n }\n\n return {\n accountIndex: getUTXOAccountIndexFromPath(resolvedAccountPath),\n address: finalAddress,\n change,\n index: startIndex + i,\n path: `${accountPath}/${Number(change)}/${startIndex + i}`,\n pubkey: \"\",\n };\n }),\n );\n\n return addresses;\n }\n\n const hdHelpers = createHDWalletHelpers({\n chain,\n deriveAddress: deriveAddressAtIndex,\n getBalance: toolbox.getBalance,\n getUtxos: (addr: string) => getUtxoApi(chain).getUtxos({ address: addr, fetchTxHex: true }),\n });\n\n return {\n ...toolbox,\n ...hdHelpers,\n address,\n deriveAddressAtIndex,\n deriveAddresses: deriveAddressesBatch,\n getExtendedPublicKey,\n getExtendedPublicKeyInfo,\n signTransaction,\n signTransactionWithMultipleInputs,\n transfer,\n transferFromMultipleAddresses,\n };\n }\n\n default:\n throw new SwapKitError({ errorKey: \"wallet_chain_not_supported\", info: { chain, wallet: WalletOption.TREZOR } });\n }\n}\n\nexport const trezorWallet = createWallet({\n connect: ({ addChain, supportedChains, walletType }) =>\n async function connectTrezor(chains: Chain[], derivationPath: DerivationPathArray) {\n const [chain] = filterSupportedChains({ chains, supportedChains, walletType });\n if (!chain) {\n throw new SwapKitError({\n errorKey: \"wallet_chain_not_supported\",\n info: { chain, wallet: WalletOption.TREZOR },\n });\n }\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n\n const trezorConfig = SKConfig.get(\"integrations\").trezor as Record<string, unknown> | undefined;\n const {\n connectSrc,\n coreMode,\n debug,\n interactionTimeout,\n lazyLoad,\n pendingTransportEvent,\n popup,\n transportReconnect,\n transports,\n ...manifestConfig\n } = trezorConfig ?? {};\n const manifest = {\n ...manifestConfig,\n appName: getTrezorManifestValue(trezorConfig?.appName, DEFAULT_TREZOR_MANIFEST.appName),\n appUrl: getTrezorManifestValue(trezorConfig?.appUrl, getDefaultTrezorAppUrl()),\n email: getTrezorManifestValue(trezorConfig?.email, DEFAULT_TREZOR_MANIFEST.email),\n };\n const isLocalhost =\n typeof globalThis.location !== \"undefined\" && [\"localhost\", \"127.0.0.1\"].includes(globalThis.location.hostname);\n const resolvedCoreMode = normalizeTrezorCoreMode(coreMode) ?? \"popup\";\n const resolvedTransports = normalizeTrezorTransports(transports) ?? DEFAULT_TREZOR_TRANSPORTS;\n\n if (trezorSessionDispose) {\n await trezorSessionDispose;\n }\n\n if (isLocalhost) {\n await TrezorConnect.dispose();\n }\n\n await TrezorConnect.init({\n connectSrc: connectSrc as string | undefined,\n coreMode: resolvedCoreMode,\n debug: debug as boolean | undefined,\n interactionTimeout: interactionTimeout as number | undefined,\n lazyLoad: (lazyLoad as boolean | undefined) ?? false,\n manifest,\n pendingTransportEvent: pendingTransportEvent as boolean | undefined,\n popup: (popup as boolean | undefined) ?? true,\n transportReconnect: transportReconnect as boolean | undefined,\n transports: resolvedTransports,\n });\n\n const wallet = await getTrezorWallet({ chain, derivationPath });\n\n addChain({ ...wallet, chain, disconnect: disconnectTrezorSession, walletType });\n\n return true;\n },\n directSigningSupport: {\n [Chain.Arbitrum]: true,\n [Chain.Aurora]: true,\n [Chain.Avalanche]: true,\n [Chain.Base]: true,\n [Chain.Berachain]: true,\n [Chain.BinanceSmartChain]: true,\n [Chain.Bitcoin]: true,\n [Chain.Ethereum]: true,\n [Chain.Gnosis]: true,\n [Chain.Litecoin]: true,\n [Chain.Monad]: true,\n [Chain.Optimism]: true,\n [Chain.Polygon]: true,\n [Chain.XLayer]: true,\n // BCH/DASH/DOGE/ZEC: pending PSBT→TrezorConnect converter (V3 plan PR)\n },\n name: \"connectTrezor\",\n supportedChains: [\n Chain.Arbitrum,\n Chain.Aurora,\n Chain.Avalanche,\n Chain.Base,\n Chain.Berachain,\n Chain.BinanceSmartChain,\n Chain.Bitcoin,\n Chain.BitcoinCash,\n Chain.Dash,\n Chain.Dogecoin,\n Chain.Ethereum,\n Chain.Gnosis,\n Chain.Litecoin,\n Chain.Monad,\n Chain.Optimism,\n Chain.Polygon,\n Chain.XLayer,\n Chain.Zcash,\n ],\n walletType: WalletOption.TREZOR,\n});\n\nexport const TREZOR_SUPPORTED_CHAINS = getWalletSupportedChains(trezorWallet);\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "CC2564B1AB08006E64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/trezor/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,EAUN,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/trezor/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,EAUN,MAAM,kBAAkB,CAAC;AAyhC1B,eAAO,MAAM,YAAY;;;;;;;;CAuGvB,CAAC;AAEH,eAAO,MAAM,uBAAuB,6SAAyC,CAAC"}
|
package/package.json
CHANGED
package/src/trezor/index.ts
CHANGED
|
@@ -42,6 +42,8 @@ type TrezorExtendedPublicKeyInfo = {
|
|
|
42
42
|
|
|
43
43
|
const TREZOR_CORE_MODES = new Set<TrezorCoreMode>(["auto", "iframe", "popup", "suite-desktop", "suite-web"]);
|
|
44
44
|
const TREZOR_TRANSPORTS = new Set<TrezorTransport>(["BridgeTransport", "WebUsbTransport", "NodeUsbTransport"]);
|
|
45
|
+
const DEFAULT_TREZOR_MANIFEST = { appName: "SwapKit", appUrl: "https://swapkit.dev", email: "support@swapkit.dev" };
|
|
46
|
+
const DEFAULT_TREZOR_TRANSPORTS = ["WebUsbTransport" as const];
|
|
45
47
|
const trezorXpubCache = new Map<string, TrezorExtendedPublicKeyInfo>();
|
|
46
48
|
let trezorSessionDispose: Promise<void> | undefined;
|
|
47
49
|
|
|
@@ -82,6 +84,16 @@ function normalizeTrezorTransports(transports: unknown): TrezorTransport[] | und
|
|
|
82
84
|
return normalized.length > 0 ? normalized : undefined;
|
|
83
85
|
}
|
|
84
86
|
|
|
87
|
+
function getTrezorManifestValue(value: unknown, fallback: string) {
|
|
88
|
+
return typeof value === "string" && value.trim() ? value : fallback;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function getDefaultTrezorAppUrl() {
|
|
92
|
+
return typeof globalThis.location !== "undefined" && globalThis.location.origin
|
|
93
|
+
? globalThis.location.origin
|
|
94
|
+
: DEFAULT_TREZOR_MANIFEST.appUrl;
|
|
95
|
+
}
|
|
96
|
+
|
|
85
97
|
function decodeOpReturnData(script: Uint8Array): string | null {
|
|
86
98
|
if (script.length < 2 || script[0] !== 0x6a) return null;
|
|
87
99
|
const dataLen = script[1];
|
|
@@ -1075,14 +1087,14 @@ export const trezorWallet = createWallet({
|
|
|
1075
1087
|
} = trezorConfig ?? {};
|
|
1076
1088
|
const manifest = {
|
|
1077
1089
|
...manifestConfig,
|
|
1078
|
-
appName:
|
|
1079
|
-
appUrl:
|
|
1080
|
-
email:
|
|
1090
|
+
appName: getTrezorManifestValue(trezorConfig?.appName, DEFAULT_TREZOR_MANIFEST.appName),
|
|
1091
|
+
appUrl: getTrezorManifestValue(trezorConfig?.appUrl, getDefaultTrezorAppUrl()),
|
|
1092
|
+
email: getTrezorManifestValue(trezorConfig?.email, DEFAULT_TREZOR_MANIFEST.email),
|
|
1081
1093
|
};
|
|
1082
1094
|
const isLocalhost =
|
|
1083
1095
|
typeof globalThis.location !== "undefined" && ["localhost", "127.0.0.1"].includes(globalThis.location.hostname);
|
|
1084
|
-
const resolvedCoreMode =
|
|
1085
|
-
const resolvedTransports =
|
|
1096
|
+
const resolvedCoreMode = normalizeTrezorCoreMode(coreMode) ?? "popup";
|
|
1097
|
+
const resolvedTransports = normalizeTrezorTransports(transports) ?? DEFAULT_TREZOR_TRANSPORTS;
|
|
1086
1098
|
|
|
1087
1099
|
if (trezorSessionDispose) {
|
|
1088
1100
|
await trezorSessionDispose;
|
|
@@ -1097,10 +1109,10 @@ export const trezorWallet = createWallet({
|
|
|
1097
1109
|
coreMode: resolvedCoreMode,
|
|
1098
1110
|
debug: debug as boolean | undefined,
|
|
1099
1111
|
interactionTimeout: interactionTimeout as number | undefined,
|
|
1100
|
-
lazyLoad:
|
|
1112
|
+
lazyLoad: (lazyLoad as boolean | undefined) ?? false,
|
|
1101
1113
|
manifest,
|
|
1102
1114
|
pendingTransportEvent: pendingTransportEvent as boolean | undefined,
|
|
1103
|
-
popup:
|
|
1115
|
+
popup: (popup as boolean | undefined) ?? true,
|
|
1104
1116
|
transportReconnect: transportReconnect as boolean | undefined,
|
|
1105
1117
|
transports: resolvedTransports,
|
|
1106
1118
|
});
|