@dynamic-labs-sdk/tron 1.17.1 → 1.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/addTronExtension/addTronExtension.d.ts +10 -1
- package/dist/addTronExtension/addTronExtension.d.ts.map +1 -1
- package/dist/{addTronWalletAdaptersExtension-aiSgBowW.esm.js → addTronWalletAdaptersExtension-D7s8BCaT.esm.js} +2 -2
- package/dist/{addTronWalletAdaptersExtension-aiSgBowW.esm.js.map → addTronWalletAdaptersExtension-D7s8BCaT.esm.js.map} +1 -1
- package/dist/{addTronWalletAdaptersExtension-CuFnviYr.cjs → addTronWalletAdaptersExtension-O6v6XmV-.cjs} +2 -2
- package/dist/{addTronWalletAdaptersExtension-CuFnviYr.cjs.map → addTronWalletAdaptersExtension-O6v6XmV-.cjs.map} +1 -1
- package/dist/{addWaasTronExtension-CmVC62IW.cjs → addWaasTronExtension-OL6TymZK.cjs} +2 -2
- package/dist/{addWaasTronExtension-CmVC62IW.cjs.map → addWaasTronExtension-OL6TymZK.cjs.map} +1 -1
- package/dist/{addWaasTronExtension-BGoqq6je.esm.js → addWaasTronExtension-tBdm8r9R.esm.js} +2 -2
- package/dist/{addWaasTronExtension-BGoqq6je.esm.js.map → addWaasTronExtension-tBdm8r9R.esm.js.map} +1 -1
- package/dist/getTronWeb/getTronWeb.d.ts +10 -3
- package/dist/getTronWeb/getTronWeb.d.ts.map +1 -1
- package/dist/index.cjs +68 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.esm.js +68 -13
- package/dist/index.esm.js.map +1 -1
- package/dist/isTronNetworkProvider/isTronNetworkProvider.d.ts +16 -1
- package/dist/isTronNetworkProvider/isTronNetworkProvider.d.ts.map +1 -1
- package/dist/isTronWalletAccount/isTronWalletAccount.d.ts +15 -1
- package/dist/isTronWalletAccount/isTronWalletAccount.d.ts.map +1 -1
- package/dist/isTronWalletProvider/isTronWalletProvider.d.ts +16 -1
- package/dist/isTronWalletProvider/isTronWalletProvider.d.ts.map +1 -1
- package/dist/sendTransaction/sendTransaction.d.ts +17 -5
- package/dist/sendTransaction/sendTransaction.d.ts.map +1 -1
- package/dist/{tronTransferAmount-B8ysC4Ni.cjs → tronTransferAmount-C48MZYe2.cjs} +33 -4
- package/dist/tronTransferAmount-C48MZYe2.cjs.map +1 -0
- package/dist/{tronTransferAmount-A-hXh2Mc.esm.js → tronTransferAmount-D6YcQFhZ.esm.js} +33 -4
- package/dist/tronTransferAmount-D6YcQFhZ.esm.js.map +1 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/utils/calculateTronTransactionFee/calculateTronTransactionFee.d.ts +15 -3
- package/dist/utils/calculateTronTransactionFee/calculateTronTransactionFee.d.ts.map +1 -1
- package/dist/waas.cjs +2 -2
- package/dist/waas.esm.js +2 -2
- package/dist/walletAdapters.cjs +2 -2
- package/dist/walletAdapters.esm.js +2 -2
- package/package.json +4 -4
- package/dist/tronTransferAmount-A-hXh2Mc.esm.js.map +0 -1
- package/dist/tronTransferAmount-B8ysC4Ni.cjs.map +0 -1
package/dist/index.esm.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { a as isTronWalletProvider, c as name, l as version, n as NotTronProviderError, o as isTronWalletAccount } from "./tronTransferAmount-
|
|
2
|
-
import { t as addWaasTronExtension } from "./addWaasTronExtension-
|
|
3
|
-
import { t as addTronWalletAdaptersExtension } from "./addTronWalletAdaptersExtension-
|
|
1
|
+
import { a as isTronWalletProvider, c as name, l as version, n as NotTronProviderError, o as isTronWalletAccount } from "./tronTransferAmount-D6YcQFhZ.esm.js";
|
|
2
|
+
import { t as addWaasTronExtension } from "./addWaasTronExtension-tBdm8r9R.esm.js";
|
|
3
|
+
import { t as addTronWalletAdaptersExtension } from "./addTronWalletAdaptersExtension-D7s8BCaT.esm.js";
|
|
4
4
|
import { assertPackageVersion } from "@dynamic-labs-sdk/assert-package-version";
|
|
5
5
|
import { getDefaultClient, getWalletProviderFromWalletAccount, parseAmountToSmallestUnit } from "@dynamic-labs-sdk/client/core";
|
|
6
6
|
import { FeeEstimationFailedError, InvalidParamError, assertWalletAccountSigningAvailability, getDefaultClient as getDefaultClient$1 } from "@dynamic-labs-sdk/client";
|
|
@@ -14,7 +14,16 @@ import { FeeEstimationFailedError, InvalidParamError, assertWalletAccountSigning
|
|
|
14
14
|
* including injected wallets (Tronlink, etc.) and embedded wallets managed by
|
|
15
15
|
* Dynamic's infrastructure.
|
|
16
16
|
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* const client = createDynamicClient({ environmentId: 'env-123' });
|
|
20
|
+
* addTronExtension(client);
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
17
23
|
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
24
|
+
* @returns void
|
|
25
|
+
* @see isTronWalletAccount
|
|
26
|
+
* @see isTronNetworkProvider
|
|
18
27
|
* @notInstrumented
|
|
19
28
|
*/
|
|
20
29
|
const addTronExtension = (client = getDefaultClient()) => {
|
|
@@ -66,6 +75,16 @@ const NATIVE_TRANSFER_BANDWIDTH = 270;
|
|
|
66
75
|
* EVM/Solana fee estimators — TRC-20 from energy burn, native TRX from
|
|
67
76
|
* bandwidth.
|
|
68
77
|
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```ts
|
|
80
|
+
* const fee = await calculateTronTransactionFee({
|
|
81
|
+
* walletAccount: tronAccount,
|
|
82
|
+
* recipient: 'TAddress...',
|
|
83
|
+
* amount: '10',
|
|
84
|
+
* nativeTokenPriceUsd: 0.12,
|
|
85
|
+
* });
|
|
86
|
+
* ```
|
|
87
|
+
*
|
|
69
88
|
* @param params.amount - Human-readable transfer amount.
|
|
70
89
|
* @param params.recipient - Destination address.
|
|
71
90
|
* @param params.token - TRC-20 token (`{ address, decimals }`); omit for native TRX.
|
|
@@ -73,9 +92,11 @@ const NATIVE_TRANSFER_BANDWIDTH = 270;
|
|
|
73
92
|
* @param params.nativeTokenPriceUsd - Optional TRX price for `usdAmount`.
|
|
74
93
|
* @param client - The Dynamic client instance.
|
|
75
94
|
* @returns Fee in SUN (atomic), human-readable TRX, and optional USD.
|
|
76
|
-
* @throws InvalidParamError
|
|
77
|
-
* @throws NotTronProviderError
|
|
78
|
-
* @throws FeeEstimationFailedError
|
|
95
|
+
* @throws {InvalidParamError} If the wallet account is not Tron.
|
|
96
|
+
* @throws {NotTronProviderError} If the resolved provider is not Tron.
|
|
97
|
+
* @throws {FeeEstimationFailedError} If on-chain estimation fails.
|
|
98
|
+
* @see getTronWeb
|
|
99
|
+
* @see sendTransaction
|
|
79
100
|
* @notInstrumented
|
|
80
101
|
*/
|
|
81
102
|
const calculateTronTransactionFee = async ({ amount, nativeTokenPriceUsd, recipient, token, walletAccount }, client = getDefaultClient$1()) => {
|
|
@@ -128,10 +149,17 @@ const calculateTronTransactionFee = async ({ amount, nativeTokenPriceUsd, recipi
|
|
|
128
149
|
/**
|
|
129
150
|
* Retrieves a TronWeb from a wallet account.
|
|
130
151
|
*
|
|
152
|
+
* @example
|
|
153
|
+
* ```ts
|
|
154
|
+
* const tronWeb = await getTronWeb({ walletAccount: tronAccount });
|
|
155
|
+
* ```
|
|
156
|
+
*
|
|
131
157
|
* @param params.walletAccount - The wallet account to get the TronWeb for.
|
|
132
158
|
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
133
|
-
* @returns A promise that resolves to a TronWeb instance
|
|
134
|
-
* @throws NotTronProviderError If the wallet account's provider is not a Tron provider
|
|
159
|
+
* @returns A promise that resolves to a TronWeb instance.
|
|
160
|
+
* @throws {NotTronProviderError} If the wallet account's provider is not a Tron provider.
|
|
161
|
+
* @see sendTransaction
|
|
162
|
+
* @see isTronWalletAccount
|
|
135
163
|
* @notInstrumented
|
|
136
164
|
*/
|
|
137
165
|
const getTronWeb = async ({ walletAccount }, client = getDefaultClient()) => {
|
|
@@ -142,17 +170,44 @@ const getTronWeb = async ({ walletAccount }, client = getDefaultClient()) => {
|
|
|
142
170
|
|
|
143
171
|
//#endregion
|
|
144
172
|
//#region src/isTronNetworkProvider/isTronNetworkProvider.ts
|
|
145
|
-
/**
|
|
173
|
+
/**
|
|
174
|
+
* Type guard function to check if a network provider is a Tron network provider.
|
|
175
|
+
*
|
|
176
|
+
* @example
|
|
177
|
+
* ```ts
|
|
178
|
+
* if (isTronNetworkProvider(networkProvider)) {
|
|
179
|
+
* const tronWeb = networkProvider.getTronWeb();
|
|
180
|
+
* }
|
|
181
|
+
* ```
|
|
182
|
+
*
|
|
183
|
+
* @param networkProvider - The network provider to check.
|
|
184
|
+
* @returns True if the network provider is a Tron network provider, false otherwise.
|
|
185
|
+
* @see isTronWalletAccount
|
|
186
|
+
* @see addTronExtension
|
|
187
|
+
* @notInstrumented
|
|
188
|
+
*/
|
|
146
189
|
const isTronNetworkProvider = (networkProvider) => networkProvider.chain === "TRON";
|
|
147
190
|
|
|
148
191
|
//#endregion
|
|
149
192
|
//#region src/sendTransaction/sendTransaction.ts
|
|
150
193
|
/**
|
|
151
|
-
* Sends a Tron transaction
|
|
152
|
-
*
|
|
153
|
-
* @
|
|
194
|
+
* Sends a Tron transaction.
|
|
195
|
+
*
|
|
196
|
+
* @example
|
|
197
|
+
* ```ts
|
|
198
|
+
* const result = await sendTransaction({
|
|
199
|
+
* walletAccount: tronAccount,
|
|
200
|
+
* transaction: tronTransaction,
|
|
201
|
+
* });
|
|
202
|
+
* ```
|
|
203
|
+
*
|
|
204
|
+
* @param params.transaction - The transaction to send.
|
|
205
|
+
* @param params.walletAccount - The wallet account to sign and send the transaction with.
|
|
154
206
|
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
155
|
-
* @returns A promise that resolves to the broadcast return of the signed transaction
|
|
207
|
+
* @returns A promise that resolves to the broadcast return of the signed transaction.
|
|
208
|
+
* @throws {NotTronProviderError} If the wallet account's provider is not a Tron provider.
|
|
209
|
+
* @see getTronWeb
|
|
210
|
+
* @see isTronWalletAccount
|
|
156
211
|
* @notInstrumented
|
|
157
212
|
*/
|
|
158
213
|
const sendTransaction = async ({ walletAccount, transaction }, client = getDefaultClient$1()) => {
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","names":["TRX_DECIMALS","getDefaultClient","resources: {\n EnergyLimit?: number;\n EnergyUsed?: number;\n NetLimit?: number;\n NetUsed?: number;\n freeNetLimit?: number;\n freeNetUsed?: number;\n }","nativeAmount: bigint","getDefaultClient","packageName","packageVersion"],"sources":["../src/addTronExtension/addTronExtension.ts","../src/utils/parseLatestSunPrice/parseLatestSunPrice.ts","../src/utils/sunToTrxString/sunToTrxString.ts","../src/utils/calculateTronTransactionFee/calculateTronTransactionFee.ts","../src/getTronWeb/getTronWeb.ts","../src/isTronNetworkProvider/isTronNetworkProvider.ts","../src/sendTransaction/sendTransaction.ts","../src/exports/index.ts"],"sourcesContent":["import { getDefaultClient } from '@dynamic-labs-sdk/client/core';\n\nimport { addWaasTronExtension } from '../waas/addWaasTronExtension';\nimport { addTronWalletAdaptersExtension } from '../walletAdapters/addTronWalletAdaptersExtension';\n\n/**\n * Adds the Tron extension to the Dynamic client.\n *\n * This is a convenience function that adds both the Tron Wallet Adapters extension\n * and the Dynamic WaaS Tron extension, enabling support for all Tron wallet types\n * including injected wallets (Tronlink, etc.) and embedded wallets managed by\n * Dynamic's infrastructure.\n *\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @notInstrumented\n */\nexport const addTronExtension = (client = getDefaultClient()): void => {\n addTronWalletAdaptersExtension(client);\n addWaasTronExtension(client);\n};\n","/**\n * TronWeb returns resource prices (energy / bandwidth) as a\n * `timestamp:price,...` history string in SUN. The current price is the final\n * entry.\n *\n * @param priceHistory - The raw price-history string from TronWeb.\n * @returns The latest per-unit price in SUN.\n * @notInstrumented\n */\n// eslint-disable-next-line custom-rules/require-single-object-param -- single primitive parser\nexport const parseLatestSunPrice = (priceHistory: string): bigint => {\n const latestPair = priceHistory.split(',').at(-1) ?? '';\n const price = latestPair.split(':').at(-1) ?? '0';\n return BigInt(price);\n};\n","const SUN_PER_TRX = 1_000_000n;\nconst TRX_DECIMALS = 6;\n\n/**\n * Converts an amount in SUN (TRX's atomic unit) to a human-readable TRX string,\n * trimming trailing zeros (e.g. `12_600_000n` → `\"12.6\"`).\n *\n * @param sun - The amount in SUN.\n * @returns The human-readable TRX amount.\n * @notInstrumented\n */\n// eslint-disable-next-line custom-rules/require-single-object-param -- single primitive formatter\nexport const sunToTrxString = (sun: bigint): string => {\n const whole = sun / SUN_PER_TRX;\n let fraction = (sun % SUN_PER_TRX).toString().padStart(TRX_DECIMALS, '0');\n while (fraction.endsWith('0')) {\n fraction = fraction.slice(0, -1);\n }\n return fraction ? `${whole}.${fraction}` : whole.toString();\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n FeeEstimationFailedError,\n InvalidParamError,\n getDefaultClient,\n} from '@dynamic-labs-sdk/client';\nimport {\n type TransferAmountParams,\n getWalletProviderFromWalletAccount,\n parseAmountToSmallestUnit,\n} from '@dynamic-labs-sdk/client/core';\n\nimport { NotTronProviderError } from '../../errors/NotTronProviderError';\nimport { isTronWalletAccount } from '../../isTronWalletAccount';\nimport { isTronWalletProvider } from '../../isTronWalletProvider';\nimport type { TronTransactionFeeData } from '../../transactionSimulation.types';\nimport { parseLatestSunPrice } from '../parseLatestSunPrice';\nimport { sunToTrxString } from '../sunToTrxString';\n\nconst TRX_DECIMALS = 6;\n// A native TRX transfer occupies ~270 bandwidth points on-chain.\nconst NATIVE_TRANSFER_BANDWIDTH = 270;\n\ntype CalculateTronTransactionFeeParams = TransferAmountParams & {\n /** Optional USD price of TRX, used to populate `usdAmount`. */\n nativeTokenPriceUsd?: number;\n};\n\n/**\n * Estimates the network fee (in SUN) for a Tron transfer, mirroring the\n * EVM/Solana fee estimators — TRC-20 from energy burn, native TRX from\n * bandwidth.\n *\n * @param params.amount - Human-readable transfer amount.\n * @param params.recipient - Destination address.\n * @param params.token - TRC-20 token (`{ address, decimals }`); omit for native TRX.\n * @param params.walletAccount - Tron wallet account paying the fee.\n * @param params.nativeTokenPriceUsd - Optional TRX price for `usdAmount`.\n * @param client - The Dynamic client instance.\n * @returns Fee in SUN (atomic), human-readable TRX, and optional USD.\n * @throws InvalidParamError if the wallet account is not Tron.\n * @throws NotTronProviderError if the resolved provider is not Tron.\n * @throws FeeEstimationFailedError if on-chain estimation fails.\n * @notInstrumented\n */\nexport const calculateTronTransactionFee = async (\n {\n amount,\n nativeTokenPriceUsd,\n recipient,\n token,\n walletAccount,\n }: CalculateTronTransactionFeeParams,\n client: DynamicClient = getDefaultClient()\n): Promise<TronTransactionFeeData> => {\n if (!isTronWalletAccount(walletAccount)) {\n throw new InvalidParamError('Wallet account is not a Tron wallet account');\n }\n\n const provider = getWalletProviderFromWalletAccount(\n { walletAccount },\n client\n );\n\n if (!isTronWalletProvider(provider)) {\n throw new NotTronProviderError({ providerKey: provider.key });\n }\n\n const tronWeb = await provider.getTronWeb({ walletAccount });\n\n try {\n // TronGrid omits zero-valued fields, so type them optional and default to 0.\n const resources: {\n EnergyLimit?: number;\n EnergyUsed?: number;\n NetLimit?: number;\n NetUsed?: number;\n freeNetLimit?: number;\n freeNetUsed?: number;\n } = await tronWeb.trx.getAccountResources(walletAccount.address);\n\n let nativeAmount: bigint;\n\n if (token?.address) {\n const smallestUnitAmount = parseAmountToSmallestUnit({\n amount,\n decimals: token.decimals ?? TRX_DECIMALS,\n });\n\n const { energy_used: energyUsed } =\n await tronWeb.transactionBuilder.triggerConstantContract(\n token.address,\n 'transfer(address,uint256)',\n {},\n [\n { type: 'address', value: recipient },\n { type: 'uint256', value: smallestUnitAmount },\n ],\n walletAccount.address\n );\n\n const availableEnergy =\n (resources.EnergyLimit ?? 0) - (resources.EnergyUsed ?? 0);\n const burnedEnergy = Math.max(0, (energyUsed ?? 0) - availableEnergy);\n const energyPrice = parseLatestSunPrice(\n await tronWeb.trx.getEnergyPrices()\n );\n\n nativeAmount = BigInt(burnedEnergy) * energyPrice;\n } else {\n // Tron doesn't combine free + staked bandwidth — a single pool must cover\n // the whole tx, else TRX burns for the full tx (all-or-nothing).\n const freeBandwidth =\n (resources.freeNetLimit ?? 0) - (resources.freeNetUsed ?? 0);\n const stakedBandwidth =\n (resources.NetLimit ?? 0) - (resources.NetUsed ?? 0);\n const coveredByBandwidth =\n freeBandwidth >= NATIVE_TRANSFER_BANDWIDTH ||\n stakedBandwidth >= NATIVE_TRANSFER_BANDWIDTH;\n const bandwidthPrice = parseLatestSunPrice(\n await tronWeb.trx.getBandwidthPrices()\n );\n\n nativeAmount = coveredByBandwidth\n ? 0n\n : BigInt(NATIVE_TRANSFER_BANDWIDTH) * bandwidthPrice;\n }\n\n const humanReadableAmount = sunToTrxString(nativeAmount);\n\n return {\n humanReadableAmount,\n nativeAmount,\n usdAmount: nativeTokenPriceUsd\n ? (Number(humanReadableAmount) * nativeTokenPriceUsd).toFixed(2)\n : undefined,\n };\n } catch (error) {\n throw new FeeEstimationFailedError({\n cause: error instanceof Error ? error : undefined,\n message: 'Failed to estimate Tron transaction fee',\n });\n }\n};\n","import {\n getDefaultClient,\n getWalletProviderFromWalletAccount,\n} from '@dynamic-labs-sdk/client/core';\nimport type { TronWeb } from 'tronweb';\n\nimport { NotTronProviderError } from '../errors/NotTronProviderError';\nimport { isTronWalletProvider } from '../isTronWalletProvider';\nimport type { TronWalletAccount } from '../TronWalletAccount.types';\n\ntype GetTronWebParams = {\n walletAccount: TronWalletAccount;\n};\n\n/**\n * Retrieves a TronWeb from a wallet account.\n *\n * @param params.walletAccount - The wallet account to get the TronWeb for.\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns A promise that resolves to a TronWeb instance\n * @throws NotTronProviderError If the wallet account's provider is not a Tron provider\n * @notInstrumented\n */\nexport const getTronWeb = async (\n { walletAccount }: GetTronWebParams,\n client = getDefaultClient()\n): Promise<TronWeb> => {\n const provider = getWalletProviderFromWalletAccount(\n {\n walletAccount,\n },\n client\n );\n\n if (!isTronWalletProvider(provider)) {\n throw new NotTronProviderError({ providerKey: provider.key });\n }\n\n return provider.getTronWeb({ walletAccount });\n};\n","import type { NetworkProvider } from '@dynamic-labs-sdk/client';\n\nimport type { TronNetworkProvider } from '../TronNetworkProvider.types';\n\n/** @notInstrumented */\nexport const isTronNetworkProvider = (\n networkProvider: NetworkProvider\n): networkProvider is TronNetworkProvider => networkProvider.chain === 'TRON';\n","import {\n assertWalletAccountSigningAvailability,\n getDefaultClient,\n} from '@dynamic-labs-sdk/client';\nimport { getWalletProviderFromWalletAccount } from '@dynamic-labs-sdk/client/core';\n\nimport { NotTronProviderError } from '../errors/NotTronProviderError';\nimport { isTronWalletProvider } from '../isTronWalletProvider';\nimport type { TronWalletAccount } from '../TronWalletAccount.types';\nimport type { TronBroadcastReturnSignedTransaction } from '../TronWalletProvider.types';\n\ntype SendTransactionParams = {\n transaction: {\n amount: number;\n to: string;\n };\n walletAccount: TronWalletAccount;\n};\n\n/**\n * Sends a Tron transaction\n * @param params.transaction - The transaction to send\n * @param params.walletAccount - The wallet account to sign and send the transaction with\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns A promise that resolves to the broadcast return of the signed transaction\n * @notInstrumented\n */\nexport const sendTransaction = async (\n { walletAccount, transaction }: SendTransactionParams,\n client = getDefaultClient()\n): Promise<TronBroadcastReturnSignedTransaction> => {\n await assertWalletAccountSigningAvailability({ walletAccount }, client);\n\n const provider = getWalletProviderFromWalletAccount(\n {\n walletAccount,\n },\n client\n );\n\n if (!isTronWalletProvider(provider)) {\n throw new NotTronProviderError({ providerKey: provider.key });\n }\n\n const tronWeb = await provider.getTronWeb({ walletAccount });\n\n const { amount, to } = transaction;\n const amountInSun = tronWeb.toSun(amount);\n\n return tronWeb.trx.sendTransaction(to, Number(amountInSun), {\n address: walletAccount.address,\n });\n};\n","import { assertPackageVersion } from '@dynamic-labs-sdk/assert-package-version';\n\nimport {\n name as packageName,\n version as packageVersion,\n} from '../../package.json';\nassertPackageVersion(packageName, packageVersion);\n\nexport { addTronExtension } from '../addTronExtension';\nexport { calculateTronTransactionFee } from '../utils/calculateTronTransactionFee';\nexport { getTronWeb } from '../getTronWeb';\nexport { isTronNetworkProvider } from '../isTronNetworkProvider';\nexport { isTronWalletAccount } from '../isTronWalletAccount';\nexport { sendTransaction } from '../sendTransaction';\nexport type { TronNetworkProvider } from '../TronNetworkProvider.types';\nexport type { TronTransactionFeeData } from '../transactionSimulation.types';\nexport type { TronWalletAccount } from '../TronWalletAccount.types';\nexport type {\n TronBroadcastReturnSignedTransaction,\n TronWeb,\n} from '../TronWalletProvider.types';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","names":["TRX_DECIMALS","getDefaultClient","resources: {\n EnergyLimit?: number;\n EnergyUsed?: number;\n NetLimit?: number;\n NetUsed?: number;\n freeNetLimit?: number;\n freeNetUsed?: number;\n }","nativeAmount: bigint","getDefaultClient","packageName","packageVersion"],"sources":["../src/addTronExtension/addTronExtension.ts","../src/utils/parseLatestSunPrice/parseLatestSunPrice.ts","../src/utils/sunToTrxString/sunToTrxString.ts","../src/utils/calculateTronTransactionFee/calculateTronTransactionFee.ts","../src/getTronWeb/getTronWeb.ts","../src/isTronNetworkProvider/isTronNetworkProvider.ts","../src/sendTransaction/sendTransaction.ts","../src/exports/index.ts"],"sourcesContent":["import { getDefaultClient } from '@dynamic-labs-sdk/client/core';\n\nimport { addWaasTronExtension } from '../waas/addWaasTronExtension';\nimport { addTronWalletAdaptersExtension } from '../walletAdapters/addTronWalletAdaptersExtension';\n\n/**\n * Adds the Tron extension to the Dynamic client.\n *\n * This is a convenience function that adds both the Tron Wallet Adapters extension\n * and the Dynamic WaaS Tron extension, enabling support for all Tron wallet types\n * including injected wallets (Tronlink, etc.) and embedded wallets managed by\n * Dynamic's infrastructure.\n *\n * @example\n * ```ts\n * const client = createDynamicClient({ environmentId: 'env-123' });\n * addTronExtension(client);\n * ```\n *\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns void\n * @see isTronWalletAccount\n * @see isTronNetworkProvider\n * @notInstrumented\n */\nexport const addTronExtension = (client = getDefaultClient()): void => {\n addTronWalletAdaptersExtension(client);\n addWaasTronExtension(client);\n};\n","/**\n * TronWeb returns resource prices (energy / bandwidth) as a\n * `timestamp:price,...` history string in SUN. The current price is the final\n * entry.\n *\n * @param priceHistory - The raw price-history string from TronWeb.\n * @returns The latest per-unit price in SUN.\n * @notInstrumented\n */\n// eslint-disable-next-line custom-rules/require-single-object-param -- single primitive parser\nexport const parseLatestSunPrice = (priceHistory: string): bigint => {\n const latestPair = priceHistory.split(',').at(-1) ?? '';\n const price = latestPair.split(':').at(-1) ?? '0';\n return BigInt(price);\n};\n","const SUN_PER_TRX = 1_000_000n;\nconst TRX_DECIMALS = 6;\n\n/**\n * Converts an amount in SUN (TRX's atomic unit) to a human-readable TRX string,\n * trimming trailing zeros (e.g. `12_600_000n` → `\"12.6\"`).\n *\n * @param sun - The amount in SUN.\n * @returns The human-readable TRX amount.\n * @notInstrumented\n */\n// eslint-disable-next-line custom-rules/require-single-object-param -- single primitive formatter\nexport const sunToTrxString = (sun: bigint): string => {\n const whole = sun / SUN_PER_TRX;\n let fraction = (sun % SUN_PER_TRX).toString().padStart(TRX_DECIMALS, '0');\n while (fraction.endsWith('0')) {\n fraction = fraction.slice(0, -1);\n }\n return fraction ? `${whole}.${fraction}` : whole.toString();\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n FeeEstimationFailedError,\n InvalidParamError,\n getDefaultClient,\n} from '@dynamic-labs-sdk/client';\nimport {\n type TransferAmountParams,\n getWalletProviderFromWalletAccount,\n parseAmountToSmallestUnit,\n} from '@dynamic-labs-sdk/client/core';\n\nimport { NotTronProviderError } from '../../errors/NotTronProviderError';\nimport { isTronWalletAccount } from '../../isTronWalletAccount';\nimport { isTronWalletProvider } from '../../isTronWalletProvider';\nimport type { TronTransactionFeeData } from '../../transactionSimulation.types';\nimport { parseLatestSunPrice } from '../parseLatestSunPrice';\nimport { sunToTrxString } from '../sunToTrxString';\n\nconst TRX_DECIMALS = 6;\n// A native TRX transfer occupies ~270 bandwidth points on-chain.\nconst NATIVE_TRANSFER_BANDWIDTH = 270;\n\ntype CalculateTronTransactionFeeParams = TransferAmountParams & {\n /** Optional USD price of TRX, used to populate `usdAmount`. */\n nativeTokenPriceUsd?: number;\n};\n\n/**\n * Estimates the network fee (in SUN) for a Tron transfer, mirroring the\n * EVM/Solana fee estimators — TRC-20 from energy burn, native TRX from\n * bandwidth.\n *\n * @example\n * ```ts\n * const fee = await calculateTronTransactionFee({\n * walletAccount: tronAccount,\n * recipient: 'TAddress...',\n * amount: '10',\n * nativeTokenPriceUsd: 0.12,\n * });\n * ```\n *\n * @param params.amount - Human-readable transfer amount.\n * @param params.recipient - Destination address.\n * @param params.token - TRC-20 token (`{ address, decimals }`); omit for native TRX.\n * @param params.walletAccount - Tron wallet account paying the fee.\n * @param params.nativeTokenPriceUsd - Optional TRX price for `usdAmount`.\n * @param client - The Dynamic client instance.\n * @returns Fee in SUN (atomic), human-readable TRX, and optional USD.\n * @throws {InvalidParamError} If the wallet account is not Tron.\n * @throws {NotTronProviderError} If the resolved provider is not Tron.\n * @throws {FeeEstimationFailedError} If on-chain estimation fails.\n * @see getTronWeb\n * @see sendTransaction\n * @notInstrumented\n */\nexport const calculateTronTransactionFee = async (\n {\n amount,\n nativeTokenPriceUsd,\n recipient,\n token,\n walletAccount,\n }: CalculateTronTransactionFeeParams,\n client: DynamicClient = getDefaultClient()\n): Promise<TronTransactionFeeData> => {\n if (!isTronWalletAccount(walletAccount)) {\n throw new InvalidParamError('Wallet account is not a Tron wallet account');\n }\n\n const provider = getWalletProviderFromWalletAccount(\n { walletAccount },\n client\n );\n\n if (!isTronWalletProvider(provider)) {\n throw new NotTronProviderError({ providerKey: provider.key });\n }\n\n const tronWeb = await provider.getTronWeb({ walletAccount });\n\n try {\n // TronGrid omits zero-valued fields, so type them optional and default to 0.\n const resources: {\n EnergyLimit?: number;\n EnergyUsed?: number;\n NetLimit?: number;\n NetUsed?: number;\n freeNetLimit?: number;\n freeNetUsed?: number;\n } = await tronWeb.trx.getAccountResources(walletAccount.address);\n\n let nativeAmount: bigint;\n\n if (token?.address) {\n const smallestUnitAmount = parseAmountToSmallestUnit({\n amount,\n decimals: token.decimals ?? TRX_DECIMALS,\n });\n\n const { energy_used: energyUsed } =\n await tronWeb.transactionBuilder.triggerConstantContract(\n token.address,\n 'transfer(address,uint256)',\n {},\n [\n { type: 'address', value: recipient },\n { type: 'uint256', value: smallestUnitAmount },\n ],\n walletAccount.address\n );\n\n const availableEnergy =\n (resources.EnergyLimit ?? 0) - (resources.EnergyUsed ?? 0);\n const burnedEnergy = Math.max(0, (energyUsed ?? 0) - availableEnergy);\n const energyPrice = parseLatestSunPrice(\n await tronWeb.trx.getEnergyPrices()\n );\n\n nativeAmount = BigInt(burnedEnergy) * energyPrice;\n } else {\n // Tron doesn't combine free + staked bandwidth — a single pool must cover\n // the whole tx, else TRX burns for the full tx (all-or-nothing).\n const freeBandwidth =\n (resources.freeNetLimit ?? 0) - (resources.freeNetUsed ?? 0);\n const stakedBandwidth =\n (resources.NetLimit ?? 0) - (resources.NetUsed ?? 0);\n const coveredByBandwidth =\n freeBandwidth >= NATIVE_TRANSFER_BANDWIDTH ||\n stakedBandwidth >= NATIVE_TRANSFER_BANDWIDTH;\n const bandwidthPrice = parseLatestSunPrice(\n await tronWeb.trx.getBandwidthPrices()\n );\n\n nativeAmount = coveredByBandwidth\n ? 0n\n : BigInt(NATIVE_TRANSFER_BANDWIDTH) * bandwidthPrice;\n }\n\n const humanReadableAmount = sunToTrxString(nativeAmount);\n\n return {\n humanReadableAmount,\n nativeAmount,\n usdAmount: nativeTokenPriceUsd\n ? (Number(humanReadableAmount) * nativeTokenPriceUsd).toFixed(2)\n : undefined,\n };\n } catch (error) {\n throw new FeeEstimationFailedError({\n cause: error instanceof Error ? error : undefined,\n message: 'Failed to estimate Tron transaction fee',\n });\n }\n};\n","import {\n getDefaultClient,\n getWalletProviderFromWalletAccount,\n} from '@dynamic-labs-sdk/client/core';\nimport type { TronWeb } from 'tronweb';\n\nimport { NotTronProviderError } from '../errors/NotTronProviderError';\nimport { isTronWalletProvider } from '../isTronWalletProvider';\nimport type { TronWalletAccount } from '../TronWalletAccount.types';\n\ntype GetTronWebParams = {\n walletAccount: TronWalletAccount;\n};\n\n/**\n * Retrieves a TronWeb from a wallet account.\n *\n * @example\n * ```ts\n * const tronWeb = await getTronWeb({ walletAccount: tronAccount });\n * ```\n *\n * @param params.walletAccount - The wallet account to get the TronWeb for.\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns A promise that resolves to a TronWeb instance.\n * @throws {NotTronProviderError} If the wallet account's provider is not a Tron provider.\n * @see sendTransaction\n * @see isTronWalletAccount\n * @notInstrumented\n */\nexport const getTronWeb = async (\n { walletAccount }: GetTronWebParams,\n client = getDefaultClient()\n): Promise<TronWeb> => {\n const provider = getWalletProviderFromWalletAccount(\n {\n walletAccount,\n },\n client\n );\n\n if (!isTronWalletProvider(provider)) {\n throw new NotTronProviderError({ providerKey: provider.key });\n }\n\n return provider.getTronWeb({ walletAccount });\n};\n","import type { NetworkProvider } from '@dynamic-labs-sdk/client';\n\nimport type { TronNetworkProvider } from '../TronNetworkProvider.types';\n\n/**\n * Type guard function to check if a network provider is a Tron network provider.\n *\n * @example\n * ```ts\n * if (isTronNetworkProvider(networkProvider)) {\n * const tronWeb = networkProvider.getTronWeb();\n * }\n * ```\n *\n * @param networkProvider - The network provider to check.\n * @returns True if the network provider is a Tron network provider, false otherwise.\n * @see isTronWalletAccount\n * @see addTronExtension\n * @notInstrumented\n */\nexport const isTronNetworkProvider = (\n networkProvider: NetworkProvider\n): networkProvider is TronNetworkProvider => networkProvider.chain === 'TRON';\n","import {\n assertWalletAccountSigningAvailability,\n getDefaultClient,\n} from '@dynamic-labs-sdk/client';\nimport { getWalletProviderFromWalletAccount } from '@dynamic-labs-sdk/client/core';\n\nimport { NotTronProviderError } from '../errors/NotTronProviderError';\nimport { isTronWalletProvider } from '../isTronWalletProvider';\nimport type { TronWalletAccount } from '../TronWalletAccount.types';\nimport type { TronBroadcastReturnSignedTransaction } from '../TronWalletProvider.types';\n\ntype SendTransactionParams = {\n transaction: {\n amount: number;\n to: string;\n };\n walletAccount: TronWalletAccount;\n};\n\n/**\n * Sends a Tron transaction.\n *\n * @example\n * ```ts\n * const result = await sendTransaction({\n * walletAccount: tronAccount,\n * transaction: tronTransaction,\n * });\n * ```\n *\n * @param params.transaction - The transaction to send.\n * @param params.walletAccount - The wallet account to sign and send the transaction with.\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns A promise that resolves to the broadcast return of the signed transaction.\n * @throws {NotTronProviderError} If the wallet account's provider is not a Tron provider.\n * @see getTronWeb\n * @see isTronWalletAccount\n * @notInstrumented\n */\nexport const sendTransaction = async (\n { walletAccount, transaction }: SendTransactionParams,\n client = getDefaultClient()\n): Promise<TronBroadcastReturnSignedTransaction> => {\n await assertWalletAccountSigningAvailability({ walletAccount }, client);\n\n const provider = getWalletProviderFromWalletAccount(\n {\n walletAccount,\n },\n client\n );\n\n if (!isTronWalletProvider(provider)) {\n throw new NotTronProviderError({ providerKey: provider.key });\n }\n\n const tronWeb = await provider.getTronWeb({ walletAccount });\n\n const { amount, to } = transaction;\n const amountInSun = tronWeb.toSun(amount);\n\n return tronWeb.trx.sendTransaction(to, Number(amountInSun), {\n address: walletAccount.address,\n });\n};\n","import { assertPackageVersion } from '@dynamic-labs-sdk/assert-package-version';\n\nimport {\n name as packageName,\n version as packageVersion,\n} from '../../package.json';\nassertPackageVersion(packageName, packageVersion);\n\nexport { addTronExtension } from '../addTronExtension';\nexport { calculateTronTransactionFee } from '../utils/calculateTronTransactionFee';\nexport { getTronWeb } from '../getTronWeb';\nexport { isTronNetworkProvider } from '../isTronNetworkProvider';\nexport { isTronWalletAccount } from '../isTronWalletAccount';\nexport { sendTransaction } from '../sendTransaction';\nexport type { TronNetworkProvider } from '../TronNetworkProvider.types';\nexport type { TronTransactionFeeData } from '../transactionSimulation.types';\nexport type { TronWalletAccount } from '../TronWalletAccount.types';\nexport type {\n TronBroadcastReturnSignedTransaction,\n TronWeb,\n} from '../TronWalletProvider.types';\n"],"mappings":"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"}
|
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
import type { NetworkProvider } from '@dynamic-labs-sdk/client';
|
|
2
2
|
import type { TronNetworkProvider } from '../TronNetworkProvider.types';
|
|
3
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* Type guard function to check if a network provider is a Tron network provider.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* if (isTronNetworkProvider(networkProvider)) {
|
|
9
|
+
* const tronWeb = networkProvider.getTronWeb();
|
|
10
|
+
* }
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* @param networkProvider - The network provider to check.
|
|
14
|
+
* @returns True if the network provider is a Tron network provider, false otherwise.
|
|
15
|
+
* @see isTronWalletAccount
|
|
16
|
+
* @see addTronExtension
|
|
17
|
+
* @notInstrumented
|
|
18
|
+
*/
|
|
4
19
|
export declare const isTronNetworkProvider: (networkProvider: NetworkProvider) => networkProvider is TronNetworkProvider;
|
|
5
20
|
//# sourceMappingURL=isTronNetworkProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isTronNetworkProvider.d.ts","sourceRoot":"","sources":["../../src/isTronNetworkProvider/isTronNetworkProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAExE
|
|
1
|
+
{"version":3,"file":"isTronNetworkProvider.d.ts","sourceRoot":"","sources":["../../src/isTronNetworkProvider/isTronNetworkProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAExE;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,qBAAqB,oBACf,eAAe,KAC/B,eAAe,IAAI,mBAAuD,CAAC"}
|
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
import type { WalletAccount } from '@dynamic-labs-sdk/client';
|
|
2
2
|
import type { TronWalletAccount } from '../TronWalletAccount.types';
|
|
3
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* Type guard function to check if a wallet account is a Tron wallet account.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* const accounts = getWalletAccounts();
|
|
9
|
+
* const tronAccounts = accounts.filter(isTronWalletAccount);
|
|
10
|
+
* ```
|
|
11
|
+
*
|
|
12
|
+
* @param walletAccount - The wallet account to check.
|
|
13
|
+
* @returns True if the wallet account is a Tron wallet account, false otherwise.
|
|
14
|
+
* @see isTronNetworkProvider
|
|
15
|
+
* @see addTronExtension
|
|
16
|
+
* @notInstrumented
|
|
17
|
+
*/
|
|
4
18
|
export declare const isTronWalletAccount: (walletAccount: WalletAccount) => walletAccount is TronWalletAccount;
|
|
5
19
|
//# sourceMappingURL=isTronWalletAccount.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isTronWalletAccount.d.ts","sourceRoot":"","sources":["../../src/isTronWalletAccount/isTronWalletAccount.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEpE
|
|
1
|
+
{"version":3,"file":"isTronWalletAccount.d.ts","sourceRoot":"","sources":["../../src/isTronWalletAccount/isTronWalletAccount.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEpE;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,mBAAmB,kBACf,aAAa,KAC3B,aAAa,IAAI,iBAAmD,CAAC"}
|
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
import type { WalletProvider } from '@dynamic-labs-sdk/client/core';
|
|
2
2
|
import type { TronWalletProvider } from '../TronWalletProvider.types';
|
|
3
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* Type guard function to check if a wallet provider is a Tron wallet provider.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* if (isTronWalletProvider(provider)) {
|
|
9
|
+
* const tronWeb = await provider.getTronWeb();
|
|
10
|
+
* }
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* @param provider - The wallet provider to check.
|
|
14
|
+
* @returns True if the wallet provider is a Tron wallet provider, false otherwise.
|
|
15
|
+
* @see isTronWalletAccount
|
|
16
|
+
* @see addTronExtension
|
|
17
|
+
* @notInstrumented
|
|
18
|
+
*/
|
|
4
19
|
export declare const isTronWalletProvider: (provider: WalletProvider | TronWalletProvider) => provider is TronWalletProvider;
|
|
5
20
|
//# sourceMappingURL=isTronWalletProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isTronWalletProvider.d.ts","sourceRoot":"","sources":["../../src/isTronWalletProvider/isTronWalletProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE
|
|
1
|
+
{"version":3,"file":"isTronWalletProvider.d.ts","sourceRoot":"","sources":["../../src/isTronWalletProvider/isTronWalletProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE;;;;;;;;;;;;;;;GAeG;AAEH,eAAO,MAAM,oBAAoB,aACrB,cAAc,GAAG,kBAAkB,KAC5C,QAAQ,IAAI,kBAEd,CAAC"}
|
|
@@ -8,12 +8,24 @@ type SendTransactionParams = {
|
|
|
8
8
|
walletAccount: TronWalletAccount;
|
|
9
9
|
};
|
|
10
10
|
/**
|
|
11
|
-
* Sends a Tron transaction
|
|
12
|
-
*
|
|
13
|
-
* @
|
|
11
|
+
* Sends a Tron transaction.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const result = await sendTransaction({
|
|
16
|
+
* walletAccount: tronAccount,
|
|
17
|
+
* transaction: tronTransaction,
|
|
18
|
+
* });
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* @param params.transaction - The transaction to send.
|
|
22
|
+
* @param params.walletAccount - The wallet account to sign and send the transaction with.
|
|
14
23
|
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
15
|
-
* @returns A promise that resolves to the broadcast return of the signed transaction
|
|
16
|
-
|
|
24
|
+
* @returns A promise that resolves to the broadcast return of the signed transaction.
|
|
25
|
+
* @throws {NotTronProviderError} If the wallet account's provider is not a Tron provider.
|
|
26
|
+
* @see getTronWeb
|
|
27
|
+
* @see isTronWalletAccount
|
|
28
|
+
* @notInstrumented
|
|
17
29
|
*/
|
|
18
30
|
export declare const sendTransaction: ({ walletAccount, transaction }: SendTransactionParams, client?: import("@dynamic-labs-sdk/client").DynamicClient) => Promise<TronBroadcastReturnSignedTransaction>;
|
|
19
31
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sendTransaction.d.ts","sourceRoot":"","sources":["../../src/sendTransaction/sendTransaction.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,6BAA6B,CAAC;AAExF,KAAK,qBAAqB,GAAG;IAC3B,WAAW,EAAE;QACX,MAAM,EAAE,MAAM,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IACF,aAAa,EAAE,iBAAiB,CAAC;CAClC,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"sendTransaction.d.ts","sourceRoot":"","sources":["../../src/sendTransaction/sendTransaction.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,6BAA6B,CAAC;AAExF,KAAK,qBAAqB,GAAG;IAC3B,WAAW,EAAE;QACX,MAAM,EAAE,MAAM,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IACF,aAAa,EAAE,iBAAiB,CAAC;CAClC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,eAAe,mCACM,qBAAqB,gEAEpD,OAAO,CAAC,oCAAoC,CAsB9C,CAAC"}
|
|
@@ -6,7 +6,7 @@ let _noble_hashes_utils = require("@noble/hashes/utils");
|
|
|
6
6
|
|
|
7
7
|
//#region package.json
|
|
8
8
|
var name = "@dynamic-labs-sdk/tron";
|
|
9
|
-
var version = "1.
|
|
9
|
+
var version = "1.19.0";
|
|
10
10
|
|
|
11
11
|
//#endregion
|
|
12
12
|
//#region src/utils/constants.ts
|
|
@@ -45,12 +45,41 @@ const registerTronNetworkProviderBuilder = (client) => {
|
|
|
45
45
|
|
|
46
46
|
//#endregion
|
|
47
47
|
//#region src/isTronWalletAccount/isTronWalletAccount.ts
|
|
48
|
-
/**
|
|
48
|
+
/**
|
|
49
|
+
* Type guard function to check if a wallet account is a Tron wallet account.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```ts
|
|
53
|
+
* const accounts = getWalletAccounts();
|
|
54
|
+
* const tronAccounts = accounts.filter(isTronWalletAccount);
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* @param walletAccount - The wallet account to check.
|
|
58
|
+
* @returns True if the wallet account is a Tron wallet account, false otherwise.
|
|
59
|
+
* @see isTronNetworkProvider
|
|
60
|
+
* @see addTronExtension
|
|
61
|
+
* @notInstrumented
|
|
62
|
+
*/
|
|
49
63
|
const isTronWalletAccount = (walletAccount) => walletAccount.chain === "TRON";
|
|
50
64
|
|
|
51
65
|
//#endregion
|
|
52
66
|
//#region src/isTronWalletProvider/isTronWalletProvider.ts
|
|
53
|
-
/**
|
|
67
|
+
/**
|
|
68
|
+
* Type guard function to check if a wallet provider is a Tron wallet provider.
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```ts
|
|
72
|
+
* if (isTronWalletProvider(provider)) {
|
|
73
|
+
* const tronWeb = await provider.getTronWeb();
|
|
74
|
+
* }
|
|
75
|
+
* ```
|
|
76
|
+
*
|
|
77
|
+
* @param provider - The wallet provider to check.
|
|
78
|
+
* @returns True if the wallet provider is a Tron wallet provider, false otherwise.
|
|
79
|
+
* @see isTronWalletAccount
|
|
80
|
+
* @see addTronExtension
|
|
81
|
+
* @notInstrumented
|
|
82
|
+
*/
|
|
54
83
|
const isTronWalletProvider = (provider) => {
|
|
55
84
|
return provider.chain === "TRON";
|
|
56
85
|
};
|
|
@@ -307,4 +336,4 @@ Object.defineProperty(exports, 'version', {
|
|
|
307
336
|
return version;
|
|
308
337
|
}
|
|
309
338
|
});
|
|
310
|
-
//# sourceMappingURL=tronTransferAmount-
|
|
339
|
+
//# sourceMappingURL=tronTransferAmount-C48MZYe2.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tronTransferAmount-C48MZYe2.cjs","names":["TronWeb","InvalidParamError","normalizedValue: Record<string, string | number>","cleanContract: Record<string, unknown>","result: Record<string, unknown>","tronWebUtils","InvalidParamError","BaseError","InvalidParamError"],"sources":["../package.json","../src/utils/constants.ts","../src/utils/fetchTronBalance/fetchTronBalance.ts","../src/utils/createTronNetworkProvider/createTronNetworkProvider.ts","../src/registerTronNetworkProviderBuilder/registerTronNetworkProviderBuilder.ts","../src/isTronWalletAccount/isTronWalletAccount.ts","../src/isTronWalletProvider/isTronWalletProvider.ts","../src/utils/tronConfirmTransaction/tronConfirmTransaction.ts","../src/utils/normalizeDeserializedRawData/normalizeDeserializedRawData.ts","../src/utils/buildUnsignedTronSwapTransaction/buildUnsignedTronSwapTransaction.ts","../src/utils/tronExecuteSwapTransaction/tronExecuteSwapTransaction.ts","../src/errors/NotTronProviderError/NotTronProviderError.ts","../src/utils/tronTransferAmount/tronTransferAmount.ts"],"sourcesContent":["","// 1 TRX = 10^6 SUN (similar to wei for Ethereum)\nexport const SUN_PER_TRX = 1e6;\n","import type { NetworkData } from '@dynamic-labs-sdk/client';\nimport { TronWeb } from 'tronweb';\n\nimport { SUN_PER_TRX } from '../constants';\n\ntype FetchTronBalanceParams = {\n address: string;\n networkData: NetworkData;\n};\n\n/** @notInstrumented */\nexport const fetchTronBalance = async ({\n address,\n networkData,\n}: FetchTronBalanceParams): Promise<string | null> => {\n const tronWeb = new TronWeb({\n fullHost: networkData.rpcUrls.http[0],\n });\n\n const balanceInSun = await tronWeb.trx.getBalance(address);\n\n return (Number(balanceInSun) / SUN_PER_TRX).toString();\n};\n","import type { NetworkData } from '@dynamic-labs-sdk/client';\nimport { createBaseNetworkProvider } from '@dynamic-labs-sdk/client/core';\n\nimport type { TronNetworkProvider } from '../../TronNetworkProvider.types';\nimport { fetchTronBalance } from '../fetchTronBalance';\n\n/** @notInstrumented */\nexport const createTronNetworkProvider = (\n networkData: NetworkData\n): TronNetworkProvider => ({\n ...createBaseNetworkProvider('TRON', networkData),\n getBalance: async ({ address }) => ({\n balance: await fetchTronBalance({\n address,\n networkData,\n }),\n }),\n});\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { getNetworkProviderBuilderRegistry } from '@dynamic-labs-sdk/client/core';\n\nimport { createTronNetworkProvider } from '../utils/createTronNetworkProvider';\n\n/** @notInstrumented */\nexport const registerTronNetworkProviderBuilder = (\n client: DynamicClient\n): void => {\n const networkProviderBuilderRegistry =\n getNetworkProviderBuilderRegistry(client);\n\n // If the Tron network provider builder is already registered, return.\n if (networkProviderBuilderRegistry.get().get('TRON')) {\n return;\n }\n\n networkProviderBuilderRegistry.register({\n builder: createTronNetworkProvider,\n chain: 'TRON',\n });\n};\n","import type { WalletAccount } from '@dynamic-labs-sdk/client';\n\nimport type { TronWalletAccount } from '../TronWalletAccount.types';\n\n/**\n * Type guard function to check if a wallet account is a Tron wallet account.\n *\n * @example\n * ```ts\n * const accounts = getWalletAccounts();\n * const tronAccounts = accounts.filter(isTronWalletAccount);\n * ```\n *\n * @param walletAccount - The wallet account to check.\n * @returns True if the wallet account is a Tron wallet account, false otherwise.\n * @see isTronNetworkProvider\n * @see addTronExtension\n * @notInstrumented\n */\nexport const isTronWalletAccount = (\n walletAccount: WalletAccount\n): walletAccount is TronWalletAccount => walletAccount.chain === 'TRON';\n","import type { WalletProvider } from '@dynamic-labs-sdk/client/core';\n\nimport type { TronWalletProvider } from '../TronWalletProvider.types';\n\n/**\n * Type guard function to check if a wallet provider is a Tron wallet provider.\n *\n * @example\n * ```ts\n * if (isTronWalletProvider(provider)) {\n * const tronWeb = await provider.getTronWeb();\n * }\n * ```\n *\n * @param provider - The wallet provider to check.\n * @returns True if the wallet provider is a Tron wallet provider, false otherwise.\n * @see isTronWalletAccount\n * @see addTronExtension\n * @notInstrumented\n */\n// eslint-disable-next-line custom-rules/require-single-object-param\nexport const isTronWalletProvider = (\n provider: WalletProvider | TronWalletProvider\n): provider is TronWalletProvider => {\n return provider.chain === 'TRON';\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { InvalidParamError } from '@dynamic-labs-sdk/client';\nimport type { ConfirmTransactionParams } from '@dynamic-labs-sdk/client/core';\nimport { getWalletProviderFromWalletAccount } from '@dynamic-labs-sdk/client/core';\n\nimport { isTronWalletAccount } from '../../isTronWalletAccount';\nimport { isTronWalletProvider } from '../../isTronWalletProvider';\n\nconst POLLING_INTERVAL_MS = 3_000;\nconst MAX_POLLING_ATTEMPTS = 300;\n\n/**\n * Polls TronWeb until the transaction is included in a block (blockNumber is set).\n *\n * @param params.transactionHash - The transaction ID to confirm.\n * @param params.walletAccount - The wallet account used to retrieve TronWeb.\n * @param client - The Dynamic client instance.\n * @throws InvalidParamError if the wallet account or provider is not Tron.\n * @throws InvalidParamError if the transaction is not confirmed within the max attempts.\n * @notInstrumented\n */\nexport const tronConfirmTransaction = async (\n { transactionHash, walletAccount }: ConfirmTransactionParams,\n client: DynamicClient\n): Promise<void> => {\n if (!isTronWalletAccount(walletAccount)) {\n throw new InvalidParamError('Wallet account is not a Tron wallet account');\n }\n\n const provider = getWalletProviderFromWalletAccount(\n { walletAccount },\n client\n );\n\n if (!isTronWalletProvider(provider)) {\n throw new InvalidParamError('Wallet account is not a Tron wallet account');\n }\n\n const tronWeb = await provider.getTronWeb({ walletAccount });\n\n for (let attempt = 0; attempt < MAX_POLLING_ATTEMPTS; attempt++) {\n const txInfo = await tronWeb.trx.getTransactionInfo(transactionHash);\n\n if (txInfo.blockNumber) {\n return;\n }\n\n if (attempt < MAX_POLLING_ATTEMPTS - 1) {\n await new Promise<void>((resolve) =>\n setTimeout(resolve, POLLING_INTERVAL_MS)\n );\n }\n }\n\n throw new InvalidParamError(\n `Transaction ${transactionHash} was not confirmed after ${MAX_POLLING_ATTEMPTS} attempts`\n );\n};\n","/**\n * Fields in a TriggerSmartContract's `parameter.value` that default to 0 in\n * protobuf and are omitted by TronWeb's `createTransaction` when zero-valued.\n * Keeping them in the JSON causes wallet extensions to flag the transaction as\n * tampered, because the wallet's own protobuf→JSON decoder omits them.\n */\nconst OMITTABLE_ZERO_VALUE_FIELDS = new Set([\n 'call_token_value',\n 'call_value',\n 'token_id',\n]);\n\n/**\n * A contract entry inside `raw_data` as returned by TronWeb's\n * `deserializeTransaction`. Addresses and byte fields are UPPERCASE hex.\n */\ntype DeserializedContract = {\n Permission_id: number;\n parameter: {\n type_url: string;\n value: Record<string, string | number>;\n };\n type: string;\n};\n\n/**\n * The `raw_data` object returned by TronWeb's `deserializeTransaction`.\n * Contains extra default-value fields (data, fee_limit, scripts, auths) and\n * UPPERCASE hex for all byte fields — neither of which match the canonical\n * format that TronWeb's `createTransaction` produces.\n */\ntype DeserializedRawData = {\n auths: unknown[];\n contract: DeserializedContract[];\n data: string;\n expiration: number;\n fee_limit: number;\n ref_block_bytes: string;\n ref_block_hash: string;\n scripts: string;\n timestamp: number;\n};\n\n/**\n * Normalizes the `raw_data` object produced by TronWeb's\n * `deserializeTransaction` to match the canonical format of TronWeb's\n * `createTransaction` output.\n *\n * `deserializeTransaction` outputs UPPERCASE hex for all byte fields, includes\n * default-value fields (`data: ''`, `fee_limit: 0`, `scripts: ''`, `auths: []`,\n * `Permission_id: 0`), and adds extra keys not present in the original\n * transaction. Wallet extensions (TronLink, OKX, Bitget) validate the\n * `raw_data` JSON against `raw_data_hex` and reject transactions whose\n * structure deviates from the canonical format.\n *\n * @param rawData - The deserialized `raw_data` from `deserializeTransaction`.\n * @returns A cleaned `raw_data` structurally matching `createTransaction` output.\n * @notInstrumented\n */\nexport const normalizeDeserializedRawData = (\n rawData: DeserializedRawData,\n): Record<string, unknown> => {\n const contract = rawData.contract[0];\n const value = contract.parameter.value;\n\n const normalizedValue: Record<string, string | number> = {};\n\n for (const [key, val] of Object.entries(value)) {\n if (typeof val === 'string') {\n if (val.length > 0) {\n normalizedValue[key] = val.toLowerCase();\n }\n\n continue;\n }\n\n // Strip zero-valued protobuf-default fields that createTransaction omits.\n if (val === 0 && OMITTABLE_ZERO_VALUE_FIELDS.has(key)) {\n continue;\n }\n\n normalizedValue[key] = val;\n }\n\n const cleanContract: Record<string, unknown> = {\n parameter: {\n type_url: contract.parameter.type_url,\n value: normalizedValue,\n },\n type: contract.type,\n };\n\n // Permission_id 0 is the default; createTransaction omits it.\n if (contract.Permission_id) {\n cleanContract.Permission_id = contract.Permission_id;\n }\n\n const result: Record<string, unknown> = {\n contract: [cleanContract],\n expiration: rawData.expiration,\n ref_block_bytes: rawData.ref_block_bytes.toLowerCase(),\n ref_block_hash: rawData.ref_block_hash.toLowerCase(),\n timestamp: rawData.timestamp,\n };\n\n if (rawData.fee_limit) {\n result.fee_limit = rawData.fee_limit;\n }\n\n if (rawData.data && rawData.data.length > 0) {\n result.data = rawData.data.toLowerCase();\n }\n\n return result;\n};\n","import { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils';\nimport { utils as tronWebUtils } from 'tronweb';\n\nimport { normalizeDeserializedRawData } from '../normalizeDeserializedRawData';\n\n/** Unsigned Tron transaction in the shape TronWeb signers / wallets expect. */\nexport type UnsignedTronSwapTransaction = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n raw_data: any;\n raw_data_hex: string;\n txID: string;\n visible: boolean;\n};\n\n/**\n * Reconstructs a signable, broadcastable Tron transaction from the hex-encoded\n * `raw_data` protobuf in the swap payload — LiFi delivers only `rawDataHex`, so\n * we derive `txID` (SHA-256 of the raw_data bytes) and decode `raw_data` via\n * TronWeb (which signers/wallets read to display, sign, and broadcast).\n *\n * The decoded `raw_data` is normalized to match the canonical format that\n * TronWeb's `createTransaction` produces, because wallet extensions validate\n * the JSON structure against `raw_data_hex` and reject non-canonical formats.\n *\n * @param params.rawDataHex - Hex-encoded serialized Tron `raw_data` protobuf (`0x` optional).\n * @returns Unsigned tx: `{ raw_data, raw_data_hex, txID, visible }`.\n * @notInstrumented\n */\nexport const buildUnsignedTronSwapTransaction = ({\n rawDataHex,\n}: {\n rawDataHex: string;\n}): UnsignedTronSwapTransaction => {\n const normalizedRawDataHex = rawDataHex.replace(/^0x/, '');\n const txID = bytesToHex(sha256(hexToBytes(normalizedRawDataHex)));\n\n // Swaps / TRC-20 are TriggerSmartContract; native TRX is TransferContract.\n // deserializeTransaction throws on type mismatch, so fall through to the\n // native type if the smart-contract decode rejects this hex.\n let decoded;\n try {\n decoded = tronWebUtils.deserializeTx.deserializeTransaction(\n 'TriggerSmartContract',\n normalizedRawDataHex\n );\n } catch {\n decoded = tronWebUtils.deserializeTx.deserializeTransaction(\n 'TransferContract',\n normalizedRawDataHex\n );\n }\n // The decoder returns the raw_data object (some versions wrap it in a tuple\n // with the raw contract value as the second element).\n const rawData = Array.isArray(decoded) ? decoded[0] : decoded;\n\n return {\n raw_data: normalizeDeserializedRawData(rawData),\n raw_data_hex: normalizedRawDataHex,\n txID,\n visible: false,\n };\n};\n","import {\n type DynamicClient,\n InvalidParamError,\n} from '@dynamic-labs-sdk/client';\nimport type {\n ExecuteSwapTransactionParams,\n ExecuteSwapTransactionResult,\n} from '@dynamic-labs-sdk/client/core';\nimport { getWalletProviderFromWalletAccount } from '@dynamic-labs-sdk/client/core';\n\nimport { isTronWalletAccount } from '../../isTronWalletAccount';\nimport { isTronWalletProvider } from '../../isTronWalletProvider';\nimport { buildUnsignedTronSwapTransaction } from '../buildUnsignedTronSwapTransaction';\n\n/**\n * Local widening of `SwapSigningPayload` to add `tronTransaction` (LiFi's\n * `raw_data` hex), which the generated `@dynamic-labs/sdk-api-core` type doesn't\n * carry yet — drop this once that published package is regenerated.\n * `serializedTransaction` is the legacy (full-tx JSON) shape.\n */\ntype TronSwapSigningPayload = {\n serializedTransaction?: string;\n tronTransaction?: {\n rawDataHex: string;\n to: string;\n value: string;\n };\n};\n\n/**\n * Executes a Tron swap transaction by reconstructing the transaction from the\n * signing payload, signing it with TronWeb, and broadcasting it.\n *\n * 1. Validates that the wallet account is a Tron wallet account\n * 2. Builds the unsigned transaction from the payload — preferring the\n * `tronTransaction.rawDataHex` shape, falling back to the legacy\n * `serializedTransaction` JSON\n * 3. Signs and broadcasts via TronWeb\n *\n * @param params.signingPayload - The chain-aware signing payload containing `tronTransaction` (or legacy `serializedTransaction`).\n * @param params.walletAccount - The wallet account used to sign and send the transaction.\n * @param params.onStepChange - Optional callback invoked with `'transaction'` when the signing step begins.\n * @param client - The Dynamic client instance.\n * @returns The transaction hash from the broadcast result.\n * @notInstrumented\n */\nexport const tronExecuteSwapTransaction = async (\n { onStepChange, signingPayload, walletAccount }: ExecuteSwapTransactionParams,\n client: DynamicClient\n): Promise<ExecuteSwapTransactionResult> => {\n const provider = getWalletProviderFromWalletAccount(\n { walletAccount },\n client\n );\n\n if (!isTronWalletAccount(walletAccount) || !isTronWalletProvider(provider)) {\n throw new InvalidParamError('Wallet account is not a Tron wallet account');\n }\n\n const { serializedTransaction, tronTransaction } =\n signingPayload as TronSwapSigningPayload;\n\n if (!tronTransaction && !serializedTransaction) {\n throw new InvalidParamError(\n 'Signing payload is missing Tron transaction data'\n );\n }\n\n onStepChange?.('transaction');\n\n const tronWeb = await provider.getTronWeb({ walletAccount });\n\n const unsignedTransaction = tronTransaction\n ? buildUnsignedTronSwapTransaction({\n rawDataHex: tronTransaction.rawDataHex,\n })\n : JSON.parse(serializedTransaction as string);\n\n const signedTransaction = await tronWeb.trx.sign(unsignedTransaction);\n const broadcastResult = await tronWeb.trx.sendRawTransaction(\n signedTransaction\n );\n\n return { transactionHash: broadcastResult.txid };\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class NotTronProviderError extends BaseError {\n public readonly providerKey: string;\n\n constructor(params: { providerKey: string }) {\n super({\n cause: null,\n code: 'not_tron_provider_error',\n docsUrl: null,\n name: 'NotTronProviderError',\n shortMessage: 'Provider is not a Tron wallet provider',\n });\n\n this.providerKey = params.providerKey;\n }\n}\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { InvalidParamError } from '@dynamic-labs-sdk/client';\nimport {\n type TransferAmountParams,\n getWalletProviderFromWalletAccount,\n parseAmountToSmallestUnit,\n} from '@dynamic-labs-sdk/client/core';\n\nimport { NotTronProviderError } from '../../errors/NotTronProviderError';\nimport { isTronWalletAccount } from '../../isTronWalletAccount';\nimport { isTronWalletProvider } from '../../isTronWalletProvider';\n\nconst TRX_DECIMALS = 6;\n\n/**\n * Transfers native TRX or TRC20 tokens from one wallet to another.\n *\n * Converts the human-readable amount string to the smallest unit (SUN for TRX,\n * or the appropriate unit for TRC20 tokens) using string-based arithmetic\n * to avoid floating-point precision issues.\n * @notInstrumented\n */\nexport const tronTransferAmount = async (\n { amount, recipient, token, walletAccount }: TransferAmountParams,\n client: DynamicClient\n): Promise<{ transactionHash: string }> => {\n if (!isTronWalletAccount(walletAccount)) {\n throw new InvalidParamError(\n 'Wallet account is not a Tron wallet account'\n );\n }\n\n const provider = getWalletProviderFromWalletAccount(\n { walletAccount },\n client\n );\n\n if (!isTronWalletProvider(provider)) {\n throw new NotTronProviderError({ providerKey: provider.key });\n }\n\n const tronWeb = await provider.getTronWeb({ walletAccount });\n\n if (token?.address) {\n const decimals = token.decimals ?? TRX_DECIMALS;\n const smallestUnitAmount = parseAmountToSmallestUnit({\n amount,\n decimals,\n });\n\n const contract = await tronWeb.contract().at(token.address);\n const result = await contract.transfer(recipient, smallestUnitAmount).send();\n\n return { transactionHash: result };\n }\n\n const sunAmount = parseAmountToSmallestUnit({\n amount,\n decimals: TRX_DECIMALS,\n });\n\n const result = await tronWeb.trx.sendTransaction(\n recipient,\n Number(sunAmount),\n { address: walletAccount.address }\n );\n\n return { transactionHash: result.txid };\n};\n"],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { bytesToHex, hexToBytes } from "@noble/hashes/utils";
|
|
|
6
6
|
|
|
7
7
|
//#region package.json
|
|
8
8
|
var name = "@dynamic-labs-sdk/tron";
|
|
9
|
-
var version = "1.
|
|
9
|
+
var version = "1.19.0";
|
|
10
10
|
|
|
11
11
|
//#endregion
|
|
12
12
|
//#region src/utils/constants.ts
|
|
@@ -45,12 +45,41 @@ const registerTronNetworkProviderBuilder = (client) => {
|
|
|
45
45
|
|
|
46
46
|
//#endregion
|
|
47
47
|
//#region src/isTronWalletAccount/isTronWalletAccount.ts
|
|
48
|
-
/**
|
|
48
|
+
/**
|
|
49
|
+
* Type guard function to check if a wallet account is a Tron wallet account.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```ts
|
|
53
|
+
* const accounts = getWalletAccounts();
|
|
54
|
+
* const tronAccounts = accounts.filter(isTronWalletAccount);
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* @param walletAccount - The wallet account to check.
|
|
58
|
+
* @returns True if the wallet account is a Tron wallet account, false otherwise.
|
|
59
|
+
* @see isTronNetworkProvider
|
|
60
|
+
* @see addTronExtension
|
|
61
|
+
* @notInstrumented
|
|
62
|
+
*/
|
|
49
63
|
const isTronWalletAccount = (walletAccount) => walletAccount.chain === "TRON";
|
|
50
64
|
|
|
51
65
|
//#endregion
|
|
52
66
|
//#region src/isTronWalletProvider/isTronWalletProvider.ts
|
|
53
|
-
/**
|
|
67
|
+
/**
|
|
68
|
+
* Type guard function to check if a wallet provider is a Tron wallet provider.
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```ts
|
|
72
|
+
* if (isTronWalletProvider(provider)) {
|
|
73
|
+
* const tronWeb = await provider.getTronWeb();
|
|
74
|
+
* }
|
|
75
|
+
* ```
|
|
76
|
+
*
|
|
77
|
+
* @param provider - The wallet provider to check.
|
|
78
|
+
* @returns True if the wallet provider is a Tron wallet provider, false otherwise.
|
|
79
|
+
* @see isTronWalletAccount
|
|
80
|
+
* @see addTronExtension
|
|
81
|
+
* @notInstrumented
|
|
82
|
+
*/
|
|
54
83
|
const isTronWalletProvider = (provider) => {
|
|
55
84
|
return provider.chain === "TRON";
|
|
56
85
|
};
|
|
@@ -254,4 +283,4 @@ const tronTransferAmount = async ({ amount, recipient, token, walletAccount }, c
|
|
|
254
283
|
|
|
255
284
|
//#endregion
|
|
256
285
|
export { isTronWalletProvider as a, name as c, tronConfirmTransaction as i, version as l, NotTronProviderError as n, isTronWalletAccount as o, tronExecuteSwapTransaction as r, registerTronNetworkProviderBuilder as s, tronTransferAmount as t };
|
|
257
|
-
//# sourceMappingURL=tronTransferAmount-
|
|
286
|
+
//# sourceMappingURL=tronTransferAmount-D6YcQFhZ.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tronTransferAmount-D6YcQFhZ.esm.js","names":["normalizedValue: Record<string, string | number>","cleanContract: Record<string, unknown>","result: Record<string, unknown>","tronWebUtils"],"sources":["../package.json","../src/utils/constants.ts","../src/utils/fetchTronBalance/fetchTronBalance.ts","../src/utils/createTronNetworkProvider/createTronNetworkProvider.ts","../src/registerTronNetworkProviderBuilder/registerTronNetworkProviderBuilder.ts","../src/isTronWalletAccount/isTronWalletAccount.ts","../src/isTronWalletProvider/isTronWalletProvider.ts","../src/utils/tronConfirmTransaction/tronConfirmTransaction.ts","../src/utils/normalizeDeserializedRawData/normalizeDeserializedRawData.ts","../src/utils/buildUnsignedTronSwapTransaction/buildUnsignedTronSwapTransaction.ts","../src/utils/tronExecuteSwapTransaction/tronExecuteSwapTransaction.ts","../src/errors/NotTronProviderError/NotTronProviderError.ts","../src/utils/tronTransferAmount/tronTransferAmount.ts"],"sourcesContent":["","// 1 TRX = 10^6 SUN (similar to wei for Ethereum)\nexport const SUN_PER_TRX = 1e6;\n","import type { NetworkData } from '@dynamic-labs-sdk/client';\nimport { TronWeb } from 'tronweb';\n\nimport { SUN_PER_TRX } from '../constants';\n\ntype FetchTronBalanceParams = {\n address: string;\n networkData: NetworkData;\n};\n\n/** @notInstrumented */\nexport const fetchTronBalance = async ({\n address,\n networkData,\n}: FetchTronBalanceParams): Promise<string | null> => {\n const tronWeb = new TronWeb({\n fullHost: networkData.rpcUrls.http[0],\n });\n\n const balanceInSun = await tronWeb.trx.getBalance(address);\n\n return (Number(balanceInSun) / SUN_PER_TRX).toString();\n};\n","import type { NetworkData } from '@dynamic-labs-sdk/client';\nimport { createBaseNetworkProvider } from '@dynamic-labs-sdk/client/core';\n\nimport type { TronNetworkProvider } from '../../TronNetworkProvider.types';\nimport { fetchTronBalance } from '../fetchTronBalance';\n\n/** @notInstrumented */\nexport const createTronNetworkProvider = (\n networkData: NetworkData\n): TronNetworkProvider => ({\n ...createBaseNetworkProvider('TRON', networkData),\n getBalance: async ({ address }) => ({\n balance: await fetchTronBalance({\n address,\n networkData,\n }),\n }),\n});\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { getNetworkProviderBuilderRegistry } from '@dynamic-labs-sdk/client/core';\n\nimport { createTronNetworkProvider } from '../utils/createTronNetworkProvider';\n\n/** @notInstrumented */\nexport const registerTronNetworkProviderBuilder = (\n client: DynamicClient\n): void => {\n const networkProviderBuilderRegistry =\n getNetworkProviderBuilderRegistry(client);\n\n // If the Tron network provider builder is already registered, return.\n if (networkProviderBuilderRegistry.get().get('TRON')) {\n return;\n }\n\n networkProviderBuilderRegistry.register({\n builder: createTronNetworkProvider,\n chain: 'TRON',\n });\n};\n","import type { WalletAccount } from '@dynamic-labs-sdk/client';\n\nimport type { TronWalletAccount } from '../TronWalletAccount.types';\n\n/**\n * Type guard function to check if a wallet account is a Tron wallet account.\n *\n * @example\n * ```ts\n * const accounts = getWalletAccounts();\n * const tronAccounts = accounts.filter(isTronWalletAccount);\n * ```\n *\n * @param walletAccount - The wallet account to check.\n * @returns True if the wallet account is a Tron wallet account, false otherwise.\n * @see isTronNetworkProvider\n * @see addTronExtension\n * @notInstrumented\n */\nexport const isTronWalletAccount = (\n walletAccount: WalletAccount\n): walletAccount is TronWalletAccount => walletAccount.chain === 'TRON';\n","import type { WalletProvider } from '@dynamic-labs-sdk/client/core';\n\nimport type { TronWalletProvider } from '../TronWalletProvider.types';\n\n/**\n * Type guard function to check if a wallet provider is a Tron wallet provider.\n *\n * @example\n * ```ts\n * if (isTronWalletProvider(provider)) {\n * const tronWeb = await provider.getTronWeb();\n * }\n * ```\n *\n * @param provider - The wallet provider to check.\n * @returns True if the wallet provider is a Tron wallet provider, false otherwise.\n * @see isTronWalletAccount\n * @see addTronExtension\n * @notInstrumented\n */\n// eslint-disable-next-line custom-rules/require-single-object-param\nexport const isTronWalletProvider = (\n provider: WalletProvider | TronWalletProvider\n): provider is TronWalletProvider => {\n return provider.chain === 'TRON';\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { InvalidParamError } from '@dynamic-labs-sdk/client';\nimport type { ConfirmTransactionParams } from '@dynamic-labs-sdk/client/core';\nimport { getWalletProviderFromWalletAccount } from '@dynamic-labs-sdk/client/core';\n\nimport { isTronWalletAccount } from '../../isTronWalletAccount';\nimport { isTronWalletProvider } from '../../isTronWalletProvider';\n\nconst POLLING_INTERVAL_MS = 3_000;\nconst MAX_POLLING_ATTEMPTS = 300;\n\n/**\n * Polls TronWeb until the transaction is included in a block (blockNumber is set).\n *\n * @param params.transactionHash - The transaction ID to confirm.\n * @param params.walletAccount - The wallet account used to retrieve TronWeb.\n * @param client - The Dynamic client instance.\n * @throws InvalidParamError if the wallet account or provider is not Tron.\n * @throws InvalidParamError if the transaction is not confirmed within the max attempts.\n * @notInstrumented\n */\nexport const tronConfirmTransaction = async (\n { transactionHash, walletAccount }: ConfirmTransactionParams,\n client: DynamicClient\n): Promise<void> => {\n if (!isTronWalletAccount(walletAccount)) {\n throw new InvalidParamError('Wallet account is not a Tron wallet account');\n }\n\n const provider = getWalletProviderFromWalletAccount(\n { walletAccount },\n client\n );\n\n if (!isTronWalletProvider(provider)) {\n throw new InvalidParamError('Wallet account is not a Tron wallet account');\n }\n\n const tronWeb = await provider.getTronWeb({ walletAccount });\n\n for (let attempt = 0; attempt < MAX_POLLING_ATTEMPTS; attempt++) {\n const txInfo = await tronWeb.trx.getTransactionInfo(transactionHash);\n\n if (txInfo.blockNumber) {\n return;\n }\n\n if (attempt < MAX_POLLING_ATTEMPTS - 1) {\n await new Promise<void>((resolve) =>\n setTimeout(resolve, POLLING_INTERVAL_MS)\n );\n }\n }\n\n throw new InvalidParamError(\n `Transaction ${transactionHash} was not confirmed after ${MAX_POLLING_ATTEMPTS} attempts`\n );\n};\n","/**\n * Fields in a TriggerSmartContract's `parameter.value` that default to 0 in\n * protobuf and are omitted by TronWeb's `createTransaction` when zero-valued.\n * Keeping them in the JSON causes wallet extensions to flag the transaction as\n * tampered, because the wallet's own protobuf→JSON decoder omits them.\n */\nconst OMITTABLE_ZERO_VALUE_FIELDS = new Set([\n 'call_token_value',\n 'call_value',\n 'token_id',\n]);\n\n/**\n * A contract entry inside `raw_data` as returned by TronWeb's\n * `deserializeTransaction`. Addresses and byte fields are UPPERCASE hex.\n */\ntype DeserializedContract = {\n Permission_id: number;\n parameter: {\n type_url: string;\n value: Record<string, string | number>;\n };\n type: string;\n};\n\n/**\n * The `raw_data` object returned by TronWeb's `deserializeTransaction`.\n * Contains extra default-value fields (data, fee_limit, scripts, auths) and\n * UPPERCASE hex for all byte fields — neither of which match the canonical\n * format that TronWeb's `createTransaction` produces.\n */\ntype DeserializedRawData = {\n auths: unknown[];\n contract: DeserializedContract[];\n data: string;\n expiration: number;\n fee_limit: number;\n ref_block_bytes: string;\n ref_block_hash: string;\n scripts: string;\n timestamp: number;\n};\n\n/**\n * Normalizes the `raw_data` object produced by TronWeb's\n * `deserializeTransaction` to match the canonical format of TronWeb's\n * `createTransaction` output.\n *\n * `deserializeTransaction` outputs UPPERCASE hex for all byte fields, includes\n * default-value fields (`data: ''`, `fee_limit: 0`, `scripts: ''`, `auths: []`,\n * `Permission_id: 0`), and adds extra keys not present in the original\n * transaction. Wallet extensions (TronLink, OKX, Bitget) validate the\n * `raw_data` JSON against `raw_data_hex` and reject transactions whose\n * structure deviates from the canonical format.\n *\n * @param rawData - The deserialized `raw_data` from `deserializeTransaction`.\n * @returns A cleaned `raw_data` structurally matching `createTransaction` output.\n * @notInstrumented\n */\nexport const normalizeDeserializedRawData = (\n rawData: DeserializedRawData,\n): Record<string, unknown> => {\n const contract = rawData.contract[0];\n const value = contract.parameter.value;\n\n const normalizedValue: Record<string, string | number> = {};\n\n for (const [key, val] of Object.entries(value)) {\n if (typeof val === 'string') {\n if (val.length > 0) {\n normalizedValue[key] = val.toLowerCase();\n }\n\n continue;\n }\n\n // Strip zero-valued protobuf-default fields that createTransaction omits.\n if (val === 0 && OMITTABLE_ZERO_VALUE_FIELDS.has(key)) {\n continue;\n }\n\n normalizedValue[key] = val;\n }\n\n const cleanContract: Record<string, unknown> = {\n parameter: {\n type_url: contract.parameter.type_url,\n value: normalizedValue,\n },\n type: contract.type,\n };\n\n // Permission_id 0 is the default; createTransaction omits it.\n if (contract.Permission_id) {\n cleanContract.Permission_id = contract.Permission_id;\n }\n\n const result: Record<string, unknown> = {\n contract: [cleanContract],\n expiration: rawData.expiration,\n ref_block_bytes: rawData.ref_block_bytes.toLowerCase(),\n ref_block_hash: rawData.ref_block_hash.toLowerCase(),\n timestamp: rawData.timestamp,\n };\n\n if (rawData.fee_limit) {\n result.fee_limit = rawData.fee_limit;\n }\n\n if (rawData.data && rawData.data.length > 0) {\n result.data = rawData.data.toLowerCase();\n }\n\n return result;\n};\n","import { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils';\nimport { utils as tronWebUtils } from 'tronweb';\n\nimport { normalizeDeserializedRawData } from '../normalizeDeserializedRawData';\n\n/** Unsigned Tron transaction in the shape TronWeb signers / wallets expect. */\nexport type UnsignedTronSwapTransaction = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n raw_data: any;\n raw_data_hex: string;\n txID: string;\n visible: boolean;\n};\n\n/**\n * Reconstructs a signable, broadcastable Tron transaction from the hex-encoded\n * `raw_data` protobuf in the swap payload — LiFi delivers only `rawDataHex`, so\n * we derive `txID` (SHA-256 of the raw_data bytes) and decode `raw_data` via\n * TronWeb (which signers/wallets read to display, sign, and broadcast).\n *\n * The decoded `raw_data` is normalized to match the canonical format that\n * TronWeb's `createTransaction` produces, because wallet extensions validate\n * the JSON structure against `raw_data_hex` and reject non-canonical formats.\n *\n * @param params.rawDataHex - Hex-encoded serialized Tron `raw_data` protobuf (`0x` optional).\n * @returns Unsigned tx: `{ raw_data, raw_data_hex, txID, visible }`.\n * @notInstrumented\n */\nexport const buildUnsignedTronSwapTransaction = ({\n rawDataHex,\n}: {\n rawDataHex: string;\n}): UnsignedTronSwapTransaction => {\n const normalizedRawDataHex = rawDataHex.replace(/^0x/, '');\n const txID = bytesToHex(sha256(hexToBytes(normalizedRawDataHex)));\n\n // Swaps / TRC-20 are TriggerSmartContract; native TRX is TransferContract.\n // deserializeTransaction throws on type mismatch, so fall through to the\n // native type if the smart-contract decode rejects this hex.\n let decoded;\n try {\n decoded = tronWebUtils.deserializeTx.deserializeTransaction(\n 'TriggerSmartContract',\n normalizedRawDataHex\n );\n } catch {\n decoded = tronWebUtils.deserializeTx.deserializeTransaction(\n 'TransferContract',\n normalizedRawDataHex\n );\n }\n // The decoder returns the raw_data object (some versions wrap it in a tuple\n // with the raw contract value as the second element).\n const rawData = Array.isArray(decoded) ? decoded[0] : decoded;\n\n return {\n raw_data: normalizeDeserializedRawData(rawData),\n raw_data_hex: normalizedRawDataHex,\n txID,\n visible: false,\n };\n};\n","import {\n type DynamicClient,\n InvalidParamError,\n} from '@dynamic-labs-sdk/client';\nimport type {\n ExecuteSwapTransactionParams,\n ExecuteSwapTransactionResult,\n} from '@dynamic-labs-sdk/client/core';\nimport { getWalletProviderFromWalletAccount } from '@dynamic-labs-sdk/client/core';\n\nimport { isTronWalletAccount } from '../../isTronWalletAccount';\nimport { isTronWalletProvider } from '../../isTronWalletProvider';\nimport { buildUnsignedTronSwapTransaction } from '../buildUnsignedTronSwapTransaction';\n\n/**\n * Local widening of `SwapSigningPayload` to add `tronTransaction` (LiFi's\n * `raw_data` hex), which the generated `@dynamic-labs/sdk-api-core` type doesn't\n * carry yet — drop this once that published package is regenerated.\n * `serializedTransaction` is the legacy (full-tx JSON) shape.\n */\ntype TronSwapSigningPayload = {\n serializedTransaction?: string;\n tronTransaction?: {\n rawDataHex: string;\n to: string;\n value: string;\n };\n};\n\n/**\n * Executes a Tron swap transaction by reconstructing the transaction from the\n * signing payload, signing it with TronWeb, and broadcasting it.\n *\n * 1. Validates that the wallet account is a Tron wallet account\n * 2. Builds the unsigned transaction from the payload — preferring the\n * `tronTransaction.rawDataHex` shape, falling back to the legacy\n * `serializedTransaction` JSON\n * 3. Signs and broadcasts via TronWeb\n *\n * @param params.signingPayload - The chain-aware signing payload containing `tronTransaction` (or legacy `serializedTransaction`).\n * @param params.walletAccount - The wallet account used to sign and send the transaction.\n * @param params.onStepChange - Optional callback invoked with `'transaction'` when the signing step begins.\n * @param client - The Dynamic client instance.\n * @returns The transaction hash from the broadcast result.\n * @notInstrumented\n */\nexport const tronExecuteSwapTransaction = async (\n { onStepChange, signingPayload, walletAccount }: ExecuteSwapTransactionParams,\n client: DynamicClient\n): Promise<ExecuteSwapTransactionResult> => {\n const provider = getWalletProviderFromWalletAccount(\n { walletAccount },\n client\n );\n\n if (!isTronWalletAccount(walletAccount) || !isTronWalletProvider(provider)) {\n throw new InvalidParamError('Wallet account is not a Tron wallet account');\n }\n\n const { serializedTransaction, tronTransaction } =\n signingPayload as TronSwapSigningPayload;\n\n if (!tronTransaction && !serializedTransaction) {\n throw new InvalidParamError(\n 'Signing payload is missing Tron transaction data'\n );\n }\n\n onStepChange?.('transaction');\n\n const tronWeb = await provider.getTronWeb({ walletAccount });\n\n const unsignedTransaction = tronTransaction\n ? buildUnsignedTronSwapTransaction({\n rawDataHex: tronTransaction.rawDataHex,\n })\n : JSON.parse(serializedTransaction as string);\n\n const signedTransaction = await tronWeb.trx.sign(unsignedTransaction);\n const broadcastResult = await tronWeb.trx.sendRawTransaction(\n signedTransaction\n );\n\n return { transactionHash: broadcastResult.txid };\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class NotTronProviderError extends BaseError {\n public readonly providerKey: string;\n\n constructor(params: { providerKey: string }) {\n super({\n cause: null,\n code: 'not_tron_provider_error',\n docsUrl: null,\n name: 'NotTronProviderError',\n shortMessage: 'Provider is not a Tron wallet provider',\n });\n\n this.providerKey = params.providerKey;\n }\n}\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { InvalidParamError } from '@dynamic-labs-sdk/client';\nimport {\n type TransferAmountParams,\n getWalletProviderFromWalletAccount,\n parseAmountToSmallestUnit,\n} from '@dynamic-labs-sdk/client/core';\n\nimport { NotTronProviderError } from '../../errors/NotTronProviderError';\nimport { isTronWalletAccount } from '../../isTronWalletAccount';\nimport { isTronWalletProvider } from '../../isTronWalletProvider';\n\nconst TRX_DECIMALS = 6;\n\n/**\n * Transfers native TRX or TRC20 tokens from one wallet to another.\n *\n * Converts the human-readable amount string to the smallest unit (SUN for TRX,\n * or the appropriate unit for TRC20 tokens) using string-based arithmetic\n * to avoid floating-point precision issues.\n * @notInstrumented\n */\nexport const tronTransferAmount = async (\n { amount, recipient, token, walletAccount }: TransferAmountParams,\n client: DynamicClient\n): Promise<{ transactionHash: string }> => {\n if (!isTronWalletAccount(walletAccount)) {\n throw new InvalidParamError(\n 'Wallet account is not a Tron wallet account'\n );\n }\n\n const provider = getWalletProviderFromWalletAccount(\n { walletAccount },\n client\n );\n\n if (!isTronWalletProvider(provider)) {\n throw new NotTronProviderError({ providerKey: provider.key });\n }\n\n const tronWeb = await provider.getTronWeb({ walletAccount });\n\n if (token?.address) {\n const decimals = token.decimals ?? TRX_DECIMALS;\n const smallestUnitAmount = parseAmountToSmallestUnit({\n amount,\n decimals,\n });\n\n const contract = await tronWeb.contract().at(token.address);\n const result = await contract.transfer(recipient, smallestUnitAmount).send();\n\n return { transactionHash: result };\n }\n\n const sunAmount = parseAmountToSmallestUnit({\n amount,\n decimals: TRX_DECIMALS,\n });\n\n const result = await tronWeb.trx.sendTransaction(\n recipient,\n Number(sunAmount),\n { address: walletAccount.address }\n );\n\n return { transactionHash: result.txid };\n};\n"],"mappings":"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"}
|