@swapkit/toolboxes 4.0.0-beta.40 → 4.0.0-beta.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- var _y={};py(_y,{trc20ABI:()=>O,getTronPrivateKeyFromMnemonic:()=>l,getTronAddressValidator:()=>E,createTronToolbox:()=>b});module.exports=my(_y);var y=require("@swapkit/helpers"),H=require("ts-pattern");var O=[{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[{name:"success",type:"bool"}],stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint8"}],stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],stateMutability:"view",type:"function"},{constant:!0,inputs:[{name:"_owner",type:"address"},{name:"_spender",type:"address"}],name:"allowance",outputs:[{name:"remaining",type:"uint256"}],stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_value",type:"uint256"}],name:"approve",outputs:[{name:"success",type:"bool"}],stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"totalSupply",outputs:[{name:"",type:"uint256"}],stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_from",type:"address"},{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transferFrom",outputs:[{name:"success",type:"bool"}],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,name:"_from",type:"address"},{indexed:!0,name:"_to",type:"address"},{indexed:!1,name:"_value",type:"uint256"}],name:"Transfer",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"_owner",type:"address"},{indexed:!0,name:"_spender",type:"address"},{indexed:!1,name:"_value",type:"uint256"}],name:"Approval",type:"event"}];var w=require("@swapkit/helpers"),V=require("tronweb"),e="https://api.trongrid.io";async function W(q){try{let Z=await fetch(`${e}/v1/accounts/${q}`);if(!Z.ok)throw new Error(`TronGrid API error: ${Z.status} ${Z.statusText}`);let Y=await Z.json();if(!(Y.success&&Y.data)||Y.data.length===0)throw new Error("Invalid response from TronGrid API");let p;try{p=V.TronWeb.address.toHex(q).toLowerCase()}catch{p=q.toLowerCase()}let j=Y.data.find((x)=>{return x.address.toLowerCase()===p});if(!j)return;return{balance:j.balance,trc20:j.trc20||[]}}catch(Z){throw new w.SwapKitError("toolbox_tron_trongrid_api_error",{message:Z instanceof Error?Z.message:"Unknown error",address:q})}}var P=require("tronweb"),r=268,yy=13000,fy=345,S="TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";async function E(){return(q)=>{return P.TronWeb.isAddress(q)}}async function l({phrase:q,derivationPath:Z,index:Y}){let p=Z||y.derivationPathToString(y.updateDerivationPath(y.NetworkDerivationPath[y.Chain.Tron],{index:Y||0})),{HDKey:j}=await import("@scure/bip32"),{mnemonicToSeedSync:x}=await import("@scure/bip39"),$=x(q),L=j.fromMasterSeed($).derive(p);if(!L.privateKey)throw new y.SwapKitError("toolbox_tron_no_signer");return Buffer.from(L.privateKey).toString("hex")}async function uy({phrase:q,derivationPath:Z}){let{HDKey:Y}=await import("@scure/bip32"),{mnemonicToSeedSync:p}=await import("@scure/bip39"),j=p(q),$=Y.fromMasterSeed(j).derive(Z);if(!$.privateKey)throw new y.SwapKitError("toolbox_tron_no_signer");let G=Buffer.from($.privateKey).toString("hex"),L=new P.TronWeb({fullHost:y.SKConfig.get("rpcUrls")[y.Chain.Tron],privateKey:G}),k=L.address.fromPrivateKey(G);return{getAddress:()=>Promise.resolve(typeof k==="string"?k:""),signTransaction:async(R)=>{return await L.trx.sign(R,G)}}}var b=async(q={})=>{let Z=y.SKConfig.get("rpcUrls")[y.Chain.Tron],Y=void 0,p=new P.TronWeb({fullHost:Z,headers:void 0}),j="index"in q?q.index||0:0,x=y.derivationPathToString("derivationPath"in q&&q.derivationPath?q.derivationPath:y.updateDerivationPath(y.NetworkDerivationPath[y.Chain.Tron],{index:j})),$=await H.match(q).with({phrase:H.P.string},async({phrase:u})=>uy({phrase:u,derivationPath:x})).with({signer:H.P.any},({signer:u})=>Promise.resolve(u)).otherwise(()=>Promise.resolve(void 0)),G=async()=>{if(!$)throw new y.SwapKitError("toolbox_tron_no_signer");return await $.getAddress()},L=()=>{return 1e8},k=async()=>{try{let u=await p.trx.getChainParameters(),f={};for(let m of u)f[m.key]=m.value;return{energyFee:f.getEnergyFee||420,bandwidthFee:f.getTransactionFee||1000,createAccountFee:f.getCreateAccountFee||1e5}}catch{return{energyFee:420,bandwidthFee:1000,createAccountFee:1e5}}},R=async(u)=>{try{let f=await p.trx.getAccount(u);return f&&Object.keys(f).length>0}catch{return!1}},K=async(u)=>{try{let f=await p.trx.getAccountResources(u);return{bandwidth:{free:f.freeNetLimit-f.freeNetUsed,total:f.NetLimit||0,used:f.NetUsed||0},energy:{total:f.EnergyLimit||0,used:f.EnergyUsed||0}}}catch{return{bandwidth:{free:600,total:0,used:0},energy:{total:0,used:0}}}},A=async(u,f)=>{try{let m=p.contract(O,f);if(!m.methods?.balanceOf)return 0n;let M=(await m.methods.balanceOf(u).call())[0];return BigInt(M||0)}catch(m){return console.warn(`balanceOf() failed for ${f}:`,m),0n}},h=async(u,f)=>{try{p.setAddress(f);let m=p.contract(O,u),[M,_]=await Promise.all([m.symbol().call().catch(()=>"UNKNOWN"),m.decimals().call().catch(()=>"18")]);return{symbol:M??"UNKNOWN",decimals:Number(_??18)}}catch(m){return y.warnOnce(!0,`Failed to get token balance for ${u}: ${m instanceof Error?m.message:m}`),null}},n=async(u,f=!0)=>{let m=[y.AssetValue.from({chain:y.Chain.Tron})];try{let M=await W(u);if(M){let _=[];_.push(y.AssetValue.from({chain:y.Chain.Tron,value:M.balance,fromBaseDecimal:6}));for(let Q of M.trc20){let[X,J]=Object.entries(Q)[0]||[];if(!(X&&J))continue;let z=await h(X,u);if(!z)continue;_.push(y.AssetValue.from({asset:`TRX.${z.symbol}-${X}`,value:BigInt(J||0),fromBaseDecimal:z.decimals}))}return _}return m}catch(M){y.warnOnce(!0,`Tron API getBalance failed: ${M instanceof Error?M.message:M}`);let _=[],Q=await p.trx.getBalance(u);if(Q&&Number(Q)>0)_.push(y.AssetValue.from({chain:y.Chain.Tron,value:Q,fromBaseDecimal:6}));let X=await A(u,S);if(X)_.push(y.AssetValue.from({asset:`TRX.USDT-${S}`,value:X,fromBaseDecimal:6}));return _}},o=async({recipient:u,assetValue:f,memo:m})=>{if(!$)throw new y.SwapKitError("toolbox_tron_no_signer");let M=await G();if(f.isGasAsset){let U=await p.transactionBuilder.sendTrx(u,f.getBaseValue("number"),M);if(m){let B=await p.transactionBuilder.addUpdateData(U,m,"utf8"),F=await $.signTransaction(B),{txid:T}=await p.trx.sendRawTransaction(F);return T}let I=await $.signTransaction(U),{txid:v}=await p.trx.sendRawTransaction(I);return v}let Q=f.address;if(!Q)throw new y.SwapKitError("toolbox_tron_invalid_token_identifier",{identifier:f.toString()});let X=L(),J=p.contract(O,Q);if(!J.methods?.transfer)throw new y.SwapKitError("toolbox_tron_token_transfer_failed");let z=await J.transfer(u,f.getBaseValue("string")).send({from:M,feeLimit:X,callValue:0});if(!z)throw new y.SwapKitError("toolbox_tron_token_transfer_failed");return z},t=async({assetValue:u,recipient:f,sender:m})=>{let M=u.isGasAsset;try{let _=m?m:$?await G():void 0;if(!_)return M?y.AssetValue.from({chain:y.Chain.Tron,value:0.1,fromBaseDecimal:0}):y.AssetValue.from({chain:y.Chain.Tron,value:15,fromBaseDecimal:0});let Q=await k(),J=await R(f)?0:Q.createAccountFee,z=await K(_);if(M){let C=r,N=z.bandwidth.free+(z.bandwidth.total-z.bandwidth.used),g=0;if(C>N)g=(C-N)*Q.bandwidthFee;let a=J+g;return y.AssetValue.from({chain:y.Chain.Tron,value:a,fromBaseDecimal:6})}let U=fy,I=yy,v=z.bandwidth.free+(z.bandwidth.total-z.bandwidth.used),B=z.energy.total-z.energy.used,F=0;if(U>v)F=(U-v)*Q.bandwidthFee;let T=0;if(I>B)T=(I-B)*Q.energyFee;let s=J+F+T;return y.AssetValue.from({chain:y.Chain.Tron,value:s,fromBaseDecimal:6})}catch(_){throw y.warnOnce(!0,`Failed to calculate exact fee, using conservative estimate: ${_ instanceof Error?_.message:_}`),new y.SwapKitError("toolbox_tron_fee_estimation_failed",{error:_})}},i=async(u)=>{let{recipient:f,assetValue:m,memo:M,sender:_}=u;if(m.isGasAsset){let J=await p.transactionBuilder.sendTrx(f,m.getBaseValue("number"),_);if(M)return p.transactionBuilder.addUpdateData(J,M,"utf8");return J}let X=m.address;if(!X)throw new y.SwapKitError("toolbox_tron_invalid_token_identifier",{identifier:m.toString()});try{let z=[{type:"address",value:f},{type:"uint256",value:m.getBaseValue("string")}],U={feeLimit:L(),callValue:0};return(await p.transactionBuilder.triggerSmartContract(X,"transfer(address,uint256)",U,z,_)).transaction}catch(J){throw new y.SwapKitError("toolbox_tron_transaction_creation_failed",{message:"Failed to create TRC20 transaction. This might be due to TronWeb 6.0.3 bug. Use the transfer method directly instead.",originalError:J instanceof Error?J.message:String(J)})}},c=async(u)=>{if(!$)throw new y.SwapKitError("toolbox_tron_no_signer");return await $.signTransaction(u)},d=async(u)=>{let{txid:f}=await p.trx.sendRawTransaction(u);return f};return{tronWeb:p,getAddress:G,validateAddress:await E(),getBalance:n,transfer:o,estimateTransactionFee:t,createTransaction:i,signTransaction:c,broadcastTransaction:d}};
1
+ var $y={};Zy($y,{trc20ABI:()=>m,getTronPrivateKeyFromMnemonic:()=>h,getTronAddressValidator:()=>K,createTronToolbox:()=>A});module.exports=Qy($y);var y=require("@swapkit/helpers"),p=require("ts-pattern");var m=[{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[{name:"success",type:"bool"}],stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint8"}],stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],stateMutability:"view",type:"function"},{constant:!0,inputs:[{name:"_owner",type:"address"},{name:"_spender",type:"address"}],name:"allowance",outputs:[{name:"remaining",type:"uint256"}],stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_value",type:"uint256"}],name:"approve",outputs:[{name:"success",type:"bool"}],stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"totalSupply",outputs:[{name:"",type:"uint256"}],stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_from",type:"address"},{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transferFrom",outputs:[{name:"success",type:"bool"}],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,name:"_from",type:"address"},{indexed:!0,name:"_to",type:"address"},{indexed:!1,name:"_value",type:"uint256"}],name:"Transfer",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"_owner",type:"address"},{indexed:!0,name:"_spender",type:"address"},{indexed:!1,name:"_value",type:"uint256"}],name:"Approval",type:"event"}];var l=require("@swapkit/helpers"),W=require("tronweb"),fy="https://api.trongrid.io";async function g($){try{let u=await fetch(`${fy}/v1/accounts/${$}`);if(!u.ok)throw new Error(`TronGrid API error: ${u.status} ${u.statusText}`);let G=await u.json();if(!(G.success&&G.data)||G.data.length===0)throw new Error("Invalid response from TronGrid API");let z;try{z=W.TronWeb.address.toHex($).toLowerCase()}catch{z=$.toLowerCase()}let L=G.data.find((H)=>{return H.address.toLowerCase()===z});if(!L)return;return{balance:L.balance,trc20:L.trc20||[]}}catch(u){throw new l.SwapKitError("toolbox_tron_trongrid_api_error",{message:u instanceof Error?u.message:"Unknown error",address:$})}}var R=require("tronweb"),_y=268,qy=13000,zy=345,b="TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",Jy="0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";async function K(){return($)=>{return R.TronWeb.isAddress($)}}async function h({phrase:$,derivationPath:u,index:G}){let z=u||y.derivationPathToString(y.updateDerivationPath(y.NetworkDerivationPath[y.Chain.Tron],{index:G||0})),{HDKey:L}=await import("@scure/bip32"),{mnemonicToSeedSync:H}=await import("@scure/bip39"),j=H($),U=L.fromMasterSeed(j).derive(z);if(!U.privateKey)throw new y.SwapKitError("toolbox_tron_no_signer");return Buffer.from(U.privateKey).toString("hex")}async function My({phrase:$,derivationPath:u,tronWeb:G}){let{HDKey:z}=await import("@scure/bip32"),{mnemonicToSeedSync:L}=await import("@scure/bip39"),H=L($),I=z.fromMasterSeed(H).derive(u);if(!I.privateKey)throw new y.SwapKitError("toolbox_tron_no_signer");let U=Buffer.from(I.privateKey).toString("hex");G.setPrivateKey(U);let v=G?.address.fromPrivateKey(U);return{getAddress:()=>Promise.resolve(typeof v==="string"?v:""),signTransaction:async(T)=>{return await G.trx.sign(T,U)}}}var A=async($={})=>{let u=y.SKConfig.get("rpcUrls")[y.Chain.Tron],G=void 0,z=new R.TronWeb({fullHost:u,headers:void 0}),L="index"in $?$.index||0:0,H=y.derivationPathToString("derivationPath"in $&&$.derivationPath?$.derivationPath:y.updateDerivationPath(y.NetworkDerivationPath[y.Chain.Tron],{index:L})),j=await p.match($).with({phrase:p.P.string},async({phrase:_})=>My({phrase:_,derivationPath:H,tronWeb:z})).with({signer:p.P.any},({signer:_})=>Promise.resolve(_)).otherwise(()=>Promise.resolve(void 0)),I=async()=>{if(!j)throw new y.SwapKitError("toolbox_tron_no_signer");return await j.getAddress()},U=()=>{return 1e8},v=async()=>{try{let _=await z.trx.getChainParameters(),f={};for(let q of _)f[q.key]=q.value;return{energyFee:f.getEnergyFee||420,bandwidthFee:f.getTransactionFee||1000,createAccountFee:f.getCreateAccountFee||1e5}}catch{return{energyFee:420,bandwidthFee:1000,createAccountFee:1e5}}},T=async(_)=>{try{let f=await z.trx.getAccount(_);return f&&Object.keys(f).length>0}catch{return!1}},N=async(_)=>{try{let f=await z.trx.getAccountResources(_);return{bandwidth:{free:f.freeNetLimit-f.freeNetUsed,total:f.NetLimit||0,used:f.NetUsed||0},energy:{total:f.EnergyLimit||0,used:f.EnergyUsed||0}}}catch{return{bandwidth:{free:600,total:0,used:0},energy:{total:0,used:0}}}},i=async(_,f)=>{try{let q=z.contract(m,f);if(!q.methods?.balanceOf)return 0n;let J=(await q.methods.balanceOf(_).call())[0];return BigInt(J||0)}catch(q){return console.warn(`balanceOf() failed for ${f}:`,q),0n}},n=async(_,f)=>{try{z.setAddress(f);let q=z.contract(m,_),[J,M]=await Promise.all([q.symbol().call().catch(()=>"UNKNOWN"),q.decimals().call().catch(()=>"18")]);return{symbol:J??"UNKNOWN",decimals:Number(M??18)}}catch(q){return y.warnOnce(!0,`Failed to get token balance for ${_}: ${q instanceof Error?q.message:q}`),null}},c=async(_,f=!0)=>{let q=[y.AssetValue.from({chain:y.Chain.Tron})];try{let J=await g(_);if(J){let M=[];M.push(y.AssetValue.from({chain:y.Chain.Tron,value:J.balance,fromBaseDecimal:6}));for(let Y of J.trc20){let[X,Q]=Object.entries(Y)[0]||[];if(!(X&&Q))continue;let Z=await n(X,_);if(!Z)continue;M.push(y.AssetValue.from({asset:`TRX.${Z.symbol}-${X}`,value:BigInt(Q||0),fromBaseDecimal:Z.decimals}))}return M}return q}catch(J){y.warnOnce(!0,`Tron API getBalance failed: ${J instanceof Error?J.message:J}`);let M=[],Y=await z.trx.getBalance(_);if(Y&&Number(Y)>0)M.push(y.AssetValue.from({chain:y.Chain.Tron,value:Y,fromBaseDecimal:6}));let X=await i(_,b);if(X)M.push(y.AssetValue.from({asset:`TRX.USDT-${b}`,value:X,fromBaseDecimal:6}));return M}},t=async({recipient:_,assetValue:f,memo:q})=>{if(!j)throw new y.SwapKitError("toolbox_tron_no_signer");let J=await I();if(z.setAddress(J),f.isGasAsset){let Z=await z.transactionBuilder.sendTrx(_,f.getBaseValue("number"),J);if(q){let F=await z.transactionBuilder.addUpdateData(Z,q,"utf8"),k=await j.signTransaction(F),{txid:B}=await z.trx.sendRawTransaction(k);return B}let x=await j.signTransaction(Z),{txid:O}=await z.trx.sendRawTransaction(x);return O}let Y=await P({recipient:_,assetValue:f,memo:q,sender:J}),X=await j.signTransaction(Y),{txid:Q}=await z.trx.sendRawTransaction(X);if(!Q)throw new y.SwapKitError("toolbox_tron_token_transfer_failed");return Q},o=async({assetValue:_,recipient:f,sender:q})=>{let J=_.isGasAsset;try{let M=q?q:j?await I():void 0;if(!M)return J?y.AssetValue.from({chain:y.Chain.Tron,value:0.1,fromBaseDecimal:0}):y.AssetValue.from({chain:y.Chain.Tron,value:15,fromBaseDecimal:0});let Y=await v(),Q=await T(f)?0:Y.createAccountFee,Z=await N(M);if(J){let C=_y,w=Z.bandwidth.free+(Z.bandwidth.total-Z.bandwidth.used),S=0;if(C>w)S=(C-w)*Y.bandwidthFee;let yy=Q+S;return y.AssetValue.from({chain:y.Chain.Tron,value:yy,fromBaseDecimal:6})}let x=zy,O=qy,F=Z.bandwidth.free+(Z.bandwidth.total-Z.bandwidth.used),k=Z.energy.total-Z.energy.used,B=0;if(x>F)B=(x-F)*Y.bandwidthFee;let E=0;if(O>k)E=(O-k)*Y.energyFee;let r=Q+B+E;return y.AssetValue.from({chain:y.Chain.Tron,value:r,fromBaseDecimal:6})}catch(M){throw y.warnOnce(!0,`Failed to calculate exact fee, using conservative estimate: ${M instanceof Error?M.message:M}`),new y.SwapKitError("toolbox_tron_fee_estimation_failed",{error:M})}},P=async(_)=>{let{recipient:f,assetValue:q,memo:J,sender:M}=_;if(q.isGasAsset){let Q=await z.transactionBuilder.sendTrx(f,q.getBaseValue("number"),M);if(J)return z.transactionBuilder.addUpdateData(Q,J,"utf8");return Q}z.setAddress(M);let X=q.address;if(!X)throw new y.SwapKitError("toolbox_tron_invalid_token_identifier",{identifier:q.toString()});try{let Z=[{type:"address",value:f},{type:"uint256",value:q.getBaseValue("string")}],x={feeLimit:U(),callValue:0};return(await z.transactionBuilder.triggerSmartContract(X,"transfer(address,uint256)",x,Z,M)).transaction}catch(Q){throw new y.SwapKitError("toolbox_tron_transaction_creation_failed",{message:"Failed to create TRC20 transaction. This might be due to TronWeb 6.0.3 bug. Use the transfer method directly instead.",originalError:Q instanceof Error?Q.message:String(Q)})}},d=async(_)=>{if(!j)throw new y.SwapKitError("toolbox_tron_no_signer");return await j.signTransaction(_)},s=async(_)=>{let{txid:f}=await z.trx.sendRawTransaction(_);return f},V=async({assetAddress:_,spenderAddress:f,from:q})=>{try{let J=z.contract(m,_);if(!J.methods?.allowance)throw new y.SwapKitError("toolbox_tron_invalid_token_contract");let M=(await J.methods.allowance(q,f).call())[0];return BigInt(M||0)}catch(J){throw new y.SwapKitError("toolbox_tron_allowance_check_failed",{error:J})}},a=async({assetAddress:_,spenderAddress:f,from:q,amount:J})=>{let M=await V({assetAddress:_,spenderAddress:f,from:q});if(!J)return M>0n;let Y=BigInt(J);return M>=Y},e=async({assetAddress:_,spenderAddress:f,amount:q,from:J})=>{if(!j)throw new y.SwapKitError("toolbox_tron_no_signer");let M=J||await I(),Y=q!==void 0?BigInt(q).toString():Jy,X="approve(address,uint256)",Q=[{type:"address",value:f},{type:"uint256",value:Y}],x={feeLimit:U(),callValue:0};try{let{transaction:O}=await z.transactionBuilder.triggerSmartContract(_,X,x,Q,M),F=await j.signTransaction(O),{txid:k}=await z.trx.sendRawTransaction(F);if(!k)throw new y.SwapKitError("toolbox_tron_approve_failed");return k}catch(O){throw new y.SwapKitError("toolbox_tron_approve_failed",{error:O})}};return{tronWeb:z,getAddress:I,validateAddress:await K(),getBalance:c,transfer:t,estimateTransactionFee:o,createTransaction:P,signTransaction:d,broadcastTransaction:s,approve:e,isApproved:a,getApprovedAmount:V}};
2
2
 
3
- //# debugId=28D7AE2F942CE2FD64756E2164756E21
3
+ //# debugId=AD0F996DB7898AB064756E2164756E21
4
4
  //# sourceMappingURL=index.cjs.map
@@ -2,11 +2,11 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/tron/toolbox.ts", "../src/tron/helpers/trc20.abi.ts", "../src/tron/helpers/trongrid.ts"],
4
4
  "sourcesContent": [
5
- "import {\n AssetValue,\n Chain,\n NetworkDerivationPath,\n SKConfig,\n SwapKitError,\n derivationPathToString,\n updateDerivationPath,\n warnOnce,\n} from \"@swapkit/helpers\";\nimport { P, match } from \"ts-pattern\";\n\nimport { trc20ABI } from \"./helpers/trc20.abi.js\";\nimport { fetchAccountFromTronGrid } from \"./helpers/trongrid.js\";\nimport type {\n TronCreateTransactionParams,\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types.js\";\n\nimport { TronWeb } from \"tronweb\";\n\n// Constants for TRON resource calculation\nconst TRX_TRANSFER_BANDWIDTH = 268; // Bandwidth consumed by a TRX transfer\nconst TRC20_TRANSFER_ENERGY = 13000; // Average energy consumed by TRC20 transfer\nconst TRC20_TRANSFER_BANDWIDTH = 345; // Bandwidth consumed by TRC20 transfer\n\n// Known TRON tokens\nconst TRON_USDT_CONTRACT = \"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t\";\n\nexport async function getTronAddressValidator() {\n return (address: string) => {\n return TronWeb.isAddress(address);\n };\n}\n\nexport async function getTronPrivateKeyFromMnemonic({\n phrase,\n derivationPath: customPath,\n index,\n}: {\n phrase: string;\n derivationPath?: string;\n index?: number;\n}) {\n const derivationPathToUse =\n customPath ||\n derivationPathToString(\n updateDerivationPath(NetworkDerivationPath[Chain.Tron], {\n index: index || 0,\n }),\n );\n\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPathToUse);\n\n if (!derived.privateKey) {\n throw new SwapKitError(\"toolbox_tron_no_signer\");\n }\n\n return Buffer.from(derived.privateKey).toString(\"hex\");\n}\n\nasync function createKeysForPath({\n phrase,\n derivationPath,\n}: {\n phrase: string;\n derivationPath: string;\n}) {\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPath);\n\n if (!derived.privateKey) {\n throw new SwapKitError(\"toolbox_tron_no_signer\");\n }\n\n // Convert private key to hex string for TronWeb\n const privateKeyHex = Buffer.from(derived.privateKey).toString(\"hex\");\n\n // Create TronWeb instance with the derived private key\n const tronWebWithKey = new TronWeb({\n fullHost: SKConfig.get(\"rpcUrls\")[Chain.Tron],\n privateKey: privateKeyHex,\n });\n\n const address = tronWebWithKey.address.fromPrivateKey(privateKeyHex);\n\n return {\n getAddress: () => Promise.resolve(typeof address === \"string\" ? address : \"\"),\n signTransaction: async (transaction: TronTransaction) => {\n const signedTx = await tronWebWithKey.trx.sign(transaction, privateKeyHex);\n return signedTx;\n },\n };\n}\n\nexport const createTronToolbox = async (options: TronToolboxOptions = {}) => {\n // Always get configuration from SKConfig\n const rpcUrl = SKConfig.get(\"rpcUrls\")[Chain.Tron];\n // Note: TRON API key support can be added to SKConfig apiKeys when needed\n const headers = undefined; // No API key needed for basic TronGrid access\n\n const tronWeb = new TronWeb({\n fullHost: rpcUrl,\n headers,\n });\n\n // Handle derivation path and index\n const index = \"index\" in options ? options.index || 0 : 0;\n const derivationPath = derivationPathToString(\n \"derivationPath\" in options && options.derivationPath\n ? options.derivationPath\n : updateDerivationPath(NetworkDerivationPath[Chain.Tron], { index }),\n );\n\n // Create signer based on options using pattern matching\n const signer: TronSigner | undefined = await match(options)\n .with({ phrase: P.string }, async ({ phrase }) => createKeysForPath({ phrase, derivationPath }))\n .with({ signer: P.any }, ({ signer }) => Promise.resolve(signer as TronSigner))\n .otherwise(() => Promise.resolve(undefined));\n\n const getAddress = async () => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n return await signer.getAddress();\n };\n\n const calculateFeeLimit = () => {\n return 100_000_000; // 100 TRX in SUN\n };\n\n /**\n * Get current chain parameters including resource prices\n */\n const getChainParameters = async () => {\n try {\n const parameters = await tronWeb.trx.getChainParameters();\n const paramMap: Record<string, number> = {};\n\n for (const param of parameters) {\n paramMap[param.key] = param.value;\n }\n\n return {\n energyFee: paramMap.getEnergyFee || 420, // SUN per energy unit\n bandwidthFee: paramMap.getTransactionFee || 1000, // SUN per bandwidth unit\n createAccountFee: paramMap.getCreateAccountFee || 100000, // 0.1 TRX in SUN\n };\n } catch {\n // Return default values if unable to fetch\n return {\n energyFee: 420,\n bandwidthFee: 1000,\n createAccountFee: 100000,\n };\n }\n };\n\n /**\n * Check if an address exists on the blockchain\n */\n const accountExists = async (address: string) => {\n try {\n const account = await tronWeb.trx.getAccount(address);\n return account && Object.keys(account).length > 0;\n } catch {\n return false;\n }\n };\n\n /**\n * Get account resources (bandwidth and energy)\n */\n const getAccountResources = async (address: string) => {\n try {\n const resources = await tronWeb.trx.getAccountResources(address);\n\n return {\n bandwidth: {\n free: resources.freeNetLimit - resources.freeNetUsed,\n total: resources.NetLimit || 0,\n used: resources.NetUsed || 0,\n },\n energy: {\n total: resources.EnergyLimit || 0,\n used: resources.EnergyUsed || 0,\n },\n };\n } catch {\n // Return default structure if unable to fetch\n return {\n bandwidth: { free: 600, total: 0, used: 0 }, // 600 free bandwidth daily\n energy: { total: 0, used: 0 },\n };\n }\n };\n\n /**\n * Get token balance and info directly from contract\n */\n const fetchTokenBalance = async (address: string, contractAddress: string) => {\n try {\n const contract = tronWeb.contract(trc20ABI, contractAddress);\n\n if (!contract.methods?.balanceOf) {\n return 0n;\n }\n\n const balance = (await contract.methods.balanceOf(address).call())[0] as string;\n\n return BigInt(balance || 0); // Convert to BigInt for consistency\n } catch (err) {\n console.warn(`balanceOf() failed for ${contractAddress}:`, err);\n return 0n;\n }\n };\n\n /**\n * Get token balance and info directly from contract\n */\n const fetchTokenMetadata = async (contractAddress: string, address: string) => {\n try {\n tronWeb.setAddress(address); // Set address for contract calls\n const contract = tronWeb.contract(trc20ABI, contractAddress);\n\n const [symbolRaw, decimalsRaw] = await Promise.all([\n contract\n .symbol()\n .call()\n .catch(() => \"UNKNOWN\"),\n contract\n .decimals()\n .call()\n .catch(() => \"18\"),\n ]);\n\n return {\n symbol: symbolRaw ?? \"UNKNOWN\",\n decimals: Number(decimalsRaw ?? 18),\n };\n } catch (error) {\n warnOnce(\n true,\n `Failed to get token balance for ${contractAddress}: ${error instanceof Error ? error.message : error}`,\n );\n return null;\n }\n };\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: <explanation>\n const getBalance = async (address: string, _scamFilter = true) => {\n const fallbackBalance = [\n AssetValue.from({\n chain: Chain.Tron,\n }),\n ];\n // Try primary source (TronGrid)\n try {\n const accountData = await fetchAccountFromTronGrid(address);\n if (accountData) {\n const balances: AssetValue[] = [];\n\n // Add TRX balance\n balances.push(\n AssetValue.from({\n chain: Chain.Tron,\n value: accountData.balance,\n fromBaseDecimal: 6,\n }),\n );\n\n // Add TRC20 balances\n\n for (const token of accountData.trc20) {\n const [contractAddress, balance] = Object.entries(token)[0] || [];\n\n if (!(contractAddress && balance)) continue;\n\n const tokenMetaData = await fetchTokenMetadata(contractAddress, address);\n\n if (!tokenMetaData) continue;\n\n balances.push(\n AssetValue.from({\n asset: `TRX.${tokenMetaData.symbol}-${contractAddress}`,\n value: BigInt(balance || 0),\n fromBaseDecimal: tokenMetaData.decimals,\n }),\n );\n }\n\n return balances;\n }\n return fallbackBalance;\n } catch (error) {\n warnOnce(\n true,\n `Tron API getBalance failed: ${error instanceof Error ? error.message : error}`,\n );\n\n // Fallback: get TRX and USDT directly\n const balances: AssetValue[] = [];\n\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n if (trxBalanceInSun && Number(trxBalanceInSun) > 0) {\n balances.push(\n AssetValue.from({\n chain: Chain.Tron,\n value: trxBalanceInSun,\n fromBaseDecimal: 6,\n }),\n );\n }\n\n const usdtBalance = await fetchTokenBalance(address, TRON_USDT_CONTRACT);\n if (usdtBalance) {\n balances.push(\n AssetValue.from({\n asset: `TRX.USDT-${TRON_USDT_CONTRACT}`,\n value: usdtBalance,\n fromBaseDecimal: 6,\n }),\n );\n }\n\n return balances;\n }\n };\n\n const transfer = async ({ recipient, assetValue, memo }: TronTransferParams) => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n\n const from = await getAddress();\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n // Native TRX Transfer (amount in SUN - base units)\n const transaction = await tronWeb.transactionBuilder.sendTrx(\n recipient,\n assetValue.getBaseValue(\"number\"),\n from,\n );\n\n // Add memo if provided\n if (memo) {\n const transactionWithMemo = await tronWeb.transactionBuilder.addUpdateData(\n transaction,\n memo,\n \"utf8\",\n );\n const signedTx = await signer.signTransaction(transactionWithMemo);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n }\n\n const signedTx = await signer.signTransaction(transaction);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n }\n\n // TRC20 Token Transfer\n const contractAddress = assetValue.address;\n if (!contractAddress) {\n throw new SwapKitError(\"toolbox_tron_invalid_token_identifier\", {\n identifier: assetValue.toString(),\n });\n }\n\n const feeLimit = calculateFeeLimit();\n const contract = tronWeb.contract(trc20ABI, contractAddress);\n\n if (!contract.methods?.transfer) {\n throw new SwapKitError(\"toolbox_tron_token_transfer_failed\");\n }\n\n const txid = await contract.transfer(recipient, assetValue.getBaseValue(\"string\")).send({\n from,\n feeLimit,\n callValue: 0,\n });\n\n if (!txid) {\n throw new SwapKitError(\"toolbox_tron_token_transfer_failed\");\n }\n\n return txid;\n };\n\n const estimateTransactionFee = async ({\n assetValue,\n recipient,\n sender,\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: <explanation>\n }: TronTransferParams & { sender?: string }) => {\n const isNative = assetValue.isGasAsset;\n\n try {\n // Get sender address\n const senderAddress = sender ? sender : signer ? await getAddress() : undefined;\n if (!senderAddress) {\n // If no signer, return conservative estimate\n return isNative\n ? AssetValue.from({ chain: Chain.Tron, value: 0.1, fromBaseDecimal: 0 })\n : AssetValue.from({ chain: Chain.Tron, value: 15, fromBaseDecimal: 0 });\n }\n\n // Get chain parameters for current resource prices\n const chainParams = await getChainParameters();\n\n // Check if recipient account exists (new accounts require activation fee)\n const recipientExists = await accountExists(recipient);\n const activationFee = recipientExists ? 0 : chainParams.createAccountFee;\n\n // Get account resources\n const resources = await getAccountResources(senderAddress);\n\n if (isNative) {\n // Calculate bandwidth needed for TRX transfer\n const bandwidthNeeded = TRX_TRANSFER_BANDWIDTH;\n const availableBandwidth =\n resources.bandwidth.free + (resources.bandwidth.total - resources.bandwidth.used);\n\n let bandwidthFee = 0;\n if (bandwidthNeeded > availableBandwidth) {\n // Need to burn TRX for bandwidth\n const bandwidthToBuy = bandwidthNeeded - availableBandwidth;\n bandwidthFee = bandwidthToBuy * chainParams.bandwidthFee;\n }\n\n // Total fee in SUN\n const totalFeeSun = activationFee + bandwidthFee;\n\n return AssetValue.from({\n chain: Chain.Tron,\n value: totalFeeSun,\n fromBaseDecimal: 6, // SUN to TRX\n });\n }\n\n // TRC20 Transfer - needs both bandwidth and energy\n const bandwidthNeeded = TRC20_TRANSFER_BANDWIDTH;\n const energyNeeded = TRC20_TRANSFER_ENERGY;\n\n const availableBandwidth =\n resources.bandwidth.free + (resources.bandwidth.total - resources.bandwidth.used);\n const availableEnergy = resources.energy.total - resources.energy.used;\n\n let bandwidthFee = 0;\n if (bandwidthNeeded > availableBandwidth) {\n const bandwidthToBuy = bandwidthNeeded - availableBandwidth;\n bandwidthFee = bandwidthToBuy * chainParams.bandwidthFee;\n }\n\n let energyFee = 0;\n if (energyNeeded > availableEnergy) {\n const energyToBuy = energyNeeded - availableEnergy;\n energyFee = energyToBuy * chainParams.energyFee;\n }\n\n // Total fee in SUN\n const totalFeeSun = activationFee + bandwidthFee + energyFee;\n\n return AssetValue.from({\n chain: Chain.Tron,\n value: totalFeeSun,\n fromBaseDecimal: 6, // SUN to TRX\n });\n } catch (error) {\n // Fallback to conservative estimates if calculation fails\n warnOnce(\n true,\n `Failed to calculate exact fee, using conservative estimate: ${error instanceof Error ? error.message : error}`,\n );\n\n throw new SwapKitError(\"toolbox_tron_fee_estimation_failed\", { error });\n }\n };\n\n const createTransaction = async (params: TronCreateTransactionParams) => {\n const { recipient, assetValue, memo, sender } = params;\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n const transaction = await tronWeb.transactionBuilder.sendTrx(\n recipient,\n assetValue.getBaseValue(\"number\"),\n sender,\n );\n\n if (memo) {\n return tronWeb.transactionBuilder.addUpdateData(transaction, memo, \"utf8\");\n }\n\n return transaction;\n }\n\n // For TRC20, we would need to build the transaction manually\n // This is a simplified version - in practice, you'd build the contract call transaction\n const contractAddress = assetValue.address;\n if (!contractAddress) {\n throw new SwapKitError(\"toolbox_tron_invalid_token_identifier\", {\n identifier: assetValue.toString(),\n });\n }\n\n // Build TRC20 transfer transaction\n // First, try using triggerSmartContract (might work despite the known bug)\n try {\n const functionSelector = \"transfer(address,uint256)\";\n const parameter = [\n { type: \"address\", value: recipient },\n { type: \"uint256\", value: assetValue.getBaseValue(\"string\") },\n ];\n\n const options = {\n feeLimit: calculateFeeLimit(),\n callValue: 0,\n };\n\n const result = await tronWeb.transactionBuilder.triggerSmartContract(\n contractAddress,\n functionSelector,\n options,\n parameter,\n sender,\n );\n\n return result.transaction;\n } catch (error) {\n // If both methods fail, throw a descriptive error\n throw new SwapKitError(\"toolbox_tron_transaction_creation_failed\", {\n message:\n \"Failed to create TRC20 transaction. This might be due to TronWeb 6.0.3 bug. Use the transfer method directly instead.\",\n originalError: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n const signTransaction = async (transaction: TronTransaction) => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n return await signer.signTransaction(transaction);\n };\n\n const broadcastTransaction = async (signedTx: TronSignedTransaction) => {\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n };\n\n return {\n tronWeb,\n getAddress,\n validateAddress: await getTronAddressValidator(),\n getBalance,\n transfer,\n estimateTransactionFee,\n createTransaction,\n signTransaction,\n broadcastTransaction,\n };\n};\n",
5
+ "import {\n AssetValue,\n Chain,\n NetworkDerivationPath,\n SKConfig,\n SwapKitError,\n derivationPathToString,\n updateDerivationPath,\n warnOnce,\n} from \"@swapkit/helpers\";\nimport { P, match } from \"ts-pattern\";\n\nimport { trc20ABI } from \"./helpers/trc20.abi.js\";\nimport { fetchAccountFromTronGrid } from \"./helpers/trongrid.js\";\nimport type {\n ApproveParams,\n ApprovedParams,\n IsApprovedParams,\n TronCreateTransactionParams,\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types.js\";\n\nimport { TronWeb } from \"tronweb\";\n\n// Constants for TRON resource calculation\nconst TRX_TRANSFER_BANDWIDTH = 268; // Bandwidth consumed by a TRX transfer\nconst TRC20_TRANSFER_ENERGY = 13000; // Average energy consumed by TRC20 transfer\nconst TRC20_TRANSFER_BANDWIDTH = 345; // Bandwidth consumed by TRC20 transfer\n\n// Known TRON tokens\nconst TRON_USDT_CONTRACT = \"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t\";\n\nconst MAX_APPROVAL = \"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\";\n\nexport async function getTronAddressValidator() {\n return (address: string) => {\n return TronWeb.isAddress(address);\n };\n}\n\nexport async function getTronPrivateKeyFromMnemonic({\n phrase,\n derivationPath: customPath,\n index,\n}: {\n phrase: string;\n derivationPath?: string;\n index?: number;\n}) {\n const derivationPathToUse =\n customPath ||\n derivationPathToString(\n updateDerivationPath(NetworkDerivationPath[Chain.Tron], {\n index: index || 0,\n }),\n );\n\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPathToUse);\n\n if (!derived.privateKey) {\n throw new SwapKitError(\"toolbox_tron_no_signer\");\n }\n\n return Buffer.from(derived.privateKey).toString(\"hex\");\n}\n\nasync function createKeysForPath({\n phrase,\n derivationPath,\n tronWeb,\n}: {\n phrase: string;\n derivationPath: string;\n tronWeb: TronWeb;\n}) {\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPath);\n\n if (!derived.privateKey) {\n throw new SwapKitError(\"toolbox_tron_no_signer\");\n }\n\n // Convert private key to hex string for TronWeb\n const privateKeyHex = Buffer.from(derived.privateKey).toString(\"hex\");\n\n tronWeb.setPrivateKey(privateKeyHex);\n\n const address = tronWeb?.address.fromPrivateKey(privateKeyHex);\n\n return {\n getAddress: () => Promise.resolve(typeof address === \"string\" ? address : \"\"),\n signTransaction: async (transaction: TronTransaction) => {\n const signedTx = await tronWeb.trx.sign(transaction, privateKeyHex);\n return signedTx;\n },\n };\n}\n\nexport const createTronToolbox = async (options: TronToolboxOptions = {}) => {\n // Always get configuration from SKConfig\n const rpcUrl = SKConfig.get(\"rpcUrls\")[Chain.Tron];\n // Note: TRON API key support can be added to SKConfig apiKeys when needed\n const headers = undefined; // No API key needed for basic TronGrid access\n\n const tronWeb = new TronWeb({\n fullHost: rpcUrl,\n headers,\n });\n\n // Handle derivation path and index\n const index = \"index\" in options ? options.index || 0 : 0;\n const derivationPath = derivationPathToString(\n \"derivationPath\" in options && options.derivationPath\n ? options.derivationPath\n : updateDerivationPath(NetworkDerivationPath[Chain.Tron], { index }),\n );\n\n // Create signer based on options using pattern matching\n const signer: TronSigner | undefined = await match(options)\n .with({ phrase: P.string }, async ({ phrase }) =>\n createKeysForPath({ phrase, derivationPath, tronWeb }),\n )\n .with({ signer: P.any }, ({ signer }) => Promise.resolve(signer as TronSigner))\n .otherwise(() => Promise.resolve(undefined));\n\n const getAddress = async () => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n return await signer.getAddress();\n };\n\n const calculateFeeLimit = () => {\n return 100_000_000; // 100 TRX in SUN\n };\n\n /**\n * Get current chain parameters including resource prices\n */\n const getChainParameters = async () => {\n try {\n const parameters = await tronWeb.trx.getChainParameters();\n const paramMap: Record<string, number> = {};\n\n for (const param of parameters) {\n paramMap[param.key] = param.value;\n }\n\n return {\n energyFee: paramMap.getEnergyFee || 420, // SUN per energy unit\n bandwidthFee: paramMap.getTransactionFee || 1000, // SUN per bandwidth unit\n createAccountFee: paramMap.getCreateAccountFee || 100000, // 0.1 TRX in SUN\n };\n } catch {\n // Return default values if unable to fetch\n return {\n energyFee: 420,\n bandwidthFee: 1000,\n createAccountFee: 100000,\n };\n }\n };\n\n /**\n * Check if an address exists on the blockchain\n */\n const accountExists = async (address: string) => {\n try {\n const account = await tronWeb.trx.getAccount(address);\n return account && Object.keys(account).length > 0;\n } catch {\n return false;\n }\n };\n\n /**\n * Get account resources (bandwidth and energy)\n */\n const getAccountResources = async (address: string) => {\n try {\n const resources = await tronWeb.trx.getAccountResources(address);\n\n return {\n bandwidth: {\n free: resources.freeNetLimit - resources.freeNetUsed,\n total: resources.NetLimit || 0,\n used: resources.NetUsed || 0,\n },\n energy: {\n total: resources.EnergyLimit || 0,\n used: resources.EnergyUsed || 0,\n },\n };\n } catch {\n // Return default structure if unable to fetch\n return {\n bandwidth: { free: 600, total: 0, used: 0 }, // 600 free bandwidth daily\n energy: { total: 0, used: 0 },\n };\n }\n };\n\n /**\n * Get token balance and info directly from contract\n */\n const fetchTokenBalance = async (address: string, contractAddress: string) => {\n try {\n const contract = tronWeb.contract(trc20ABI, contractAddress);\n\n if (!contract.methods?.balanceOf) {\n return 0n;\n }\n\n const balance = (await contract.methods.balanceOf(address).call())[0] as string;\n\n return BigInt(balance || 0); // Convert to BigInt for consistency\n } catch (err) {\n console.warn(`balanceOf() failed for ${contractAddress}:`, err);\n return 0n;\n }\n };\n\n /**\n * Get token balance and info directly from contract\n */\n const fetchTokenMetadata = async (contractAddress: string, address: string) => {\n try {\n tronWeb.setAddress(address); // Set address for contract calls\n const contract = tronWeb.contract(trc20ABI, contractAddress);\n\n const [symbolRaw, decimalsRaw] = await Promise.all([\n contract\n .symbol()\n .call()\n .catch(() => \"UNKNOWN\"),\n contract\n .decimals()\n .call()\n .catch(() => \"18\"),\n ]);\n\n return {\n symbol: symbolRaw ?? \"UNKNOWN\",\n decimals: Number(decimalsRaw ?? 18),\n };\n } catch (error) {\n warnOnce(\n true,\n `Failed to get token balance for ${contractAddress}: ${error instanceof Error ? error.message : error}`,\n );\n return null;\n }\n };\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: <explanation>\n const getBalance = async (address: string, _scamFilter = true) => {\n const fallbackBalance = [\n AssetValue.from({\n chain: Chain.Tron,\n }),\n ];\n // Try primary source (TronGrid)\n try {\n const accountData = await fetchAccountFromTronGrid(address);\n if (accountData) {\n const balances: AssetValue[] = [];\n\n // Add TRX balance\n balances.push(\n AssetValue.from({\n chain: Chain.Tron,\n value: accountData.balance,\n fromBaseDecimal: 6,\n }),\n );\n\n // Add TRC20 balances\n\n for (const token of accountData.trc20) {\n const [contractAddress, balance] = Object.entries(token)[0] || [];\n\n if (!(contractAddress && balance)) continue;\n\n const tokenMetaData = await fetchTokenMetadata(contractAddress, address);\n\n if (!tokenMetaData) continue;\n\n balances.push(\n AssetValue.from({\n asset: `TRX.${tokenMetaData.symbol}-${contractAddress}`,\n value: BigInt(balance || 0),\n fromBaseDecimal: tokenMetaData.decimals,\n }),\n );\n }\n\n return balances;\n }\n return fallbackBalance;\n } catch (error) {\n warnOnce(\n true,\n `Tron API getBalance failed: ${error instanceof Error ? error.message : error}`,\n );\n\n // Fallback: get TRX and USDT directly\n const balances: AssetValue[] = [];\n\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n if (trxBalanceInSun && Number(trxBalanceInSun) > 0) {\n balances.push(\n AssetValue.from({\n chain: Chain.Tron,\n value: trxBalanceInSun,\n fromBaseDecimal: 6,\n }),\n );\n }\n\n const usdtBalance = await fetchTokenBalance(address, TRON_USDT_CONTRACT);\n if (usdtBalance) {\n balances.push(\n AssetValue.from({\n asset: `TRX.USDT-${TRON_USDT_CONTRACT}`,\n value: usdtBalance,\n fromBaseDecimal: 6,\n }),\n );\n }\n\n return balances;\n }\n };\n\n const transfer = async ({ recipient, assetValue, memo }: TronTransferParams) => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n\n const from = await getAddress();\n tronWeb.setAddress(from);\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n // Native TRX Transfer (amount in SUN - base units)\n const transaction = await tronWeb.transactionBuilder.sendTrx(\n recipient,\n assetValue.getBaseValue(\"number\"),\n from,\n );\n\n // Add memo if provided\n if (memo) {\n const transactionWithMemo = await tronWeb.transactionBuilder.addUpdateData(\n transaction,\n memo,\n \"utf8\",\n );\n const signedTx = await signer.signTransaction(transactionWithMemo);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n }\n\n const signedTx = await signer.signTransaction(transaction);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n }\n\n // TRC20 Token Transfer - always use createTransaction + sign pattern\n const transaction = await createTransaction({\n recipient,\n assetValue,\n memo,\n sender: from,\n });\n\n const signedTx = await signer.signTransaction(transaction);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n\n if (!txid) {\n throw new SwapKitError(\"toolbox_tron_token_transfer_failed\");\n }\n\n return txid;\n };\n\n const estimateTransactionFee = async ({\n assetValue,\n recipient,\n sender,\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: <explanation>\n }: TronTransferParams & { sender?: string }) => {\n const isNative = assetValue.isGasAsset;\n\n try {\n // Get sender address\n const senderAddress = sender ? sender : signer ? await getAddress() : undefined;\n if (!senderAddress) {\n // If no signer, return conservative estimate\n return isNative\n ? AssetValue.from({ chain: Chain.Tron, value: 0.1, fromBaseDecimal: 0 })\n : AssetValue.from({ chain: Chain.Tron, value: 15, fromBaseDecimal: 0 });\n }\n\n // Get chain parameters for current resource prices\n const chainParams = await getChainParameters();\n\n // Check if recipient account exists (new accounts require activation fee)\n const recipientExists = await accountExists(recipient);\n const activationFee = recipientExists ? 0 : chainParams.createAccountFee;\n\n // Get account resources\n const resources = await getAccountResources(senderAddress);\n\n if (isNative) {\n // Calculate bandwidth needed for TRX transfer\n const bandwidthNeeded = TRX_TRANSFER_BANDWIDTH;\n const availableBandwidth =\n resources.bandwidth.free + (resources.bandwidth.total - resources.bandwidth.used);\n\n let bandwidthFee = 0;\n if (bandwidthNeeded > availableBandwidth) {\n // Need to burn TRX for bandwidth\n const bandwidthToBuy = bandwidthNeeded - availableBandwidth;\n bandwidthFee = bandwidthToBuy * chainParams.bandwidthFee;\n }\n\n // Total fee in SUN\n const totalFeeSun = activationFee + bandwidthFee;\n\n return AssetValue.from({\n chain: Chain.Tron,\n value: totalFeeSun,\n fromBaseDecimal: 6, // SUN to TRX\n });\n }\n\n // TRC20 Transfer - needs both bandwidth and energy\n const bandwidthNeeded = TRC20_TRANSFER_BANDWIDTH;\n const energyNeeded = TRC20_TRANSFER_ENERGY;\n\n const availableBandwidth =\n resources.bandwidth.free + (resources.bandwidth.total - resources.bandwidth.used);\n const availableEnergy = resources.energy.total - resources.energy.used;\n\n let bandwidthFee = 0;\n if (bandwidthNeeded > availableBandwidth) {\n const bandwidthToBuy = bandwidthNeeded - availableBandwidth;\n bandwidthFee = bandwidthToBuy * chainParams.bandwidthFee;\n }\n\n let energyFee = 0;\n if (energyNeeded > availableEnergy) {\n const energyToBuy = energyNeeded - availableEnergy;\n energyFee = energyToBuy * chainParams.energyFee;\n }\n\n // Total fee in SUN\n const totalFeeSun = activationFee + bandwidthFee + energyFee;\n\n return AssetValue.from({\n chain: Chain.Tron,\n value: totalFeeSun,\n fromBaseDecimal: 6, // SUN to TRX\n });\n } catch (error) {\n // Fallback to conservative estimates if calculation fails\n warnOnce(\n true,\n `Failed to calculate exact fee, using conservative estimate: ${error instanceof Error ? error.message : error}`,\n );\n\n throw new SwapKitError(\"toolbox_tron_fee_estimation_failed\", { error });\n }\n };\n\n const createTransaction = async (params: TronCreateTransactionParams) => {\n const { recipient, assetValue, memo, sender } = params;\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n const transaction = await tronWeb.transactionBuilder.sendTrx(\n recipient,\n assetValue.getBaseValue(\"number\"),\n sender,\n );\n\n if (memo) {\n return tronWeb.transactionBuilder.addUpdateData(transaction, memo, \"utf8\");\n }\n\n return transaction;\n }\n\n tronWeb.setAddress(sender); // Set address for contract calls\n // For TRC20, we would need to build the transaction manually\n // This is a simplified version - in practice, you'd build the contract call transaction\n const contractAddress = assetValue.address;\n if (!contractAddress) {\n throw new SwapKitError(\"toolbox_tron_invalid_token_identifier\", {\n identifier: assetValue.toString(),\n });\n }\n\n // Build TRC20 transfer transaction\n // First, try using triggerSmartContract (might work despite the known bug)\n try {\n const functionSelector = \"transfer(address,uint256)\";\n const parameter = [\n { type: \"address\", value: recipient },\n { type: \"uint256\", value: assetValue.getBaseValue(\"string\") },\n ];\n\n const options = {\n feeLimit: calculateFeeLimit(),\n callValue: 0,\n };\n\n const result = await tronWeb.transactionBuilder.triggerSmartContract(\n contractAddress,\n functionSelector,\n options,\n parameter,\n sender,\n );\n\n return result.transaction;\n } catch (error) {\n // If both methods fail, throw a descriptive error\n throw new SwapKitError(\"toolbox_tron_transaction_creation_failed\", {\n message:\n \"Failed to create TRC20 transaction. This might be due to TronWeb 6.0.3 bug. Use the transfer method directly instead.\",\n originalError: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n const signTransaction = async (transaction: TronTransaction) => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n return await signer.signTransaction(transaction);\n };\n\n const broadcastTransaction = async (signedTx: TronSignedTransaction) => {\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n };\n\n /**\n * Check the current allowance for a spender on a token\n */\n const getApprovedAmount = async ({ assetAddress, spenderAddress, from }: ApprovedParams) => {\n try {\n const contract = tronWeb.contract(trc20ABI, assetAddress);\n\n if (!contract.methods?.allowance) {\n throw new SwapKitError(\"toolbox_tron_invalid_token_contract\");\n }\n\n const allowance = (\n await contract.methods.allowance(from, spenderAddress).call()\n )[0] as string;\n return BigInt(allowance || 0);\n } catch (error) {\n throw new SwapKitError(\"toolbox_tron_allowance_check_failed\", { error });\n }\n };\n\n /**\n * Check if a spender is approved for a specific amount\n */\n const isApproved = async ({ assetAddress, spenderAddress, from, amount }: IsApprovedParams) => {\n const allowance = await getApprovedAmount({ assetAddress, spenderAddress, from });\n\n if (!amount) {\n // If no amount specified, check if there's any approval\n return allowance > 0n;\n }\n\n const amountBigInt = BigInt(amount);\n return allowance >= amountBigInt;\n };\n\n /**\n * Approve a spender to transfer tokens\n */\n const approve = async ({ assetAddress, spenderAddress, amount, from }: ApproveParams) => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n\n const fromAddress = from || (await getAddress());\n const approvalAmount = amount !== undefined ? BigInt(amount).toString() : MAX_APPROVAL;\n\n // Build approve transaction using triggerSmartContract\n const functionSelector = \"approve(address,uint256)\";\n const parameter = [\n { type: \"address\", value: spenderAddress },\n { type: \"uint256\", value: approvalAmount },\n ];\n\n const feeLimit = calculateFeeLimit();\n const options = {\n feeLimit,\n callValue: 0,\n };\n\n try {\n const { transaction } = await tronWeb.transactionBuilder.triggerSmartContract(\n assetAddress,\n functionSelector,\n options,\n parameter,\n fromAddress,\n );\n\n const signedTx = await signer.signTransaction(transaction);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n\n if (!txid) {\n throw new SwapKitError(\"toolbox_tron_approve_failed\");\n }\n\n return txid;\n } catch (error) {\n throw new SwapKitError(\"toolbox_tron_approve_failed\", { error });\n }\n };\n\n return {\n tronWeb,\n getAddress,\n validateAddress: await getTronAddressValidator(),\n getBalance,\n transfer,\n estimateTransactionFee,\n createTransaction,\n signTransaction,\n broadcastTransaction,\n approve,\n isApproved,\n getApprovedAmount,\n };\n};\n",
6
6
  "export const trc20ABI = [\n {\n constant: true,\n inputs: [{ name: \"_owner\", type: \"address\" }],\n name: \"balanceOf\",\n outputs: [{ name: \"balance\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n { name: \"_to\", type: \"address\" },\n { name: \"_value\", type: \"uint256\" },\n ],\n name: \"transfer\",\n outputs: [{ name: \"success\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"decimals\",\n outputs: [{ name: \"\", type: \"uint8\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"symbol\",\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"name\",\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [\n { name: \"_owner\", type: \"address\" },\n { name: \"_spender\", type: \"address\" },\n ],\n name: \"allowance\",\n outputs: [{ name: \"remaining\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n { name: \"_spender\", type: \"address\" },\n { name: \"_value\", type: \"uint256\" },\n ],\n name: \"approve\",\n outputs: [{ name: \"success\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"totalSupply\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n { name: \"_from\", type: \"address\" },\n { name: \"_to\", type: \"address\" },\n { name: \"_value\", type: \"uint256\" },\n ],\n name: \"transferFrom\",\n outputs: [{ name: \"success\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, name: \"_from\", type: \"address\" },\n { indexed: true, name: \"_to\", type: \"address\" },\n { indexed: false, name: \"_value\", type: \"uint256\" },\n ],\n name: \"Transfer\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, name: \"_owner\", type: \"address\" },\n { indexed: true, name: \"_spender\", type: \"address\" },\n { indexed: false, name: \"_value\", type: \"uint256\" },\n ],\n name: \"Approval\",\n type: \"event\",\n },\n] as const;\n",
7
7
  "import { SwapKitError } from \"@swapkit/helpers\";\nimport { TronWeb } from \"tronweb\";\nimport type { TronGridAccountResponse } from \"../types.js\";\n\nconst TRONGRID_API_BASE = \"https://api.trongrid.io\";\n\n/**\n * Fetch account information including TRC20 balances from TronGrid API\n */\nexport async function fetchAccountFromTronGrid(address: string) {\n try {\n const response = await fetch(`${TRONGRID_API_BASE}/v1/accounts/${address}`);\n\n if (!response.ok) {\n throw new Error(`TronGrid API error: ${response.status} ${response.statusText}`);\n }\n\n const data = (await response.json()) as TronGridAccountResponse;\n\n if (!(data.success && data.data) || data.data.length === 0) {\n throw new Error(\"Invalid response from TronGrid API\");\n }\n\n // Convert search address to hex format for comparison\n let searchAddressHex: string;\n try {\n // If address is base58, convert to hex\n searchAddressHex = TronWeb.address.toHex(address).toLowerCase();\n } catch {\n // If conversion fails, assume it's already hex\n searchAddressHex = address.toLowerCase();\n }\n\n // Find the account that matches the requested address\n const account = data.data.find((acc) => {\n return acc.address.toLowerCase() === searchAddressHex;\n });\n\n if (!account) {\n return;\n }\n\n // Return simplified object with balance and trc20 array\n return {\n balance: account.balance,\n trc20: account.trc20 || [],\n };\n } catch (error) {\n throw new SwapKitError(\"toolbox_tron_trongrid_api_error\", {\n message: error instanceof Error ? error.message : \"Unknown error\",\n address,\n });\n }\n}\n"
8
8
  ],
9
- "mappings": "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",
10
- "debugId": "28D7AE2F942CE2FD64756E2164756E21",
9
+ "mappings": "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",
10
+ "debugId": "AD0F996DB7898AB064756E2164756E21",
11
11
  "names": []
12
12
  }
@@ -1,4 +1,4 @@
1
- import{d as P,e as R}from"../../chunk-s47y8512.js";import{AssetValue as L,Chain as X,NetworkDerivationPath as b,SKConfig as A,SwapKitError as Y,derivationPathToString as h,updateDerivationPath as n,warnOnce as K}from"@swapkit/helpers";import{P as S,match as _y}from"ts-pattern";var k=[{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[{name:"success",type:"bool"}],stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint8"}],stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],stateMutability:"view",type:"function"},{constant:!0,inputs:[{name:"_owner",type:"address"},{name:"_spender",type:"address"}],name:"allowance",outputs:[{name:"remaining",type:"uint256"}],stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_value",type:"uint256"}],name:"approve",outputs:[{name:"success",type:"bool"}],stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"totalSupply",outputs:[{name:"",type:"uint256"}],stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_from",type:"address"},{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transferFrom",outputs:[{name:"success",type:"bool"}],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,name:"_from",type:"address"},{indexed:!0,name:"_to",type:"address"},{indexed:!1,name:"_value",type:"uint256"}],name:"Transfer",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"_owner",type:"address"},{indexed:!0,name:"_spender",type:"address"},{indexed:!1,name:"_value",type:"uint256"}],name:"Approval",type:"event"}];import{SwapKitError as uy}from"@swapkit/helpers";import{TronWeb as my}from"tronweb";var py="https://api.trongrid.io";async function W(M){try{let Q=await fetch(`${py}/v1/accounts/${M}`);if(!Q.ok)throw new Error(`TronGrid API error: ${Q.status} ${Q.statusText}`);let j=await Q.json();if(!(j.success&&j.data)||j.data.length===0)throw new Error("Invalid response from TronGrid API");let m;try{m=my.address.toHex(M).toLowerCase()}catch{m=M.toLowerCase()}let G=j.data.find((I)=>{return I.address.toLowerCase()===m});if(!G)return;return{balance:G.balance,trc20:G.trc20||[]}}catch(Q){throw new uy("toolbox_tron_trongrid_api_error",{message:Q instanceof Error?Q.message:"Unknown error",address:M})}}import{TronWeb as N}from"tronweb";var My=268,qy=13000,zy=345,l="TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";async function o(){return(M)=>{return N.isAddress(M)}}async function Jy({phrase:M,derivationPath:Q,index:j}){let m=Q||h(n(b[X.Tron],{index:j||0})),{HDKey:G}=await import("@scure/bip32"),{mnemonicToSeedSync:I}=await import("@scure/bip39"),Z=I(M),x=G.fromMasterSeed(Z).derive(m);if(!x.privateKey)throw new Y("toolbox_tron_no_signer");return Buffer.from(x.privateKey).toString("hex")}async function Qy({phrase:M,derivationPath:Q}){let{HDKey:j}=await import("@scure/bip32"),{mnemonicToSeedSync:m}=await import("@scure/bip39"),G=m(M),Z=j.fromMasterSeed(G).derive(Q);if(!Z.privateKey)throw new Y("toolbox_tron_no_signer");let U=Buffer.from(Z.privateKey).toString("hex"),x=new N({fullHost:A.get("rpcUrls")[X.Tron],privateKey:U}),v=x.address.fromPrivateKey(U);return{getAddress:()=>Promise.resolve(typeof v==="string"?v:""),signTransaction:async(E)=>{return await x.trx.sign(E,U)}}}var Zy=async(M={})=>{let Q=A.get("rpcUrls")[X.Tron],j=void 0,m=new N({fullHost:Q,headers:void 0}),G="index"in M?M.index||0:0,I=h("derivationPath"in M&&M.derivationPath?M.derivationPath:n(b[X.Tron],{index:G})),Z=await _y(M).with({phrase:S.string},async({phrase:f})=>Qy({phrase:f,derivationPath:I})).with({signer:S.any},({signer:f})=>Promise.resolve(f)).otherwise(()=>Promise.resolve(void 0)),U=async()=>{if(!Z)throw new Y("toolbox_tron_no_signer");return await Z.getAddress()},x=()=>{return 1e8},v=async()=>{try{let f=await m.trx.getChainParameters(),y={};for(let u of f)y[u.key]=u.value;return{energyFee:y.getEnergyFee||420,bandwidthFee:y.getTransactionFee||1000,createAccountFee:y.getCreateAccountFee||1e5}}catch{return{energyFee:420,bandwidthFee:1000,createAccountFee:1e5}}},E=async(f)=>{try{let y=await m.trx.getAccount(f);return y&&Object.keys(y).length>0}catch{return!1}},g=async(f)=>{try{let y=await m.trx.getAccountResources(f);return{bandwidth:{free:y.freeNetLimit-y.freeNetUsed,total:y.NetLimit||0,used:y.NetUsed||0},energy:{total:y.EnergyLimit||0,used:y.EnergyUsed||0}}}catch{return{bandwidth:{free:600,total:0,used:0},energy:{total:0,used:0}}}},t=async(f,y)=>{try{let u=m.contract(k,y);if(!u.methods?.balanceOf)return 0n;let _=(await u.methods.balanceOf(f).call())[0];return BigInt(_||0)}catch(u){return console.warn(`balanceOf() failed for ${y}:`,u),0n}},i=async(f,y)=>{try{m.setAddress(y);let u=m.contract(k,f),[_,p]=await Promise.all([u.symbol().call().catch(()=>"UNKNOWN"),u.decimals().call().catch(()=>"18")]);return{symbol:_??"UNKNOWN",decimals:Number(p??18)}}catch(u){return K(!0,`Failed to get token balance for ${f}: ${u instanceof Error?u.message:u}`),null}},c=async(f,y=!0)=>{let u=[L.from({chain:X.Tron})];try{let _=await W(f);if(_){let p=[];p.push(L.from({chain:X.Tron,value:_.balance,fromBaseDecimal:6}));for(let J of _.trc20){let[$,z]=Object.entries(J)[0]||[];if(!($&&z))continue;let q=await i($,f);if(!q)continue;p.push(L.from({asset:`TRX.${q.symbol}-${$}`,value:BigInt(z||0),fromBaseDecimal:q.decimals}))}return p}return u}catch(_){K(!0,`Tron API getBalance failed: ${_ instanceof Error?_.message:_}`);let p=[],J=await m.trx.getBalance(f);if(J&&Number(J)>0)p.push(L.from({chain:X.Tron,value:J,fromBaseDecimal:6}));let $=await t(f,l);if($)p.push(L.from({asset:`TRX.USDT-${l}`,value:$,fromBaseDecimal:6}));return p}},d=async({recipient:f,assetValue:y,memo:u})=>{if(!Z)throw new Y("toolbox_tron_no_signer");let _=await U();if(y.isGasAsset){let O=await m.transactionBuilder.sendTrx(f,y.getBaseValue("number"),_);if(u){let F=await m.transactionBuilder.addUpdateData(O,u,"utf8"),T=await Z.signTransaction(F),{txid:C}=await m.trx.sendRawTransaction(T);return C}let H=await Z.signTransaction(O),{txid:B}=await m.trx.sendRawTransaction(H);return B}let J=y.address;if(!J)throw new Y("toolbox_tron_invalid_token_identifier",{identifier:y.toString()});let $=x(),z=m.contract(k,J);if(!z.methods?.transfer)throw new Y("toolbox_tron_token_transfer_failed");let q=await z.transfer(f,y.getBaseValue("string")).send({from:_,feeLimit:$,callValue:0});if(!q)throw new Y("toolbox_tron_token_transfer_failed");return q},s=async({assetValue:f,recipient:y,sender:u})=>{let _=f.isGasAsset;try{let p=u?u:Z?await U():void 0;if(!p)return _?L.from({chain:X.Tron,value:0.1,fromBaseDecimal:0}):L.from({chain:X.Tron,value:15,fromBaseDecimal:0});let J=await v(),z=await E(y)?0:J.createAccountFee,q=await g(p);if(_){let D=My,w=q.bandwidth.free+(q.bandwidth.total-q.bandwidth.used),V=0;if(D>w)V=(D-w)*J.bandwidthFee;let fy=z+V;return L.from({chain:X.Tron,value:fy,fromBaseDecimal:6})}let O=zy,H=qy,B=q.bandwidth.free+(q.bandwidth.total-q.bandwidth.used),F=q.energy.total-q.energy.used,T=0;if(O>B)T=(O-B)*J.bandwidthFee;let C=0;if(H>F)C=(H-F)*J.energyFee;let yy=z+T+C;return L.from({chain:X.Tron,value:yy,fromBaseDecimal:6})}catch(p){throw K(!0,`Failed to calculate exact fee, using conservative estimate: ${p instanceof Error?p.message:p}`),new Y("toolbox_tron_fee_estimation_failed",{error:p})}},a=async(f)=>{let{recipient:y,assetValue:u,memo:_,sender:p}=f;if(u.isGasAsset){let z=await m.transactionBuilder.sendTrx(y,u.getBaseValue("number"),p);if(_)return m.transactionBuilder.addUpdateData(z,_,"utf8");return z}let $=u.address;if(!$)throw new Y("toolbox_tron_invalid_token_identifier",{identifier:u.toString()});try{let q=[{type:"address",value:y},{type:"uint256",value:u.getBaseValue("string")}],O={feeLimit:x(),callValue:0};return(await m.transactionBuilder.triggerSmartContract($,"transfer(address,uint256)",O,q,p)).transaction}catch(z){throw new Y("toolbox_tron_transaction_creation_failed",{message:"Failed to create TRC20 transaction. This might be due to TronWeb 6.0.3 bug. Use the transfer method directly instead.",originalError:z instanceof Error?z.message:String(z)})}},e=async(f)=>{if(!Z)throw new Y("toolbox_tron_no_signer");return await Z.signTransaction(f)},r=async(f)=>{let{txid:y}=await m.trx.sendRawTransaction(f);return y};return{tronWeb:m,getAddress:U,validateAddress:await o(),getBalance:c,transfer:d,estimateTransactionFee:s,createTransaction:a,signTransaction:e,broadcastTransaction:r}};export{k as trc20ABI,Jy as getTronPrivateKeyFromMnemonic,o as getTronAddressValidator,Zy as createTronToolbox};
1
+ import{d as T,e as R}from"../../chunk-s47y8512.js";import{AssetValue as x,Chain as L,NetworkDerivationPath as h,SKConfig as Qy,SwapKitError as X,derivationPathToString as A,updateDerivationPath as i,warnOnce as N}from"@swapkit/helpers";import{P as g,match as Zy}from"ts-pattern";var v=[{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[{name:"success",type:"bool"}],stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint8"}],stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],stateMutability:"view",type:"function"},{constant:!0,inputs:[{name:"_owner",type:"address"},{name:"_spender",type:"address"}],name:"allowance",outputs:[{name:"remaining",type:"uint256"}],stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_value",type:"uint256"}],name:"approve",outputs:[{name:"success",type:"bool"}],stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"totalSupply",outputs:[{name:"",type:"uint256"}],stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_from",type:"address"},{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transferFrom",outputs:[{name:"success",type:"bool"}],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,name:"_from",type:"address"},{indexed:!0,name:"_to",type:"address"},{indexed:!1,name:"_value",type:"uint256"}],name:"Transfer",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"_owner",type:"address"},{indexed:!0,name:"_spender",type:"address"},{indexed:!1,name:"_value",type:"uint256"}],name:"Approval",type:"event"}];import{SwapKitError as zy}from"@swapkit/helpers";import{TronWeb as Jy}from"tronweb";var My="https://api.trongrid.io";async function W(Z){try{let u=await fetch(`${My}/v1/accounts/${Z}`);if(!u.ok)throw new Error(`TronGrid API error: ${u.status} ${u.statusText}`);let G=await u.json();if(!(G.success&&G.data)||G.data.length===0)throw new Error("Invalid response from TronGrid API");let q;try{q=Jy.address.toHex(Z).toLowerCase()}catch{q=Z.toLowerCase()}let U=G.data.find((F)=>{return F.address.toLowerCase()===q});if(!U)return;return{balance:U.balance,trc20:U.trc20||[]}}catch(u){throw new zy("toolbox_tron_trongrid_api_error",{message:u instanceof Error?u.message:"Unknown error",address:Z})}}import{TronWeb as n}from"tronweb";var $y=268,Yy=13000,jy=345,b="TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",Xy="0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";async function c(){return(Z)=>{return n.isAddress(Z)}}async function uy({phrase:Z,derivationPath:u,index:G}){let q=u||A(i(h[L.Tron],{index:G||0})),{HDKey:U}=await import("@scure/bip32"),{mnemonicToSeedSync:F}=await import("@scure/bip39"),Y=F(Z),O=U.fromMasterSeed(Y).derive(q);if(!O.privateKey)throw new X("toolbox_tron_no_signer");return Buffer.from(O.privateKey).toString("hex")}async function Gy({phrase:Z,derivationPath:u,tronWeb:G}){let{HDKey:q}=await import("@scure/bip32"),{mnemonicToSeedSync:U}=await import("@scure/bip39"),F=U(Z),H=q.fromMasterSeed(F).derive(u);if(!H.privateKey)throw new X("toolbox_tron_no_signer");let O=Buffer.from(H.privateKey).toString("hex");G.setPrivateKey(O);let B=G?.address.fromPrivateKey(O);return{getAddress:()=>Promise.resolve(typeof B==="string"?B:""),signTransaction:async(K)=>{return await G.trx.sign(K,O)}}}var Ly=async(Z={})=>{let u=Qy.get("rpcUrls")[L.Tron],G=void 0,q=new n({fullHost:u,headers:void 0}),U="index"in Z?Z.index||0:0,F=A("derivationPath"in Z&&Z.derivationPath?Z.derivationPath:i(h[L.Tron],{index:U})),Y=await Zy(Z).with({phrase:g.string},async({phrase:f})=>Gy({phrase:f,derivationPath:F,tronWeb:q})).with({signer:g.any},({signer:f})=>Promise.resolve(f)).otherwise(()=>Promise.resolve(void 0)),H=async()=>{if(!Y)throw new X("toolbox_tron_no_signer");return await Y.getAddress()},O=()=>{return 1e8},B=async()=>{try{let f=await q.trx.getChainParameters(),y={};for(let _ of f)y[_.key]=_.value;return{energyFee:y.getEnergyFee||420,bandwidthFee:y.getTransactionFee||1000,createAccountFee:y.getCreateAccountFee||1e5}}catch{return{energyFee:420,bandwidthFee:1000,createAccountFee:1e5}}},K=async(f)=>{try{let y=await q.trx.getAccount(f);return y&&Object.keys(y).length>0}catch{return!1}},P=async(f)=>{try{let y=await q.trx.getAccountResources(f);return{bandwidth:{free:y.freeNetLimit-y.freeNetUsed,total:y.NetLimit||0,used:y.NetUsed||0},energy:{total:y.EnergyLimit||0,used:y.EnergyUsed||0}}}catch{return{bandwidth:{free:600,total:0,used:0},energy:{total:0,used:0}}}},t=async(f,y)=>{try{let _=q.contract(v,y);if(!_.methods?.balanceOf)return 0n;let z=(await _.methods.balanceOf(f).call())[0];return BigInt(z||0)}catch(_){return console.warn(`balanceOf() failed for ${y}:`,_),0n}},o=async(f,y)=>{try{q.setAddress(y);let _=q.contract(v,f),[z,J]=await Promise.all([_.symbol().call().catch(()=>"UNKNOWN"),_.decimals().call().catch(()=>"18")]);return{symbol:z??"UNKNOWN",decimals:Number(J??18)}}catch(_){return N(!0,`Failed to get token balance for ${f}: ${_ instanceof Error?_.message:_}`),null}},d=async(f,y=!0)=>{let _=[x.from({chain:L.Tron})];try{let z=await W(f);if(z){let J=[];J.push(x.from({chain:L.Tron,value:z.balance,fromBaseDecimal:6}));for(let $ of z.trc20){let[j,M]=Object.entries($)[0]||[];if(!(j&&M))continue;let Q=await o(j,f);if(!Q)continue;J.push(x.from({asset:`TRX.${Q.symbol}-${j}`,value:BigInt(M||0),fromBaseDecimal:Q.decimals}))}return J}return _}catch(z){N(!0,`Tron API getBalance failed: ${z instanceof Error?z.message:z}`);let J=[],$=await q.trx.getBalance(f);if($&&Number($)>0)J.push(x.from({chain:L.Tron,value:$,fromBaseDecimal:6}));let j=await t(f,b);if(j)J.push(x.from({asset:`TRX.USDT-${b}`,value:j,fromBaseDecimal:6}));return J}},s=async({recipient:f,assetValue:y,memo:_})=>{if(!Y)throw new X("toolbox_tron_no_signer");let z=await H();if(q.setAddress(z),y.isGasAsset){let Q=await q.transactionBuilder.sendTrx(f,y.getBaseValue("number"),z);if(_){let p=await q.transactionBuilder.addUpdateData(Q,_,"utf8"),m=await Y.signTransaction(p),{txid:C}=await q.trx.sendRawTransaction(m);return C}let k=await Y.signTransaction(Q),{txid:I}=await q.trx.sendRawTransaction(k);return I}let $=await V({recipient:f,assetValue:y,memo:_,sender:z}),j=await Y.signTransaction($),{txid:M}=await q.trx.sendRawTransaction(j);if(!M)throw new X("toolbox_tron_token_transfer_failed");return M},a=async({assetValue:f,recipient:y,sender:_})=>{let z=f.isGasAsset;try{let J=_?_:Y?await H():void 0;if(!J)return z?x.from({chain:L.Tron,value:0.1,fromBaseDecimal:0}):x.from({chain:L.Tron,value:15,fromBaseDecimal:0});let $=await B(),M=await K(y)?0:$.createAccountFee,Q=await P(J);if(z){let D=$y,S=Q.bandwidth.free+(Q.bandwidth.total-Q.bandwidth.used),l=0;if(D>S)l=(D-S)*$.bandwidthFee;let qy=M+l;return x.from({chain:L.Tron,value:qy,fromBaseDecimal:6})}let k=jy,I=Yy,p=Q.bandwidth.free+(Q.bandwidth.total-Q.bandwidth.used),m=Q.energy.total-Q.energy.used,C=0;if(k>p)C=(k-p)*$.bandwidthFee;let w=0;if(I>m)w=(I-m)*$.energyFee;let _y=M+C+w;return x.from({chain:L.Tron,value:_y,fromBaseDecimal:6})}catch(J){throw N(!0,`Failed to calculate exact fee, using conservative estimate: ${J instanceof Error?J.message:J}`),new X("toolbox_tron_fee_estimation_failed",{error:J})}},V=async(f)=>{let{recipient:y,assetValue:_,memo:z,sender:J}=f;if(_.isGasAsset){let M=await q.transactionBuilder.sendTrx(y,_.getBaseValue("number"),J);if(z)return q.transactionBuilder.addUpdateData(M,z,"utf8");return M}q.setAddress(J);let j=_.address;if(!j)throw new X("toolbox_tron_invalid_token_identifier",{identifier:_.toString()});try{let Q=[{type:"address",value:y},{type:"uint256",value:_.getBaseValue("string")}],k={feeLimit:O(),callValue:0};return(await q.transactionBuilder.triggerSmartContract(j,"transfer(address,uint256)",k,Q,J)).transaction}catch(M){throw new X("toolbox_tron_transaction_creation_failed",{message:"Failed to create TRC20 transaction. This might be due to TronWeb 6.0.3 bug. Use the transfer method directly instead.",originalError:M instanceof Error?M.message:String(M)})}},e=async(f)=>{if(!Y)throw new X("toolbox_tron_no_signer");return await Y.signTransaction(f)},r=async(f)=>{let{txid:y}=await q.trx.sendRawTransaction(f);return y},E=async({assetAddress:f,spenderAddress:y,from:_})=>{try{let z=q.contract(v,f);if(!z.methods?.allowance)throw new X("toolbox_tron_invalid_token_contract");let J=(await z.methods.allowance(_,y).call())[0];return BigInt(J||0)}catch(z){throw new X("toolbox_tron_allowance_check_failed",{error:z})}},yy=async({assetAddress:f,spenderAddress:y,from:_,amount:z})=>{let J=await E({assetAddress:f,spenderAddress:y,from:_});if(!z)return J>0n;let $=BigInt(z);return J>=$},fy=async({assetAddress:f,spenderAddress:y,amount:_,from:z})=>{if(!Y)throw new X("toolbox_tron_no_signer");let J=z||await H(),$=_!==void 0?BigInt(_).toString():Xy,j="approve(address,uint256)",M=[{type:"address",value:y},{type:"uint256",value:$}],k={feeLimit:O(),callValue:0};try{let{transaction:I}=await q.transactionBuilder.triggerSmartContract(f,j,k,M,J),p=await Y.signTransaction(I),{txid:m}=await q.trx.sendRawTransaction(p);if(!m)throw new X("toolbox_tron_approve_failed");return m}catch(I){throw new X("toolbox_tron_approve_failed",{error:I})}};return{tronWeb:q,getAddress:H,validateAddress:await c(),getBalance:d,transfer:s,estimateTransactionFee:a,createTransaction:V,signTransaction:e,broadcastTransaction:r,approve:fy,isApproved:yy,getApprovedAmount:E}};export{v as trc20ABI,uy as getTronPrivateKeyFromMnemonic,c as getTronAddressValidator,Ly as createTronToolbox};
2
2
 
3
- //# debugId=F9EB43F8689FACBD64756E2164756E21
3
+ //# debugId=9CFEBE723EEB976864756E2164756E21
4
4
  //# sourceMappingURL=index.js.map
@@ -2,11 +2,11 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/tron/toolbox.ts", "../src/tron/helpers/trc20.abi.ts", "../src/tron/helpers/trongrid.ts"],
4
4
  "sourcesContent": [
5
- "import {\n AssetValue,\n Chain,\n NetworkDerivationPath,\n SKConfig,\n SwapKitError,\n derivationPathToString,\n updateDerivationPath,\n warnOnce,\n} from \"@swapkit/helpers\";\nimport { P, match } from \"ts-pattern\";\n\nimport { trc20ABI } from \"./helpers/trc20.abi.js\";\nimport { fetchAccountFromTronGrid } from \"./helpers/trongrid.js\";\nimport type {\n TronCreateTransactionParams,\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types.js\";\n\nimport { TronWeb } from \"tronweb\";\n\n// Constants for TRON resource calculation\nconst TRX_TRANSFER_BANDWIDTH = 268; // Bandwidth consumed by a TRX transfer\nconst TRC20_TRANSFER_ENERGY = 13000; // Average energy consumed by TRC20 transfer\nconst TRC20_TRANSFER_BANDWIDTH = 345; // Bandwidth consumed by TRC20 transfer\n\n// Known TRON tokens\nconst TRON_USDT_CONTRACT = \"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t\";\n\nexport async function getTronAddressValidator() {\n return (address: string) => {\n return TronWeb.isAddress(address);\n };\n}\n\nexport async function getTronPrivateKeyFromMnemonic({\n phrase,\n derivationPath: customPath,\n index,\n}: {\n phrase: string;\n derivationPath?: string;\n index?: number;\n}) {\n const derivationPathToUse =\n customPath ||\n derivationPathToString(\n updateDerivationPath(NetworkDerivationPath[Chain.Tron], {\n index: index || 0,\n }),\n );\n\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPathToUse);\n\n if (!derived.privateKey) {\n throw new SwapKitError(\"toolbox_tron_no_signer\");\n }\n\n return Buffer.from(derived.privateKey).toString(\"hex\");\n}\n\nasync function createKeysForPath({\n phrase,\n derivationPath,\n}: {\n phrase: string;\n derivationPath: string;\n}) {\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPath);\n\n if (!derived.privateKey) {\n throw new SwapKitError(\"toolbox_tron_no_signer\");\n }\n\n // Convert private key to hex string for TronWeb\n const privateKeyHex = Buffer.from(derived.privateKey).toString(\"hex\");\n\n // Create TronWeb instance with the derived private key\n const tronWebWithKey = new TronWeb({\n fullHost: SKConfig.get(\"rpcUrls\")[Chain.Tron],\n privateKey: privateKeyHex,\n });\n\n const address = tronWebWithKey.address.fromPrivateKey(privateKeyHex);\n\n return {\n getAddress: () => Promise.resolve(typeof address === \"string\" ? address : \"\"),\n signTransaction: async (transaction: TronTransaction) => {\n const signedTx = await tronWebWithKey.trx.sign(transaction, privateKeyHex);\n return signedTx;\n },\n };\n}\n\nexport const createTronToolbox = async (options: TronToolboxOptions = {}) => {\n // Always get configuration from SKConfig\n const rpcUrl = SKConfig.get(\"rpcUrls\")[Chain.Tron];\n // Note: TRON API key support can be added to SKConfig apiKeys when needed\n const headers = undefined; // No API key needed for basic TronGrid access\n\n const tronWeb = new TronWeb({\n fullHost: rpcUrl,\n headers,\n });\n\n // Handle derivation path and index\n const index = \"index\" in options ? options.index || 0 : 0;\n const derivationPath = derivationPathToString(\n \"derivationPath\" in options && options.derivationPath\n ? options.derivationPath\n : updateDerivationPath(NetworkDerivationPath[Chain.Tron], { index }),\n );\n\n // Create signer based on options using pattern matching\n const signer: TronSigner | undefined = await match(options)\n .with({ phrase: P.string }, async ({ phrase }) => createKeysForPath({ phrase, derivationPath }))\n .with({ signer: P.any }, ({ signer }) => Promise.resolve(signer as TronSigner))\n .otherwise(() => Promise.resolve(undefined));\n\n const getAddress = async () => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n return await signer.getAddress();\n };\n\n const calculateFeeLimit = () => {\n return 100_000_000; // 100 TRX in SUN\n };\n\n /**\n * Get current chain parameters including resource prices\n */\n const getChainParameters = async () => {\n try {\n const parameters = await tronWeb.trx.getChainParameters();\n const paramMap: Record<string, number> = {};\n\n for (const param of parameters) {\n paramMap[param.key] = param.value;\n }\n\n return {\n energyFee: paramMap.getEnergyFee || 420, // SUN per energy unit\n bandwidthFee: paramMap.getTransactionFee || 1000, // SUN per bandwidth unit\n createAccountFee: paramMap.getCreateAccountFee || 100000, // 0.1 TRX in SUN\n };\n } catch {\n // Return default values if unable to fetch\n return {\n energyFee: 420,\n bandwidthFee: 1000,\n createAccountFee: 100000,\n };\n }\n };\n\n /**\n * Check if an address exists on the blockchain\n */\n const accountExists = async (address: string) => {\n try {\n const account = await tronWeb.trx.getAccount(address);\n return account && Object.keys(account).length > 0;\n } catch {\n return false;\n }\n };\n\n /**\n * Get account resources (bandwidth and energy)\n */\n const getAccountResources = async (address: string) => {\n try {\n const resources = await tronWeb.trx.getAccountResources(address);\n\n return {\n bandwidth: {\n free: resources.freeNetLimit - resources.freeNetUsed,\n total: resources.NetLimit || 0,\n used: resources.NetUsed || 0,\n },\n energy: {\n total: resources.EnergyLimit || 0,\n used: resources.EnergyUsed || 0,\n },\n };\n } catch {\n // Return default structure if unable to fetch\n return {\n bandwidth: { free: 600, total: 0, used: 0 }, // 600 free bandwidth daily\n energy: { total: 0, used: 0 },\n };\n }\n };\n\n /**\n * Get token balance and info directly from contract\n */\n const fetchTokenBalance = async (address: string, contractAddress: string) => {\n try {\n const contract = tronWeb.contract(trc20ABI, contractAddress);\n\n if (!contract.methods?.balanceOf) {\n return 0n;\n }\n\n const balance = (await contract.methods.balanceOf(address).call())[0] as string;\n\n return BigInt(balance || 0); // Convert to BigInt for consistency\n } catch (err) {\n console.warn(`balanceOf() failed for ${contractAddress}:`, err);\n return 0n;\n }\n };\n\n /**\n * Get token balance and info directly from contract\n */\n const fetchTokenMetadata = async (contractAddress: string, address: string) => {\n try {\n tronWeb.setAddress(address); // Set address for contract calls\n const contract = tronWeb.contract(trc20ABI, contractAddress);\n\n const [symbolRaw, decimalsRaw] = await Promise.all([\n contract\n .symbol()\n .call()\n .catch(() => \"UNKNOWN\"),\n contract\n .decimals()\n .call()\n .catch(() => \"18\"),\n ]);\n\n return {\n symbol: symbolRaw ?? \"UNKNOWN\",\n decimals: Number(decimalsRaw ?? 18),\n };\n } catch (error) {\n warnOnce(\n true,\n `Failed to get token balance for ${contractAddress}: ${error instanceof Error ? error.message : error}`,\n );\n return null;\n }\n };\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: <explanation>\n const getBalance = async (address: string, _scamFilter = true) => {\n const fallbackBalance = [\n AssetValue.from({\n chain: Chain.Tron,\n }),\n ];\n // Try primary source (TronGrid)\n try {\n const accountData = await fetchAccountFromTronGrid(address);\n if (accountData) {\n const balances: AssetValue[] = [];\n\n // Add TRX balance\n balances.push(\n AssetValue.from({\n chain: Chain.Tron,\n value: accountData.balance,\n fromBaseDecimal: 6,\n }),\n );\n\n // Add TRC20 balances\n\n for (const token of accountData.trc20) {\n const [contractAddress, balance] = Object.entries(token)[0] || [];\n\n if (!(contractAddress && balance)) continue;\n\n const tokenMetaData = await fetchTokenMetadata(contractAddress, address);\n\n if (!tokenMetaData) continue;\n\n balances.push(\n AssetValue.from({\n asset: `TRX.${tokenMetaData.symbol}-${contractAddress}`,\n value: BigInt(balance || 0),\n fromBaseDecimal: tokenMetaData.decimals,\n }),\n );\n }\n\n return balances;\n }\n return fallbackBalance;\n } catch (error) {\n warnOnce(\n true,\n `Tron API getBalance failed: ${error instanceof Error ? error.message : error}`,\n );\n\n // Fallback: get TRX and USDT directly\n const balances: AssetValue[] = [];\n\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n if (trxBalanceInSun && Number(trxBalanceInSun) > 0) {\n balances.push(\n AssetValue.from({\n chain: Chain.Tron,\n value: trxBalanceInSun,\n fromBaseDecimal: 6,\n }),\n );\n }\n\n const usdtBalance = await fetchTokenBalance(address, TRON_USDT_CONTRACT);\n if (usdtBalance) {\n balances.push(\n AssetValue.from({\n asset: `TRX.USDT-${TRON_USDT_CONTRACT}`,\n value: usdtBalance,\n fromBaseDecimal: 6,\n }),\n );\n }\n\n return balances;\n }\n };\n\n const transfer = async ({ recipient, assetValue, memo }: TronTransferParams) => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n\n const from = await getAddress();\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n // Native TRX Transfer (amount in SUN - base units)\n const transaction = await tronWeb.transactionBuilder.sendTrx(\n recipient,\n assetValue.getBaseValue(\"number\"),\n from,\n );\n\n // Add memo if provided\n if (memo) {\n const transactionWithMemo = await tronWeb.transactionBuilder.addUpdateData(\n transaction,\n memo,\n \"utf8\",\n );\n const signedTx = await signer.signTransaction(transactionWithMemo);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n }\n\n const signedTx = await signer.signTransaction(transaction);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n }\n\n // TRC20 Token Transfer\n const contractAddress = assetValue.address;\n if (!contractAddress) {\n throw new SwapKitError(\"toolbox_tron_invalid_token_identifier\", {\n identifier: assetValue.toString(),\n });\n }\n\n const feeLimit = calculateFeeLimit();\n const contract = tronWeb.contract(trc20ABI, contractAddress);\n\n if (!contract.methods?.transfer) {\n throw new SwapKitError(\"toolbox_tron_token_transfer_failed\");\n }\n\n const txid = await contract.transfer(recipient, assetValue.getBaseValue(\"string\")).send({\n from,\n feeLimit,\n callValue: 0,\n });\n\n if (!txid) {\n throw new SwapKitError(\"toolbox_tron_token_transfer_failed\");\n }\n\n return txid;\n };\n\n const estimateTransactionFee = async ({\n assetValue,\n recipient,\n sender,\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: <explanation>\n }: TronTransferParams & { sender?: string }) => {\n const isNative = assetValue.isGasAsset;\n\n try {\n // Get sender address\n const senderAddress = sender ? sender : signer ? await getAddress() : undefined;\n if (!senderAddress) {\n // If no signer, return conservative estimate\n return isNative\n ? AssetValue.from({ chain: Chain.Tron, value: 0.1, fromBaseDecimal: 0 })\n : AssetValue.from({ chain: Chain.Tron, value: 15, fromBaseDecimal: 0 });\n }\n\n // Get chain parameters for current resource prices\n const chainParams = await getChainParameters();\n\n // Check if recipient account exists (new accounts require activation fee)\n const recipientExists = await accountExists(recipient);\n const activationFee = recipientExists ? 0 : chainParams.createAccountFee;\n\n // Get account resources\n const resources = await getAccountResources(senderAddress);\n\n if (isNative) {\n // Calculate bandwidth needed for TRX transfer\n const bandwidthNeeded = TRX_TRANSFER_BANDWIDTH;\n const availableBandwidth =\n resources.bandwidth.free + (resources.bandwidth.total - resources.bandwidth.used);\n\n let bandwidthFee = 0;\n if (bandwidthNeeded > availableBandwidth) {\n // Need to burn TRX for bandwidth\n const bandwidthToBuy = bandwidthNeeded - availableBandwidth;\n bandwidthFee = bandwidthToBuy * chainParams.bandwidthFee;\n }\n\n // Total fee in SUN\n const totalFeeSun = activationFee + bandwidthFee;\n\n return AssetValue.from({\n chain: Chain.Tron,\n value: totalFeeSun,\n fromBaseDecimal: 6, // SUN to TRX\n });\n }\n\n // TRC20 Transfer - needs both bandwidth and energy\n const bandwidthNeeded = TRC20_TRANSFER_BANDWIDTH;\n const energyNeeded = TRC20_TRANSFER_ENERGY;\n\n const availableBandwidth =\n resources.bandwidth.free + (resources.bandwidth.total - resources.bandwidth.used);\n const availableEnergy = resources.energy.total - resources.energy.used;\n\n let bandwidthFee = 0;\n if (bandwidthNeeded > availableBandwidth) {\n const bandwidthToBuy = bandwidthNeeded - availableBandwidth;\n bandwidthFee = bandwidthToBuy * chainParams.bandwidthFee;\n }\n\n let energyFee = 0;\n if (energyNeeded > availableEnergy) {\n const energyToBuy = energyNeeded - availableEnergy;\n energyFee = energyToBuy * chainParams.energyFee;\n }\n\n // Total fee in SUN\n const totalFeeSun = activationFee + bandwidthFee + energyFee;\n\n return AssetValue.from({\n chain: Chain.Tron,\n value: totalFeeSun,\n fromBaseDecimal: 6, // SUN to TRX\n });\n } catch (error) {\n // Fallback to conservative estimates if calculation fails\n warnOnce(\n true,\n `Failed to calculate exact fee, using conservative estimate: ${error instanceof Error ? error.message : error}`,\n );\n\n throw new SwapKitError(\"toolbox_tron_fee_estimation_failed\", { error });\n }\n };\n\n const createTransaction = async (params: TronCreateTransactionParams) => {\n const { recipient, assetValue, memo, sender } = params;\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n const transaction = await tronWeb.transactionBuilder.sendTrx(\n recipient,\n assetValue.getBaseValue(\"number\"),\n sender,\n );\n\n if (memo) {\n return tronWeb.transactionBuilder.addUpdateData(transaction, memo, \"utf8\");\n }\n\n return transaction;\n }\n\n // For TRC20, we would need to build the transaction manually\n // This is a simplified version - in practice, you'd build the contract call transaction\n const contractAddress = assetValue.address;\n if (!contractAddress) {\n throw new SwapKitError(\"toolbox_tron_invalid_token_identifier\", {\n identifier: assetValue.toString(),\n });\n }\n\n // Build TRC20 transfer transaction\n // First, try using triggerSmartContract (might work despite the known bug)\n try {\n const functionSelector = \"transfer(address,uint256)\";\n const parameter = [\n { type: \"address\", value: recipient },\n { type: \"uint256\", value: assetValue.getBaseValue(\"string\") },\n ];\n\n const options = {\n feeLimit: calculateFeeLimit(),\n callValue: 0,\n };\n\n const result = await tronWeb.transactionBuilder.triggerSmartContract(\n contractAddress,\n functionSelector,\n options,\n parameter,\n sender,\n );\n\n return result.transaction;\n } catch (error) {\n // If both methods fail, throw a descriptive error\n throw new SwapKitError(\"toolbox_tron_transaction_creation_failed\", {\n message:\n \"Failed to create TRC20 transaction. This might be due to TronWeb 6.0.3 bug. Use the transfer method directly instead.\",\n originalError: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n const signTransaction = async (transaction: TronTransaction) => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n return await signer.signTransaction(transaction);\n };\n\n const broadcastTransaction = async (signedTx: TronSignedTransaction) => {\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n };\n\n return {\n tronWeb,\n getAddress,\n validateAddress: await getTronAddressValidator(),\n getBalance,\n transfer,\n estimateTransactionFee,\n createTransaction,\n signTransaction,\n broadcastTransaction,\n };\n};\n",
5
+ "import {\n AssetValue,\n Chain,\n NetworkDerivationPath,\n SKConfig,\n SwapKitError,\n derivationPathToString,\n updateDerivationPath,\n warnOnce,\n} from \"@swapkit/helpers\";\nimport { P, match } from \"ts-pattern\";\n\nimport { trc20ABI } from \"./helpers/trc20.abi.js\";\nimport { fetchAccountFromTronGrid } from \"./helpers/trongrid.js\";\nimport type {\n ApproveParams,\n ApprovedParams,\n IsApprovedParams,\n TronCreateTransactionParams,\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types.js\";\n\nimport { TronWeb } from \"tronweb\";\n\n// Constants for TRON resource calculation\nconst TRX_TRANSFER_BANDWIDTH = 268; // Bandwidth consumed by a TRX transfer\nconst TRC20_TRANSFER_ENERGY = 13000; // Average energy consumed by TRC20 transfer\nconst TRC20_TRANSFER_BANDWIDTH = 345; // Bandwidth consumed by TRC20 transfer\n\n// Known TRON tokens\nconst TRON_USDT_CONTRACT = \"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t\";\n\nconst MAX_APPROVAL = \"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\";\n\nexport async function getTronAddressValidator() {\n return (address: string) => {\n return TronWeb.isAddress(address);\n };\n}\n\nexport async function getTronPrivateKeyFromMnemonic({\n phrase,\n derivationPath: customPath,\n index,\n}: {\n phrase: string;\n derivationPath?: string;\n index?: number;\n}) {\n const derivationPathToUse =\n customPath ||\n derivationPathToString(\n updateDerivationPath(NetworkDerivationPath[Chain.Tron], {\n index: index || 0,\n }),\n );\n\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPathToUse);\n\n if (!derived.privateKey) {\n throw new SwapKitError(\"toolbox_tron_no_signer\");\n }\n\n return Buffer.from(derived.privateKey).toString(\"hex\");\n}\n\nasync function createKeysForPath({\n phrase,\n derivationPath,\n tronWeb,\n}: {\n phrase: string;\n derivationPath: string;\n tronWeb: TronWeb;\n}) {\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPath);\n\n if (!derived.privateKey) {\n throw new SwapKitError(\"toolbox_tron_no_signer\");\n }\n\n // Convert private key to hex string for TronWeb\n const privateKeyHex = Buffer.from(derived.privateKey).toString(\"hex\");\n\n tronWeb.setPrivateKey(privateKeyHex);\n\n const address = tronWeb?.address.fromPrivateKey(privateKeyHex);\n\n return {\n getAddress: () => Promise.resolve(typeof address === \"string\" ? address : \"\"),\n signTransaction: async (transaction: TronTransaction) => {\n const signedTx = await tronWeb.trx.sign(transaction, privateKeyHex);\n return signedTx;\n },\n };\n}\n\nexport const createTronToolbox = async (options: TronToolboxOptions = {}) => {\n // Always get configuration from SKConfig\n const rpcUrl = SKConfig.get(\"rpcUrls\")[Chain.Tron];\n // Note: TRON API key support can be added to SKConfig apiKeys when needed\n const headers = undefined; // No API key needed for basic TronGrid access\n\n const tronWeb = new TronWeb({\n fullHost: rpcUrl,\n headers,\n });\n\n // Handle derivation path and index\n const index = \"index\" in options ? options.index || 0 : 0;\n const derivationPath = derivationPathToString(\n \"derivationPath\" in options && options.derivationPath\n ? options.derivationPath\n : updateDerivationPath(NetworkDerivationPath[Chain.Tron], { index }),\n );\n\n // Create signer based on options using pattern matching\n const signer: TronSigner | undefined = await match(options)\n .with({ phrase: P.string }, async ({ phrase }) =>\n createKeysForPath({ phrase, derivationPath, tronWeb }),\n )\n .with({ signer: P.any }, ({ signer }) => Promise.resolve(signer as TronSigner))\n .otherwise(() => Promise.resolve(undefined));\n\n const getAddress = async () => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n return await signer.getAddress();\n };\n\n const calculateFeeLimit = () => {\n return 100_000_000; // 100 TRX in SUN\n };\n\n /**\n * Get current chain parameters including resource prices\n */\n const getChainParameters = async () => {\n try {\n const parameters = await tronWeb.trx.getChainParameters();\n const paramMap: Record<string, number> = {};\n\n for (const param of parameters) {\n paramMap[param.key] = param.value;\n }\n\n return {\n energyFee: paramMap.getEnergyFee || 420, // SUN per energy unit\n bandwidthFee: paramMap.getTransactionFee || 1000, // SUN per bandwidth unit\n createAccountFee: paramMap.getCreateAccountFee || 100000, // 0.1 TRX in SUN\n };\n } catch {\n // Return default values if unable to fetch\n return {\n energyFee: 420,\n bandwidthFee: 1000,\n createAccountFee: 100000,\n };\n }\n };\n\n /**\n * Check if an address exists on the blockchain\n */\n const accountExists = async (address: string) => {\n try {\n const account = await tronWeb.trx.getAccount(address);\n return account && Object.keys(account).length > 0;\n } catch {\n return false;\n }\n };\n\n /**\n * Get account resources (bandwidth and energy)\n */\n const getAccountResources = async (address: string) => {\n try {\n const resources = await tronWeb.trx.getAccountResources(address);\n\n return {\n bandwidth: {\n free: resources.freeNetLimit - resources.freeNetUsed,\n total: resources.NetLimit || 0,\n used: resources.NetUsed || 0,\n },\n energy: {\n total: resources.EnergyLimit || 0,\n used: resources.EnergyUsed || 0,\n },\n };\n } catch {\n // Return default structure if unable to fetch\n return {\n bandwidth: { free: 600, total: 0, used: 0 }, // 600 free bandwidth daily\n energy: { total: 0, used: 0 },\n };\n }\n };\n\n /**\n * Get token balance and info directly from contract\n */\n const fetchTokenBalance = async (address: string, contractAddress: string) => {\n try {\n const contract = tronWeb.contract(trc20ABI, contractAddress);\n\n if (!contract.methods?.balanceOf) {\n return 0n;\n }\n\n const balance = (await contract.methods.balanceOf(address).call())[0] as string;\n\n return BigInt(balance || 0); // Convert to BigInt for consistency\n } catch (err) {\n console.warn(`balanceOf() failed for ${contractAddress}:`, err);\n return 0n;\n }\n };\n\n /**\n * Get token balance and info directly from contract\n */\n const fetchTokenMetadata = async (contractAddress: string, address: string) => {\n try {\n tronWeb.setAddress(address); // Set address for contract calls\n const contract = tronWeb.contract(trc20ABI, contractAddress);\n\n const [symbolRaw, decimalsRaw] = await Promise.all([\n contract\n .symbol()\n .call()\n .catch(() => \"UNKNOWN\"),\n contract\n .decimals()\n .call()\n .catch(() => \"18\"),\n ]);\n\n return {\n symbol: symbolRaw ?? \"UNKNOWN\",\n decimals: Number(decimalsRaw ?? 18),\n };\n } catch (error) {\n warnOnce(\n true,\n `Failed to get token balance for ${contractAddress}: ${error instanceof Error ? error.message : error}`,\n );\n return null;\n }\n };\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: <explanation>\n const getBalance = async (address: string, _scamFilter = true) => {\n const fallbackBalance = [\n AssetValue.from({\n chain: Chain.Tron,\n }),\n ];\n // Try primary source (TronGrid)\n try {\n const accountData = await fetchAccountFromTronGrid(address);\n if (accountData) {\n const balances: AssetValue[] = [];\n\n // Add TRX balance\n balances.push(\n AssetValue.from({\n chain: Chain.Tron,\n value: accountData.balance,\n fromBaseDecimal: 6,\n }),\n );\n\n // Add TRC20 balances\n\n for (const token of accountData.trc20) {\n const [contractAddress, balance] = Object.entries(token)[0] || [];\n\n if (!(contractAddress && balance)) continue;\n\n const tokenMetaData = await fetchTokenMetadata(contractAddress, address);\n\n if (!tokenMetaData) continue;\n\n balances.push(\n AssetValue.from({\n asset: `TRX.${tokenMetaData.symbol}-${contractAddress}`,\n value: BigInt(balance || 0),\n fromBaseDecimal: tokenMetaData.decimals,\n }),\n );\n }\n\n return balances;\n }\n return fallbackBalance;\n } catch (error) {\n warnOnce(\n true,\n `Tron API getBalance failed: ${error instanceof Error ? error.message : error}`,\n );\n\n // Fallback: get TRX and USDT directly\n const balances: AssetValue[] = [];\n\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n if (trxBalanceInSun && Number(trxBalanceInSun) > 0) {\n balances.push(\n AssetValue.from({\n chain: Chain.Tron,\n value: trxBalanceInSun,\n fromBaseDecimal: 6,\n }),\n );\n }\n\n const usdtBalance = await fetchTokenBalance(address, TRON_USDT_CONTRACT);\n if (usdtBalance) {\n balances.push(\n AssetValue.from({\n asset: `TRX.USDT-${TRON_USDT_CONTRACT}`,\n value: usdtBalance,\n fromBaseDecimal: 6,\n }),\n );\n }\n\n return balances;\n }\n };\n\n const transfer = async ({ recipient, assetValue, memo }: TronTransferParams) => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n\n const from = await getAddress();\n tronWeb.setAddress(from);\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n // Native TRX Transfer (amount in SUN - base units)\n const transaction = await tronWeb.transactionBuilder.sendTrx(\n recipient,\n assetValue.getBaseValue(\"number\"),\n from,\n );\n\n // Add memo if provided\n if (memo) {\n const transactionWithMemo = await tronWeb.transactionBuilder.addUpdateData(\n transaction,\n memo,\n \"utf8\",\n );\n const signedTx = await signer.signTransaction(transactionWithMemo);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n }\n\n const signedTx = await signer.signTransaction(transaction);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n }\n\n // TRC20 Token Transfer - always use createTransaction + sign pattern\n const transaction = await createTransaction({\n recipient,\n assetValue,\n memo,\n sender: from,\n });\n\n const signedTx = await signer.signTransaction(transaction);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n\n if (!txid) {\n throw new SwapKitError(\"toolbox_tron_token_transfer_failed\");\n }\n\n return txid;\n };\n\n const estimateTransactionFee = async ({\n assetValue,\n recipient,\n sender,\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: <explanation>\n }: TronTransferParams & { sender?: string }) => {\n const isNative = assetValue.isGasAsset;\n\n try {\n // Get sender address\n const senderAddress = sender ? sender : signer ? await getAddress() : undefined;\n if (!senderAddress) {\n // If no signer, return conservative estimate\n return isNative\n ? AssetValue.from({ chain: Chain.Tron, value: 0.1, fromBaseDecimal: 0 })\n : AssetValue.from({ chain: Chain.Tron, value: 15, fromBaseDecimal: 0 });\n }\n\n // Get chain parameters for current resource prices\n const chainParams = await getChainParameters();\n\n // Check if recipient account exists (new accounts require activation fee)\n const recipientExists = await accountExists(recipient);\n const activationFee = recipientExists ? 0 : chainParams.createAccountFee;\n\n // Get account resources\n const resources = await getAccountResources(senderAddress);\n\n if (isNative) {\n // Calculate bandwidth needed for TRX transfer\n const bandwidthNeeded = TRX_TRANSFER_BANDWIDTH;\n const availableBandwidth =\n resources.bandwidth.free + (resources.bandwidth.total - resources.bandwidth.used);\n\n let bandwidthFee = 0;\n if (bandwidthNeeded > availableBandwidth) {\n // Need to burn TRX for bandwidth\n const bandwidthToBuy = bandwidthNeeded - availableBandwidth;\n bandwidthFee = bandwidthToBuy * chainParams.bandwidthFee;\n }\n\n // Total fee in SUN\n const totalFeeSun = activationFee + bandwidthFee;\n\n return AssetValue.from({\n chain: Chain.Tron,\n value: totalFeeSun,\n fromBaseDecimal: 6, // SUN to TRX\n });\n }\n\n // TRC20 Transfer - needs both bandwidth and energy\n const bandwidthNeeded = TRC20_TRANSFER_BANDWIDTH;\n const energyNeeded = TRC20_TRANSFER_ENERGY;\n\n const availableBandwidth =\n resources.bandwidth.free + (resources.bandwidth.total - resources.bandwidth.used);\n const availableEnergy = resources.energy.total - resources.energy.used;\n\n let bandwidthFee = 0;\n if (bandwidthNeeded > availableBandwidth) {\n const bandwidthToBuy = bandwidthNeeded - availableBandwidth;\n bandwidthFee = bandwidthToBuy * chainParams.bandwidthFee;\n }\n\n let energyFee = 0;\n if (energyNeeded > availableEnergy) {\n const energyToBuy = energyNeeded - availableEnergy;\n energyFee = energyToBuy * chainParams.energyFee;\n }\n\n // Total fee in SUN\n const totalFeeSun = activationFee + bandwidthFee + energyFee;\n\n return AssetValue.from({\n chain: Chain.Tron,\n value: totalFeeSun,\n fromBaseDecimal: 6, // SUN to TRX\n });\n } catch (error) {\n // Fallback to conservative estimates if calculation fails\n warnOnce(\n true,\n `Failed to calculate exact fee, using conservative estimate: ${error instanceof Error ? error.message : error}`,\n );\n\n throw new SwapKitError(\"toolbox_tron_fee_estimation_failed\", { error });\n }\n };\n\n const createTransaction = async (params: TronCreateTransactionParams) => {\n const { recipient, assetValue, memo, sender } = params;\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n const transaction = await tronWeb.transactionBuilder.sendTrx(\n recipient,\n assetValue.getBaseValue(\"number\"),\n sender,\n );\n\n if (memo) {\n return tronWeb.transactionBuilder.addUpdateData(transaction, memo, \"utf8\");\n }\n\n return transaction;\n }\n\n tronWeb.setAddress(sender); // Set address for contract calls\n // For TRC20, we would need to build the transaction manually\n // This is a simplified version - in practice, you'd build the contract call transaction\n const contractAddress = assetValue.address;\n if (!contractAddress) {\n throw new SwapKitError(\"toolbox_tron_invalid_token_identifier\", {\n identifier: assetValue.toString(),\n });\n }\n\n // Build TRC20 transfer transaction\n // First, try using triggerSmartContract (might work despite the known bug)\n try {\n const functionSelector = \"transfer(address,uint256)\";\n const parameter = [\n { type: \"address\", value: recipient },\n { type: \"uint256\", value: assetValue.getBaseValue(\"string\") },\n ];\n\n const options = {\n feeLimit: calculateFeeLimit(),\n callValue: 0,\n };\n\n const result = await tronWeb.transactionBuilder.triggerSmartContract(\n contractAddress,\n functionSelector,\n options,\n parameter,\n sender,\n );\n\n return result.transaction;\n } catch (error) {\n // If both methods fail, throw a descriptive error\n throw new SwapKitError(\"toolbox_tron_transaction_creation_failed\", {\n message:\n \"Failed to create TRC20 transaction. This might be due to TronWeb 6.0.3 bug. Use the transfer method directly instead.\",\n originalError: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n const signTransaction = async (transaction: TronTransaction) => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n return await signer.signTransaction(transaction);\n };\n\n const broadcastTransaction = async (signedTx: TronSignedTransaction) => {\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n };\n\n /**\n * Check the current allowance for a spender on a token\n */\n const getApprovedAmount = async ({ assetAddress, spenderAddress, from }: ApprovedParams) => {\n try {\n const contract = tronWeb.contract(trc20ABI, assetAddress);\n\n if (!contract.methods?.allowance) {\n throw new SwapKitError(\"toolbox_tron_invalid_token_contract\");\n }\n\n const allowance = (\n await contract.methods.allowance(from, spenderAddress).call()\n )[0] as string;\n return BigInt(allowance || 0);\n } catch (error) {\n throw new SwapKitError(\"toolbox_tron_allowance_check_failed\", { error });\n }\n };\n\n /**\n * Check if a spender is approved for a specific amount\n */\n const isApproved = async ({ assetAddress, spenderAddress, from, amount }: IsApprovedParams) => {\n const allowance = await getApprovedAmount({ assetAddress, spenderAddress, from });\n\n if (!amount) {\n // If no amount specified, check if there's any approval\n return allowance > 0n;\n }\n\n const amountBigInt = BigInt(amount);\n return allowance >= amountBigInt;\n };\n\n /**\n * Approve a spender to transfer tokens\n */\n const approve = async ({ assetAddress, spenderAddress, amount, from }: ApproveParams) => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n\n const fromAddress = from || (await getAddress());\n const approvalAmount = amount !== undefined ? BigInt(amount).toString() : MAX_APPROVAL;\n\n // Build approve transaction using triggerSmartContract\n const functionSelector = \"approve(address,uint256)\";\n const parameter = [\n { type: \"address\", value: spenderAddress },\n { type: \"uint256\", value: approvalAmount },\n ];\n\n const feeLimit = calculateFeeLimit();\n const options = {\n feeLimit,\n callValue: 0,\n };\n\n try {\n const { transaction } = await tronWeb.transactionBuilder.triggerSmartContract(\n assetAddress,\n functionSelector,\n options,\n parameter,\n fromAddress,\n );\n\n const signedTx = await signer.signTransaction(transaction);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n\n if (!txid) {\n throw new SwapKitError(\"toolbox_tron_approve_failed\");\n }\n\n return txid;\n } catch (error) {\n throw new SwapKitError(\"toolbox_tron_approve_failed\", { error });\n }\n };\n\n return {\n tronWeb,\n getAddress,\n validateAddress: await getTronAddressValidator(),\n getBalance,\n transfer,\n estimateTransactionFee,\n createTransaction,\n signTransaction,\n broadcastTransaction,\n approve,\n isApproved,\n getApprovedAmount,\n };\n};\n",
6
6
  "export const trc20ABI = [\n {\n constant: true,\n inputs: [{ name: \"_owner\", type: \"address\" }],\n name: \"balanceOf\",\n outputs: [{ name: \"balance\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n { name: \"_to\", type: \"address\" },\n { name: \"_value\", type: \"uint256\" },\n ],\n name: \"transfer\",\n outputs: [{ name: \"success\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"decimals\",\n outputs: [{ name: \"\", type: \"uint8\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"symbol\",\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"name\",\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [\n { name: \"_owner\", type: \"address\" },\n { name: \"_spender\", type: \"address\" },\n ],\n name: \"allowance\",\n outputs: [{ name: \"remaining\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n { name: \"_spender\", type: \"address\" },\n { name: \"_value\", type: \"uint256\" },\n ],\n name: \"approve\",\n outputs: [{ name: \"success\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"totalSupply\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n { name: \"_from\", type: \"address\" },\n { name: \"_to\", type: \"address\" },\n { name: \"_value\", type: \"uint256\" },\n ],\n name: \"transferFrom\",\n outputs: [{ name: \"success\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, name: \"_from\", type: \"address\" },\n { indexed: true, name: \"_to\", type: \"address\" },\n { indexed: false, name: \"_value\", type: \"uint256\" },\n ],\n name: \"Transfer\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, name: \"_owner\", type: \"address\" },\n { indexed: true, name: \"_spender\", type: \"address\" },\n { indexed: false, name: \"_value\", type: \"uint256\" },\n ],\n name: \"Approval\",\n type: \"event\",\n },\n] as const;\n",
7
7
  "import { SwapKitError } from \"@swapkit/helpers\";\nimport { TronWeb } from \"tronweb\";\nimport type { TronGridAccountResponse } from \"../types.js\";\n\nconst TRONGRID_API_BASE = \"https://api.trongrid.io\";\n\n/**\n * Fetch account information including TRC20 balances from TronGrid API\n */\nexport async function fetchAccountFromTronGrid(address: string) {\n try {\n const response = await fetch(`${TRONGRID_API_BASE}/v1/accounts/${address}`);\n\n if (!response.ok) {\n throw new Error(`TronGrid API error: ${response.status} ${response.statusText}`);\n }\n\n const data = (await response.json()) as TronGridAccountResponse;\n\n if (!(data.success && data.data) || data.data.length === 0) {\n throw new Error(\"Invalid response from TronGrid API\");\n }\n\n // Convert search address to hex format for comparison\n let searchAddressHex: string;\n try {\n // If address is base58, convert to hex\n searchAddressHex = TronWeb.address.toHex(address).toLowerCase();\n } catch {\n // If conversion fails, assume it's already hex\n searchAddressHex = address.toLowerCase();\n }\n\n // Find the account that matches the requested address\n const account = data.data.find((acc) => {\n return acc.address.toLowerCase() === searchAddressHex;\n });\n\n if (!account) {\n return;\n }\n\n // Return simplified object with balance and trc20 array\n return {\n balance: account.balance,\n trc20: account.trc20 || [],\n };\n } catch (error) {\n throw new SwapKitError(\"toolbox_tron_trongrid_api_error\", {\n message: error instanceof Error ? error.message : \"Unknown error\",\n address,\n });\n }\n}\n"
8
8
  ],
9
- "mappings": "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",
10
- "debugId": "F9EB43F8689FACBD64756E2164756E21",
9
+ "mappings": "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",
10
+ "debugId": "9CFEBE723EEB976864756E2164756E21",
11
11
  "names": []
12
12
  }
package/package.json CHANGED
@@ -18,7 +18,7 @@
18
18
  "@solana/spl-memo": "^0.2.5",
19
19
  "@solana/spl-token": "^0.4.13",
20
20
  "@solana/web3.js": "^1.98.0",
21
- "@swapkit/helpers": "4.0.0-beta.28",
21
+ "@swapkit/helpers": "4.0.0-beta.29",
22
22
  "base64-js": "^1.5.1",
23
23
  "bitcoinjs-lib": "^6.1.0",
24
24
  "bs58check": "^4.0.0",
@@ -59,7 +59,7 @@
59
59
  "@solana/spl-memo": "0.2.5",
60
60
  "@solana/spl-token": "0.4.13",
61
61
  "@solana/web3.js": "1.98.2",
62
- "@swapkit/helpers": "4.0.0-beta.28",
62
+ "@swapkit/helpers": "4.0.0-beta.29",
63
63
  "@types/bn.js": "5.2.0",
64
64
  "@types/crypto-js": "4.2.2",
65
65
  "@types/elliptic": "6.4.18",
@@ -154,5 +154,5 @@
154
154
  "type-check:go": "tsgo"
155
155
  },
156
156
  "type": "module",
157
- "version": "4.0.0-beta.40"
157
+ "version": "4.0.0-beta.41"
158
158
  }
@@ -13,6 +13,9 @@ import { P, match } from "ts-pattern";
13
13
  import { trc20ABI } from "./helpers/trc20.abi.js";
14
14
  import { fetchAccountFromTronGrid } from "./helpers/trongrid.js";
15
15
  import type {
16
+ ApproveParams,
17
+ ApprovedParams,
18
+ IsApprovedParams,
16
19
  TronCreateTransactionParams,
17
20
  TronSignedTransaction,
18
21
  TronSigner,
@@ -31,6 +34,8 @@ const TRC20_TRANSFER_BANDWIDTH = 345; // Bandwidth consumed by TRC20 transfer
31
34
  // Known TRON tokens
32
35
  const TRON_USDT_CONTRACT = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";
33
36
 
37
+ const MAX_APPROVAL = "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
38
+
34
39
  export async function getTronAddressValidator() {
35
40
  return (address: string) => {
36
41
  return TronWeb.isAddress(address);
@@ -71,9 +76,11 @@ export async function getTronPrivateKeyFromMnemonic({
71
76
  async function createKeysForPath({
72
77
  phrase,
73
78
  derivationPath,
79
+ tronWeb,
74
80
  }: {
75
81
  phrase: string;
76
82
  derivationPath: string;
83
+ tronWeb: TronWeb;
77
84
  }) {
78
85
  const { HDKey } = await import("@scure/bip32");
79
86
  const { mnemonicToSeedSync } = await import("@scure/bip39");
@@ -89,18 +96,14 @@ async function createKeysForPath({
89
96
  // Convert private key to hex string for TronWeb
90
97
  const privateKeyHex = Buffer.from(derived.privateKey).toString("hex");
91
98
 
92
- // Create TronWeb instance with the derived private key
93
- const tronWebWithKey = new TronWeb({
94
- fullHost: SKConfig.get("rpcUrls")[Chain.Tron],
95
- privateKey: privateKeyHex,
96
- });
99
+ tronWeb.setPrivateKey(privateKeyHex);
97
100
 
98
- const address = tronWebWithKey.address.fromPrivateKey(privateKeyHex);
101
+ const address = tronWeb?.address.fromPrivateKey(privateKeyHex);
99
102
 
100
103
  return {
101
104
  getAddress: () => Promise.resolve(typeof address === "string" ? address : ""),
102
105
  signTransaction: async (transaction: TronTransaction) => {
103
- const signedTx = await tronWebWithKey.trx.sign(transaction, privateKeyHex);
106
+ const signedTx = await tronWeb.trx.sign(transaction, privateKeyHex);
104
107
  return signedTx;
105
108
  },
106
109
  };
@@ -127,7 +130,9 @@ export const createTronToolbox = async (options: TronToolboxOptions = {}) => {
127
130
 
128
131
  // Create signer based on options using pattern matching
129
132
  const signer: TronSigner | undefined = await match(options)
130
- .with({ phrase: P.string }, async ({ phrase }) => createKeysForPath({ phrase, derivationPath }))
133
+ .with({ phrase: P.string }, async ({ phrase }) =>
134
+ createKeysForPath({ phrase, derivationPath, tronWeb }),
135
+ )
131
136
  .with({ signer: P.any }, ({ signer }) => Promise.resolve(signer as TronSigner))
132
137
  .otherwise(() => Promise.resolve(undefined));
133
138
 
@@ -342,6 +347,7 @@ export const createTronToolbox = async (options: TronToolboxOptions = {}) => {
342
347
  if (!signer) throw new SwapKitError("toolbox_tron_no_signer");
343
348
 
344
349
  const from = await getAddress();
350
+ tronWeb.setAddress(from);
345
351
  const isNative = assetValue.isGasAsset;
346
352
 
347
353
  if (isNative) {
@@ -369,27 +375,17 @@ export const createTronToolbox = async (options: TronToolboxOptions = {}) => {
369
375
  return txid;
370
376
  }
371
377
 
372
- // TRC20 Token Transfer
373
- const contractAddress = assetValue.address;
374
- if (!contractAddress) {
375
- throw new SwapKitError("toolbox_tron_invalid_token_identifier", {
376
- identifier: assetValue.toString(),
377
- });
378
- }
379
-
380
- const feeLimit = calculateFeeLimit();
381
- const contract = tronWeb.contract(trc20ABI, contractAddress);
382
-
383
- if (!contract.methods?.transfer) {
384
- throw new SwapKitError("toolbox_tron_token_transfer_failed");
385
- }
386
-
387
- const txid = await contract.transfer(recipient, assetValue.getBaseValue("string")).send({
388
- from,
389
- feeLimit,
390
- callValue: 0,
378
+ // TRC20 Token Transfer - always use createTransaction + sign pattern
379
+ const transaction = await createTransaction({
380
+ recipient,
381
+ assetValue,
382
+ memo,
383
+ sender: from,
391
384
  });
392
385
 
386
+ const signedTx = await signer.signTransaction(transaction);
387
+ const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);
388
+
393
389
  if (!txid) {
394
390
  throw new SwapKitError("toolbox_tron_token_transfer_failed");
395
391
  }
@@ -505,6 +501,7 @@ export const createTronToolbox = async (options: TronToolboxOptions = {}) => {
505
501
  return transaction;
506
502
  }
507
503
 
504
+ tronWeb.setAddress(sender); // Set address for contract calls
508
505
  // For TRC20, we would need to build the transaction manually
509
506
  // This is a simplified version - in practice, you'd build the contract call transaction
510
507
  const contractAddress = assetValue.address;
@@ -557,6 +554,85 @@ export const createTronToolbox = async (options: TronToolboxOptions = {}) => {
557
554
  return txid;
558
555
  };
559
556
 
557
+ /**
558
+ * Check the current allowance for a spender on a token
559
+ */
560
+ const getApprovedAmount = async ({ assetAddress, spenderAddress, from }: ApprovedParams) => {
561
+ try {
562
+ const contract = tronWeb.contract(trc20ABI, assetAddress);
563
+
564
+ if (!contract.methods?.allowance) {
565
+ throw new SwapKitError("toolbox_tron_invalid_token_contract");
566
+ }
567
+
568
+ const allowance = (
569
+ await contract.methods.allowance(from, spenderAddress).call()
570
+ )[0] as string;
571
+ return BigInt(allowance || 0);
572
+ } catch (error) {
573
+ throw new SwapKitError("toolbox_tron_allowance_check_failed", { error });
574
+ }
575
+ };
576
+
577
+ /**
578
+ * Check if a spender is approved for a specific amount
579
+ */
580
+ const isApproved = async ({ assetAddress, spenderAddress, from, amount }: IsApprovedParams) => {
581
+ const allowance = await getApprovedAmount({ assetAddress, spenderAddress, from });
582
+
583
+ if (!amount) {
584
+ // If no amount specified, check if there's any approval
585
+ return allowance > 0n;
586
+ }
587
+
588
+ const amountBigInt = BigInt(amount);
589
+ return allowance >= amountBigInt;
590
+ };
591
+
592
+ /**
593
+ * Approve a spender to transfer tokens
594
+ */
595
+ const approve = async ({ assetAddress, spenderAddress, amount, from }: ApproveParams) => {
596
+ if (!signer) throw new SwapKitError("toolbox_tron_no_signer");
597
+
598
+ const fromAddress = from || (await getAddress());
599
+ const approvalAmount = amount !== undefined ? BigInt(amount).toString() : MAX_APPROVAL;
600
+
601
+ // Build approve transaction using triggerSmartContract
602
+ const functionSelector = "approve(address,uint256)";
603
+ const parameter = [
604
+ { type: "address", value: spenderAddress },
605
+ { type: "uint256", value: approvalAmount },
606
+ ];
607
+
608
+ const feeLimit = calculateFeeLimit();
609
+ const options = {
610
+ feeLimit,
611
+ callValue: 0,
612
+ };
613
+
614
+ try {
615
+ const { transaction } = await tronWeb.transactionBuilder.triggerSmartContract(
616
+ assetAddress,
617
+ functionSelector,
618
+ options,
619
+ parameter,
620
+ fromAddress,
621
+ );
622
+
623
+ const signedTx = await signer.signTransaction(transaction);
624
+ const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);
625
+
626
+ if (!txid) {
627
+ throw new SwapKitError("toolbox_tron_approve_failed");
628
+ }
629
+
630
+ return txid;
631
+ } catch (error) {
632
+ throw new SwapKitError("toolbox_tron_approve_failed", { error });
633
+ }
634
+ };
635
+
560
636
  return {
561
637
  tronWeb,
562
638
  getAddress,
@@ -567,5 +643,8 @@ export const createTronToolbox = async (options: TronToolboxOptions = {}) => {
567
643
  createTransaction,
568
644
  signTransaction,
569
645
  broadcastTransaction,
646
+ approve,
647
+ isApproved,
648
+ getApprovedAmount,
570
649
  };
571
650
  };
package/src/tron/types.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type {
2
2
  DerivationPathArray,
3
+ FeeOption,
3
4
  GenericCreateTransactionParams,
4
5
  GenericTransferParams,
5
6
  } from "@swapkit/helpers";
@@ -30,6 +31,27 @@ export interface TronCreateTransactionParams
30
31
  // No additional fields needed - all inherited from GenericCreateTransactionParams
31
32
  }
32
33
 
34
+ // Same as EVM types for consistency
35
+ export type ApproveParams = {
36
+ assetAddress: string;
37
+ spenderAddress: string;
38
+ feeOptionKey?: FeeOption;
39
+ amount?: bigint | string | number; // BigNumberish equivalent for Tron
40
+ from?: string;
41
+ gasLimitFallback?: bigint | string | number;
42
+ nonce?: number;
43
+ };
44
+
45
+ export type ApprovedParams = {
46
+ assetAddress: string;
47
+ spenderAddress: string;
48
+ from: string;
49
+ };
50
+
51
+ export type IsApprovedParams = ApprovedParams & {
52
+ amount?: bigint | string | number;
53
+ };
54
+
33
55
  // TronGrid API Types
34
56
  export type TronGridTRC20Balance = Array<{
35
57
  [contractAddress: string]: string; // Balance as string