@swapkit/toolboxes 5.2.0 → 5.3.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.
@@ -1 +1 @@
1
- import{ga as C}from"../../chunk-xbdjxeqd.js";import{AssetValue as R,Chain as N,derivationPathToString as $5,getChainConfig as y,getRPCUrl as W5,resolveDerivationPath as Z5,SwapKitError as Y}from"@swapkit/helpers";import{isValidClassicAddress as f5,isValidXAddress as A}from"ripple-address-codec";import{match as g,P as x}from"ts-pattern";import{SwapKitError as G5}from"@swapkit/helpers";function E(U){return/^[0-9A-Fa-f]{40}$/.test(U)}function D(U){if(E(U))return U.toUpperCase();if(U.length<=3){let f=Buffer.from(U.padEnd(3,"\x00")).toString("hex");return`00${"0".repeat(22)}${f}${"0".repeat(10)}`.toUpperCase()}let z=Buffer.from(U).toString("hex").toUpperCase();if(z.length>40)throw new G5({errorKey:"toolbox_ripple_asset_not_supported",info:{asset:U,reason:"Currency exceeds maximum length (20 bytes)"}});return z.padEnd(40,"0")}function Q5(U){if(!E(U))return U;if(U.toUpperCase().startsWith("00")){let z=U.slice(24,30);try{let f=Buffer.from(z,"hex").toString("ascii").replace(/\0/g,"");if(/^[A-Za-z0-9?!@#$%^&*<>(){}[\]|]+$/.test(f)&&f.length>0)return f}catch{}return U.toUpperCase()}try{let z=U.replace(/0+$/,""),f=z.length%2===0?z:`${z}0`,J=Buffer.from(f,"hex").toString("utf8");if(/^[\x20-\x7E]+$/.test(J))return J}catch{}return U.toUpperCase()}function k(U){if(E(U))return U.toUpperCase();if(U.length<=3)return U;return D(U)}import{RequestClient as m5,warnOnce as z5}from"@swapkit/helpers";var P=[{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 b5(U,z){let f=k(U),J=P.find((B)=>k(B.currency)===f&&B.issuer===z);if(J)return J;try{let B=await m5.get(`https://api.xrplmeta.org/token/${U}:${z}`);if(B)return{currency:U,decimals:15,description:B.desc,domain:B.domain,icon:B.icon,issuer:z,name:B.name,verified:B.self_assessment?.is_regulated||B.self_assessment?.is_licensed}}catch(B){z5({condition:!0,id:`xrpl_token_lookup_${U}_${z}`,warning:`Failed to fetch XRPL token info for ${U}:${z}: ${B}`})}return{currency:U,decimals:15,issuer:z,verified:!1}}function D5(U){return P.filter((z)=>z.issuer===U)}function F5(U,z){let f=k(U);return P.some((J)=>k(J.currency)===f&&J.issuer===z)}var j5={ACCOUNT_NOT_FOUND:19};function p(U){if(typeof U!=="object"||U===null||!("data"in U))return!1;let{data:z}=U;return typeof z==="object"&&z!==null&&"error_code"in z&&z.error_code===j5.ACCOUNT_NOT_FOUND}var w={tecFROZEN:"tecFROZEN",tecNO_AUTH:"tecNO_AUTH",tecNO_DST:"tecNO_DST",tecNO_LINE:"tecNO_LINE",tecPATH_DRY:"tecPATH_DRY",tecUNFUNDED_OFFER:"tecUNFUNDED_OFFER"};function c(U){let z=U.match(/^XRP\.([A-Fa-f0-9]{40}|[\x20-\x7E]{1,20})-([a-zA-Z0-9]{25,34})$/);if(!z?.[1]||!z?.[2])return null;if(!K(z[2]))return null;return{currency:z[1],issuer:z[2]}}function J5(U,z){return`${N.Ripple}.${U}-${z}`}async function u(U){if(U.isGasAsset){let{xrpToDrops:f}=await import("xrpl");return f(U.getValue("string"))}let z=c(U.toString());if(!z)throw new Y({errorKey:"toolbox_ripple_asset_not_supported",info:{asset:U.toString()}});return{currency:z.currency,issuer:z.issuer,value:U.getValue("string")}}function Y5({fee:U,lastLedgerSequence:z,sequence:f,transaction:J}){return f!==void 0&&U!==void 0&&z!==void 0&&!A(J.Account)&&!A(J.Destination)}function o(U,z){let f,J=()=>{return f??=import("xrpl").then(({Wallet:B})=>B.fromMnemonic(U,z?{derivationPath:z}:void 0)),f};return{getAddress:async()=>(await J()).address,signTransaction:async(B)=>(await J()).sign(B)}}function K(U){return f5(U)||A(U)}function q5(U={}){let z;async function f(){if(z)return z;return z=await g(U).with({phrase:x.string},({phrase:G,derivationPath:m,index:$=0})=>o(G,$5(Z5({chain:N.Ripple,derivationPath:m,index:$})))).with({signer:x.any},({signer:G})=>G).otherwise(()=>{return}),z}let J;async function B(){let G=await W5(N.Ripple);if(!G)throw new Y({errorKey:"toolbox_ripple_rpc_not_configured",info:{chain:N.Ripple}});let{Client:m}=await import("xrpl"),$=new m(G);return await $.connect(),$}async function b(){if(J){let G=await J.catch(()=>null);if(G?.isConnected())return G}return J=B(),J}async function d(G){let m=await G.request({command:"server_state"}),$=m.result.state.validated_ledger??m.result.state.closed_ledger;if(!$||!Number.isSafeInteger($.reserve_base)||$.reserve_base<0||!Number.isSafeInteger($.reserve_inc)||$.reserve_inc<0)throw new Y({errorKey:"toolbox_ripple_get_balance_error",info:{reason:"XRPL reserve data is unavailable or invalid"}});return{baseReserveDrops:BigInt($.reserve_base),ownerReserveDrops:BigInt($.reserve_inc)}}let F=async()=>{let G=await f();if(!G)throw new Y({errorKey:"toolbox_ripple_signer_not_found"});return G.getAddress()},l=async(G)=>{let m=G||await F(),{baseDecimal:$}=y(N.Ripple),Z=await b();try{let[W,j]=await Promise.all([Z.request({account:m,command:"account_info"}),Z.request({account:m,command:"account_lines"})]),Q=W.result.account_data.Balance,M=[R.from({chain:N.Ripple,fromBaseDecimal:$,value:Q})];for(let _ of j.result.lines){let X=J5(_.currency,_.account);if(Number.parseFloat(_.balance)!==0)M.push(R.from({asset:X,asyncTokenLookup:!1,value:_.balance}))}return M}catch(W){if(p(W))return[R.from({chain:N.Ripple,value:0})];throw new Y({errorKey:"toolbox_ripple_get_balance_error",info:{address:m,error:W}})}},T=async()=>{let{baseDecimal:G}=y(N.Ripple),Z=(await(await b()).request({command:"fee"})).result.drops.open_ledger_fee;return R.from({chain:N.Ripple,fromBaseDecimal:G,value:Z})};async function V(G){let m=G||await F(),$=await b();try{return(await $.request({account:m,command:"account_lines"})).result.lines.map((W)=>({account:W.account,authorized:W.authorized??!1,balance:W.balance,currency:W.currency,freeze:W.freeze??!1,freezePeer:W.freeze_peer??!1,limit:W.limit,limitPeer:W.limit_peer,noRipple:W.no_ripple??!1,noRipplePeer:W.no_ripple_peer??!1,peerAuthorized:W.peer_authorized??!1,qualityIn:W.quality_in??0,qualityOut:W.quality_out??0}))}catch(Z){if(p(Z))return[];throw new Y({errorKey:"toolbox_ripple_get_trust_lines_error",info:{address:m,error:Z}})}}async function i({address:G,currency:m,issuer:$}){let Z=await V(G),W=D(m);return Z.some((j)=>{return D(j.currency)===W&&j.account===$})}async function S({currency:G,issuer:m,limit:$,sender:Z}){let W=Z||await F();if(!K(m))throw new Y({errorKey:"core_transaction_invalid_recipient_address",info:{address:m}});let j=Number.parseFloat($);if(Number.isNaN(j)||j<0)throw new Y({errorKey:"toolbox_ripple_invalid_trust_line_limit",info:{limit:$}});let Q=await b(),M={Account:W,LimitAmount:{currency:G,issuer:m,value:$},TransactionType:"TrustSet"};return Q.autofill(M)}async function n(G,m){let[$,Z,W]=await Promise.all([G.request({account:m,command:"account_info"}),d(G),T()]),{Balance:j,OwnerCount:Q}=$.result.account_data,M=W.getBaseValue("bigint"),_=BigInt(j)-Z.baseReserveDrops-BigInt(Q)*Z.ownerReserveDrops-M;if(_<=0n)throw new Y({errorKey:"toolbox_sweep_amount_too_low",info:{asset:N.Ripple,balance:j,baseReserve:Z.baseReserveDrops.toString(),fee:M.toString(),ownerCount:Q,ownerReserve:Z.ownerReserveDrops.toString()}});let{baseDecimal:X}=y(N.Ripple),v=R.from({chain:N.Ripple,fromBaseDecimal:X,value:_.toString()});return{amount:await u(v),fee:M.toString()}}async function t(G,m){let $=c(G.toString());if(!$)throw new Y({errorKey:"toolbox_ripple_asset_not_supported",info:{asset:G.toString()}});let Z=await b(),W="0",j;while(!0){let Q=await Z.request({account:m,command:"account_lines",peer:$.issuer,...j!==void 0&&{marker:j}}),M=Q.result.lines.find((X)=>X.account===$.issuer&&D(X.currency)===D($.currency));if(M){W=M.balance;break}let _=Q.result.marker;if(_===void 0||_===null)break;j=_}if(!Number.isFinite(Number(W))||Number(W)<=0)throw new Y({errorKey:"toolbox_sweep_amount_too_low",info:{asset:G.toString(),balance:W}});return{currency:$.currency,issuer:$.issuer,value:W}}async function h({assetValue:G,recipient:m,memo:$,sender:Z,sweep:W,destinationTag:j,extendBySeconds:Q=150,sequence:M,fee:_,lastLedgerSequence:X}){if(!K(m))throw new Y({errorKey:"core_transaction_invalid_recipient_address"});let v=Z||await F();if(G.chain!==N.Ripple)throw new Y({errorKey:"toolbox_ripple_asset_not_supported",info:{asset:G.toString()}});let q=W&&G.isGasAsset?await n(await b(),v):void 0,U5=q?q.amount:W?await t(G,v):await u(G),I={Account:v,Amount:U5,Destination:m,TransactionType:"Payment",...q&&{Fee:q.fee},...j!==void 0&&{DestinationTag:j},...M!==void 0&&{Sequence:M},..._!==void 0&&{Fee:_},...X!==void 0&&{LastLedgerSequence:X}};if($)I.Memos=[{Memo:{MemoData:Buffer.from($).toString("hex")}}];if(Y5({fee:_,lastLedgerSequence:X,sequence:M,transaction:I}))return I;let L=await(await b()).autofill(I);if(X===void 0&&L.LastLedgerSequence&&Q>0)L.LastLedgerSequence+=Math.ceil(Q/4);return L}async function O(G){let m=await f();if(!m)throw new Y({errorKey:"toolbox_ripple_signer_not_found"});return m.signTransaction(G)}async function H(G){let $=await(await b()).submitAndWait(G),{result:Z}=$;if(Z.validated)return Z.hash;let W=Z.meta?.TransactionResult,j=g(W).with(w.tecNO_LINE,()=>"No trust line exists for this token").with(w.tecPATH_DRY,()=>"Payment path could not deliver funds").with(w.tecFROZEN,()=>"Token is frozen").otherwise(()=>{return});throw new Y({errorKey:"toolbox_ripple_broadcast_error",info:{chain:N.Ripple,...j?{reason:j}:{txResult:W}}})}let a=async(G)=>{try{let m=await O(G);return H(m.tx_blob)}catch(m){if(m instanceof Y)throw m;throw new Y({errorKey:"toolbox_ripple_broadcast_error",info:{chain:N.Ripple,error:m}})}};async function s({assetValue:G,memo:m,recipient:$,sweep:Z}){let W=await f();if(!W)throw new Y({errorKey:"toolbox_ripple_signer_not_found"});let j=await W.getAddress(),Q=await h({assetValue:G,memo:m,recipient:$,sender:j,sweep:Z}),M=await O(Q);return H(M.tx_blob)}async function r(G){let m=await f();if(!m)throw new Y({errorKey:"toolbox_ripple_signer_not_found"});let $=await m.getAddress(),Z=await S({...G,sender:$}),W=await O(Z);return H(W.tx_blob)}function e(){let G=J;if(J=null,G)G.then((m)=>{if(m?.isConnected())return m.disconnect();return}).catch((m)=>{console.warn("XRPL Cleanup failed silently:",m)})}return{broadcastTransaction:H,createSigner:o,createTransaction:h,disconnect:e,estimateTransactionFee:T,getAddress:F,getBalance:l,getTrustLines:V,hasTrustLine:i,setTrustLine:S,setTrustLineAndBroadcast:r,signAndBroadcastTransaction:a,signTransaction:O,transfer:s,validateAddress:K}}export{K as validateRippleAddress,c as parseXrplTokenIdentifier,k as normalizeCurrency,F5 as isKnownToken,E as isHexCurrency,Q5 as hexToCurrency,b5 as getXrplTokenInfo,q5 as getRippleToolbox,D5 as getKnownTokensByIssuer,J5 as formatXrplTokenIdentifier,D as currencyToHex,w as XRPL_TOKEN_ERROR_CODES,P as XRPL_KNOWN_TOKENS};
1
+ import{ga as U}from"../../chunk-k50sjysj.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 +1 @@
1
- import{fa as v}from"../../chunk-nvfkjbyq.js";import{ga as X}from"../../chunk-xbdjxeqd.js";import{PublicKey as H}from"@solana/web3.js";import{AssetValue as T,Chain as E,DerivationPath as C,derivationPathToString as h,getChainConfig as b,getRPCUrl as P,NetworkDerivationPath as u,SwapKitError as x,updateDerivationPath as l}from"@swapkit/helpers";import{match as p,P as D}from"ts-pattern";async function m(j){let q=T.from({address:j,chain:E.Solana});if(q.symbol!=="UNKNOWN")return{decimals:q.decimal||0,id:j,logoURI:q.getIconUrl(),name:q.symbol,symbol:q.ticker};let z=`https://lite-api.jup.ag/tokens/v2/search?query=${encodeURIComponent(j)}`;try{let F=await fetch(z);if(!F.ok)return null;let J=await F.json();if(!Array.isArray(J)||J.length===0)return null;return J.find((G)=>G.id===j)||null}catch{return null}}async function d(j){let q=await M(),{PublicKey:z}=await import("@solana/web3.js"),{TOKEN_PROGRAM_ID:F}=await import("@solana/spl-token"),J=new z(j),{baseDecimal:Q}=b(E.Solana),G=await q.getBalance(J),N=[T.from({chain:E.Solana,fromBaseDecimal:Q,value:G||0})],U=await q.getParsedTokenAccountsByOwner(J,{programId:F});for(let{account:W}of U.value){let _=W.data.parsed.info,R=_.mint,Y=_.tokenAmount.amount;if(Number(Y)===0)continue;let Z=await m(R),$=Z?.symbol||"UNKNOWN",B=Z?.decimals||_.tokenAmount.decimals;N.push(T.from({asset:`${E.Solana}.${$}-${R}`,fromBaseDecimal:B,value:Y}))}return N}function k(j){try{let q=new H(j);return H.isOnCurve(q.toBytes())}catch{return!1}}function e(j){let q=j&&"index"in j?j.index||0:0,z=h(j&&"derivationPath"in j&&j.derivationPath?j.derivationPath:l(u[E.Solana],{index:q})),F;async function J(){if(F)return F;return F=await p(j).with({phrase:D.string},({phrase:G})=>K({derivationPath:z,phrase:G})).with({signer:D.any},({signer:G})=>G).otherwise(()=>{return}),F}async function Q(){let G=await J();return G?.publicKey?f(G.publicKey):""}return{broadcastTransaction:w(M),createKeysForPath:K,createTransaction:V(M),createTransactionFromInstructions:s,estimateTransactionFee:g(M),getAddress:Q,getAddressFromPubKey:f,getBalance:v(E.Solana),getBalanceFromRPC:d,getConnection:M,getPubkeyFromAddress:(G)=>new H(G),signAndBroadcastTransaction:async(G)=>{let N=await A(M,J)(G);return w(M)(N)},signTransaction:A(M,J),transfer:o(M,J),validateAddress:k}}function g(j){return async({recipient:q,assetValue:z,memo:F,isProgramDerivedAddress:J,sender:Q})=>{let G=await j(),N=await V(j)({assetValue:z,isProgramDerivedAddress:J,memo:F,recipient:q,sender:Q}),U=await y(G,N),{baseDecimal:W}=b(E.Solana);return T.from({chain:E.Solana,fromBaseDecimal:W,value:U})}}async function y(j,q){let z=await j.getFeeForMessage(q.compileMessage());if(z.value===null)throw new x("toolbox_fee_estimation_failed","Could not estimate Solana fee.");return z.value}async function M(){let{Connection:j}=await import("@solana/web3.js"),q=await P(E.Solana);return new j(q,{commitment:"confirmed",fetchMiddleware:(z,F,J)=>{let Q={};for(let[G,N]of Object.entries(F?.headers??{})){let U=G.toLowerCase();if(U!=="pragma"&&U!=="solana-client")Q[G]=N}J(z,{...F,headers:Q})}})}function c(j){return async({assetValue:q,recipient:z,sender:F,isProgramDerivedAddress:J,sweep:Q})=>{let G=new H(F);if(q.isGasAsset){let{Transaction:N,SystemProgram:U}=await import("@solana/web3.js");return new N().add(U.transfer({fromPubkey:G,lamports:Q?0:q.getBaseValue("number"),toPubkey:new H(z)}))}if(q.address){let N=await j();return a({amount:Q?0:q.getBaseValue("number"),connection:N,decimals:q.decimal,from:G,isProgramDerivedAddress:J,recipient:z,sweep:Q,tokenAddress:q.address})}return}}async function a({tokenAddress:j,recipient:q,from:z,connection:F,amount:J,decimals:Q,isProgramDerivedAddress:G,sweep:N}){let{getAssociatedTokenAddress:U,getAccount:W,createAssociatedTokenAccountInstruction:_,createTransferCheckedInstruction:R}=await import("@solana/spl-token"),{Transaction:Y}=await import("@solana/web3.js"),Z=new Y,$=new H(j),B=await U($,z),O=new H(q),L=await U($,O,G),I=!1;try{await W(F,L),I=!0}catch{}if(!I)Z.add(_(z,L,O,$));let S=N?BigInt((await F.getTokenAccountBalance(B)).value.amount):J;if(N&&S<=0n)throw new x({errorKey:"toolbox_sweep_amount_too_low",info:{asset:j,balance:S.toString()}});return Z.add(R(B,$,L,z,S,Q)),Z}function V(j){return async({recipient:q,assetValue:z,memo:F,isProgramDerivedAddress:J,sender:Q,recentBlockhash:G,sweep:N})=>{let{createMemoInstruction:U}=await import("@solana/spl-memo"),W=new H(Q);if(!(J||k(q)))throw new x("core_transaction_invalid_recipient_address");let _,R=()=>_??=j(),Y=await c(R)({assetValue:z,isProgramDerivedAddress:J,recipient:q,sender:Q,sweep:N});if(!Y)throw new x("core_transaction_invalid_sender_address");if(F)Y.add(U(F));if(Y.recentBlockhash=G??(await(await R()).getLatestBlockhash()).blockhash,Y.feePayer=W,N&&z.isGasAsset){let Z=await R(),[$,B,O]=await Promise.all([Z.getBalance(W),y(Z,Y),Z.getMinimumBalanceForRentExemption(0)]),L=$-B-O;if(L<=0)throw new x({errorKey:"toolbox_sweep_amount_too_low",info:{balance:$,fee:B,rentReserve:O}});let{SystemProgram:I}=await import("@solana/web3.js");Y.instructions[0]=I.transfer({fromPubkey:W,lamports:L,toPubkey:new H(q)})}return Y}}async function s({instructions:j}){let{Transaction:q}=await import("@solana/web3.js"),z=new q().add(...j);if(!z)throw new x("core_transaction_invalid_sender_address");return z}function o(j,q){return async({recipient:z,assetValue:F,memo:J,isProgramDerivedAddress:Q,sweep:G})=>{let N=await q();if(!N)throw new x("core_transaction_invalid_sender_address");let U=N.publicKey?.toString()??(await N.connect()).publicKey.toString(),W=await V(j)({assetValue:F,isProgramDerivedAddress:Q,memo:J,recipient:z,sender:U,sweep:G});if("signTransaction"in N){let _=await N.signTransaction(W);return w(j)(_)}return W.sign(N),w(j)(W)}}function w(j){return async(q)=>{return(await j()).sendRawTransaction(q.serialize())}}function A(j,q){return async(z)=>{let F=await q();if(!F)throw new x("toolbox_solana_no_signer");let{VersionedTransaction:J}=await import("@solana/web3.js");if(!(z instanceof J)){let G=await(await j()).getLatestBlockhash();z.recentBlockhash=G.blockhash,z.feePayer=F.publicKey||void 0}if("connect"in F)return await F.signTransaction(z);return z.sign([F]),z}}async function K({phrase:j,derivationPath:q=C.SOL}){let{HDKey:z}=await import("micro-key-producer/slip10.js"),{mnemonicToSeedSync:F}=await import("@scure/bip39"),{Keypair:J}=await import("@solana/web3.js"),Q=F(j),G=z.fromMasterSeed(Q);return J.fromSeed(G.derive(q,!0).privateKey)}function f(j){return j.toString()}export{k as validateSolanaAddress,e as getSolanaToolbox,m as fetchTokenMetaData,K as createKeysForPath};
1
+ import{fa as D}from"../../chunk-s1528ghz.js";import{ga as d}from"../../chunk-k50sjysj.js";import{PublicKey as p}from"@solana/web3.js";import{AssetValue as k,Chain as w,DerivationPath as M,derivationPathToString as L,getChainConfig as R,getRPCUrl as G,NetworkDerivationPath as N,SwapKitError as P,updateDerivationPath as U}from"@swapkit/helpers";import{match as V,P as K}from"ts-pattern";async function j(n){let e=k.from({address:n,chain:w.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 a=await fetch(t);if(!a.ok)return null;let r=await a.json();if(!Array.isArray(r)||r.length===0)return null;return r.find((o)=>o.id===n)||null}catch{return null}}async function E(n){let e=await y(),{PublicKey:t}=await import("@solana/web3.js"),{TOKEN_PROGRAM_ID:a}=await import("@solana/spl-token"),r=new t(n),{baseDecimal:s}=R(w.Solana),o=await e.getBalance(r),i=[k.from({chain:w.Solana,fromBaseDecimal:s,value:o||0})],c=await e.getParsedTokenAccountsByOwner(r,{programId:a});for(let{account:l}of c.value){let f=l.data.parsed.info,T=f.mint,u=f.tokenAmount.amount;if(Number(u)===0)continue;let m=await j(T),g=m?.symbol||"UNKNOWN",h=m?.decimals||f.tokenAmount.decimals;i.push(k.from({asset:`${w.Solana}.${g}-${T}`,fromBaseDecimal:h,value:u}))}return i}function O(n){try{let e=new p(n);return p.isOnCurve(e.toBytes())}catch{return!1}}function nn(n){let e=n&&"index"in n?n.index||0:0,t=L(n&&"derivationPath"in n&&n.derivationPath?n.derivationPath:U(N[w.Solana],{index:e})),a;async function r(){if(a)return a;return a=await V(n).with({phrase:K.string},({phrase:o})=>x({derivationPath:t,phrase:o})).with({signer:K.any},({signer:o})=>o).otherwise(()=>{return}),a}async function s(){let o=await r();return o?.publicKey?I(o.publicKey):""}return{broadcastTransaction:_(y),createKeysForPath:x,createTransaction:C(y),createTransactionFromInstructions:z,estimateTransactionFee:W(y),getAddress:s,getAddressFromPubKey:I,getBalance:D(w.Solana),getBalanceFromRPC:E,getConnection:y,getPubkeyFromAddress:(o)=>new p(o),signAndBroadcastTransaction:async(o)=>{let i=await B(y,r)(o);return _(y)(i)},signTransaction:B(y,r),transfer:J(y,r),validateAddress:O}}function W(n){return async({recipient:e,assetValue:t,memo:a,isProgramDerivedAddress:r,sender:s})=>{let o=await n(),i=await C(n)({assetValue:t,isProgramDerivedAddress:r,memo:a,recipient:e,sender:s}),c=await F(o,i),{baseDecimal:l}=R(w.Solana);return k.from({chain:w.Solana,fromBaseDecimal:l,value:c})}}async function F(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 y(){let{Connection:n}=await import("@solana/web3.js"),e=await G(w.Solana);return new n(e,{commitment:"confirmed",fetchMiddleware:(t,a,r)=>{let s={};for(let[o,i]of Object.entries(a?.headers??{})){let c=o.toLowerCase();if(c!=="pragma"&&c!=="solana-client")s[o]=i}r(t,{...a,headers:s})}})}function H(n){return async({assetValue:e,recipient:t,sender:a,isProgramDerivedAddress:r,sweep:s})=>{let o=new p(a);if(e.isGasAsset){let{Transaction:i,SystemProgram:c}=await import("@solana/web3.js");return new i().add(c.transfer({fromPubkey:o,lamports:s?0:e.getBaseValue("number"),toPubkey:new p(t)}))}if(e.address){let i=await n();return q({amount:s?0:e.getBaseValue("number"),connection:i,decimals:e.decimal,from:o,isProgramDerivedAddress:r,recipient:t,sweep:s,tokenAddress:e.address})}return}}async function q({tokenAddress:n,recipient:e,from:t,connection:a,amount:r,decimals:s,isProgramDerivedAddress:o,sweep:i}){let{getAssociatedTokenAddress:c,getAccount:l,createAssociatedTokenAccountInstruction:f,createTransferCheckedInstruction:T}=await import("@solana/spl-token"),{Transaction:u}=await import("@solana/web3.js"),m=new u,g=new p(n),h=await c(g,t),S=new p(e),b=await c(g,S,o),v=!1;try{await l(a,b),v=!0}catch{}if(!v)m.add(f(t,b,S,g));let A=i?BigInt((await a.getTokenAccountBalance(h)).value.amount):r;if(i&&A<=0n)throw new P({errorKey:"toolbox_sweep_amount_too_low",info:{asset:n,balance:A.toString()}});return m.add(T(h,g,b,t,A,s)),m}function C(n){return async({recipient:e,assetValue:t,memo:a,isProgramDerivedAddress:r,sender:s,recentBlockhash:o,sweep:i})=>{let{createMemoInstruction:c}=await import("@solana/spl-memo"),l=new p(s);if(!(r||O(e)))throw new P("core_transaction_invalid_recipient_address");let f,T=()=>f??=n(),u=await H(T)({assetValue:t,isProgramDerivedAddress:r,recipient:e,sender:s,sweep:i});if(!u)throw new P("core_transaction_invalid_sender_address");if(a)u.add(c(a));if(u.recentBlockhash=o??(await(await T()).getLatestBlockhash()).blockhash,u.feePayer=l,i&&t.isGasAsset){let m=await T(),[g,h,S]=await Promise.all([m.getBalance(l),F(m,u),m.getMinimumBalanceForRentExemption(0)]),b=g-h-S;if(b<=0)throw new P({errorKey:"toolbox_sweep_amount_too_low",info:{balance:g,fee:h,rentReserve:S}});let{SystemProgram:v}=await import("@solana/web3.js");u.instructions[0]=v.transfer({fromPubkey:l,lamports:b,toPubkey:new p(e)})}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:a,memo:r,isProgramDerivedAddress:s,sweep:o})=>{let i=await e();if(!i)throw new P("core_transaction_invalid_sender_address");let c=i.publicKey?.toString()??(await i.connect()).publicKey.toString(),l=await C(n)({assetValue:a,isProgramDerivedAddress:s,memo:r,recipient:t,sender:c,sweep:o});if("signTransaction"in i){let f=await i.signTransaction(l);return _(n)(f)}return l.sign(i),_(n)(l)}}function _(n){return async(e)=>(await n()).sendRawTransaction(e.serialize())}function B(n,e){return async(t)=>{let a=await e();if(!a)throw new P("toolbox_solana_no_signer");let{VersionedTransaction:r}=await import("@solana/web3.js");if(!(t instanceof r)){let o=await(await n()).getLatestBlockhash();t.recentBlockhash=o.blockhash,t.feePayer=a.publicKey||void 0}if("connect"in a)return await a.signTransaction(t);return t.sign([a]),t}}async function x({phrase:n,derivationPath:e=M.SOL}){let{HDKey:t}=await import("micro-key-producer/slip10.js"),{mnemonicToSeedSync:a}=await import("@scure/bip39"),{Keypair:r}=await import("@solana/web3.js"),s=a(n),o=t.fromMasterSeed(s);return r.fromSeed(o.derive(e,!0).privateKey)}function I(n){return n.toString()}export{x as createKeysForPath,j as fetchTokenMetaData,nn as getSolanaToolbox,O as validateSolanaAddress};
@@ -1 +1 @@
1
- import{fa as o}from"../../chunk-nvfkjbyq.js";import{ga as j}from"../../chunk-xbdjxeqd.js";import{AssetValue as R,Chain as V,DerivationPath as d,derivationPathToString as e,getChainConfig as p,getRPCUrl as v,NetworkDerivationPath as ff,SwapKitError as Q,updateDerivationPath as Gf}from"@swapkit/helpers";import{match as u,P as m}from"ts-pattern";var D="0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d",l="0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7",C="0x01a736d6ed154502257f02b1ccdf4d9d1089f80811cd6acad48e6b6a9d1f2003";function K(X){if(!X)return!1;return/^0x[0-9a-fA-F]{1,64}$/.test(X)}async function P({phrase:X,derivationPath:$=d.STRK}){let{HDKey:U}=await import("@scure/bip32"),{mnemonicToSeedSync:N}=await import("@scure/bip39"),{ec:M,hash:L,encode:W,CallData:Z}=await import("starknet"),B=N(X),O=U.fromMasterSeed(B).derive($);if(!O.privateKey)throw new Q("toolbox_starknet_no_signer");let k=W.addHexPrefix(Buffer.from(O.privateKey).toString("hex")),F=M.starkCurve.grindKey(k),H=W.addHexPrefix(F),y=M.starkCurve.getStarkKey(H),_=Z.compile([y,0]);return{address:L.calculateContractAddressFromHash(y,C,_,0),privateKey:H,publicKey:y}}async function i({phrase:X,derivationPath:$=d.STRK}){let{Account:U,RpcProvider:N}=await import("starknet"),{privateKey:M,address:L}=await P({derivationPath:$,phrase:X}),W=await v(V.Starknet),Z=new N({nodeUrl:W});return new U({address:L,provider:Z,signer:M})}function qf(X){let $=V.Starknet,U=X&&"index"in X?X.index||0:0,N=e(X&&"derivationPath"in X&&X.derivationPath?X.derivationPath:Gf(ff[$],{index:U})),M,L,W;async function Z(){if(L)return L;if(M)return L=M.provider,L;let{RpcProvider:G}=await import("starknet"),f=await v($);return L=new G({nodeUrl:f}),L}async function B(G){let f=await Z(),q=G||await F();if(!q)return!1;try{return await f.getClassHashAt(q),!0}catch(z){if(z instanceof Error&&z.message.includes("Contract not found"))return!1;let I=z;if(I?.code===20||I?.code===19)return!1;throw z}}async function b(){let{CallData:G,hash:f}=await import("starknet"),q=await Z(),z=await k();if(!z)throw new Q("toolbox_starknet_no_signer");if(!W)throw new Q({errorKey:"toolbox_starknet_account_not_deployed",info:{message:"Cannot deploy account: public key not available. Use phrase-based wallet initialization."}});if(await B())return z.address;let J=G.compile([W,0]);if(f.calculateContractAddressFromHash(W,C,J,0).toLowerCase()!==z.address.toLowerCase())throw new Q({errorKey:"toolbox_starknet_account_not_deployed",info:{message:"Address mismatch during deployment verification"}});let x={addressSalt:W,classHash:C,constructorCalldata:J},{transaction_hash:E}=await z.deployAccount(x);return await q.waitForTransaction(E),E}async function O(){if(!await B()){if(!W)throw new Q({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 b()}}async function k(){if(M)return M;return M=await u(X).with({phrase:m.string},async({phrase:G})=>{let{Account:f,RpcProvider:q}=await import("starknet"),{privateKey:z,address:I,publicKey:J}=await P({derivationPath:N,phrase:G});W=J;let Y=await v(V.Starknet),x=new q({nodeUrl:Y});return new f({address:I,provider:x,signer:z})}).with({address:m.string,privateKey:m.string},async({privateKey:G,address:f})=>{let{Account:q}=await import("starknet"),z=await Z();return new q({address:f,provider:z,signer:G})}).with({signer:m.instanceOf(Object)},({signer:G})=>G).otherwise(()=>{return}),M}async function F(){return(await k())?.address??""}async function H(G,f){let q=await Z(),{uint256:z,CallData:I}=await import("starknet"),[J="0",Y="0"]=await q.callContract({calldata:I.compile({account:G}),contractAddress:f,entrypoint:"balanceOf"});return z.uint256ToBN({high:Y,low:J})}async function y(G){let{baseDecimal:f}=p($),q=[],z=[D,l];for(let I of z)try{let J=await H(G,I);u(I).with(D,()=>{q.push(R.from({chain:$,fromBaseDecimal:f,value:J}))}).with(l,()=>{if(J>0n)q.push(R.from({asset:`${$}.ETH-${I}`,fromBaseDecimal:f,value:J}))}).otherwise(()=>{})}catch{}return q}async function _(G){let f=await k();if(f&&(!G||f.address.toLowerCase()===G.toLowerCase()))return f;if(G){let{Account:q}=await import("starknet"),z=await Z();return new q({address:G,provider:z,signer:"0x0"})}throw new Q({errorKey:"toolbox_starknet_fee_estimation_failed",info:{message:"Estimating fee needs a valid sender address or signer"}})}async function h(G,f){try{let q=await _(f),{overall_fee:z}=await q.estimateInvokeFee(G);if(z<=0n)throw new Q({errorKey:"toolbox_starknet_fee_estimation_failed",info:{message:"Sweep fee estimation returned a non-positive fee",sender:f}});return z}catch(q){throw new Q({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:f}},q)}}async function A(G,f){let q=await g(G),z=f.isGasAsset?q.find(({isGasAsset:I})=>I):q.find(({address:I})=>I?.toLowerCase()===f.address?.toLowerCase());if(z)return z.getBaseValue("bigint");if(f.isGasAsset)return H(G,D);if(f.address)return H(G,f.address);return 0n}async function w({recipient:G,assetValue:f,sender:q,sweep:z}){let{CallData:I,uint256:J}=await import("starknet");if(!K(G))throw new Q("core_transaction_invalid_recipient_address",{address:G});let Y=f.isGasAsset?D:f.address;if(!Y)throw new Q("toolbox_starknet_invalid_address",{address:Y,assetValue:f});let x=f.getBaseValue("bigint");if(z){let T=q??await F();if(!K(T))throw new Q("core_transaction_invalid_sender_address",{address:T});if(f.isGasAsset){let r=[{calldata:I.compile([G,J.bnToUint256(1n)]),contractAddress:Y,entrypoint:"transfer"}],a=await h(r,T);x=await A(T,f)-a}else x=await A(T,f);if(x<=0n)throw new Q({errorKey:"toolbox_sweep_amount_too_low",info:{amount:x.toString(),asset:f.toString()}})}let E=J.bnToUint256(x);return[{calldata:I.compile([G,E]),contractAddress:Y,entrypoint:"transfer"}]}async function n({recipient:G,assetValue:f,sender:q}){let{baseDecimal:z}=p(V.Starknet);try{let I=await w({assetValue:f,recipient:G}),Y=await(await _(q)).estimateInvokeFee(I);if(Y?.overall_fee)return R.from({chain:$,fromBaseDecimal:z,value:Y.overall_fee})}catch(I){throw new Q("toolbox_starknet_fee_estimation_failed",I)}return R.from({chain:$,value:"0.00001"})}async function c({recipient:G,assetValue:f,memo:q,sweep:z}){let I=await k();if(!I)throw new Q("toolbox_starknet_no_signer");await O();let J=await w({assetValue:f,memo:q,recipient:G,sender:I.address,sweep:z});return(await I.execute(J)).transaction_hash}async function t(G){let f=await k();if(!f)throw new Q("toolbox_starknet_no_signer");let q=await f.signMessage(G);return Array.isArray(q)?q:[q.r.toString(),q.s.toString()]}async function S(G){let f=await k();if(!f)throw new Q("toolbox_starknet_no_signer");return await O(),(await f.execute(G)).transaction_hash}function s(G){return S(G)}async function g(G,f=!0){try{return await o($)(G,f)}catch{return y(G)}}return{broadcastTransaction:S,createKeysForPath:i,createTransaction:w,deployAccount:b,estimateTransactionFee:n,getAddress:F,getBalance:g,getProvider:Z,isAccountDeployed:B,signAndBroadcastTransaction:s,signMessage:t,transfer:c,validateAddress:K}}export{K as validateStarknetAddress,i as starknetCreateKeysForPath,qf as getStarknetToolbox,P as deriveStarknetKeys};
1
+ import{fa as I}from"../../chunk-s1528ghz.js";import{ga as u}from"../../chunk-k50sjysj.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{ga as x}from"../../chunk-xbdjxeqd.js";import{AssetValue as z,Chain as $,derivationPathToString as e,getChainConfig as A,getRPCUrl as d,SKConfig as PP,SwapKitError as M}from"@swapkit/helpers";import{match as jP,P as qP}from"ts-pattern";var GP=/^G[A-Z2-7]{55}$/,JP=/^[A-Za-z0-9]{1,12}$/,c=2,QP=600000,T;async function l(P){if(T&&Date.now()-T.timestamp<QP)return T.value;let Z=(await P.ledgers().order("desc").limit(1).call()).records[0]?.base_reserve_in_stroops;if(Z===void 0)throw new M({errorKey:"toolbox_stellar_balance_error",info:{reason:"base_reserve_unavailable"}});return T={timestamp:Date.now(),value:Z},Z}function S(P){return z.from({chain:$.Stellar,value:P}).getBaseValue("bigint")}function XP(P){let{baseDecimal:J}=A($.Stellar);return z.from({chain:$.Stellar,fromBaseDecimal:J,value:P}).getValue("string")}function i({balance:P,baseReserveInStroops:J,numSponsored:Z,numSponsoring:D,sellingLiabilities:W,subentryCount:N}){let f=S(P),U=S(W),I=c+N+D-Z,R=BigInt(I)*BigInt(J),k=f-R-U;return k>0n?k:0n}function YP({account:P,assetValue:J,baseReserveInStroops:Z,fee:D}){let W=P.balances.find((U)=>U.asset_type==="native"),f=(W?i({balance:W.balance,baseReserveInStroops:Z,numSponsored:P.num_sponsored,numSponsoring:P.num_sponsoring,sellingLiabilities:W.selling_liabilities,subentryCount:P.subentry_count}):0n)-BigInt(D);if(f<=0n)throw new M({errorKey:"toolbox_sweep_amount_too_low",info:{asset:J.toString(),reason:"spendable balance does not cover the transaction fee"}});return f}function ZP({baseReserveInStroops:P,sweepAmountInStroops:J}){if(J===void 0||P===void 0)return;let Z=BigInt(c)*BigInt(P);if(J<Z)throw new M({errorKey:"toolbox_sweep_amount_too_low",info:{amountInStroops:J,minimumStartingBalanceInStroops:Z,reason:"starting balance is below the Stellar account minimum"}})}function $P({account:P,assetCode:J,assetValue:Z,issuer:D,sweep:W}){if(!W)return Z.getValue("string");let N=P.balances.find((f)=>("asset_code"in f)&&f.asset_code===J&&f.asset_issuer===D)?.balance??"0";if(S(N)<=0n)throw new M({errorKey:"toolbox_sweep_amount_too_low",info:{asset:Z.toString(),balance:N,reason:"trust-line balance is not positive"}});return N}function MP(P){if(!P)return;if(new TextEncoder().encode(P).length>28)throw new M("helpers_invalid_memo_type")}function V(P){if(!P||typeof P!=="string"||!P.startsWith("G")||P.length!==56)return!1;return GP.test(P)}function v(P){if(typeof P!=="object"||P===null)return;let J="response"in P?P.response:void 0;return typeof J?.status==="number"?J.status:void 0}function WP(P){return v(P)===504}function FP(P){return P.hash?.().toString("hex")}function LP(P){return[...new Set([P,...PP.get("rpcUrls")[$.Stellar]])].filter(Boolean)}async function o(P){if(!V(P))return!1;try{let{StrKey:J}=await import("@stellar/stellar-sdk");return J.isValidEd25519PublicKey(P)}catch{return!1}}async function u(P){let{address:J,ticker:Z}=P,D=J?await o(J):!1;if(P.chain!==$.Stellar||P.isGasAsset||!JP.test(Z)||!J||!D)throw new M({errorKey:"helpers_invalid_asset_identifier",info:{identifier:P.toString()}});return{assetCode:Z,issuer:J}}function DP(P={}){let J;async function Z({phrase:j,path:q}){let{HDKey:Q}=await import("micro-key-producer/slip10.js"),{mnemonicToSeedSync:G}=await import("@scure/bip39"),{Keypair:X}=await import("@stellar/stellar-sdk"),Y=G(j),L=Q.fromMasterSeed(Y).derive(q,!0);return X.fromRawEd25519Seed(Buffer.from(L.privateKey))}async function D(){if(J)return J;let j=jP(P).with({phrase:qP.string},({phrase:G})=>G).otherwise(()=>{return});if(!j)throw new M("toolbox_stellar_no_signer");if(P.derivationPath&&(P.derivationPath[3]||P.derivationPath[4]))throw new M("toolbox_derivation_slot_unsupported",{chain:$.Stellar,derivationPath:P.derivationPath});let q=P.index??0;if(!P.derivationPath&&(!Number.isInteger(q)||q<0))throw new M("toolbox_derivation_slot_unsupported",{chain:$.Stellar,index:q});let Q=P.derivationPath?e(P.derivationPath.slice(0,3)):`m/44'/148'/${q}'`;return J=await Z({path:Q,phrase:j}),J}async function W(j){let{Horizon:q}=await import("@stellar/stellar-sdk"),Q=j||await d($.Stellar);return new q.Server(Q)}async function N(j,q){for(let Q of q)try{return(await(await W(Q)).transactions().transaction(j).call()).hash||j}catch{}return}async function f(j,q){let Q=await d($.Stellar),G=LP(Q),X=FP(j),Y;for(let F of G)try{let L=await W(F),{hash:_}=await L.submitTransaction(j);return _}catch(L){if(Y=L,!WP(L))break;let _=X?await N(X,G):void 0;if(_)return _}throw new M(q,Y)}async function U(){try{return(await D()).publicKey()}catch(j){if(j instanceof M&&j.errorKey==="toolbox_derivation_slot_unsupported")throw j;return""}}async function I(j){let q=j||await U();if(!q)throw new M("toolbox_stellar_account_not_found");let Q=await W(),[G,X]=await Promise.allSettled([Q.loadAccount(q),l(Q)]);if(G.status==="rejected"){let Y=G.reason;if(v(Y)===404)return[z.from({chain:$.Stellar,value:0})];throw Y}if(X.status==="rejected")throw X.reason;return G.value.balances.map((Y)=>{if(Y.asset_type==="native"){let _=i({balance:Y.balance,baseReserveInStroops:X.value,numSponsored:G.value.num_sponsored,numSponsoring:G.value.num_sponsoring,sellingLiabilities:Y.selling_liabilities,subentryCount:G.value.subentry_count}),{baseDecimal:B}=A($.Stellar);return z.from({chain:$.Stellar,fromBaseDecimal:B,value:_})}let F="asset_code"in Y?Y.asset_code:"",L="asset_issuer"in Y?Y.asset_issuer:"";return z.from({asset:`${$.Stellar}.${F}-${L}`,asyncTokenLookup:!1,value:Y.balance})})}async function R({address:j,assetValue:q}){if(q.chain!==$.Stellar)throw new M({errorKey:"toolbox_stellar_trustline_asset_invalid",info:{asset:q.toString()}});if(q.isGasAsset)return!0;if(!q.address)throw new M({errorKey:"toolbox_stellar_trustline_asset_invalid",info:{asset:q.toString(),reason:"missing issuer"}});let Q=await W(),G;try{G=await Q.loadAccount(j)}catch(X){if(v(X)===404)return!1;throw X}return G.balances.some((X)=>("asset_code"in X)&&X.asset_code===q.ticker&&X.asset_issuer===q.address)}async function k({recipient:j,assetValue:q,memo:Q,sender:G,sweep:X}){if(MP(Q),!await o(j))throw new M("core_transaction_invalid_recipient_address");let F=G||await U();if(!F)throw new M("toolbox_stellar_no_signer");let{Asset:L,Memo:_,Networks:B,Operation:O,TransactionBuilder:h}=await import("@stellar/stellar-sdk"),K=await W(),[H,y,g]=await Promise.all([K.fetchBaseFee(),K.loadAccount(F),X&&q.isGasAsset?l(K):Promise.resolve(void 0)]),w=new h(y,{fee:String(H),networkPassphrase:B.PUBLIC});if(q.isGasAsset){let E=X&&g!==void 0?YP({account:y,assetValue:q,baseReserveInStroops:g,fee:H}):void 0,C=E===void 0?q.getValue("string"):XP(E);try{await K.loadAccount(j),w.addOperation(O.payment({amount:C,asset:L.native(),destination:j}))}catch{ZP({baseReserveInStroops:g,sweepAmountInStroops:E}),w.addOperation(O.createAccount({destination:j,startingBalance:C}))}}else{let{assetCode:E,issuer:C}=await u(q),s=$P({account:y,assetCode:E,assetValue:q,issuer:C,sweep:X});w.addOperation(O.payment({amount:s,asset:new L(E,C),destination:j}))}if(Q)w.addMemo(_.text(Q));return w.setTimeout(30).build()}async function b({assetValue:j,limit:q,sender:Q}){let G=Q||await U();if(!G)throw new M("toolbox_stellar_no_signer");let{Asset:X,Networks:Y,Operation:F,TransactionBuilder:L}=await import("@stellar/stellar-sdk"),{assetCode:_,issuer:B}=await u(j),O=await W(),[h,K]=await Promise.all([O.fetchBaseFee(),O.loadAccount(G)]),H=new X(_,B),y=q!==void 0?F.changeTrust({asset:H,limit:q}):F.changeTrust({asset:H});return new L(K,{fee:String(h),networkPassphrase:Y.PUBLIC}).addOperation(y).setTimeout(30).build()}async function m(j){let{TransactionBuilder:q,Networks:Q}=await import("@stellar/stellar-sdk"),G=await D(),X=q.fromXDR(j.toXDR(),Q.PUBLIC);return X.sign(G),X}function p(j){return f(j,"toolbox_stellar_broadcast_error")}async function n({recipient:j,assetValue:q,memo:Q,sweep:G}){let X=await D(),Y=X.publicKey(),F=await k({assetValue:q,memo:Q,recipient:j,sender:Y,sweep:G});return F.sign(X),f(F,"toolbox_stellar_transaction_failed")}async function t({assetValue:j,limit:q}){let Q=await D(),G=await b({assetValue:j,limit:q,sender:Q.publicKey()});return G.sign(Q),f(G,"toolbox_stellar_transaction_failed")}async function r(j){let q=await m(j);return p(q)}async function a(){let{baseDecimal:j}=A($.Stellar);try{let G=(await(await W()).feeStats()).fee_charged.p50;return z.from({chain:$.Stellar,fromBaseDecimal:j,value:G})}catch{return z.from({chain:$.Stellar,fromBaseDecimal:j,value:"100"})}}return{broadcastTransaction:p,createTransaction:k,createTrustline:t,createTrustlineTransaction:b,estimateTransactionFee:a,getAddress:U,getBalance:I,hasTrustline:R,signAndBroadcastTransaction:r,signTransaction:m,transfer:n,validateAddress:V}}export{V as validateStellarAddress,DP as getStellarToolbox};
1
+ import{ga as b}from"../../chunk-k50sjysj.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{ga as H}from"../../chunk-xbdjxeqd.js";import{hexToU8a as k,isHex as w,u8aToHex as S}from"@polkadot/util";import{decodeAddress as Y,encodeAddress as Z}from"@polkadot/util-crypto";import{AssetValue as h,Chain as T,getRPCUrl as l,SubstrateChains as n,SwapKitError as R,SwapKitNumber as A}from"@swapkit/helpers";import{match as W,P as Q}from"ts-pattern";import{AssetValue as V,Chain as P,SwapKitNumber as E}from"@swapkit/helpers";async function b(I,o,j){let D=[o.set(0)];if(!j)return D;try{let v=await I.query.system?.account?.(j);if(!v)return D;let{data:{free:t}}=v,M=E.fromBigInt(BigInt(t.toString()),o.decimal).getValue("string");return[o.set(M)]}catch(v){let t=v instanceof Error?v.message:String(v);return console.error(`Error fetching substrate balance: ${t}`),D}}async function u(I,o,j){let D=[o.set(0)];if(!j)return D;try{let v=await I.query.flip?.account?.(j);if(!v)return D;let t=v.balance||v.data?.balance;if(!t||t.isEmpty)return D;let M=E.fromBigInt(BigInt(t.toString()),o.decimal).getValue("string");return[o.set(M)]}catch(v){let t=v instanceof Error?v.message:String(v);return console.error(`Error fetching chainflip balance: ${t}`),D}}function J(I,o){return function(D){let v=V.from({chain:I});switch(I){case P.Chainflip:return u(o,v,D);default:return b(o,v,D)}}}var B={decimals:[10],displayName:"Polkadot Relay Chain",network:"polkadot",prefix:0,standardAccount:"*25519",symbols:["DOT"],website:"https://polkadot.network"},x={decimals:[18],displayName:"Chainflip",network:"chainflip",prefix:2112,standardAccount:"*25519",symbols:["FLIP"],website:"https://chainflip.io/"},K={decimals:[],displayName:"Substrate",network:"substrate",prefix:42,standardAccount:"*25519",symbols:[],website:"https://substrate.io/"},G={DOT:B,FLIP:x,GENERIC:K};function fI(I,o){return W(I).with(...n,(j)=>a({chain:j,...o})).exhaustive()}function N(I){return"address"in I}async function X(I,o){let{Keyring:j}=await import("@polkadot/keyring"),{cryptoWaitReady:D}=await import("@polkadot/util-crypto");return await D(),new j({ss58Format:o,type:"sr25519"}).addFromUri(I)}var q=(I,o)=>I.rpc.system.accountNextIndex(o),z=(I,{recipient:o,assetValue:j,sweep:D})=>{let v=D?I.tx.balances?.transferAll?.(o,!0):I.tx.balances?.transferAllowDeath?.(o,j.getBaseValue("number"));if(D&&!v)throw new R("toolbox_substrate_transfer_error");return v},F=(I,o)=>{if(I===T.Chainflip&&o)throw new R("toolbox_substrate_not_supported")},p=async(I,o,j)=>{let D=z(I,j);if(!D)throw new R("toolbox_substrate_transfer_error");let v=N(o),t=v?o.address:j.sender;if(!t)throw new R("core_transaction_invalid_sender_address");let M=await q(I,t);return(await D.signAndSend(v?o:t,{nonce:M,signer:v?void 0:o})).toString()},c=async(I,o,j,D)=>{let v=z(I,D),t=N(o)?o.address:D.sender;if(!t)return Promise.resolve(j.set(0));let M=await v?.paymentInfo(t,{nonce:await q(I,t)})||{partialFee:0};return j.set(A.fromBigInt(BigInt(M.partialFee.toString()),j.decimal).getValue("string"))},g=async(I,o)=>{if(o)return I.send(o);return(await I.send()).toString()},i=async(I,o)=>{return await o.signAsync(I)},d=(I,o,j)=>{if(j)return o.signAndSend(I,j);return o.signAndSend(I).toString()},e=async({signer:I,address:o,tx:j,callback:D,api:v})=>{let t=await q(v,o);if(D)j.signAndSend(o,{nonce:t,signer:I},D);return j.signAndSend(o,{nonce:t,signer:I}).toString()};function r(I,o){let j=Y(I);return Z(j,o)}function _(I,o){return w(I)?k(I):Y(I,void 0,o)}function $(I,o="ss58",j){if(o==="hex")return S(I);return Z(I,j)}function s({chain:I,prefix:o}){let j=o||W(I).with(T.Polkadot,()=>G.DOT.prefix).with(T.Chainflip,()=>G.FLIP.prefix).otherwise(()=>G.GENERIC.prefix);return function(v){try{let t=_(v,j);return $(t,"ss58",j),!0}catch{return!1}}}function a({chain:I,generic:o=!1,...j}){let D=h.from({chain:I}),v;async function t(){let{ApiPromise:m,WsProvider:y}=await import("@polkadot/api"),f=await l(I),L=new y(f);return m.create({noInitWarn:!0,provider:L})}async function M(){if(v)return v;return v=await W(j).with({phrase:Q.string},({phrase:m})=>X(m,G[I].prefix)).with({signer:Q.any},({signer:m})=>m).otherwise(()=>{return}),v}let O=o?G.GENERIC:G[I];async function C(m){let y=await M(),f=m||y;if(!f)throw new R("core_wallet_not_keypair_wallet");return N(f)?f.address:void 0}return{broadcast:g,convertAddress:r,createKeyring:(m)=>X(m,O.prefix),createTransaction:async(m)=>{F(I,m.sweep);let y=await t();return z(y,m)},decodeAddress:_,encodeAddress:$,estimateTransactionFee:async(m)=>{F(I,m.sweep);let y=await M();if(!y)throw new R("core_wallet_not_keypair_wallet");let f=await t();return c(f,y,D,m)},gasAsset:D,getAddress:C,getApi:t,getBalance:async(m)=>{let y=await t(),f=J(I,y),L=m||await C();return f(L)},network:O,sign:async(m)=>{let y=await M();if(!y)throw new R("core_wallet_not_keypair_wallet");if(N(y))return i(y,m);throw new R("core_wallet_not_keypair_wallet","Signer does not have keyring pair capabilities required for signing.")},signAndBroadcast:async({tx:m,callback:y,address:f})=>{let L=await M();if(!L)throw new R("core_wallet_not_keypair_wallet");if(N(L))return d(L,m,y);let U=await t();if(f)return e({address:f,api:U,callback:y,signer:L,tx:m});throw new R("core_wallet_not_keypair_wallet","Signer does not have keyring pair capabilities required for signing.")},transfer:async(m)=>{F(I,m.sweep);let y=await M();if(!y)throw new R("core_wallet_not_keypair_wallet");let f=await t();return p(f,y,m)},validateAddress:s({chain:I,prefix:O.prefix})}}export{N as isKeyringPair,fI as getSubstrateToolbox,s as getSubstrateAddressValidator,a as createSubstrateToolbox,X as createKeyring,G as SubstrateNetwork};
1
+ import{ga as b}from"../../chunk-k50sjysj.js";import{hexToU8a as M,isHex as G,u8aToHex as F}from"@polkadot/util";import{decodeAddress as _,encodeAddress as T}from"@polkadot/util-crypto";import{AssetValue as U,Chain as y,getRPCUrl as W,SubstrateChains as H,SwapKitError as u,SwapKitNumber as L}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,r){let a=[t.set(0)];if(!r)return a;try{let n=await e.query.system?.account?.(r);if(!n)return a;let{data:{free:i}}=n,c=x.fromBigInt(BigInt(i.toString()),t.decimal).getValue("string");return[t.set(c)]}catch(n){let i=n instanceof Error?n.message:String(n);return console.error(`Error fetching substrate balance: ${i}`),a}}async function j(e,t,r){let a=[t.set(0)];if(!r)return a;try{let n=await e.query.flip?.account?.(r);if(!n)return a;let i=n.balance||n.data?.balance;if(!i||i.isEmpty)return a;let c=x.fromBigInt(BigInt(i.toString()),t.decimal).getValue("string");return[t.set(c)]}catch(n){let i=n instanceof Error?n.message:String(n);return console.error(`Error fetching chainflip balance: ${i}`),a}}function I(e,t){return function(a){let n=K.from({chain:e});switch(e){case B.Chainflip:return j(t,n,a);default:return N(t,n,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 ue(e,t){return w(e).with(...H,(r)=>ee({chain:r,...t})).exhaustive()}function f(e){return"address"in e}async function k(e,t){let{Keyring:r}=await import("@polkadot/keyring"),{cryptoWaitReady:a}=await import("@polkadot/util-crypto");return await a(),new r({ss58Format:t,type:"sr25519"}).addFromUri(e)}var S=(e,t)=>e.rpc.system.accountNextIndex(t),h=(e,{recipient:t,assetValue:r,sweep:a})=>{let n=a?e.tx.balances?.transferAll?.(t,!0):e.tx.balances?.transferAllowDeath?.(t,r.getBaseValue("number"));if(a&&!n)throw new u("toolbox_substrate_transfer_error");return n},m=(e,t)=>{if(e===y.Chainflip&&t)throw new u("toolbox_substrate_not_supported")},q=async(e,t,r)=>{let a=h(e,r);if(!a)throw new u("toolbox_substrate_transfer_error");let n=f(t),i=n?t.address:r.sender;if(!i)throw new u("core_transaction_invalid_sender_address");let c=await S(e,i);return(await a.signAndSend(n?t:i,{nonce:c,signer:n?void 0:t})).toString()},O=async(e,t,r,a)=>{let n=h(e,a),i=f(t)?t.address:a.sender;if(!i)return Promise.resolve(r.set(0));let c=await n?.paymentInfo(i,{nonce:await S(e,i)})||{partialFee:0};return r.set(L.fromBigInt(BigInt(c.partialFee.toString()),r.decimal).getValue("string"))},z=async(e,t)=>{if(t)return e.send(t);return(await e.send()).toString()},J=async(e,t)=>await t.signAsync(e),Q=(e,t,r)=>{if(r)return t.signAndSend(e,r);return t.signAndSend(e).toString()},X=async({signer:e,address:t,tx:r,callback:a,api:n})=>{let i=await S(n,t);if(a)r.signAndSend(t,{nonce:i,signer:e},a);return r.signAndSend(t,{nonce:i,signer:e}).toString()};function Y(e,t){let r=_(e);return T(r,t)}function v(e,t){return G(e)?M(e):_(e,void 0,t)}function C(e,t="ss58",r){if(t==="hex")return F(e);return T(e,r)}function Z({chain:e,prefix:t}){let r=t||w(e).with(y.Polkadot,()=>p.DOT.prefix).with(y.Chainflip,()=>p.FLIP.prefix).otherwise(()=>p.GENERIC.prefix);return function(n){try{let i=v(n,r);return C(i,"ss58",r),!0}catch{return!1}}}function ee({chain:e,generic:t=!1,...r}){let a=U.from({chain:e}),n;async function i(){let{ApiPromise:s,WsProvider:o}=await import("@polkadot/api"),d=await W(e),l=new o(d);return s.create({noInitWarn:!0,provider:l})}async function c(){if(n)return n;return n=await w(r).with({phrase:A.string},({phrase:s})=>k(s,p[e].prefix)).with({signer:A.any},({signer:s})=>s).otherwise(()=>{return}),n}let g=t?p.GENERIC:p[e];async function P(s){let o=await c(),d=s||o;if(!d)throw new u("core_wallet_not_keypair_wallet");return f(d)?d.address:void 0}return{broadcast:z,convertAddress:Y,createKeyring:(s)=>k(s,g.prefix),createTransaction:async(s)=>{m(e,s.sweep);let o=await i();return h(o,s)},decodeAddress:v,encodeAddress:C,estimateTransactionFee:async(s)=>{m(e,s.sweep);let o=await c();if(!o)throw new u("core_wallet_not_keypair_wallet");let d=await i();return O(d,o,a,s)},gasAsset:a,getAddress:P,getApi:i,getBalance:async(s)=>{let o=await i(),d=I(e,o),l=s||await P();return d(l)},network:g,sign:async(s)=>{let o=await c();if(!o)throw new u("core_wallet_not_keypair_wallet");if(f(o))return J(o,s);throw new u("core_wallet_not_keypair_wallet","Signer does not have keyring pair capabilities required for signing.")},signAndBroadcast:async({tx:s,callback:o,address:d})=>{let l=await c();if(!l)throw new u("core_wallet_not_keypair_wallet");if(f(l))return Q(l,s,o);let E=await i();if(d)return X({address:d,api:E,callback:o,signer:l,tx:s});throw new u("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 u("core_wallet_not_keypair_wallet");let d=await i();return q(d,o,s)},validateAddress:Z({chain:e,prefix:g.prefix})}}export{p as SubstrateNetwork,k as createKeyring,ee as createSubstrateToolbox,Z as getSubstrateAddressValidator,ue as getSubstrateToolbox,f as isKeyringPair};
@@ -1 +1 @@
1
- import{ga as V}from"../../chunk-xbdjxeqd.js";import{isValidSuiAddress as d}from"@mysten/sui/utils";import{AssetValue as P,Chain as y,derivationPathToString as u,getChainConfig as w,getRPCUrlSync as c,resolveDerivationPath as o,SwapKitError as Y}from"@swapkit/helpers";import{match as r,P as T}from"ts-pattern";var f="0x2::sui::SUI",x=256,i=50000000;async function m(W,b,$,L){let J=[],Q,M=0n;while(!0){let X=await W.getCoins({coinType:$,cursor:Q,owner:b});if(J.push(...X.data),M+=X.data.reduce((U,q)=>U+BigInt(q.balance),0n),!X.hasNextPage||L!==void 0&&M>=L)return J;Q=X.nextCursor}}async function C(W){return BigInt(await W.getReferenceGasPrice())}function E({coinObjectId:W,digest:b,version:$}){return{digest:b,objectId:W,version:$}}function n(W,b,$,L=!1){let J=b.reduce((H,G)=>H+BigInt(G.balance),0n);if(J<$)throw new Y("toolbox_sui_insufficient_balance",{available:J.toString(),required:$.toString()});let{selectedCoins:Q}=b.reduce((H,G)=>{if(H.total>=$)return H;return{selectedCoins:[...H.selectedCoins,G],total:H.total+BigInt(G.balance)}},{selectedCoins:[],total:0n}),M=Q[0],X=W.objectRef(E(M)),U=Q.slice(1).map((H)=>W.objectRef(E(H)));if(U.length>0)W.mergeCoins(X,U);if(L)return X;let[q]=W.splitCoins(X,[$]);return q}function p(W,b){let $=W.reduce((L,J)=>L+BigInt(J.balance),0n);if($<=0n)throw new Y({errorKey:"toolbox_sweep_amount_too_low",info:{asset:b,available:$.toString()}});return $}function g(W){if(W.length>x)throw new Y({errorKey:"toolbox_sui_transaction_creation_error",info:{coinCount:W.length,maxGasPaymentCoins:x,reason:`SUI transactions support at most ${x} gas payment coins`}})}function t(W,b,$,L,J,Q){let M=$.getBaseValue("bigint");if(Q)p(b,$.toString()),g(b);else l(b,M+BigInt(L));if(W.setGasPayment(b.map(E)),Q)W.transferObjects([W.gas],J);else{let[X]=W.splitCoins(W.gas,[$.getBaseValue("string")]);W.transferObjects([X],J)}}function l(W,b){let $=W.reduce((L,J)=>L+BigInt(J.balance),0n);if($<b)throw new Y("toolbox_sui_insufficient_balance",{available:$.toString(),required:b.toString()})}async function a({assetValue:W,gasBudget:b,recipient:$,sender:L,suiClient:J,sweep:Q,tx:M}){let X=W.getBaseValue("bigint"),[U,q]=await Promise.all([C(J),m(J,L,f,Q?void 0:X+BigInt(b))]);if(M.setGasPrice(U),t(M,q,W,b,$,Q),Q){let H=q.reduce((G,_)=>G+BigInt(_.balance),0n);return H<BigInt(b)?H:b}return b}async function s({assetValue:W,gasBudget:b,recipient:$,sender:L,suiClient:J,sweep:Q,tx:M}){let X=W.address;if(!X)throw new Y("toolbox_sui_missing_coin_type");let U=W.getBaseValue("bigint"),[q,H,G]=await Promise.all([C(J),m(J,L,f,BigInt(b)),m(J,L,X,Q?void 0:U)]);if(!G.length&&!Q)throw new Y("toolbox_sui_no_coins_found",{coinType:X});let _=Q?p(G,W.toString()):U;if(l(H,BigInt(b)),Q)g(H);M.setGasPrice(q),M.setGasPayment(H.map(E));let h=n(M,G,_,Q);M.transferObjects([h],$)}function e(W){try{return d(W)}catch{return!1}}function B(W){return"signWithIntent"in W}function $5({provider:W,...b}={}){let $;async function L(){if($)return $;return $=await r(b).with({phrase:T.string},async({phrase:z,derivationPath:Z,index:F=0})=>{let{Ed25519Keypair:D}=await import("@mysten/sui/keypairs/ed25519"),k=o({chain:y.Sui,derivationPath:Z,index:F});if(k.length!==5||k[3]!==0||k[4]!==0)throw new Y("toolbox_derivation_slot_unsupported",{chain:y.Sui,derivationPath:k});let R=u(k,{allHardened:!0});return D.deriveKeypair(z,R)}).with({signer:T.any},({signer:z})=>z).otherwise(()=>{return}),$}async function J(z=W){let{SuiJsonRpcClient:Z}=await import("@mysten/sui/jsonRpc");return new Z({network:"mainnet",url:z||c(y.Sui)})}async function Q(){return(await L())?.toSuiAddress()||""}function M(z){try{let Z=P.from({address:z,chain:y.Sui});return{asset:Z.toString(),decimals:Z.decimal}}catch{}return null}async function X(z){let Z=z||await Q();if(!Z)throw new Y("toolbox_sui_address_required");let{baseDecimal:F,chain:D}=w(y.Sui);try{let R=await(await J()).getAllBalances({owner:Z}),O=R.find(({coinType:j})=>j===f)?.totalBalance||"0",v=[P.from({chain:D,fromBaseDecimal:F,value:O})];for(let{coinType:j,totalBalance:N}of R){if(j===f||Number(N)<=0)continue;let K=M(j);if(K)v.push(P.from({asset:K.asset,fromBaseDecimal:K.decimals,value:N}))}return v}catch{return[P.from({chain:D})]}}async function U(z){let Z=P.from({chain:y.Sui,value:"0.01"});if(!z)return Z;try{let F=await J(),{txBytes:D}=await q(z),{effects:{status:k,gasUsed:R}}=await F.dryRunTransactionBlock({transactionBlock:D});if(k.status!=="success")return Z;let{baseDecimal:O}=w(y.Sui),v=BigInt(R.computationCost)+BigInt(R.storageCost)-BigInt(R.storageRebate);return P.from({chain:y.Sui,fromBaseDecimal:O,value:v.toString()})}catch{return Z}}async function q({recipient:z,assetValue:Z,gasBudget:F,sender:D,sweep:k}){let{Transaction:R}=await import("@mysten/sui/transactions"),O=D||await Q(),v=F||i;if(!O)throw new Y("toolbox_sui_no_sender");try{let j=await J(),N=new R;N.setSender(O);let K={assetValue:Z,gasBudget:v,recipient:z,sender:O,suiClient:j,sweep:k,tx:N},A;if(Z.isGasAsset||Z.symbol==="SUI"){let I=await a(K);if(BigInt(I)<BigInt(v))A=BigInt(I);N.setGasBudget(I)}else await s(K),N.setGasBudget(v);let S=await N.build({client:j});if(A!==void 0){let{effects:{status:I}}=await j.dryRunTransactionBlock({transactionBlock:S});if(I.status!=="success")throw new Y({errorKey:"toolbox_sweep_amount_too_low",info:{asset:Z.toString(),budget:A.toString(),error:I.error}})}return{tx:N,txBytes:S}}catch(j){if(j instanceof Y)throw j;throw new Y("toolbox_sui_transaction_creation_error",{error:j})}}async function H(z){let Z=await L();if(!Z)throw new Y("toolbox_sui_no_signer");if(z instanceof Uint8Array)return Z.signTransaction(z);let{txBytes:F}="tx"in z?z:await q(z);return Z.signTransaction(F)}async function G({assetValue:z,gasBudget:Z,recipient:F,sweep:D}){let k=await L();if(!k)throw new Y("toolbox_sui_no_signer");let R=k.toSuiAddress()||await Q();if(!R)throw new Y("toolbox_sui_no_sender");let{txBytes:O}=await q({assetValue:z,gasBudget:Z,recipient:F,sender:R,sweep:D}),v=await J();if(!B(k)){let N=await k.signTransaction(O),{digest:K}=await v.executeTransactionBlock({signature:N.signature,transactionBlock:N.bytes});return K}let{digest:j}=await v.signAndExecuteTransaction({signer:k,transaction:O});return j}async function _(z){let Z=await J(),{digest:F}=await Z.executeTransactionBlock({signature:z.signature,transactionBlock:z.bytes});return F}async function h(z){let Z=await L();if(!Z)throw new Y("toolbox_sui_no_signer");let F=await J(),D;if(typeof z==="string")D=Uint8Array.from(Buffer.from(z,"base64"));else if(z instanceof Uint8Array)D=z;else D=await z.build({client:F});if(!B(Z)){let R=await Z.signTransaction(D),{digest:O}=await F.executeTransactionBlock({signature:R.signature,transactionBlock:R.bytes});return O}let{digest:k}=await F.signAndExecuteTransaction({signer:Z,transaction:D});return k}return{broadcastTransaction:_,createTransaction:q,estimateTransactionFee:U,getAddress:Q,getBalance:X,signAndBroadcastTransaction:h,signTransaction:H,transfer:G,validateAddress:e}}export{e as validateSuiAddress,$5 as getSuiToolbox};
1
+ import{ga as k}from"../../chunk-k50sjysj.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};
@@ -1 +1 @@
1
- import{fa as m}from"../../chunk-nvfkjbyq.js";import{ga as x}from"../../chunk-xbdjxeqd.js";import{AssetValue as QQ,Chain as B,getChainConfig as XQ,NetworkDerivationPath as YQ,SKConfig as ZQ,SwapKitError as L,SwapKitNumber as $Q}from"@swapkit/helpers";import{Address as H,beginCell as M,Cell as u,external as zQ,internal as GQ,loadStateInit as HQ,SendMode as V,storeMessage as qQ,toNano as c}from"@ton/core";import{match as w,P as T}from"ts-pattern";var kQ=260734629,LQ=c("0.01"),RQ=c("0.05"),A=V.PAY_GAS_SEPARATELY+V.IGNORE_ERRORS,IQ=V.CARRY_ALL_REMAINING_BALANCE+V.IGNORE_ERRORS,BQ=60000,D,p=0;async function UQ(){let q=Date.now();if(D&&q-p<BQ)return D;let{getHttpEndpoint:F}=await import("@orbs-network/ton-access");return D=await F(),p=q,D}async function xQ(){let[q]=ZQ.get("rpcUrls")[B.Ton]??[];if(q)return q;return await UQ()}function DQ(q={}){let F,_,N;async function I(){if(!F){let{TonClient:Q}=await import("@ton/ton"),X=q.provider??await xQ();F=new Q({endpoint:X})}return F}async function j(){return(await J()).address.toString()}async function y(){if(N)return N;return N=await w(q).with({phrase:T.string},async({phrase:Q,derivationPath:X,index:Y=0})=>{let $=YQ[B.Ton],Z=X?.some((G,k)=>G!==$[k]);if(Y||Z)throw new L("toolbox_derivation_slot_unsupported",{chain:B.Ton,derivationPath:X,index:Y});let{mnemonicToWalletKey:z}=await import("@ton/crypto");return z(Q.split(" "))}).with({signer:T.any},({signer:Q})=>Q).otherwise(()=>{return}),N}async function J(Q){if(!_||Q){let X=await y(),Y=await I(),$=Q||X;if(!$)throw new L("core_wallet_connection_not_found");let{WalletContractV4:Z}=await import("@ton/ton"),z=Z.create({publicKey:$.publicKey,workchain:0});_=Y.open(z)}return _}let g=m(B.Ton);async function i({assetValue:Q,recipient:X,memo:Y,sender:$,sweep:Z,jettonWalletAddress:z}){if(Q.isGasAsset){if(Z){let e=$||await j(),S=await(await I()).getBalance(H.parse(e));if(S<=0n)throw new L("toolbox_sweep_amount_too_low",{asset:Q.toString(),balance:S.toString()})}let t=Y?C(Y).toBoc().toString("base64"):void 0;return[{address:X,amount:Q.getBaseValue("string"),payload:t}]}let G=Q.address;if(!G)throw new L({errorKey:"core_swap_contract_not_found",info:{asset:Q.toString()}});let k=$??await j(),R=z?H.parse(z):await h({jettonMasterAddress:G,ownerAddress:k}),O=R.toString(),v=H.parse(X),U=H.parse(k),K=Z?await r(R):Q.getBaseValue("bigint");if(Z&&K<=0n)throw new L("toolbox_sweep_amount_too_low",{asset:Q.toString(),balance:K.toString()});let a=Y?C(Y):void 0,s=n({destinationAddress:v,forwardPayload:a,jettonAmount:K,responseAddress:U});return[{address:O,amount:RQ.toString(),payload:s.toBoc().toString("base64")}]}async function P({sender:Q,sweep:X,...Y}){let $=X&&Y.assetValue.isGasAsset?IQ:A;return{messages:await i({...Y,sender:Q,sweep:X}),sendMode:$}}function l(Q){if(!Array.isArray(Q))return Q;let[X]=Q;return{messages:Q.map(({sendMode:$,...Z})=>Z),sendMode:X?.sendMode??A}}function b(Q){return Q.map((X)=>{let Y=X.payload?u.fromBase64(X.payload):void 0,$=X.stateInit?HQ(u.fromBase64(X.stateInit).asSlice()):void 0,Z=H.parse(X.address),z=H.isFriendly(X.address)?H.parseFriendly(X.address).isBounceable:!0;return GQ({body:Y,bounce:z,init:$,to:Z,value:BigInt(X.amount)})})}async function E(Q){let X=await y(),Y=await J();if(!Y||!X)throw new L("core_wallet_connection_not_found");let $=await I(),{state:Z}=await $.getContractState(Y.address),z=Z==="active",G=z?await Y.getSeqno():0,{messages:k,sendMode:R}=l(Q),O=Y.createTransfer({messages:b(k),secretKey:X.secretKey,sendMode:R,seqno:G}),v=zQ({body:O,init:z?void 0:Y.init,to:Y.address});return M().store(qQ(v)).endCell()}async function f(Q){return await(await I()).sendFile(Q.toBoc()),Q.hash().toString("hex")}async function W(Q){let X=await E(Q);return f(X)}async function d({assetValue:Q,recipient:X,memo:Y,sweep:$}){let Z=await P({assetValue:Q,memo:Y,recipient:X,sweep:$});return W(Z)}async function o({sender:Q,...X}){let{baseDecimal:Y}=XQ(B.Ton),$=await w(Q).with(T.string,(G)=>{return H.parseFriendly(G).address}).otherwise(async()=>{return(await J()).address});if(!$)throw new L("toolbox_fee_estimation_failed",{chain:B.Ton});let Z=QQ.from({chain:B.Ton,value:"0.01"}),z=await I();try{let G=await P({sender:Q,...X}),k=await y(),R=await J();if(!R||!k)return Z;let O=await R.getSeqno(),v=R.createTransfer({messages:b(G.messages),secretKey:k.secretKey,sendMode:G.sendMode,seqno:O}),{source_fees:U}=await z.estimateExternalMessageFee($,{body:v,ignoreSignature:!0,initCode:null,initData:null}),K=U.in_fwd_fee+U.storage_fee+U.gas_fee+U.fwd_fee;return Z.set($Q.fromBigInt(BigInt(K),Y))}catch{return Z}}async function h({jettonMasterAddress:Q,ownerAddress:X}){try{let Y=await I(),$=H.parse(Q),Z=H.parse(X),{JettonMaster:z}=await import("@ton/ton");return await Y.open(z.create($)).getWalletAddress(Z)}catch{throw new L({errorKey:"core_swap_contract_not_found",info:{jettonMasterAddress:Q,ownerAddress:X}})}}async function r(Q){try{let X=await I(),{JettonWallet:Y}=await import("@ton/ton");return await X.open(Y.create(Q)).getBalance()}catch{throw new L({errorKey:"core_swap_contract_not_found",info:{jettonWalletAddress:Q.toString()}})}}function n({jettonAmount:Q,destinationAddress:X,responseAddress:Y,forwardAmount:$=LQ,forwardPayload:Z}){let z=M().storeUint(kQ,32).storeUint(0,64).storeCoins(Q).storeAddress(X).storeAddress(Y).storeBit(0).storeCoins($);if(Z)z.storeBit(1).storeRef(Z);else z.storeBit(0);return z.endCell()}function C(Q){return M().storeUint(0,32).storeStringTail(Q).endCell()}return{broadcastTransaction:f,createTransaction:P,estimateTransactionFee:o,getAddress:j,getBalance:g,getJettonWalletAddress:h,sign:E,signAndBroadcastTransaction:W,transfer:d,validateAddress:FQ}}function FQ(q){try{return H.parse(q),!0}catch{return!1}}export{FQ as validateTonAddress,DQ as getTONToolbox};
1
+ import{fa as U}from"../../chunk-s1528ghz.js";import{ga as p}from"../../chunk-k50sjysj.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};
@@ -1 +1 @@
1
- import"../../chunk-xbdjxeqd.js";import{bytesToHex as WJ}from"@noble/hashes/utils.js";import{HDKey as OJ}from"@scure/bip32";import{mnemonicToSeedSync as CJ}from"@scure/bip39";import{AssetValue as F,BaseDecimal as p,Chain as D,derivationPathToString as xz,getRPCUrl as kJ,NetworkDerivationPath as bz,SwapKitError as U,updateDerivationPath as wz,warnOnce as Tz}from"@swapkit/helpers";import{match as UJ,P as t}from"ts-pattern";import{sha256 as oz}from"@noble/hashes/sha2.js";import{bytesToHex as Yz,hexToBytes as Xz}from"@noble/hashes/utils.js";import{SwapKitError as V}from"@swapkit/helpers";var h=0,jz=1,A=2,qz=5,iz=8,dz=10,nz=18;function i(J,z){let Q=0n,$=0n,X=z;while(X<J.length&&X-z<10){let q=J[X++];if(q===void 0)break;if(Q|=BigInt(q&127)<<$,$+=7n,(q&128)===0)return[Q,X]}throw new V("toolbox_tron_transaction_creation_failed")}function x(J){let z=[],Q=J<0n?J+2n**64n:J;while(Q>=128n)z.push(Number(Q&0x7fn)|128),Q>>=7n;return z.push(Number(Q)),z}function y(J,z,Q){let $=J.get(z);if($)$.push(Q);else J.set(z,[Q])}function tz(J){let z=new Map,Q=0;while(Q<J.length){let[$,X]=i(J,Q);Q=X;let q=Number($>>3n),O=Number($&7n);if(O===h){let[P,K]=i(J,Q);Q=K,y(z,q,{data:new Uint8Array(x(P)),wireType:h})}else if(O===A){let[P,K]=i(J,Q);Q=K;let B=Number(P);if(B<0||Q+B>J.length)throw new V("toolbox_tron_transaction_creation_failed");let c=J.slice(Q,Q+B);Q+=B,y(z,q,{data:c,wireType:A})}else if(O===jz){if(Q+8>J.length)throw new V("toolbox_tron_transaction_creation_failed");let P=J.slice(Q,Q+8);Q+=8,y(z,q,{data:P,wireType:jz})}else if(O===qz){if(Q+4>J.length)throw new V("toolbox_tron_transaction_creation_failed");let P=J.slice(Q,Q+4);Q+=4,y(z,q,{data:P,wireType:qz})}else throw new V("toolbox_tron_transaction_creation_failed")}return z}function az(J){let z=[];for(let[q,O]of[...J.entries()].sort(([P],[K])=>P-K))for(let{wireType:P,data:K}of O){let B=BigInt(q<<3|P);if(z.push(new Uint8Array(x(B))),P===A)z.push(new Uint8Array(x(BigInt(K.length))));z.push(K)}let Q=z.reduce((q,O)=>q+O.length,0),$=new Uint8Array(Q),X=0;for(let q of z)$.set(q,X),X+=q.length;return $}function Gz(J,z){if(!J||J.length%2!==0)throw new V("toolbox_tron_transaction_creation_failed");let Q=Xz(J),$=tz(Q);if(z.expiration!==void 0)$.set(iz,[{data:new Uint8Array(x(BigInt(z.expiration))),wireType:h}]);if(z.data!==void 0)$.set(dz,[{data:Xz(z.data),wireType:A}]);if(z.fee_limit!==void 0)$.set(nz,[{data:new Uint8Array(x(BigInt(z.fee_limit))),wireType:h}]);let X=az($),q=Yz(X),O=Yz(oz(X));return{raw_data_hex:q,txID:O}}import{Chain as ZJ,getRPCUrlSync as $J,SwapKitError as N,warnOnce as u}from"@swapkit/helpers";import{secp256k1 as Mz}from"@noble/curves/secp256k1.js";import{sha256 as Wz}from"@noble/hashes/sha2.js";import{keccak_256 as rz}from"@noble/hashes/sha3.js";import{bytesToHex as I,hexToBytes as E}from"@noble/hashes/utils.js";import{createBase58check as sz}from"@scure/base";import{SwapKitError as Oz}from"@swapkit/helpers";var m=sz(Wz),Cz=65,ez=2n**256n;function R(J){if(typeof J!=="string")return!1;try{let z=m.decode(J);return z.length===21&&z[0]===Cz}catch{return!1}}function kz(J){return I(m.decode(J))}function zJ(J){return m.decode(J).slice(1)}function Uz(J){let z=Mz.getPublicKey(E(J),!1),Q=rz(z.slice(1)).slice(-20),$=new Uint8Array(21);return $[0]=Cz,$.set(Q,1),m.encode($)}function Hz({txID:J,privateKey:z}){let Q=Mz.sign(E(J),E(z),{format:"recovered",prehash:!1}),$=Q[0]??0,X=I(Q.slice(1,33)),q=I(Q.slice(33,65)),O=($+27).toString(16).padStart(2,"0");return X+q+O}function f({txID:J,raw_data_hex:z}){let Q=I(Wz(E(z)));if(J!==Q)throw new Oz("toolbox_tron_invalid_transaction_integrity",{expected:Q,txID:J})}function JJ(J){return`000000000000000000000000${I(zJ(J))}`}function QJ(J){let z=typeof J==="bigint"?J:BigInt(J);if(z<0n||z>=ez)throw new Oz("toolbox_tron_invalid_token_identifier",{identifier:z.toString()});return z.toString(16).padStart(64,"0")}function v(J){return J.map(({type:z,value:Q})=>z==="address"?JJ(Q):QJ(BigInt(Q))).join("")}function Kz(J){return I(new TextEncoder().encode(J))}var Lz="https://api.trongrid.io",YJ=1000,XJ=1e6,jJ=420,qJ=1e6,GJ=30000;function Nz(){try{return $J(ZJ.Tron)}catch{return Lz}}function Dz(){let J=new AbortController,z=setTimeout(()=>J.abort(),GJ);return{cleanup:()=>clearTimeout(z),signal:J.signal}}async function T(J,z){let{signal:Q,cleanup:$}=Dz();try{let X=await fetch(`${Nz()}${J}`,{body:JSON.stringify(z),headers:{"Content-Type":"application/json"},method:"POST",signal:Q});if(!X.ok)throw new N("toolbox_tron_trongrid_api_error",{message:`${X.status} ${X.statusText} on ${J}`});return await X.json()}finally{$()}}async function Rz(J,z){let{signal:Q,cleanup:$}=Dz();try{let X=await fetch(`${z??Nz()}${J}`,{headers:{"Content-Type":"application/json"},signal:Q});if(!X.ok)throw new N("toolbox_tron_trongrid_api_error",{message:`${X.status} ${X.statusText} on ${J}`});return await X.json()}finally{$()}}async function l(J){if(!R(J))throw new N("toolbox_tron_trongrid_api_error",{address:J,message:"Invalid address"});try{let z=await Rz(`/v1/accounts/${J}`,Lz);if(!(z.success&&z.data)||z.data.length===0)return;let Q;try{Q=kz(J).toLowerCase()}catch{Q=J.toLowerCase()}let $=z.data.find((X)=>X.address.toLowerCase()===Q);if(!$)return;return{balance:$.balance,trc20:$.trc20||[]}}catch(z){if(z instanceof N)throw z;throw new N("toolbox_tron_trongrid_api_error",{address:J,message:z instanceof Error?z.message:"Unknown error"})}}async function Fz({from:J,to:z,amount:Q}){let X=await T("/wallet/createtransaction",{amount:Q,owner_address:J,to_address:z,visible:!0});if(!X.txID||!X.raw_data_hex||!X.raw_data)throw new N("toolbox_tron_transaction_creation_failed");let O=X.raw_data?.contract?.[0]?.parameter?.value;if(O?.to_address!==z||O?.owner_address!==J||O?.amount!==Q)throw new N("toolbox_tron_transaction_creation_failed");return f(X),X}async function Bz({ownerAddress:J,contractAddress:z,functionSelector:Q,parameter:$,feeLimit:X,callValue:q=0}){let O=await T("/wallet/triggersmartcontract",{call_value:q,contract_address:z,fee_limit:X,function_selector:Q,owner_address:J,parameter:$,visible:!0});if(!O.result.result||!O.transaction?.txID||!O.transaction?.raw_data_hex)throw new N("toolbox_tron_transaction_creation_failed");let K=O.transaction.raw_data?.contract?.[0]?.parameter?.value;if(K?.contract_address!==z||K?.owner_address!==J)throw new N("toolbox_tron_transaction_creation_failed");return f(O.transaction),O.transaction}function Sz({ownerAddress:J,contractAddress:z,functionSelector:Q,parameter:$}){return T("/wallet/triggerconstantcontract",{contract_address:z,function_selector:Q,owner_address:J,parameter:$,visible:!0})}function MJ({ownerAddress:J,contractAddress:z,functionSelector:Q,parameter:$}){return T("/wallet/estimateenergy",{contract_address:z,function_selector:Q,owner_address:J,parameter:$,visible:!0})}function Pz(J){let z=typeof J==="number"?J:typeof J==="string"?Number(J):Number.NaN;return Number.isFinite(z)&&z>0?z:void 0}async function b(J){try{let{result:z,txid:Q}=await T("/wallet/broadcasttransaction",{raw_data:J.raw_data,raw_data_hex:J.raw_data_hex,signature:J.signature,txID:J.txID,visible:J.visible});if(!z||!Q)throw new N("toolbox_tron_token_transfer_failed");return Q}catch(z){throw new N("toolbox_tron_broadcast_failed",{error:z})}}async function w(){let J={};try{let{chainParameter:z}=await Rz("/wallet/getchainparameters");for(let Q of z)J[Q.key]=Q.value}catch(z){u({condition:!0,id:"tron_chain_params_failed",warning:`Failed to fetch chain params, using defaults: ${z instanceof Error?z.message:z}`})}return{bandwidthFee:J.getTransactionFee??YJ,createAccountFee:J.getCreateNewAccountFeeInSystemContract??J.getCreateAccountFee??XJ,energyFee:J.getEnergyFee??jJ,memoFee:J.getMemoFee??qJ}}async function d(J){try{let z=await T("/wallet/getaccountresource",{address:J,visible:!0});return{bandwidth:{free:(z.freeNetLimit??600)-(z.freeNetUsed??0),total:z.NetLimit??0,used:z.NetUsed??0},energy:{total:z.EnergyLimit??0,used:z.EnergyUsed??0}}}catch(z){return u({condition:!0,id:"tron_account_resources_failed",warning:`Failed to fetch account resources, using defaults: ${z instanceof Error?z.message:z}`}),{bandwidth:{free:600,total:0,used:0},energy:{total:0,used:0}}}}async function g(J){try{let z=await T("/wallet/getaccount",{address:J,visible:!0});return z&&Object.keys(z).length>0}catch{return!1}}async function n(J){try{let z=await MJ({...J,ownerAddress:J.sender}),Q=z.energy_required??z.energyRequired;if(z.result&&!z.result.result)throw new N("toolbox_tron_trongrid_api_error",{message:z.result.message||"estimateenergy failed"});if(Q!==void 0){let $=Pz(Q);if($!==void 0)return $;throw new N("toolbox_tron_trongrid_api_error",{message:"Invalid estimateenergy response"})}}catch(z){u({condition:!0,id:"tron_energy_estimation_failed",warning:`Failed to estimate energy with estimateenergy, falling back to triggerconstantcontract: ${z instanceof Error?z.message:z}`})}try{let{energy_used:z}=await Sz({...J,ownerAddress:J.sender}),Q=Pz(z);if(Q!==void 0)return Q;throw new N("toolbox_tron_trongrid_api_error",{message:"Invalid triggerconstantcontract energy response"})}catch(z){throw u({condition:!0,id:"tron_energy_estimation_fallback_failed",warning:`Failed to estimate energy: ${z instanceof Error?z.message:z}`}),new N("toolbox_tron_trongrid_api_error",{message:`Unable to estimate contract energy: ${z instanceof Error?z.message:z}`})}}async function _z({assetAddress:J,owner:z,spender:Q}){let $=v([{type:"address",value:z},{type:"address",value:Q}]),q=(await Sz({contractAddress:J,functionSelector:"allowance(address,address)",ownerAddress:Q,parameter:$})).constant_result?.[0];if(!q)return 0n;try{return BigInt(`0x${q}`)}catch{return 0n}}var HJ=R,Vz=268,Iz=65000,a=25000,fz=345,r="TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",KJ="115792089237316195423570985008687907853269984665640564039457584007913129639935";function gz({phrase:J,derivationPath:z}){let Q=OJ.fromMasterSeed(CJ(J)).derive(z);if(!Q.privateKey)throw new U("toolbox_tron_no_signer");return WJ(Q.privateKey)}function PJ(J,z){return{...J,value:String(z)}}function LJ(J,z){if(!z)return J;return{...J,data:z.startsWith("0x")?z:`0x${z}`}}function NJ({phrase:J,derivationPath:z,index:Q}){let $=z||xz(wz(bz[D.Tron],{index:Q||0}));return gz({derivationPath:$,phrase:J})}function DJ({phrase:J,derivationPath:z}){let Q=gz({derivationPath:z,phrase:J}),$=Uz(Q);return{getAddress:()=>Promise.resolve($),signTransaction:(X)=>{f(X);let q=Hz({privateKey:Q,txID:X.txID});return Promise.resolve({...X,signature:[q]})}}}function vz({transaction:J,memo:z,expiration:Q,feeLimit:$}){let X={},q={};if($!==void 0&&J.raw_data)X.fee_limit=$,q.fee_limit=$;if(z){let K=z.startsWith("0x")?z.replace(/^0x/,""):Kz(z);X.data=K,q.data=K}if(Q){let K=J.raw_data.expiration+Q*1000;X.expiration=K,q.expiration=K}if(Object.keys(X).length===0)return J;let{raw_data_hex:O,txID:P}=Gz(J.raw_data_hex,X);return{...J,raw_data:{...J.raw_data,...q},raw_data_hex:O,txID:P}}function RJ(J={}){let z="index"in J?J.index||0:0,Q=xz("derivationPath"in J&&J.derivationPath?J.derivationPath:wz(bz[D.Tron],{index:z})),$,X=!1;function q(){if(X)return Promise.resolve($);return $=UJ(J).with({phrase:t.string},({phrase:Z})=>DJ({derivationPath:Q,phrase:Z})).with({signer:t.not(t.nullish)},({signer:Z})=>Z).otherwise(()=>{return}),X=!0,Promise.resolve($)}async function O(){let Z=await q();if(!Z)throw new U("toolbox_tron_no_signer");return Z.getAddress()}async function P(Z,Y){let G=Z||Iz,j=Y??(await w()).energyFee,M=G*j,W=Math.ceil(M*1.5);return Math.min(Math.max(W,1e7),150000000)}async function K({contractAddress:Z,functionSelector:Y,parameter:G,sender:j,memo:M,expiration:W,extraEnergy:C=0}){let k=await n({contractAddress:Z,functionSelector:Y,parameter:G,sender:j}),H=await P(k+C),L=await Bz({contractAddress:Z,feeLimit:H,functionSelector:Y,ownerAddress:j,parameter:G});return vz({expiration:W,feeLimit:H,memo:M,transaction:L})}async function B(Z){if(!R(Z))return[F.from({chain:D.Tron})];try{let Y=await l(Z);if(!Y)return[F.from({chain:D.Tron})];let G=[F.from({chain:D.Tron,fromBaseDecimal:6,value:String(Y.balance)})],j=Y.trc20?.find((M)=>(r in M));if(j){let M=j[r];G.push(F.from({asset:`TRON.USDT-${r}`,fromBaseDecimal:6,value:M}))}return G}catch(Y){return Tz({condition:!0,id:"tron_toolbox_get_balance_failed",warning:`Tron API getBalance failed: ${Y instanceof Error?Y.message:Y}`}),[F.from({chain:D.Tron})]}}async function c({recipient:Z,assetValue:Y,memo:G,expiration:j,sweep:M}){if(!R(Z))throw new U("toolbox_tron_token_transfer_failed",{message:"invalid address"});let W=await q();if(!W)throw new U("toolbox_tron_no_signer");try{let C=await O(),k=await Jz({assetValue:Y,expiration:j,memo:G,recipient:Z,sender:C,sweep:M}),H=await W.signTransaction(k),L=await b(H);if(!L)throw new U("toolbox_tron_token_transfer_failed",{message:"broadcast failed"});return L}catch(C){if(C instanceof U&&C.errorKey==="toolbox_sweep_amount_too_low")throw C;throw new U("toolbox_tron_token_transfer_failed",{message:C instanceof Error?C.message:String(C)})}}function s({requiredBandwidth:Z,resources:Y,feePerUnit:G}){let j=Math.max(0,Y.free+Y.total-Y.used);return Z>j?(Z-j)*G:0}async function e({memo:Z,recipient:Y,senderAddress:G}){let[j,M,W]=await Promise.all([w(),g(Y),d(G)]),C=M?0:j.createAccountFee,k=s({feePerUnit:j.bandwidthFee,requiredBandwidth:Vz,resources:W.bandwidth}),H=Z?j.memoFee:0;return F.from({chain:D.Tron,fromBaseDecimal:p.TRON,value:C+k+H})}async function zz({assetValue:Z,amountInBaseUnits:Y=Z.getBaseValue("string"),memo:G,recipient:j,senderAddress:M}){let W=Z.address;if(!W)throw new U("toolbox_tron_invalid_token_identifier",{identifier:Z.toString()});let[C,k,H,L]=await Promise.all([w(),g(j),d(M),n({contractAddress:W,functionSelector:"transfer(address,uint256)",parameter:v([{type:"address",value:j},{type:"uint256",value:Y}]),sender:M})]),_=L+(k?0:a),o=s({feePerUnit:C.bandwidthFee,requiredBandwidth:fz,resources:H.bandwidth}),$z=Math.max(0,H.energy.total-H.energy.used),pz=_>$z?(_-$z)*C.energyFee:0,cz=G?C.memoFee:0;return F.from({chain:D.Tron,fromBaseDecimal:p.TRON,value:o+pz+cz})}async function yz({assetValue:Z,memo:Y,recipient:G}){let[j,M]=await Promise.all([w(),g(G)]);if(Z.isGasAsset){let H=M?0:j.createAccountFee,L=Y?j.memoFee:0;return F.from({chain:D.Tron,fromBaseDecimal:p.TRON,value:H+Vz*j.bandwidthFee+L})}let C=await P(Iz+(M?0:a),j.energyFee),k=Y?j.memoFee:0;return F.from({chain:D.Tron,fromBaseDecimal:p.TRON,value:C+fz*j.bandwidthFee+k})}async function hz({assetValue:Z,memo:Y,recipient:G,sender:j}){let M=await q();try{let W=j?j:M?await O():void 0;if(!W)return yz({assetValue:Z,memo:Y,recipient:G});return Z.isGasAsset?e({memo:Y,recipient:G,senderAddress:W}):zz({assetValue:Z,memo:Y,recipient:G,senderAddress:W})}catch(W){throw Tz({condition:!0,id:"tron_toolbox_fee_estimation_failed",warning:`Failed to calculate exact fee: ${W instanceof Error?W.message:W}`}),new U("toolbox_fee_estimation_failed",{chain:D.Tron,error:W})}}async function Az({assetValue:Z,memo:Y,recipient:G,sender:j,sweep:M}){if(!M)return Z.getBaseValue("bigint");let[W,C]=await Promise.all([l(j),e({memo:Y,recipient:G,senderAddress:j})]),k=BigInt(W?.balance??0)-C.getBaseValue("bigint");if(k<=0n)throw new U({errorKey:"toolbox_sweep_amount_too_low",info:{amount:k.toString(),asset:Z.toString()}});return k}async function Ez({assetValue:Z,memo:Y,recipient:G,sender:j,sweep:M}){if(!M)return Z.getBaseValue("string");let W=Z.address;if(!W)throw new U("toolbox_tron_invalid_token_identifier",{identifier:Z.toString()});let C=await l(j),H=C?.trc20.find((o)=>(W in o))?.[W]??"0";if(BigInt(H)<=0n)throw new U({errorKey:"toolbox_sweep_amount_too_low",info:{asset:Z.toString(),balance:H}});let L=await zz({amountInBaseUnits:H,assetValue:Z,memo:Y,recipient:G,senderAddress:j}),S=BigInt(C?.balance??0),_=L.getBaseValue("bigint");if(S<_)throw new U({errorKey:"toolbox_sweep_amount_too_low",info:{asset:Z.toString(),nativeBalance:S.toString(),requiredNativeFee:_.toString()}});return H}async function Jz({recipient:Z,assetValue:Y,memo:G,sender:j,expiration:M,sweep:W,recipientExists:C}){if(!R(Z)||!R(j))throw new U("toolbox_tron_transaction_creation_failed",{message:"invalid address"});if(Y.isGasAsset){let S=await Az({assetValue:Y,expiration:M,memo:G,recipient:Z,sender:j,sweep:W});if(S>BigInt(Number.MAX_SAFE_INTEGER))throw new U({errorKey:"toolbox_tron_transaction_creation_failed",info:{amount:S.toString(),reason:`Native transfer amount exceeds the safe integer limit of ${Number.MAX_SAFE_INTEGER} SUN`}});let _=await Fz({amount:Number(S),from:j,to:Z});return vz({expiration:M,memo:G,transaction:_})}let k=Y.address;if(!k)throw new U("toolbox_tron_invalid_token_identifier",{identifier:Y.toString()});let H=await Ez({assetValue:Y,expiration:M,memo:G,recipient:Z,sender:j,sweep:W}),L=C??await g(Z);return K({contractAddress:k,expiration:M,extraEnergy:L?0:a,functionSelector:"transfer(address,uint256)",memo:G,parameter:v([{type:"address",value:Z},{type:"uint256",value:H}]),sender:j})}async function Qz(Z){f(Z);let Y=await q();if(!Y)throw new U("toolbox_tron_no_signer");return Y.signTransaction(Z)}async function mz(Z){let Y=await Qz(Z);return b(Y)}function Zz({assetAddress:Z,spenderAddress:Y,from:G}){return _z({assetAddress:Z,owner:G,spender:Y})}async function uz({assetAddress:Z,spenderAddress:Y,from:G,amount:j}){let M=await Zz({assetAddress:Z,from:G,spenderAddress:Y});if(!j)return M>0n;return M>=BigInt(j)}async function lz({assetAddress:Z,spenderAddress:Y,amount:G,from:j}){if(!R(Z)||!R(Y))throw new U("toolbox_tron_approve_failed");let M=await q();if(!M)throw new U("toolbox_tron_no_signer");let W=j||await O(),C=G!==void 0?BigInt(G).toString():KJ;try{let k=await K({contractAddress:Z,functionSelector:"approve(address,uint256)",parameter:v([{type:"address",value:Y},{type:"uint256",value:C}]),sender:W}),H=await M.signTransaction(k),L=await b(H);if(!L)throw new U("toolbox_tron_approve_failed");return L}catch(k){if(k instanceof U)throw k;throw new U("toolbox_tron_approve_failed",{error:k})}}return{approve:lz,broadcastTransaction:b,createTransaction:Jz,estimateTransactionFee:hz,getAddress:O,getApprovedAmount:Zz,getBalance:B,getRpcUrl:()=>kJ(D.Tron),isApproved:uz,signAndBroadcastTransaction:mz,signTransaction:Qz,transfer:c,validateAddress:R}}export{PJ as withTronTransactionValue,LJ as withTronTransactionData,HJ as validateTronAddress,RJ as getTronToolbox,NJ as getTronPrivateKeyFromMnemonic};
1
+ import"../../chunk-k50sjysj.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};