@uswap/toolboxes 4.3.10 → 4.3.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/cardano/index.cjs.map +2 -2
- package/dist/src/cardano/index.js.map +2 -2
- package/dist/src/cosmos/index.cjs +2 -2
- package/dist/src/cosmos/index.cjs.map +8 -8
- package/dist/src/cosmos/index.js +2 -2
- package/dist/src/cosmos/index.js.map +8 -8
- package/dist/src/evm/index.cjs +2 -2
- package/dist/src/evm/index.cjs.map +5 -5
- package/dist/src/evm/index.js +2 -2
- package/dist/src/evm/index.js.map +5 -5
- package/dist/src/index.cjs +3 -3
- package/dist/src/index.cjs.map +32 -32
- package/dist/src/index.js +3 -3
- package/dist/src/index.js.map +32 -32
- package/dist/src/near/index.cjs +2 -2
- package/dist/src/near/index.cjs.map +5 -5
- package/dist/src/near/index.js +2 -2
- package/dist/src/near/index.js.map +5 -5
- package/dist/src/radix/index.cjs +2 -2
- package/dist/src/radix/index.cjs.map +3 -3
- package/dist/src/radix/index.js +2 -2
- package/dist/src/radix/index.js.map +3 -3
- package/dist/src/ripple/index.cjs +2 -2
- package/dist/src/ripple/index.cjs.map +3 -3
- package/dist/src/ripple/index.js +2 -2
- package/dist/src/ripple/index.js.map +3 -3
- package/dist/src/solana/index.cjs.map +2 -2
- package/dist/src/solana/index.js.map +2 -2
- package/dist/src/substrate/index.cjs +2 -2
- package/dist/src/substrate/index.cjs.map +4 -4
- package/dist/src/substrate/index.js +2 -2
- package/dist/src/substrate/index.js.map +4 -4
- package/dist/src/sui/index.cjs.map +2 -2
- package/dist/src/sui/index.js.map +2 -2
- package/dist/src/ton/index.cjs +2 -2
- package/dist/src/ton/index.cjs.map +3 -3
- package/dist/src/ton/index.js +2 -2
- package/dist/src/ton/index.js.map +3 -3
- package/dist/src/tron/index.cjs.map +3 -3
- package/dist/src/tron/index.js.map +3 -3
- package/dist/src/utxo/index.cjs +3 -3
- package/dist/src/utxo/index.cjs.map +11 -11
- package/dist/src/utxo/index.js +3 -3
- package/dist/src/utxo/index.js.map +11 -11
- package/dist/types/cardano/toolbox.d.ts +0 -2
- package/dist/types/cardano/toolbox.d.ts.map +1 -1
- package/dist/types/cosmos/thorchainUtils/addressFormat.d.ts +0 -2
- package/dist/types/cosmos/thorchainUtils/addressFormat.d.ts.map +1 -1
- package/dist/types/cosmos/thorchainUtils/messages.d.ts +0 -2
- package/dist/types/cosmos/thorchainUtils/messages.d.ts.map +1 -1
- package/dist/types/cosmos/toolbox/cosmos.d.ts +4 -6
- package/dist/types/cosmos/toolbox/cosmos.d.ts.map +1 -1
- package/dist/types/cosmos/toolbox/index.d.ts +0 -2
- package/dist/types/cosmos/toolbox/index.d.ts.map +1 -1
- package/dist/types/cosmos/toolbox/thorchain.d.ts +4 -6
- package/dist/types/cosmos/toolbox/thorchain.d.ts.map +1 -1
- package/dist/types/cosmos/util.d.ts +0 -2
- package/dist/types/cosmos/util.d.ts.map +1 -1
- package/dist/types/evm/toolbox/baseEVMToolbox.d.ts +0 -2
- package/dist/types/evm/toolbox/baseEVMToolbox.d.ts.map +1 -1
- package/dist/types/evm/toolbox/evm.d.ts.map +1 -1
- package/dist/types/evm/toolbox/op.d.ts +0 -2
- package/dist/types/evm/toolbox/op.d.ts.map +1 -1
- package/dist/types/index.d.ts +0 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/near/helpers/core.d.ts +0 -2
- package/dist/types/near/helpers/core.d.ts.map +1 -1
- package/dist/types/near/toolbox.d.ts +0 -2
- package/dist/types/near/toolbox.d.ts.map +1 -1
- package/dist/types/radix/index.d.ts +2 -4
- package/dist/types/radix/index.d.ts.map +1 -1
- package/dist/types/ripple/index.d.ts +0 -2
- package/dist/types/ripple/index.d.ts.map +1 -1
- package/dist/types/solana/toolbox.d.ts +0 -2
- package/dist/types/solana/toolbox.d.ts.map +1 -1
- package/dist/types/substrate/balance.d.ts +3 -0
- package/dist/types/substrate/balance.d.ts.map +1 -1
- package/dist/types/substrate/substrate.d.ts +0 -2
- package/dist/types/substrate/substrate.d.ts.map +1 -1
- package/dist/types/sui/toolbox.d.ts +0 -2
- package/dist/types/sui/toolbox.d.ts.map +1 -1
- package/dist/types/ton/toolbox.d.ts +0 -2
- package/dist/types/ton/toolbox.d.ts.map +1 -1
- package/dist/types/tron/helpers/trongrid.d.ts +0 -2
- package/dist/types/tron/helpers/trongrid.d.ts.map +1 -1
- package/dist/types/tron/toolbox.d.ts +0 -2
- package/dist/types/tron/toolbox.d.ts.map +1 -1
- package/dist/types/utils.d.ts +3 -0
- package/dist/types/utils.d.ts.map +1 -1
- package/dist/types/utxo/helpers/api.d.ts +0 -2
- package/dist/types/utxo/helpers/api.d.ts.map +1 -1
- package/dist/types/utxo/helpers/bchaddrjs.d.ts +0 -2
- package/dist/types/utxo/helpers/bchaddrjs.d.ts.map +1 -1
- package/dist/types/utxo/helpers/coinselect.d.ts +0 -2
- package/dist/types/utxo/helpers/coinselect.d.ts.map +1 -1
- package/dist/types/utxo/helpers/txSize.d.ts +0 -2
- package/dist/types/utxo/helpers/txSize.d.ts.map +1 -1
- package/dist/types/utxo/toolbox/bitcoinCash.d.ts +0 -2
- package/dist/types/utxo/toolbox/bitcoinCash.d.ts.map +1 -1
- package/dist/types/utxo/toolbox/index.d.ts +0 -2
- package/dist/types/utxo/toolbox/index.d.ts.map +1 -1
- package/dist/types/utxo/toolbox/utxo.d.ts +0 -2
- package/dist/types/utxo/toolbox/utxo.d.ts.map +1 -1
- package/dist/types/utxo/toolbox/zcash.d.ts +0 -2
- package/dist/types/utxo/toolbox/zcash.d.ts.map +1 -1
- package/package.json +5 -11
- package/src/cardano/toolbox.ts +0 -2
- package/src/cosmos/thorchainUtils/addressFormat.ts +0 -2
- package/src/cosmos/thorchainUtils/messages.ts +0 -2
- package/src/cosmos/toolbox/cosmos.ts +9 -11
- package/src/cosmos/toolbox/index.ts +0 -2
- package/src/cosmos/toolbox/thorchain.ts +6 -8
- package/src/cosmos/util.ts +1 -3
- package/src/evm/__tests__/ethereum.test.ts +6 -2
- package/src/evm/toolbox/baseEVMToolbox.ts +4 -6
- package/src/evm/toolbox/op.ts +0 -2
- package/src/index.ts +0 -2
- package/src/near/helpers/core.ts +0 -2
- package/src/near/toolbox.ts +0 -2
- package/src/radix/index.ts +3 -5
- package/src/ripple/index.ts +2 -4
- package/src/solana/toolbox.ts +0 -2
- package/src/substrate/balance.ts +9 -5
- package/src/substrate/substrate.ts +2 -4
- package/src/sui/toolbox.ts +0 -2
- package/src/ton/toolbox.ts +2 -4
- package/src/tron/__tests__/toolbox.test.ts +6 -2
- package/src/tron/helpers/trongrid.ts +0 -2
- package/src/tron/toolbox.ts +1 -3
- package/src/utils.ts +6 -2
- package/src/utxo/helpers/api.ts +2 -4
- package/src/utxo/helpers/bchaddrjs.ts +0 -2
- package/src/utxo/helpers/coinselect.ts +0 -2
- package/src/utxo/helpers/txSize.ts +0 -2
- package/src/utxo/toolbox/bitcoinCash.ts +0 -2
- package/src/utxo/toolbox/index.ts +0 -2
- package/src/utxo/toolbox/utxo.ts +2 -4
- package/src/utxo/toolbox/zcash.ts +2 -4
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var
|
|
1
|
+
var G=Object.create;var{getPrototypeOf:B,defineProperty:f,getOwnPropertyNames:U}=Object;var V=Object.prototype.hasOwnProperty;var b=(t,e,n)=>{n=t!=null?G(B(t)):{};let r=e||!t||!t.__esModule?f(n,"default",{value:t,enumerable:!0}):n;for(let i of U(t))if(!V.call(r,i))f(r,i,{get:()=>t[i],enumerable:!0});return r};var H=(t,e)=>{for(var n in e)f(t,n,{get:e[n],enumerable:!0,configurable:!0,set:(r)=>e[n]=()=>r})};var m=(t,e)=>()=>(t&&(e=t(t=0)),e);var g=((t)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});import{AssetValue as L,Chain as W,USwapNumber as T}from"@uswap/helpers";async function O(t,e,n){try{let r=await t.query.system?.account?.(n);if(!r)return[e.set(0)];let{data:{free:i}}=r,o=T.fromBigInt(BigInt(i.toString()),e.decimal).getValue("string");return[e.set(o)]}catch(r){let i=r instanceof Error?r.message:String(r);return console.error(`Error fetching substrate balance: ${i}`),[e.set(0)]}}async function q(t,e,n){try{let r=await t.query.flip?.account?.(n);if(!r)return[e.set(0)];let i=r.balance||r.data?.balance;if(!i||i.isEmpty)return[e.set(0)];let o=T.fromBigInt(BigInt(i.toString()),e.decimal).getValue("string");return[e.set(o)]}catch(r){let i=r instanceof Error?r.message:String(r);return console.error(`Error fetching chainflip balance: ${i}`),[e.set(0)]}}function _(t,e){return function(r){let i=L.from({chain:t});switch(t){case W.Chainflip:return q(e,i,r);default:return O(e,i,r)}}}var v=()=>{};var z,J,Q,d;var w=m(()=>{z={decimals:[10],displayName:"Polkadot Relay Chain",network:"polkadot",prefix:0,standardAccount:"*25519",symbols:["DOT"],website:"https://polkadot.network"},J={decimals:[18],displayName:"Chainflip",network:"chainflip",prefix:2112,standardAccount:"*25519",symbols:["FLIP"],website:"https://chainflip.io/"},Q={decimals:[],displayName:"Substrate",network:"substrate",prefix:42,standardAccount:"*25519",symbols:[],website:"https://substrate.io/"},d={DOT:z,FLIP:J,GENERIC:Q}});import{hexToU8a as X,isHex as Y,u8aToHex as Z}from"@polkadot/util";import{decodeAddress as C,encodeAddress as E}from"@polkadot/util-crypto";import{AssetValue as $,Chain as p,getRPCUrl as tt,USwapError as c,USwapNumber as et}from"@uswap/helpers";import{match as rt,P as A}from"ts-pattern";function nt(t,e){switch(t){case p.Chainflip:return j(e);case p.Polkadot:return K(e);default:throw new c("toolbox_substrate_not_supported",{chain:t})}}function l(t){return"address"in t}async function x(t,e){let{Keyring:n}=await import("@polkadot/api"),{cryptoWaitReady:r}=await import("@polkadot/util-crypto");return await r(),new n({ss58Format:e,type:"sr25519"}).addFromUri(t)}function lt(t,e){let n=C(t);return E(n,e)}function N(t,e){return Y(t)?X(t):C(t,void 0,e)}function R(t,e="ss58",n){if(e==="hex")return Z(t);return E(t,n)}async function k({generic:t,chain:e,...n}){let{ApiPromise:r,WsProvider:i}=await import("@polkadot/api"),o=await tt(e),a=new i(o),s=await r.create({noInitWarn:!0,provider:a}),u=$.from({chain:e}),I=t?d.GENERIC:d[e],M=await rt(n).with({phrase:A.string},({phrase:y})=>x(y,d[e].prefix)).with({signer:A.any},({signer:y})=>y).otherwise(()=>{return});return D({api:s,chain:e,gasAsset:u,network:I,signer:M})}var K=({generic:t=!1,...e}={})=>{return k({chain:p.Polkadot,generic:t,...e})},j=async({generic:t=!1,...e}={})=>{return{...await k({chain:p.Chainflip,generic:t,...e})}},h=(t,e)=>t.rpc.system.accountNextIndex(e),P=(t,e)=>{try{let n=N(t,e);return R(n,"ss58",e),!0}catch{return!1}},S=(t,{recipient:e,assetValue:n})=>t.tx.balances?.transferAllowDeath?.(e,n.getBaseValue("number")),ot=async(t,e,{recipient:n,assetValue:r,sender:i})=>{let o=S(t,{assetValue:r,recipient:n});if(!o)throw new c("toolbox_substrate_transfer_error");let a=l(e),s=a?e.address:i;if(!s)throw new c("core_transaction_invalid_sender_address");let u=await h(t,s);return(await o.signAndSend(a?e:s,{nonce:u,signer:a?void 0:e})).toString()},it=async(t,e,n,{recipient:r,assetValue:i,sender:o})=>{let a=S(t,{assetValue:i,recipient:r}),s=l(e)?e.address:o;if(!s)return;let u=await a?.paymentInfo(s,{nonce:await h(t,s)})||{partialFee:0};return n.set(et.fromBigInt(BigInt(u.partialFee.toString()),n.decimal).getValue("string"))},at=async(t,e)=>{if(e)return t.send(e);return(await t.send()).toString()},st=async(t,e)=>{return await e.signAsync(t)},ct=(t,e,n)=>{if(n)return e.signAndSend(t,n);return e.signAndSend(t).toString()},dt=async({signer:t,address:e,tx:n,callback:r,api:i})=>{let o=await h(i,e);if(r)n.signAndSend(e,{nonce:o,signer:t},r);return n.signAndSend(e,{nonce:o,signer:t}).toString()},D=({api:t,network:e,gasAsset:n,signer:r,chain:i})=>({api:t,broadcast:at,convertAddress:lt,createKeyring:(o)=>x(o,e.prefix),createTransaction:(o)=>S(t,o),decodeAddress:N,encodeAddress:R,estimateTransactionFee:(o)=>{if(!r)throw new c("core_wallet_not_keypair_wallet");return it(t,r,n,o)},gasAsset:n,getAddress:(o)=>{let a=o||r;if(!a)throw new c("core_wallet_not_keypair_wallet");return l(a)?a.address:void 0},getBalance:_(i||p.Polkadot,t),network:e,sign:(o)=>{if(!r)throw new c("core_wallet_not_keypair_wallet");if(l(r))return st(r,o);throw new c("core_wallet_not_keypair_wallet","Signer does not have keyring pair capabilities required for signing.")},signAndBroadcast:({tx:o,callback:a,address:s})=>{if(!r)throw new c("core_wallet_not_keypair_wallet");if(l(r))return ct(r,o,a);if(s)return dt({address:s,api:t,callback:a,signer:r,tx:o});throw new c("core_wallet_not_keypair_wallet","Signer does not have keyring pair capabilities required for signing.")},transfer:(o)=>{if(!r)throw new c("core_wallet_not_keypair_wallet");return ot(t,r,o)},validateAddress:(o)=>P(o,e.prefix)}),pt=({address:t,chain:e})=>{let{prefix:n}=e===p.Polkadot?d.DOT:d.FLIP;return P(t,n)||P(t,d.GENERIC.prefix)};var F=m(()=>{v();w()});var ut={};H(ut,{substrateValidateAddress:()=>pt,isKeyringPair:()=>l,getSubstrateToolbox:()=>nt,createSubstrateToolbox:()=>k,createKeyring:()=>x,SubstrateNetwork:()=>d,PolkadotToolbox:()=>K,ChainflipToolbox:()=>j,BaseSubstrateToolbox:()=>D});var mt=m(()=>{F();w()});mt();export{pt as substrateValidateAddress,l as isKeyringPair,nt as getSubstrateToolbox,k as createSubstrateToolbox,x as createKeyring,d as SubstrateNetwork,K as PolkadotToolbox,j as ChainflipToolbox,D as BaseSubstrateToolbox};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=F418CB3CA685C46D64756E2164756E21
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/substrate/balance.ts", "../src/substrate/types.ts", "../src/substrate/substrate.ts", "../src/substrate/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"
|
|
5
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport type { ApiPromise } from \"@polkadot/api\";\nimport { AssetValue, Chain, USwapNumber } from \"@uswap/helpers\";\n\n/**\n * Get balance for standard Substrate chains (Polkadot, etc.)\n * Uses api.query.system.account to query free and reserved balances\n */\nexport async function getSubstrateBalance(\n api: ApiPromise,\n gasAsset: AssetValue,\n address: string,\n): Promise<AssetValue[]> {\n try {\n const account = await api.query.system?.account?.(address);\n\n if (!account) {\n return [gasAsset.set(0)];\n }\n\n const {\n // @ts-expect-error\n data: { free },\n } = account;\n\n // Convert the free balance to string using USwapNumber for proper decimal handling\n const freeBalance = USwapNumber.fromBigInt(BigInt(free.toString()), gasAsset.decimal).getValue(\"string\");\n\n return [gasAsset.set(freeBalance)];\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`Error fetching substrate balance: ${errorMessage}`);\n return [gasAsset.set(0)];\n }\n}\n\n/**\n * Get balance for Chainflip chain\n * Uses api.query.flip.account to query FLIP balances\n */\nexport async function getChainflipBalance(\n api: ApiPromise,\n gasAsset: AssetValue,\n address: string,\n): Promise<AssetValue[]> {\n try {\n // Chainflip uses a custom flip pallet for account balances\n const flipAccount = await api.query.flip?.account?.(address);\n\n if (!flipAccount) {\n return [gasAsset.set(0)];\n }\n\n // Extract balance from the flip account structure\n // The structure has a balance field directly\n //@ts-expect-error\n const balance = flipAccount.balance || flipAccount.data?.balance;\n\n if (!balance || balance.isEmpty) {\n return [gasAsset.set(0)];\n }\n\n // Convert balance to string using USwapNumber\n const balanceStr = USwapNumber.fromBigInt(BigInt(balance.toString()), gasAsset.decimal).getValue(\"string\");\n\n return [gasAsset.set(balanceStr)];\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`Error fetching chainflip balance: ${errorMessage}`);\n return [gasAsset.set(0)];\n }\n}\n\n/**\n * Factory function to create chain-specific balance getter\n */\nexport function createBalanceGetter(chain: Chain, api: ApiPromise) {\n return function getBalance(address: string): Promise<AssetValue[]> {\n const gasAsset = AssetValue.from({ chain });\n\n switch (chain) {\n case Chain.Chainflip:\n return getChainflipBalance(api, gasAsset, address);\n\n default:\n return getSubstrateBalance(api, gasAsset, address);\n }\n };\n}\n",
|
|
6
6
|
"import type { Signer as InjectedSigner } from \"@polkadot/api/types\";\nimport type { ProviderInterface } from \"@polkadot/rpc-provider/types\";\nimport type { ExtDef } from \"@polkadot/types/extrinsic/signedExtensions/types\";\nimport type { KeypairType } from \"@polkadot/util-crypto/types\";\nimport type { GenericTransferParams, SubstrateChain } from \"@uswap/helpers\";\n\nconst polkadotNetwork = {\n decimals: [10],\n displayName: \"Polkadot Relay Chain\",\n network: \"polkadot\",\n prefix: 0,\n standardAccount: \"*25519\",\n symbols: [\"DOT\"],\n website: \"https://polkadot.network\",\n};\n\nconst chainflipNetwork = {\n decimals: [18],\n displayName: \"Chainflip\",\n network: \"chainflip\",\n prefix: 2112,\n standardAccount: \"*25519\",\n symbols: [\"FLIP\"],\n website: \"https://chainflip.io/\",\n};\n\nconst subtrateNetwork = {\n decimals: [],\n displayName: \"Substrate\",\n network: \"substrate\",\n prefix: 42,\n standardAccount: \"*25519\",\n symbols: [],\n website: \"https://substrate.io/\",\n};\n\nexport const SubstrateNetwork: Record<SubstrateChain | \"GENERIC\", SubstrateNetwork> = {\n DOT: polkadotNetwork,\n FLIP: chainflipNetwork,\n GENERIC: subtrateNetwork,\n};\n\nexport type SubstrateNetwork = typeof polkadotNetwork | typeof chainflipNetwork | typeof subtrateNetwork;\n\nexport type SubstrateTransferParams = GenericTransferParams & { sender?: string };\n\ntype Unsubcall = () => void;\n\ninterface InjectedAccount {\n address: string;\n genesisHash?: string | null;\n name?: string;\n type?: KeypairType;\n}\n\ninterface InjectedAccounts {\n get: (anyType?: boolean) => Promise<InjectedAccount[]>;\n subscribe: (cb: (accounts: InjectedAccount[]) => void | Promise<void>) => Unsubcall;\n}\ninterface InjectedExtensionInfo {\n name: string;\n version: string;\n}\ninterface ProviderMeta {\n network: string;\n node: \"full\" | \"light\";\n source: string;\n transport: string;\n}\ninterface MetadataDefBase {\n chain: string;\n genesisHash: string;\n icon: string;\n ss58Format: number;\n chainType?: \"substrate\" | \"ethereum\";\n}\ninterface MetadataDef extends MetadataDefBase {\n color?: string;\n specVersion: number;\n tokenDecimals: number;\n tokenSymbol: string;\n types: Record<string, Record<string, string> | string>;\n metaCalls?: string;\n userExtensions?: ExtDef;\n}\ninterface InjectedMetadataKnown {\n genesisHash: string;\n specVersion: number;\n}\ninterface InjectedMetadata {\n get: () => Promise<InjectedMetadataKnown[]>;\n provide: (definition: MetadataDef) => Promise<boolean>;\n}\ntype ProviderList = Record<string, ProviderMeta>;\n\ninterface InjectedProvider extends ProviderInterface {\n listProviders: () => Promise<ProviderList>;\n startProvider: (key: string) => Promise<ProviderMeta>;\n}\n\ntype InjectedWalletData = {\n accounts: InjectedAccounts;\n metadata?: InjectedMetadata;\n provider?: InjectedProvider;\n signer: InjectedSigner;\n};\n\nexport type SubstrateInjectedExtension = Record<\n string,\n {\n connect?: (origin: string) => Promise<InjectedExtensionInfo & InjectedWalletData>;\n enable?: (origin: string) => Promise<InjectedWalletData>;\n version?: string;\n }\n>;\n",
|
|
7
|
-
"/**\n *
|
|
7
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport type { ApiPromise } from \"@polkadot/api\";\nimport type { SubmittableExtrinsic } from \"@polkadot/api/types\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\nimport type { Callback, IKeyringPair, ISubmittableResult, Signer } from \"@polkadot/types/types\";\nimport { hexToU8a, isHex, u8aToHex } from \"@polkadot/util\";\nimport { decodeAddress as decodePolkadotAddress, encodeAddress as encodePolkadotAddress } from \"@polkadot/util-crypto\";\nimport {\n AssetValue,\n Chain,\n type DerivationPathArray,\n type GenericCreateTransactionParams,\n getRPCUrl,\n type SubstrateChain,\n USwapError,\n USwapNumber,\n} from \"@uswap/helpers\";\n\nimport { match, P } from \"ts-pattern\";\nimport { createBalanceGetter } from \"./balance\";\nimport { SubstrateNetwork, type SubstrateTransferParams } from \"./types\";\n\nexport const PolkadotToolbox = ({ generic = false, ...signerParams }: ToolboxParams = {}) => {\n return createSubstrateToolbox({ chain: Chain.Polkadot, generic, ...signerParams });\n};\n\nexport const ChainflipToolbox = async ({ generic = false, ...signerParams }: ToolboxParams = {}) => {\n const toolbox = await createSubstrateToolbox({ chain: Chain.Chainflip, generic, ...signerParams });\n\n return { ...toolbox };\n};\n\nexport type SubstrateToolboxes = {\n DOT: Awaited<ReturnType<typeof PolkadotToolbox>>;\n FLIP: Awaited<ReturnType<typeof ChainflipToolbox>>;\n};\n\nexport function getSubstrateToolbox<T extends SubstrateChain>(chain: T, params?: ToolboxParams) {\n switch (chain) {\n case Chain.Chainflip: {\n return ChainflipToolbox(params);\n }\n case Chain.Polkadot: {\n return PolkadotToolbox(params);\n }\n default:\n throw new USwapError(\"toolbox_substrate_not_supported\", { chain });\n }\n}\n\nexport function isKeyringPair(account: IKeyringPair | Signer): account is IKeyringPair {\n return \"address\" in account;\n}\n\nexport async function createKeyring(phrase: string, networkPrefix: number) {\n const { Keyring } = await import(\"@polkadot/api\");\n const { cryptoWaitReady } = await import(\"@polkadot/util-crypto\");\n await cryptoWaitReady();\n\n return new Keyring({ ss58Format: networkPrefix, type: \"sr25519\" }).addFromUri(phrase);\n}\n\nconst getNonce = (api: ApiPromise, address: string) => api.rpc.system.accountNextIndex(address);\n\nconst validateAddress = (address: string, networkPrefix: number) => {\n try {\n const decodedAddress = decodeAddress(address, networkPrefix);\n\n encodeAddress(decodedAddress, \"ss58\", networkPrefix);\n\n return true;\n } catch {\n return false;\n }\n};\n\nconst createTransaction = (api: ApiPromise, { recipient, assetValue }: SubstrateTransferParams) =>\n api.tx.balances?.transferAllowDeath?.(recipient, assetValue.getBaseValue(\"number\"));\n\nconst transfer = async (\n api: ApiPromise,\n signer: IKeyringPair | Signer,\n { recipient, assetValue, sender }: SubstrateTransferParams,\n) => {\n const transfer = createTransaction(api, { assetValue, recipient });\n if (!transfer) throw new USwapError(\"toolbox_substrate_transfer_error\");\n\n const isKeyring = isKeyringPair(signer);\n\n const address = isKeyring ? (signer as IKeyringPair).address : sender;\n if (!address) throw new USwapError(\"core_transaction_invalid_sender_address\");\n\n const nonce = await getNonce(api, address);\n\n const tx = await transfer.signAndSend(isKeyring ? signer : address, {\n nonce,\n signer: isKeyring ? undefined : signer,\n });\n\n return tx.toString();\n};\n\nconst estimateTransactionFee = async (\n api: ApiPromise,\n signer: IKeyringPair | Signer,\n gasAsset: AssetValue,\n { recipient, assetValue, sender }: SubstrateTransferParams,\n) => {\n const transfer = createTransaction(api, { assetValue, recipient });\n\n const address = isKeyringPair(signer) ? signer.address : sender;\n if (!address) return;\n\n const paymentInfo = (await transfer?.paymentInfo(address, { nonce: await getNonce(api, address) })) || {\n partialFee: 0,\n };\n return gasAsset.set(\n USwapNumber.fromBigInt(BigInt(paymentInfo.partialFee.toString()), gasAsset.decimal).getValue(\"string\"),\n );\n};\n\nconst broadcast = async (tx: SubmittableExtrinsic<\"promise\">, callback?: Callback<ISubmittableResult>) => {\n if (callback) return tx.send(callback);\n const hash = await tx.send();\n return hash.toString();\n};\n\nconst sign = async (signer: IKeyringPair, tx: SubmittableExtrinsic<\"promise\">) => {\n const signedTx = await tx.signAsync(signer);\n return signedTx;\n};\n\nconst signAndBroadcastKeyring = (\n signer: IKeyringPair,\n tx: SubmittableExtrinsic<\"promise\">,\n callback?: Callback<ISubmittableResult>,\n) => {\n if (callback) return tx.signAndSend(signer, callback);\n const hash = tx.signAndSend(signer);\n return hash.toString();\n};\n\nconst signAndBroadcast = async ({\n signer,\n address,\n tx,\n callback,\n api,\n}: {\n signer: Signer;\n address: string;\n tx: SubmittableExtrinsic<\"promise\">;\n api: ApiPromise;\n callback?: Callback<ISubmittableResult>;\n}) => {\n const nonce = await getNonce(api, address);\n if (callback) {\n tx.signAndSend(address, { nonce, signer }, callback);\n }\n const hash = tx.signAndSend(address, { nonce, signer });\n return hash.toString();\n};\n\nfunction convertAddress(address: string, newPrefix: number) {\n const decodedAddress = decodePolkadotAddress(address);\n const convertedAddress = encodePolkadotAddress(decodedAddress, newPrefix);\n return convertedAddress;\n}\n\nfunction decodeAddress(address: string, networkPrefix?: number) {\n return isHex(address) ? hexToU8a(address) : decodePolkadotAddress(address, undefined, networkPrefix);\n}\n\nfunction encodeAddress(address: Uint8Array, encoding: \"ss58\" | \"hex\" = \"ss58\", networkPrefix?: number) {\n if (encoding === \"hex\") {\n return u8aToHex(address);\n }\n\n return encodePolkadotAddress(address, networkPrefix);\n}\n\nexport const BaseSubstrateToolbox = ({\n api,\n network,\n gasAsset,\n signer,\n chain,\n}: {\n api: ApiPromise;\n network: SubstrateNetwork;\n gasAsset: AssetValue;\n signer?: IKeyringPair | Signer;\n chain?: SubstrateChain;\n}) => ({\n api,\n broadcast,\n convertAddress,\n createKeyring: (phrase: string) => createKeyring(phrase, network.prefix),\n createTransaction: (params: GenericCreateTransactionParams) => createTransaction(api, params),\n decodeAddress,\n encodeAddress,\n estimateTransactionFee: (params: SubstrateTransferParams) => {\n if (!signer) throw new USwapError(\"core_wallet_not_keypair_wallet\");\n return estimateTransactionFee(api, signer, gasAsset, params);\n },\n gasAsset,\n getAddress: (keyring?: IKeyringPair | Signer) => {\n const keyringPair = keyring || signer;\n if (!keyringPair) throw new USwapError(\"core_wallet_not_keypair_wallet\");\n\n return isKeyringPair(keyringPair) ? keyringPair.address : undefined;\n },\n getBalance: createBalanceGetter(chain || Chain.Polkadot, api),\n network,\n sign: (tx: SubmittableExtrinsic<\"promise\">) => {\n if (!signer) throw new USwapError(\"core_wallet_not_keypair_wallet\");\n if (isKeyringPair(signer)) return sign(signer, tx);\n\n throw new USwapError(\n \"core_wallet_not_keypair_wallet\",\n \"Signer does not have keyring pair capabilities required for signing.\",\n );\n },\n signAndBroadcast: ({\n tx,\n callback,\n address,\n }: {\n tx: SubmittableExtrinsic<\"promise\">;\n callback?: Callback<ISubmittableResult>;\n address?: string;\n }) => {\n if (!signer) throw new USwapError(\"core_wallet_not_keypair_wallet\");\n if (isKeyringPair(signer)) return signAndBroadcastKeyring(signer, tx, callback);\n\n if (address) {\n return signAndBroadcast({ address, api, callback, signer, tx });\n }\n\n throw new USwapError(\n \"core_wallet_not_keypair_wallet\",\n \"Signer does not have keyring pair capabilities required for signing.\",\n );\n },\n transfer: (params: SubstrateTransferParams) => {\n if (!signer) throw new USwapError(\"core_wallet_not_keypair_wallet\");\n return transfer(api, signer, params);\n },\n validateAddress: (address: string) => validateAddress(address, network.prefix),\n});\n\nexport const substrateValidateAddress = ({ address, chain }: { address: string; chain: SubstrateChain }) => {\n const { prefix } = chain === Chain.Polkadot ? SubstrateNetwork.DOT : SubstrateNetwork.FLIP;\n\n return validateAddress(address, prefix) || validateAddress(address, SubstrateNetwork.GENERIC.prefix);\n};\n\nexport async function createSubstrateToolbox({\n generic,\n chain,\n ...signerParams\n}: ToolboxParams & { chain: SubstrateChain }) {\n const { ApiPromise, WsProvider } = await import(\"@polkadot/api\");\n\n const rpcUrl = await getRPCUrl(chain);\n const provider = new WsProvider(rpcUrl);\n const api = await ApiPromise.create({ noInitWarn: true, provider });\n const gasAsset = AssetValue.from({ chain });\n const network = generic ? SubstrateNetwork.GENERIC : SubstrateNetwork[chain];\n\n const signer = await match(signerParams)\n .with({ phrase: P.string }, ({ phrase }) => createKeyring(phrase, SubstrateNetwork[chain].prefix))\n .with({ signer: P.any }, ({ signer }) => signer)\n .otherwise(() => undefined);\n\n return BaseSubstrateToolbox({ api, chain, gasAsset, network, signer });\n}\n\nexport type ToolboxParams = { generic?: boolean } & (\n | { signer?: KeyringPair | Signer }\n | { phrase?: string; derivationPath?: DerivationPathArray; index?: number }\n);\n",
|
|
8
8
|
"export * from \"./substrate\";\nexport * from \"./types\";\n"
|
|
9
9
|
],
|
|
10
|
-
"mappings": "
|
|
11
|
-
"debugId": "
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "F418CB3CA685C46D64756E2164756E21",
|
|
12
12
|
"names": []
|
|
13
13
|
}
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/sui/toolbox.ts", "../src/sui/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n *
|
|
5
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport { AssetValue, Chain, getChainConfig, USwapError } from \"@uswap/helpers\";\nimport { match, P } from \"ts-pattern\";\nimport type { SuiCreateTransactionParams, SuiToolboxParams, SuiTransferParams } from \"./types\";\n\nexport async function getSuiAddressValidator() {\n const { isValidSuiAddress } = await import(\"@mysten/sui/utils\");\n\n return function validateAddress(address: string) {\n try {\n return isValidSuiAddress(address);\n } catch {\n return false;\n }\n };\n}\n\nexport async function getSuiToolbox({ provider: providerParam, ...signerParams }: SuiToolboxParams = {}) {\n const validateAddress = await getSuiAddressValidator();\n\n const signer = await match(signerParams)\n .with({ phrase: P.string }, async ({ phrase }) => {\n const { Ed25519Keypair } = await import(\"@mysten/sui/keypairs/ed25519\");\n return Ed25519Keypair.deriveKeypair(phrase);\n })\n .with({ signer: P.any }, ({ signer }) => signer)\n .otherwise(() => undefined);\n\n async function getSuiClient(url = providerParam) {\n const { SuiClient, getFullnodeUrl } = await import(\"@mysten/sui/client\");\n return new SuiClient({ url: url || getFullnodeUrl(\"mainnet\") });\n }\n\n function getAddress() {\n return signer?.toSuiAddress() || \"\";\n }\n\n async function getBalance(targetAddress?: string) {\n const addressToQuery = targetAddress || getAddress();\n if (!addressToQuery) {\n throw new USwapError(\"toolbox_sui_address_required\" as any);\n }\n\n const { baseDecimal: fromBaseDecimal, chain } = getChainConfig(Chain.Sui);\n\n try {\n const suiClient = await getSuiClient();\n const { totalBalance } = await suiClient.getBalance({ owner: addressToQuery });\n\n const suiBalances = [AssetValue.from({ chain, fromBaseDecimal, value: totalBalance })];\n\n const coinBalances = await suiClient.getAllBalances({ owner: addressToQuery });\n for (const { coinType, totalBalance } of coinBalances) {\n if (coinType === \"0x2::sui::SUI\") continue; // Skip SUI as we already added it\n\n if (Number(totalBalance) > 0) {\n const symbol = coinType.split(\"::\").pop()?.toUpperCase() || \"UNKNOWN\";\n const asset = `${chain}.${symbol}-${coinType}`;\n // Default to 9 decimals, should be fetched from coin metadata\n suiBalances.push(AssetValue.from({ asset, fromBaseDecimal, value: totalBalance }));\n }\n }\n\n return suiBalances;\n } catch {\n return [AssetValue.from({ chain })];\n }\n }\n\n async function estimateTransactionFee(params?: SuiCreateTransactionParams) {\n const defaultFee = AssetValue.from({ chain: Chain.Sui, value: \"0.01\" });\n\n if (!params) return defaultFee;\n\n try {\n const suiClient = await getSuiClient();\n const { txBytes } = await createTransaction(params);\n const {\n effects: { status, gasUsed },\n } = await suiClient.dryRunTransactionBlock({ transactionBlock: txBytes });\n\n if (status.status !== \"success\") return defaultFee;\n\n const totalGas = Number(gasUsed.computationCost) + Number(gasUsed.storageCost) - Number(gasUsed.storageRebate);\n\n return AssetValue.from({ chain: Chain.Sui, value: totalGas.toString() });\n } catch {\n return defaultFee;\n }\n }\n\n async function createTransaction({ recipient, assetValue, gasBudget, sender }: SuiCreateTransactionParams) {\n const { Transaction } = await import(\"@mysten/sui/transactions\");\n\n const senderAddress = sender || getAddress();\n\n if (!senderAddress) {\n throw new USwapError(\"toolbox_sui_no_sender\");\n }\n\n try {\n const tx = new Transaction();\n tx.setSender(senderAddress);\n\n if (assetValue.isGasAsset || assetValue.symbol === \"SUI\") {\n const [suiCoin] = tx.splitCoins(tx.gas, [assetValue.getBaseValue(\"string\")]);\n tx.transferObjects([suiCoin], recipient);\n } else {\n throw new USwapError(\"toolbox_sui_custom_token_transfer_not_implemented\" as any);\n }\n\n if (gasBudget) {\n tx.setGasBudget(gasBudget);\n }\n\n const suiClient = await getSuiClient();\n const txBytes = await tx.build({ client: suiClient });\n\n return { tx, txBytes };\n } catch (error) {\n throw new USwapError(\"toolbox_sui_transaction_creation_error\" as any, { error });\n }\n }\n\n async function signTransaction(\n params: Uint8Array<ArrayBuffer> | SuiCreateTransactionParams | Awaited<ReturnType<typeof createTransaction>>,\n ) {\n if (!signer) {\n throw new USwapError(\"toolbox_sui_no_signer\");\n }\n\n if (params instanceof Uint8Array) {\n return signer.signTransaction(params);\n }\n\n const { txBytes } = \"tx\" in params ? params : await createTransaction(params);\n\n return signer.signTransaction(txBytes);\n }\n\n async function transfer({ assetValue, gasBudget, recipient }: SuiTransferParams) {\n if (!signer) {\n throw new USwapError(\"toolbox_sui_no_signer\" as any);\n }\n\n const sender = signer.toSuiAddress() || getAddress();\n if (!sender) {\n throw new USwapError(\"toolbox_sui_no_sender\");\n }\n\n const { txBytes } = await createTransaction({ assetValue, gasBudget, recipient, sender });\n const suiClient = await getSuiClient();\n const { digest: txHash } = await suiClient.signAndExecuteTransaction({ signer, transaction: txBytes });\n\n return txHash;\n }\n\n return {\n createTransaction,\n estimateTransactionFee,\n getAddress,\n getBalance,\n signTransaction,\n transfer,\n validateAddress,\n };\n}\n",
|
|
6
6
|
"export * from \"./toolbox\";\nexport * from \"./types\";\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": "
|
|
8
|
+
"mappings": "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",
|
|
9
9
|
"debugId": "5A0CDFBA7062355964756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/sui/toolbox.ts", "../src/sui/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n *
|
|
5
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport { AssetValue, Chain, getChainConfig, USwapError } from \"@uswap/helpers\";\nimport { match, P } from \"ts-pattern\";\nimport type { SuiCreateTransactionParams, SuiToolboxParams, SuiTransferParams } from \"./types\";\n\nexport async function getSuiAddressValidator() {\n const { isValidSuiAddress } = await import(\"@mysten/sui/utils\");\n\n return function validateAddress(address: string) {\n try {\n return isValidSuiAddress(address);\n } catch {\n return false;\n }\n };\n}\n\nexport async function getSuiToolbox({ provider: providerParam, ...signerParams }: SuiToolboxParams = {}) {\n const validateAddress = await getSuiAddressValidator();\n\n const signer = await match(signerParams)\n .with({ phrase: P.string }, async ({ phrase }) => {\n const { Ed25519Keypair } = await import(\"@mysten/sui/keypairs/ed25519\");\n return Ed25519Keypair.deriveKeypair(phrase);\n })\n .with({ signer: P.any }, ({ signer }) => signer)\n .otherwise(() => undefined);\n\n async function getSuiClient(url = providerParam) {\n const { SuiClient, getFullnodeUrl } = await import(\"@mysten/sui/client\");\n return new SuiClient({ url: url || getFullnodeUrl(\"mainnet\") });\n }\n\n function getAddress() {\n return signer?.toSuiAddress() || \"\";\n }\n\n async function getBalance(targetAddress?: string) {\n const addressToQuery = targetAddress || getAddress();\n if (!addressToQuery) {\n throw new USwapError(\"toolbox_sui_address_required\" as any);\n }\n\n const { baseDecimal: fromBaseDecimal, chain } = getChainConfig(Chain.Sui);\n\n try {\n const suiClient = await getSuiClient();\n const { totalBalance } = await suiClient.getBalance({ owner: addressToQuery });\n\n const suiBalances = [AssetValue.from({ chain, fromBaseDecimal, value: totalBalance })];\n\n const coinBalances = await suiClient.getAllBalances({ owner: addressToQuery });\n for (const { coinType, totalBalance } of coinBalances) {\n if (coinType === \"0x2::sui::SUI\") continue; // Skip SUI as we already added it\n\n if (Number(totalBalance) > 0) {\n const symbol = coinType.split(\"::\").pop()?.toUpperCase() || \"UNKNOWN\";\n const asset = `${chain}.${symbol}-${coinType}`;\n // Default to 9 decimals, should be fetched from coin metadata\n suiBalances.push(AssetValue.from({ asset, fromBaseDecimal, value: totalBalance }));\n }\n }\n\n return suiBalances;\n } catch {\n return [AssetValue.from({ chain })];\n }\n }\n\n async function estimateTransactionFee(params?: SuiCreateTransactionParams) {\n const defaultFee = AssetValue.from({ chain: Chain.Sui, value: \"0.01\" });\n\n if (!params) return defaultFee;\n\n try {\n const suiClient = await getSuiClient();\n const { txBytes } = await createTransaction(params);\n const {\n effects: { status, gasUsed },\n } = await suiClient.dryRunTransactionBlock({ transactionBlock: txBytes });\n\n if (status.status !== \"success\") return defaultFee;\n\n const totalGas = Number(gasUsed.computationCost) + Number(gasUsed.storageCost) - Number(gasUsed.storageRebate);\n\n return AssetValue.from({ chain: Chain.Sui, value: totalGas.toString() });\n } catch {\n return defaultFee;\n }\n }\n\n async function createTransaction({ recipient, assetValue, gasBudget, sender }: SuiCreateTransactionParams) {\n const { Transaction } = await import(\"@mysten/sui/transactions\");\n\n const senderAddress = sender || getAddress();\n\n if (!senderAddress) {\n throw new USwapError(\"toolbox_sui_no_sender\");\n }\n\n try {\n const tx = new Transaction();\n tx.setSender(senderAddress);\n\n if (assetValue.isGasAsset || assetValue.symbol === \"SUI\") {\n const [suiCoin] = tx.splitCoins(tx.gas, [assetValue.getBaseValue(\"string\")]);\n tx.transferObjects([suiCoin], recipient);\n } else {\n throw new USwapError(\"toolbox_sui_custom_token_transfer_not_implemented\" as any);\n }\n\n if (gasBudget) {\n tx.setGasBudget(gasBudget);\n }\n\n const suiClient = await getSuiClient();\n const txBytes = await tx.build({ client: suiClient });\n\n return { tx, txBytes };\n } catch (error) {\n throw new USwapError(\"toolbox_sui_transaction_creation_error\" as any, { error });\n }\n }\n\n async function signTransaction(\n params: Uint8Array<ArrayBuffer> | SuiCreateTransactionParams | Awaited<ReturnType<typeof createTransaction>>,\n ) {\n if (!signer) {\n throw new USwapError(\"toolbox_sui_no_signer\");\n }\n\n if (params instanceof Uint8Array) {\n return signer.signTransaction(params);\n }\n\n const { txBytes } = \"tx\" in params ? params : await createTransaction(params);\n\n return signer.signTransaction(txBytes);\n }\n\n async function transfer({ assetValue, gasBudget, recipient }: SuiTransferParams) {\n if (!signer) {\n throw new USwapError(\"toolbox_sui_no_signer\" as any);\n }\n\n const sender = signer.toSuiAddress() || getAddress();\n if (!sender) {\n throw new USwapError(\"toolbox_sui_no_sender\");\n }\n\n const { txBytes } = await createTransaction({ assetValue, gasBudget, recipient, sender });\n const suiClient = await getSuiClient();\n const { digest: txHash } = await suiClient.signAndExecuteTransaction({ signer, transaction: txBytes });\n\n return txHash;\n }\n\n return {\n createTransaction,\n estimateTransactionFee,\n getAddress,\n getBalance,\n signTransaction,\n transfer,\n validateAddress,\n };\n}\n",
|
|
6
6
|
"export * from \"./toolbox\";\nexport * from \"./types\";\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": "
|
|
8
|
+
"mappings": "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",
|
|
9
9
|
"debugId": "9B4FCE31099BDDDA64756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
package/dist/src/ton/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var G=Object.create;var{getPrototypeOf:
|
|
1
|
+
var G=Object.create;var{getPrototypeOf:k,defineProperty:p,getOwnPropertyNames:N,getOwnPropertyDescriptor:z}=Object,O=Object.prototype.hasOwnProperty;var d=(t,n,o)=>{o=t!=null?G(k(t)):{};let s=n||!t||!t.__esModule?p(o,"default",{value:t,enumerable:!0}):o;for(let l of N(t))if(!O.call(s,l))p(s,l,{get:()=>t[l],enumerable:!0});return s},_=new WeakMap,E=(t)=>{var n=_.get(t),o;if(n)return n;if(n=p({},"__esModule",{value:!0}),t&&typeof t==="object"||typeof t==="function")N(t).map((s)=>!O.call(n,s)&&p(n,s,{get:()=>t[s],enumerable:!(o=z(t,s))||o.enumerable}));return _.set(t,n),n};var F=(t,n)=>{for(var o in n)p(t,o,{get:n[o],enumerable:!0,configurable:!0,set:(s)=>n[o]=()=>s})};var x=(t,n)=>()=>(t&&(n=t(t=0)),n);async function H(t={}){let{mnemonicToWalletKey:n}=await import("@ton/crypto"),{Address:o,TonClient:s,WalletContractV4:l}=await import("@ton/ton"),P=await b(),m,y,w=await u.match(t).with({phrase:u.P.string},async({phrase:r})=>n(r.split(" "))).with({signer:u.P.any},({signer:r})=>r).otherwise(()=>{return});function g(){let{rpcUrls:r}=e.getChainConfig(e.Chain.Ton),[a]=r;if(!m||m.parameters.endpoint!==a)m=new s({endpoint:a});return m}function T(r){if(!y||r){let a=g(),i=r||w;if(!i)throw new e.USwapError("core_wallet_connection_not_found");let c=l.create({publicKey:i.publicKey,workchain:0});y=a.open(c)}return y}async function A(r){let a=g(),{baseDecimal:i}=e.getChainConfig(e.Chain.Ton);try{let c=await a.getBalance(o.parse(r));return[e.AssetValue.from({chain:e.Chain.Ton,value:e.USwapNumber.fromBigInt(c,i)})]}catch{return[e.AssetValue.from({chain:e.Chain.Ton})]}}async function h({assetValue:r,recipient:a,memo:i}){let c=T();if(!c||!w)throw new e.USwapError("core_wallet_connection_not_found");let{toNano:f,comment:W,internal:B}=await import("@ton/ton"),D=await c.getSeqno(),U=f(r.getValue("string")),q=i?W(i):void 0;return c.createTransfer({messages:[B({body:q,to:a,value:U})],secretKey:w.secretKey,seqno:D})}async function S({assetValue:r,recipient:a,memo:i}){let c=T();if(!c||!w)throw new e.USwapError("core_wallet_connection_not_found");let f=await h({assetValue:r,memo:i,recipient:a});return await c.send(f),f.hash().toString()}async function v(r){let a=T();if(!a)throw new e.USwapError("core_wallet_connection_not_found");try{return await a.send(r),r.hash().toString("hex")}catch(i){throw new e.USwapError("core_wallet_connection_not_found",{error:i})}}function V(){return T().address.toString()}function K(){return Promise.resolve(e.AssetValue.from({chain:e.Chain.Ton,value:"0.0001"}))}return{createTransaction:h,estimateTransactionFee:K,getAddress:V,getBalance:A,sendTransaction:v,transfer:S,validateAddress:P}}async function b(){let{Address:t}=await import("@ton/ton");return function(o){try{return t.parse(o),!0}catch{return!1}}}var e,u;var C=x(()=>{e=require("@uswap/helpers"),u=require("ts-pattern")});var M={};F(M,{getTONToolbox:()=>H,getTONAddressValidator:()=>b});module.exports=E(M);var R=x(()=>{C()});R();
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=2AA847C55D87988264756E2164756E21
|
|
4
4
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/ton/toolbox.ts", "../src/ton/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n *
|
|
5
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport type { Cell, OpenedContract, TonClient, WalletContractV4 } from \"@ton/ton\";\nimport { AssetValue, Chain, getChainConfig, USwapError, USwapNumber } from \"@uswap/helpers\";\nimport { match, P } from \"ts-pattern\";\n\nimport type { TONSigner, TONToolboxParams, TONTransferParams } from \"./types\";\n\nexport async function getTONToolbox(toolboxParams: TONToolboxParams = {}) {\n const { mnemonicToWalletKey } = await import(\"@ton/crypto\");\n const { Address, TonClient, WalletContractV4 } = await import(\"@ton/ton\");\n const validateAddress = await getTONAddressValidator();\n let client: TonClient;\n let wallet: OpenedContract<WalletContractV4>;\n\n const signer = await match(toolboxParams)\n .with({ phrase: P.string }, async ({ phrase }) => mnemonicToWalletKey(phrase.split(\" \")))\n .with({ signer: P.any }, ({ signer }) => signer as TONSigner)\n .otherwise(() => undefined);\n\n function getClient() {\n const { rpcUrls } = getChainConfig(Chain.Ton);\n const [endpoint] = rpcUrls;\n\n if (!client || client.parameters.endpoint !== endpoint) {\n client = new TonClient({ endpoint });\n }\n\n return client;\n }\n\n function getWallet(paramSigner?: TONSigner) {\n if (!wallet || paramSigner) {\n const client = getClient();\n const walletSigner = paramSigner || signer;\n\n if (!walletSigner) {\n throw new USwapError(\"core_wallet_connection_not_found\");\n }\n\n const walletContract = WalletContractV4.create({ publicKey: walletSigner.publicKey, workchain: 0 });\n const contract = client.open(walletContract);\n\n wallet = contract;\n }\n\n return wallet;\n }\n\n async function getBalance(address: string) {\n const client = getClient();\n const { baseDecimal } = getChainConfig(Chain.Ton);\n\n try {\n const balance = await client.getBalance(Address.parse(address));\n return [AssetValue.from({ chain: Chain.Ton, value: USwapNumber.fromBigInt(balance, baseDecimal) })];\n } catch {\n return [AssetValue.from({ chain: Chain.Ton })];\n }\n }\n\n async function createTransaction({ assetValue, recipient, memo }: TONTransferParams) {\n const wallet = getWallet();\n if (!wallet || !signer) {\n throw new USwapError(\"core_wallet_connection_not_found\");\n }\n\n const { toNano, comment, internal } = await import(\"@ton/ton\");\n const seqno = await wallet.getSeqno();\n const amount = toNano(assetValue.getValue(\"string\"));\n const messageBody = memo ? comment(memo) : undefined;\n\n const transfer = wallet.createTransfer({\n messages: [internal({ body: messageBody, to: recipient, value: amount })],\n secretKey: signer.secretKey,\n seqno,\n });\n\n return transfer;\n }\n\n async function transfer({ assetValue, recipient, memo }: TONTransferParams) {\n const wallet = getWallet();\n if (!wallet || !signer) {\n throw new USwapError(\"core_wallet_connection_not_found\");\n }\n\n const transfer = await createTransaction({ assetValue, memo, recipient });\n await wallet.send(transfer);\n\n return transfer.hash().toString();\n }\n\n async function sendTransaction(transferCell: Cell) {\n const wallet = getWallet();\n if (!wallet) {\n throw new USwapError(\"core_wallet_connection_not_found\");\n }\n\n try {\n await wallet.send(transferCell);\n return transferCell.hash().toString(\"hex\");\n } catch (error) {\n throw new USwapError(\"core_wallet_connection_not_found\", { error });\n }\n }\n\n function getAddress() {\n const wallet = getWallet();\n return wallet.address.toString();\n }\n\n function estimateTransactionFee() {\n return Promise.resolve(AssetValue.from({ chain: Chain.Ton, value: \"0.0001\" }));\n }\n\n return {\n createTransaction,\n estimateTransactionFee,\n getAddress,\n getBalance,\n sendTransaction,\n transfer,\n validateAddress,\n };\n}\n\nexport async function getTONAddressValidator() {\n const { Address } = await import(\"@ton/ton\");\n return function validateAddress(address: string) {\n try {\n Address.parse(address);\n return true;\n } catch {\n return false;\n }\n };\n}\n",
|
|
6
6
|
"export * from \"./toolbox\";\nexport * from \"./types\";\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": "
|
|
9
|
-
"debugId": "
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "2AA847C55D87988264756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
package/dist/src/ton/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var
|
|
1
|
+
var k=Object.create;var{getPrototypeOf:z,defineProperty:g,getOwnPropertyNames:E}=Object;var F=Object.prototype.hasOwnProperty;var T=(t,n,r)=>{r=t!=null?k(z(t)):{};let i=n||!t||!t.__esModule?g(r,"default",{value:t,enumerable:!0}):r;for(let c of E(t))if(!F.call(i,c))g(i,c,{get:()=>t[c],enumerable:!0});return i};var H=(t,n)=>{for(var r in n)g(t,r,{get:n[r],enumerable:!0,configurable:!0,set:(i)=>n[r]=()=>i})};var O=(t,n)=>()=>(t&&(n=t(t=0)),n);var d=((t)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(n,r)=>(typeof require<"u"?require:n)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});import{AssetValue as h,Chain as f,getChainConfig as x,USwapError as p,USwapNumber as I}from"@uswap/helpers";import{match as M,P as b}from"ts-pattern";async function R(t={}){let{mnemonicToWalletKey:n}=await import("@ton/crypto"),{Address:r,TonClient:i,WalletContractV4:c}=await import("@ton/ton"),A=await C(),u,y,m=await M(t).with({phrase:b.string},async({phrase:e})=>n(e.split(" "))).with({signer:b.any},({signer:e})=>e).otherwise(()=>{return});function _(){let{rpcUrls:e}=x(f.Ton),[o]=e;if(!u||u.parameters.endpoint!==o)u=new i({endpoint:o});return u}function w(e){if(!y||e){let o=_(),a=e||m;if(!a)throw new p("core_wallet_connection_not_found");let s=c.create({publicKey:a.publicKey,workchain:0});y=o.open(s)}return y}async function S(e){let o=_(),{baseDecimal:a}=x(f.Ton);try{let s=await o.getBalance(r.parse(e));return[h.from({chain:f.Ton,value:I.fromBigInt(s,a)})]}catch{return[h.from({chain:f.Ton})]}}async function N({assetValue:e,recipient:o,memo:a}){let s=w();if(!s||!m)throw new p("core_wallet_connection_not_found");let{toNano:l,comment:B,internal:D}=await import("@ton/ton"),U=await s.getSeqno(),q=l(e.getValue("string")),G=a?B(a):void 0;return s.createTransfer({messages:[D({body:G,to:o,value:q})],secretKey:m.secretKey,seqno:U})}async function v({assetValue:e,recipient:o,memo:a}){let s=w();if(!s||!m)throw new p("core_wallet_connection_not_found");let l=await N({assetValue:e,memo:a,recipient:o});return await s.send(l),l.hash().toString()}async function V(e){let o=w();if(!o)throw new p("core_wallet_connection_not_found");try{return await o.send(e),e.hash().toString("hex")}catch(a){throw new p("core_wallet_connection_not_found",{error:a})}}function K(){return w().address.toString()}function W(){return Promise.resolve(h.from({chain:f.Ton,value:"0.0001"}))}return{createTransaction:N,estimateTransactionFee:W,getAddress:K,getBalance:S,sendTransaction:V,transfer:v,validateAddress:A}}async function C(){let{Address:t}=await import("@ton/ton");return function(r){try{return t.parse(r),!0}catch{return!1}}}var P=()=>{};var J={};H(J,{getTONToolbox:()=>R,getTONAddressValidator:()=>C});var L=O(()=>{P()});L();export{R as getTONToolbox,C as getTONAddressValidator};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=F7F74C29477562E864756E2164756E21
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/ton/toolbox.ts", "../src/ton/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n *
|
|
5
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport type { Cell, OpenedContract, TonClient, WalletContractV4 } from \"@ton/ton\";\nimport { AssetValue, Chain, getChainConfig, USwapError, USwapNumber } from \"@uswap/helpers\";\nimport { match, P } from \"ts-pattern\";\n\nimport type { TONSigner, TONToolboxParams, TONTransferParams } from \"./types\";\n\nexport async function getTONToolbox(toolboxParams: TONToolboxParams = {}) {\n const { mnemonicToWalletKey } = await import(\"@ton/crypto\");\n const { Address, TonClient, WalletContractV4 } = await import(\"@ton/ton\");\n const validateAddress = await getTONAddressValidator();\n let client: TonClient;\n let wallet: OpenedContract<WalletContractV4>;\n\n const signer = await match(toolboxParams)\n .with({ phrase: P.string }, async ({ phrase }) => mnemonicToWalletKey(phrase.split(\" \")))\n .with({ signer: P.any }, ({ signer }) => signer as TONSigner)\n .otherwise(() => undefined);\n\n function getClient() {\n const { rpcUrls } = getChainConfig(Chain.Ton);\n const [endpoint] = rpcUrls;\n\n if (!client || client.parameters.endpoint !== endpoint) {\n client = new TonClient({ endpoint });\n }\n\n return client;\n }\n\n function getWallet(paramSigner?: TONSigner) {\n if (!wallet || paramSigner) {\n const client = getClient();\n const walletSigner = paramSigner || signer;\n\n if (!walletSigner) {\n throw new USwapError(\"core_wallet_connection_not_found\");\n }\n\n const walletContract = WalletContractV4.create({ publicKey: walletSigner.publicKey, workchain: 0 });\n const contract = client.open(walletContract);\n\n wallet = contract;\n }\n\n return wallet;\n }\n\n async function getBalance(address: string) {\n const client = getClient();\n const { baseDecimal } = getChainConfig(Chain.Ton);\n\n try {\n const balance = await client.getBalance(Address.parse(address));\n return [AssetValue.from({ chain: Chain.Ton, value: USwapNumber.fromBigInt(balance, baseDecimal) })];\n } catch {\n return [AssetValue.from({ chain: Chain.Ton })];\n }\n }\n\n async function createTransaction({ assetValue, recipient, memo }: TONTransferParams) {\n const wallet = getWallet();\n if (!wallet || !signer) {\n throw new USwapError(\"core_wallet_connection_not_found\");\n }\n\n const { toNano, comment, internal } = await import(\"@ton/ton\");\n const seqno = await wallet.getSeqno();\n const amount = toNano(assetValue.getValue(\"string\"));\n const messageBody = memo ? comment(memo) : undefined;\n\n const transfer = wallet.createTransfer({\n messages: [internal({ body: messageBody, to: recipient, value: amount })],\n secretKey: signer.secretKey,\n seqno,\n });\n\n return transfer;\n }\n\n async function transfer({ assetValue, recipient, memo }: TONTransferParams) {\n const wallet = getWallet();\n if (!wallet || !signer) {\n throw new USwapError(\"core_wallet_connection_not_found\");\n }\n\n const transfer = await createTransaction({ assetValue, memo, recipient });\n await wallet.send(transfer);\n\n return transfer.hash().toString();\n }\n\n async function sendTransaction(transferCell: Cell) {\n const wallet = getWallet();\n if (!wallet) {\n throw new USwapError(\"core_wallet_connection_not_found\");\n }\n\n try {\n await wallet.send(transferCell);\n return transferCell.hash().toString(\"hex\");\n } catch (error) {\n throw new USwapError(\"core_wallet_connection_not_found\", { error });\n }\n }\n\n function getAddress() {\n const wallet = getWallet();\n return wallet.address.toString();\n }\n\n function estimateTransactionFee() {\n return Promise.resolve(AssetValue.from({ chain: Chain.Ton, value: \"0.0001\" }));\n }\n\n return {\n createTransaction,\n estimateTransactionFee,\n getAddress,\n getBalance,\n sendTransaction,\n transfer,\n validateAddress,\n };\n}\n\nexport async function getTONAddressValidator() {\n const { Address } = await import(\"@ton/ton\");\n return function validateAddress(address: string) {\n try {\n Address.parse(address);\n return true;\n } catch {\n return false;\n }\n };\n}\n",
|
|
6
6
|
"export * from \"./toolbox\";\nexport * from \"./types\";\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": "
|
|
9
|
-
"debugId": "
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "F7F74C29477562E864756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
"sources": ["../src/tron/helpers/trc20.abi.ts", "../src/tron/helpers/trongrid.ts", "../src/tron/toolbox.ts", "../src/tron/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"export const trc20ABI = [\n {\n constant: true,\n inputs: [{ name: \"_owner\", type: \"address\" }],\n name: \"balanceOf\",\n outputs: [{ name: \"balance\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n { name: \"_to\", type: \"address\" },\n { name: \"_value\", type: \"uint256\" },\n ],\n name: \"transfer\",\n outputs: [{ name: \"success\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"decimals\",\n outputs: [{ name: \"\", type: \"uint8\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"symbol\",\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"name\",\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [\n { name: \"_owner\", type: \"address\" },\n { name: \"_spender\", type: \"address\" },\n ],\n name: \"allowance\",\n outputs: [{ name: \"remaining\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n { name: \"_spender\", type: \"address\" },\n { name: \"_value\", type: \"uint256\" },\n ],\n name: \"approve\",\n outputs: [{ name: \"success\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"totalSupply\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n { name: \"_from\", type: \"address\" },\n { name: \"_to\", type: \"address\" },\n { name: \"_value\", type: \"uint256\" },\n ],\n name: \"transferFrom\",\n outputs: [{ name: \"success\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, name: \"_from\", type: \"address\" },\n { indexed: true, name: \"_to\", type: \"address\" },\n { indexed: false, name: \"_value\", type: \"uint256\" },\n ],\n name: \"Transfer\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, name: \"_owner\", type: \"address\" },\n { indexed: true, name: \"_spender\", type: \"address\" },\n { indexed: false, name: \"_value\", type: \"uint256\" },\n ],\n name: \"Approval\",\n type: \"event\",\n },\n] as const;\n",
|
|
6
|
-
"/**\n *
|
|
7
|
-
"/**\n * Based on code from SwapKit (https://github.com/swapkit/SwapKit),\n * licensed under the Apache License 2.0.\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport {\n AssetValue,\n BaseDecimal,\n Chain,\n derivationPathToString,\n getRPCUrl,\n NetworkDerivationPath,\n USwapError,\n updateDerivationPath,\n warnOnce,\n} from \"@uswap/helpers\";\nimport type { TronWeb } from \"tronweb\";\nimport { match, P } from \"ts-pattern\";\nimport { trc20ABI } from \"./helpers/trc20.abi\";\nimport { fetchAccountFromTronGrid } from \"./helpers/trongrid\";\nimport type {\n TronApprovedParams,\n TronApproveParams,\n TronCreateTransactionParams,\n TronIsApprovedParams,\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types\";\n\n// Constants for TRON resource calculation\nconst TRX_TRANSFER_BANDWIDTH = 268; // Bandwidth consumed by a TRX transfer\nconst TRC20_TRANSFER_ENERGY = 13000; // Average energy consumed by TRC20 transfer\nconst TRC20_TRANSFER_BANDWIDTH = 345; // Bandwidth consumed by TRC20 transfer\n\n// Known TRON tokens\nconst TRON_USDT_CONTRACT = \"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t\";\n\nconst MAX_APPROVAL = \"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\";\n\nexport async function getTronAddressValidator() {\n const TW = await import(\"tronweb\");\n const TronWeb = TW.TronWeb ?? TW.default?.TronWeb;\n\n return (address: string) => {\n return TronWeb.isAddress(address);\n };\n}\n\nexport async function getTronPrivateKeyFromMnemonic({\n phrase,\n derivationPath: customPath,\n index,\n}: {\n phrase: string;\n derivationPath?: string;\n index?: number;\n}) {\n const derivationPathToUse =\n customPath ||\n derivationPathToString(updateDerivationPath(NetworkDerivationPath[Chain.Tron], { index: index || 0 }));\n\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPathToUse);\n\n if (!derived.privateKey) {\n throw new USwapError(\"toolbox_tron_no_signer\");\n }\n\n return Buffer.from(derived.privateKey).toString(\"hex\");\n}\n\nasync function createKeysForPath({\n phrase,\n derivationPath,\n tronWeb,\n}: {\n phrase: string;\n derivationPath: string;\n tronWeb: TronWeb;\n}) {\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPath);\n\n if (!derived.privateKey) {\n throw new USwapError(\"toolbox_tron_no_signer\");\n }\n\n // Convert private key to hex string for TronWeb\n const privateKeyHex = Buffer.from(derived.privateKey).toString(\"hex\");\n\n tronWeb.setPrivateKey(privateKeyHex);\n\n const address = tronWeb?.address.fromPrivateKey(privateKeyHex);\n\n return {\n getAddress: () => Promise.resolve(typeof address === \"string\" ? address : \"\"),\n signTransaction: async (transaction: TronTransaction) => {\n const signedTx = await tronWeb.trx.sign(transaction, privateKeyHex);\n return signedTx;\n },\n };\n}\n\nexport const createTronToolbox = async (\n options: TronToolboxOptions = {},\n): Promise<{\n tronWeb: TronWeb;\n getAddress: () => Promise<string>;\n validateAddress: (address: string) => boolean;\n getBalance: (address: string) => Promise<AssetValue[]>;\n transfer: (params: TronTransferParams) => Promise<string>;\n estimateTransactionFee: (params: TronTransferParams & { sender?: string }) => Promise<AssetValue>;\n createTransaction: (params: TronCreateTransactionParams) => Promise<TronTransaction>;\n signTransaction: (transaction: TronTransaction) => Promise<TronSignedTransaction>;\n broadcastTransaction: (signedTransaction: TronSignedTransaction) => Promise<string>;\n approve: (params: TronApproveParams) => Promise<string>;\n isApproved: (params: TronIsApprovedParams) => Promise<boolean>;\n getApprovedAmount: (params: TronApprovedParams) => Promise<bigint>;\n}> => {\n const TW = await import(\"tronweb\");\n const TronWeb = TW.TronWeb ?? TW.default?.TronWeb;\n\n const rpcUrl = await getRPCUrl(Chain.Tron);\n // Note: TRON API key support can be added to SKConfig apiKeys when needed\n const headers = undefined; // No API key needed for basic TronGrid access\n\n const tronWeb = new TronWeb({ fullHost: rpcUrl, headers });\n\n // Handle derivation path and index\n const index = \"index\" in options ? options.index || 0 : 0;\n const derivationPath = derivationPathToString(\n \"derivationPath\" in options && options.derivationPath\n ? options.derivationPath\n : updateDerivationPath(NetworkDerivationPath[Chain.Tron], { index }),\n );\n\n // Create signer based on options using pattern matching\n const signer: TronSigner | undefined = await match(options)\n .with({ phrase: P.string }, async ({ phrase }) => createKeysForPath({ derivationPath, phrase, tronWeb }))\n .with({ signer: P.any }, ({ signer }) => Promise.resolve(signer as TronSigner))\n .otherwise(() => Promise.resolve(undefined));\n\n const getAddress = async () => {\n if (!signer) throw new USwapError(\"toolbox_tron_no_signer\");\n return await signer.getAddress();\n };\n\n const calculateFeeLimit = () => {\n return 100_000_000; // 100 TRX in SUN\n };\n\n /**\n * Get current chain parameters including resource prices\n */\n const getChainParameters = async () => {\n try {\n const parameters = await tronWeb.trx.getChainParameters();\n const paramMap: Record<string, number> = {};\n\n for (const param of parameters) {\n paramMap[param.key] = param.value;\n }\n\n return {\n bandwidthFee: paramMap.getTransactionFee || 1000, // SUN per bandwidth unit\n createAccountFee: paramMap.getCreateAccountFee || 100000, // 0.1 TRX in SUN\n energyFee: paramMap.getEnergyFee || 420, // SUN per energy unit\n };\n } catch {\n // Return default values if unable to fetch\n return { bandwidthFee: 1000, createAccountFee: 100000, energyFee: 420 };\n }\n };\n\n /**\n * Check if an address exists on the blockchain\n */\n const accountExists = async (address: string) => {\n try {\n const account = await tronWeb.trx.getAccount(address);\n return account && Object.keys(account).length > 0;\n } catch {\n return false;\n }\n };\n\n /**\n * Get account resources (bandwidth and energy)\n */\n const getAccountResources = async (address: string) => {\n try {\n const resources = await tronWeb.trx.getAccountResources(address);\n\n return {\n bandwidth: {\n free: resources.freeNetLimit - resources.freeNetUsed,\n total: resources.NetLimit || 0,\n used: resources.NetUsed || 0,\n },\n energy: { total: resources.EnergyLimit || 0, used: resources.EnergyUsed || 0 },\n };\n } catch {\n // Return default structure if unable to fetch\n return {\n bandwidth: { free: 600, total: 0, used: 0 }, // 600 free bandwidth daily\n energy: { total: 0, used: 0 },\n };\n }\n };\n\n /**\n * Get token balance and info directly from contract\n */\n const fetchTokenBalance = async (address: string, contractAddress: string) => {\n try {\n const contract = tronWeb.contract(trc20ABI, contractAddress);\n\n if (!contract.methods?.balanceOf) {\n return 0n;\n }\n\n const [balance] = await contract.methods.balanceOf(address).call();\n\n return balance ? (typeof balance === \"bigint\" ? balance : BigInt(balance)) : 0n;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n console.warn(`balanceOf() failed for ${contractAddress}: ${errorMessage}`);\n return 0n;\n }\n };\n\n /**\n * Get token balance and info directly from contract\n */\n const fetchTokenMetadata = async (contractAddress: string, address: string) => {\n try {\n tronWeb.setAddress(address); // Set address for contract calls\n const contract = tronWeb.contract(trc20ABI, contractAddress);\n\n const [symbolRaw, decimalsRaw] = await Promise.all([\n contract\n .symbol()\n .call()\n .catch(() => \"UNKNOWN\"),\n contract\n .decimals()\n .call()\n .catch(() => \"18\"),\n ]);\n\n return { decimals: Number(decimalsRaw ?? 18), symbol: symbolRaw ?? \"UNKNOWN\" };\n } catch (error) {\n warnOnce({\n condition: true,\n id: \"tron_toolbox_get_token_metadata_failed\",\n warning: `Failed to get token metadata for ${contractAddress}: ${\n error instanceof Error ? error.message : error\n }`,\n });\n return null;\n }\n };\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO\n const getBalance = async (address: string, _scamFilter = true) => {\n const fallbackBalance = [AssetValue.from({ chain: Chain.Tron })];\n // Try primary source (TronGrid)\n try {\n const accountData = await fetchAccountFromTronGrid(address);\n if (accountData) {\n const balances: AssetValue[] = [];\n\n // Add TRX balance\n balances.push(AssetValue.from({ chain: Chain.Tron, fromBaseDecimal: 6, value: accountData.balance }));\n\n // Add TRC20 balances\n\n for (const token of accountData.trc20) {\n const [contractAddress, balance] = Object.entries(token)[0] || [];\n\n if (!(contractAddress && balance)) continue;\n\n const tokenMetaData = await fetchTokenMetadata(contractAddress, address);\n\n if (!tokenMetaData) continue;\n\n balances.push(\n AssetValue.from({\n asset: `TRON.${tokenMetaData.symbol}-${contractAddress}`,\n fromBaseDecimal: tokenMetaData.decimals,\n value: BigInt(balance || 0),\n }),\n );\n }\n\n return balances;\n }\n return fallbackBalance;\n } catch (error) {\n warnOnce({\n condition: true,\n id: \"tron_toolbox_get_balance_failed\",\n warning: `Tron API getBalance failed: ${error instanceof Error ? error.message : error}`,\n });\n\n try {\n const balances: AssetValue[] = [];\n\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n if (trxBalanceInSun && Number(trxBalanceInSun) > 0) {\n balances.push(AssetValue.from({ chain: Chain.Tron, fromBaseDecimal: 6, value: trxBalanceInSun }));\n }\n\n const usdtBalance = await fetchTokenBalance(address, TRON_USDT_CONTRACT);\n if (usdtBalance) {\n balances.push(\n AssetValue.from({ asset: `TRON.USDT-${TRON_USDT_CONTRACT}`, fromBaseDecimal: 6, value: usdtBalance }),\n );\n }\n\n if (balances.length === 0) {\n return fallbackBalance;\n }\n\n return balances;\n } catch (fallbackError) {\n const errorMessage = fallbackError instanceof Error ? fallbackError.message : String(fallbackError);\n console.error(`Tron balance fetch failed: ${errorMessage}`);\n return fallbackBalance;\n }\n }\n };\n\n const transfer = async ({ recipient, assetValue, memo, expiration }: TronTransferParams) => {\n if (!signer) throw new USwapError(\"toolbox_tron_no_signer\");\n\n const from = await getAddress();\n tronWeb.setAddress(from);\n const transaction = await createTransaction({ assetValue, expiration, memo, recipient, sender: from });\n\n const signedTx = await signer.signTransaction(transaction);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n\n if (!txid) {\n throw new USwapError(\"toolbox_tron_token_transfer_failed\");\n }\n\n return txid;\n };\n\n const estimateTransactionFee = async ({\n assetValue,\n recipient,\n sender,\n }: // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO\n TronTransferParams & { sender?: string }) => {\n const isNative = assetValue.isGasAsset;\n\n try {\n const senderAddress = sender ? sender : signer ? await getAddress() : undefined;\n if (!senderAddress) {\n return isNative\n ? AssetValue.from({ chain: Chain.Tron, fromBaseDecimal: 0, value: 0.1 })\n : AssetValue.from({ chain: Chain.Tron, fromBaseDecimal: 0, value: 15 });\n }\n\n const chainParams = await getChainParameters();\n\n const recipientExists = await accountExists(recipient);\n const activationFee = recipientExists ? 0 : chainParams.createAccountFee;\n\n const resources = await getAccountResources(senderAddress);\n\n if (isNative) {\n const bandwidthNeeded = TRX_TRANSFER_BANDWIDTH;\n const availableBandwidth = resources.bandwidth.free + (resources.bandwidth.total - resources.bandwidth.used);\n\n let bandwidthFee = 0;\n if (bandwidthNeeded > availableBandwidth) {\n const bandwidthToBuy = bandwidthNeeded - availableBandwidth;\n bandwidthFee = bandwidthToBuy * chainParams.bandwidthFee;\n }\n\n const totalFeeSun = activationFee + bandwidthFee;\n\n return AssetValue.from({ chain: Chain.Tron, fromBaseDecimal: BaseDecimal.TRON, value: totalFeeSun });\n }\n\n const bandwidthNeeded = TRC20_TRANSFER_BANDWIDTH;\n const energyNeeded = TRC20_TRANSFER_ENERGY;\n\n const availableBandwidth = resources.bandwidth.free + (resources.bandwidth.total - resources.bandwidth.used);\n const availableEnergy = resources.energy.total - resources.energy.used;\n\n let bandwidthFee = 0;\n if (bandwidthNeeded > availableBandwidth) {\n const bandwidthToBuy = bandwidthNeeded - availableBandwidth;\n bandwidthFee = bandwidthToBuy * chainParams.bandwidthFee;\n }\n\n let energyFee = 0;\n if (energyNeeded > availableEnergy) {\n const energyToBuy = energyNeeded - availableEnergy;\n energyFee = energyToBuy * chainParams.energyFee;\n }\n\n const totalFeeSun = activationFee + bandwidthFee + energyFee;\n\n return AssetValue.from({ chain: Chain.Tron, fromBaseDecimal: BaseDecimal.TRON, value: totalFeeSun });\n } catch (error) {\n warnOnce({\n condition: true,\n id: \"tron_toolbox_fee_estimation_failed\",\n warning: `Failed to calculate exact fee, using conservative estimate: ${\n error instanceof Error ? error.message : error\n }`,\n });\n\n throw new USwapError(\"toolbox_tron_fee_estimation_failed\", { error });\n }\n };\n\n const createTransaction = async (params: TronCreateTransactionParams) => {\n const { recipient, assetValue, memo, sender, expiration } = params;\n const isNative = assetValue.isGasAsset;\n\n const addTxData = async ({\n transaction,\n memo,\n expiration,\n }: {\n transaction: TronTransaction;\n memo?: string;\n expiration?: number;\n }) => {\n const transactionWithMemo = memo\n ? await tronWeb.transactionBuilder.addUpdateData(transaction, memo, \"utf8\")\n : transaction;\n\n const transactionFinal = expiration\n ? await tronWeb.transactionBuilder.extendExpiration(transactionWithMemo, expiration)\n : transactionWithMemo;\n\n return transactionFinal;\n };\n\n if (isNative) {\n const transaction = await tronWeb.transactionBuilder.sendTrx(\n recipient,\n assetValue.getBaseValue(\"number\"),\n sender,\n );\n\n const txWithData = addTxData({ expiration, memo, transaction });\n return txWithData;\n }\n\n tronWeb.setAddress(sender);\n const contractAddress = assetValue.address;\n if (!contractAddress) {\n throw new USwapError(\"toolbox_tron_invalid_token_identifier\", { identifier: assetValue.toString() });\n }\n\n try {\n const functionSelector = \"transfer(address,uint256)\";\n const parameter = [\n { type: \"address\", value: recipient },\n { type: \"uint256\", value: assetValue.getBaseValue(\"string\") },\n ];\n\n const options = { callValue: 0, feeLimit: calculateFeeLimit() };\n\n const { transaction } = await tronWeb.transactionBuilder.triggerSmartContract(\n contractAddress,\n functionSelector,\n options,\n parameter,\n sender,\n );\n\n const txWithData = addTxData({ expiration, memo, transaction });\n return txWithData;\n } catch (error) {\n throw new USwapError(\"toolbox_tron_transaction_creation_failed\", {\n message: \"Failed to create TRC20 transaction.\",\n originalError: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n const signTransaction = async (transaction: TronTransaction) => {\n if (!signer) throw new USwapError(\"toolbox_tron_no_signer\");\n return await signer.signTransaction(transaction);\n };\n\n const broadcastTransaction = async (signedTx: TronSignedTransaction) => {\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n };\n\n const getApprovedAmount = async ({ assetAddress, spenderAddress, from }: TronApprovedParams) => {\n try {\n const contract = tronWeb.contract(trc20ABI, assetAddress);\n\n if (!contract.methods?.allowance) {\n throw new USwapError(\"toolbox_tron_invalid_token_contract\");\n }\n\n const [allowance] = await contract.methods.allowance(from, spenderAddress).call();\n\n return allowance ? (typeof allowance === \"bigint\" ? allowance : BigInt(allowance)) : 0n;\n } catch (error) {\n throw new USwapError(\"toolbox_tron_allowance_check_failed\", { error });\n }\n };\n\n const isApproved = async ({ assetAddress, spenderAddress, from, amount }: TronIsApprovedParams) => {\n const allowance = await getApprovedAmount({ assetAddress, from, spenderAddress });\n\n if (!amount) {\n return allowance > 0n;\n }\n\n const amountBigInt = BigInt(amount);\n return allowance >= amountBigInt;\n };\n\n const approve = async ({ assetAddress, spenderAddress, amount, from }: TronApproveParams) => {\n if (!signer) throw new USwapError(\"toolbox_tron_no_signer\");\n\n const fromAddress = from || (await getAddress());\n const approvalAmount = amount !== undefined ? BigInt(amount).toString() : MAX_APPROVAL;\n\n const functionSelector = \"approve(address,uint256)\";\n const parameter = [\n { type: \"address\", value: spenderAddress },\n { type: \"uint256\", value: approvalAmount },\n ];\n\n const feeLimit = calculateFeeLimit();\n const options = { callValue: 0, feeLimit };\n\n try {\n const { transaction } = await tronWeb.transactionBuilder.triggerSmartContract(\n assetAddress,\n functionSelector,\n options,\n parameter,\n fromAddress,\n );\n\n const signedTx = await signer.signTransaction(transaction);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n\n if (!txid) {\n throw new USwapError(\"toolbox_tron_approve_failed\");\n }\n\n return txid;\n } catch (error) {\n throw new USwapError(\"toolbox_tron_approve_failed\", { error });\n }\n };\n\n return {\n approve,\n broadcastTransaction,\n createTransaction,\n estimateTransactionFee,\n getAddress,\n getApprovedAmount,\n getBalance,\n isApproved,\n signTransaction,\n transfer,\n tronWeb,\n validateAddress: await getTronAddressValidator(),\n };\n};\n",
|
|
6
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport { USwapError } from \"@uswap/helpers\";\nimport type { TronGridAccountResponse } from \"../types\";\n\nconst TRONGRID_API_BASE = \"https://api.trongrid.io\";\n\n/**\n * Fetch account information including TRC20 balances from TronGrid API\n */\nexport async function fetchAccountFromTronGrid(address: string) {\n const TW = await import(\"tronweb\");\n const TronWeb = TW.TronWeb ?? TW.default?.TronWeb;\n\n try {\n const response = await fetch(`${TRONGRID_API_BASE}/v1/accounts/${address}`);\n\n if (!response.ok) {\n throw new Error(`TronGrid API error: ${response.status} ${response.statusText}`);\n }\n\n const data = (await response.json()) as TronGridAccountResponse;\n\n if (!(data.success && data.data) || data.data.length === 0) {\n throw new Error(\"Invalid response from TronGrid API\");\n }\n\n // Convert search address to hex format for comparison\n let searchAddressHex: string;\n try {\n // If address is base58, convert to hex\n searchAddressHex = TronWeb.address.toHex(address).toLowerCase();\n } catch {\n // If conversion fails, assume it's already hex\n searchAddressHex = address.toLowerCase();\n }\n\n // Find the account that matches the requested address\n const account = data.data.find((acc) => {\n return acc.address.toLowerCase() === searchAddressHex;\n });\n\n if (!account) {\n return;\n }\n\n // Return simplified object with balance and trc20 array\n return { balance: account.balance, trc20: account.trc20 || [] };\n } catch (error) {\n throw new USwapError(\"toolbox_tron_trongrid_api_error\", {\n address,\n message: error instanceof Error ? error.message : \"Unknown error\",\n });\n }\n}\n",
|
|
7
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport {\n AssetValue,\n BaseDecimal,\n Chain,\n derivationPathToString,\n getRPCUrl,\n NetworkDerivationPath,\n USwapError,\n updateDerivationPath,\n warnOnce,\n} from \"@uswap/helpers\";\nimport type { TronWeb } from \"tronweb\";\nimport { match, P } from \"ts-pattern\";\nimport { trc20ABI } from \"./helpers/trc20.abi\";\nimport { fetchAccountFromTronGrid } from \"./helpers/trongrid\";\nimport type {\n TronApprovedParams,\n TronApproveParams,\n TronCreateTransactionParams,\n TronIsApprovedParams,\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types\";\n\n// Constants for TRON resource calculation\nconst TRX_TRANSFER_BANDWIDTH = 268; // Bandwidth consumed by a TRX transfer\nconst TRC20_TRANSFER_ENERGY = 13000; // Average energy consumed by TRC20 transfer\nconst TRC20_TRANSFER_BANDWIDTH = 345; // Bandwidth consumed by TRC20 transfer\n\n// Known TRON tokens\nconst TRON_USDT_CONTRACT = \"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t\";\n\nconst MAX_APPROVAL = \"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\";\n\nexport async function getTronAddressValidator() {\n const TW = await import(\"tronweb\");\n const TronWeb = TW.TronWeb ?? TW.default?.TronWeb;\n\n return (address: string) => {\n return TronWeb.isAddress(address);\n };\n}\n\nexport async function getTronPrivateKeyFromMnemonic({\n phrase,\n derivationPath: customPath,\n index,\n}: {\n phrase: string;\n derivationPath?: string;\n index?: number;\n}) {\n const derivationPathToUse =\n customPath ||\n derivationPathToString(updateDerivationPath(NetworkDerivationPath[Chain.Tron], { index: index || 0 }));\n\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPathToUse);\n\n if (!derived.privateKey) {\n throw new USwapError(\"toolbox_tron_no_signer\");\n }\n\n return Buffer.from(derived.privateKey).toString(\"hex\");\n}\n\nasync function createKeysForPath({\n phrase,\n derivationPath,\n tronWeb,\n}: {\n phrase: string;\n derivationPath: string;\n tronWeb: TronWeb;\n}) {\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPath);\n\n if (!derived.privateKey) {\n throw new USwapError(\"toolbox_tron_no_signer\");\n }\n\n // Convert private key to hex string for TronWeb\n const privateKeyHex = Buffer.from(derived.privateKey).toString(\"hex\");\n\n tronWeb.setPrivateKey(privateKeyHex);\n\n const address = tronWeb?.address.fromPrivateKey(privateKeyHex);\n\n return {\n getAddress: () => Promise.resolve(typeof address === \"string\" ? address : \"\"),\n signTransaction: async (transaction: TronTransaction) => {\n const signedTx = await tronWeb.trx.sign(transaction, privateKeyHex);\n return signedTx;\n },\n };\n}\n\nexport const createTronToolbox = async (\n options: TronToolboxOptions = {},\n): Promise<{\n tronWeb: TronWeb;\n getAddress: () => Promise<string>;\n validateAddress: (address: string) => boolean;\n getBalance: (address: string) => Promise<AssetValue[]>;\n transfer: (params: TronTransferParams) => Promise<string>;\n estimateTransactionFee: (params: TronTransferParams & { sender?: string }) => Promise<AssetValue>;\n createTransaction: (params: TronCreateTransactionParams) => Promise<TronTransaction>;\n signTransaction: (transaction: TronTransaction) => Promise<TronSignedTransaction>;\n broadcastTransaction: (signedTransaction: TronSignedTransaction) => Promise<string>;\n approve: (params: TronApproveParams) => Promise<string>;\n isApproved: (params: TronIsApprovedParams) => Promise<boolean>;\n getApprovedAmount: (params: TronApprovedParams) => Promise<bigint>;\n}> => {\n const TW = await import(\"tronweb\");\n const TronWeb = TW.TronWeb ?? TW.default?.TronWeb;\n\n const rpcUrl = await getRPCUrl(Chain.Tron);\n // Note: TRON API key support can be added to USwapConfig apiKeys when needed\n const headers = undefined; // No API key needed for basic TronGrid access\n\n const tronWeb = new TronWeb({ fullHost: rpcUrl, headers });\n\n // Handle derivation path and index\n const index = \"index\" in options ? options.index || 0 : 0;\n const derivationPath = derivationPathToString(\n \"derivationPath\" in options && options.derivationPath\n ? options.derivationPath\n : updateDerivationPath(NetworkDerivationPath[Chain.Tron], { index }),\n );\n\n // Create signer based on options using pattern matching\n const signer: TronSigner | undefined = await match(options)\n .with({ phrase: P.string }, async ({ phrase }) => createKeysForPath({ derivationPath, phrase, tronWeb }))\n .with({ signer: P.any }, ({ signer }) => Promise.resolve(signer as TronSigner))\n .otherwise(() => Promise.resolve(undefined));\n\n const getAddress = async () => {\n if (!signer) throw new USwapError(\"toolbox_tron_no_signer\");\n return await signer.getAddress();\n };\n\n const calculateFeeLimit = () => {\n return 100_000_000; // 100 TRX in SUN\n };\n\n /**\n * Get current chain parameters including resource prices\n */\n const getChainParameters = async () => {\n try {\n const parameters = await tronWeb.trx.getChainParameters();\n const paramMap: Record<string, number> = {};\n\n for (const param of parameters) {\n paramMap[param.key] = param.value;\n }\n\n return {\n bandwidthFee: paramMap.getTransactionFee || 1000, // SUN per bandwidth unit\n createAccountFee: paramMap.getCreateAccountFee || 100000, // 0.1 TRX in SUN\n energyFee: paramMap.getEnergyFee || 420, // SUN per energy unit\n };\n } catch {\n // Return default values if unable to fetch\n return { bandwidthFee: 1000, createAccountFee: 100000, energyFee: 420 };\n }\n };\n\n /**\n * Check if an address exists on the blockchain\n */\n const accountExists = async (address: string) => {\n try {\n const account = await tronWeb.trx.getAccount(address);\n return account && Object.keys(account).length > 0;\n } catch {\n return false;\n }\n };\n\n /**\n * Get account resources (bandwidth and energy)\n */\n const getAccountResources = async (address: string) => {\n try {\n const resources = await tronWeb.trx.getAccountResources(address);\n\n return {\n bandwidth: {\n free: resources.freeNetLimit - resources.freeNetUsed,\n total: resources.NetLimit || 0,\n used: resources.NetUsed || 0,\n },\n energy: { total: resources.EnergyLimit || 0, used: resources.EnergyUsed || 0 },\n };\n } catch {\n // Return default structure if unable to fetch\n return {\n bandwidth: { free: 600, total: 0, used: 0 }, // 600 free bandwidth daily\n energy: { total: 0, used: 0 },\n };\n }\n };\n\n /**\n * Get token balance and info directly from contract\n */\n const fetchTokenBalance = async (address: string, contractAddress: string) => {\n try {\n const contract = tronWeb.contract(trc20ABI, contractAddress);\n\n if (!contract.methods?.balanceOf) {\n return 0n;\n }\n\n const [balance] = await contract.methods.balanceOf(address).call();\n\n return balance ? (typeof balance === \"bigint\" ? balance : BigInt(balance)) : 0n;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n console.warn(`balanceOf() failed for ${contractAddress}: ${errorMessage}`);\n return 0n;\n }\n };\n\n /**\n * Get token balance and info directly from contract\n */\n const fetchTokenMetadata = async (contractAddress: string, address: string) => {\n try {\n tronWeb.setAddress(address); // Set address for contract calls\n const contract = tronWeb.contract(trc20ABI, contractAddress);\n\n const [symbolRaw, decimalsRaw] = await Promise.all([\n contract\n .symbol()\n .call()\n .catch(() => \"UNKNOWN\"),\n contract\n .decimals()\n .call()\n .catch(() => \"18\"),\n ]);\n\n return { decimals: Number(decimalsRaw ?? 18), symbol: symbolRaw ?? \"UNKNOWN\" };\n } catch (error) {\n warnOnce({\n condition: true,\n id: \"tron_toolbox_get_token_metadata_failed\",\n warning: `Failed to get token metadata for ${contractAddress}: ${\n error instanceof Error ? error.message : error\n }`,\n });\n return null;\n }\n };\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO\n const getBalance = async (address: string, _scamFilter = true) => {\n const fallbackBalance = [AssetValue.from({ chain: Chain.Tron })];\n // Try primary source (TronGrid)\n try {\n const accountData = await fetchAccountFromTronGrid(address);\n if (accountData) {\n const balances: AssetValue[] = [];\n\n // Add TRX balance\n balances.push(AssetValue.from({ chain: Chain.Tron, fromBaseDecimal: 6, value: accountData.balance }));\n\n // Add TRC20 balances\n\n for (const token of accountData.trc20) {\n const [contractAddress, balance] = Object.entries(token)[0] || [];\n\n if (!(contractAddress && balance)) continue;\n\n const tokenMetaData = await fetchTokenMetadata(contractAddress, address);\n\n if (!tokenMetaData) continue;\n\n balances.push(\n AssetValue.from({\n asset: `TRON.${tokenMetaData.symbol}-${contractAddress}`,\n fromBaseDecimal: tokenMetaData.decimals,\n value: BigInt(balance || 0),\n }),\n );\n }\n\n return balances;\n }\n return fallbackBalance;\n } catch (error) {\n warnOnce({\n condition: true,\n id: \"tron_toolbox_get_balance_failed\",\n warning: `Tron API getBalance failed: ${error instanceof Error ? error.message : error}`,\n });\n\n try {\n const balances: AssetValue[] = [];\n\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n if (trxBalanceInSun && Number(trxBalanceInSun) > 0) {\n balances.push(AssetValue.from({ chain: Chain.Tron, fromBaseDecimal: 6, value: trxBalanceInSun }));\n }\n\n const usdtBalance = await fetchTokenBalance(address, TRON_USDT_CONTRACT);\n if (usdtBalance) {\n balances.push(\n AssetValue.from({ asset: `TRON.USDT-${TRON_USDT_CONTRACT}`, fromBaseDecimal: 6, value: usdtBalance }),\n );\n }\n\n if (balances.length === 0) {\n return fallbackBalance;\n }\n\n return balances;\n } catch (fallbackError) {\n const errorMessage = fallbackError instanceof Error ? fallbackError.message : String(fallbackError);\n console.error(`Tron balance fetch failed: ${errorMessage}`);\n return fallbackBalance;\n }\n }\n };\n\n const transfer = async ({ recipient, assetValue, memo, expiration }: TronTransferParams) => {\n if (!signer) throw new USwapError(\"toolbox_tron_no_signer\");\n\n const from = await getAddress();\n tronWeb.setAddress(from);\n const transaction = await createTransaction({ assetValue, expiration, memo, recipient, sender: from });\n\n const signedTx = await signer.signTransaction(transaction);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n\n if (!txid) {\n throw new USwapError(\"toolbox_tron_token_transfer_failed\");\n }\n\n return txid;\n };\n\n const estimateTransactionFee = async ({\n assetValue,\n recipient,\n sender,\n }: // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO\n TronTransferParams & { sender?: string }) => {\n const isNative = assetValue.isGasAsset;\n\n try {\n const senderAddress = sender ? sender : signer ? await getAddress() : undefined;\n if (!senderAddress) {\n return isNative\n ? AssetValue.from({ chain: Chain.Tron, fromBaseDecimal: 0, value: 0.1 })\n : AssetValue.from({ chain: Chain.Tron, fromBaseDecimal: 0, value: 15 });\n }\n\n const chainParams = await getChainParameters();\n\n const recipientExists = await accountExists(recipient);\n const activationFee = recipientExists ? 0 : chainParams.createAccountFee;\n\n const resources = await getAccountResources(senderAddress);\n\n if (isNative) {\n const bandwidthNeeded = TRX_TRANSFER_BANDWIDTH;\n const availableBandwidth = resources.bandwidth.free + (resources.bandwidth.total - resources.bandwidth.used);\n\n let bandwidthFee = 0;\n if (bandwidthNeeded > availableBandwidth) {\n const bandwidthToBuy = bandwidthNeeded - availableBandwidth;\n bandwidthFee = bandwidthToBuy * chainParams.bandwidthFee;\n }\n\n const totalFeeSun = activationFee + bandwidthFee;\n\n return AssetValue.from({ chain: Chain.Tron, fromBaseDecimal: BaseDecimal.TRON, value: totalFeeSun });\n }\n\n const bandwidthNeeded = TRC20_TRANSFER_BANDWIDTH;\n const energyNeeded = TRC20_TRANSFER_ENERGY;\n\n const availableBandwidth = resources.bandwidth.free + (resources.bandwidth.total - resources.bandwidth.used);\n const availableEnergy = resources.energy.total - resources.energy.used;\n\n let bandwidthFee = 0;\n if (bandwidthNeeded > availableBandwidth) {\n const bandwidthToBuy = bandwidthNeeded - availableBandwidth;\n bandwidthFee = bandwidthToBuy * chainParams.bandwidthFee;\n }\n\n let energyFee = 0;\n if (energyNeeded > availableEnergy) {\n const energyToBuy = energyNeeded - availableEnergy;\n energyFee = energyToBuy * chainParams.energyFee;\n }\n\n const totalFeeSun = activationFee + bandwidthFee + energyFee;\n\n return AssetValue.from({ chain: Chain.Tron, fromBaseDecimal: BaseDecimal.TRON, value: totalFeeSun });\n } catch (error) {\n warnOnce({\n condition: true,\n id: \"tron_toolbox_fee_estimation_failed\",\n warning: `Failed to calculate exact fee, using conservative estimate: ${\n error instanceof Error ? error.message : error\n }`,\n });\n\n throw new USwapError(\"toolbox_tron_fee_estimation_failed\", { error });\n }\n };\n\n const createTransaction = async (params: TronCreateTransactionParams) => {\n const { recipient, assetValue, memo, sender, expiration } = params;\n const isNative = assetValue.isGasAsset;\n\n const addTxData = async ({\n transaction,\n memo,\n expiration,\n }: {\n transaction: TronTransaction;\n memo?: string;\n expiration?: number;\n }) => {\n const transactionWithMemo = memo\n ? await tronWeb.transactionBuilder.addUpdateData(transaction, memo, \"utf8\")\n : transaction;\n\n const transactionFinal = expiration\n ? await tronWeb.transactionBuilder.extendExpiration(transactionWithMemo, expiration)\n : transactionWithMemo;\n\n return transactionFinal;\n };\n\n if (isNative) {\n const transaction = await tronWeb.transactionBuilder.sendTrx(\n recipient,\n assetValue.getBaseValue(\"number\"),\n sender,\n );\n\n const txWithData = addTxData({ expiration, memo, transaction });\n return txWithData;\n }\n\n tronWeb.setAddress(sender);\n const contractAddress = assetValue.address;\n if (!contractAddress) {\n throw new USwapError(\"toolbox_tron_invalid_token_identifier\", { identifier: assetValue.toString() });\n }\n\n try {\n const functionSelector = \"transfer(address,uint256)\";\n const parameter = [\n { type: \"address\", value: recipient },\n { type: \"uint256\", value: assetValue.getBaseValue(\"string\") },\n ];\n\n const options = { callValue: 0, feeLimit: calculateFeeLimit() };\n\n const { transaction } = await tronWeb.transactionBuilder.triggerSmartContract(\n contractAddress,\n functionSelector,\n options,\n parameter,\n sender,\n );\n\n const txWithData = addTxData({ expiration, memo, transaction });\n return txWithData;\n } catch (error) {\n throw new USwapError(\"toolbox_tron_transaction_creation_failed\", {\n message: \"Failed to create TRC20 transaction.\",\n originalError: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n const signTransaction = async (transaction: TronTransaction) => {\n if (!signer) throw new USwapError(\"toolbox_tron_no_signer\");\n return await signer.signTransaction(transaction);\n };\n\n const broadcastTransaction = async (signedTx: TronSignedTransaction) => {\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n };\n\n const getApprovedAmount = async ({ assetAddress, spenderAddress, from }: TronApprovedParams) => {\n try {\n const contract = tronWeb.contract(trc20ABI, assetAddress);\n\n if (!contract.methods?.allowance) {\n throw new USwapError(\"toolbox_tron_invalid_token_contract\");\n }\n\n const [allowance] = await contract.methods.allowance(from, spenderAddress).call();\n\n return allowance ? (typeof allowance === \"bigint\" ? allowance : BigInt(allowance)) : 0n;\n } catch (error) {\n throw new USwapError(\"toolbox_tron_allowance_check_failed\", { error });\n }\n };\n\n const isApproved = async ({ assetAddress, spenderAddress, from, amount }: TronIsApprovedParams) => {\n const allowance = await getApprovedAmount({ assetAddress, from, spenderAddress });\n\n if (!amount) {\n return allowance > 0n;\n }\n\n const amountBigInt = BigInt(amount);\n return allowance >= amountBigInt;\n };\n\n const approve = async ({ assetAddress, spenderAddress, amount, from }: TronApproveParams) => {\n if (!signer) throw new USwapError(\"toolbox_tron_no_signer\");\n\n const fromAddress = from || (await getAddress());\n const approvalAmount = amount !== undefined ? BigInt(amount).toString() : MAX_APPROVAL;\n\n const functionSelector = \"approve(address,uint256)\";\n const parameter = [\n { type: \"address\", value: spenderAddress },\n { type: \"uint256\", value: approvalAmount },\n ];\n\n const feeLimit = calculateFeeLimit();\n const options = { callValue: 0, feeLimit };\n\n try {\n const { transaction } = await tronWeb.transactionBuilder.triggerSmartContract(\n assetAddress,\n functionSelector,\n options,\n parameter,\n fromAddress,\n );\n\n const signedTx = await signer.signTransaction(transaction);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n\n if (!txid) {\n throw new USwapError(\"toolbox_tron_approve_failed\");\n }\n\n return txid;\n } catch (error) {\n throw new USwapError(\"toolbox_tron_approve_failed\", { error });\n }\n };\n\n return {\n approve,\n broadcastTransaction,\n createTransaction,\n estimateTransactionFee,\n getAddress,\n getApprovedAmount,\n getBalance,\n isApproved,\n signTransaction,\n transfer,\n tronWeb,\n validateAddress: await getTronAddressValidator(),\n };\n};\n",
|
|
8
8
|
"export { trc20ABI } from \"./helpers/trc20.abi\";\nexport {\n createTronToolbox,\n getTronAddressValidator,\n getTronPrivateKeyFromMnemonic,\n} from \"./toolbox\";\nexport type {\n TronApprovedParams,\n TronApproveParams,\n TronContract,\n TronCreateTransactionParams,\n TronIsApprovedParams,\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types\";\n\nimport type { createTronToolbox } from \"./toolbox\";\nexport type TronWallet = Awaited<ReturnType<typeof createTronToolbox>>;\n"
|
|
9
9
|
],
|
|
10
|
-
"mappings": "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",
|
|
10
|
+
"mappings": "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",
|
|
11
11
|
"debugId": "8B1B2BC1DA3EDC0964756E2164756E21",
|
|
12
12
|
"names": []
|
|
13
13
|
}
|