@swapkit/toolboxes 1.0.0-beta.23 → 1.0.0-beta.25
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/{chunk-12xtvbsp.js → chunk-6f98phv2.js} +2 -2
- package/dist/{chunk-12xtvbsp.js.map → chunk-6f98phv2.js.map} +1 -1
- package/dist/{chunk-kbnwrc5b.js → chunk-zcdeg6h9.js} +2 -2
- package/dist/{chunk-kbnwrc5b.js.map → chunk-zcdeg6h9.js.map} +1 -1
- package/dist/src/cosmos/index.cjs +2 -2
- package/dist/src/cosmos/index.cjs.map +4 -4
- package/dist/src/cosmos/index.js +2 -2
- package/dist/src/cosmos/index.js.map +4 -4
- package/dist/src/evm/index.js +2 -2
- package/dist/src/evm/index.js.map +1 -1
- package/dist/src/index.cjs +2 -2
- package/dist/src/index.cjs.map +3 -3
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +3 -3
- package/dist/src/near/index.cjs +2 -2
- package/dist/src/near/index.cjs.map +3 -3
- package/dist/src/near/index.js +2 -2
- package/dist/src/near/index.js.map +3 -3
- package/dist/src/substrate/index.cjs +2 -2
- package/dist/src/substrate/index.cjs.map +5 -4
- package/dist/src/substrate/index.js +2 -2
- package/dist/src/substrate/index.js.map +5 -4
- package/dist/src/tron/index.cjs +2 -2
- package/dist/src/tron/index.cjs.map +3 -3
- package/dist/src/tron/index.js +2 -2
- package/dist/src/tron/index.js.map +3 -3
- package/dist/src/utxo/index.cjs +4 -2
- package/dist/src/utxo/index.cjs.map +8 -7
- package/dist/src/utxo/index.js +4 -2
- package/dist/src/utxo/index.js.map +8 -7
- package/package.json +2 -2
- package/src/cosmos/toolbox/cosmos.ts +19 -5
- package/src/cosmos/util.ts +63 -0
- package/src/evm/__tests__/address-validation.test.ts +86 -0
- package/src/index.ts +1 -0
- package/src/near/toolbox.ts +22 -1
- package/src/substrate/balance.ts +92 -0
- package/src/substrate/substrate.ts +6 -4
- package/src/tron/toolbox.ts +1 -1
- package/src/utxo/__tests__/zcash-integration.test.ts +114 -0
- package/src/utxo/helpers/api.ts +36 -0
- package/src/utxo/helpers/coinselect.ts +2 -0
- package/src/utxo/index.ts +1 -0
- package/src/utxo/toolbox/index.ts +14 -3
- package/src/utxo/toolbox/utxo.ts +7 -0
- package/src/utxo/toolbox/zcash.ts +208 -0
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/substrate/substrate.ts", "../src/substrate/types.ts"],
|
|
3
|
+
"sources": ["../src/substrate/substrate.ts", "../src/substrate/balance.ts", "../src/substrate/types.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import 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 {\n decodeAddress as decodePolkadotAddress,\n encodeAddress as encodePolkadotAddress,\n} from \"@polkadot/util-crypto\";\nimport {\n AssetValue,\n Chain,\n type DerivationPathArray,\n type GenericCreateTransactionParams,\n SKConfig,\n type SubstrateChain,\n SwapKitError,\n SwapKitNumber,\n} from \"@swapkit/helpers\";\n\nimport { P, match } from \"ts-pattern\";\nimport {
|
|
5
|
+
"import 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 {\n decodeAddress as decodePolkadotAddress,\n encodeAddress as encodePolkadotAddress,\n} from \"@polkadot/util-crypto\";\nimport {\n AssetValue,\n Chain,\n type DerivationPathArray,\n type GenericCreateTransactionParams,\n SKConfig,\n type SubstrateChain,\n SwapKitError,\n SwapKitNumber,\n} from \"@swapkit/helpers\";\n\nimport { P, match } 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 ({\n generic = false,\n ...signerParams\n}: ToolboxParams = {}) => {\n const toolbox = await createSubstrateToolbox({\n chain: Chain.Chainflip,\n generic,\n ...signerParams,\n });\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 SwapKitError(\"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({ type: \"sr25519\", ss58Format: networkPrefix }).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 (_error) {\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, {\n recipient,\n assetValue,\n });\n\n const isKeyring = isKeyringPair(signer);\n\n if (!transfer) return;\n\n const address = isKeyring ? (signer as IKeyringPair).address : sender;\n if (!address) throw new SwapKitError(\"core_transaction_invalid_sender_address\");\n\n const nonce = await getNonce(api, address);\n\n const tx = await transfer.signAndSend(isKeyring ? signer : address, {\n signer: isKeyring ? undefined : signer,\n nonce,\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, { recipient, assetValue });\n\n const address = isKeyringPair(signer) ? signer.address : sender;\n if (!address) return;\n\n const paymentInfo = (await transfer?.paymentInfo(address, {\n nonce: await getNonce(api, address),\n })) || { partialFee: 0 };\n return gasAsset.set(\n SwapKitNumber.fromBigInt(BigInt(paymentInfo.partialFee.toString()), gasAsset.decimal).getValue(\n \"string\",\n ),\n );\n};\n\nconst broadcast = async (\n tx: SubmittableExtrinsic<\"promise\">,\n callback?: Callback<ISubmittableResult>,\n) => {\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)\n ? hexToU8a(address)\n : decodePolkadotAddress(address, undefined, networkPrefix);\n}\n\nfunction encodeAddress(\n address: Uint8Array,\n encoding: \"ss58\" | \"hex\" = \"ss58\",\n networkPrefix?: number,\n) {\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 network,\n gasAsset,\n decodeAddress,\n encodeAddress,\n convertAddress,\n getBalance: createBalanceGetter(chain || Chain.Polkadot, api),\n createKeyring: (phrase: string) => createKeyring(phrase, network.prefix),\n getAddress: (keyring?: IKeyringPair | Signer) => {\n const keyringPair = keyring || signer;\n if (!keyringPair) throw new SwapKitError(\"core_wallet_not_keypair_wallet\");\n\n return isKeyringPair(keyringPair) ? keyringPair.address : undefined;\n },\n createTransaction: (params: GenericCreateTransactionParams) => createTransaction(api, params),\n validateAddress: (address: string) => validateAddress(address, network.prefix),\n transfer: (params: SubstrateTransferParams) => {\n if (!signer) throw new SwapKitError(\"core_wallet_not_keypair_wallet\");\n return transfer(api, signer, params);\n },\n estimateTransactionFee: (params: SubstrateTransferParams) => {\n if (!signer) throw new SwapKitError(\"core_wallet_not_keypair_wallet\");\n return estimateTransactionFee(api, signer, gasAsset, params);\n },\n sign: (tx: SubmittableExtrinsic<\"promise\">) => {\n if (!signer) throw new SwapKitError(\"core_wallet_not_keypair_wallet\");\n if (isKeyringPair(signer)) return sign(signer, tx);\n\n throw new SwapKitError(\n \"core_wallet_not_keypair_wallet\",\n \"Signer does not have keyring pair capabilities required for signing.\",\n );\n },\n broadcast,\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 SwapKitError(\"core_wallet_not_keypair_wallet\");\n if (isKeyringPair(signer)) return signAndBroadcastKeyring(signer, tx, callback);\n\n if (address) {\n return signAndBroadcast({ signer, address, tx, callback, api });\n }\n\n throw new SwapKitError(\n \"core_wallet_not_keypair_wallet\",\n \"Signer does not have keyring pair capabilities required for signing.\",\n );\n },\n});\n\nexport const substrateValidateAddress = ({\n address,\n chain,\n}: { address: string; chain: Chain.Polkadot | Chain.Chainflip }) => {\n const { prefix } = chain === Chain.Polkadot ? SubstrateNetwork.DOT : SubstrateNetwork.FLIP;\n\n return (\n validateAddress(address, prefix) || validateAddress(address, SubstrateNetwork.GENERIC.prefix)\n );\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 provider = new WsProvider(SKConfig.get(\"rpcUrls\")[chain]);\n const api = await ApiPromise.create({ 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 }) =>\n createKeyring(phrase, SubstrateNetwork[chain].prefix),\n )\n .with({ signer: P.any }, ({ signer }) => signer)\n .otherwise(() => undefined);\n\n return BaseSubstrateToolbox({ api, signer, gasAsset, network, chain });\n}\n\nexport type ToolboxParams = {\n generic?: boolean;\n} & (\n | {\n signer?: KeyringPair | Signer;\n }\n | {\n phrase?: string;\n derivationPath?: DerivationPathArray;\n index?: number;\n }\n);\n",
|
|
6
|
+
"import type { ApiPromise } from \"@polkadot/api\";\nimport { AssetValue, Chain, SwapKitNumber } from \"@swapkit/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 SwapKitNumber for proper decimal handling\n const freeBalance = SwapKitNumber.fromBigInt(\n BigInt(free.toString()),\n gasAsset.decimal,\n ).getValue(\"string\");\n\n return [gasAsset.set(freeBalance)];\n } catch (error) {\n console.error(\"Error fetching substrate balance:\", error);\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 SwapKitNumber\n const balanceStr = SwapKitNumber.fromBigInt(\n BigInt(balance.toString()),\n gasAsset.decimal,\n ).getValue(\"string\");\n\n return [gasAsset.set(balanceStr)];\n } catch (error) {\n console.error(\"Error fetching chainflip balance:\", error);\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
7
|
"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 \"@swapkit/helpers\";\n\nconst polkadotNetwork = {\n prefix: 0,\n network: \"polkadot\",\n displayName: \"Polkadot Relay Chain\",\n symbols: [\"DOT\"],\n decimals: [10],\n standardAccount: \"*25519\",\n website: \"https://polkadot.network\",\n};\n\nconst chainflipNetwork = {\n prefix: 2112,\n network: \"chainflip\",\n displayName: \"Chainflip\",\n symbols: [\"FLIP\"],\n decimals: [18],\n standardAccount: \"*25519\",\n website: \"https://chainflip.io/\",\n};\n\nconst subtrateNetwork = {\n prefix: 42,\n network: \"substrate\",\n displayName: \"Substrate\",\n symbols: [],\n decimals: [],\n standardAccount: \"*25519\",\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 =\n | typeof polkadotNetwork\n | typeof chainflipNetwork\n | typeof subtrateNetwork;\n\nexport type SubstrateTransferParams = GenericTransferParams & {\n sender?: string;\n};\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
8
|
],
|
|
8
|
-
"mappings": "iQAI0C,IAA1C,4BACA,mCAIA,8BAWA,
|
|
9
|
-
"debugId": "
|
|
9
|
+
"mappings": "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",
|
|
10
|
+
"debugId": "352CF3811C22866964756E2164756E21",
|
|
10
11
|
"names": []
|
|
11
12
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{d as y,e as f}from"../../chunk-s47y8512.js";import{hexToU8a as M,isHex as F,u8aToHex as G}from"@polkadot/util";import{decodeAddress as k,encodeAddress as I}from"@polkadot/util-crypto";import{AssetValue as B,Chain as l,SKConfig as V,SwapKitError as c,SwapKitNumber as L}from"@swapkit/helpers";import{P as S,match as U}from"ts-pattern";import{AssetValue as A,Chain as E,SwapKitNumber as x}from"@swapkit/helpers";async function K(t,e,n){try{let r=await t.query.system?.account?.(n);if(!r)return[e.set(0)];let{data:{free:i}}=r,o=x.fromBigInt(BigInt(i.toString()),e.decimal).getValue("string");return[e.set(o)]}catch(r){return console.error("Error fetching substrate balance:",r),[e.set(0)]}}async function j(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=x.fromBigInt(BigInt(i.toString()),e.decimal).getValue("string");return[e.set(o)]}catch(r){return console.error("Error fetching chainflip balance:",r),[e.set(0)]}}function h(t,e){return function n(r){let i=A.from({chain:t});switch(t){case E.Chainflip:return j(e,i,r);default:return K(e,i,r)}}}var N={prefix:0,network:"polkadot",displayName:"Polkadot Relay Chain",symbols:["DOT"],decimals:[10],standardAccount:"*25519",website:"https://polkadot.network"},R={prefix:2112,network:"chainflip",displayName:"Chainflip",symbols:["FLIP"],decimals:[18],standardAccount:"*25519",website:"https://chainflip.io/"},D={prefix:42,network:"substrate",displayName:"Substrate",symbols:[],decimals:[],standardAccount:"*25519",website:"https://substrate.io/"},d={DOT:N,FLIP:R,GENERIC:D};var H=({generic:t=!1,...e}={})=>{return C({chain:l.Polkadot,generic:t,...e})},W=async({generic:t=!1,...e}={})=>{return{...await C({chain:l.Chainflip,generic:t,...e})}};function ce(t,e){switch(t){case l.Chainflip:return W(e);case l.Polkadot:return H(e);default:throw new c("toolbox_substrate_not_supported",{chain:t})}}function u(t){return"address"in t}async function T(t,e){let{Keyring:n}=await import("@polkadot/api"),{cryptoWaitReady:r}=await import("@polkadot/util-crypto");return await r(),new n({type:"sr25519",ss58Format:e}).addFromUri(t)}var g=(t,e)=>t.rpc.system.accountNextIndex(e),b=(t,e)=>{try{let n=_(t,e);return v(n,"ss58",e),!0}catch(n){return!1}},w=(t,{recipient:e,assetValue:n})=>t.tx.balances?.transferAllowDeath?.(e,n.getBaseValue("number")),O=async(t,e,{recipient:n,assetValue:r,sender:i})=>{let o=w(t,{recipient:n,assetValue:r}),a=u(e);if(!o)return;let s=a?e.address:i;if(!s)throw new c("core_transaction_invalid_sender_address");let p=await g(t,s);return(await o.signAndSend(a?e:s,{signer:a?void 0:e,nonce:p}))?.toString()},q=async(t,e,n,{recipient:r,assetValue:i,sender:o})=>{let a=w(t,{recipient:r,assetValue:i}),s=u(e)?e.address:o;if(!s)return;let p=await a?.paymentInfo(s,{nonce:await g(t,s)})||{partialFee:0};return n.set(L.fromBigInt(BigInt(p.partialFee.toString()),n.decimal).getValue("string"))},z=async(t,e)=>{if(e)return t.send(e);return(await t.send()).toString()},J=async(t,e)=>{return await e.signAsync(t)},Q=(t,e,n)=>{if(n)return e.signAndSend(t,n);return e.signAndSend(t).toString()},X=async({signer:t,address:e,tx:n,callback:r,api:i})=>{let o=await g(i,e);if(r)n.signAndSend(e,{nonce:o,signer:t},r);return n.signAndSend(e,{nonce:o,signer:t}).toString()};function Y(t,e){let n=k(t);return I(n,e)}function _(t,e){return F(t)?M(t):k(t,void 0,e)}function v(t,e="ss58",n){if(e==="hex")return G(t);return I(t,n)}var Z=({api:t,network:e,gasAsset:n,signer:r,chain:i})=>({api:t,network:e,gasAsset:n,decodeAddress:_,encodeAddress:v,convertAddress:Y,getBalance:h(i||l.Polkadot,t),createKeyring:(o)=>T(o,e.prefix),getAddress:(o)=>{let a=o||r;if(!a)throw new c("core_wallet_not_keypair_wallet");return u(a)?a.address:void 0},createTransaction:(o)=>w(t,o),validateAddress:(o)=>b(o,e.prefix),transfer:(o)=>{if(!r)throw new c("core_wallet_not_keypair_wallet");return O(t,r,o)},estimateTransactionFee:(o)=>{if(!r)throw new c("core_wallet_not_keypair_wallet");return q(t,r,n,o)},sign:(o)=>{if(!r)throw new c("core_wallet_not_keypair_wallet");if(u(r))return J(r,o);throw new c("core_wallet_not_keypair_wallet","Signer does not have keyring pair capabilities required for signing.")},broadcast:z,signAndBroadcast:({tx:o,callback:a,address:s})=>{if(!r)throw new c("core_wallet_not_keypair_wallet");if(u(r))return Q(r,o,a);if(s)return X({signer:r,address:s,tx:o,callback:a,api:t});throw new c("core_wallet_not_keypair_wallet","Signer does not have keyring pair capabilities required for signing.")}}),de=({address:t,chain:e})=>{let{prefix:n}=e===l.Polkadot?d.DOT:d.FLIP;return b(t,n)||b(t,d.GENERIC.prefix)};async function C({generic:t,chain:e,...n}){let{ApiPromise:r,WsProvider:i}=await import("@polkadot/api"),o=new i(V.get("rpcUrls")[e]),a=await r.create({provider:o}),s=B.from({chain:e}),p=t?d.GENERIC:d[e],P=await U(n).with({phrase:S.string},({phrase:m})=>T(m,d[e].prefix)).with({signer:S.any},({signer:m})=>m).otherwise(()=>{return});return Z({api:a,signer:P,gasAsset:s,network:p,chain:e})}export{de as substrateValidateAddress,u as isKeyringPair,ce as getSubstrateToolbox,C as createSubstrateToolbox,T as createKeyring,d as SubstrateNetwork,H as PolkadotToolbox,W as ChainflipToolbox,Z as BaseSubstrateToolbox};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=D388955C3698ABE764756E2164756E21
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/substrate/substrate.ts", "../src/substrate/types.ts"],
|
|
3
|
+
"sources": ["../src/substrate/substrate.ts", "../src/substrate/balance.ts", "../src/substrate/types.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import 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 {\n decodeAddress as decodePolkadotAddress,\n encodeAddress as encodePolkadotAddress,\n} from \"@polkadot/util-crypto\";\nimport {\n AssetValue,\n Chain,\n type DerivationPathArray,\n type GenericCreateTransactionParams,\n SKConfig,\n type SubstrateChain,\n SwapKitError,\n SwapKitNumber,\n} from \"@swapkit/helpers\";\n\nimport { P, match } from \"ts-pattern\";\nimport {
|
|
5
|
+
"import 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 {\n decodeAddress as decodePolkadotAddress,\n encodeAddress as encodePolkadotAddress,\n} from \"@polkadot/util-crypto\";\nimport {\n AssetValue,\n Chain,\n type DerivationPathArray,\n type GenericCreateTransactionParams,\n SKConfig,\n type SubstrateChain,\n SwapKitError,\n SwapKitNumber,\n} from \"@swapkit/helpers\";\n\nimport { P, match } 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 ({\n generic = false,\n ...signerParams\n}: ToolboxParams = {}) => {\n const toolbox = await createSubstrateToolbox({\n chain: Chain.Chainflip,\n generic,\n ...signerParams,\n });\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 SwapKitError(\"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({ type: \"sr25519\", ss58Format: networkPrefix }).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 (_error) {\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, {\n recipient,\n assetValue,\n });\n\n const isKeyring = isKeyringPair(signer);\n\n if (!transfer) return;\n\n const address = isKeyring ? (signer as IKeyringPair).address : sender;\n if (!address) throw new SwapKitError(\"core_transaction_invalid_sender_address\");\n\n const nonce = await getNonce(api, address);\n\n const tx = await transfer.signAndSend(isKeyring ? signer : address, {\n signer: isKeyring ? undefined : signer,\n nonce,\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, { recipient, assetValue });\n\n const address = isKeyringPair(signer) ? signer.address : sender;\n if (!address) return;\n\n const paymentInfo = (await transfer?.paymentInfo(address, {\n nonce: await getNonce(api, address),\n })) || { partialFee: 0 };\n return gasAsset.set(\n SwapKitNumber.fromBigInt(BigInt(paymentInfo.partialFee.toString()), gasAsset.decimal).getValue(\n \"string\",\n ),\n );\n};\n\nconst broadcast = async (\n tx: SubmittableExtrinsic<\"promise\">,\n callback?: Callback<ISubmittableResult>,\n) => {\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)\n ? hexToU8a(address)\n : decodePolkadotAddress(address, undefined, networkPrefix);\n}\n\nfunction encodeAddress(\n address: Uint8Array,\n encoding: \"ss58\" | \"hex\" = \"ss58\",\n networkPrefix?: number,\n) {\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 network,\n gasAsset,\n decodeAddress,\n encodeAddress,\n convertAddress,\n getBalance: createBalanceGetter(chain || Chain.Polkadot, api),\n createKeyring: (phrase: string) => createKeyring(phrase, network.prefix),\n getAddress: (keyring?: IKeyringPair | Signer) => {\n const keyringPair = keyring || signer;\n if (!keyringPair) throw new SwapKitError(\"core_wallet_not_keypair_wallet\");\n\n return isKeyringPair(keyringPair) ? keyringPair.address : undefined;\n },\n createTransaction: (params: GenericCreateTransactionParams) => createTransaction(api, params),\n validateAddress: (address: string) => validateAddress(address, network.prefix),\n transfer: (params: SubstrateTransferParams) => {\n if (!signer) throw new SwapKitError(\"core_wallet_not_keypair_wallet\");\n return transfer(api, signer, params);\n },\n estimateTransactionFee: (params: SubstrateTransferParams) => {\n if (!signer) throw new SwapKitError(\"core_wallet_not_keypair_wallet\");\n return estimateTransactionFee(api, signer, gasAsset, params);\n },\n sign: (tx: SubmittableExtrinsic<\"promise\">) => {\n if (!signer) throw new SwapKitError(\"core_wallet_not_keypair_wallet\");\n if (isKeyringPair(signer)) return sign(signer, tx);\n\n throw new SwapKitError(\n \"core_wallet_not_keypair_wallet\",\n \"Signer does not have keyring pair capabilities required for signing.\",\n );\n },\n broadcast,\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 SwapKitError(\"core_wallet_not_keypair_wallet\");\n if (isKeyringPair(signer)) return signAndBroadcastKeyring(signer, tx, callback);\n\n if (address) {\n return signAndBroadcast({ signer, address, tx, callback, api });\n }\n\n throw new SwapKitError(\n \"core_wallet_not_keypair_wallet\",\n \"Signer does not have keyring pair capabilities required for signing.\",\n );\n },\n});\n\nexport const substrateValidateAddress = ({\n address,\n chain,\n}: { address: string; chain: Chain.Polkadot | Chain.Chainflip }) => {\n const { prefix } = chain === Chain.Polkadot ? SubstrateNetwork.DOT : SubstrateNetwork.FLIP;\n\n return (\n validateAddress(address, prefix) || validateAddress(address, SubstrateNetwork.GENERIC.prefix)\n );\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 provider = new WsProvider(SKConfig.get(\"rpcUrls\")[chain]);\n const api = await ApiPromise.create({ 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 }) =>\n createKeyring(phrase, SubstrateNetwork[chain].prefix),\n )\n .with({ signer: P.any }, ({ signer }) => signer)\n .otherwise(() => undefined);\n\n return BaseSubstrateToolbox({ api, signer, gasAsset, network, chain });\n}\n\nexport type ToolboxParams = {\n generic?: boolean;\n} & (\n | {\n signer?: KeyringPair | Signer;\n }\n | {\n phrase?: string;\n derivationPath?: DerivationPathArray;\n index?: number;\n }\n);\n",
|
|
6
|
+
"import type { ApiPromise } from \"@polkadot/api\";\nimport { AssetValue, Chain, SwapKitNumber } from \"@swapkit/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 SwapKitNumber for proper decimal handling\n const freeBalance = SwapKitNumber.fromBigInt(\n BigInt(free.toString()),\n gasAsset.decimal,\n ).getValue(\"string\");\n\n return [gasAsset.set(freeBalance)];\n } catch (error) {\n console.error(\"Error fetching substrate balance:\", error);\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 SwapKitNumber\n const balanceStr = SwapKitNumber.fromBigInt(\n BigInt(balance.toString()),\n gasAsset.decimal,\n ).getValue(\"string\");\n\n return [gasAsset.set(balanceStr)];\n } catch (error) {\n console.error(\"Error fetching chainflip balance:\", error);\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
7
|
"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 \"@swapkit/helpers\";\n\nconst polkadotNetwork = {\n prefix: 0,\n network: \"polkadot\",\n displayName: \"Polkadot Relay Chain\",\n symbols: [\"DOT\"],\n decimals: [10],\n standardAccount: \"*25519\",\n website: \"https://polkadot.network\",\n};\n\nconst chainflipNetwork = {\n prefix: 2112,\n network: \"chainflip\",\n displayName: \"Chainflip\",\n symbols: [\"FLIP\"],\n decimals: [18],\n standardAccount: \"*25519\",\n website: \"https://chainflip.io/\",\n};\n\nconst subtrateNetwork = {\n prefix: 42,\n network: \"substrate\",\n displayName: \"Substrate\",\n symbols: [],\n decimals: [],\n standardAccount: \"*25519\",\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 =\n | typeof polkadotNetwork\n | typeof chainflipNetwork\n | typeof subtrateNetwork;\n\nexport type SubstrateTransferParams = GenericTransferParams & {\n sender?: string;\n};\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
8
|
],
|
|
8
|
-
"mappings": "
|
|
9
|
-
"debugId": "
|
|
9
|
+
"mappings": "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",
|
|
10
|
+
"debugId": "D388955C3698ABE764756E2164756E21",
|
|
10
11
|
"names": []
|
|
11
12
|
}
|
package/dist/src/tron/index.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var V={};b(V,{trc20ABI:()=>H,getTronPrivateKeyFromMnemonic:()=>A,getTronAddressValidator:()=>x,createTronToolbox:()=>C});module.exports=W(V);var y=require("@swapkit/helpers"),Z=require("ts-pattern");var H=[{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],type:"function"},{constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[{name:"success",type:"bool"}],type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint8"}],type:"function"},{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],type:"function"},{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],type:"function"}];async function x(){let{TronWeb:z}=require("tronweb");return(R)=>{return z.isAddress(R)}}async function A({phrase:z,derivationPath:R,index:
|
|
1
|
+
var V={};b(V,{trc20ABI:()=>H,getTronPrivateKeyFromMnemonic:()=>A,getTronAddressValidator:()=>x,createTronToolbox:()=>C});module.exports=W(V);var y=require("@swapkit/helpers"),Z=require("ts-pattern");var H=[{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],type:"function"},{constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[{name:"success",type:"bool"}],type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint8"}],type:"function"},{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],type:"function"},{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],type:"function"}];async function x(){let{TronWeb:z}=require("tronweb");return(R)=>{return z.isAddress(R)}}async function A({phrase:z,derivationPath:R,index:X}){let $=R||y.derivationPathToString(y.updateDerivationPath(y.NetworkDerivationPath[y.Chain.Tron],{index:X||0})),{HDKey:_}=await import("@scure/bip32"),{mnemonicToSeedSync:Y}=await import("@scure/bip39"),j=Y(z),O=_.fromMasterSeed(j).derive($);if(!O.privateKey)throw new y.SwapKitError("toolbox_tron_no_signer");return Buffer.from(O.privateKey).toString("hex")}async function S({phrase:z,derivationPath:R}){let{HDKey:X}=await import("@scure/bip32"),{mnemonicToSeedSync:$}=await import("@scure/bip39"),{TronWeb:_}=require("tronweb"),Y=$(z),J=X.fromMasterSeed(Y).derive(R);if(!J.privateKey)throw new y.SwapKitError("toolbox_tron_no_signer");let O=Buffer.from(J.privateKey).toString("hex"),I=new _({fullHost:y.SKConfig.get("rpcUrls")[y.Chain.Tron],privateKey:O}),L=I.address.fromPrivateKey(O);return{getAddress:()=>Promise.resolve(typeof L==="string"?L:""),signTransaction:async(k)=>{return await I.trx.sign(k,O)}}}var C=async(z={})=>{let{TronWeb:R}=await import("tronweb"),X=y.SKConfig.get("rpcUrls")[y.Chain.Tron],$=void 0,_=new R({fullHost:X,headers:void 0}),Y="index"in z?z.index||0:0,j=y.derivationPathToString("derivationPath"in z&&z.derivationPath?z.derivationPath:y.updateDerivationPath(y.NetworkDerivationPath[y.Chain.Tron],{index:Y})),J=await Z.match(z).with({phrase:Z.P.string},async({phrase:f})=>S({phrase:f,derivationPath:j})).with({signer:Z.P.any},({signer:f})=>Promise.resolve(f)).otherwise(()=>Promise.resolve(void 0)),O=async()=>{if(!J)throw new y.SwapKitError("toolbox_tron_no_signer");return await J.getAddress()},I=()=>{return 1e8},L=async(f,q=!0)=>{let{getBalance:Q}=await import("../../chunk-5yxc1e69.js");try{let G=await Q(y.Chain.Tron)(f,q);if(G.length>0)return G;let M=await _.trx.getBalance(f);return[y.AssetValue.from({chain:y.Chain.Tron,value:M,fromBaseDecimal:6})]}catch(G){y.warnOnce(!0,`Failed to get Tron balance for ${f}: ${G instanceof Error?G.message:G}`);try{let M=await _.trx.getBalance(f);return[y.AssetValue.from({chain:y.Chain.Tron,value:M,fromBaseDecimal:6})]}catch(M){return y.warnOnce(!0,`Failed to get native TRX balance for ${f}: ${M instanceof Error?M.message:M}`),[]}}},k=async({recipient:f,assetValue:q,memo:Q})=>{if(!J)throw new y.SwapKitError("toolbox_tron_no_signer");let G=await O();if(q.isGasAsset){let D=await _.transactionBuilder.sendTrx(f,q.getBaseValue("number"),G);if(Q){let p=await _.transactionBuilder.addUpdateData(D,Q,"utf8"),K=await J.signTransaction(p),{txid:g}=await _.trx.sendRawTransaction(K);return g}let F=await J.signTransaction(D),{txid:w}=await _.trx.sendRawTransaction(F);return w}let B=q.address;if(!B)throw new y.SwapKitError("toolbox_tron_invalid_token_identifier",{identifier:q.toString()});let N=I(),U=await _.contract(H,B);if(!U.methods?.transfer)throw new y.SwapKitError("toolbox_tron_token_transfer_failed");let u=await U.methods.transfer(f,q.getBaseValue("string")).send({from:G,feeLimit:N,callValue:0});if(!u)throw new y.SwapKitError("toolbox_tron_token_transfer_failed");return u},m=({assetValue:f})=>{if(f.isGasAsset)return y.AssetValue.from({chain:y.Chain.Tron,value:1});return y.AssetValue.from({chain:y.Chain.Tron,value:10})},E=async(f)=>{let{recipient:q,assetValue:Q,memo:G}=f,M=await O();if(Q.isGasAsset){let F=await _.transactionBuilder.sendTrx(q,Q.getBaseValue("number"),M);if(G)return _.transactionBuilder.addUpdateData(F,G,"utf8");return F}let N=Q.address;if(!N)throw new y.SwapKitError("toolbox_tron_invalid_token_identifier",{identifier:Q.toString()});let U="transfer(address,uint256)",u=[{type:"address",value:q},{type:"uint256",value:Q.getBaseValue("string")}];return(await _.transactionBuilder.triggerSmartContract(N,U,{},u,M)).transaction},P=async(f)=>{if(!J)throw new y.SwapKitError("toolbox_tron_no_signer");return await J.signTransaction(f)},v=async(f)=>{let{txid:q}=await _.trx.sendRawTransaction(f);return q};return{tronWeb:_,getAddress:O,validateAddress:await x(),getBalance:L,transfer:k,estimateTransactionFee:m,createTransaction:E,signTransaction:P,broadcastTransaction:v}};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=E91951AC6B051F7064756E2164756E21
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/tron/toolbox.ts", "../src/tron/helpers/trc20.abi.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import {\n AssetValue,\n Chain,\n NetworkDerivationPath,\n SKConfig,\n SwapKitError,\n derivationPathToString,\n updateDerivationPath,\n warnOnce,\n} from \"@swapkit/helpers\";\nimport { P, match } from \"ts-pattern\";\n\nimport { trc20ABI } from \"./helpers/trc20.abi.js\";\nimport type {\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types.js\";\n\nexport async function getTronAddressValidator() {\n const { TronWeb } = require(\"tronweb\");\n\n return (address: string) => {\n return TronWeb.isAddress(address);\n };\n}\n\nexport async function getTronPrivateKeyFromMnemonic({\n phrase,\n derivationPath: customPath,\n index,\n}: {\n phrase: string;\n derivationPath?: string;\n index?: number;\n}) {\n const derivationPathToUse =\n customPath ||\n derivationPathToString(\n updateDerivationPath(NetworkDerivationPath[Chain.Tron], { index: index || 0 }),\n );\n\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPathToUse);\n\n if (!derived.privateKey) {\n throw new SwapKitError(\"toolbox_tron_no_signer\");\n }\n\n return Buffer.from(derived.privateKey).toString(\"hex\");\n}\n\nasync function createKeysForPath({\n phrase,\n derivationPath,\n}: {\n phrase: string;\n derivationPath: string;\n}) {\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n const { TronWeb } = require(\"tronweb\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPath);\n\n if (!derived.privateKey) {\n throw new SwapKitError(\"toolbox_tron_no_signer\");\n }\n\n // Convert private key to hex string for TronWeb\n const privateKeyHex = Buffer.from(derived.privateKey).toString(\"hex\");\n\n // Create TronWeb instance with the derived private key\n const tronWebWithKey = new TronWeb({\n fullHost: SKConfig.get(\"rpcUrls\")[Chain.Tron],\n privateKey: privateKeyHex,\n });\n\n const address = tronWebWithKey.address.fromPrivateKey(privateKeyHex);\n\n return {\n getAddress: () => Promise.resolve(typeof address === \"string\" ? address : \"\"),\n signTransaction: async (transaction: TronTransaction) => {\n const signedTx = await tronWebWithKey.trx.sign(transaction, privateKeyHex);\n return signedTx;\n },\n };\n}\n\nexport const createTronToolbox = async (options: TronToolboxOptions = {}) => {\n const { TronWeb } =
|
|
5
|
+
"import {\n AssetValue,\n Chain,\n NetworkDerivationPath,\n SKConfig,\n SwapKitError,\n derivationPathToString,\n updateDerivationPath,\n warnOnce,\n} from \"@swapkit/helpers\";\nimport { P, match } from \"ts-pattern\";\n\nimport { trc20ABI } from \"./helpers/trc20.abi.js\";\nimport type {\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types.js\";\n\nexport async function getTronAddressValidator() {\n const { TronWeb } = require(\"tronweb\");\n\n return (address: string) => {\n return TronWeb.isAddress(address);\n };\n}\n\nexport async function getTronPrivateKeyFromMnemonic({\n phrase,\n derivationPath: customPath,\n index,\n}: {\n phrase: string;\n derivationPath?: string;\n index?: number;\n}) {\n const derivationPathToUse =\n customPath ||\n derivationPathToString(\n updateDerivationPath(NetworkDerivationPath[Chain.Tron], { index: index || 0 }),\n );\n\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPathToUse);\n\n if (!derived.privateKey) {\n throw new SwapKitError(\"toolbox_tron_no_signer\");\n }\n\n return Buffer.from(derived.privateKey).toString(\"hex\");\n}\n\nasync function createKeysForPath({\n phrase,\n derivationPath,\n}: {\n phrase: string;\n derivationPath: string;\n}) {\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n const { TronWeb } = require(\"tronweb\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPath);\n\n if (!derived.privateKey) {\n throw new SwapKitError(\"toolbox_tron_no_signer\");\n }\n\n // Convert private key to hex string for TronWeb\n const privateKeyHex = Buffer.from(derived.privateKey).toString(\"hex\");\n\n // Create TronWeb instance with the derived private key\n const tronWebWithKey = new TronWeb({\n fullHost: SKConfig.get(\"rpcUrls\")[Chain.Tron],\n privateKey: privateKeyHex,\n });\n\n const address = tronWebWithKey.address.fromPrivateKey(privateKeyHex);\n\n return {\n getAddress: () => Promise.resolve(typeof address === \"string\" ? address : \"\"),\n signTransaction: async (transaction: TronTransaction) => {\n const signedTx = await tronWebWithKey.trx.sign(transaction, privateKeyHex);\n return signedTx;\n },\n };\n}\n\nexport const createTronToolbox = async (options: TronToolboxOptions = {}) => {\n const { TronWeb } = await import(\"tronweb\");\n // Always get configuration from SKConfig\n const rpcUrl = SKConfig.get(\"rpcUrls\")[Chain.Tron];\n // Note: TRON API key support can be added to SKConfig apiKeys when needed\n const headers = undefined; // No API key needed for basic TronGrid access\n\n const tronWeb = new TronWeb({\n fullHost: rpcUrl,\n headers,\n });\n\n // Handle derivation path and index\n const index = \"index\" in options ? options.index || 0 : 0;\n const derivationPath = derivationPathToString(\n \"derivationPath\" in options && options.derivationPath\n ? options.derivationPath\n : updateDerivationPath(NetworkDerivationPath[Chain.Tron], { index }),\n );\n\n // Create signer based on options using pattern matching\n const signer: TronSigner | undefined = await match(options)\n .with({ phrase: P.string }, async ({ phrase }) => createKeysForPath({ phrase, derivationPath }))\n .with({ signer: P.any }, ({ signer }) => Promise.resolve(signer as TronSigner))\n .otherwise(() => Promise.resolve(undefined));\n\n const getAddress = async () => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n return await signer.getAddress();\n };\n\n const calculateFeeLimit = () => {\n return 100_000_000; // 100 TRX in SUN\n };\n\n const getBalance = async (address: string, scamFilter = true) => {\n const { getBalance: getBalanceFromApi } = await import(\"../utils.js\");\n\n try {\n // Use SwapKit API for comprehensive balance fetching (includes TRX + TRC20 tokens)\n const apiBalances = await getBalanceFromApi(Chain.Tron)(address, scamFilter);\n\n // If API returns balances, use those\n if (apiBalances.length > 0) {\n return apiBalances;\n }\n\n // Fallback to on-chain TRX balance if API fails or returns empty\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n return [\n AssetValue.from({\n chain: Chain.Tron,\n value: trxBalanceInSun,\n fromBaseDecimal: 6, // TRX has 6 decimals\n }),\n ];\n } catch (error) {\n warnOnce(\n true,\n `Failed to get Tron balance for ${address}: ${error instanceof Error ? error.message : error}`,\n );\n\n // Final fallback: try to get just the native TRX balance\n try {\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n return [\n AssetValue.from({\n chain: Chain.Tron,\n value: trxBalanceInSun,\n fromBaseDecimal: 6,\n }),\n ];\n } catch (fallbackError) {\n warnOnce(\n true,\n `Failed to get native TRX balance for ${address}: ${fallbackError instanceof Error ? fallbackError.message : fallbackError}`,\n );\n return [];\n }\n }\n };\n\n const transfer = async ({ recipient, assetValue, memo }: TronTransferParams) => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n\n const from = await getAddress();\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n // Native TRX Transfer (amount in SUN - base units)\n const transaction = await tronWeb.transactionBuilder.sendTrx(\n recipient,\n assetValue.getBaseValue(\"number\"),\n from,\n );\n\n // Add memo if provided\n if (memo) {\n const transactionWithMemo = await tronWeb.transactionBuilder.addUpdateData(\n transaction,\n memo,\n \"utf8\",\n );\n const signedTx = await signer.signTransaction(transactionWithMemo);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n }\n\n const signedTx = await signer.signTransaction(transaction);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n }\n\n // TRC20 Token Transfer\n const contractAddress = assetValue.address;\n if (!contractAddress) {\n throw new SwapKitError(\"toolbox_tron_invalid_token_identifier\", {\n identifier: assetValue.toString(),\n });\n }\n\n const feeLimit = calculateFeeLimit();\n const contract = await tronWeb.contract(trc20ABI, contractAddress);\n\n if (!contract.methods?.transfer) {\n throw new SwapKitError(\"toolbox_tron_token_transfer_failed\");\n }\n\n const txid = await contract.methods\n .transfer(recipient, assetValue.getBaseValue(\"string\"))\n .send({\n from,\n feeLimit,\n callValue: 0,\n });\n\n if (!txid) {\n throw new SwapKitError(\"toolbox_tron_token_transfer_failed\");\n }\n\n return txid;\n };\n\n const estimateTransactionFee = ({ assetValue }: TronTransferParams) => {\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n // Native TRX transfers typically consume bandwidth, which is free up to daily limit\n // Return a minimal fee estimation for bandwidth cost\n return AssetValue.from({ chain: Chain.Tron, value: 1 }); // 1 TRX\n }\n\n // TRC20 transfers consume energy, estimate higher fee\n return AssetValue.from({ chain: Chain.Tron, value: 10 }); // 10 TRX\n };\n\n const createTransaction = async (params: TronTransferParams) => {\n const { recipient, assetValue, memo } = params;\n const from = await getAddress();\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n const transaction = await tronWeb.transactionBuilder.sendTrx(\n recipient,\n assetValue.getBaseValue(\"number\"),\n from,\n );\n\n if (memo) {\n return tronWeb.transactionBuilder.addUpdateData(transaction, memo, \"utf8\");\n }\n\n return transaction;\n }\n\n // For TRC20, we would need to build the transaction manually\n // This is a simplified version - in practice, you'd build the contract call transaction\n const contractAddress = assetValue.address;\n if (!contractAddress) {\n throw new SwapKitError(\"toolbox_tron_invalid_token_identifier\", {\n identifier: assetValue.toString(),\n });\n }\n\n // Build TRC20 transfer transaction\n const functionSelector = \"transfer(address,uint256)\";\n const parameter = [\n { type: \"address\", value: recipient },\n { type: \"uint256\", value: assetValue.getBaseValue(\"string\") },\n ];\n\n const result = await tronWeb.transactionBuilder.triggerSmartContract(\n contractAddress,\n functionSelector,\n {},\n parameter,\n from,\n );\n\n return result.transaction;\n };\n\n const signTransaction = async (transaction: TronTransaction) => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n return await signer.signTransaction(transaction);\n };\n\n const broadcastTransaction = async (signedTx: TronSignedTransaction) => {\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n };\n\n return {\n tronWeb,\n getAddress,\n validateAddress: await getTronAddressValidator(),\n getBalance,\n transfer,\n estimateTransactionFee,\n createTransaction,\n signTransaction,\n broadcastTransaction,\n };\n};\n",
|
|
6
6
|
"export const trc20ABI = [\n {\n constant: true,\n inputs: [{ name: \"_owner\", type: \"address\" }],\n name: \"balanceOf\",\n outputs: [{ name: \"balance\", type: \"uint256\" }],\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n { name: \"_to\", type: \"address\" },\n { name: \"_value\", type: \"uint256\" },\n ],\n name: \"transfer\",\n outputs: [{ name: \"success\", type: \"bool\" }],\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"decimals\",\n outputs: [{ name: \"\", type: \"uint8\" }],\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"symbol\",\n outputs: [{ name: \"\", type: \"string\" }],\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"name\",\n outputs: [{ name: \"\", type: \"string\" }],\n type: \"function\",\n },\n] as const;\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": "6IASO,IATP,8BAUA,wBCVO,IAAM,EAAW,CACtB,CACE,SAAU,GACV,OAAQ,CAAC,CAAE,KAAM,SAAU,KAAM,SAAU,CAAC,EAC5C,KAAM,YACN,QAAS,CAAC,CAAE,KAAM,UAAW,KAAM,SAAU,CAAC,EAC9C,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CACN,CAAE,KAAM,MAAO,KAAM,SAAU,EAC/B,CAAE,KAAM,SAAU,KAAM,SAAU,CACpC,EACA,KAAM,WACN,QAAS,CAAC,CAAE,KAAM,UAAW,KAAM,MAAO,CAAC,EAC3C,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CAAC,EACT,KAAM,WACN,QAAS,CAAC,CAAE,KAAM,GAAI,KAAM,OAAQ,CAAC,EACrC,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CAAC,EACT,KAAM,SACN,QAAS,CAAC,CAAE,KAAM,GAAI,KAAM,QAAS,CAAC,EACtC,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CAAC,EACT,KAAM,OACN,QAAS,CAAC,CAAE,KAAM,GAAI,KAAM,QAAS,CAAC,EACtC,KAAM,UACR,CACF,EDlBA,eAAsB,CAAuB,EAAG,CAC9C,IAAQ,8BAER,MAAO,CAAC,IAAoB,CAC1B,OAAO,EAAQ,UAAU,CAAO,GAIpC,eAAsB,CAA6B,EACjD,SACA,eAAgB,EAChB,SAKC,CACD,IAAM,EACJ,GACA,yBACE,uBAAqB,wBAAsB,QAAM,MAAO,CAAE,MAAO,GAAS,CAAE,CAAC,CAC/E,GAEM,SAAU,KAAa,yBACvB,sBAAuB,KAAa,wBAEtC,EAAO,EAAmB,CAAM,EAEhC,EADQ,EAAM,eAAe,CAAI,EACjB,OAAO,CAAmB,EAEhD,IAAK,EAAQ,WACX,MAAM,IAAI,eAAa,wBAAwB,EAGjD,OAAO,OAAO,KAAK,EAAQ,UAAU,EAAE,SAAS,KAAK,EAGvD,eAAe,CAAiB,EAC9B,SACA,kBAIC,CACD,IAAQ,SAAU,KAAa,yBACvB,sBAAuB,KAAa,yBACpC,8BAEF,EAAO,EAAmB,CAAM,EAEhC,EADQ,EAAM,eAAe,CAAI,EACjB,OAAO,CAAc,EAE3C,IAAK,EAAQ,WACX,MAAM,IAAI,eAAa,wBAAwB,EAIjD,IAAM,EAAgB,OAAO,KAAK,EAAQ,UAAU,EAAE,SAAS,KAAK,EAG9D,EAAiB,IAAI,EAAQ,CACjC,SAAU,WAAS,IAAI,SAAS,EAAE,QAAM,MACxC,WAAY,CACd,CAAC,EAEK,EAAU,EAAe,QAAQ,eAAe,CAAa,EAEnE,MAAO,CACL,WAAY,IAAM,QAAQ,QAAQ,OAAO,IAAY,SAAW,EAAU,EAAE,EAC5E,gBAAiB,MAAO,IAAiC,CAEvD,OADiB,MAAM,EAAe,IAAI,KAAK,EAAa,CAAa,EAG7E,EAGK,IAAM,EAAoB,MAAO,EAA8B,CAAC,IAAM,CAC3E,IAAQ,
|
|
9
|
-
"debugId": "
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "E91951AC6B051F7064756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
package/dist/src/tron/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{d as
|
|
1
|
+
import{d as Y,e as T}from"../../chunk-s47y8512.js";import{AssetValue as k,Chain as Q,NetworkDerivationPath as P,SKConfig as v,SwapKitError as R,derivationPathToString as w,updateDerivationPath as p,warnOnce as C}from"@swapkit/helpers";import{P as E,match as c}from"ts-pattern";var m=[{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],type:"function"},{constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[{name:"success",type:"bool"}],type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint8"}],type:"function"},{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],type:"function"},{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],type:"function"}];async function K(){let{TronWeb:q}=T("tronweb");return(X)=>{return q.isAddress(X)}}async function o({phrase:q,derivationPath:X,index:Z}){let j=X||w(p(P[Q.Tron],{index:Z||0})),{HDKey:f}=await import("@scure/bip32"),{mnemonicToSeedSync:$}=await import("@scure/bip39"),I=$(q),M=f.fromMasterSeed(I).derive(j);if(!M.privateKey)throw new R("toolbox_tron_no_signer");return Buffer.from(M.privateKey).toString("hex")}async function n({phrase:q,derivationPath:X}){let{HDKey:Z}=await import("@scure/bip32"),{mnemonicToSeedSync:j}=await import("@scure/bip39"),{TronWeb:f}=T("tronweb"),$=j(q),G=Z.fromMasterSeed($).derive(X);if(!G.privateKey)throw new R("toolbox_tron_no_signer");let M=Buffer.from(G.privateKey).toString("hex"),L=new f({fullHost:v.get("rpcUrls")[Q.Tron],privateKey:M}),N=L.address.fromPrivateKey(M);return{getAddress:()=>Promise.resolve(typeof N==="string"?N:""),signTransaction:async(B)=>{return await L.trx.sign(B,M)}}}var d=async(q={})=>{let{TronWeb:X}=await import("tronweb"),Z=v.get("rpcUrls")[Q.Tron],j=void 0,f=new X({fullHost:Z,headers:void 0}),$="index"in q?q.index||0:0,I=w("derivationPath"in q&&q.derivationPath?q.derivationPath:p(P[Q.Tron],{index:$})),G=await c(q).with({phrase:E.string},async({phrase:y})=>n({phrase:y,derivationPath:I})).with({signer:E.any},({signer:y})=>Promise.resolve(y)).otherwise(()=>Promise.resolve(void 0)),M=async()=>{if(!G)throw new R("toolbox_tron_no_signer");return await G.getAddress()},L=()=>{return 1e8},N=async(y,_=!0)=>{let{getBalance:O}=await import("../../chunk-6f98phv2.js");try{let z=await O(Q.Tron)(y,_);if(z.length>0)return z;let J=await f.trx.getBalance(y);return[k.from({chain:Q.Tron,value:J,fromBaseDecimal:6})]}catch(z){C(!0,`Failed to get Tron balance for ${y}: ${z instanceof Error?z.message:z}`);try{let J=await f.trx.getBalance(y);return[k.from({chain:Q.Tron,value:J,fromBaseDecimal:6})]}catch(J){return C(!0,`Failed to get native TRX balance for ${y}: ${J instanceof Error?J.message:J}`),[]}}},B=async({recipient:y,assetValue:_,memo:O})=>{if(!G)throw new R("toolbox_tron_no_signer");let z=await M();if(_.isGasAsset){let x=await f.transactionBuilder.sendTrx(y,_.getBaseValue("number"),z);if(O){let V=await f.transactionBuilder.addUpdateData(x,O,"utf8"),l=await G.signTransaction(V),{txid:h}=await f.trx.sendRawTransaction(l);return h}let H=await G.signTransaction(x),{txid:b}=await f.trx.sendRawTransaction(H);return b}let D=_.address;if(!D)throw new R("toolbox_tron_invalid_token_identifier",{identifier:_.toString()});let U=L(),u=await f.contract(m,D);if(!u.methods?.transfer)throw new R("toolbox_tron_token_transfer_failed");let F=await u.methods.transfer(y,_.getBaseValue("string")).send({from:z,feeLimit:U,callValue:0});if(!F)throw new R("toolbox_tron_token_transfer_failed");return F},A=({assetValue:y})=>{if(y.isGasAsset)return k.from({chain:Q.Tron,value:1});return k.from({chain:Q.Tron,value:10})},g=async(y)=>{let{recipient:_,assetValue:O,memo:z}=y,J=await M();if(O.isGasAsset){let H=await f.transactionBuilder.sendTrx(_,O.getBaseValue("number"),J);if(z)return f.transactionBuilder.addUpdateData(H,z,"utf8");return H}let U=O.address;if(!U)throw new R("toolbox_tron_invalid_token_identifier",{identifier:O.toString()});let u="transfer(address,uint256)",F=[{type:"address",value:_},{type:"uint256",value:O.getBaseValue("string")}];return(await f.transactionBuilder.triggerSmartContract(U,u,{},F,J)).transaction},S=async(y)=>{if(!G)throw new R("toolbox_tron_no_signer");return await G.signTransaction(y)},W=async(y)=>{let{txid:_}=await f.trx.sendRawTransaction(y);return _};return{tronWeb:f,getAddress:M,validateAddress:await K(),getBalance:N,transfer:B,estimateTransactionFee:A,createTransaction:g,signTransaction:S,broadcastTransaction:W}};export{m as trc20ABI,o as getTronPrivateKeyFromMnemonic,K as getTronAddressValidator,d as createTronToolbox};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=8285008E1FBE487564756E2164756E21
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/tron/toolbox.ts", "../src/tron/helpers/trc20.abi.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import {\n AssetValue,\n Chain,\n NetworkDerivationPath,\n SKConfig,\n SwapKitError,\n derivationPathToString,\n updateDerivationPath,\n warnOnce,\n} from \"@swapkit/helpers\";\nimport { P, match } from \"ts-pattern\";\n\nimport { trc20ABI } from \"./helpers/trc20.abi.js\";\nimport type {\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types.js\";\n\nexport async function getTronAddressValidator() {\n const { TronWeb } = require(\"tronweb\");\n\n return (address: string) => {\n return TronWeb.isAddress(address);\n };\n}\n\nexport async function getTronPrivateKeyFromMnemonic({\n phrase,\n derivationPath: customPath,\n index,\n}: {\n phrase: string;\n derivationPath?: string;\n index?: number;\n}) {\n const derivationPathToUse =\n customPath ||\n derivationPathToString(\n updateDerivationPath(NetworkDerivationPath[Chain.Tron], { index: index || 0 }),\n );\n\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPathToUse);\n\n if (!derived.privateKey) {\n throw new SwapKitError(\"toolbox_tron_no_signer\");\n }\n\n return Buffer.from(derived.privateKey).toString(\"hex\");\n}\n\nasync function createKeysForPath({\n phrase,\n derivationPath,\n}: {\n phrase: string;\n derivationPath: string;\n}) {\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n const { TronWeb } = require(\"tronweb\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPath);\n\n if (!derived.privateKey) {\n throw new SwapKitError(\"toolbox_tron_no_signer\");\n }\n\n // Convert private key to hex string for TronWeb\n const privateKeyHex = Buffer.from(derived.privateKey).toString(\"hex\");\n\n // Create TronWeb instance with the derived private key\n const tronWebWithKey = new TronWeb({\n fullHost: SKConfig.get(\"rpcUrls\")[Chain.Tron],\n privateKey: privateKeyHex,\n });\n\n const address = tronWebWithKey.address.fromPrivateKey(privateKeyHex);\n\n return {\n getAddress: () => Promise.resolve(typeof address === \"string\" ? address : \"\"),\n signTransaction: async (transaction: TronTransaction) => {\n const signedTx = await tronWebWithKey.trx.sign(transaction, privateKeyHex);\n return signedTx;\n },\n };\n}\n\nexport const createTronToolbox = async (options: TronToolboxOptions = {}) => {\n const { TronWeb } =
|
|
5
|
+
"import {\n AssetValue,\n Chain,\n NetworkDerivationPath,\n SKConfig,\n SwapKitError,\n derivationPathToString,\n updateDerivationPath,\n warnOnce,\n} from \"@swapkit/helpers\";\nimport { P, match } from \"ts-pattern\";\n\nimport { trc20ABI } from \"./helpers/trc20.abi.js\";\nimport type {\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types.js\";\n\nexport async function getTronAddressValidator() {\n const { TronWeb } = require(\"tronweb\");\n\n return (address: string) => {\n return TronWeb.isAddress(address);\n };\n}\n\nexport async function getTronPrivateKeyFromMnemonic({\n phrase,\n derivationPath: customPath,\n index,\n}: {\n phrase: string;\n derivationPath?: string;\n index?: number;\n}) {\n const derivationPathToUse =\n customPath ||\n derivationPathToString(\n updateDerivationPath(NetworkDerivationPath[Chain.Tron], { index: index || 0 }),\n );\n\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPathToUse);\n\n if (!derived.privateKey) {\n throw new SwapKitError(\"toolbox_tron_no_signer\");\n }\n\n return Buffer.from(derived.privateKey).toString(\"hex\");\n}\n\nasync function createKeysForPath({\n phrase,\n derivationPath,\n}: {\n phrase: string;\n derivationPath: string;\n}) {\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n const { TronWeb } = require(\"tronweb\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPath);\n\n if (!derived.privateKey) {\n throw new SwapKitError(\"toolbox_tron_no_signer\");\n }\n\n // Convert private key to hex string for TronWeb\n const privateKeyHex = Buffer.from(derived.privateKey).toString(\"hex\");\n\n // Create TronWeb instance with the derived private key\n const tronWebWithKey = new TronWeb({\n fullHost: SKConfig.get(\"rpcUrls\")[Chain.Tron],\n privateKey: privateKeyHex,\n });\n\n const address = tronWebWithKey.address.fromPrivateKey(privateKeyHex);\n\n return {\n getAddress: () => Promise.resolve(typeof address === \"string\" ? address : \"\"),\n signTransaction: async (transaction: TronTransaction) => {\n const signedTx = await tronWebWithKey.trx.sign(transaction, privateKeyHex);\n return signedTx;\n },\n };\n}\n\nexport const createTronToolbox = async (options: TronToolboxOptions = {}) => {\n const { TronWeb } = await import(\"tronweb\");\n // Always get configuration from SKConfig\n const rpcUrl = SKConfig.get(\"rpcUrls\")[Chain.Tron];\n // Note: TRON API key support can be added to SKConfig apiKeys when needed\n const headers = undefined; // No API key needed for basic TronGrid access\n\n const tronWeb = new TronWeb({\n fullHost: rpcUrl,\n headers,\n });\n\n // Handle derivation path and index\n const index = \"index\" in options ? options.index || 0 : 0;\n const derivationPath = derivationPathToString(\n \"derivationPath\" in options && options.derivationPath\n ? options.derivationPath\n : updateDerivationPath(NetworkDerivationPath[Chain.Tron], { index }),\n );\n\n // Create signer based on options using pattern matching\n const signer: TronSigner | undefined = await match(options)\n .with({ phrase: P.string }, async ({ phrase }) => createKeysForPath({ phrase, derivationPath }))\n .with({ signer: P.any }, ({ signer }) => Promise.resolve(signer as TronSigner))\n .otherwise(() => Promise.resolve(undefined));\n\n const getAddress = async () => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n return await signer.getAddress();\n };\n\n const calculateFeeLimit = () => {\n return 100_000_000; // 100 TRX in SUN\n };\n\n const getBalance = async (address: string, scamFilter = true) => {\n const { getBalance: getBalanceFromApi } = await import(\"../utils.js\");\n\n try {\n // Use SwapKit API for comprehensive balance fetching (includes TRX + TRC20 tokens)\n const apiBalances = await getBalanceFromApi(Chain.Tron)(address, scamFilter);\n\n // If API returns balances, use those\n if (apiBalances.length > 0) {\n return apiBalances;\n }\n\n // Fallback to on-chain TRX balance if API fails or returns empty\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n return [\n AssetValue.from({\n chain: Chain.Tron,\n value: trxBalanceInSun,\n fromBaseDecimal: 6, // TRX has 6 decimals\n }),\n ];\n } catch (error) {\n warnOnce(\n true,\n `Failed to get Tron balance for ${address}: ${error instanceof Error ? error.message : error}`,\n );\n\n // Final fallback: try to get just the native TRX balance\n try {\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n return [\n AssetValue.from({\n chain: Chain.Tron,\n value: trxBalanceInSun,\n fromBaseDecimal: 6,\n }),\n ];\n } catch (fallbackError) {\n warnOnce(\n true,\n `Failed to get native TRX balance for ${address}: ${fallbackError instanceof Error ? fallbackError.message : fallbackError}`,\n );\n return [];\n }\n }\n };\n\n const transfer = async ({ recipient, assetValue, memo }: TronTransferParams) => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n\n const from = await getAddress();\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n // Native TRX Transfer (amount in SUN - base units)\n const transaction = await tronWeb.transactionBuilder.sendTrx(\n recipient,\n assetValue.getBaseValue(\"number\"),\n from,\n );\n\n // Add memo if provided\n if (memo) {\n const transactionWithMemo = await tronWeb.transactionBuilder.addUpdateData(\n transaction,\n memo,\n \"utf8\",\n );\n const signedTx = await signer.signTransaction(transactionWithMemo);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n }\n\n const signedTx = await signer.signTransaction(transaction);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n }\n\n // TRC20 Token Transfer\n const contractAddress = assetValue.address;\n if (!contractAddress) {\n throw new SwapKitError(\"toolbox_tron_invalid_token_identifier\", {\n identifier: assetValue.toString(),\n });\n }\n\n const feeLimit = calculateFeeLimit();\n const contract = await tronWeb.contract(trc20ABI, contractAddress);\n\n if (!contract.methods?.transfer) {\n throw new SwapKitError(\"toolbox_tron_token_transfer_failed\");\n }\n\n const txid = await contract.methods\n .transfer(recipient, assetValue.getBaseValue(\"string\"))\n .send({\n from,\n feeLimit,\n callValue: 0,\n });\n\n if (!txid) {\n throw new SwapKitError(\"toolbox_tron_token_transfer_failed\");\n }\n\n return txid;\n };\n\n const estimateTransactionFee = ({ assetValue }: TronTransferParams) => {\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n // Native TRX transfers typically consume bandwidth, which is free up to daily limit\n // Return a minimal fee estimation for bandwidth cost\n return AssetValue.from({ chain: Chain.Tron, value: 1 }); // 1 TRX\n }\n\n // TRC20 transfers consume energy, estimate higher fee\n return AssetValue.from({ chain: Chain.Tron, value: 10 }); // 10 TRX\n };\n\n const createTransaction = async (params: TronTransferParams) => {\n const { recipient, assetValue, memo } = params;\n const from = await getAddress();\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n const transaction = await tronWeb.transactionBuilder.sendTrx(\n recipient,\n assetValue.getBaseValue(\"number\"),\n from,\n );\n\n if (memo) {\n return tronWeb.transactionBuilder.addUpdateData(transaction, memo, \"utf8\");\n }\n\n return transaction;\n }\n\n // For TRC20, we would need to build the transaction manually\n // This is a simplified version - in practice, you'd build the contract call transaction\n const contractAddress = assetValue.address;\n if (!contractAddress) {\n throw new SwapKitError(\"toolbox_tron_invalid_token_identifier\", {\n identifier: assetValue.toString(),\n });\n }\n\n // Build TRC20 transfer transaction\n const functionSelector = \"transfer(address,uint256)\";\n const parameter = [\n { type: \"address\", value: recipient },\n { type: \"uint256\", value: assetValue.getBaseValue(\"string\") },\n ];\n\n const result = await tronWeb.transactionBuilder.triggerSmartContract(\n contractAddress,\n functionSelector,\n {},\n parameter,\n from,\n );\n\n return result.transaction;\n };\n\n const signTransaction = async (transaction: TronTransaction) => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n return await signer.signTransaction(transaction);\n };\n\n const broadcastTransaction = async (signedTx: TronSignedTransaction) => {\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n };\n\n return {\n tronWeb,\n getAddress,\n validateAddress: await getTronAddressValidator(),\n getBalance,\n transfer,\n estimateTransactionFee,\n createTransaction,\n signTransaction,\n broadcastTransaction,\n };\n};\n",
|
|
6
6
|
"export const trc20ABI = [\n {\n constant: true,\n inputs: [{ name: \"_owner\", type: \"address\" }],\n name: \"balanceOf\",\n outputs: [{ name: \"balance\", type: \"uint256\" }],\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n { name: \"_to\", type: \"address\" },\n { name: \"_value\", type: \"uint256\" },\n ],\n name: \"transfer\",\n outputs: [{ name: \"success\", type: \"bool\" }],\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"decimals\",\n outputs: [{ name: \"\", type: \"uint8\" }],\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"symbol\",\n outputs: [{ name: \"\", type: \"string\" }],\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"name\",\n outputs: [{ name: \"\", type: \"string\" }],\n type: \"function\",\n },\n] as const;\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": "mDAAA,qBACE,WACA,2BACA,cACA,kBACA,4BACA,0BACA,cACA,yBAEF,YAAS,WAAG,mBCVL,IAAM,EAAW,CACtB,CACE,SAAU,GACV,OAAQ,CAAC,CAAE,KAAM,SAAU,KAAM,SAAU,CAAC,EAC5C,KAAM,YACN,QAAS,CAAC,CAAE,KAAM,UAAW,KAAM,SAAU,CAAC,EAC9C,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CACN,CAAE,KAAM,MAAO,KAAM,SAAU,EAC/B,CAAE,KAAM,SAAU,KAAM,SAAU,CACpC,EACA,KAAM,WACN,QAAS,CAAC,CAAE,KAAM,UAAW,KAAM,MAAO,CAAC,EAC3C,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CAAC,EACT,KAAM,WACN,QAAS,CAAC,CAAE,KAAM,GAAI,KAAM,OAAQ,CAAC,EACrC,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CAAC,EACT,KAAM,SACN,QAAS,CAAC,CAAE,KAAM,GAAI,KAAM,QAAS,CAAC,EACtC,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CAAC,EACT,KAAM,OACN,QAAS,CAAC,CAAE,KAAM,GAAI,KAAM,QAAS,CAAC,EACtC,KAAM,UACR,CACF,EDlBA,eAAsB,CAAuB,EAAG,CAC9C,IAAQ,wBAER,MAAO,CAAC,IAAoB,CAC1B,OAAO,EAAQ,UAAU,CAAO,GAIpC,eAAsB,CAA6B,EACjD,SACA,eAAgB,EAChB,SAKC,CACD,IAAM,EACJ,GACA,EACE,EAAqB,EAAsB,EAAM,MAAO,CAAE,MAAO,GAAS,CAAE,CAAC,CAC/E,GAEM,SAAU,KAAa,yBACvB,sBAAuB,KAAa,wBAEtC,EAAO,EAAmB,CAAM,EAEhC,EADQ,EAAM,eAAe,CAAI,EACjB,OAAO,CAAmB,EAEhD,IAAK,EAAQ,WACX,MAAM,IAAI,EAAa,wBAAwB,EAGjD,OAAO,OAAO,KAAK,EAAQ,UAAU,EAAE,SAAS,KAAK,EAGvD,eAAe,CAAiB,EAC9B,SACA,kBAIC,CACD,IAAQ,SAAU,KAAa,yBACvB,sBAAuB,KAAa,yBACpC,wBAEF,EAAO,EAAmB,CAAM,EAEhC,EADQ,EAAM,eAAe,CAAI,EACjB,OAAO,CAAc,EAE3C,IAAK,EAAQ,WACX,MAAM,IAAI,EAAa,wBAAwB,EAIjD,IAAM,EAAgB,OAAO,KAAK,EAAQ,UAAU,EAAE,SAAS,KAAK,EAG9D,EAAiB,IAAI,EAAQ,CACjC,SAAU,EAAS,IAAI,SAAS,EAAE,EAAM,MACxC,WAAY,CACd,CAAC,EAEK,EAAU,EAAe,QAAQ,eAAe,CAAa,EAEnE,MAAO,CACL,WAAY,IAAM,QAAQ,QAAQ,OAAO,IAAY,SAAW,EAAU,EAAE,EAC5E,gBAAiB,MAAO,IAAiC,CAEvD,OADiB,MAAM,EAAe,IAAI,KAAK,EAAa,CAAa,EAG7E,EAGK,IAAM,EAAoB,MAAO,EAA8B,CAAC,IAAM,CAC3E,IAAQ,
|
|
9
|
-
"debugId": "
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "8285008E1FBE487564756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|