@swapkit/toolboxes 1.0.0-beta.25 → 1.0.0-beta.27

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,3 +1,3 @@
1
- var V={};b(V,{trc20ABI:()=>H,getTronPrivateKeyFromMnemonic:()=>A,getTronAddressValidator:()=>x,createTronToolbox:()=>C});module.exports=W(V);var y=require("@swapkit/helpers"),Z=require("ts-pattern");var H=[{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],type:"function"},{constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[{name:"success",type:"bool"}],type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint8"}],type:"function"},{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],type:"function"},{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],type:"function"}];async function x(){let{TronWeb:z}=require("tronweb");return(R)=>{return z.isAddress(R)}}async function A({phrase:z,derivationPath:R,index:X}){let $=R||y.derivationPathToString(y.updateDerivationPath(y.NetworkDerivationPath[y.Chain.Tron],{index:X||0})),{HDKey:_}=await import("@scure/bip32"),{mnemonicToSeedSync:Y}=await import("@scure/bip39"),j=Y(z),O=_.fromMasterSeed(j).derive($);if(!O.privateKey)throw new y.SwapKitError("toolbox_tron_no_signer");return Buffer.from(O.privateKey).toString("hex")}async function S({phrase:z,derivationPath:R}){let{HDKey:X}=await import("@scure/bip32"),{mnemonicToSeedSync:$}=await import("@scure/bip39"),{TronWeb:_}=require("tronweb"),Y=$(z),J=X.fromMasterSeed(Y).derive(R);if(!J.privateKey)throw new y.SwapKitError("toolbox_tron_no_signer");let O=Buffer.from(J.privateKey).toString("hex"),I=new _({fullHost:y.SKConfig.get("rpcUrls")[y.Chain.Tron],privateKey:O}),L=I.address.fromPrivateKey(O);return{getAddress:()=>Promise.resolve(typeof L==="string"?L:""),signTransaction:async(k)=>{return await I.trx.sign(k,O)}}}var C=async(z={})=>{let{TronWeb:R}=await import("tronweb"),X=y.SKConfig.get("rpcUrls")[y.Chain.Tron],$=void 0,_=new R({fullHost:X,headers:void 0}),Y="index"in z?z.index||0:0,j=y.derivationPathToString("derivationPath"in z&&z.derivationPath?z.derivationPath:y.updateDerivationPath(y.NetworkDerivationPath[y.Chain.Tron],{index:Y})),J=await Z.match(z).with({phrase:Z.P.string},async({phrase:f})=>S({phrase:f,derivationPath:j})).with({signer:Z.P.any},({signer:f})=>Promise.resolve(f)).otherwise(()=>Promise.resolve(void 0)),O=async()=>{if(!J)throw new y.SwapKitError("toolbox_tron_no_signer");return await J.getAddress()},I=()=>{return 1e8},L=async(f,q=!0)=>{let{getBalance:Q}=await import("../../chunk-5yxc1e69.js");try{let G=await Q(y.Chain.Tron)(f,q);if(G.length>0)return G;let M=await _.trx.getBalance(f);return[y.AssetValue.from({chain:y.Chain.Tron,value:M,fromBaseDecimal:6})]}catch(G){y.warnOnce(!0,`Failed to get Tron balance for ${f}: ${G instanceof Error?G.message:G}`);try{let M=await _.trx.getBalance(f);return[y.AssetValue.from({chain:y.Chain.Tron,value:M,fromBaseDecimal:6})]}catch(M){return y.warnOnce(!0,`Failed to get native TRX balance for ${f}: ${M instanceof Error?M.message:M}`),[]}}},k=async({recipient:f,assetValue:q,memo:Q})=>{if(!J)throw new y.SwapKitError("toolbox_tron_no_signer");let G=await O();if(q.isGasAsset){let D=await _.transactionBuilder.sendTrx(f,q.getBaseValue("number"),G);if(Q){let p=await _.transactionBuilder.addUpdateData(D,Q,"utf8"),K=await J.signTransaction(p),{txid:g}=await _.trx.sendRawTransaction(K);return g}let F=await J.signTransaction(D),{txid:w}=await _.trx.sendRawTransaction(F);return w}let B=q.address;if(!B)throw new y.SwapKitError("toolbox_tron_invalid_token_identifier",{identifier:q.toString()});let N=I(),U=await _.contract(H,B);if(!U.methods?.transfer)throw new y.SwapKitError("toolbox_tron_token_transfer_failed");let u=await U.methods.transfer(f,q.getBaseValue("string")).send({from:G,feeLimit:N,callValue:0});if(!u)throw new y.SwapKitError("toolbox_tron_token_transfer_failed");return u},m=({assetValue:f})=>{if(f.isGasAsset)return y.AssetValue.from({chain:y.Chain.Tron,value:1});return y.AssetValue.from({chain:y.Chain.Tron,value:10})},E=async(f)=>{let{recipient:q,assetValue:Q,memo:G}=f,M=await O();if(Q.isGasAsset){let F=await _.transactionBuilder.sendTrx(q,Q.getBaseValue("number"),M);if(G)return _.transactionBuilder.addUpdateData(F,G,"utf8");return F}let N=Q.address;if(!N)throw new y.SwapKitError("toolbox_tron_invalid_token_identifier",{identifier:Q.toString()});let U="transfer(address,uint256)",u=[{type:"address",value:q},{type:"uint256",value:Q.getBaseValue("string")}];return(await _.transactionBuilder.triggerSmartContract(N,U,{},u,M)).transaction},P=async(f)=>{if(!J)throw new y.SwapKitError("toolbox_tron_no_signer");return await J.signTransaction(f)},v=async(f)=>{let{txid:q}=await _.trx.sendRawTransaction(f);return q};return{tronWeb:_,getAddress:O,validateAddress:await x(),getBalance:L,transfer:k,estimateTransactionFee:m,createTransaction:E,signTransaction:P,broadcastTransaction:v}};
1
+ var V={};p(V,{trc20ABI:()=>B,getTronPrivateKeyFromMnemonic:()=>A,getTronAddressValidator:()=>F,createTronToolbox:()=>C});module.exports=W(V);var y=require("@swapkit/helpers"),$=require("ts-pattern");var B=[{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],type:"function"},{constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[{name:"success",type:"bool"}],type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint8"}],type:"function"},{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],type:"function"},{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],type:"function"}];var{TronWeb:D}=require("tronweb");async function F(){return(_)=>{return D.isAddress(_)}}async function A({phrase:_,derivationPath:X,index:j}){let R=X||y.derivationPathToString(y.updateDerivationPath(y.NetworkDerivationPath[y.Chain.Tron],{index:j||0})),{HDKey:Y}=await import("@scure/bip32"),{mnemonicToSeedSync:I}=await import("@scure/bip39"),q=I(_),O=Y.fromMasterSeed(q).derive(R);if(!O.privateKey)throw new y.SwapKitError("toolbox_tron_no_signer");return Buffer.from(O.privateKey).toString("hex")}async function S({phrase:_,derivationPath:X}){let{HDKey:j}=await import("@scure/bip32"),{mnemonicToSeedSync:R}=await import("@scure/bip39"),Y=R(_),q=j.fromMasterSeed(Y).derive(X);if(!q.privateKey)throw new y.SwapKitError("toolbox_tron_no_signer");let Q=Buffer.from(q.privateKey).toString("hex"),O=new D({fullHost:y.SKConfig.get("rpcUrls")[y.Chain.Tron],privateKey:Q}),N=O.address.fromPrivateKey(Q);return{getAddress:()=>Promise.resolve(typeof N==="string"?N:""),signTransaction:async(H)=>{return await O.trx.sign(H,Q)}}}var C=async(_={})=>{let X=y.SKConfig.get("rpcUrls")[y.Chain.Tron],j=void 0,R=new D({fullHost:X,headers:void 0}),Y="index"in _?_.index||0:0,I=y.derivationPathToString("derivationPath"in _&&_.derivationPath?_.derivationPath:y.updateDerivationPath(y.NetworkDerivationPath[y.Chain.Tron],{index:Y})),q=await $.match(_).with({phrase:$.P.string},async({phrase:f})=>S({phrase:f,derivationPath:I})).with({signer:$.P.any},({signer:f})=>Promise.resolve(f)).otherwise(()=>Promise.resolve(void 0)),Q=async()=>{if(!q)throw new y.SwapKitError("toolbox_tron_no_signer");return await q.getAddress()},O=()=>{return 1e8},N=async(f,T=!0)=>{let{getBalance:J}=await import("../../chunk-5yxc1e69.js");try{let z=await J(y.Chain.Tron)(f,T);if(z.length>0)return z;let G=await R.trx.getBalance(f);return[y.AssetValue.from({chain:y.Chain.Tron,value:G,fromBaseDecimal:6})]}catch(z){y.warnOnce(!0,`Failed to get Tron balance for ${f}: ${z instanceof Error?z.message:z}`);try{let G=await R.trx.getBalance(f);return[y.AssetValue.from({chain:y.Chain.Tron,value:G,fromBaseDecimal:6})]}catch(G){return y.warnOnce(!0,`Failed to get native TRX balance for ${f}: ${G instanceof Error?G.message:G}`),[]}}},H=async({recipient:f,assetValue:T,memo:J})=>{if(!q)throw new y.SwapKitError("toolbox_tron_no_signer");let z=await Q();if(T.isGasAsset){let u=await R.transactionBuilder.sendTrx(f,T.getBaseValue("number"),z);if(J){let g=await R.transactionBuilder.addUpdateData(u,J,"utf8"),b=await q.signTransaction(g),{txid:K}=await R.trx.sendRawTransaction(b);return K}let m=await q.signTransaction(u),{txid:v}=await R.trx.sendRawTransaction(m);return v}let k=T.address;if(!k)throw new y.SwapKitError("toolbox_tron_invalid_token_identifier",{identifier:T.toString()});let U=O(),M=await R.contract(B,k);if(!M.methods?.transfer)throw new y.SwapKitError("toolbox_tron_token_transfer_failed");let L=await M.methods.transfer(f,T.getBaseValue("string")).send({from:z,feeLimit:U,callValue:0});if(!L)throw new y.SwapKitError("toolbox_tron_token_transfer_failed");return L},x=({assetValue:f})=>{if(f.isGasAsset)return y.AssetValue.from({chain:y.Chain.Tron,value:1});return y.AssetValue.from({chain:y.Chain.Tron,value:10})},E=async(f)=>{let{recipient:T,assetValue:J,memo:z,sender:G}=f;if(J.isGasAsset){let M=await R.transactionBuilder.sendTrx(T,J.getBaseValue("number"),G);if(z)return R.transactionBuilder.addUpdateData(M,z,"utf8");return M}let U=J.address;if(!U)throw new y.SwapKitError("toolbox_tron_invalid_token_identifier",{identifier:J.toString()});try{let L=[{type:"address",value:T},{type:"uint256",value:J.getBaseValue("string")}],u={feeLimit:O(),callValue:0};return(await R.transactionBuilder.triggerSmartContract(U,"transfer(address,uint256)",u,L,G)).transaction}catch(M){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:M instanceof Error?M.message:String(M)})}},P=async(f)=>{if(!q)throw new y.SwapKitError("toolbox_tron_no_signer");return await q.signTransaction(f)},w=async(f)=>{let{txid:T}=await R.trx.sendRawTransaction(f);return T};return{tronWeb:R,getAddress:Q,validateAddress:await F(),getBalance:N,transfer:H,estimateTransactionFee:x,createTransaction:E,signTransaction:P,broadcastTransaction:w}};
2
2
 
3
- //# debugId=E91951AC6B051F7064756E2164756E21
3
+ //# debugId=8E407DDD203F4BA664756E2164756E21
@@ -2,10 +2,10 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/tron/toolbox.ts", "../src/tron/helpers/trc20.abi.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 type {\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types.js\";\n\nexport async function getTronAddressValidator() {\n const { TronWeb } = require(\"tronweb\");\n\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], { index: index || 0 }),\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 const { TronWeb } = require(\"tronweb\");\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 const { TronWeb } = await import(\"tronweb\");\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 const getBalance = async (address: string, scamFilter = true) => {\n const { getBalance: getBalanceFromApi } = await import(\"../utils.js\");\n\n try {\n // Use SwapKit API for comprehensive balance fetching (includes TRX + TRC20 tokens)\n const apiBalances = await getBalanceFromApi(Chain.Tron)(address, scamFilter);\n\n // If API returns balances, use those\n if (apiBalances.length > 0) {\n return apiBalances;\n }\n\n // Fallback to on-chain TRX balance if API fails or returns empty\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n return [\n AssetValue.from({\n chain: Chain.Tron,\n value: trxBalanceInSun,\n fromBaseDecimal: 6, // TRX has 6 decimals\n }),\n ];\n } catch (error) {\n warnOnce(\n true,\n `Failed to get Tron balance for ${address}: ${error instanceof Error ? error.message : error}`,\n );\n\n // Final fallback: try to get just the native TRX balance\n try {\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n return [\n AssetValue.from({\n chain: Chain.Tron,\n value: trxBalanceInSun,\n fromBaseDecimal: 6,\n }),\n ];\n } catch (fallbackError) {\n warnOnce(\n true,\n `Failed to get native TRX balance for ${address}: ${fallbackError instanceof Error ? fallbackError.message : fallbackError}`,\n );\n return [];\n }\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 = await 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.methods\n .transfer(recipient, assetValue.getBaseValue(\"string\"))\n .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 = ({ assetValue }: TronTransferParams) => {\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n // Native TRX transfers typically consume bandwidth, which is free up to daily limit\n // Return a minimal fee estimation for bandwidth cost\n return AssetValue.from({ chain: Chain.Tron, value: 1 }); // 1 TRX\n }\n\n // TRC20 transfers consume energy, estimate higher fee\n return AssetValue.from({ chain: Chain.Tron, value: 10 }); // 10 TRX\n };\n\n const createTransaction = async (params: TronTransferParams) => {\n const { recipient, assetValue, memo } = params;\n const from = await getAddress();\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n const transaction = await tronWeb.transactionBuilder.sendTrx(\n recipient,\n assetValue.getBaseValue(\"number\"),\n from,\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 const functionSelector = \"transfer(address,uint256)\";\n const parameter = [\n { type: \"address\", value: recipient },\n { type: \"uint256\", value: assetValue.getBaseValue(\"string\") },\n ];\n\n const result = await tronWeb.transactionBuilder.triggerSmartContract(\n contractAddress,\n functionSelector,\n {},\n parameter,\n from,\n );\n\n return result.transaction;\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 type {\n TronCreateTransactionParams,\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types.js\";\n\nconst { TronWeb } = require(\"tronweb\");\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 const getBalance = async (address: string, scamFilter = true) => {\n const { getBalance: getBalanceFromApi } = await import(\"../utils.js\");\n\n try {\n // Use SwapKit API for comprehensive balance fetching (includes TRX + TRC20 tokens)\n const apiBalances = await getBalanceFromApi(Chain.Tron)(address, scamFilter);\n\n // If API returns balances, use those\n if (apiBalances.length > 0) {\n return apiBalances;\n }\n\n // Fallback to on-chain TRX balance if API fails or returns empty\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n return [\n AssetValue.from({\n chain: Chain.Tron,\n value: trxBalanceInSun,\n fromBaseDecimal: 6, // TRX has 6 decimals\n }),\n ];\n } catch (error) {\n warnOnce(\n true,\n `Failed to get Tron balance for ${address}: ${error instanceof Error ? error.message : error}`,\n );\n\n // Final fallback: try to get just the native TRX balance\n try {\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n return [\n AssetValue.from({\n chain: Chain.Tron,\n value: trxBalanceInSun,\n fromBaseDecimal: 6,\n }),\n ];\n } catch (fallbackError) {\n warnOnce(\n true,\n `Failed to get native TRX balance for ${address}: ${fallbackError instanceof Error ? fallbackError.message : fallbackError}`,\n );\n return [];\n }\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 = await 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.methods\n .transfer(recipient, assetValue.getBaseValue(\"string\"))\n .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 = ({ assetValue }: TronTransferParams) => {\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n // Native TRX transfers typically consume bandwidth, which is free up to daily limit\n // Return a minimal fee estimation for bandwidth cost\n return AssetValue.from({ chain: Chain.Tron, value: 1 }); // 1 TRX\n }\n\n // TRC20 transfers consume energy, estimate higher fee\n return AssetValue.from({ chain: Chain.Tron, value: 10 }); // 10 TRX\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",
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 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 type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"decimals\",\n outputs: [{ name: \"\", type: \"uint8\" }],\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"symbol\",\n outputs: [{ name: \"\", type: \"string\" }],\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"name\",\n outputs: [{ name: \"\", type: \"string\" }],\n type: \"function\",\n },\n] as const;\n"
7
7
  ],
8
- "mappings": "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",
9
- "debugId": "E91951AC6B051F7064756E2164756E21",
8
+ "mappings": "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",
9
+ "debugId": "8E407DDD203F4BA664756E2164756E21",
10
10
  "names": []
11
11
  }
@@ -1,3 +1,3 @@
1
- import{d as Y,e as T}from"../../chunk-s47y8512.js";import{AssetValue as k,Chain as Q,NetworkDerivationPath as P,SKConfig as v,SwapKitError as R,derivationPathToString as w,updateDerivationPath as p,warnOnce as C}from"@swapkit/helpers";import{P as E,match as c}from"ts-pattern";var m=[{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],type:"function"},{constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[{name:"success",type:"bool"}],type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint8"}],type:"function"},{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],type:"function"},{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],type:"function"}];async function K(){let{TronWeb:q}=T("tronweb");return(X)=>{return q.isAddress(X)}}async function o({phrase:q,derivationPath:X,index:Z}){let j=X||w(p(P[Q.Tron],{index:Z||0})),{HDKey:f}=await import("@scure/bip32"),{mnemonicToSeedSync:$}=await import("@scure/bip39"),I=$(q),M=f.fromMasterSeed(I).derive(j);if(!M.privateKey)throw new R("toolbox_tron_no_signer");return Buffer.from(M.privateKey).toString("hex")}async function n({phrase:q,derivationPath:X}){let{HDKey:Z}=await import("@scure/bip32"),{mnemonicToSeedSync:j}=await import("@scure/bip39"),{TronWeb:f}=T("tronweb"),$=j(q),G=Z.fromMasterSeed($).derive(X);if(!G.privateKey)throw new R("toolbox_tron_no_signer");let M=Buffer.from(G.privateKey).toString("hex"),L=new f({fullHost:v.get("rpcUrls")[Q.Tron],privateKey:M}),N=L.address.fromPrivateKey(M);return{getAddress:()=>Promise.resolve(typeof N==="string"?N:""),signTransaction:async(B)=>{return await L.trx.sign(B,M)}}}var d=async(q={})=>{let{TronWeb:X}=await import("tronweb"),Z=v.get("rpcUrls")[Q.Tron],j=void 0,f=new X({fullHost:Z,headers:void 0}),$="index"in q?q.index||0:0,I=w("derivationPath"in q&&q.derivationPath?q.derivationPath:p(P[Q.Tron],{index:$})),G=await c(q).with({phrase:E.string},async({phrase:y})=>n({phrase:y,derivationPath:I})).with({signer:E.any},({signer:y})=>Promise.resolve(y)).otherwise(()=>Promise.resolve(void 0)),M=async()=>{if(!G)throw new R("toolbox_tron_no_signer");return await G.getAddress()},L=()=>{return 1e8},N=async(y,_=!0)=>{let{getBalance:O}=await import("../../chunk-6f98phv2.js");try{let z=await O(Q.Tron)(y,_);if(z.length>0)return z;let J=await f.trx.getBalance(y);return[k.from({chain:Q.Tron,value:J,fromBaseDecimal:6})]}catch(z){C(!0,`Failed to get Tron balance for ${y}: ${z instanceof Error?z.message:z}`);try{let J=await f.trx.getBalance(y);return[k.from({chain:Q.Tron,value:J,fromBaseDecimal:6})]}catch(J){return C(!0,`Failed to get native TRX balance for ${y}: ${J instanceof Error?J.message:J}`),[]}}},B=async({recipient:y,assetValue:_,memo:O})=>{if(!G)throw new R("toolbox_tron_no_signer");let z=await M();if(_.isGasAsset){let x=await f.transactionBuilder.sendTrx(y,_.getBaseValue("number"),z);if(O){let V=await f.transactionBuilder.addUpdateData(x,O,"utf8"),l=await G.signTransaction(V),{txid:h}=await f.trx.sendRawTransaction(l);return h}let H=await G.signTransaction(x),{txid:b}=await f.trx.sendRawTransaction(H);return b}let D=_.address;if(!D)throw new R("toolbox_tron_invalid_token_identifier",{identifier:_.toString()});let U=L(),u=await f.contract(m,D);if(!u.methods?.transfer)throw new R("toolbox_tron_token_transfer_failed");let F=await u.methods.transfer(y,_.getBaseValue("string")).send({from:z,feeLimit:U,callValue:0});if(!F)throw new R("toolbox_tron_token_transfer_failed");return F},A=({assetValue:y})=>{if(y.isGasAsset)return k.from({chain:Q.Tron,value:1});return k.from({chain:Q.Tron,value:10})},g=async(y)=>{let{recipient:_,assetValue:O,memo:z}=y,J=await M();if(O.isGasAsset){let H=await f.transactionBuilder.sendTrx(_,O.getBaseValue("number"),J);if(z)return f.transactionBuilder.addUpdateData(H,z,"utf8");return H}let U=O.address;if(!U)throw new R("toolbox_tron_invalid_token_identifier",{identifier:O.toString()});let u="transfer(address,uint256)",F=[{type:"address",value:_},{type:"uint256",value:O.getBaseValue("string")}];return(await f.transactionBuilder.triggerSmartContract(U,u,{},F,J)).transaction},S=async(y)=>{if(!G)throw new R("toolbox_tron_no_signer");return await G.signTransaction(y)},W=async(y)=>{let{txid:_}=await f.trx.sendRawTransaction(y);return _};return{tronWeb:f,getAddress:M,validateAddress:await K(),getBalance:N,transfer:B,estimateTransactionFee:A,createTransaction:g,signTransaction:S,broadcastTransaction:W}};export{m as trc20ABI,o as getTronPrivateKeyFromMnemonic,K as getTronAddressValidator,d as createTronToolbox};
1
+ import{d as j,e as Y}from"../../chunk-s47y8512.js";import{AssetValue as H,Chain as O,NetworkDerivationPath as P,SKConfig as w,SwapKitError as M,derivationPathToString as v,updateDerivationPath as g,warnOnce as C}from"@swapkit/helpers";import{P as E,match as c}from"ts-pattern";var F=[{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],type:"function"},{constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[{name:"success",type:"bool"}],type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint8"}],type:"function"},{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],type:"function"},{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],type:"function"}];var{TronWeb:x}=Y("tronweb");async function b(){return(T)=>{return x.isAddress(T)}}async function o({phrase:T,derivationPath:Z,index:I}){let f=Z||v(g(P[O.Tron],{index:I||0})),{HDKey:$}=await import("@scure/bip32"),{mnemonicToSeedSync:N}=await import("@scure/bip39"),_=N(T),Q=$.fromMasterSeed(_).derive(f);if(!Q.privateKey)throw new M("toolbox_tron_no_signer");return Buffer.from(Q.privateKey).toString("hex")}async function n({phrase:T,derivationPath:Z}){let{HDKey:I}=await import("@scure/bip32"),{mnemonicToSeedSync:f}=await import("@scure/bip39"),$=f(T),_=I.fromMasterSeed($).derive(Z);if(!_.privateKey)throw new M("toolbox_tron_no_signer");let X=Buffer.from(_.privateKey).toString("hex"),Q=new x({fullHost:w.get("rpcUrls")[O.Tron],privateKey:X}),U=Q.address.fromPrivateKey(X);return{getAddress:()=>Promise.resolve(typeof U==="string"?U:""),signTransaction:async(k)=>{return await Q.trx.sign(k,X)}}}var d=async(T={})=>{let Z=w.get("rpcUrls")[O.Tron],I=void 0,f=new x({fullHost:Z,headers:void 0}),$="index"in T?T.index||0:0,N=v("derivationPath"in T&&T.derivationPath?T.derivationPath:g(P[O.Tron],{index:$})),_=await c(T).with({phrase:E.string},async({phrase:y})=>n({phrase:y,derivationPath:N})).with({signer:E.any},({signer:y})=>Promise.resolve(y)).otherwise(()=>Promise.resolve(void 0)),X=async()=>{if(!_)throw new M("toolbox_tron_no_signer");return await _.getAddress()},Q=()=>{return 1e8},U=async(y,R=!0)=>{let{getBalance:G}=await import("../../chunk-6f98phv2.js");try{let q=await G(O.Tron)(y,R);if(q.length>0)return q;let z=await f.trx.getBalance(y);return[H.from({chain:O.Tron,value:z,fromBaseDecimal:6})]}catch(q){C(!0,`Failed to get Tron balance for ${y}: ${q instanceof Error?q.message:q}`);try{let z=await f.trx.getBalance(y);return[H.from({chain:O.Tron,value:z,fromBaseDecimal:6})]}catch(z){return C(!0,`Failed to get native TRX balance for ${y}: ${z instanceof Error?z.message:z}`),[]}}},k=async({recipient:y,assetValue:R,memo:G})=>{if(!_)throw new M("toolbox_tron_no_signer");let q=await X();if(R.isGasAsset){let B=await f.transactionBuilder.sendTrx(y,R.getBaseValue("number"),q);if(G){let V=await f.transactionBuilder.addUpdateData(B,G,"utf8"),l=await _.signTransaction(V),{txid:h}=await f.trx.sendRawTransaction(l);return h}let A=await _.signTransaction(B),{txid:p}=await f.trx.sendRawTransaction(A);return p}let D=R.address;if(!D)throw new M("toolbox_tron_invalid_token_identifier",{identifier:R.toString()});let L=Q(),J=await f.contract(F,D);if(!J.methods?.transfer)throw new M("toolbox_tron_token_transfer_failed");let u=await J.methods.transfer(y,R.getBaseValue("string")).send({from:q,feeLimit:L,callValue:0});if(!u)throw new M("toolbox_tron_token_transfer_failed");return u},m=({assetValue:y})=>{if(y.isGasAsset)return H.from({chain:O.Tron,value:1});return H.from({chain:O.Tron,value:10})},K=async(y)=>{let{recipient:R,assetValue:G,memo:q,sender:z}=y;if(G.isGasAsset){let J=await f.transactionBuilder.sendTrx(R,G.getBaseValue("number"),z);if(q)return f.transactionBuilder.addUpdateData(J,q,"utf8");return J}let L=G.address;if(!L)throw new M("toolbox_tron_invalid_token_identifier",{identifier:G.toString()});try{let u=[{type:"address",value:R},{type:"uint256",value:G.getBaseValue("string")}],B={feeLimit:Q(),callValue:0};return(await f.transactionBuilder.triggerSmartContract(L,"transfer(address,uint256)",B,u,z)).transaction}catch(J){throw new M("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)})}},S=async(y)=>{if(!_)throw new M("toolbox_tron_no_signer");return await _.signTransaction(y)},W=async(y)=>{let{txid:R}=await f.trx.sendRawTransaction(y);return R};return{tronWeb:f,getAddress:X,validateAddress:await b(),getBalance:U,transfer:k,estimateTransactionFee:m,createTransaction:K,signTransaction:S,broadcastTransaction:W}};export{F as trc20ABI,o as getTronPrivateKeyFromMnemonic,b as getTronAddressValidator,d as createTronToolbox};
2
2
 
3
- //# debugId=8285008E1FBE487564756E2164756E21
3
+ //# debugId=A65A028E790D4A4C64756E2164756E21
@@ -2,10 +2,10 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/tron/toolbox.ts", "../src/tron/helpers/trc20.abi.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 type {\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types.js\";\n\nexport async function getTronAddressValidator() {\n const { TronWeb } = require(\"tronweb\");\n\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], { index: index || 0 }),\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 const { TronWeb } = require(\"tronweb\");\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 const { TronWeb } = await import(\"tronweb\");\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 const getBalance = async (address: string, scamFilter = true) => {\n const { getBalance: getBalanceFromApi } = await import(\"../utils.js\");\n\n try {\n // Use SwapKit API for comprehensive balance fetching (includes TRX + TRC20 tokens)\n const apiBalances = await getBalanceFromApi(Chain.Tron)(address, scamFilter);\n\n // If API returns balances, use those\n if (apiBalances.length > 0) {\n return apiBalances;\n }\n\n // Fallback to on-chain TRX balance if API fails or returns empty\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n return [\n AssetValue.from({\n chain: Chain.Tron,\n value: trxBalanceInSun,\n fromBaseDecimal: 6, // TRX has 6 decimals\n }),\n ];\n } catch (error) {\n warnOnce(\n true,\n `Failed to get Tron balance for ${address}: ${error instanceof Error ? error.message : error}`,\n );\n\n // Final fallback: try to get just the native TRX balance\n try {\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n return [\n AssetValue.from({\n chain: Chain.Tron,\n value: trxBalanceInSun,\n fromBaseDecimal: 6,\n }),\n ];\n } catch (fallbackError) {\n warnOnce(\n true,\n `Failed to get native TRX balance for ${address}: ${fallbackError instanceof Error ? fallbackError.message : fallbackError}`,\n );\n return [];\n }\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 = await 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.methods\n .transfer(recipient, assetValue.getBaseValue(\"string\"))\n .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 = ({ assetValue }: TronTransferParams) => {\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n // Native TRX transfers typically consume bandwidth, which is free up to daily limit\n // Return a minimal fee estimation for bandwidth cost\n return AssetValue.from({ chain: Chain.Tron, value: 1 }); // 1 TRX\n }\n\n // TRC20 transfers consume energy, estimate higher fee\n return AssetValue.from({ chain: Chain.Tron, value: 10 }); // 10 TRX\n };\n\n const createTransaction = async (params: TronTransferParams) => {\n const { recipient, assetValue, memo } = params;\n const from = await getAddress();\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n const transaction = await tronWeb.transactionBuilder.sendTrx(\n recipient,\n assetValue.getBaseValue(\"number\"),\n from,\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 const functionSelector = \"transfer(address,uint256)\";\n const parameter = [\n { type: \"address\", value: recipient },\n { type: \"uint256\", value: assetValue.getBaseValue(\"string\") },\n ];\n\n const result = await tronWeb.transactionBuilder.triggerSmartContract(\n contractAddress,\n functionSelector,\n {},\n parameter,\n from,\n );\n\n return result.transaction;\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 type {\n TronCreateTransactionParams,\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types.js\";\n\nconst { TronWeb } = require(\"tronweb\");\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 const getBalance = async (address: string, scamFilter = true) => {\n const { getBalance: getBalanceFromApi } = await import(\"../utils.js\");\n\n try {\n // Use SwapKit API for comprehensive balance fetching (includes TRX + TRC20 tokens)\n const apiBalances = await getBalanceFromApi(Chain.Tron)(address, scamFilter);\n\n // If API returns balances, use those\n if (apiBalances.length > 0) {\n return apiBalances;\n }\n\n // Fallback to on-chain TRX balance if API fails or returns empty\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n return [\n AssetValue.from({\n chain: Chain.Tron,\n value: trxBalanceInSun,\n fromBaseDecimal: 6, // TRX has 6 decimals\n }),\n ];\n } catch (error) {\n warnOnce(\n true,\n `Failed to get Tron balance for ${address}: ${error instanceof Error ? error.message : error}`,\n );\n\n // Final fallback: try to get just the native TRX balance\n try {\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n return [\n AssetValue.from({\n chain: Chain.Tron,\n value: trxBalanceInSun,\n fromBaseDecimal: 6,\n }),\n ];\n } catch (fallbackError) {\n warnOnce(\n true,\n `Failed to get native TRX balance for ${address}: ${fallbackError instanceof Error ? fallbackError.message : fallbackError}`,\n );\n return [];\n }\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 = await 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.methods\n .transfer(recipient, assetValue.getBaseValue(\"string\"))\n .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 = ({ assetValue }: TronTransferParams) => {\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n // Native TRX transfers typically consume bandwidth, which is free up to daily limit\n // Return a minimal fee estimation for bandwidth cost\n return AssetValue.from({ chain: Chain.Tron, value: 1 }); // 1 TRX\n }\n\n // TRC20 transfers consume energy, estimate higher fee\n return AssetValue.from({ chain: Chain.Tron, value: 10 }); // 10 TRX\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",
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 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 type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"decimals\",\n outputs: [{ name: \"\", type: \"uint8\" }],\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"symbol\",\n outputs: [{ name: \"\", type: \"string\" }],\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"name\",\n outputs: [{ name: \"\", type: \"string\" }],\n type: \"function\",\n },\n] as const;\n"
7
7
  ],
8
- "mappings": "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",
9
- "debugId": "8285008E1FBE487564756E2164756E21",
8
+ "mappings": "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",
9
+ "debugId": "A65A028E790D4A4C64756E2164756E21",
10
10
  "names": []
11
11
  }
package/package.json CHANGED
@@ -23,7 +23,7 @@
23
23
  "@solana/spl-memo": "0.2.5",
24
24
  "@solana/spl-token": "0.4.13",
25
25
  "@solana/web3.js": "1.98.2",
26
- "@swapkit/helpers": "3.0.0-beta.17",
26
+ "@swapkit/helpers": "3.0.0-beta.18",
27
27
  "base64-js": "1.5.1",
28
28
  "bitcoinjs-lib": "6.1.7",
29
29
  "bs58check": "4.0.0",
@@ -119,5 +119,5 @@
119
119
  "type-check:go": "tsgo"
120
120
  },
121
121
  "type": "module",
122
- "version": "1.0.0-beta.25"
122
+ "version": "1.0.0-beta.27"
123
123
  }
@@ -78,9 +78,9 @@ describe("TRON Address Validation", () => {
78
78
  expect(address.startsWith("T")).toBe(true);
79
79
  });
80
80
 
81
- test("should create transaction with valid addresses", async () => {
81
+ test("should create TRON transaction with valid addresses", async () => {
82
82
  const toolbox = context.toolbox;
83
- const fromAddress = await toolbox.getAddress();
83
+ const fromAddress = "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE";
84
84
  const toAddress = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"; // Valid TRON address
85
85
 
86
86
  // Both addresses should be valid
@@ -90,6 +90,7 @@ describe("TRON Address Validation", () => {
90
90
  // Create a transaction
91
91
  const transaction = await toolbox.createTransaction({
92
92
  recipient: toAddress,
93
+ sender: fromAddress,
93
94
  assetValue: AssetValue.from({
94
95
  chain: Chain.Tron,
95
96
  value: "1", // 1 TRX
@@ -100,6 +101,29 @@ describe("TRON Address Validation", () => {
100
101
  expect(transaction.raw_data_hex).toBeDefined();
101
102
  });
102
103
 
104
+ test("should create TRON.USDT transaction with valid addresses", async () => {
105
+ const toolbox = context.toolbox;
106
+ const fromAddress = "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE";
107
+ const toAddress = "TT87ESmqUmH87hMx1MKCEqYrJKaQyNg9ao"; // Valid TRON address
108
+
109
+ // Both addresses should be valid
110
+ expect(toolbox.validateAddress(fromAddress)).toBe(true);
111
+ expect(toolbox.validateAddress(toAddress)).toBe(true);
112
+
113
+ // Create a transaction
114
+ const transaction = await toolbox.createTransaction({
115
+ recipient: toAddress,
116
+ sender: fromAddress,
117
+ assetValue: AssetValue.from({
118
+ asset: "TRX.USDT-TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
119
+ value: "100", // 1 TRX
120
+ }),
121
+ });
122
+
123
+ expect(transaction).toBeDefined();
124
+ expect(transaction.raw_data_hex).toBeDefined();
125
+ });
126
+
103
127
  test("should handle case sensitivity in addresses", () => {
104
128
  const address = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";
105
129
  const lowerCase = address.toLowerCase();
@@ -12,6 +12,7 @@ import { P, match } from "ts-pattern";
12
12
 
13
13
  import { trc20ABI } from "./helpers/trc20.abi.js";
14
14
  import type {
15
+ TronCreateTransactionParams,
15
16
  TronSignedTransaction,
16
17
  TronSigner,
17
18
  TronToolboxOptions,
@@ -19,9 +20,9 @@ import type {
19
20
  TronTransferParams,
20
21
  } from "./types.js";
21
22
 
22
- export async function getTronAddressValidator() {
23
- const { TronWeb } = require("tronweb");
23
+ const { TronWeb } = require("tronweb");
24
24
 
25
+ export async function getTronAddressValidator() {
25
26
  return (address: string) => {
26
27
  return TronWeb.isAddress(address);
27
28
  };
@@ -39,7 +40,9 @@ export async function getTronPrivateKeyFromMnemonic({
39
40
  const derivationPathToUse =
40
41
  customPath ||
41
42
  derivationPathToString(
42
- updateDerivationPath(NetworkDerivationPath[Chain.Tron], { index: index || 0 }),
43
+ updateDerivationPath(NetworkDerivationPath[Chain.Tron], {
44
+ index: index || 0,
45
+ }),
43
46
  );
44
47
 
45
48
  const { HDKey } = await import("@scure/bip32");
@@ -65,7 +68,6 @@ async function createKeysForPath({
65
68
  }) {
66
69
  const { HDKey } = await import("@scure/bip32");
67
70
  const { mnemonicToSeedSync } = await import("@scure/bip39");
68
- const { TronWeb } = require("tronweb");
69
71
 
70
72
  const seed = mnemonicToSeedSync(phrase);
71
73
  const hdKey = HDKey.fromMasterSeed(seed);
@@ -96,7 +98,6 @@ async function createKeysForPath({
96
98
  }
97
99
 
98
100
  export const createTronToolbox = async (options: TronToolboxOptions = {}) => {
99
- const { TronWeb } = await import("tronweb");
100
101
  // Always get configuration from SKConfig
101
102
  const rpcUrl = SKConfig.get("rpcUrls")[Chain.Tron];
102
103
  // Note: TRON API key support can be added to SKConfig apiKeys when needed
@@ -251,16 +252,15 @@ export const createTronToolbox = async (options: TronToolboxOptions = {}) => {
251
252
  return AssetValue.from({ chain: Chain.Tron, value: 10 }); // 10 TRX
252
253
  };
253
254
 
254
- const createTransaction = async (params: TronTransferParams) => {
255
- const { recipient, assetValue, memo } = params;
256
- const from = await getAddress();
255
+ const createTransaction = async (params: TronCreateTransactionParams) => {
256
+ const { recipient, assetValue, memo, sender } = params;
257
257
  const isNative = assetValue.isGasAsset;
258
258
 
259
259
  if (isNative) {
260
260
  const transaction = await tronWeb.transactionBuilder.sendTrx(
261
261
  recipient,
262
262
  assetValue.getBaseValue("number"),
263
- from,
263
+ sender,
264
264
  );
265
265
 
266
266
  if (memo) {
@@ -280,21 +280,36 @@ export const createTronToolbox = async (options: TronToolboxOptions = {}) => {
280
280
  }
281
281
 
282
282
  // Build TRC20 transfer transaction
283
- const functionSelector = "transfer(address,uint256)";
284
- const parameter = [
285
- { type: "address", value: recipient },
286
- { type: "uint256", value: assetValue.getBaseValue("string") },
287
- ];
288
-
289
- const result = await tronWeb.transactionBuilder.triggerSmartContract(
290
- contractAddress,
291
- functionSelector,
292
- {},
293
- parameter,
294
- from,
295
- );
283
+ // First, try using triggerSmartContract (might work despite the known bug)
284
+ try {
285
+ const functionSelector = "transfer(address,uint256)";
286
+ const parameter = [
287
+ { type: "address", value: recipient },
288
+ { type: "uint256", value: assetValue.getBaseValue("string") },
289
+ ];
296
290
 
297
- return result.transaction;
291
+ const options = {
292
+ feeLimit: calculateFeeLimit(),
293
+ callValue: 0,
294
+ };
295
+
296
+ const result = await tronWeb.transactionBuilder.triggerSmartContract(
297
+ contractAddress,
298
+ functionSelector,
299
+ options,
300
+ parameter,
301
+ sender,
302
+ );
303
+
304
+ return result.transaction;
305
+ } catch (error) {
306
+ // If both methods fail, throw a descriptive error
307
+ throw new SwapKitError("toolbox_tron_transaction_creation_failed", {
308
+ message:
309
+ "Failed to create TRC20 transaction. This might be due to TronWeb 6.0.3 bug. Use the transfer method directly instead.",
310
+ originalError: error instanceof Error ? error.message : String(error),
311
+ });
312
+ }
298
313
  };
299
314
 
300
315
  const signTransaction = async (transaction: TronTransaction) => {
package/src/tron/types.ts CHANGED
@@ -1,4 +1,8 @@
1
- import type { DerivationPathArray, GenericTransferParams } from "@swapkit/helpers";
1
+ import type {
2
+ DerivationPathArray,
3
+ GenericCreateTransactionParams,
4
+ GenericTransferParams,
5
+ } from "@swapkit/helpers";
2
6
  import type { Contract, Types } from "tronweb";
3
7
 
4
8
  // Re-export TronWeb types for convenience
@@ -20,3 +24,8 @@ export type TronToolboxOptions =
20
24
  export interface TronTransferParams extends GenericTransferParams {
21
25
  // No additional fields needed - all inherited from GenericTransferParams
22
26
  }
27
+
28
+ export interface TronCreateTransactionParams
29
+ extends Omit<GenericCreateTransactionParams, "feeRate"> {
30
+ // No additional fields needed - all inherited from GenericCreateTransactionParams
31
+ }