@swapkit/toolboxes 6.5.0 → 6.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/dist/src/tron/index.js +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# @swapkit/toolboxes
|
|
2
2
|
|
|
3
|
+
## 6.5.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#478](https://github.com/swapkit/sdk/pull/478) [`0ea5efb`](https://github.com/swapkit/sdk/commit/0ea5efbcd24d3771b169e893d583760c64838f6b) Thanks [@hippocampusSK](https://github.com/hippocampusSK)! - The Tron toolbox now reports `toolbox_tron_insufficient_balance` instead of `toolbox_tron_transaction_creation_failed` when the node rejects a TRX or TRC-20 transfer because the wallet cannot cover it, including the extra fee for sending to an account that is not activated yet. The node's reason is kept in the error info, and `transfer` no longer wraps this error in `toolbox_tron_token_transfer_failed`.
|
|
8
|
+
|
|
9
|
+
- Updated dependencies [[`0ea5efb`](https://github.com/swapkit/sdk/commit/0ea5efbcd24d3771b169e893d583760c64838f6b)]:
|
|
10
|
+
- @swapkit/helpers@6.4.1
|
|
11
|
+
|
|
3
12
|
## 6.5.0
|
|
4
13
|
|
|
5
14
|
### Minor Changes
|
package/dist/src/tron/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"../../chunk-pz8xe0qj.js";import{hexToBytes as un}from"@noble/hashes/utils.js";import{Chain as fn,getRPCUrlSync as ln,SwapKitError as y,warnOnce as K}from"@swapkit/helpers";import{secp256k1 as _t}from"@noble/curves/secp256k1.js";import{sha256 as Tt}from"@noble/hashes/sha2.js";import{keccak_256 as nn}from"@noble/hashes/sha3.js";import{bytesToHex as S,hexToBytes as M}from"@noble/hashes/utils.js";import{createBase58check as en}from"@scure/base";import{SwapKitError as mt}from"@swapkit/helpers";var L=en(Tt),wt=65,rn=2n**256n;function b(n){if(typeof n!=="string")return!1;try{let t=L.decode(n);return t.length===21&&t[0]===wt}catch{return!1}}function z(n){return S(L.decode(n))}function on(n){return L.decode(n).slice(1)}function pt(n){let t=_t.getPublicKey(M(n),!1),e=nn(t.slice(1)).slice(-20),r=new Uint8Array(21);return r[0]=wt,r.set(e,1),L.encode(r)}function yt({txID:n,privateKey:t}){let e=_t.sign(M(n),M(t),{format:"recovered",prehash:!1}),r=e[0]??0,i=S(e.slice(1,33)),o=S(e.slice(33,65)),c=(r+27).toString(16).padStart(2,"0");return i+o+c}function N({txID:n,raw_data_hex:t}){let e=S(Tt(M(t)));if(n!==e)throw new mt("toolbox_tron_invalid_transaction_integrity",{expected:e,txID:n})}function an(n){return`000000000000000000000000${S(on(n))}`}function sn(n){let t=typeof n==="bigint"?n:BigInt(n);if(t<0n||t>=rn)throw new mt("toolbox_tron_invalid_token_identifier",{identifier:t.toString()});return t.toString(16).padStart(64,"0")}function R(n){return n.map(({type:t,value:e})=>t==="address"?an(e):sn(BigInt(e))).join("")}function cn(n){return S(new TextEncoder().encode(n))}var dn=/^0x(?:[0-9a-fA-F]{2})+$/;function J(n){return dn.test(n)?n.slice(2):cn(n)}var bt="https://api.trongrid.io",gn=1000,_n=1e5,Tn=1e6,mn=420,wn=1e6,pn=30000,yn=2147483647;function xt(){try{return ln(fn.Tron)}catch{return bt}}function At(n){let t=n!==void 0&&Number.isFinite(n)&&n>0?Math.min(n,yn):pn,e=new AbortController,r=setTimeout(()=>e.abort(),t);return{cleanup:()=>clearTimeout(r),signal:e.signal}}function tt(n){if(!n||typeof n!=="object")return;let{Error:t}=n;return typeof t==="string"&&t.length>0?t:void 0}function hn(n){if(!n)return;if(n.length%2!==0||!/^[0-9a-f]+$/i.test(n))return n;try{let t=new TextDecoder().decode(un(n));return/^[ -~]+$/.test(t)?t:n}catch{return n}}function Et(n,t){if(typeof n!=="string")return!1;if(n===t)return!0;try{return n.toLowerCase()===z(t).toLowerCase()}catch{return!1}}function Z(n){let t=typeof n==="number"?n:typeof n==="string"&&n.trim()!==""?Number(n):Number.NaN;return Number.isSafeInteger(t)&&t>=0?t:void 0}function C(n){let t=Z(n);return t!==void 0&&t>0?t:void 0}function Q(n,t){let e=Z(n),r=Z(t);if(n!==void 0&&e===void 0||t!==void 0&&r===void 0)return 0;return Math.max(0,(e??0)-(r??0))}async function v(n,t,e){let{signal:r,cleanup:i}=At(e);try{let o=await fetch(`${xt()}${n}`,{body:JSON.stringify(t),headers:{"Content-Type":"application/json"},method:"POST",signal:r});if(!o.ok)throw new y("toolbox_tron_trongrid_api_error",{message:`${o.status} ${o.statusText} on ${n}`});return await o.json()}finally{i()}}async function vt(n,t,e){let{signal:r,cleanup:i}=At(e);try{let o=await fetch(`${t??xt()}${n}`,{headers:{"Content-Type":"application/json"},signal:r});if(!o.ok)throw new y("toolbox_tron_trongrid_api_error",{message:`${o.status} ${o.statusText} on ${n}`});return await o.json()}finally{i()}}async function O(n){if(!b(n))throw new y("toolbox_tron_trongrid_api_error",{address:n,message:"Invalid address"});try{let t=await vt(`/v1/accounts/${n}`,bt);if(!(t.success&&t.data)||t.data.length===0)return;let e=t.data.find((r)=>Et(r.address,n));if(!e)return;return{balance:e.balance,trc20:e.trc20||[]}}catch(t){if(t instanceof y)throw t;throw new y("toolbox_tron_trongrid_api_error",{message:t instanceof Error?t.message:"Unknown error"})}}var bn="/wallet/createtransaction";async function Ft({from:n,to:t,amount:e}){let i=await v(bn,{amount:e,owner_address:n,to_address:t,visible:!0});if(!i.txID||!i.raw_data_hex||!i.raw_data)throw new y({errorKey:"toolbox_tron_transaction_creation_failed",info:{error:tt(i)??"Node returned no transaction"}});let c=i.raw_data?.contract?.[0]?.parameter?.value;if(c?.to_address!==t||c?.owner_address!==n||c?.amount!==e)throw new y({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"Node returned a transaction that does not match the requested transfer"}});return N(i),i}var xn="/wallet/triggersmartcontract";async function St({ownerAddress:n,contractAddress:t,functionSelector:e,parameter:r,feeLimit:i,callValue:o=0}){let c=await v(xn,{call_value:o,contract_address:t,fee_limit:i,function_selector:e,owner_address:n,parameter:r,visible:!0});if(!c.result?.result||!c.transaction?.txID||!c.transaction?.raw_data_hex)throw new y({errorKey:"toolbox_tron_transaction_creation_failed",info:{code:c.result?.code,error:tt(c)??"Node returned no transaction",message:hn(c.result?.message)}});let T=c.transaction.raw_data?.contract?.[0]?.parameter?.value;if(T?.contract_address!==t||T?.owner_address!==n)throw new y({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"Node returned a transaction that does not match the requested contract call"}});return N(c.transaction),c.transaction}function Nt({ownerAddress:n,contractAddress:t,functionSelector:e,parameter:r}){return v("/wallet/triggerconstantcontract",{contract_address:t,function_selector:e,owner_address:n,parameter:r,visible:!0})}function An({ownerAddress:n,contractAddress:t,functionSelector:e,parameter:r}){return v("/wallet/estimateenergy",{contract_address:t,function_selector:e,owner_address:n,parameter:r,visible:!0})}function ht(n){let t=typeof n==="number"?n:typeof n==="string"?Number(n):Number.NaN;return Number.isFinite(t)&&t>0?t:void 0}async function k(n){try{let{result:t,txid:e}=await v("/wallet/broadcasttransaction",{raw_data:n.raw_data,raw_data_hex:n.raw_data_hex,signature:n.signature,txID:n.txID,visible:n.visible});if(!t||!e)throw new y("toolbox_tron_token_transfer_failed");return e}catch(t){throw new y("toolbox_tron_broadcast_failed",{error:t})}}async function I({timeoutMs:n}={}){let t={};try{let{chainParameter:e}=await vt("/wallet/getchainparameters",void 0,n);for(let r of e)if(r&&typeof r.key==="string")t[r.key]=r.value}catch(e){K({condition:!0,id:"tron_chain_params_failed",warning:`Failed to fetch chain params, using defaults: ${e instanceof Error?e.message:e}`})}return{bandwidthFee:C(t.getTransactionFee)??gn,createAccountBandwidthFee:C(t.getCreateAccountFee)??_n,createAccountFee:C(t.getCreateNewAccountFeeInSystemContract)??Tn,energyFee:C(t.getEnergyFee)??mn,memoFee:C(t.getMemoFee)??wn}}async function nt(n){try{let t=await v("/wallet/getaccountresource",{address:n,visible:!0});return{bandwidth:{free:Q(t.freeNetLimit,t.freeNetUsed),staked:Q(t.NetLimit,t.NetUsed)},energy:Q(t.EnergyLimit,t.EnergyUsed)}}catch(t){return K({condition:!0,id:"tron_account_resources_failed",warning:`Failed to fetch account resources, assuming none available: ${t instanceof Error?t.message:t}`}),{bandwidth:{free:0,staked:0},energy:0}}}async function G(n,t={}){return await W(n,t)==="exists"}async function W(n,{timeoutMs:t}={}){if(!b(n))return"missing";try{let e=await v("/wallet/getaccount",{address:n,visible:!0},t);if(!e||typeof e!=="object"||Array.isArray(e)||tt(e))return"unknown";if(Et(e.address,n))return"exists";return Object.keys(e).length===0?"missing":"unknown"}catch{return"unknown"}}async function et(n){try{let t=await An({...n,ownerAddress:n.sender}),e=t.energy_required??t.energyRequired;if(t.result&&!t.result.result)throw new y("toolbox_tron_trongrid_api_error",{message:t.result.message||"estimateenergy failed"});if(e!==void 0){let r=ht(e);if(r!==void 0)return r;throw new y("toolbox_tron_trongrid_api_error",{message:"Invalid estimateenergy response"})}}catch(t){K({condition:!0,id:"tron_energy_estimation_failed",warning:`Failed to estimate energy with estimateenergy, falling back to triggerconstantcontract: ${t instanceof Error?t.message:t}`})}try{let{energy_used:t}=await Nt({...n,ownerAddress:n.sender}),e=ht(t);if(e!==void 0)return e;throw new y("toolbox_tron_trongrid_api_error",{message:"Invalid triggerconstantcontract energy response"})}catch(t){throw K({condition:!0,id:"tron_energy_estimation_fallback_failed",warning:`Failed to estimate energy: ${t instanceof Error?t.message:t}`}),new y("toolbox_tron_trongrid_api_error",{message:`Unable to estimate contract energy: ${t instanceof Error?t.message:t}`})}}async function Rt({assetAddress:n,owner:t,spender:e}){let r=R([{type:"address",value:t},{type:"address",value:e}]),o=(await Nt({contractAddress:n,functionSelector:"allowance(address,address)",ownerAddress:e,parameter:r})).constant_result?.[0];if(!o)return 0n;try{return BigInt(`0x${o}`)}catch{return 0n}}import{bytesToHex as In}from"@noble/hashes/utils.js";import{HDKey as Pn}from"@scure/bip32";import{mnemonicToSeedSync as Bn}from"@scure/bip39";import{AssetValue as B,Chain as x,derivationPathToString as Mt,getChainConfig as Cn,getRPCUrl as kn,NetworkDerivationPath as Lt,SwapKitError as _,updateDerivationPath as Kt,warnOnce as j}from"@swapkit/helpers";import{match as Dn,P as ot}from"ts-pattern";import{sha256 as En}from"@noble/hashes/sha2.js";import{bytesToHex as It,hexToBytes as Pt}from"@noble/hashes/utils.js";import{SwapKitError as P}from"@swapkit/helpers";var V=0,Bt=1,q=2,Ct=5,vn=8,Fn=10,Sn=18;function rt(n,t){let e=0n,r=0n,i=t;while(i<n.length&&i-t<10){let o=n[i++];if(o===void 0)break;if(e|=BigInt(o&127)<<r,r+=7n,(o&128)===0)return[e,i]}throw new P({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"Malformed varint in transaction raw_data"}})}function D(n){let t=[],e=n<0n?n+2n**64n:n;while(e>=128n)t.push(Number(e&0x7fn)|128),e>>=7n;return t.push(Number(e)),t}function H(n,t,e){let r=n.get(t);if(r)r.push(e);else n.set(t,[e])}function Nn(n){let t=new Map,e=0;while(e<n.length){let[r,i]=rt(n,e);e=i;let o=Number(r>>3n),c=Number(r&7n);if(c===V){let[m,T]=rt(n,e);e=T,H(t,o,{data:new Uint8Array(D(m)),wireType:V})}else if(c===q){let[m,T]=rt(n,e);e=T;let A=Number(m);if(A<0||e+A>n.length)throw new P({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"Length-delimited proto field overruns transaction raw_data"}});let U=n.slice(e,e+A);e+=A,H(t,o,{data:U,wireType:q})}else if(c===Bt){if(e+8>n.length)throw new P({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"64-bit proto field overruns transaction raw_data"}});let m=n.slice(e,e+8);e+=8,H(t,o,{data:m,wireType:Bt})}else if(c===Ct){if(e+4>n.length)throw new P({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"32-bit proto field overruns transaction raw_data"}});let m=n.slice(e,e+4);e+=4,H(t,o,{data:m,wireType:Ct})}else throw new P({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"Unsupported proto wire type in transaction raw_data"}})}return t}function Rn(n){let t=[];for(let[o,c]of[...n.entries()].sort(([m],[T])=>m-T))for(let{wireType:m,data:T}of c){let A=BigInt(o<<3|m);if(t.push(new Uint8Array(D(A))),m===q)t.push(new Uint8Array(D(BigInt(T.length))));t.push(T)}let e=t.reduce((o,c)=>o+c.length,0),r=new Uint8Array(e),i=0;for(let o of t)r.set(o,i),i+=o.length;return r}function kt(n,t){if(!n||n.length%2!==0)throw new P({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"Transaction raw_data_hex is empty or not byte-aligned"}});let e=Pt(n),r=Nn(e);if(t.expiration!==void 0)r.set(vn,[{data:new Uint8Array(D(BigInt(t.expiration))),wireType:V}]);if(t.data!==void 0)r.set(Fn,[{data:Pt(t.data),wireType:q}]);if(t.fee_limit!==void 0)r.set(Sn,[{data:new Uint8Array(D(BigInt(t.fee_limit))),wireType:V}]);let i=Rn(r),o=It(i),c=It(En(i));return{raw_data_hex:o,txID:c}}var Un=b,Mn=Cn(x.Tron).baseDecimal,Ln=64,Kn=67,On=139,Ot=211;function Dt(n){let t=1,e=n>>7n;while(e>0n)t+=1,e>>=7n;return t}var $t=65000,it=25000,at="TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",$n="115792089237316195423570985008687907853269984665640564039457584007913129639935",st=2500,X=(n)=>B.from({chain:x.Tron,fromBaseDecimal:Mn,value:n}),ct=(n,t)=>t?n.memoFee:0;function dt(n,t){let e=n;if(t){let r=J(t).length/2;e+=1+Dt(BigInt(r))+r}return e+1+Dt(BigInt(e))+Kn+Ln}function Gt({bandwidthFee:n,pools:t,requiredBytes:e}){return t.staked>=e||t.free>=e?0:e*n}function Wt({bandwidth:n={free:0,staked:0},chainParams:t,memo:e,recipientStatus:r}){let i=ct(t,e),o=t.createAccountFee+t.createAccountBandwidthFee,c=Gt({bandwidthFee:t.bandwidthFee,pools:n,requiredBytes:dt(On,e)});if(r==="exists")return c+i;if(r==="missing")return o+i;return Math.max(o,c)+i}async function Ht(n,t){let e=n||$t,r=t??(await I()).energyFee,i=e*r,o=Math.ceil(i*1.5);return Math.min(Math.max(o,1e7),150000000)}async function Vt({assetValue:n,memo:t,recipient:e,timeoutMs:r}){let[i,o]=await Promise.all([I({timeoutMs:r}),W(e,{timeoutMs:r})]);if(j({condition:n.chain!==x.Tron,id:"tron_conservative_fee_foreign_asset",warning:"Non-Tron asset passed to the Tron fee estimate; reserving the TRC-20 fee"}),n.chain===x.Tron&&n.isGasAsset)return X(Wt({chainParams:i,memo:t,recipientStatus:o}));let m=await Ht($t+(o==="exists"?0:it),i.energyFee),T=ct(i,t);return X(m+dt(Ot,t)*i.bandwidthFee+T)}async function Gn({assetValue:n,recipient:t,memo:e,timeoutMs:r=st}){return j({condition:!b(t),id:"tron_sweep_deduction_invalid_recipient",warning:"Invalid Tron sweep recipient; assuming the account needs activation"}),await Vt({assetValue:n,memo:e==null?void 0:String(e),recipient:t,timeoutMs:Number.isFinite(r)&&r>0?r:st})}function qt({phrase:n,derivationPath:t}){let e=Pn.fromMasterSeed(Bn(n)).derive(t);if(!e.privateKey)throw new _("toolbox_tron_no_signer");return In(e.privateKey)}function Wn(n,t){return{...n,value:String(t)}}function Hn(n,t){if(!t)return n;return{...n,data:t.startsWith("0x")?t:`0x${t}`}}function Vn({phrase:n,derivationPath:t,index:e}){let r=t||Mt(Kt(Lt[x.Tron],{index:e||0}));return qt({derivationPath:r,phrase:n})}function qn({phrase:n,derivationPath:t}){let e=qt({derivationPath:t,phrase:n}),r=pt(e);return{getAddress:()=>Promise.resolve(r),signTransaction:(i)=>{N(i);let o=yt({privateKey:e,txID:i.txID});return Promise.resolve({...i,signature:[o]})}}}function Ut({transaction:n,memo:t,expiration:e,feeLimit:r}){let i={},o={};if(r!==void 0&&n.raw_data)i.fee_limit=r,o.fee_limit=r;if(t){let T=J(t);i.data=T,o.data=T}if(e){let T=n.raw_data.expiration+e*1000;i.expiration=T,o.expiration=T}if(Object.keys(i).length===0)return n;let{raw_data_hex:c,txID:m}=kt(n.raw_data_hex,i);return{...n,raw_data:{...n.raw_data,...o},raw_data_hex:c,txID:m}}function jn(n={}){let t="index"in n?n.index||0:0,e=Mt("derivationPath"in n&&n.derivationPath?n.derivationPath:Kt(Lt[x.Tron],{index:t})),r,i=!1;function o(){if(i)return Promise.resolve(r);return r=Dn(n).with({phrase:ot.string},({phrase:a})=>qn({derivationPath:e,phrase:a})).with({signer:ot.not(ot.nullish)},({signer:a})=>a).otherwise(()=>{return}),i=!0,Promise.resolve(r)}async function c(){let a=await o();if(!a)throw new _("toolbox_tron_no_signer");return a.getAddress()}async function m({contractAddress:a,functionSelector:s,parameter:d,sender:u,memo:f,expiration:l,extraEnergy:g=0}){let w=await et({contractAddress:a,functionSelector:s,parameter:d,sender:u}),p=await Ht(w+g),h=await St({contractAddress:a,feeLimit:p,functionSelector:s,ownerAddress:u,parameter:d});return Ut({expiration:l,feeLimit:p,memo:f,transaction:h})}async function T(a){if(!b(a))return[B.from({chain:x.Tron})];try{let s=await O(a);if(!s)return[B.from({chain:x.Tron})];let d=[B.from({chain:x.Tron,fromBaseDecimal:6,value:String(s.balance)})],u=s.trc20?.find((f)=>(at in f));if(u){let f=u[at];d.push(B.from({asset:`TRON.USDT-${at}`,fromBaseDecimal:6,value:f}))}return d}catch(s){return j({condition:!0,id:"tron_toolbox_get_balance_failed",warning:`Tron API getBalance failed: ${s instanceof Error?s.message:s}`}),[B.from({chain:x.Tron})]}}async function A({recipient:a,assetValue:s,memo:d,expiration:u,sweep:f}){if(!b(a))throw new _("toolbox_tron_token_transfer_failed",{message:"invalid address"});let l=await o();if(!l)throw new _("toolbox_tron_no_signer");try{let g=await c(),w=await ft({assetValue:s,expiration:u,memo:d,recipient:a,sender:g,sweep:f}),p=await l.signTransaction(w),h=await k(p);if(!h)throw new _("toolbox_tron_token_transfer_failed",{message:"broadcast failed"});return h}catch(g){if(g instanceof _&&g.errorKey==="toolbox_sweep_amount_too_low")throw g;throw new _("toolbox_tron_token_transfer_failed",{message:g instanceof Error?g.message:String(g)})}}async function U({memo:a,recipient:s,senderAddress:d}){let[u,f,l]=await Promise.all([I(),W(s),nt(d)]);return X(Wt({bandwidth:l.bandwidth,chainParams:u,memo:a,recipientStatus:f}))}async function ut({assetValue:a,amountInBaseUnits:s=a.getBaseValue("string"),memo:d,recipient:u,senderAddress:f}){let l=a.address;if(!l)throw new _("toolbox_tron_invalid_token_identifier",{identifier:a.toString()});let[g,w,p,h]=await Promise.all([I(),G(u),nt(f),et({contractAddress:l,functionSelector:"transfer(address,uint256)",parameter:R([{type:"address",value:u},{type:"uint256",value:s}]),sender:f})]),F=h+(w?0:it),Y=Gt({bandwidthFee:g.bandwidthFee,pools:p.bandwidth,requiredBytes:dt(Ot,d)}),Zt=Math.max(0,F-p.energy)*g.energyFee,tn=ct(g,d);return X(Y+Zt+tn)}async function jt({assetValue:a,memo:s,recipient:d,sender:u}){let f=await o();try{let l=u?u:f?await c():void 0;if(!l)return Vt({assetValue:a,memo:s,recipient:d});return a.isGasAsset?U({memo:s,recipient:d,senderAddress:l}):ut({assetValue:a,memo:s,recipient:d,senderAddress:l})}catch(l){throw j({condition:!0,id:"tron_toolbox_fee_estimation_failed",warning:`Failed to calculate exact fee: ${l instanceof Error?l.message:l}`}),new _("toolbox_fee_estimation_failed",{chain:x.Tron,error:l})}}async function Xt({assetValue:a,memo:s,recipient:d,sender:u,sweep:f}){if(!f)return a.getBaseValue("bigint");let[l,g]=await Promise.all([O(u),U({memo:s,recipient:d,senderAddress:u})]),w=BigInt(l?.balance??0)-g.getBaseValue("bigint");if(w<=0n)throw new _({errorKey:"toolbox_sweep_amount_too_low",info:{amount:w.toString(),asset:a.toString()}});return w}async function Yt({assetValue:a,memo:s,recipient:d,sender:u,sweep:f}){if(!f)return a.getBaseValue("string");let l=a.address;if(!l)throw new _("toolbox_tron_invalid_token_identifier",{identifier:a.toString()});let g=await O(u),p=g?.trc20.find((Y)=>(l in Y))?.[l]??"0";if(BigInt(p)<=0n)throw new _({errorKey:"toolbox_sweep_amount_too_low",info:{asset:a.toString(),balance:p}});let h=await ut({amountInBaseUnits:p,assetValue:a,memo:s,recipient:d,senderAddress:u}),E=BigInt(g?.balance??0),F=h.getBaseValue("bigint");if(E<F)throw new _({errorKey:"toolbox_sweep_amount_too_low",info:{asset:a.toString(),nativeBalance:E.toString(),requiredNativeFee:F.toString()}});return p}async function ft({recipient:a,assetValue:s,memo:d,sender:u,expiration:f,sweep:l,recipientExists:g}){if(!b(a)||!b(u))throw new _("toolbox_tron_transaction_creation_failed",{message:"invalid address"});if(s.isGasAsset){let E=await Xt({assetValue:s,expiration:f,memo:d,recipient:a,sender:u,sweep:l});if(E>BigInt(Number.MAX_SAFE_INTEGER))throw new _({errorKey:"toolbox_tron_transaction_creation_failed",info:{amount:E.toString(),reason:`Native transfer amount exceeds the safe integer limit of ${Number.MAX_SAFE_INTEGER} SUN`}});let F=await Ft({amount:Number(E),from:u,to:a});return Ut({expiration:f,memo:d,transaction:F})}let w=s.address;if(!w)throw new _("toolbox_tron_invalid_token_identifier",{identifier:s.toString()});let p=await Yt({assetValue:s,expiration:f,memo:d,recipient:a,sender:u,sweep:l}),h=g??await G(a);return m({contractAddress:w,expiration:f,extraEnergy:h?0:it,functionSelector:"transfer(address,uint256)",memo:d,parameter:R([{type:"address",value:a},{type:"uint256",value:p}]),sender:u})}async function lt(a){N(a);let s=await o();if(!s)throw new _("toolbox_tron_no_signer");return s.signTransaction(a)}async function zt(a){let s=await lt(a);return k(s)}function gt({assetAddress:a,spenderAddress:s,from:d}){return Rt({assetAddress:a,owner:d,spender:s})}async function Jt({assetAddress:a,spenderAddress:s,from:d,amount:u}){let f=await gt({assetAddress:a,from:d,spenderAddress:s});if(!u)return f>0n;return f>=BigInt(u)}async function Qt({assetAddress:a,spenderAddress:s,amount:d,from:u}){if(!b(a)||!b(s))throw new _("toolbox_tron_approve_failed");let f=await o();if(!f)throw new _("toolbox_tron_no_signer");let l=u||await c(),g=d!==void 0?BigInt(d).toString():$n;try{let w=await m({contractAddress:a,functionSelector:"approve(address,uint256)",parameter:R([{type:"address",value:s},{type:"uint256",value:g}]),sender:l}),p=await f.signTransaction(w),h=await k(p);if(!h)throw new _("toolbox_tron_approve_failed");return h}catch(w){if(w instanceof _)throw w;throw new _("toolbox_tron_approve_failed",{error:w})}}return{approve:Qt,broadcastTransaction:k,createTransaction:ft,estimateTransactionFee:jt,getAddress:c,getApprovedAmount:gt,getBalance:T,getRpcUrl:()=>kn(x.Tron),isApproved:Jt,signAndBroadcastTransaction:zt,signTransaction:lt,transfer:A,validateAddress:b}}export{st as TRON_SWEEP_ESTIMATE_TIMEOUT_MS,G as checkTronAccountExists,Gn as estimateTronSweepDeduction,I as getTronChainParameters,Vn as getTronPrivateKeyFromMnemonic,jn as getTronToolbox,z as tronAddressToHex,Un as validateTronAddress,Hn as withTronTransactionData,Wn as withTronTransactionValue};
|
|
1
|
+
import"../../chunk-pz8xe0qj.js";import{hexToBytes as fn}from"@noble/hashes/utils.js";import{Chain as ln,getRPCUrlSync as gn,SwapKitError as y,warnOnce as K}from"@swapkit/helpers";import{secp256k1 as Tt}from"@noble/curves/secp256k1.js";import{sha256 as mt}from"@noble/hashes/sha2.js";import{keccak_256 as en}from"@noble/hashes/sha3.js";import{bytesToHex as N,hexToBytes as M}from"@noble/hashes/utils.js";import{createBase58check as rn}from"@scure/base";import{SwapKitError as wt}from"@swapkit/helpers";var L=rn(mt),pt=65,on=2n**256n;function b(n){if(typeof n!=="string")return!1;try{let t=L.decode(n);return t.length===21&&t[0]===pt}catch{return!1}}function z(n){return N(L.decode(n))}function an(n){return L.decode(n).slice(1)}function yt(n){let t=Tt.getPublicKey(M(n),!1),e=en(t.slice(1)).slice(-20),r=new Uint8Array(21);return r[0]=pt,r.set(e,1),L.encode(r)}function ht({txID:n,privateKey:t}){let e=Tt.sign(M(n),M(t),{format:"recovered",prehash:!1}),r=e[0]??0,i=N(e.slice(1,33)),o=N(e.slice(33,65)),c=(r+27).toString(16).padStart(2,"0");return i+o+c}function R({txID:n,raw_data_hex:t}){let e=N(mt(M(t)));if(n!==e)throw new wt("toolbox_tron_invalid_transaction_integrity",{expected:e,txID:n})}function sn(n){return`000000000000000000000000${N(an(n))}`}function cn(n){let t=typeof n==="bigint"?n:BigInt(n);if(t<0n||t>=on)throw new wt("toolbox_tron_invalid_token_identifier",{identifier:t.toString()});return t.toString(16).padStart(64,"0")}function I(n){return n.map(({type:t,value:e})=>t==="address"?sn(e):cn(BigInt(e))).join("")}function dn(n){return N(new TextEncoder().encode(n))}var un=/^0x(?:[0-9a-fA-F]{2})+$/;function J(n){return un.test(n)?n.slice(2):dn(n)}var xt="https://api.trongrid.io",_n=1000,Tn=1e5,mn=1e6,wn=420,pn=1e6,yn=30000,hn=2147483647;function At(){try{return gn(ln.Tron)}catch{return xt}}function Et(n){let t=n!==void 0&&Number.isFinite(n)&&n>0?Math.min(n,hn):yn,e=new AbortController,r=setTimeout(()=>e.abort(),t);return{cleanup:()=>clearTimeout(r),signal:e.signal}}function nt(n){if(!n||typeof n!=="object")return;let{Error:t}=n;return typeof t==="string"&&t.length>0?t:void 0}function Z(n){return!!n&&/balance is not sufficient|no OwnerAccount/i.test(n)}function bn(n){if(!n)return;if(n.length%2!==0||!/^[0-9a-f]+$/i.test(n))return n;try{let t=new TextDecoder().decode(fn(n));return/^[ -~]+$/.test(t)?t:n}catch{return n}}function vt(n,t){if(typeof n!=="string")return!1;if(n===t)return!0;try{return n.toLowerCase()===z(t).toLowerCase()}catch{return!1}}function tt(n){let t=typeof n==="number"?n:typeof n==="string"&&n.trim()!==""?Number(n):Number.NaN;return Number.isSafeInteger(t)&&t>=0?t:void 0}function k(n){let t=tt(n);return t!==void 0&&t>0?t:void 0}function Q(n,t){let e=tt(n),r=tt(t);if(n!==void 0&&e===void 0||t!==void 0&&r===void 0)return 0;return Math.max(0,(e??0)-(r??0))}async function F(n,t,e){let{signal:r,cleanup:i}=Et(e);try{let o=await fetch(`${At()}${n}`,{body:JSON.stringify(t),headers:{"Content-Type":"application/json"},method:"POST",signal:r});if(!o.ok)throw new y("toolbox_tron_trongrid_api_error",{message:`${o.status} ${o.statusText} on ${n}`});return await o.json()}finally{i()}}async function Ft(n,t,e){let{signal:r,cleanup:i}=Et(e);try{let o=await fetch(`${t??At()}${n}`,{headers:{"Content-Type":"application/json"},signal:r});if(!o.ok)throw new y("toolbox_tron_trongrid_api_error",{message:`${o.status} ${o.statusText} on ${n}`});return await o.json()}finally{i()}}async function O(n){if(!b(n))throw new y("toolbox_tron_trongrid_api_error",{address:n,message:"Invalid address"});try{let t=await Ft(`/v1/accounts/${n}`,xt);if(!(t.success&&t.data)||t.data.length===0)return;let e=t.data.find((r)=>vt(r.address,n));if(!e)return;return{balance:e.balance,trc20:e.trc20||[]}}catch(t){if(t instanceof y)throw t;throw new y("toolbox_tron_trongrid_api_error",{message:t instanceof Error?t.message:"Unknown error"})}}var xn="/wallet/createtransaction";async function St({from:n,to:t,amount:e}){let i=await F(xn,{amount:e,owner_address:n,to_address:t,visible:!0});if(!i.txID||!i.raw_data_hex||!i.raw_data){let _=nt(i);throw new y({errorKey:Z(_)?"toolbox_tron_insufficient_balance":"toolbox_tron_transaction_creation_failed",info:{error:_??"Node returned no transaction"}})}let c=i.raw_data?.contract?.[0]?.parameter?.value;if(c?.to_address!==t||c?.owner_address!==n||c?.amount!==e)throw new y({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"Node returned a transaction that does not match the requested transfer"}});return R(i),i}var An="/wallet/triggersmartcontract";async function Nt({ownerAddress:n,contractAddress:t,functionSelector:e,parameter:r,feeLimit:i,callValue:o=0}){let c=await F(An,{call_value:o,contract_address:t,fee_limit:i,function_selector:e,owner_address:n,parameter:r,visible:!0});if(!c.result?.result||!c.transaction?.txID||!c.transaction?.raw_data_hex){let A=nt(c),E=bn(c.result?.message);throw new y({errorKey:Z(A)||Z(E)?"toolbox_tron_insufficient_balance":"toolbox_tron_transaction_creation_failed",info:{code:c.result?.code,error:A??"Node returned no transaction",message:E}})}let m=c.transaction.raw_data?.contract?.[0]?.parameter?.value;if(m?.contract_address!==t||m?.owner_address!==n)throw new y({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"Node returned a transaction that does not match the requested contract call"}});return R(c.transaction),c.transaction}function Rt({ownerAddress:n,contractAddress:t,functionSelector:e,parameter:r}){return F("/wallet/triggerconstantcontract",{contract_address:t,function_selector:e,owner_address:n,parameter:r,visible:!0})}function En({ownerAddress:n,contractAddress:t,functionSelector:e,parameter:r}){return F("/wallet/estimateenergy",{contract_address:t,function_selector:e,owner_address:n,parameter:r,visible:!0})}function bt(n){let t=typeof n==="number"?n:typeof n==="string"?Number(n):Number.NaN;return Number.isFinite(t)&&t>0?t:void 0}async function D(n){try{let{result:t,txid:e}=await F("/wallet/broadcasttransaction",{raw_data:n.raw_data,raw_data_hex:n.raw_data_hex,signature:n.signature,txID:n.txID,visible:n.visible});if(!t||!e)throw new y("toolbox_tron_token_transfer_failed");return e}catch(t){throw new y("toolbox_tron_broadcast_failed",{error:t})}}async function P({timeoutMs:n}={}){let t={};try{let{chainParameter:e}=await Ft("/wallet/getchainparameters",void 0,n);for(let r of e)if(r&&typeof r.key==="string")t[r.key]=r.value}catch(e){K({condition:!0,id:"tron_chain_params_failed",warning:`Failed to fetch chain params, using defaults: ${e instanceof Error?e.message:e}`})}return{bandwidthFee:k(t.getTransactionFee)??_n,createAccountBandwidthFee:k(t.getCreateAccountFee)??Tn,createAccountFee:k(t.getCreateNewAccountFeeInSystemContract)??mn,energyFee:k(t.getEnergyFee)??wn,memoFee:k(t.getMemoFee)??pn}}async function et(n){try{let t=await F("/wallet/getaccountresource",{address:n,visible:!0});return{bandwidth:{free:Q(t.freeNetLimit,t.freeNetUsed),staked:Q(t.NetLimit,t.NetUsed)},energy:Q(t.EnergyLimit,t.EnergyUsed)}}catch(t){return K({condition:!0,id:"tron_account_resources_failed",warning:`Failed to fetch account resources, assuming none available: ${t instanceof Error?t.message:t}`}),{bandwidth:{free:0,staked:0},energy:0}}}async function G(n,t={}){return await W(n,t)==="exists"}async function W(n,{timeoutMs:t}={}){if(!b(n))return"missing";try{let e=await F("/wallet/getaccount",{address:n,visible:!0},t);if(!e||typeof e!=="object"||Array.isArray(e)||nt(e))return"unknown";if(vt(e.address,n))return"exists";return Object.keys(e).length===0?"missing":"unknown"}catch{return"unknown"}}async function rt(n){try{let t=await En({...n,ownerAddress:n.sender}),e=t.energy_required??t.energyRequired;if(t.result&&!t.result.result)throw new y("toolbox_tron_trongrid_api_error",{message:t.result.message||"estimateenergy failed"});if(e!==void 0){let r=bt(e);if(r!==void 0)return r;throw new y("toolbox_tron_trongrid_api_error",{message:"Invalid estimateenergy response"})}}catch(t){K({condition:!0,id:"tron_energy_estimation_failed",warning:`Failed to estimate energy with estimateenergy, falling back to triggerconstantcontract: ${t instanceof Error?t.message:t}`})}try{let{energy_used:t}=await Rt({...n,ownerAddress:n.sender}),e=bt(t);if(e!==void 0)return e;throw new y("toolbox_tron_trongrid_api_error",{message:"Invalid triggerconstantcontract energy response"})}catch(t){throw K({condition:!0,id:"tron_energy_estimation_fallback_failed",warning:`Failed to estimate energy: ${t instanceof Error?t.message:t}`}),new y("toolbox_tron_trongrid_api_error",{message:`Unable to estimate contract energy: ${t instanceof Error?t.message:t}`})}}async function It({assetAddress:n,owner:t,spender:e}){let r=I([{type:"address",value:t},{type:"address",value:e}]),o=(await Rt({contractAddress:n,functionSelector:"allowance(address,address)",ownerAddress:e,parameter:r})).constant_result?.[0];if(!o)return 0n;try{return BigInt(`0x${o}`)}catch{return 0n}}import{bytesToHex as Pn}from"@noble/hashes/utils.js";import{HDKey as Bn}from"@scure/bip32";import{mnemonicToSeedSync as Cn}from"@scure/bip39";import{AssetValue as C,Chain as x,derivationPathToString as Lt,getChainConfig as kn,getRPCUrl as Dn,NetworkDerivationPath as Kt,SwapKitError as T,updateDerivationPath as Ot,warnOnce as j}from"@swapkit/helpers";import{match as Un,P as at}from"ts-pattern";import{sha256 as vn}from"@noble/hashes/sha2.js";import{bytesToHex as Pt,hexToBytes as Bt}from"@noble/hashes/utils.js";import{SwapKitError as B}from"@swapkit/helpers";var V=0,Ct=1,q=2,kt=5,Fn=8,Sn=10,Nn=18;function ot(n,t){let e=0n,r=0n,i=t;while(i<n.length&&i-t<10){let o=n[i++];if(o===void 0)break;if(e|=BigInt(o&127)<<r,r+=7n,(o&128)===0)return[e,i]}throw new B({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"Malformed varint in transaction raw_data"}})}function U(n){let t=[],e=n<0n?n+2n**64n:n;while(e>=128n)t.push(Number(e&0x7fn)|128),e>>=7n;return t.push(Number(e)),t}function H(n,t,e){let r=n.get(t);if(r)r.push(e);else n.set(t,[e])}function Rn(n){let t=new Map,e=0;while(e<n.length){let[r,i]=ot(n,e);e=i;let o=Number(r>>3n),c=Number(r&7n);if(c===V){let[_,m]=ot(n,e);e=m,H(t,o,{data:new Uint8Array(U(_)),wireType:V})}else if(c===q){let[_,m]=ot(n,e);e=m;let A=Number(_);if(A<0||e+A>n.length)throw new B({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"Length-delimited proto field overruns transaction raw_data"}});let E=n.slice(e,e+A);e+=A,H(t,o,{data:E,wireType:q})}else if(c===Ct){if(e+8>n.length)throw new B({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"64-bit proto field overruns transaction raw_data"}});let _=n.slice(e,e+8);e+=8,H(t,o,{data:_,wireType:Ct})}else if(c===kt){if(e+4>n.length)throw new B({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"32-bit proto field overruns transaction raw_data"}});let _=n.slice(e,e+4);e+=4,H(t,o,{data:_,wireType:kt})}else throw new B({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"Unsupported proto wire type in transaction raw_data"}})}return t}function In(n){let t=[];for(let[o,c]of[...n.entries()].sort(([_],[m])=>_-m))for(let{wireType:_,data:m}of c){let A=BigInt(o<<3|_);if(t.push(new Uint8Array(U(A))),_===q)t.push(new Uint8Array(U(BigInt(m.length))));t.push(m)}let e=t.reduce((o,c)=>o+c.length,0),r=new Uint8Array(e),i=0;for(let o of t)r.set(o,i),i+=o.length;return r}function Dt(n,t){if(!n||n.length%2!==0)throw new B({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"Transaction raw_data_hex is empty or not byte-aligned"}});let e=Bt(n),r=Rn(e);if(t.expiration!==void 0)r.set(Fn,[{data:new Uint8Array(U(BigInt(t.expiration))),wireType:V}]);if(t.data!==void 0)r.set(Sn,[{data:Bt(t.data),wireType:q}]);if(t.fee_limit!==void 0)r.set(Nn,[{data:new Uint8Array(U(BigInt(t.fee_limit))),wireType:V}]);let i=In(r),o=Pt(i),c=Pt(vn(i));return{raw_data_hex:o,txID:c}}var Mn=b,Ln=kn(x.Tron).baseDecimal,Kn=64,On=67,$n=139,$t=211;function Ut(n){let t=1,e=n>>7n;while(e>0n)t+=1,e>>=7n;return t}var Gt=65000,st=25000,it="TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",Gn="115792089237316195423570985008687907853269984665640564039457584007913129639935",ct=2500,X=(n)=>C.from({chain:x.Tron,fromBaseDecimal:Ln,value:n}),dt=(n,t)=>t?n.memoFee:0;function ut(n,t){let e=n;if(t){let r=J(t).length/2;e+=1+Ut(BigInt(r))+r}return e+1+Ut(BigInt(e))+On+Kn}function Wt({bandwidthFee:n,pools:t,requiredBytes:e}){return t.staked>=e||t.free>=e?0:e*n}function Ht({bandwidth:n={free:0,staked:0},chainParams:t,memo:e,recipientStatus:r}){let i=dt(t,e),o=t.createAccountFee+t.createAccountBandwidthFee,c=Wt({bandwidthFee:t.bandwidthFee,pools:n,requiredBytes:ut($n,e)});if(r==="exists")return c+i;if(r==="missing")return o+i;return Math.max(o,c)+i}async function Vt(n,t){let e=n||Gt,r=t??(await P()).energyFee,i=e*r,o=Math.ceil(i*1.5);return Math.min(Math.max(o,1e7),150000000)}async function qt({assetValue:n,memo:t,recipient:e,timeoutMs:r}){let[i,o]=await Promise.all([P({timeoutMs:r}),W(e,{timeoutMs:r})]);if(j({condition:n.chain!==x.Tron,id:"tron_conservative_fee_foreign_asset",warning:"Non-Tron asset passed to the Tron fee estimate; reserving the TRC-20 fee"}),n.chain===x.Tron&&n.isGasAsset)return X(Ht({chainParams:i,memo:t,recipientStatus:o}));let _=await Vt(Gt+(o==="exists"?0:st),i.energyFee),m=dt(i,t);return X(_+ut($t,t)*i.bandwidthFee+m)}async function Wn({assetValue:n,recipient:t,memo:e,timeoutMs:r=ct}){return j({condition:!b(t),id:"tron_sweep_deduction_invalid_recipient",warning:"Invalid Tron sweep recipient; assuming the account needs activation"}),await qt({assetValue:n,memo:e==null?void 0:String(e),recipient:t,timeoutMs:Number.isFinite(r)&&r>0?r:ct})}function jt({phrase:n,derivationPath:t}){let e=Bn.fromMasterSeed(Cn(n)).derive(t);if(!e.privateKey)throw new T("toolbox_tron_no_signer");return Pn(e.privateKey)}function Hn(n,t){return{...n,value:String(t)}}function Vn(n,t){if(!t)return n;return{...n,data:t.startsWith("0x")?t:`0x${t}`}}function qn({phrase:n,derivationPath:t,index:e}){let r=t||Lt(Ot(Kt[x.Tron],{index:e||0}));return jt({derivationPath:r,phrase:n})}function jn({phrase:n,derivationPath:t}){let e=jt({derivationPath:t,phrase:n}),r=yt(e);return{getAddress:()=>Promise.resolve(r),signTransaction:(i)=>{R(i);let o=ht({privateKey:e,txID:i.txID});return Promise.resolve({...i,signature:[o]})}}}function Mt({transaction:n,memo:t,expiration:e,feeLimit:r}){let i={},o={};if(r!==void 0&&n.raw_data)i.fee_limit=r,o.fee_limit=r;if(t){let m=J(t);i.data=m,o.data=m}if(e){let m=n.raw_data.expiration+e*1000;i.expiration=m,o.expiration=m}if(Object.keys(i).length===0)return n;let{raw_data_hex:c,txID:_}=Dt(n.raw_data_hex,i);return{...n,raw_data:{...n.raw_data,...o},raw_data_hex:c,txID:_}}function Xn(n={}){let t="index"in n?n.index||0:0,e=Lt("derivationPath"in n&&n.derivationPath?n.derivationPath:Ot(Kt[x.Tron],{index:t})),r,i=!1;function o(){if(i)return Promise.resolve(r);return r=Un(n).with({phrase:at.string},({phrase:a})=>jn({derivationPath:e,phrase:a})).with({signer:at.not(at.nullish)},({signer:a})=>a).otherwise(()=>{return}),i=!0,Promise.resolve(r)}async function c(){let a=await o();if(!a)throw new T("toolbox_tron_no_signer");return a.getAddress()}async function _({contractAddress:a,functionSelector:s,parameter:d,sender:u,memo:f,expiration:l,extraEnergy:g=0}){let w=await rt({contractAddress:a,functionSelector:s,parameter:d,sender:u}),p=await Vt(w+g),h=await Nt({contractAddress:a,feeLimit:p,functionSelector:s,ownerAddress:u,parameter:d});return Mt({expiration:l,feeLimit:p,memo:f,transaction:h})}async function m(a){if(!b(a))return[C.from({chain:x.Tron})];try{let s=await O(a);if(!s)return[C.from({chain:x.Tron})];let d=[C.from({chain:x.Tron,fromBaseDecimal:6,value:String(s.balance)})],u=s.trc20?.find((f)=>(it in f));if(u){let f=u[it];d.push(C.from({asset:`TRON.USDT-${it}`,fromBaseDecimal:6,value:f}))}return d}catch(s){return j({condition:!0,id:"tron_toolbox_get_balance_failed",warning:`Tron API getBalance failed: ${s instanceof Error?s.message:s}`}),[C.from({chain:x.Tron})]}}async function A({recipient:a,assetValue:s,memo:d,expiration:u,sweep:f}){if(!b(a))throw new T("toolbox_tron_token_transfer_failed",{message:"invalid address"});let l=await o();if(!l)throw new T("toolbox_tron_no_signer");try{let g=await c(),w=await lt({assetValue:s,expiration:u,memo:d,recipient:a,sender:g,sweep:f}),p=await l.signTransaction(w),h=await D(p);if(!h)throw new T("toolbox_tron_token_transfer_failed",{message:"broadcast failed"});return h}catch(g){if(g instanceof T&&(g.errorKey==="toolbox_sweep_amount_too_low"||g.errorKey==="toolbox_tron_insufficient_balance"))throw g;throw new T("toolbox_tron_token_transfer_failed",{message:g instanceof Error?g.message:String(g)})}}async function E({memo:a,recipient:s,senderAddress:d}){let[u,f,l]=await Promise.all([P(),W(s),et(d)]);return X(Ht({bandwidth:l.bandwidth,chainParams:u,memo:a,recipientStatus:f}))}async function ft({assetValue:a,amountInBaseUnits:s=a.getBaseValue("string"),memo:d,recipient:u,senderAddress:f}){let l=a.address;if(!l)throw new T("toolbox_tron_invalid_token_identifier",{identifier:a.toString()});let[g,w,p,h]=await Promise.all([P(),G(u),et(f),rt({contractAddress:l,functionSelector:"transfer(address,uint256)",parameter:I([{type:"address",value:u},{type:"uint256",value:s}]),sender:f})]),S=h+(w?0:st),Y=Wt({bandwidthFee:g.bandwidthFee,pools:p.bandwidth,requiredBytes:ut($t,d)}),tn=Math.max(0,S-p.energy)*g.energyFee,nn=dt(g,d);return X(Y+tn+nn)}async function Xt({assetValue:a,memo:s,recipient:d,sender:u}){let f=await o();try{let l=u?u:f?await c():void 0;if(!l)return qt({assetValue:a,memo:s,recipient:d});return a.isGasAsset?E({memo:s,recipient:d,senderAddress:l}):ft({assetValue:a,memo:s,recipient:d,senderAddress:l})}catch(l){throw j({condition:!0,id:"tron_toolbox_fee_estimation_failed",warning:`Failed to calculate exact fee: ${l instanceof Error?l.message:l}`}),new T("toolbox_fee_estimation_failed",{chain:x.Tron,error:l})}}async function Yt({assetValue:a,memo:s,recipient:d,sender:u,sweep:f}){if(!f)return a.getBaseValue("bigint");let[l,g]=await Promise.all([O(u),E({memo:s,recipient:d,senderAddress:u})]),w=BigInt(l?.balance??0)-g.getBaseValue("bigint");if(w<=0n)throw new T({errorKey:"toolbox_sweep_amount_too_low",info:{amount:w.toString(),asset:a.toString()}});return w}async function zt({assetValue:a,memo:s,recipient:d,sender:u,sweep:f}){if(!f)return a.getBaseValue("string");let l=a.address;if(!l)throw new T("toolbox_tron_invalid_token_identifier",{identifier:a.toString()});let g=await O(u),p=g?.trc20.find((Y)=>(l in Y))?.[l]??"0";if(BigInt(p)<=0n)throw new T({errorKey:"toolbox_sweep_amount_too_low",info:{asset:a.toString(),balance:p}});let h=await ft({amountInBaseUnits:p,assetValue:a,memo:s,recipient:d,senderAddress:u}),v=BigInt(g?.balance??0),S=h.getBaseValue("bigint");if(v<S)throw new T({errorKey:"toolbox_sweep_amount_too_low",info:{asset:a.toString(),nativeBalance:v.toString(),requiredNativeFee:S.toString()}});return p}async function lt({recipient:a,assetValue:s,memo:d,sender:u,expiration:f,sweep:l,recipientExists:g}){if(!b(a)||!b(u))throw new T("toolbox_tron_transaction_creation_failed",{message:"invalid address"});if(s.isGasAsset){let v=await Yt({assetValue:s,expiration:f,memo:d,recipient:a,sender:u,sweep:l});if(v>BigInt(Number.MAX_SAFE_INTEGER))throw new T({errorKey:"toolbox_tron_transaction_creation_failed",info:{amount:v.toString(),reason:`Native transfer amount exceeds the safe integer limit of ${Number.MAX_SAFE_INTEGER} SUN`}});let S=await St({amount:Number(v),from:u,to:a});return Mt({expiration:f,memo:d,transaction:S})}let w=s.address;if(!w)throw new T("toolbox_tron_invalid_token_identifier",{identifier:s.toString()});let p=await zt({assetValue:s,expiration:f,memo:d,recipient:a,sender:u,sweep:l}),h=g??await G(a);return _({contractAddress:w,expiration:f,extraEnergy:h?0:st,functionSelector:"transfer(address,uint256)",memo:d,parameter:I([{type:"address",value:a},{type:"uint256",value:p}]),sender:u})}async function gt(a){R(a);let s=await o();if(!s)throw new T("toolbox_tron_no_signer");return s.signTransaction(a)}async function Jt(a){let s=await gt(a);return D(s)}function _t({assetAddress:a,spenderAddress:s,from:d}){return It({assetAddress:a,owner:d,spender:s})}async function Qt({assetAddress:a,spenderAddress:s,from:d,amount:u}){let f=await _t({assetAddress:a,from:d,spenderAddress:s});if(!u)return f>0n;return f>=BigInt(u)}async function Zt({assetAddress:a,spenderAddress:s,amount:d,from:u}){if(!b(a)||!b(s))throw new T("toolbox_tron_approve_failed");let f=await o();if(!f)throw new T("toolbox_tron_no_signer");let l=u||await c(),g=d!==void 0?BigInt(d).toString():Gn;try{let w=await _({contractAddress:a,functionSelector:"approve(address,uint256)",parameter:I([{type:"address",value:s},{type:"uint256",value:g}]),sender:l}),p=await f.signTransaction(w),h=await D(p);if(!h)throw new T("toolbox_tron_approve_failed");return h}catch(w){if(w instanceof T)throw w;throw new T("toolbox_tron_approve_failed",{error:w})}}return{approve:Zt,broadcastTransaction:D,createTransaction:lt,estimateTransactionFee:Xt,getAddress:c,getApprovedAmount:_t,getBalance:m,getRpcUrl:()=>Dn(x.Tron),isApproved:Qt,signAndBroadcastTransaction:Jt,signTransaction:gt,transfer:A,validateAddress:b}}export{ct as TRON_SWEEP_ESTIMATE_TIMEOUT_MS,G as checkTronAccountExists,Wn as estimateTronSweepDeduction,P as getTronChainParameters,qn as getTronPrivateKeyFromMnemonic,Xn as getTronToolbox,z as tronAddressToHex,Mn as validateTronAddress,Vn as withTronTransactionData,Hn as withTronTransactionValue};
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"dependencies": { "@swapkit/helpers": "6.4.
|
|
2
|
+
"dependencies": { "@swapkit/helpers": "6.4.1", "@swapkit/utxo-signer": "3.2.0" },
|
|
3
3
|
"description": "SwapKit - Toolboxes",
|
|
4
4
|
"devDependencies": {
|
|
5
5
|
"@aptos-labs/ts-sdk": "7.0.1",
|
|
@@ -133,5 +133,5 @@
|
|
|
133
133
|
"type-check:go": "tsgo"
|
|
134
134
|
},
|
|
135
135
|
"type": "module",
|
|
136
|
-
"version": "6.5.
|
|
136
|
+
"version": "6.5.1"
|
|
137
137
|
}
|