@swapkit/toolboxes 5.4.2 → 6.0.0
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 +15 -0
- package/dist/{chunk-4428244x.js → chunk-exyqap7m.js} +1 -1
- package/dist/chunk-ncc6qmj6.js +1 -0
- package/dist/{chunk-as9fracn.js → chunk-xdkdc1f0.js} +1 -1
- package/dist/{chunk-rn33j2bm.js → chunk-ygq25ce3.js} +2 -2
- package/dist/src/aleo/index.js +1 -1
- package/dist/src/aptos/index.js +1 -1
- package/dist/src/cardano/index.js +1 -1
- package/dist/src/cosmos/index.js +1 -1
- package/dist/src/evm/index.js +1 -1
- package/dist/src/hypercore/index.js +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/near/index.js +1 -1
- package/dist/src/radix/index.js +1 -1
- package/dist/src/ripple/index.js +1 -1
- package/dist/src/solana/index.js +1 -1
- package/dist/src/starknet/index.js +1 -1
- package/dist/src/stellar/index.js +1 -1
- package/dist/src/substrate/index.js +1 -1
- package/dist/src/sui/index.js +1 -1
- package/dist/src/ton/index.js +1 -1
- package/dist/src/tron/index.js +1 -1
- package/dist/src/utxo/index.js +1 -1
- package/dist/types/cosmos/types.d.ts +0 -1
- package/dist/types/evm/toolbox/baseEVMToolbox.d.ts +1 -0
- package/dist/types/evm/toolbox/op.d.ts +8 -0
- package/dist/types/near/toolbox.d.ts +0 -2
- package/dist/types/near/types/toolbox.d.ts +0 -2
- package/dist/types/utxo/__tests__/fixtures/utxo.d.ts +6 -5
- package/dist/types/utxo/helpers/addressType.d.ts +8 -0
- package/dist/types/utxo/helpers/network.d.ts +4 -0
- package/dist/types/utxo/helpers/scriptTypes.d.ts +40 -0
- package/dist/types/utxo/helpers/txSize.d.ts +7 -6
- package/dist/types/utxo/helpers/xpubDerivation.d.ts +4 -2
- package/dist/types/utxo/index.d.ts +1 -1
- package/dist/types/utxo/toolbox/bitcoinCash.d.ts +5 -8
- package/dist/types/utxo/toolbox/index.d.ts +3 -7
- package/dist/types/utxo/toolbox/params.d.ts +24 -19
- package/dist/types/utxo/toolbox/utxo.d.ts +51 -36
- package/dist/types/utxo/toolbox/validators.d.ts +1 -2
- package/dist/types/utxo/toolbox/zcash.d.ts +6 -8
- package/dist/types/utxo/types.d.ts +4 -1
- package/package.json +2 -2
- package/dist/chunk-dssawneq.js +0 -1
package/dist/src/ripple/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ha as U}from"../../chunk-4428244x.js";import{AssetValue as T,Chain as g,derivationPathToString as oe,getChainConfig as E,getRPCUrl as se,resolveDerivationPath as ae,SwapKitError as l}from"@swapkit/helpers";import{isValidClassicAddress as ce,isValidXAddress as L}from"ripple-address-codec";import{match as z,P as F}from"ts-pattern";import{SwapKitError as te}from"@swapkit/helpers";function D(e){return/^[0-9A-Fa-f]{40}$/.test(e)}function b(e){if(D(e))return e.toUpperCase();if(e.length<=3){let a=Buffer.from(e.padEnd(3,"\x00")).toString("hex");return`00${"0".repeat(22)}${a}${"0".repeat(10)}`.toUpperCase()}let r=Buffer.from(e).toString("hex").toUpperCase();if(r.length>40)throw new te({errorKey:"toolbox_ripple_asset_not_supported",info:{asset:e,reason:"Currency exceeds maximum length (20 bytes)"}});return r.padEnd(40,"0")}function me(e){if(!D(e))return e;if(e.toUpperCase().startsWith("00")){let r=e.slice(24,30);try{let a=Buffer.from(r,"hex").toString("ascii").replace(/\0/g,"");if(/^[A-Za-z0-9?!@#$%^&*<>(){}[\]|]+$/.test(a)&&a.length>0)return a}catch{}return e.toUpperCase()}try{let r=e.replace(/0+$/,""),a=r.length%2===0?r:`${r}0`,u=Buffer.from(a,"hex").toString("utf8");if(/^[\x20-\x7E]+$/.test(u))return u}catch{}return e.toUpperCase()}function R(e){if(D(e))return e.toUpperCase();if(e.length<=3)return e;return b(e)}import{RequestClient as re,warnOnce as ie}from"@swapkit/helpers";var N=[{currency:"USD",decimals:15,domain:"circle.com",issuer:"rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",name:"Circle USDC",verified:!0},{currency:"RLUSD",decimals:15,domain:"ripple.com",issuer:"rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De",name:"Ripple USD",verified:!0},{currency:"USD",decimals:15,domain:"bitstamp.net",issuer:"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",name:"Bitstamp USD",verified:!0},{currency:"BTC",decimals:15,domain:"bitstamp.net",issuer:"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",name:"Bitstamp BTC",verified:!0},{currency:"EUR",decimals:15,domain:"bitstamp.net",issuer:"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",name:"Bitstamp EUR",verified:!0},{currency:"USD",decimals:15,domain:"gatehub.net",issuer:"rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq",name:"GateHub USD",verified:!0},{currency:"EUR",decimals:15,domain:"gatehub.net",issuer:"rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq",name:"GateHub EUR",verified:!0},{currency:"BTC",decimals:15,domain:"gatehub.net",issuer:"rchGBxcD1A1C2tdxF6papQYZ8kjRKMYcL",name:"GateHub BTC",verified:!0},{currency:"ETH",decimals:15,domain:"gatehub.net",issuer:"rcA8X3TVMST1n3CJeAdGk1RdRCHii7N2h",name:"GateHub ETH",verified:!0},{currency:"SOLO",decimals:15,domain:"sologenic.com",issuer:"rsoLo2S1kiGeCcn6hCUXVrCpGMWLrRrLZz",name:"Sologenic",verified:!0}];async function be(e,r){let a=R(e),u=N.find((p)=>R(p.currency)===a&&p.issuer===r);if(u)return u;try{let p=await re.get(`https://api.xrplmeta.org/token/${e}:${r}`);if(p)return{currency:e,decimals:15,description:p.desc,domain:p.domain,icon:p.icon,issuer:r,name:p.name,verified:p.self_assessment?.is_regulated||p.self_assessment?.is_licensed}}catch(p){ie({condition:!0,id:`xrpl_token_lookup_${e}_${r}`,warning:`Failed to fetch XRPL token info for ${e}:${r}: ${p}`})}return{currency:e,decimals:15,issuer:r,verified:!1}}function ye(e){return N.filter((r)=>r.issuer===e)}function he(e,r){let a=R(e);return N.some((u)=>R(u.currency)===a&&u.issuer===r)}var ue={ACCOUNT_NOT_FOUND:19};function q(e){if(typeof e!=="object"||e===null||!("data"in e))return!1;let{data:r}=e;return typeof r==="object"&&r!==null&&"error_code"in r&&r.error_code===ue.ACCOUNT_NOT_FOUND}var k={tecFROZEN:"tecFROZEN",tecNO_AUTH:"tecNO_AUTH",tecNO_DST:"tecNO_DST",tecNO_LINE:"tecNO_LINE",tecPATH_DRY:"tecPATH_DRY",tecUNFUNDED_OFFER:"tecUNFUNDED_OFFER"};function W(e){let r=e.match(/^XRP\.([A-Fa-f0-9]{40}|[\x20-\x7E]{1,20})-([a-zA-Z0-9]{25,34})$/);if(!r?.[1]||!r?.[2])return null;if(!S(r[2]))return null;return{currency:r[1],issuer:r[2]}}function le(e,r){return`${g.Ripple}.${e}-${r}`}async function H(e){if(e.isGasAsset){let{xrpToDrops:a}=await import("xrpl");return a(e.getValue("string"))}let r=W(e.toString());if(!r)throw new l({errorKey:"toolbox_ripple_asset_not_supported",info:{asset:e.toString()}});return{currency:r.currency,issuer:r.issuer,value:e.getValue("string")}}function pe({fee:e,lastLedgerSequence:r,sequence:a,transaction:u}){return a!==void 0&&e!==void 0&&r!==void 0&&!L(u.Account)&&!L(u.Destination)}function X(e,r){let a,u=()=>(a??=import("xrpl").then(({Wallet:p})=>p.fromMnemonic(e,r?{derivationPath:r}:void 0)),a);return{getAddress:async()=>(await u()).address,signTransaction:async(p)=>(await u()).sign(p)}}function S(e){return ce(e)||L(e)}function Ce(e={}){let r;async function a(){if(r)return r;return r=await z(e).with({phrase:F.string},({phrase:n,derivationPath:t,index:i=0})=>X(n,oe(ae({chain:g.Ripple,derivationPath:t,index:i})))).with({signer:F.any},({signer:n})=>n).otherwise(()=>{return}),r}let u;async function p(){let n=await se(g.Ripple);if(!n)throw new l({errorKey:"toolbox_ripple_rpc_not_configured",info:{chain:g.Ripple}});let{Client:t}=await import("xrpl"),i=new t(n);return await i.connect(),i}async function w(){if(u){let n=await u.catch(()=>null);if(n?.isConnected())return n}return u=p(),u}async function G(n){let t=await n.request({command:"server_state"}),i=t.result.state.validated_ledger??t.result.state.closed_ledger;if(!i||!Number.isSafeInteger(i.reserve_base)||i.reserve_base<0||!Number.isSafeInteger(i.reserve_inc)||i.reserve_inc<0)throw new l({errorKey:"toolbox_ripple_get_balance_error",info:{reason:"XRPL reserve data is unavailable or invalid"}});return{baseReserveDrops:BigInt(i.reserve_base),ownerReserveDrops:BigInt(i.reserve_inc)}}let y=async()=>{let n=await a();if(!n)throw new l({errorKey:"toolbox_ripple_signer_not_found"});return n.getAddress()},M=async(n)=>{let t=n||await y(),{baseDecimal:i}=E(g.Ripple),s=await w();try{let[o,c]=await Promise.all([s.request({account:t,command:"account_info"}),s.request({account:t,command:"account_lines"})]),d=o.result.account_data.Balance,f=[T.from({chain:g.Ripple,fromBaseDecimal:i,value:d})];for(let m of c.result.lines){let _=le(m.currency,m.account);if(Number.parseFloat(m.balance)!==0)f.push(T.from({asset:_,asyncTokenLookup:!1,value:m.balance}))}return f}catch(o){if(q(o))return[T.from({chain:g.Ripple,value:0})];throw new l({errorKey:"toolbox_ripple_get_balance_error",info:{address:t,error:o}})}},B=async()=>{let{baseDecimal:n}=E(g.Ripple),s=(await(await w()).request({command:"fee"})).result.drops.open_ledger_fee;return T.from({chain:g.Ripple,fromBaseDecimal:n,value:s})};async function O(n){let t=n||await y(),i=await w();try{return(await i.request({account:t,command:"account_lines"})).result.lines.map((o)=>({account:o.account,authorized:o.authorized??!1,balance:o.balance,currency:o.currency,freeze:o.freeze??!1,freezePeer:o.freeze_peer??!1,limit:o.limit,limitPeer:o.limit_peer,noRipple:o.no_ripple??!1,noRipplePeer:o.no_ripple_peer??!1,peerAuthorized:o.peer_authorized??!1,qualityIn:o.quality_in??0,qualityOut:o.quality_out??0}))}catch(s){if(q(s))return[];throw new l({errorKey:"toolbox_ripple_get_trust_lines_error",info:{address:t,error:s}})}}async function Z({address:n,currency:t,issuer:i}){let s=await O(n),o=b(t);return s.some((c)=>b(c.currency)===o&&c.account===i)}async function K({currency:n,issuer:t,limit:i,sender:s}){let o=s||await y();if(!S(t))throw new l({errorKey:"core_transaction_invalid_recipient_address",info:{address:t}});let c=Number.parseFloat(i);if(Number.isNaN(c)||c<0)throw new l({errorKey:"toolbox_ripple_invalid_trust_line_limit",info:{limit:i}});let d=await w(),f={Account:o,LimitAmount:{currency:n,issuer:t,value:i},TransactionType:"TrustSet"};return d.autofill(f)}async function V(n,t){let[i,s,o]=await Promise.all([n.request({account:t,command:"account_info"}),G(n),B()]),{Balance:c,OwnerCount:d}=i.result.account_data,f=o.getBaseValue("bigint"),m=BigInt(c)-s.baseReserveDrops-BigInt(d)*s.ownerReserveDrops-f;if(m<=0n)throw new l({errorKey:"toolbox_sweep_amount_too_low",info:{asset:g.Ripple,balance:c,baseReserve:s.baseReserveDrops.toString(),fee:f.toString(),ownerCount:d,ownerReserve:s.ownerReserveDrops.toString()}});let{baseDecimal:_}=E(g.Ripple),h=T.from({chain:g.Ripple,fromBaseDecimal:_,value:m.toString()});return{amount:await H(h),fee:f.toString()}}async function j(n,t){let i=W(n.toString());if(!i)throw new l({errorKey:"toolbox_ripple_asset_not_supported",info:{asset:n.toString()}});let s=await w(),o="0",c;while(!0){let d=await s.request({account:t,command:"account_lines",peer:i.issuer,...c!==void 0&&{marker:c}}),f=d.result.lines.find((_)=>_.account===i.issuer&&b(_.currency)===b(i.currency));if(f){o=f.balance;break}let m=d.result.marker;if(m===void 0||m===null)break;c=m}if(!Number.isFinite(Number(o))||Number(o)<=0)throw new l({errorKey:"toolbox_sweep_amount_too_low",info:{asset:n.toString(),balance:o}});return{currency:i.currency,issuer:i.issuer,value:o}}async function I({assetValue:n,recipient:t,memo:i,sender:s,sweep:o,destinationTag:c,extendBySeconds:d=150,sequence:f,fee:m,lastLedgerSequence:_}){if(!S(t))throw new l({errorKey:"core_transaction_invalid_recipient_address"});let h=s||await y();if(n.chain!==g.Ripple)throw new l({errorKey:"toolbox_ripple_asset_not_supported",info:{asset:n.toString()}});let A=o&&n.isGasAsset?await V(await w(),h):void 0,ne=A?A.amount:o?await j(n,h):await H(n),C={Account:h,Amount:ne,Destination:t,TransactionType:"Payment",...A&&{Fee:A.fee},...c!==void 0&&{DestinationTag:c},...f!==void 0&&{Sequence:f},...m!==void 0&&{Fee:m},..._!==void 0&&{LastLedgerSequence:_}};if(i)C.Memos=[{Memo:{MemoData:Buffer.from(i).toString("hex")}}];if(pe({fee:m,lastLedgerSequence:_,sequence:f,transaction:C}))return C;let P=await(await w()).autofill(C);if(_===void 0&&P.LastLedgerSequence&&d>0)P.LastLedgerSequence+=Math.ceil(d/4);return P}async function x(n){let t=await a();if(!t)throw new l({errorKey:"toolbox_ripple_signer_not_found"});return t.signTransaction(n)}async function v(n){let i=await(await w()).submitAndWait(n),{result:s}=i;if(s.validated)return s.hash;let o=s.meta?.TransactionResult,c=z(o).with(k.tecNO_LINE,()=>"No trust line exists for this token").with(k.tecPATH_DRY,()=>"Payment path could not deliver funds").with(k.tecFROZEN,()=>"Token is frozen").otherwise(()=>{return});throw new l({errorKey:"toolbox_ripple_broadcast_error",info:{chain:g.Ripple,...c?{reason:c}:{txResult:o}}})}let Y=async(n)=>{try{let t=await x(n);return v(t.tx_blob)}catch(t){if(t instanceof l)throw t;throw new l({errorKey:"toolbox_ripple_broadcast_error",info:{chain:g.Ripple,error:t}})}};async function J({assetValue:n,memo:t,recipient:i,sweep:s}){let o=await a();if(!o)throw new l({errorKey:"toolbox_ripple_signer_not_found"});let c=await o.getAddress(),d=await I({assetValue:n,memo:t,recipient:i,sender:c,sweep:s}),f=await x(d);return v(f.tx_blob)}async function Q(n){let t=await a();if(!t)throw new l({errorKey:"toolbox_ripple_signer_not_found"});let i=await t.getAddress(),s=await K({...n,sender:i}),o=await x(s);return v(o.tx_blob)}function ee(){let n=u;if(u=null,n)n.then((t)=>{if(t?.isConnected())return t.disconnect();return}).catch((t)=>{console.warn("XRPL Cleanup failed silently:",t)})}return{broadcastTransaction:v,createSigner:X,createTransaction:I,disconnect:ee,estimateTransactionFee:B,getAddress:y,getBalance:M,getTrustLines:O,hasTrustLine:Z,setTrustLine:K,setTrustLineAndBroadcast:Q,signAndBroadcastTransaction:Y,signTransaction:x,transfer:J,validateAddress:S}}export{N as XRPL_KNOWN_TOKENS,k as XRPL_TOKEN_ERROR_CODES,b as currencyToHex,le as formatXrplTokenIdentifier,ye as getKnownTokensByIssuer,Ce as getRippleToolbox,be as getXrplTokenInfo,me as hexToCurrency,D as isHexCurrency,he as isKnownToken,R as normalizeCurrency,W as parseXrplTokenIdentifier,S as validateRippleAddress};
|
|
1
|
+
import{ja as U}from"../../chunk-exyqap7m.js";import{AssetValue as T,Chain as g,derivationPathToString as oe,getChainConfig as E,getRPCUrl as se,resolveDerivationPath as ae,SwapKitError as l}from"@swapkit/helpers";import{isValidClassicAddress as ce,isValidXAddress as L}from"ripple-address-codec";import{match as z,P as F}from"ts-pattern";import{SwapKitError as te}from"@swapkit/helpers";function D(e){return/^[0-9A-Fa-f]{40}$/.test(e)}function b(e){if(D(e))return e.toUpperCase();if(e.length<=3){let a=Buffer.from(e.padEnd(3,"\x00")).toString("hex");return`00${"0".repeat(22)}${a}${"0".repeat(10)}`.toUpperCase()}let r=Buffer.from(e).toString("hex").toUpperCase();if(r.length>40)throw new te({errorKey:"toolbox_ripple_asset_not_supported",info:{asset:e,reason:"Currency exceeds maximum length (20 bytes)"}});return r.padEnd(40,"0")}function me(e){if(!D(e))return e;if(e.toUpperCase().startsWith("00")){let r=e.slice(24,30);try{let a=Buffer.from(r,"hex").toString("ascii").replace(/\0/g,"");if(/^[A-Za-z0-9?!@#$%^&*<>(){}[\]|]+$/.test(a)&&a.length>0)return a}catch{}return e.toUpperCase()}try{let r=e.replace(/0+$/,""),a=r.length%2===0?r:`${r}0`,u=Buffer.from(a,"hex").toString("utf8");if(/^[\x20-\x7E]+$/.test(u))return u}catch{}return e.toUpperCase()}function R(e){if(D(e))return e.toUpperCase();if(e.length<=3)return e;return b(e)}import{RequestClient as re,warnOnce as ie}from"@swapkit/helpers";var N=[{currency:"USD",decimals:15,domain:"circle.com",issuer:"rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",name:"Circle USDC",verified:!0},{currency:"RLUSD",decimals:15,domain:"ripple.com",issuer:"rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De",name:"Ripple USD",verified:!0},{currency:"USD",decimals:15,domain:"bitstamp.net",issuer:"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",name:"Bitstamp USD",verified:!0},{currency:"BTC",decimals:15,domain:"bitstamp.net",issuer:"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",name:"Bitstamp BTC",verified:!0},{currency:"EUR",decimals:15,domain:"bitstamp.net",issuer:"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",name:"Bitstamp EUR",verified:!0},{currency:"USD",decimals:15,domain:"gatehub.net",issuer:"rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq",name:"GateHub USD",verified:!0},{currency:"EUR",decimals:15,domain:"gatehub.net",issuer:"rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq",name:"GateHub EUR",verified:!0},{currency:"BTC",decimals:15,domain:"gatehub.net",issuer:"rchGBxcD1A1C2tdxF6papQYZ8kjRKMYcL",name:"GateHub BTC",verified:!0},{currency:"ETH",decimals:15,domain:"gatehub.net",issuer:"rcA8X3TVMST1n3CJeAdGk1RdRCHii7N2h",name:"GateHub ETH",verified:!0},{currency:"SOLO",decimals:15,domain:"sologenic.com",issuer:"rsoLo2S1kiGeCcn6hCUXVrCpGMWLrRrLZz",name:"Sologenic",verified:!0}];async function be(e,r){let a=R(e),u=N.find((p)=>R(p.currency)===a&&p.issuer===r);if(u)return u;try{let p=await re.get(`https://api.xrplmeta.org/token/${e}:${r}`);if(p)return{currency:e,decimals:15,description:p.desc,domain:p.domain,icon:p.icon,issuer:r,name:p.name,verified:p.self_assessment?.is_regulated||p.self_assessment?.is_licensed}}catch(p){ie({condition:!0,id:`xrpl_token_lookup_${e}_${r}`,warning:`Failed to fetch XRPL token info for ${e}:${r}: ${p}`})}return{currency:e,decimals:15,issuer:r,verified:!1}}function ye(e){return N.filter((r)=>r.issuer===e)}function he(e,r){let a=R(e);return N.some((u)=>R(u.currency)===a&&u.issuer===r)}var ue={ACCOUNT_NOT_FOUND:19};function q(e){if(typeof e!=="object"||e===null||!("data"in e))return!1;let{data:r}=e;return typeof r==="object"&&r!==null&&"error_code"in r&&r.error_code===ue.ACCOUNT_NOT_FOUND}var k={tecFROZEN:"tecFROZEN",tecNO_AUTH:"tecNO_AUTH",tecNO_DST:"tecNO_DST",tecNO_LINE:"tecNO_LINE",tecPATH_DRY:"tecPATH_DRY",tecUNFUNDED_OFFER:"tecUNFUNDED_OFFER"};function W(e){let r=e.match(/^XRP\.([A-Fa-f0-9]{40}|[\x20-\x7E]{1,20})-([a-zA-Z0-9]{25,34})$/);if(!r?.[1]||!r?.[2])return null;if(!S(r[2]))return null;return{currency:r[1],issuer:r[2]}}function le(e,r){return`${g.Ripple}.${e}-${r}`}async function H(e){if(e.isGasAsset){let{xrpToDrops:a}=await import("xrpl");return a(e.getValue("string"))}let r=W(e.toString());if(!r)throw new l({errorKey:"toolbox_ripple_asset_not_supported",info:{asset:e.toString()}});return{currency:r.currency,issuer:r.issuer,value:e.getValue("string")}}function pe({fee:e,lastLedgerSequence:r,sequence:a,transaction:u}){return a!==void 0&&e!==void 0&&r!==void 0&&!L(u.Account)&&!L(u.Destination)}function X(e,r){let a,u=()=>(a??=import("xrpl").then(({Wallet:p})=>p.fromMnemonic(e,r?{derivationPath:r}:void 0)),a);return{getAddress:async()=>(await u()).address,signTransaction:async(p)=>(await u()).sign(p)}}function S(e){return ce(e)||L(e)}function Ce(e={}){let r;async function a(){if(r)return r;return r=await z(e).with({phrase:F.string},({phrase:n,derivationPath:t,index:i=0})=>X(n,oe(ae({chain:g.Ripple,derivationPath:t,index:i})))).with({signer:F.any},({signer:n})=>n).otherwise(()=>{return}),r}let u;async function p(){let n=await se(g.Ripple);if(!n)throw new l({errorKey:"toolbox_ripple_rpc_not_configured",info:{chain:g.Ripple}});let{Client:t}=await import("xrpl"),i=new t(n);return await i.connect(),i}async function w(){if(u){let n=await u.catch(()=>null);if(n?.isConnected())return n}return u=p(),u}async function G(n){let t=await n.request({command:"server_state"}),i=t.result.state.validated_ledger??t.result.state.closed_ledger;if(!i||!Number.isSafeInteger(i.reserve_base)||i.reserve_base<0||!Number.isSafeInteger(i.reserve_inc)||i.reserve_inc<0)throw new l({errorKey:"toolbox_ripple_get_balance_error",info:{reason:"XRPL reserve data is unavailable or invalid"}});return{baseReserveDrops:BigInt(i.reserve_base),ownerReserveDrops:BigInt(i.reserve_inc)}}let y=async()=>{let n=await a();if(!n)throw new l({errorKey:"toolbox_ripple_signer_not_found"});return n.getAddress()},M=async(n)=>{let t=n||await y(),{baseDecimal:i}=E(g.Ripple),s=await w();try{let[o,c]=await Promise.all([s.request({account:t,command:"account_info"}),s.request({account:t,command:"account_lines"})]),d=o.result.account_data.Balance,f=[T.from({chain:g.Ripple,fromBaseDecimal:i,value:d})];for(let m of c.result.lines){let _=le(m.currency,m.account);if(Number.parseFloat(m.balance)!==0)f.push(T.from({asset:_,asyncTokenLookup:!1,value:m.balance}))}return f}catch(o){if(q(o))return[T.from({chain:g.Ripple,value:0})];throw new l({errorKey:"toolbox_ripple_get_balance_error",info:{address:t,error:o}})}},B=async()=>{let{baseDecimal:n}=E(g.Ripple),s=(await(await w()).request({command:"fee"})).result.drops.open_ledger_fee;return T.from({chain:g.Ripple,fromBaseDecimal:n,value:s})};async function O(n){let t=n||await y(),i=await w();try{return(await i.request({account:t,command:"account_lines"})).result.lines.map((o)=>({account:o.account,authorized:o.authorized??!1,balance:o.balance,currency:o.currency,freeze:o.freeze??!1,freezePeer:o.freeze_peer??!1,limit:o.limit,limitPeer:o.limit_peer,noRipple:o.no_ripple??!1,noRipplePeer:o.no_ripple_peer??!1,peerAuthorized:o.peer_authorized??!1,qualityIn:o.quality_in??0,qualityOut:o.quality_out??0}))}catch(s){if(q(s))return[];throw new l({errorKey:"toolbox_ripple_get_trust_lines_error",info:{address:t,error:s}})}}async function Z({address:n,currency:t,issuer:i}){let s=await O(n),o=b(t);return s.some((c)=>b(c.currency)===o&&c.account===i)}async function K({currency:n,issuer:t,limit:i,sender:s}){let o=s||await y();if(!S(t))throw new l({errorKey:"core_transaction_invalid_recipient_address",info:{address:t}});let c=Number.parseFloat(i);if(Number.isNaN(c)||c<0)throw new l({errorKey:"toolbox_ripple_invalid_trust_line_limit",info:{limit:i}});let d=await w(),f={Account:o,LimitAmount:{currency:n,issuer:t,value:i},TransactionType:"TrustSet"};return d.autofill(f)}async function V(n,t){let[i,s,o]=await Promise.all([n.request({account:t,command:"account_info"}),G(n),B()]),{Balance:c,OwnerCount:d}=i.result.account_data,f=o.getBaseValue("bigint"),m=BigInt(c)-s.baseReserveDrops-BigInt(d)*s.ownerReserveDrops-f;if(m<=0n)throw new l({errorKey:"toolbox_sweep_amount_too_low",info:{asset:g.Ripple,balance:c,baseReserve:s.baseReserveDrops.toString(),fee:f.toString(),ownerCount:d,ownerReserve:s.ownerReserveDrops.toString()}});let{baseDecimal:_}=E(g.Ripple),h=T.from({chain:g.Ripple,fromBaseDecimal:_,value:m.toString()});return{amount:await H(h),fee:f.toString()}}async function j(n,t){let i=W(n.toString());if(!i)throw new l({errorKey:"toolbox_ripple_asset_not_supported",info:{asset:n.toString()}});let s=await w(),o="0",c;while(!0){let d=await s.request({account:t,command:"account_lines",peer:i.issuer,...c!==void 0&&{marker:c}}),f=d.result.lines.find((_)=>_.account===i.issuer&&b(_.currency)===b(i.currency));if(f){o=f.balance;break}let m=d.result.marker;if(m===void 0||m===null)break;c=m}if(!Number.isFinite(Number(o))||Number(o)<=0)throw new l({errorKey:"toolbox_sweep_amount_too_low",info:{asset:n.toString(),balance:o}});return{currency:i.currency,issuer:i.issuer,value:o}}async function I({assetValue:n,recipient:t,memo:i,sender:s,sweep:o,destinationTag:c,extendBySeconds:d=150,sequence:f,fee:m,lastLedgerSequence:_}){if(!S(t))throw new l({errorKey:"core_transaction_invalid_recipient_address"});let h=s||await y();if(n.chain!==g.Ripple)throw new l({errorKey:"toolbox_ripple_asset_not_supported",info:{asset:n.toString()}});let A=o&&n.isGasAsset?await V(await w(),h):void 0,ne=A?A.amount:o?await j(n,h):await H(n),C={Account:h,Amount:ne,Destination:t,TransactionType:"Payment",...A&&{Fee:A.fee},...c!==void 0&&{DestinationTag:c},...f!==void 0&&{Sequence:f},...m!==void 0&&{Fee:m},..._!==void 0&&{LastLedgerSequence:_}};if(i)C.Memos=[{Memo:{MemoData:Buffer.from(i).toString("hex")}}];if(pe({fee:m,lastLedgerSequence:_,sequence:f,transaction:C}))return C;let P=await(await w()).autofill(C);if(_===void 0&&P.LastLedgerSequence&&d>0)P.LastLedgerSequence+=Math.ceil(d/4);return P}async function x(n){let t=await a();if(!t)throw new l({errorKey:"toolbox_ripple_signer_not_found"});return t.signTransaction(n)}async function v(n){let i=await(await w()).submitAndWait(n),{result:s}=i;if(s.validated)return s.hash;let o=s.meta?.TransactionResult,c=z(o).with(k.tecNO_LINE,()=>"No trust line exists for this token").with(k.tecPATH_DRY,()=>"Payment path could not deliver funds").with(k.tecFROZEN,()=>"Token is frozen").otherwise(()=>{return});throw new l({errorKey:"toolbox_ripple_broadcast_error",info:{chain:g.Ripple,...c?{reason:c}:{txResult:o}}})}let Y=async(n)=>{try{let t=await x(n);return v(t.tx_blob)}catch(t){if(t instanceof l)throw t;throw new l({errorKey:"toolbox_ripple_broadcast_error",info:{chain:g.Ripple,error:t}})}};async function J({assetValue:n,memo:t,recipient:i,sweep:s}){let o=await a();if(!o)throw new l({errorKey:"toolbox_ripple_signer_not_found"});let c=await o.getAddress(),d=await I({assetValue:n,memo:t,recipient:i,sender:c,sweep:s}),f=await x(d);return v(f.tx_blob)}async function Q(n){let t=await a();if(!t)throw new l({errorKey:"toolbox_ripple_signer_not_found"});let i=await t.getAddress(),s=await K({...n,sender:i}),o=await x(s);return v(o.tx_blob)}function ee(){let n=u;if(u=null,n)n.then((t)=>{if(t?.isConnected())return t.disconnect();return}).catch((t)=>{console.warn("XRPL Cleanup failed silently:",t)})}return{broadcastTransaction:v,createSigner:X,createTransaction:I,disconnect:ee,estimateTransactionFee:B,getAddress:y,getBalance:M,getTrustLines:O,hasTrustLine:Z,setTrustLine:K,setTrustLineAndBroadcast:Q,signAndBroadcastTransaction:Y,signTransaction:x,transfer:J,validateAddress:S}}export{N as XRPL_KNOWN_TOKENS,k as XRPL_TOKEN_ERROR_CODES,b as currencyToHex,le as formatXrplTokenIdentifier,ye as getKnownTokensByIssuer,Ce as getRippleToolbox,be as getXrplTokenInfo,me as hexToCurrency,D as isHexCurrency,he as isKnownToken,R as normalizeCurrency,W as parseXrplTokenIdentifier,S as validateRippleAddress};
|
package/dist/src/solana/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{ia as D}from"../../chunk-xdkdc1f0.js";import{ja as m}from"../../chunk-exyqap7m.js";import{PublicKey as T}from"@solana/web3.js";import{AssetValue as A,Chain as y,DerivationPath as F,derivationPathToString as G,getChainConfig as O,getRPCUrl as N,NetworkDerivationPath as L,SwapKitError as p,updateDerivationPath as E}from"@swapkit/helpers";import{match as U,P as B}from"ts-pattern";async function j(n){let e=A.from({address:n,chain:y.Solana});if(e.symbol!=="UNKNOWN")return{decimals:e.decimal||0,id:n,logoURI:e.getIconUrl(),name:e.symbol,symbol:e.ticker};let t=`https://lite-api.jup.ag/tokens/v2/search?query=${encodeURIComponent(n)}`;try{let o=await fetch(t);if(!o.ok)return null;let r=await o.json();if(!Array.isArray(r)||r.length===0)return null;return r.find((a)=>a.id===n)||null}catch{return null}}async function V(n){let e=await w(),{PublicKey:t}=await import("@solana/web3.js"),{TOKEN_PROGRAM_ID:o}=await import("@solana/spl-token"),r=new t(n),{baseDecimal:s}=O(y.Solana),a=await e.getBalance(r),i=[A.from({chain:y.Solana,fromBaseDecimal:s,value:a||0})],c=await e.getParsedTokenAccountsByOwner(r,{programId:o});for(let{account:d}of c.value){let l=d.data.parsed.info,P=l.mint,g=l.tokenAmount.amount;if(Number(g)===0)continue;let u=await j(P),f=u?.symbol||"UNKNOWN",h=u?.decimals||l.tokenAmount.decimals;i.push(A.from({asset:`${y.Solana}.${f}-${P}`,fromBaseDecimal:h,value:g}))}return i}function M(n){try{let e=new T(n);return T.isOnCurve(e.toBytes())}catch{return!1}}function en(n){let e=n&&"index"in n?n.index||0:0,t=G(n&&"derivationPath"in n&&n.derivationPath?n.derivationPath:E(L[y.Solana],{index:e})),o;async function r(){if(o)return o;return o=await U(n).with({phrase:B.string},({phrase:a})=>I({derivationPath:t,phrase:a})).with({signer:B.any},({signer:a})=>a).otherwise(()=>{return}),o}async function s(){let a=await r();return a?.publicKey?R(a.publicKey):""}return{broadcastTransaction:_(w),createKeysForPath:I,createTransaction:K(w),createTransactionFromInstructions:Z,estimateTransactionFee:q(w),getAddress:s,getAddressFromPubKey:R,getBalance:D(y.Solana),getBalanceFromRPC:V,getConnection:w,getPubkeyFromAddress:(a)=>new T(a),signAndBroadcastTransaction:async(a)=>{let i=await x(w,r)(a);return _(w)(i)},signTransaction:x(w,r),transfer:J(w,r),validateAddress:M}}function q(n){return async({recipient:e,assetValue:t,memo:o,isProgramDerivedAddress:r,sender:s})=>{let a=await n(),i=await K(n,{checkPayerBalance:!1})({assetValue:t,isProgramDerivedAddress:r,memo:o,recipient:e,sender:s}),c=await C(a,i),{baseDecimal:d}=O(y.Solana);return A.from({chain:y.Solana,fromBaseDecimal:d,value:c})}}async function C(n,e){let t=await n.getFeeForMessage(e.compileMessage());if(t.value===null)throw new p("toolbox_fee_estimation_failed","Could not estimate Solana fee.");return t.value}async function w(){let{Connection:n}=await import("@solana/web3.js"),e=await N(y.Solana);return new n(e,{commitment:"confirmed",fetchMiddleware:(t,o,r)=>{let s={};for(let[a,i]of Object.entries(o?.headers??{})){let c=a.toLowerCase();if(c!=="pragma"&&c!=="solana-client")s[a]=i}r(t,{...o,headers:s})}})}function W(n){return async({assetValue:e,recipient:t,sender:o,isProgramDerivedAddress:r,sweep:s})=>{let a=new T(o);if(e.isGasAsset){let{Transaction:i,SystemProgram:c}=await import("@solana/web3.js");return new i().add(c.transfer({fromPubkey:a,lamports:s?0:e.getBaseValue("number"),toPubkey:new T(t)}))}if(e.address){let i=await n();return H({amount:s?0:e.getBaseValue("number"),connection:i,decimals:e.decimal,from:a,isProgramDerivedAddress:r,recipient:t,sweep:s,tokenAddress:e.address})}return}}async function H({tokenAddress:n,recipient:e,from:t,connection:o,amount:r,decimals:s,isProgramDerivedAddress:a,sweep:i}){let{getAssociatedTokenAddress:c,getAccount:d,createAssociatedTokenAccountIdempotentInstruction:l,createTransferCheckedInstruction:P}=await import("@solana/spl-token"),{Transaction:g}=await import("@solana/web3.js"),u=new g,f=new T(n),h=await c(f,t),S=new T(e),b=await c(f,S,a),k=!1;try{await d(o,b),k=!0}catch{}if(!k)u.add(l(t,b,S,f));let v=i?BigInt((await o.getTokenAccountBalance(h)).value.amount):r;if(i&&v<=0n)throw new p({errorKey:"toolbox_sweep_amount_too_low",info:{asset:n,balance:v.toString()}});return u.add(P(h,f,b,t,v,s)),u}async function z(n,e,t){let{ACCOUNT_SIZE:o,ASSOCIATED_TOKEN_PROGRAM_ID:r}=await import("@solana/spl-token");if(!e.instructions.some(({programId:P})=>P.equals(r)))return;let[a,i,c,d]=await Promise.all([n.getBalance(t),C(n,e),n.getMinimumBalanceForRentExemption(o),n.getMinimumBalanceForRentExemption(0)]),l=i+c+d;if(a<l)throw new p({errorKey:"toolbox_solana_insufficient_balance",info:{balance:a,fee:i,rentReserve:d,required:l,tokenAccountRent:c}})}function K(n,{checkPayerBalance:e=!0}={}){return async({recipient:t,assetValue:o,memo:r,isProgramDerivedAddress:s,sender:a,recentBlockhash:i,sweep:c})=>{let{createMemoInstruction:d}=await import("@solana/spl-memo"),l=new T(a);if(!(s||M(t)))throw new p("core_transaction_invalid_recipient_address");let P,g=()=>P??=n(),u=await W(g)({assetValue:o,isProgramDerivedAddress:s,recipient:t,sender:a,sweep:c});if(!u)throw new p("core_transaction_invalid_sender_address");if(r)u.add(d(r));if(u.recentBlockhash=i??(await(await g()).getLatestBlockhash()).blockhash,u.feePayer=l,e&&!o.isGasAsset)await z(await g(),u,l);if(c&&o.isGasAsset){let f=await g(),[h,S,b]=await Promise.all([f.getBalance(l),C(f,u),f.getMinimumBalanceForRentExemption(0)]),k=h-S-b;if(k<=0)throw new p({errorKey:"toolbox_sweep_amount_too_low",info:{balance:h,fee:S,rentReserve:b}});let{SystemProgram:v}=await import("@solana/web3.js");u.instructions[0]=v.transfer({fromPubkey:l,lamports:k,toPubkey:new T(t)})}return u}}async function Z({instructions:n}){let{Transaction:e}=await import("@solana/web3.js"),t=new e().add(...n);if(!t)throw new p("core_transaction_invalid_sender_address");return t}function J(n,e){return async({recipient:t,assetValue:o,memo:r,isProgramDerivedAddress:s,sweep:a})=>{let i=await e();if(!i)throw new p("core_transaction_invalid_sender_address");let c=i.publicKey?.toString()??(await i.connect()).publicKey.toString(),d=await K(n)({assetValue:o,isProgramDerivedAddress:s,memo:r,recipient:t,sender:c,sweep:a});if("signTransaction"in i){let l=await i.signTransaction(d);return _(n)(l)}return d.sign(i),_(n)(d)}}function _(n){return async(e)=>(await n()).sendRawTransaction(e.serialize())}function x(n,e){return async(t)=>{let o=await e();if(!o)throw new p("toolbox_solana_no_signer");let{VersionedTransaction:r}=await import("@solana/web3.js");if(!(t instanceof r)){let a=await(await n()).getLatestBlockhash();t.recentBlockhash=a.blockhash,t.feePayer=o.publicKey||void 0}if("connect"in o)return await o.signTransaction(t);return t.sign([o]),t}}async function I({phrase:n,derivationPath:e=F.SOL}){let{HDKey:t}=await import("micro-key-producer/slip10.js"),{mnemonicToSeedSync:o}=await import("@scure/bip39"),{Keypair:r}=await import("@solana/web3.js"),s=o(n),a=t.fromMasterSeed(s);return r.fromSeed(a.derive(e,!0).privateKey)}function R(n){return n.toString()}export{I as createKeysForPath,j as fetchTokenMetaData,en as getSolanaToolbox,M as validateSolanaAddress};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{ia as I}from"../../chunk-xdkdc1f0.js";import{ja as u}from"../../chunk-exyqap7m.js";import{AssetValue as T,Chain as D,DerivationPath as W,derivationPathToString as tt,getChainConfig as M,getRPCUrl as U,NetworkDerivationPath as et,SwapKitError as s,updateDerivationPath as at}from"@swapkit/helpers";import{match as j,P}from"ts-pattern";var K="0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d",z="0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7",H="0x01a736d6ed154502257f02b1ccdf4d9d1089f80811cd6acad48e6b6a9d1f2003";function R(i){if(!i)return!1;return/^0x[0-9a-fA-F]{1,64}$/.test(i)}async function E({phrase:i,derivationPath:d=W.STRK}){let{HDKey:h}=await import("@scure/bip32"),{mnemonicToSeedSync:_}=await import("@scure/bip39"),{ec:l,hash:w,encode:f,CallData:p}=await import("starknet"),v=_(i),S=h.fromMasterSeed(v).derive(d);if(!S.privateKey)throw new s("toolbox_starknet_no_signer");let m=f.addHexPrefix(Buffer.from(S.privateKey).toString("hex")),k=l.starkCurve.grindKey(m),g=f.addHexPrefix(k),b=l.starkCurve.getStarkKey(g),C=p.compile([b,0]);return{address:w.calculateContractAddressFromHash(b,H,C,0),privateKey:g,publicKey:b}}async function Z({phrase:i,derivationPath:d=W.STRK}){let{Account:h,RpcProvider:_}=await import("starknet"),{privateKey:l,address:w}=await E({derivationPath:d,phrase:i}),f=await U(D.Starknet),p=new _({nodeUrl:f});return new h({address:w,provider:p,signer:l})}function rt(i){let d=D.Starknet,h=i&&"index"in i?i.index||0:0,_=tt(i&&"derivationPath"in i&&i.derivationPath?i.derivationPath:at(et[d],{index:h})),l,w,f;async function p(){if(w)return w;if(l)return w=l.provider,w;let{RpcProvider:e}=await import("starknet"),t=await U(d);return w=new e({nodeUrl:t}),w}async function v(e){let t=await p(),a=e||await k();if(!a)return!1;try{return await t.getClassHashAt(a),!0}catch(r){if(r instanceof Error&&r.message.includes("Contract not found"))return!1;let n=r;if(n?.code===20||n?.code===19)return!1;throw r}}async function F(){let{CallData:e,hash:t}=await import("starknet"),a=await p(),r=await m();if(!r)throw new s("toolbox_starknet_no_signer");if(!f)throw new s({errorKey:"toolbox_starknet_account_not_deployed",info:{message:"Cannot deploy account: public key not available. Use phrase-based wallet initialization."}});if(await v())return r.address;let o=e.compile([f,0]);if(t.calculateContractAddressFromHash(f,H,o,0).toLowerCase()!==r.address.toLowerCase())throw new s({errorKey:"toolbox_starknet_account_not_deployed",info:{message:"Address mismatch during deployment verification"}});let y={addressSalt:f,classHash:H,constructorCalldata:o},{transaction_hash:x}=await r.deployAccount(y);return await a.waitForTransaction(x),x}async function S(){if(!await v()){if(!f)throw new s({errorKey:"toolbox_starknet_account_not_deployed",info:{message:"Starknet account is not deployed and cannot be auto-deployed without public key. Use phrase-based wallet initialization."}});await F()}}async function m(){if(l)return l;return l=await j(i).with({phrase:P.string},async({phrase:e})=>{let{Account:t,RpcProvider:a}=await import("starknet"),{privateKey:r,address:n,publicKey:o}=await E({derivationPath:_,phrase:e});f=o;let c=await U(D.Starknet),y=new a({nodeUrl:c});return new t({address:n,provider:y,signer:r})}).with({address:P.string,privateKey:P.string},async({privateKey:e,address:t})=>{let{Account:a}=await import("starknet"),r=await p();return new a({address:t,provider:r,signer:e})}).with({signer:P.instanceOf(Object)},({signer:e})=>e).otherwise(()=>{return}),l}async function k(){return(await m())?.address??""}async function g(e,t){let a=await p(),{uint256:r,CallData:n}=await import("starknet"),[o="0",c="0"]=await a.callContract({calldata:n.compile({account:e}),contractAddress:t,entrypoint:"balanceOf"});return r.uint256ToBN({high:c,low:o})}async function b(e){let{baseDecimal:t}=M(d),a=[],r=[K,z];for(let n of r)try{let o=await g(e,n);j(n).with(K,()=>{a.push(T.from({chain:d,fromBaseDecimal:t,value:o}))}).with(z,()=>{if(o>0n)a.push(T.from({asset:`${d}.ETH-${n}`,fromBaseDecimal:t,value:o}))}).otherwise(()=>{})}catch{}return a}async function C(e){let t=await m();if(t&&(!e||t.address.toLowerCase()===e.toLowerCase()))return t;if(e){let{Account:a}=await import("starknet"),r=await p();return new a({address:e,provider:r,signer:"0x0"})}throw new s({errorKey:"toolbox_starknet_fee_estimation_failed",info:{message:"Estimating fee needs a valid sender address or signer"}})}async function O(e,t){try{let a=await C(t),{overall_fee:r}=await a.estimateInvokeFee(e);if(r<=0n)throw new s({errorKey:"toolbox_starknet_fee_estimation_failed",info:{message:"Sweep fee estimation returned a non-positive fee",sender:t}});return r}catch(a){throw new s({errorKey:"toolbox_starknet_fee_estimation_failed",info:{message:"Unable to estimate the sweep fee. Verify RPC availability and that the sender account is deployed.",sender:t}},a)}}async function G(e,t){let a=await N(e),r=t.isGasAsset?a.find(({isGasAsset:n})=>n):a.find(({address:n})=>n?.toLowerCase()===t.address?.toLowerCase());if(r)return r.getBaseValue("bigint");if(t.isGasAsset)return g(e,K);if(t.address)return g(e,t.address);return 0n}async function B({recipient:e,assetValue:t,sender:a,sweep:r}){let{CallData:n,uint256:o}=await import("starknet");if(!R(e))throw new s("core_transaction_invalid_recipient_address",{address:e});let c=t.isGasAsset?K:t.address;if(!c)throw new s("toolbox_starknet_invalid_address",{address:c,assetValue:t});let y=t.getBaseValue("bigint");if(r){let A=a??await k();if(!R(A))throw new s("core_transaction_invalid_sender_address",{address:A});if(t.isGasAsset){let Y=[{calldata:n.compile([e,o.bnToUint256(1n)]),contractAddress:c,entrypoint:"transfer"}],V=await O(Y,A);y=await G(A,t)-V}else y=await G(A,t);if(y<=0n)throw new s({errorKey:"toolbox_sweep_amount_too_low",info:{amount:y.toString(),asset:t.toString()}})}let x=o.bnToUint256(y);return[{calldata:n.compile([e,x]),contractAddress:c,entrypoint:"transfer"}]}async function q({recipient:e,assetValue:t,sender:a}){let{baseDecimal:r}=M(D.Starknet);try{let n=await B({assetValue:t,recipient:e}),c=await(await C(a)).estimateInvokeFee(n);if(c?.overall_fee)return T.from({chain:d,fromBaseDecimal:r,value:c.overall_fee})}catch(n){throw new s("toolbox_starknet_fee_estimation_failed",n)}return T.from({chain:d,value:"0.00001"})}async function J({recipient:e,assetValue:t,memo:a,sweep:r}){let n=await m();if(!n)throw new s("toolbox_starknet_no_signer");await S();let o=await B({assetValue:t,memo:a,recipient:e,sender:n.address,sweep:r});return(await n.execute(o)).transaction_hash}async function Q(e){let t=await m();if(!t)throw new s("toolbox_starknet_no_signer");let a=await t.signMessage(e);return Array.isArray(a)?a:[a.r.toString(),a.s.toString()]}async function L(e){let t=await m();if(!t)throw new s("toolbox_starknet_no_signer");return await S(),(await t.execute(e)).transaction_hash}function X(e){return L(e)}async function N(e,t=!0){try{return await I(d)(e,t)}catch{return b(e)}}return{broadcastTransaction:L,createKeysForPath:Z,createTransaction:B,deployAccount:F,estimateTransactionFee:q,getAddress:k,getBalance:N,getProvider:p,isAccountDeployed:v,signAndBroadcastTransaction:X,signMessage:Q,transfer:J,validateAddress:R}}export{E as deriveStarknetKeys,rt as getStarknetToolbox,Z as starknetCreateKeysForPath,R as validateStarknetAddress};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{ja as b}from"../../chunk-exyqap7m.js";import{AssetValue as h,Chain as c,derivationPathToString as ee,getChainConfig as H,getRPCUrl as X,SKConfig as te,SwapKitError as u}from"@swapkit/helpers";import{match as ne,P as re}from"ts-pattern";var se=/^G[A-Z2-7]{55}$/,ae=/^[A-Za-z0-9]{1,12}$/,j=2,oe=600000,I;async function G(e){if(I&&Date.now()-I.timestamp<oe)return I.value;let l=(await e.ledgers().order("desc").limit(1).call()).records[0]?.base_reserve_in_stroops;if(l===void 0)throw new u({errorKey:"toolbox_stellar_balance_error",info:{reason:"base_reserve_unavailable"}});return I={timestamp:Date.now(),value:l},l}function L(e){return h.from({chain:c.Stellar,value:e}).getBaseValue("bigint")}function ie(e){let{baseDecimal:s}=H(c.Stellar);return h.from({chain:c.Stellar,fromBaseDecimal:s,value:e}).getValue("string")}function V({balance:e,baseReserveInStroops:s,numSponsored:l,numSponsoring:p,sellingLiabilities:d,subentryCount:g}){let w=L(e),_=L(d),k=j+g+p-l,K=BigInt(k)*BigInt(s),A=w-K-_;return A>0n?A:0n}function le({account:e,assetValue:s,baseReserveInStroops:l,fee:p}){let d=e.balances.find((_)=>_.asset_type==="native"),w=(d?V({balance:d.balance,baseReserveInStroops:l,numSponsored:e.num_sponsored,numSponsoring:e.num_sponsoring,sellingLiabilities:d.selling_liabilities,subentryCount:e.subentry_count}):0n)-BigInt(p);if(w<=0n)throw new u({errorKey:"toolbox_sweep_amount_too_low",info:{asset:s.toString(),reason:"spendable balance does not cover the transaction fee"}});return w}function ce({baseReserveInStroops:e,sweepAmountInStroops:s}){if(s===void 0||e===void 0)return;let l=BigInt(j)*BigInt(e);if(s<l)throw new u({errorKey:"toolbox_sweep_amount_too_low",info:{amountInStroops:s,minimumStartingBalanceInStroops:l,reason:"starting balance is below the Stellar account minimum"}})}function ue({account:e,assetCode:s,assetValue:l,issuer:p,sweep:d}){if(!d)return l.getValue("string");let g=e.balances.find((w)=>("asset_code"in w)&&w.asset_code===s&&w.asset_issuer===p)?.balance??"0";if(L(g)<=0n)throw new u({errorKey:"toolbox_sweep_amount_too_low",info:{asset:l.toString(),balance:g,reason:"trust-line balance is not positive"}});return g}function de(e){if(!e)return;if(new TextEncoder().encode(e).length>28)throw new u("helpers_invalid_memo_type")}function O(e){if(!e||typeof e!=="string"||!e.startsWith("G")||e.length!==56)return!1;return se.test(e)}function U(e){if(typeof e!=="object"||e===null)return;let s="response"in e?e.response:void 0;return typeof s?.status==="number"?s.status:void 0}function fe(e){return U(e)===504}function me(e){return e.hash?.().toString("hex")}function pe(e){return[...new Set([e,...te.get("rpcUrls")[c.Stellar]])].filter(Boolean)}async function W(e){if(!O(e))return!1;try{let{StrKey:s}=await import("@stellar/stellar-sdk");return s.isValidEd25519PublicKey(e)}catch{return!1}}async function F(e){let{address:s,ticker:l}=e,p=s?await W(s):!1;if(e.chain!==c.Stellar||e.isGasAsset||!ae.test(l)||!s||!p)throw new u({errorKey:"helpers_invalid_asset_identifier",info:{identifier:e.toString()}});return{assetCode:l,issuer:s}}function we(e={}){let s;async function l({phrase:t,path:n}){let{HDKey:a}=await import("micro-key-producer/slip10.js"),{mnemonicToSeedSync:r}=await import("@scure/bip39"),{Keypair:o}=await import("@stellar/stellar-sdk"),i=r(t),m=a.fromMasterSeed(i).derive(n,!0);return o.fromRawEd25519Seed(Buffer.from(m.privateKey))}async function p(){if(s)return s;let t=ne(e).with({phrase:re.string},({phrase:r})=>r).otherwise(()=>{return});if(!t)throw new u("toolbox_stellar_no_signer");if(e.derivationPath&&(e.derivationPath[3]||e.derivationPath[4]))throw new u("toolbox_derivation_slot_unsupported",{chain:c.Stellar,derivationPath:e.derivationPath});let n=e.index??0;if(!e.derivationPath&&(!Number.isInteger(n)||n<0))throw new u("toolbox_derivation_slot_unsupported",{chain:c.Stellar,index:n});let a=e.derivationPath?ee(e.derivationPath.slice(0,3)):`m/44'/148'/${n}'`;return s=await l({path:a,phrase:t}),s}async function d(t){let{Horizon:n}=await import("@stellar/stellar-sdk"),a=t||await X(c.Stellar);return new n.Server(a)}async function g(t,n){for(let a of n)try{return(await(await d(a)).transactions().transaction(t).call()).hash||t}catch{}return}async function w(t,n){let a=await X(c.Stellar),r=pe(a),o=me(t),i;for(let f of r)try{let m=await d(f),{hash:S}=await m.submitTransaction(t);return S}catch(m){if(i=m,!fe(m))break;let S=o?await g(o,r):void 0;if(S)return S}throw new u(n,i)}async function _(){try{return(await p()).publicKey()}catch(t){if(t instanceof u&&t.errorKey==="toolbox_derivation_slot_unsupported")throw t;return""}}async function k(t){let n=t||await _();if(!n)throw new u("toolbox_stellar_account_not_found");let a=await d(),[r,o]=await Promise.allSettled([a.loadAccount(n),G(a)]);if(r.status==="rejected"){let i=r.reason;if(U(i)===404)return[h.from({chain:c.Stellar,value:0})];throw i}if(o.status==="rejected")throw o.reason;return r.value.balances.map((i)=>{if(i.asset_type==="native"){let S=V({balance:i.balance,baseReserveInStroops:o.value,numSponsored:r.value.num_sponsored,numSponsoring:r.value.num_sponsoring,sellingLiabilities:i.selling_liabilities,subentryCount:r.value.subentry_count}),{baseDecimal:B}=H(c.Stellar);return h.from({chain:c.Stellar,fromBaseDecimal:B,value:S})}let f="asset_code"in i?i.asset_code:"",m="asset_issuer"in i?i.asset_issuer:"";return h.from({asset:`${c.Stellar}.${f}-${m}`,asyncTokenLookup:!1,value:i.balance})})}async function K({address:t,assetValue:n}){if(n.chain!==c.Stellar)throw new u({errorKey:"toolbox_stellar_trustline_asset_invalid",info:{asset:n.toString()}});if(n.isGasAsset)return!0;if(!n.address)throw new u({errorKey:"toolbox_stellar_trustline_asset_invalid",info:{asset:n.toString(),reason:"missing issuer"}});let a=await d(),r;try{r=await a.loadAccount(t)}catch(o){if(U(o)===404)return!1;throw o}return r.balances.some((o)=>("asset_code"in o)&&o.asset_code===n.ticker&&o.asset_issuer===n.address)}async function A({recipient:t,assetValue:n,memo:a,sender:r,sweep:o}){if(de(a),!await W(t))throw new u("core_transaction_invalid_recipient_address");let f=r||await _();if(!f)throw new u("toolbox_stellar_no_signer");let{Asset:m,Memo:S,Networks:B,Operation:y,TransactionBuilder:E}=await import("@stellar/stellar-sdk"),v=await d(),[P,x,D]=await Promise.all([v.fetchBaseFee(),v.loadAccount(f),o&&n.isGasAsset?G(v):Promise.resolve(void 0)]),C=new E(x,{fee:String(P),networkPassphrase:B.PUBLIC});if(n.isGasAsset){let T=o&&D!==void 0?le({account:x,assetValue:n,baseReserveInStroops:D,fee:P}):void 0,R=T===void 0?n.getValue("string"):ie(T);try{await v.loadAccount(t),C.addOperation(y.payment({amount:R,asset:m.native(),destination:t}))}catch{ce({baseReserveInStroops:D,sweepAmountInStroops:T}),C.addOperation(y.createAccount({destination:t,startingBalance:R}))}}else{let{assetCode:T,issuer:R}=await F(n),Y=ue({account:x,assetCode:T,assetValue:n,issuer:R,sweep:o});C.addOperation(y.payment({amount:Y,asset:new m(T,R),destination:t}))}if(a)C.addMemo(S.text(a));return C.setTimeout(30).build()}async function z({assetValue:t,limit:n,sender:a}){let r=a||await _();if(!r)throw new u("toolbox_stellar_no_signer");let{Asset:o,Networks:i,Operation:f,TransactionBuilder:m}=await import("@stellar/stellar-sdk"),{assetCode:S,issuer:B}=await F(t),y=await d(),[E,v]=await Promise.all([y.fetchBaseFee(),y.loadAccount(r)]),P=new o(S,B),x=n!==void 0?f.changeTrust({asset:P,limit:n}):f.changeTrust({asset:P});return new m(v,{fee:String(E),networkPassphrase:i.PUBLIC}).addOperation(x).setTimeout(30).build()}async function M(t){let{TransactionBuilder:n,Networks:a}=await import("@stellar/stellar-sdk"),r=await p(),o=n.fromXDR(t.toXDR(),a.PUBLIC);return o.sign(r),o}function N(t){return w(t,"toolbox_stellar_broadcast_error")}async function Z({recipient:t,assetValue:n,memo:a,sweep:r}){let o=await p(),i=o.publicKey(),f=await A({assetValue:n,memo:a,recipient:t,sender:i,sweep:r});return f.sign(o),w(f,"toolbox_stellar_transaction_failed")}async function q({assetValue:t,limit:n}){let a=await p(),r=await z({assetValue:t,limit:n,sender:a.publicKey()});return r.sign(a),w(r,"toolbox_stellar_transaction_failed")}async function J(t){let n=await M(t);return N(n)}async function Q(){let{baseDecimal:t}=H(c.Stellar);try{let r=(await(await d()).feeStats()).fee_charged.p50;return h.from({chain:c.Stellar,fromBaseDecimal:t,value:r})}catch{return h.from({chain:c.Stellar,fromBaseDecimal:t,value:"100"})}}return{broadcastTransaction:N,createTransaction:A,createTrustline:q,createTrustlineTransaction:z,estimateTransactionFee:Q,getAddress:_,getBalance:k,hasTrustline:K,signAndBroadcastTransaction:J,signTransaction:M,transfer:Z,validateAddress:O}}export{we as getStellarToolbox,O as validateStellarAddress};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{ja as b}from"../../chunk-exyqap7m.js";import{hexToU8a as M,isHex as _,u8aToHex as G}from"@polkadot/util";import{decodeAddress as T,encodeAddress as v}from"@polkadot/util-crypto";import{AssetValue as F,Chain as y,getRPCUrl as U,SubstrateChains as W,SwapKitError as d,SwapKitNumber as H}from"@swapkit/helpers";import{match as w,P as A}from"ts-pattern";import{AssetValue as K,Chain as B,SwapKitNumber as x}from"@swapkit/helpers";async function N(e,t,n){let a=[t.set(0)];if(!n)return a;try{let r=await e.query.system?.account?.(n);if(!r)return a;let{data:{free:i}}=r,c=x.fromBigInt(BigInt(i.toString()),t.decimal).getValue("string");return[t.set(c)]}catch(r){let i=r instanceof Error?r.message:String(r);return console.error(`Error fetching substrate balance: ${i}`),a}}async function j(e,t,n){let a=[t.set(0)];if(!n)return a;try{let r=await e.query.flip?.account?.(n);if(!r)return a;let i=r.balance||r.data?.balance;if(!i||i.isEmpty)return a;let c=x.fromBigInt(BigInt(i.toString()),t.decimal).getValue("string");return[t.set(c)]}catch(r){let i=r instanceof Error?r.message:String(r);return console.error(`Error fetching chainflip balance: ${i}`),a}}function I(e,t){return function(a){let r=K.from({chain:e});switch(e){case B.Chainflip:return j(t,r,a);default:return N(t,r,a)}}}var R={decimals:[10],displayName:"Polkadot Relay Chain",network:"polkadot",prefix:0,standardAccount:"*25519",symbols:["DOT"],website:"https://polkadot.network"},D={decimals:[18],displayName:"Chainflip",network:"chainflip",prefix:2112,standardAccount:"*25519",symbols:["FLIP"],website:"https://chainflip.io/"},V={decimals:[],displayName:"Substrate",network:"substrate",prefix:42,standardAccount:"*25519",symbols:[],website:"https://substrate.io/"},p={DOT:R,FLIP:D,GENERIC:V};function de(e,t){return w(e).with(...W,(n)=>ee({chain:n,...t})).exhaustive()}function f(e){return"address"in e}async function k(e,t){let{Keyring:n}=await import("@polkadot/keyring"),{cryptoWaitReady:a}=await import("@polkadot/util-crypto");return await a(),new n({ss58Format:t,type:"sr25519"}).addFromUri(e)}var S=(e,t)=>e.rpc.system.accountNextIndex(t),h=(e,{recipient:t,assetValue:n,sweep:a})=>{let r=a?e.tx.balances?.transferAll?.(t,!0):e.tx.balances?.transferAllowDeath?.(t,n.getBaseValue("number"));if(a&&!r)throw new d("toolbox_substrate_transfer_error");return r},m=(e,t)=>{if(e===y.Chainflip&&t)throw new d("toolbox_substrate_not_supported")},L=async(e,t,n)=>{let a=h(e,n);if(!a)throw new d("toolbox_substrate_transfer_error");let r=f(t),i=r?t.address:n.sender;if(!i)throw new d("core_transaction_invalid_sender_address");let c=await S(e,i);return(await a.signAndSend(r?t:i,{nonce:c,signer:r?void 0:t})).toString()},q=async(e,t,n,a)=>{let r=h(e,a),i=f(t)?t.address:a.sender;if(!i)return Promise.resolve(n.set(0));let c=await r?.paymentInfo(i,{nonce:await S(e,i)})||{partialFee:0};return n.set(H.fromBigInt(BigInt(c.partialFee.toString()),n.decimal).getValue("string"))},O=async(e,t)=>{if(t)return e.send(t);return(await e.send()).toString()},z=async(e,t)=>await t.signAsync(e),J=(e,t,n)=>{if(n)return t.signAndSend(e,n);return t.signAndSend(e).toString()},Q=async({signer:e,address:t,tx:n,callback:a,api:r})=>{let i=await S(r,t);if(a)n.signAndSend(t,{nonce:i,signer:e},a);return n.signAndSend(t,{nonce:i,signer:e}).toString()};function X(e,t){let n=T(e);return v(n,t)}function C(e,t){return _(e)?M(e):T(e,void 0,t)}function Y(e,t="ss58",n){if(t==="hex")return G(e);return v(e,n)}function Z({chain:e,prefix:t}){let n=t||w(e).with(y.Polkadot,()=>p.DOT.prefix).with(y.Chainflip,()=>p.FLIP.prefix).otherwise(()=>p.GENERIC.prefix);return function(r){if(typeof r!=="string"||_(r))return!1;try{return C(r,n).length===32}catch{return!1}}}function ee({chain:e,generic:t=!1,...n}){let a=F.from({chain:e}),r;async function i(){let{ApiPromise:s,WsProvider:o}=await import("@polkadot/api"),u=await U(e),l=new o(u);return s.create({noInitWarn:!0,provider:l})}async function c(){if(r)return r;return r=await w(n).with({phrase:A.string},({phrase:s})=>k(s,p[e].prefix)).with({signer:A.any},({signer:s})=>s).otherwise(()=>{return}),r}let g=t?p.GENERIC:p[e];async function P(s){let o=await c(),u=s||o;if(!u)throw new d("core_wallet_not_keypair_wallet");return f(u)?u.address:void 0}return{broadcast:O,convertAddress:X,createKeyring:(s)=>k(s,g.prefix),createTransaction:async(s)=>{m(e,s.sweep);let o=await i();return h(o,s)},decodeAddress:C,encodeAddress:Y,estimateTransactionFee:async(s)=>{m(e,s.sweep);let o=await c();if(!o)throw new d("core_wallet_not_keypair_wallet");let u=await i();return q(u,o,a,s)},gasAsset:a,getAddress:P,getApi:i,getBalance:async(s)=>{let o=await i(),u=I(e,o),l=s||await P();return u(l)},network:g,sign:async(s)=>{let o=await c();if(!o)throw new d("core_wallet_not_keypair_wallet");if(f(o))return z(o,s);throw new d("core_wallet_not_keypair_wallet","Signer does not have keyring pair capabilities required for signing.")},signAndBroadcast:async({tx:s,callback:o,address:u})=>{let l=await c();if(!l)throw new d("core_wallet_not_keypair_wallet");if(f(l))return J(l,s,o);let E=await i();if(u)return Q({address:u,api:E,callback:o,signer:l,tx:s});throw new d("core_wallet_not_keypair_wallet","Signer does not have keyring pair capabilities required for signing.")},transfer:async(s)=>{m(e,s.sweep);let o=await c();if(!o)throw new d("core_wallet_not_keypair_wallet");let u=await i();return L(u,o,s)},validateAddress:Z({chain:e,prefix:g.prefix})}}export{p as SubstrateNetwork,k as createKeyring,ee as createSubstrateToolbox,Z as getSubstrateAddressValidator,de as getSubstrateToolbox,f as isKeyringPair};
|
package/dist/src/sui/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{ja as k}from"../../chunk-exyqap7m.js";import{isValidSuiAddress as V}from"@mysten/sui/utils";import{AssetValue as x,Chain as _,derivationPathToString as W,getChainConfig as K,getRPCUrlSync as J,resolveDerivationPath as L,SwapKitError as y}from"@swapkit/helpers";import{match as M,P as j}from"ts-pattern";var I="0x2::sui::SUI",R=256,Y=50000000;async function U(t,a,i,o){let r=[],s,f=0n;while(!0){let c=await t.getCoins({coinType:i,cursor:s,owner:a});if(r.push(...c.data),f+=c.data.reduce((T,w)=>T+BigInt(w.balance),0n),!c.hasNextPage||o!==void 0&&f>=o)return r;s=c.nextCursor}}async function N(t){return BigInt(await t.getReferenceGasPrice())}function v({coinObjectId:t,digest:a,version:i}){return{digest:a,objectId:t,version:i}}function Q(t,a,i,o=!1){let r=a.reduce((l,S)=>l+BigInt(S.balance),0n);if(r<i)throw new y("toolbox_sui_insufficient_balance",{available:r.toString(),required:i.toString()});let{selectedCoins:s}=a.reduce((l,S)=>{if(l.total>=i)return l;return{selectedCoins:[...l.selectedCoins,S],total:l.total+BigInt(S.balance)}},{selectedCoins:[],total:0n}),f=s[0],c=t.objectRef(v(f)),T=s.slice(1).map((l)=>t.objectRef(v(l)));if(T.length>0)t.mergeCoins(c,T);if(o)return c;let[w]=t.splitCoins(c,[i]);return w}function H(t,a){let i=t.reduce((o,r)=>o+BigInt(r.balance),0n);if(i<=0n)throw new y({errorKey:"toolbox_sweep_amount_too_low",info:{asset:a,available:i.toString()}});return i}function q(t){if(t.length>R)throw new y({errorKey:"toolbox_sui_transaction_creation_error",info:{coinCount:t.length,maxGasPaymentCoins:R,reason:`SUI transactions support at most ${R} gas payment coins`}})}function X(t,a,i,o,r,s){let f=i.getBaseValue("bigint");if(s)H(a,i.toString()),q(a);else F(a,f+BigInt(o));if(t.setGasPayment(a.map(v)),s)t.transferObjects([t.gas],r);else{let[c]=t.splitCoins(t.gas,[i.getBaseValue("string")]);t.transferObjects([c],r)}}function F(t,a){let i=t.reduce((o,r)=>o+BigInt(r.balance),0n);if(i<a)throw new y("toolbox_sui_insufficient_balance",{available:i.toString(),required:a.toString()})}async function z({assetValue:t,gasBudget:a,recipient:i,sender:o,suiClient:r,sweep:s,tx:f}){let c=t.getBaseValue("bigint"),[T,w]=await Promise.all([N(r),U(r,o,I,s?void 0:c+BigInt(a))]);if(f.setGasPrice(T),X(f,w,t,a,i,s),s){let l=w.reduce((S,A)=>S+BigInt(A.balance),0n);return l<BigInt(a)?l:a}return a}async function Z({assetValue:t,gasBudget:a,recipient:i,sender:o,suiClient:r,sweep:s,tx:f}){let c=t.address;if(!c)throw new y("toolbox_sui_missing_coin_type");let T=t.getBaseValue("bigint"),[w,l,S]=await Promise.all([N(r),U(r,o,I,BigInt(a)),U(r,o,c,s?void 0:T)]);if(!S.length&&!s)throw new y("toolbox_sui_no_coins_found",{coinType:c});let A=s?H(S,t.toString()):T;if(F(l,BigInt(a)),s)q(l);f.setGasPrice(w),f.setGasPayment(l.map(v));let D=Q(f,S,A,s);f.transferObjects([D],i)}function tt(t){try{return V(t)}catch{return!1}}function O(t){return"signWithIntent"in t}function at({provider:t,...a}={}){let i;async function o(){if(i)return i;return i=await M(a).with({phrase:j.string},async({phrase:n,derivationPath:e,index:g=0})=>{let{Ed25519Keypair:d}=await import("@mysten/sui/keypairs/ed25519"),u=L({chain:_.Sui,derivationPath:e,index:g});if(u.length!==5||u[3]!==0||u[4]!==0)throw new y("toolbox_derivation_slot_unsupported",{chain:_.Sui,derivationPath:u});let m=W(u,{allHardened:!0});return d.deriveKeypair(n,m)}).with({signer:j.any},({signer:n})=>n).otherwise(()=>{return}),i}async function r(n=t){let{SuiJsonRpcClient:e}=await import("@mysten/sui/jsonRpc");return new e({network:"mainnet",url:n||J(_.Sui)})}async function s(){return(await o())?.toSuiAddress()||""}function f(n){try{let e=x.from({address:n,chain:_.Sui});return{asset:e.toString(),decimals:e.decimal}}catch{}return null}async function c(n){let e=n||await s();if(!e)throw new y("toolbox_sui_address_required");let{baseDecimal:g,chain:d}=K(_.Sui);try{let m=await(await r()).getAllBalances({owner:e}),b=m.find(({coinType:p})=>p===I)?.totalBalance||"0",B=[x.from({chain:d,fromBaseDecimal:g,value:b})];for(let{coinType:p,totalBalance:h}of m){if(p===I||Number(h)<=0)continue;let C=f(p);if(C)B.push(x.from({asset:C.asset,fromBaseDecimal:C.decimals,value:h}))}return B}catch{return[x.from({chain:d})]}}async function T(n){let e=x.from({chain:_.Sui,value:"0.01"});if(!n)return e;try{let g=await r(),{txBytes:d}=await w(n),{effects:{status:u,gasUsed:m}}=await g.dryRunTransactionBlock({transactionBlock:d});if(u.status!=="success")return e;let{baseDecimal:b}=K(_.Sui),B=BigInt(m.computationCost)+BigInt(m.storageCost)-BigInt(m.storageRebate);return x.from({chain:_.Sui,fromBaseDecimal:b,value:B.toString()})}catch{return e}}async function w({recipient:n,assetValue:e,gasBudget:g,sender:d,sweep:u}){let{Transaction:m}=await import("@mysten/sui/transactions"),b=d||await s(),B=g||Y;if(!b)throw new y("toolbox_sui_no_sender");try{let p=await r(),h=new m;h.setSender(b);let C={assetValue:e,gasBudget:B,recipient:n,sender:b,suiClient:p,sweep:u,tx:h},G;if(e.isGasAsset||e.symbol==="SUI"){let P=await z(C);if(BigInt(P)<BigInt(B))G=BigInt(P);h.setGasBudget(P)}else await Z(C),h.setGasBudget(B);let E=await h.build({client:p});if(G!==void 0){let{effects:{status:P}}=await p.dryRunTransactionBlock({transactionBlock:E});if(P.status!=="success")throw new y({errorKey:"toolbox_sweep_amount_too_low",info:{asset:e.toString(),budget:G.toString(),error:P.error}})}return{tx:h,txBytes:E}}catch(p){if(p instanceof y)throw p;throw new y("toolbox_sui_transaction_creation_error",{error:p})}}async function l(n){let e=await o();if(!e)throw new y("toolbox_sui_no_signer");if(n instanceof Uint8Array)return e.signTransaction(n);let{txBytes:g}="tx"in n?n:await w(n);return e.signTransaction(g)}async function S({assetValue:n,gasBudget:e,recipient:g,sweep:d}){let u=await o();if(!u)throw new y("toolbox_sui_no_signer");let m=u.toSuiAddress()||await s();if(!m)throw new y("toolbox_sui_no_sender");let{txBytes:b}=await w({assetValue:n,gasBudget:e,recipient:g,sender:m,sweep:d}),B=await r();if(!O(u)){let h=await u.signTransaction(b),{digest:C}=await B.executeTransactionBlock({signature:h.signature,transactionBlock:h.bytes});return C}let{digest:p}=await B.signAndExecuteTransaction({signer:u,transaction:b});return p}async function A(n){let e=await r(),{digest:g}=await e.executeTransactionBlock({signature:n.signature,transactionBlock:n.bytes});return g}async function D(n){let e=await o();if(!e)throw new y("toolbox_sui_no_signer");let g=await r(),d;if(typeof n==="string")d=Uint8Array.from(Buffer.from(n,"base64"));else if(n instanceof Uint8Array)d=n;else d=await n.build({client:g});if(!O(e)){let m=await e.signTransaction(d),{digest:b}=await g.executeTransactionBlock({signature:m.signature,transactionBlock:m.bytes});return b}let{digest:u}=await g.signAndExecuteTransaction({signer:e,transaction:d});return u}return{broadcastTransaction:A,createTransaction:w,estimateTransactionFee:T,getAddress:s,getBalance:c,signAndBroadcastTransaction:D,signTransaction:l,transfer:S,validateAddress:tt}}export{at as getSuiToolbox,tt as validateSuiAddress};
|
package/dist/src/ton/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{ia as U}from"../../chunk-xdkdc1f0.js";import{ja as p}from"../../chunk-exyqap7m.js";import{AssetValue as et,Chain as g,getChainConfig as nt,NetworkDerivationPath as ot,SKConfig as rt,SwapKitError as l,SwapKitNumber as st}from"@swapkit/helpers";import{Address as i,beginCell as x,Cell as j,external as at,internal as it,loadStateInit as ct,SendMode as N,storeMessage as dt,toNano as L}from"@ton/core";import{match as F,P as B}from"ts-pattern";var lt=260734629,ft=L("0.01"),ut=L("0.05"),G=N.PAY_GAS_SEPARATELY+N.IGNORE_ERRORS,gt=N.CARRY_ALL_REMAINING_BALANCE+N.IGNORE_ERRORS,Tt=60000,O,v=0;async function pt(){let c=Date.now();if(O&&c-v<Tt)return O;let{getHttpEndpoint:w}=await import("@orbs-network/ton-access");return O=await w(),v=c,O}async function wt(){let[c]=rt.get("rpcUrls")[g.Ton]??[];if(c)return c;return await pt()}function Nt(c={}){let w,S,A;async function u(){if(!w){let{TonClient:t}=await import("@ton/ton"),e=c.provider??await wt();w=new t({endpoint:e})}return w}async function h(){return(await b()).address.toString()}async function C(){if(A)return A;return A=await F(c).with({phrase:B.string},async({phrase:t,derivationPath:e,index:n=0})=>{let r=ot[g.Ton],o=e?.some((a,d)=>a!==r[d]);if(n||o)throw new l("toolbox_derivation_slot_unsupported",{chain:g.Ton,derivationPath:e,index:n});let{mnemonicToWalletKey:s}=await import("@ton/crypto");return s(t.split(" "))}).with({signer:B.any},({signer:t})=>t).otherwise(()=>{return}),A}async function b(t){if(!S||t){let e=await C(),n=await u(),r=t||e;if(!r)throw new l("core_wallet_connection_not_found");let{WalletContractV4:o}=await import("@ton/ton"),s=o.create({publicKey:r.publicKey,workchain:0});S=n.open(s)}return S}let J=U(g.Ton);async function q({assetValue:t,recipient:e,memo:n,sender:r,sweep:o,jettonWalletAddress:s}){if(t.isGasAsset){if(o){let tt=r||await h(),K=await(await u()).getBalance(i.parse(tt));if(K<=0n)throw new l("toolbox_sweep_amount_too_low",{asset:t.toString(),balance:K.toString()})}let Z=n?D(n).toBoc().toString("base64"):void 0;return[{address:e,amount:t.getBaseValue("string"),payload:Z}]}let a=t.address;if(!a)throw new l({errorKey:"core_swap_contract_not_found",info:{asset:t.toString()}});let d=r??await h(),f=s?i.parse(s):await I({jettonMasterAddress:a,ownerAddress:d}),y=f.toString(),_=i.parse(e),T=i.parse(d),m=o?await H(f):t.getBaseValue("bigint");if(o&&m<=0n)throw new l("toolbox_sweep_amount_too_low",{asset:t.toString(),balance:m.toString()});let Q=n?D(n):void 0,X=V({destinationAddress:_,forwardPayload:Q,jettonAmount:m,responseAddress:T});return[{address:y,amount:ut.toString(),payload:X.toBoc().toString("base64")}]}async function M({sender:t,sweep:e,...n}){let r=e&&n.assetValue.isGasAsset?gt:G;return{messages:await q({...n,sender:t,sweep:e}),sendMode:r}}function k(t){if(!Array.isArray(t))return t;let[e]=t;return{messages:t.map(({sendMode:r,...o})=>o),sendMode:e?.sendMode??G}}function E(t){return t.map((e)=>{let n=e.payload?j.fromBase64(e.payload):void 0,r=e.stateInit?ct(j.fromBase64(e.stateInit).asSlice()):void 0,o=i.parse(e.address),s=i.isFriendly(e.address)?i.parseFriendly(e.address).isBounceable:!0;return it({body:n,bounce:s,init:r,to:o,value:BigInt(e.amount)})})}async function P(t){let e=await C(),n=await b();if(!n||!e)throw new l("core_wallet_connection_not_found");let r=await u(),{state:o}=await r.getContractState(n.address),s=o==="active",a=s?await n.getSeqno():0,{messages:d,sendMode:f}=k(t),y=n.createTransfer({messages:E(d),secretKey:e.secretKey,sendMode:f,seqno:a}),_=at({body:y,init:s?void 0:n.init,to:n.address});return x().store(dt(_)).endCell()}async function W(t){return await(await u()).sendFile(t.toBoc()),t.hash().toString("hex")}async function R(t){let e=await P(t);return W(e)}async function Y({assetValue:t,recipient:e,memo:n,sweep:r}){let o=await M({assetValue:t,memo:n,recipient:e,sweep:r});return R(o)}async function z({sender:t,...e}){let{baseDecimal:n}=nt(g.Ton),r=await F(t).with(B.string,(a)=>i.parseFriendly(a).address).otherwise(async()=>(await b()).address);if(!r)throw new l("toolbox_fee_estimation_failed",{chain:g.Ton});let o=et.from({chain:g.Ton,value:"0.01"}),s=await u();try{let a=await M({sender:t,...e}),d=await C(),f=await b();if(!f||!d)return o;let y=await f.getSeqno(),_=f.createTransfer({messages:E(a.messages),secretKey:d.secretKey,sendMode:a.sendMode,seqno:y}),{source_fees:T}=await s.estimateExternalMessageFee(r,{body:_,ignoreSignature:!0,initCode:null,initData:null}),m=T.in_fwd_fee+T.storage_fee+T.gas_fee+T.fwd_fee;return o.set(st.fromBigInt(BigInt(m),n))}catch{return o}}async function I({jettonMasterAddress:t,ownerAddress:e}){try{let n=await u(),r=i.parse(t),o=i.parse(e),{JettonMaster:s}=await import("@ton/ton");return await n.open(s.create(r)).getWalletAddress(o)}catch{throw new l({errorKey:"core_swap_contract_not_found",info:{jettonMasterAddress:t,ownerAddress:e}})}}async function H(t){try{let e=await u(),{JettonWallet:n}=await import("@ton/ton");return await e.open(n.create(t)).getBalance()}catch{throw new l({errorKey:"core_swap_contract_not_found",info:{jettonWalletAddress:t.toString()}})}}function V({jettonAmount:t,destinationAddress:e,responseAddress:n,forwardAmount:r=ft,forwardPayload:o}){let s=x().storeUint(lt,32).storeUint(0,64).storeCoins(t).storeAddress(e).storeAddress(n).storeBit(0).storeCoins(r);if(o)s.storeBit(1).storeRef(o);else s.storeBit(0);return s.endCell()}function D(t){return x().storeUint(0,32).storeStringTail(t).endCell()}return{broadcastTransaction:W,createTransaction:M,estimateTransactionFee:z,getAddress:h,getBalance:J,getJettonWalletAddress:I,sign:P,signAndBroadcastTransaction:R,transfer:Y,validateAddress:yt}}function yt(c){try{return i.parse(c),!0}catch{return!1}}export{Nt as getTONToolbox,yt as validateTonAddress};
|
package/dist/src/tron/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"../../chunk-4428244x.js";import{bytesToHex as we}from"@noble/hashes/utils.js";import{HDKey as pe}from"@scure/bip32";import{mnemonicToSeedSync as ye}from"@scure/bip39";import{AssetValue as A,BaseDecimal as H,Chain as b,derivationPathToString as Dt,getRPCUrl as he,NetworkDerivationPath as Ut,SwapKitError as m,updateDerivationPath as kt,warnOnce as It}from"@swapkit/helpers";import{match as be,P as z}from"ts-pattern";import{sha256 as jt}from"@noble/hashes/sha2.js";import{bytesToHex as it,hexToBytes as st}from"@noble/hashes/utils.js";import{SwapKitError as N}from"@swapkit/helpers";var K=0,ct=1,L=2,dt=5,Xt=8,Yt=10,zt=18;function j(e,t){let n=0n,o=0n,i=t;while(i<e.length&&i-t<10){let c=e[i++];if(c===void 0)break;if(n|=BigInt(c&127)<<o,o+=7n,(c&128)===0)return[n,i]}throw new N({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"Malformed varint in transaction raw_data"}})}function B(e){let t=[],n=e<0n?e+2n**64n:e;while(n>=128n)t.push(Number(n&0x7fn)|128),n>>=7n;return t.push(Number(n)),t}function k(e,t,n){let o=e.get(t);if(o)o.push(n);else e.set(t,[n])}function Jt(e){let t=new Map,n=0;while(n<e.length){let[o,i]=j(e,n);n=i;let c=Number(o>>3n),l=Number(o&7n);if(l===K){let[p,w]=j(e,n);n=w,k(t,c,{data:new Uint8Array(B(p)),wireType:K})}else if(l===L){let[p,w]=j(e,n);n=w;let v=Number(p);if(v<0||n+v>e.length)throw new N({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"Length-delimited proto field overruns transaction raw_data"}});let V=e.slice(n,n+v);n+=v,k(t,c,{data:V,wireType:L})}else if(l===ct){if(n+8>e.length)throw new N({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"64-bit proto field overruns transaction raw_data"}});let p=e.slice(n,n+8);n+=8,k(t,c,{data:p,wireType:ct})}else if(l===dt){if(n+4>e.length)throw new N({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"32-bit proto field overruns transaction raw_data"}});let p=e.slice(n,n+4);n+=4,k(t,c,{data:p,wireType:dt})}else throw new N({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"Unsupported proto wire type in transaction raw_data"}})}return t}function Qt(e){let t=[];for(let[c,l]of[...e.entries()].sort(([p],[w])=>p-w))for(let{wireType:p,data:w}of l){let v=BigInt(c<<3|p);if(t.push(new Uint8Array(B(v))),p===L)t.push(new Uint8Array(B(BigInt(w.length))));t.push(w)}let n=t.reduce((c,l)=>c+l.length,0),o=new Uint8Array(n),i=0;for(let c of t)o.set(c,i),i+=c.length;return o}function ut(e,t){if(!e||e.length%2!==0)throw new N({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"Transaction raw_data_hex is empty or not byte-aligned"}});let n=st(e),o=Jt(n);if(t.expiration!==void 0)o.set(Xt,[{data:new Uint8Array(B(BigInt(t.expiration))),wireType:K}]);if(t.data!==void 0)o.set(Yt,[{data:st(t.data),wireType:L}]);if(t.fee_limit!==void 0)o.set(zt,[{data:new Uint8Array(B(BigInt(t.fee_limit))),wireType:K}]);let i=Qt(o),c=it(i),l=it(jt(i));return{raw_data_hex:c,txID:l}}import{hexToBytes as ae}from"@noble/hashes/utils.js";import{Chain as ie,getRPCUrlSync as se,SwapKitError as h,warnOnce as G}from"@swapkit/helpers";import{secp256k1 as lt}from"@noble/curves/secp256k1.js";import{sha256 as ft}from"@noble/hashes/sha2.js";import{keccak_256 as Zt}from"@noble/hashes/sha3.js";import{bytesToHex as I,hexToBytes as M}from"@noble/hashes/utils.js";import{createBase58check as te}from"@scure/base";import{SwapKitError as gt}from"@swapkit/helpers";var O=te(ft),_t=65,ee=2n**256n;function x(e){if(typeof e!=="string")return!1;try{let t=O.decode(e);return t.length===21&&t[0]===_t}catch{return!1}}function mt(e){return I(O.decode(e))}function ne(e){return O.decode(e).slice(1)}function Tt(e){let t=lt.getPublicKey(M(e),!1),n=Zt(t.slice(1)).slice(-20),o=new Uint8Array(21);return o[0]=_t,o.set(n,1),O.encode(o)}function wt({txID:e,privateKey:t}){let n=lt.sign(M(e),M(t),{format:"recovered",prehash:!1}),o=n[0]??0,i=I(n.slice(1,33)),c=I(n.slice(33,65)),l=(o+27).toString(16).padStart(2,"0");return i+c+l}function R({txID:e,raw_data_hex:t}){let n=I(ft(M(t)));if(e!==n)throw new gt("toolbox_tron_invalid_transaction_integrity",{expected:n,txID:e})}function re(e){return`000000000000000000000000${I(ne(e))}`}function oe(e){let t=typeof e==="bigint"?e:BigInt(e);if(t<0n||t>=ee)throw new gt("toolbox_tron_invalid_token_identifier",{identifier:t.toString()});return t.toString(16).padStart(64,"0")}function S(e){return e.map(({type:t,value:n})=>t==="address"?re(n):oe(BigInt(n))).join("")}function pt(e){return I(new TextEncoder().encode(e))}var ht="https://api.trongrid.io",ce=1000,de=1e6,ue=420,le=1e6,fe=30000;function bt(){try{return se(ie.Tron)}catch{return ht}}function xt(){let e=new AbortController,t=setTimeout(()=>e.abort(),fe);return{cleanup:()=>clearTimeout(t),signal:e.signal}}function At(e){if(!e||typeof e!=="object")return;let{Error:t}=e;return typeof t==="string"&&t.length>0?t:void 0}function ge(e){if(!e)return;if(e.length%2!==0||!/^[0-9a-f]+$/i.test(e))return e;try{let t=new TextDecoder().decode(ae(e));return/^[ -~]+$/.test(t)?t:e}catch{return e}}async function P(e,t){let{signal:n,cleanup:o}=xt();try{let i=await fetch(`${bt()}${e}`,{body:JSON.stringify(t),headers:{"Content-Type":"application/json"},method:"POST",signal:n});if(!i.ok)throw new h("toolbox_tron_trongrid_api_error",{message:`${i.status} ${i.statusText} on ${e}`});return await i.json()}finally{o()}}async function vt(e,t){let{signal:n,cleanup:o}=xt();try{let i=await fetch(`${t??bt()}${e}`,{headers:{"Content-Type":"application/json"},signal:n});if(!i.ok)throw new h("toolbox_tron_trongrid_api_error",{message:`${i.status} ${i.statusText} on ${e}`});return await i.json()}finally{o()}}async function W(e){if(!x(e))throw new h("toolbox_tron_trongrid_api_error",{address:e,message:"Invalid address"});try{let t=await vt(`/v1/accounts/${e}`,ht);if(!(t.success&&t.data)||t.data.length===0)return;let n;try{n=mt(e).toLowerCase()}catch{n=e.toLowerCase()}let o=t.data.find((i)=>i.address.toLowerCase()===n);if(!o)return;return{balance:o.balance,trc20:o.trc20||[]}}catch(t){if(t instanceof h)throw t;throw new h("toolbox_tron_trongrid_api_error",{message:t instanceof Error?t.message:"Unknown error"})}}var _e="/wallet/createtransaction";async function Et({from:e,to:t,amount:n}){let i=await P(_e,{amount:n,owner_address:e,to_address:t,visible:!0});if(!i.txID||!i.raw_data_hex||!i.raw_data)throw new h({errorKey:"toolbox_tron_transaction_creation_failed",info:{error:At(i)??"Node returned no transaction"}});let l=i.raw_data?.contract?.[0]?.parameter?.value;if(l?.to_address!==t||l?.owner_address!==e||l?.amount!==n)throw new h({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"Node returned a transaction that does not match the requested transfer"}});return R(i),i}var me="/wallet/triggersmartcontract";async function Ft({ownerAddress:e,contractAddress:t,functionSelector:n,parameter:o,feeLimit:i,callValue:c=0}){let l=await P(me,{call_value:c,contract_address:t,fee_limit:i,function_selector:n,owner_address:e,parameter:o,visible:!0});if(!l.result?.result||!l.transaction?.txID||!l.transaction?.raw_data_hex)throw new h({errorKey:"toolbox_tron_transaction_creation_failed",info:{code:l.result?.code,error:At(l)??"Node returned no transaction",message:ge(l.result?.message)}});let w=l.transaction.raw_data?.contract?.[0]?.parameter?.value;if(w?.contract_address!==t||w?.owner_address!==e)throw new h({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"Node returned a transaction that does not match the requested contract call"}});return R(l.transaction),l.transaction}function Pt({ownerAddress:e,contractAddress:t,functionSelector:n,parameter:o}){return P("/wallet/triggerconstantcontract",{contract_address:t,function_selector:n,owner_address:e,parameter:o,visible:!0})}function Te({ownerAddress:e,contractAddress:t,functionSelector:n,parameter:o}){return P("/wallet/estimateenergy",{contract_address:t,function_selector:n,owner_address:e,parameter:o,visible:!0})}function yt(e){let t=typeof e==="number"?e:typeof e==="string"?Number(e):Number.NaN;return Number.isFinite(t)&&t>0?t:void 0}async function C(e){try{let{result:t,txid:n}=await P("/wallet/broadcasttransaction",{raw_data:e.raw_data,raw_data_hex:e.raw_data_hex,signature:e.signature,txID:e.txID,visible:e.visible});if(!t||!n)throw new h("toolbox_tron_token_transfer_failed");return n}catch(t){throw new h("toolbox_tron_broadcast_failed",{error:t})}}async function D(){let e={};try{let{chainParameter:t}=await vt("/wallet/getchainparameters");for(let n of t)e[n.key]=n.value}catch(t){G({condition:!0,id:"tron_chain_params_failed",warning:`Failed to fetch chain params, using defaults: ${t instanceof Error?t.message:t}`})}return{bandwidthFee:e.getTransactionFee??ce,createAccountFee:e.getCreateNewAccountFeeInSystemContract??e.getCreateAccountFee??de,energyFee:e.getEnergyFee??ue,memoFee:e.getMemoFee??le}}async function X(e){try{let t=await P("/wallet/getaccountresource",{address:e,visible:!0});return{bandwidth:{free:(t.freeNetLimit??600)-(t.freeNetUsed??0),total:t.NetLimit??0,used:t.NetUsed??0},energy:{total:t.EnergyLimit??0,used:t.EnergyUsed??0}}}catch(t){return G({condition:!0,id:"tron_account_resources_failed",warning:`Failed to fetch account resources, using defaults: ${t instanceof Error?t.message:t}`}),{bandwidth:{free:600,total:0,used:0},energy:{total:0,used:0}}}}async function U(e){try{let t=await P("/wallet/getaccount",{address:e,visible:!0});return t&&Object.keys(t).length>0}catch{return!1}}async function Y(e){try{let t=await Te({...e,ownerAddress:e.sender}),n=t.energy_required??t.energyRequired;if(t.result&&!t.result.result)throw new h("toolbox_tron_trongrid_api_error",{message:t.result.message||"estimateenergy failed"});if(n!==void 0){let o=yt(n);if(o!==void 0)return o;throw new h("toolbox_tron_trongrid_api_error",{message:"Invalid estimateenergy response"})}}catch(t){G({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 Pt({...e,ownerAddress:e.sender}),n=yt(t);if(n!==void 0)return n;throw new h("toolbox_tron_trongrid_api_error",{message:"Invalid triggerconstantcontract energy response"})}catch(t){throw G({condition:!0,id:"tron_energy_estimation_fallback_failed",warning:`Failed to estimate energy: ${t instanceof Error?t.message:t}`}),new h("toolbox_tron_trongrid_api_error",{message:`Unable to estimate contract energy: ${t instanceof Error?t.message:t}`})}}async function Nt({assetAddress:e,owner:t,spender:n}){let o=S([{type:"address",value:t},{type:"address",value:n}]),c=(await Pt({contractAddress:e,functionSelector:"allowance(address,address)",ownerAddress:n,parameter:o})).constant_result?.[0];if(!c)return 0n;try{return BigInt(`0x${c}`)}catch{return 0n}}var xe=x,Rt=268,St=65000,J=25000,Bt=345,Q="TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",Ae="115792089237316195423570985008687907853269984665640564039457584007913129639935";function Kt({phrase:e,derivationPath:t}){let n=pe.fromMasterSeed(ye(e)).derive(t);if(!n.privateKey)throw new m("toolbox_tron_no_signer");return we(n.privateKey)}function ve(e,t){return{...e,value:String(t)}}function Ee(e,t){if(!t)return e;return{...e,data:t.startsWith("0x")?t:`0x${t}`}}function Fe({phrase:e,derivationPath:t,index:n}){let o=t||Dt(kt(Ut[b.Tron],{index:n||0}));return Kt({derivationPath:o,phrase:e})}function Pe({phrase:e,derivationPath:t}){let n=Kt({derivationPath:t,phrase:e}),o=Tt(n);return{getAddress:()=>Promise.resolve(o),signTransaction:(i)=>{R(i);let c=wt({privateKey:n,txID:i.txID});return Promise.resolve({...i,signature:[c]})}}}function Ct({transaction:e,memo:t,expiration:n,feeLimit:o}){let i={},c={};if(o!==void 0&&e.raw_data)i.fee_limit=o,c.fee_limit=o;if(t){let w=t.startsWith("0x")?t.replace(/^0x/,""):pt(t);i.data=w,c.data=w}if(n){let w=e.raw_data.expiration+n*1000;i.expiration=w,c.expiration=w}if(Object.keys(i).length===0)return e;let{raw_data_hex:l,txID:p}=ut(e.raw_data_hex,i);return{...e,raw_data:{...e.raw_data,...c},raw_data_hex:l,txID:p}}function Ne(e={}){let t="index"in e?e.index||0:0,n=Dt("derivationPath"in e&&e.derivationPath?e.derivationPath:kt(Ut[b.Tron],{index:t})),o,i=!1;function c(){if(i)return Promise.resolve(o);return o=be(e).with({phrase:z.string},({phrase:r})=>Pe({derivationPath:n,phrase:r})).with({signer:z.not(z.nullish)},({signer:r})=>r).otherwise(()=>{return}),i=!0,Promise.resolve(o)}async function l(){let r=await c();if(!r)throw new m("toolbox_tron_no_signer");return r.getAddress()}async function p(r,a){let d=r||St,s=a??(await D()).energyFee,u=d*s,f=Math.ceil(u*1.5);return Math.min(Math.max(f,1e7),150000000)}async function w({contractAddress:r,functionSelector:a,parameter:d,sender:s,memo:u,expiration:f,extraEnergy:g=0}){let _=await Y({contractAddress:r,functionSelector:a,parameter:d,sender:s}),T=await p(_+g),y=await Ft({contractAddress:r,feeLimit:T,functionSelector:a,ownerAddress:s,parameter:d});return Ct({expiration:f,feeLimit:T,memo:u,transaction:y})}async function v(r){if(!x(r))return[A.from({chain:b.Tron})];try{let a=await W(r);if(!a)return[A.from({chain:b.Tron})];let d=[A.from({chain:b.Tron,fromBaseDecimal:6,value:String(a.balance)})],s=a.trc20?.find((u)=>(Q in u));if(s){let u=s[Q];d.push(A.from({asset:`TRON.USDT-${Q}`,fromBaseDecimal:6,value:u}))}return d}catch(a){return It({condition:!0,id:"tron_toolbox_get_balance_failed",warning:`Tron API getBalance failed: ${a instanceof Error?a.message:a}`}),[A.from({chain:b.Tron})]}}async function V({recipient:r,assetValue:a,memo:d,expiration:s,sweep:u}){if(!x(r))throw new m("toolbox_tron_token_transfer_failed",{message:"invalid address"});let f=await c();if(!f)throw new m("toolbox_tron_no_signer");try{let g=await l(),_=await nt({assetValue:a,expiration:s,memo:d,recipient:r,sender:g,sweep:u}),T=await f.signTransaction(_),y=await C(T);if(!y)throw new m("toolbox_tron_token_transfer_failed",{message:"broadcast failed"});return y}catch(g){if(g instanceof m&&g.errorKey==="toolbox_sweep_amount_too_low")throw g;throw new m("toolbox_tron_token_transfer_failed",{message:g instanceof Error?g.message:String(g)})}}function Z({requiredBandwidth:r,resources:a,feePerUnit:d}){let s=Math.max(0,a.free+a.total-a.used);return r>s?(r-s)*d:0}async function tt({memo:r,recipient:a,senderAddress:d}){let[s,u,f]=await Promise.all([D(),U(a),X(d)]),g=u?0:s.createAccountFee,_=Z({feePerUnit:s.bandwidthFee,requiredBandwidth:Rt,resources:f.bandwidth}),T=r?s.memoFee:0;return A.from({chain:b.Tron,fromBaseDecimal:H.TRON,value:g+_+T})}async function et({assetValue:r,amountInBaseUnits:a=r.getBaseValue("string"),memo:d,recipient:s,senderAddress:u}){let f=r.address;if(!f)throw new m("toolbox_tron_invalid_token_identifier",{identifier:r.toString()});let[g,_,T,y]=await Promise.all([D(),U(s),X(u),Y({contractAddress:f,functionSelector:"transfer(address,uint256)",parameter:S([{type:"address",value:s},{type:"uint256",value:a}]),sender:u})]),F=y+(_?0:J),q=Z({feePerUnit:g.bandwidthFee,requiredBandwidth:Bt,resources:T.bandwidth}),at=Math.max(0,T.energy.total-T.energy.used),Vt=F>at?(F-at)*g.energyFee:0,qt=d?g.memoFee:0;return A.from({chain:b.Tron,fromBaseDecimal:H.TRON,value:q+Vt+qt})}async function Lt({assetValue:r,memo:a,recipient:d}){let[s,u]=await Promise.all([D(),U(d)]);if(r.isGasAsset){let T=u?0:s.createAccountFee,y=a?s.memoFee:0;return A.from({chain:b.Tron,fromBaseDecimal:H.TRON,value:T+Rt*s.bandwidthFee+y})}let g=await p(St+(u?0:J),s.energyFee),_=a?s.memoFee:0;return A.from({chain:b.Tron,fromBaseDecimal:H.TRON,value:g+Bt*s.bandwidthFee+_})}async function Mt({assetValue:r,memo:a,recipient:d,sender:s}){let u=await c();try{let f=s?s:u?await l():void 0;if(!f)return Lt({assetValue:r,memo:a,recipient:d});return r.isGasAsset?tt({memo:a,recipient:d,senderAddress:f}):et({assetValue:r,memo:a,recipient:d,senderAddress:f})}catch(f){throw It({condition:!0,id:"tron_toolbox_fee_estimation_failed",warning:`Failed to calculate exact fee: ${f instanceof Error?f.message:f}`}),new m("toolbox_fee_estimation_failed",{chain:b.Tron,error:f})}}async function Ot({assetValue:r,memo:a,recipient:d,sender:s,sweep:u}){if(!u)return r.getBaseValue("bigint");let[f,g]=await Promise.all([W(s),tt({memo:a,recipient:d,senderAddress:s})]),_=BigInt(f?.balance??0)-g.getBaseValue("bigint");if(_<=0n)throw new m({errorKey:"toolbox_sweep_amount_too_low",info:{amount:_.toString(),asset:r.toString()}});return _}async function $t({assetValue:r,memo:a,recipient:d,sender:s,sweep:u}){if(!u)return r.getBaseValue("string");let f=r.address;if(!f)throw new m("toolbox_tron_invalid_token_identifier",{identifier:r.toString()});let g=await W(s),T=g?.trc20.find((q)=>(f in q))?.[f]??"0";if(BigInt(T)<=0n)throw new m({errorKey:"toolbox_sweep_amount_too_low",info:{asset:r.toString(),balance:T}});let y=await et({amountInBaseUnits:T,assetValue:r,memo:a,recipient:d,senderAddress:s}),E=BigInt(g?.balance??0),F=y.getBaseValue("bigint");if(E<F)throw new m({errorKey:"toolbox_sweep_amount_too_low",info:{asset:r.toString(),nativeBalance:E.toString(),requiredNativeFee:F.toString()}});return T}async function nt({recipient:r,assetValue:a,memo:d,sender:s,expiration:u,sweep:f,recipientExists:g}){if(!x(r)||!x(s))throw new m("toolbox_tron_transaction_creation_failed",{message:"invalid address"});if(a.isGasAsset){let E=await Ot({assetValue:a,expiration:u,memo:d,recipient:r,sender:s,sweep:f});if(E>BigInt(Number.MAX_SAFE_INTEGER))throw new m({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 Et({amount:Number(E),from:s,to:r});return Ct({expiration:u,memo:d,transaction:F})}let _=a.address;if(!_)throw new m("toolbox_tron_invalid_token_identifier",{identifier:a.toString()});let T=await $t({assetValue:a,expiration:u,memo:d,recipient:r,sender:s,sweep:f}),y=g??await U(r);return w({contractAddress:_,expiration:u,extraEnergy:y?0:J,functionSelector:"transfer(address,uint256)",memo:d,parameter:S([{type:"address",value:r},{type:"uint256",value:T}]),sender:s})}async function rt(r){R(r);let a=await c();if(!a)throw new m("toolbox_tron_no_signer");return a.signTransaction(r)}async function Gt(r){let a=await rt(r);return C(a)}function ot({assetAddress:r,spenderAddress:a,from:d}){return Nt({assetAddress:r,owner:d,spender:a})}async function Wt({assetAddress:r,spenderAddress:a,from:d,amount:s}){let u=await ot({assetAddress:r,from:d,spenderAddress:a});if(!s)return u>0n;return u>=BigInt(s)}async function Ht({assetAddress:r,spenderAddress:a,amount:d,from:s}){if(!x(r)||!x(a))throw new m("toolbox_tron_approve_failed");let u=await c();if(!u)throw new m("toolbox_tron_no_signer");let f=s||await l(),g=d!==void 0?BigInt(d).toString():Ae;try{let _=await w({contractAddress:r,functionSelector:"approve(address,uint256)",parameter:S([{type:"address",value:a},{type:"uint256",value:g}]),sender:f}),T=await u.signTransaction(_),y=await C(T);if(!y)throw new m("toolbox_tron_approve_failed");return y}catch(_){if(_ instanceof m)throw _;throw new m("toolbox_tron_approve_failed",{error:_})}}return{approve:Ht,broadcastTransaction:C,createTransaction:nt,estimateTransactionFee:Mt,getAddress:l,getApprovedAmount:ot,getBalance:v,getRpcUrl:()=>he(b.Tron),isApproved:Wt,signAndBroadcastTransaction:Gt,signTransaction:rt,transfer:V,validateAddress:x}}export{Fe as getTronPrivateKeyFromMnemonic,Ne as getTronToolbox,xe as validateTronAddress,Ee as withTronTransactionData,ve as withTronTransactionValue};
|
|
1
|
+
import"../../chunk-exyqap7m.js";import{bytesToHex as we}from"@noble/hashes/utils.js";import{HDKey as pe}from"@scure/bip32";import{mnemonicToSeedSync as he}from"@scure/bip39";import{AssetValue as A,Chain as b,derivationPathToString as Dt,getChainConfig as ye,getRPCUrl as be,NetworkDerivationPath as Ut,SwapKitError as m,updateDerivationPath as kt,warnOnce as Nt}from"@swapkit/helpers";import{match as xe,P as z}from"ts-pattern";import{sha256 as jt}from"@noble/hashes/sha2.js";import{bytesToHex as it,hexToBytes as st}from"@noble/hashes/utils.js";import{SwapKitError as I}from"@swapkit/helpers";var K=0,ct=1,L=2,dt=5,Xt=8,Yt=10,zt=18;function j(e,t){let n=0n,o=0n,i=t;while(i<e.length&&i-t<10){let c=e[i++];if(c===void 0)break;if(n|=BigInt(c&127)<<o,o+=7n,(c&128)===0)return[n,i]}throw new I({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"Malformed varint in transaction raw_data"}})}function B(e){let t=[],n=e<0n?e+2n**64n:e;while(n>=128n)t.push(Number(n&0x7fn)|128),n>>=7n;return t.push(Number(n)),t}function k(e,t,n){let o=e.get(t);if(o)o.push(n);else e.set(t,[n])}function Jt(e){let t=new Map,n=0;while(n<e.length){let[o,i]=j(e,n);n=i;let c=Number(o>>3n),l=Number(o&7n);if(l===K){let[p,w]=j(e,n);n=w,k(t,c,{data:new Uint8Array(B(p)),wireType:K})}else if(l===L){let[p,w]=j(e,n);n=w;let v=Number(p);if(v<0||n+v>e.length)throw new I({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"Length-delimited proto field overruns transaction raw_data"}});let V=e.slice(n,n+v);n+=v,k(t,c,{data:V,wireType:L})}else if(l===ct){if(n+8>e.length)throw new I({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"64-bit proto field overruns transaction raw_data"}});let p=e.slice(n,n+8);n+=8,k(t,c,{data:p,wireType:ct})}else if(l===dt){if(n+4>e.length)throw new I({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"32-bit proto field overruns transaction raw_data"}});let p=e.slice(n,n+4);n+=4,k(t,c,{data:p,wireType:dt})}else throw new I({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"Unsupported proto wire type in transaction raw_data"}})}return t}function Qt(e){let t=[];for(let[c,l]of[...e.entries()].sort(([p],[w])=>p-w))for(let{wireType:p,data:w}of l){let v=BigInt(c<<3|p);if(t.push(new Uint8Array(B(v))),p===L)t.push(new Uint8Array(B(BigInt(w.length))));t.push(w)}let n=t.reduce((c,l)=>c+l.length,0),o=new Uint8Array(n),i=0;for(let c of t)o.set(c,i),i+=c.length;return o}function ut(e,t){if(!e||e.length%2!==0)throw new I({errorKey:"toolbox_tron_transaction_creation_failed",info:{reason:"Transaction raw_data_hex is empty or not byte-aligned"}});let n=st(e),o=Jt(n);if(t.expiration!==void 0)o.set(Xt,[{data:new Uint8Array(B(BigInt(t.expiration))),wireType:K}]);if(t.data!==void 0)o.set(Yt,[{data:st(t.data),wireType:L}]);if(t.fee_limit!==void 0)o.set(zt,[{data:new Uint8Array(B(BigInt(t.fee_limit))),wireType:K}]);let i=Qt(o),c=it(i),l=it(jt(i));return{raw_data_hex:c,txID:l}}import{hexToBytes as ae}from"@noble/hashes/utils.js";import{Chain as ie,getRPCUrlSync as se,SwapKitError as y,warnOnce as G}from"@swapkit/helpers";import{secp256k1 as lt}from"@noble/curves/secp256k1.js";import{sha256 as ft}from"@noble/hashes/sha2.js";import{keccak_256 as Zt}from"@noble/hashes/sha3.js";import{bytesToHex as N,hexToBytes as M}from"@noble/hashes/utils.js";import{createBase58check as te}from"@scure/base";import{SwapKitError as gt}from"@swapkit/helpers";var O=te(ft),_t=65,ee=2n**256n;function x(e){if(typeof e!=="string")return!1;try{let t=O.decode(e);return t.length===21&&t[0]===_t}catch{return!1}}function mt(e){return N(O.decode(e))}function ne(e){return O.decode(e).slice(1)}function Tt(e){let t=lt.getPublicKey(M(e),!1),n=Zt(t.slice(1)).slice(-20),o=new Uint8Array(21);return o[0]=_t,o.set(n,1),O.encode(o)}function wt({txID:e,privateKey:t}){let n=lt.sign(M(e),M(t),{format:"recovered",prehash:!1}),o=n[0]??0,i=N(n.slice(1,33)),c=N(n.slice(33,65)),l=(o+27).toString(16).padStart(2,"0");return i+c+l}function R({txID:e,raw_data_hex:t}){let n=N(ft(M(t)));if(e!==n)throw new gt("toolbox_tron_invalid_transaction_integrity",{expected:n,txID:e})}function re(e){return`000000000000000000000000${N(ne(e))}`}function oe(e){let t=typeof e==="bigint"?e:BigInt(e);if(t<0n||t>=ee)throw new gt("toolbox_tron_invalid_token_identifier",{identifier:t.toString()});return t.toString(16).padStart(64,"0")}function S(e){return e.map(({type:t,value:n})=>t==="address"?re(n):oe(BigInt(n))).join("")}function pt(e){return N(new TextEncoder().encode(e))}var yt="https://api.trongrid.io",ce=1000,de=1e6,ue=420,le=1e6,fe=30000;function bt(){try{return se(ie.Tron)}catch{return yt}}function xt(){let e=new AbortController,t=setTimeout(()=>e.abort(),fe);return{cleanup:()=>clearTimeout(t),signal:e.signal}}function At(e){if(!e||typeof e!=="object")return;let{Error:t}=e;return typeof t==="string"&&t.length>0?t:void 0}function ge(e){if(!e)return;if(e.length%2!==0||!/^[0-9a-f]+$/i.test(e))return e;try{let t=new TextDecoder().decode(ae(e));return/^[ -~]+$/.test(t)?t:e}catch{return e}}async function P(e,t){let{signal:n,cleanup:o}=xt();try{let i=await fetch(`${bt()}${e}`,{body:JSON.stringify(t),headers:{"Content-Type":"application/json"},method:"POST",signal:n});if(!i.ok)throw new y("toolbox_tron_trongrid_api_error",{message:`${i.status} ${i.statusText} on ${e}`});return await i.json()}finally{o()}}async function vt(e,t){let{signal:n,cleanup:o}=xt();try{let i=await fetch(`${t??bt()}${e}`,{headers:{"Content-Type":"application/json"},signal:n});if(!i.ok)throw new y("toolbox_tron_trongrid_api_error",{message:`${i.status} ${i.statusText} on ${e}`});return await i.json()}finally{o()}}async function W(e){if(!x(e))throw new y("toolbox_tron_trongrid_api_error",{address:e,message:"Invalid address"});try{let t=await vt(`/v1/accounts/${e}`,yt);if(!(t.success&&t.data)||t.data.length===0)return;let n;try{n=mt(e).toLowerCase()}catch{n=e.toLowerCase()}let o=t.data.find((i)=>i.address.toLowerCase()===n);if(!o)return;return{balance:o.balance,trc20:o.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 _e="/wallet/createtransaction";async function Et({from:e,to:t,amount:n}){let i=await P(_e,{amount:n,owner_address:e,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:At(i)??"Node returned no transaction"}});let l=i.raw_data?.contract?.[0]?.parameter?.value;if(l?.to_address!==t||l?.owner_address!==e||l?.amount!==n)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 me="/wallet/triggersmartcontract";async function Ft({ownerAddress:e,contractAddress:t,functionSelector:n,parameter:o,feeLimit:i,callValue:c=0}){let l=await P(me,{call_value:c,contract_address:t,fee_limit:i,function_selector:n,owner_address:e,parameter:o,visible:!0});if(!l.result?.result||!l.transaction?.txID||!l.transaction?.raw_data_hex)throw new y({errorKey:"toolbox_tron_transaction_creation_failed",info:{code:l.result?.code,error:At(l)??"Node returned no transaction",message:ge(l.result?.message)}});let w=l.transaction.raw_data?.contract?.[0]?.parameter?.value;if(w?.contract_address!==t||w?.owner_address!==e)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(l.transaction),l.transaction}function Pt({ownerAddress:e,contractAddress:t,functionSelector:n,parameter:o}){return P("/wallet/triggerconstantcontract",{contract_address:t,function_selector:n,owner_address:e,parameter:o,visible:!0})}function Te({ownerAddress:e,contractAddress:t,functionSelector:n,parameter:o}){return P("/wallet/estimateenergy",{contract_address:t,function_selector:n,owner_address:e,parameter:o,visible:!0})}function ht(e){let t=typeof e==="number"?e:typeof e==="string"?Number(e):Number.NaN;return Number.isFinite(t)&&t>0?t:void 0}async function C(e){try{let{result:t,txid:n}=await P("/wallet/broadcasttransaction",{raw_data:e.raw_data,raw_data_hex:e.raw_data_hex,signature:e.signature,txID:e.txID,visible:e.visible});if(!t||!n)throw new y("toolbox_tron_token_transfer_failed");return n}catch(t){throw new y("toolbox_tron_broadcast_failed",{error:t})}}async function D(){let e={};try{let{chainParameter:t}=await vt("/wallet/getchainparameters");for(let n of t)e[n.key]=n.value}catch(t){G({condition:!0,id:"tron_chain_params_failed",warning:`Failed to fetch chain params, using defaults: ${t instanceof Error?t.message:t}`})}return{bandwidthFee:e.getTransactionFee??ce,createAccountFee:e.getCreateNewAccountFeeInSystemContract??e.getCreateAccountFee??de,energyFee:e.getEnergyFee??ue,memoFee:e.getMemoFee??le}}async function X(e){try{let t=await P("/wallet/getaccountresource",{address:e,visible:!0});return{bandwidth:{free:(t.freeNetLimit??600)-(t.freeNetUsed??0),total:t.NetLimit??0,used:t.NetUsed??0},energy:{total:t.EnergyLimit??0,used:t.EnergyUsed??0}}}catch(t){return G({condition:!0,id:"tron_account_resources_failed",warning:`Failed to fetch account resources, using defaults: ${t instanceof Error?t.message:t}`}),{bandwidth:{free:600,total:0,used:0},energy:{total:0,used:0}}}}async function U(e){try{let t=await P("/wallet/getaccount",{address:e,visible:!0});return t&&Object.keys(t).length>0}catch{return!1}}async function Y(e){try{let t=await Te({...e,ownerAddress:e.sender}),n=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(n!==void 0){let o=ht(n);if(o!==void 0)return o;throw new y("toolbox_tron_trongrid_api_error",{message:"Invalid estimateenergy response"})}}catch(t){G({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 Pt({...e,ownerAddress:e.sender}),n=ht(t);if(n!==void 0)return n;throw new y("toolbox_tron_trongrid_api_error",{message:"Invalid triggerconstantcontract energy response"})}catch(t){throw G({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:e,owner:t,spender:n}){let o=S([{type:"address",value:t},{type:"address",value:n}]),c=(await Pt({contractAddress:e,functionSelector:"allowance(address,address)",ownerAddress:n,parameter:o})).constant_result?.[0];if(!c)return 0n;try{return BigInt(`0x${c}`)}catch{return 0n}}var Ae=x,H=ye(b.Tron).baseDecimal,Rt=268,St=65000,J=25000,Bt=345,Q="TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",ve="115792089237316195423570985008687907853269984665640564039457584007913129639935";function Kt({phrase:e,derivationPath:t}){let n=pe.fromMasterSeed(he(e)).derive(t);if(!n.privateKey)throw new m("toolbox_tron_no_signer");return we(n.privateKey)}function Ee(e,t){return{...e,value:String(t)}}function Fe(e,t){if(!t)return e;return{...e,data:t.startsWith("0x")?t:`0x${t}`}}function Pe({phrase:e,derivationPath:t,index:n}){let o=t||Dt(kt(Ut[b.Tron],{index:n||0}));return Kt({derivationPath:o,phrase:e})}function Ie({phrase:e,derivationPath:t}){let n=Kt({derivationPath:t,phrase:e}),o=Tt(n);return{getAddress:()=>Promise.resolve(o),signTransaction:(i)=>{R(i);let c=wt({privateKey:n,txID:i.txID});return Promise.resolve({...i,signature:[c]})}}}function Ct({transaction:e,memo:t,expiration:n,feeLimit:o}){let i={},c={};if(o!==void 0&&e.raw_data)i.fee_limit=o,c.fee_limit=o;if(t){let w=t.startsWith("0x")?t.replace(/^0x/,""):pt(t);i.data=w,c.data=w}if(n){let w=e.raw_data.expiration+n*1000;i.expiration=w,c.expiration=w}if(Object.keys(i).length===0)return e;let{raw_data_hex:l,txID:p}=ut(e.raw_data_hex,i);return{...e,raw_data:{...e.raw_data,...c},raw_data_hex:l,txID:p}}function Ne(e={}){let t="index"in e?e.index||0:0,n=Dt("derivationPath"in e&&e.derivationPath?e.derivationPath:kt(Ut[b.Tron],{index:t})),o,i=!1;function c(){if(i)return Promise.resolve(o);return o=xe(e).with({phrase:z.string},({phrase:r})=>Ie({derivationPath:n,phrase:r})).with({signer:z.not(z.nullish)},({signer:r})=>r).otherwise(()=>{return}),i=!0,Promise.resolve(o)}async function l(){let r=await c();if(!r)throw new m("toolbox_tron_no_signer");return r.getAddress()}async function p(r,a){let d=r||St,s=a??(await D()).energyFee,u=d*s,f=Math.ceil(u*1.5);return Math.min(Math.max(f,1e7),150000000)}async function w({contractAddress:r,functionSelector:a,parameter:d,sender:s,memo:u,expiration:f,extraEnergy:g=0}){let _=await Y({contractAddress:r,functionSelector:a,parameter:d,sender:s}),T=await p(_+g),h=await Ft({contractAddress:r,feeLimit:T,functionSelector:a,ownerAddress:s,parameter:d});return Ct({expiration:f,feeLimit:T,memo:u,transaction:h})}async function v(r){if(!x(r))return[A.from({chain:b.Tron})];try{let a=await W(r);if(!a)return[A.from({chain:b.Tron})];let d=[A.from({chain:b.Tron,fromBaseDecimal:6,value:String(a.balance)})],s=a.trc20?.find((u)=>(Q in u));if(s){let u=s[Q];d.push(A.from({asset:`TRON.USDT-${Q}`,fromBaseDecimal:6,value:u}))}return d}catch(a){return Nt({condition:!0,id:"tron_toolbox_get_balance_failed",warning:`Tron API getBalance failed: ${a instanceof Error?a.message:a}`}),[A.from({chain:b.Tron})]}}async function V({recipient:r,assetValue:a,memo:d,expiration:s,sweep:u}){if(!x(r))throw new m("toolbox_tron_token_transfer_failed",{message:"invalid address"});let f=await c();if(!f)throw new m("toolbox_tron_no_signer");try{let g=await l(),_=await nt({assetValue:a,expiration:s,memo:d,recipient:r,sender:g,sweep:u}),T=await f.signTransaction(_),h=await C(T);if(!h)throw new m("toolbox_tron_token_transfer_failed",{message:"broadcast failed"});return h}catch(g){if(g instanceof m&&g.errorKey==="toolbox_sweep_amount_too_low")throw g;throw new m("toolbox_tron_token_transfer_failed",{message:g instanceof Error?g.message:String(g)})}}function Z({requiredBandwidth:r,resources:a,feePerUnit:d}){let s=Math.max(0,a.free+a.total-a.used);return r>s?(r-s)*d:0}async function tt({memo:r,recipient:a,senderAddress:d}){let[s,u,f]=await Promise.all([D(),U(a),X(d)]),g=u?0:s.createAccountFee,_=Z({feePerUnit:s.bandwidthFee,requiredBandwidth:Rt,resources:f.bandwidth}),T=r?s.memoFee:0;return A.from({chain:b.Tron,fromBaseDecimal:H,value:g+_+T})}async function et({assetValue:r,amountInBaseUnits:a=r.getBaseValue("string"),memo:d,recipient:s,senderAddress:u}){let f=r.address;if(!f)throw new m("toolbox_tron_invalid_token_identifier",{identifier:r.toString()});let[g,_,T,h]=await Promise.all([D(),U(s),X(u),Y({contractAddress:f,functionSelector:"transfer(address,uint256)",parameter:S([{type:"address",value:s},{type:"uint256",value:a}]),sender:u})]),F=h+(_?0:J),q=Z({feePerUnit:g.bandwidthFee,requiredBandwidth:Bt,resources:T.bandwidth}),at=Math.max(0,T.energy.total-T.energy.used),Vt=F>at?(F-at)*g.energyFee:0,qt=d?g.memoFee:0;return A.from({chain:b.Tron,fromBaseDecimal:H,value:q+Vt+qt})}async function Lt({assetValue:r,memo:a,recipient:d}){let[s,u]=await Promise.all([D(),U(d)]);if(r.isGasAsset){let T=u?0:s.createAccountFee,h=a?s.memoFee:0;return A.from({chain:b.Tron,fromBaseDecimal:H,value:T+Rt*s.bandwidthFee+h})}let g=await p(St+(u?0:J),s.energyFee),_=a?s.memoFee:0;return A.from({chain:b.Tron,fromBaseDecimal:H,value:g+Bt*s.bandwidthFee+_})}async function Mt({assetValue:r,memo:a,recipient:d,sender:s}){let u=await c();try{let f=s?s:u?await l():void 0;if(!f)return Lt({assetValue:r,memo:a,recipient:d});return r.isGasAsset?tt({memo:a,recipient:d,senderAddress:f}):et({assetValue:r,memo:a,recipient:d,senderAddress:f})}catch(f){throw Nt({condition:!0,id:"tron_toolbox_fee_estimation_failed",warning:`Failed to calculate exact fee: ${f instanceof Error?f.message:f}`}),new m("toolbox_fee_estimation_failed",{chain:b.Tron,error:f})}}async function Ot({assetValue:r,memo:a,recipient:d,sender:s,sweep:u}){if(!u)return r.getBaseValue("bigint");let[f,g]=await Promise.all([W(s),tt({memo:a,recipient:d,senderAddress:s})]),_=BigInt(f?.balance??0)-g.getBaseValue("bigint");if(_<=0n)throw new m({errorKey:"toolbox_sweep_amount_too_low",info:{amount:_.toString(),asset:r.toString()}});return _}async function $t({assetValue:r,memo:a,recipient:d,sender:s,sweep:u}){if(!u)return r.getBaseValue("string");let f=r.address;if(!f)throw new m("toolbox_tron_invalid_token_identifier",{identifier:r.toString()});let g=await W(s),T=g?.trc20.find((q)=>(f in q))?.[f]??"0";if(BigInt(T)<=0n)throw new m({errorKey:"toolbox_sweep_amount_too_low",info:{asset:r.toString(),balance:T}});let h=await et({amountInBaseUnits:T,assetValue:r,memo:a,recipient:d,senderAddress:s}),E=BigInt(g?.balance??0),F=h.getBaseValue("bigint");if(E<F)throw new m({errorKey:"toolbox_sweep_amount_too_low",info:{asset:r.toString(),nativeBalance:E.toString(),requiredNativeFee:F.toString()}});return T}async function nt({recipient:r,assetValue:a,memo:d,sender:s,expiration:u,sweep:f,recipientExists:g}){if(!x(r)||!x(s))throw new m("toolbox_tron_transaction_creation_failed",{message:"invalid address"});if(a.isGasAsset){let E=await Ot({assetValue:a,expiration:u,memo:d,recipient:r,sender:s,sweep:f});if(E>BigInt(Number.MAX_SAFE_INTEGER))throw new m({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 Et({amount:Number(E),from:s,to:r});return Ct({expiration:u,memo:d,transaction:F})}let _=a.address;if(!_)throw new m("toolbox_tron_invalid_token_identifier",{identifier:a.toString()});let T=await $t({assetValue:a,expiration:u,memo:d,recipient:r,sender:s,sweep:f}),h=g??await U(r);return w({contractAddress:_,expiration:u,extraEnergy:h?0:J,functionSelector:"transfer(address,uint256)",memo:d,parameter:S([{type:"address",value:r},{type:"uint256",value:T}]),sender:s})}async function rt(r){R(r);let a=await c();if(!a)throw new m("toolbox_tron_no_signer");return a.signTransaction(r)}async function Gt(r){let a=await rt(r);return C(a)}function ot({assetAddress:r,spenderAddress:a,from:d}){return It({assetAddress:r,owner:d,spender:a})}async function Wt({assetAddress:r,spenderAddress:a,from:d,amount:s}){let u=await ot({assetAddress:r,from:d,spenderAddress:a});if(!s)return u>0n;return u>=BigInt(s)}async function Ht({assetAddress:r,spenderAddress:a,amount:d,from:s}){if(!x(r)||!x(a))throw new m("toolbox_tron_approve_failed");let u=await c();if(!u)throw new m("toolbox_tron_no_signer");let f=s||await l(),g=d!==void 0?BigInt(d).toString():ve;try{let _=await w({contractAddress:r,functionSelector:"approve(address,uint256)",parameter:S([{type:"address",value:a},{type:"uint256",value:g}]),sender:f}),T=await u.signTransaction(_),h=await C(T);if(!h)throw new m("toolbox_tron_approve_failed");return h}catch(_){if(_ instanceof m)throw _;throw new m("toolbox_tron_approve_failed",{error:_})}}return{approve:Ht,broadcastTransaction:C,createTransaction:nt,estimateTransactionFee:Mt,getAddress:l,getApprovedAmount:ot,getBalance:v,getRpcUrl:()=>be(b.Tron),isApproved:Wt,signAndBroadcastTransaction:Gt,signTransaction:rt,transfer:V,validateAddress:x}}export{Pe as getTronPrivateKeyFromMnemonic,Ne as getTronToolbox,Ae as validateTronAddress,Fe as withTronTransactionData,Ee as withTronTransactionValue};
|