@layerzerolabs/lz-corekit-tron 3.0.16 → 3.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/index.cjs +6 -27
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +0 -16
- package/dist/index.d.ts +0 -16
- package/dist/index.mjs +6 -27
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @layerzerolabs/lz-corekit-tron
|
|
2
2
|
|
|
3
|
+
## 3.0.17
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 40f2269: islander mainnet
|
|
8
|
+
- 40f2269: testnets
|
|
9
|
+
- Updated dependencies [40f2269]
|
|
10
|
+
- Updated dependencies [40f2269]
|
|
11
|
+
- @layerzerolabs/lz-core@3.0.17
|
|
12
|
+
- @layerzerolabs/tron-utilities@3.0.17
|
|
13
|
+
- @layerzerolabs/lz-utilities@3.0.17
|
|
14
|
+
|
|
3
15
|
## 3.0.16
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/dist/index.cjs
CHANGED
|
@@ -13,12 +13,11 @@ var TronWeb5__default = /*#__PURE__*/_interopDefault(TronWeb5);
|
|
|
13
13
|
var __defProp = Object.defineProperty;
|
|
14
14
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
15
15
|
var __decorateClass = (decorators, target, key, kind) => {
|
|
16
|
-
var result =
|
|
16
|
+
var result = __getOwnPropDesc(target, key) ;
|
|
17
17
|
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
18
18
|
if (decorator = decorators[i])
|
|
19
|
-
result = (
|
|
20
|
-
if (
|
|
21
|
-
__defProp(target, key, result);
|
|
19
|
+
result = (decorator(target, key, result) ) || result;
|
|
20
|
+
if (result) __defProp(target, key, result);
|
|
22
21
|
return result;
|
|
23
22
|
};
|
|
24
23
|
function ensureJsonRpcUrlPostfix(url) {
|
|
@@ -238,7 +237,7 @@ __decorateClass([
|
|
|
238
237
|
return JSON.stringify(provider);
|
|
239
238
|
}
|
|
240
239
|
})
|
|
241
|
-
], TronProvider.prototype, "buildTronWebFrom"
|
|
240
|
+
], TronProvider.prototype, "buildTronWebFrom");
|
|
242
241
|
var TronWebProvider = class {
|
|
243
242
|
/**
|
|
244
243
|
* Creates a new TronWebProvider.
|
|
@@ -618,22 +617,12 @@ var _TronSigner = class _TronSigner {
|
|
|
618
617
|
}
|
|
619
618
|
return true;
|
|
620
619
|
}
|
|
621
|
-
/**
|
|
622
|
-
* Builds a transaction.
|
|
623
|
-
*
|
|
624
|
-
* @param {unknown} buildTxRequest - The transaction request to build.
|
|
625
|
-
* @returns {Promise<TransactionRequest>} A promise that resolves to the built transaction request.
|
|
626
|
-
* @throws {Error} Method not implemented.
|
|
627
|
-
*/
|
|
628
|
-
async buildTransaction(buildTxRequest) {
|
|
629
|
-
return Promise.reject(new Error("Method not implemented."));
|
|
630
|
-
}
|
|
631
620
|
};
|
|
632
621
|
__decorateClass([
|
|
633
622
|
lzUtilities.Memoizee({
|
|
634
623
|
normalizer: (args) => JSON.stringify(args)
|
|
635
624
|
})
|
|
636
|
-
], _TronSigner, "createTronWeb"
|
|
625
|
+
], _TronSigner, "createTronWeb");
|
|
637
626
|
var TronSigner = _TronSigner;
|
|
638
627
|
var TronWebSigner = class _TronWebSigner {
|
|
639
628
|
/**
|
|
@@ -787,21 +776,11 @@ var TronWebSigner = class _TronWebSigner {
|
|
|
787
776
|
}
|
|
788
777
|
return true;
|
|
789
778
|
}
|
|
790
|
-
/**
|
|
791
|
-
* Builds a transaction.
|
|
792
|
-
*
|
|
793
|
-
* @param {unknown} buildTxRequest - The transaction request to build.
|
|
794
|
-
* @returns {Promise<TransactionRequest>} A promise that resolves to the built transaction request.
|
|
795
|
-
* @throws {Error} Method not implemented.
|
|
796
|
-
*/
|
|
797
|
-
async buildTransaction(buildTxRequest) {
|
|
798
|
-
return Promise.reject(new Error("Method not implemented."));
|
|
799
|
-
}
|
|
800
779
|
};
|
|
801
780
|
|
|
802
781
|
exports.TronProvider = TronProvider;
|
|
803
782
|
exports.TronSigner = TronSigner;
|
|
804
783
|
exports.TronWebProvider = TronWebProvider;
|
|
805
784
|
exports.TronWebSigner = TronWebSigner;
|
|
806
|
-
//# sourceMappingURL=
|
|
785
|
+
//# sourceMappingURL=index.cjs.map
|
|
807
786
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/providers/tron.ts","../src/utils/tron.ts","../src/providers/tronweb.ts","../src/signers/tron.ts","../src/signers/tronweb.ts"],"names":["ethers","TronWeb","Block","BlockWithTransactions","TransactionPending","TransactionReceipt","TransactionResponse","SignedTransaction","Memoizee","sendTronTransaction","trim0x","signTronTx"],"mappings":"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","sourcesContent":["import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\nimport {\n Block,\n BlockTag,\n BlockWithTransactions,\n Finality,\n Provider,\n SignedTransaction,\n TransactionPending,\n TransactionReceipt,\n TransactionResponse,\n} from '@layerzerolabs/lz-core'\nimport { Memoizee } from '@layerzerolabs/lz-utilities'\nimport { StrategyFactory, sendTronTransaction } from '@layerzerolabs/tron-utilities'\n\nimport { toEtherFormat, toValidHash } from '../utils/tron'\n\n/**\n * TronProvider is a wrapper around TronWeb that implements the Provider interface\n * It is implemented using ethers.js\n */\nexport class TronProvider implements Provider {\n nativeProvider: ethers.providers.StaticJsonRpcProvider\n\n /**\n * Creates an instance of TronProvider.\n *\n * @param {string} url - RPC endpoint of the Tron full node, e.g. 'https://api.trongrid.io'\n * @param {string} [apiKey] - The API key for accessing the Tron full node (optional).\n */\n private constructor(\n public url: string,\n apiKey?: string\n ) {\n this.nativeProvider = new ethers.providers.StaticJsonRpcProvider({\n url: StrategyFactory.get(url).asJSONRPC(url),\n headers: {\n // use object destructuring to conditionally add header\n ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}),\n },\n })\n }\n\n /**\n * Creates an instance of TronProvider from the given URL and API key.\n *\n * @param {string} url - The URL of the Tron node.\n * @param {string} [apiKey] - The API key for accessing the Tron node (optional).\n * @returns {TronProvider} The created TronProvider instance.\n */\n static from(url: string, apiKey?: string): TronProvider\n\n /**\n * Creates an instance of TronProvider from a TronWeb client.\n *\n * @param {TronWeb} client - The TronWeb client to create the provider from.\n * @returns {TronProvider} The created TronProvider instance.\n */\n static from(client: TronWeb): TronProvider\n\n /**\n * Creates an instance of TronProvider from the given source.\n *\n * @param {string | TronWeb} source - The source to create the provider from.\n * @param {string} [apiKey] - The API key for accessing the Tron node (optional).\n * @returns {TronProvider} The created TronProvider instance.\n * @throws {Error} If the parameters are invalid.\n */\n static from(source: string | TronWeb, apiKey?: string): TronProvider {\n if (typeof source === 'string') {\n return new this(source, apiKey)\n } else if (source instanceof TronWeb) {\n const { host, headers } = source.fullNode\n return this.from(host, headers['TRON-PRO-API-KEY'])\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n /**\n * Returns the native provider.\n *\n * @returns {unknown} The native provider.\n */\n get native(): unknown {\n return this.nativeProvider\n }\n\n /**\n * Builds a TronWeb instance from the given provider.\n * The result will be cached based on the provider's URL and API key.\n *\n * @param {ethers.providers.Provider} provider - The provider to build the TronWeb instance from.\n * @returns {TronWeb} The built TronWeb instance.\n * @throws {Error} If the provider is not supported.\n */\n @Memoizee({\n normalizer: (args: [ethers.providers.Provider]) => {\n const provider = args[0]\n if (provider instanceof ethers.providers.JsonRpcProvider) {\n const { url } = provider.connection\n const apiKey = provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n return JSON.stringify({ url, apiKey })\n }\n return JSON.stringify(provider)\n },\n })\n private buildTronWebFrom(provider: ethers.providers.Provider): TronWeb {\n if (provider instanceof ethers.providers.JsonRpcProvider) {\n const { url } = provider.connection\n const apiKey = provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n\n return new TronWeb({\n privateKey: undefined,\n fullHost: StrategyFactory.get(url).asREST(url),\n headers: { ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n }\n\n throw new Error(`The nativeSigner is not supported.`)\n }\n\n /**\n * Gets the balance of the specified address.\n *\n * @param {string} address - The address to get the balance of.\n * @returns {Promise<string>} A promise that resolves to the balance of the address.\n */\n async getBalance(address: string): Promise<string> {\n return this.nativeProvider.getBalance(toEtherFormat(address)).then((balance) => balance.toString())\n }\n\n /**\n * Gets the block specified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<Block>} A promise that resolves to the block.\n */\n async getBlock(blockTag: string | number): Promise<Block> {\n const response = await this.nativeProvider.getBlock(blockTag)\n return Block.from(response)\n }\n\n /**\n * Gets the block with transactions specified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<BlockWithTransactions>} A promise that resolves to the block with transactions.\n */\n async getBlockWithTransactions(blockTag: string | number): Promise<BlockWithTransactions> {\n const response = await this.nativeProvider.getBlockWithTransactions(blockTag)\n return BlockWithTransactions.from(response)\n }\n\n /**\n * Gets the current block number.\n *\n * @returns {Promise<number>} A promise that resolves to the current block number.\n */\n async getBlockNumber(): Promise<number> {\n return this.nativeProvider.getBlockNumber()\n }\n\n /**\n * Gets the UNIX timestamp for the block identified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<number>} A promise that resolves to the UNIX timestamp of the block.\n */\n async getBlockTimestamp(blockTag: string | number): Promise<number> {\n return this.nativeProvider.getBlock(blockTag).then((block) => block.timestamp)\n }\n\n /**\n * Gets the current slot number for commitment, not suitable for Tron.\n *\n * @param {Finality} [finality] - The commitment level (optional).\n * @returns {Promise<number>} A promise that resolves to the current slot number.\n * @throws {Error} Method not implemented.\n */\n async getSlot(_finality?: Finality): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not implemented.')\n }\n\n /**\n * Gets information about a transaction.\n *\n * @param {string} txHash - The hash of the transaction.\n * @returns {Promise<TransactionResponse>} A promise that resolves to the transaction response.\n */\n async getTransaction(txHash: string): Promise<TransactionResponse> {\n const response = await this.nativeProvider.getTransaction(toValidHash(txHash))\n return TransactionResponse.from(response)\n }\n\n /**\n * Gets the receipt of a transaction.\n *\n * @param {string} txHash - The hash of the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async getTransactionReceipt(txHash: string): Promise<TransactionReceipt> {\n const response = await this.nativeProvider.getTransactionReceipt(toValidHash(txHash))\n return TransactionReceipt.from(response)\n }\n\n /**\n * Gets the number of transactions sent from the specified address.\n *\n * @param {string | Promise<string>} _addressOrName - The address to get the number of transactions from.\n * @param {BlockTag | Promise<BlockTag>} [_blockTag] - The block tag to get the number of transactions from (optional).\n * @returns {Promise<number>} A promise that resolves to the number of transactions sent from the address.\n * @throws {Error} Method not supported in Tron.\n */\n async getTransactionCount(\n _addressOrName: string | Promise<string>,\n _blockTag?: BlockTag | Promise<BlockTag>\n ): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not supported in Tron.')\n }\n\n /**\n * Sends a signed transaction to the blockchain.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [sendOptions] - Optional parameters for sending the transaction.\n * @returns {Promise<TransactionPending>} A promise that resolves to the pending transaction.\n */\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n // reference: https://developers.tron.network/reference/json-rpc-api-overview\n // eth_sendRawTransaction is not supported in the JSON-RPC API of the TRON network\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n const client = this.buildTronWebFrom(this.nativeProvider)\n const response = await sendTronTransaction(stx, client)\n\n return TransactionPending.from(response)\n }\n\n /**\n * Confirms a pending transaction.\n *\n * @param {TransactionPending} pending - The pending transaction to confirm.\n * @param {object} [opts] - Optional parameters for the confirmation.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async confirmTransaction(pending: TransactionPending, _opts?: object): Promise<TransactionReceipt> {\n const nativePending = pending.pending as {\n txId: string\n result: unknown\n wait: () => Promise<unknown>\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const response = await nativePending.wait()\n return TransactionReceipt.from(response)\n }\n\n /**\n * Sends a signed transaction and waits for confirmation.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [opts] - Optional parameters for sending and confirming the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async sendAndConfirm(transaction: SignedTransaction, opts?: object): Promise<TransactionReceipt> {\n const pending = await this.sendTransaction(transaction, opts)\n return this.confirmTransaction(pending, opts)\n }\n}\n","import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\n/**\n * Ensures that the URL conforms to the TronGrid API convention by appending /jsonrpc if necessary.\n *\n * @param {string} url - The URL to ensure.\n * @returns {string} The URL with /jsonrpc appended if necessary.\n */\nexport function ensureJsonRpcUrlPostfix(url: string): string {\n // reference: https://developers.tron.network/docs/networks#mainnet\n // TronGrid API:https://api.trongrid.io\n // TronGrid JSON-RPC API: https://api.trongrid.io/jsonrpc\n // so that /jsonrpc is required to connect the JSON-RPC API endpoint\n const value = url.trim().replace(/\\/*$/, '')\n if (!value.endsWith('/jsonrpc')) {\n return value + '/jsonrpc'\n }\n return value\n}\n\n/**\n * Removes the /jsonrpc postfix from the URL.\n *\n * @param {string} url - The URL to remove the postfix from.\n * @returns {string} The URL without the /jsonrpc postfix.\n */\nexport function removeJsonRpcUrlPostfix(url: string): string {\n return url.replace(/\\/jsonrpc$/, '')\n}\n\n/**\n * Converts a Tron address to an Ethereum hex address.\n * reference: https://developers.tron.network/docs/account#account-address-format\n * the TRON network account address can be a Hex format and Base58 format.\n * - The hex format is 42 characters long, removing the leading 41 from Hex format to get the Ethereum address.\n * - The Base58 format is 34 characters long, all Base58 addresses begin with T.\n *\n * @param {string} address - The Tron address to convert.\n * @returns {string} The Ethereum hex address.\n * @throws {Error} If the address format is invalid.\n */\nexport function toEtherFormat(address: string): string {\n if (address.startsWith('T') && address.length === 34) {\n return TronWeb.address.toHex(address).slice(2)\n } else if (address.startsWith('41') && address.length === 42) {\n return address.slice(2)\n } else {\n return address\n }\n}\n\n/**\n * Convert a transaction hash to a valid hash\n * reference: https://developers.tron.network/reference/eth_gettransactionbyhash\n * txHash should be a hex string with 0x, otherwise it will throw an error \"invalid hash\" - INVALID_ARGUMENT\n *\n * @param {string} txHash - The transaction hash to convert.\n * @returns {string} The valid transaction hash.\n */\nexport function toValidHash(txHash: string): string {\n return ethers.utils.hexlify(txHash, { allowMissingPrefix: true })\n}\n","import TronWeb from 'tronweb'\n\nimport {\n Block,\n BlockTag,\n BlockWithTransactions,\n Finality,\n Provider,\n SignedTransaction,\n TransactionPending,\n TransactionReceipt,\n TransactionResponse,\n} from '@layerzerolabs/lz-core'\nimport { sleep } from '@layerzerolabs/lz-utilities'\n\nimport type { TransactionInfo } from 'tronweb'\n\n/**\n * TronWebProvider is a wrapper around TronWeb that implements the Provider interface\n *\n * PITFALL:\n * - This class is not compatible with ethers.js and is not fully tested.\n * - The format of the response from sendTransaction and the receipt from getTransactionReceipt differs\n * from that of the ethers provider.\n */\nexport class TronWebProvider implements Provider {\n nativeProvider: TronWeb\n\n /**\n * Creates a new TronWebProvider.\n *\n * @param {string} url - The RPC endpoint of the Tron full node, e.g., 'https://api.trongrid.io'.\n * @param {string} [apiKey] - The API key for accessing the Tron full node (optional).\n */\n constructor(\n public url: string,\n private apiKey?: string\n ) {\n this.nativeProvider = new TronWeb({\n fullHost: url,\n headers: {\n // use object destructuring to conditionally add header\n ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}),\n },\n })\n }\n\n /**\n * Creates an instance of TronWebProvider from the given URL and API key.\n *\n * @param {string} url - The URL of the Tron node.\n * @param {string} [apiKey] - The API key for accessing the Tron node (optional).\n * @returns {TronWebProvider} The created TronWebProvider instance.\n */\n static from(url: string, apiKey?: string): TronWebProvider\n\n /**\n * Creates an instance of TronWebProvider from the given source.\n *\n * @param {string} source - The source to create the provider from.\n * @param {string} [apiKey] - The API key for accessing the Tron node (optional).\n * @returns {TronWebProvider} The created TronWebProvider instance.\n * @throws {Error} If the parameters are invalid.\n */\n static from(source: string, apiKey?: string): TronWebProvider {\n if (typeof source === 'string') {\n return new this(source, apiKey)\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n /**\n * Gets the native TronWeb provider instance.\n *\n * @returns {TronWeb} The native TronWeb provider instance.\n */\n get native(): unknown {\n return this.nativeProvider\n }\n\n /**\n * Gets the balance of the specified address.\n *\n * @param {string} address - The address to get the balance of.\n * @returns {Promise<string>} A promise that resolves to the balance of the address.\n */\n async getBalance(address: string): Promise<string> {\n return this.nativeProvider.trx.getBalance(address).then((balance: number) => balance.toString())\n }\n\n /**\n * Gets the block specified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<Block>} A promise that resolves to the block.\n */\n async getBlock(blockTag: string | number): Promise<Block> {\n const response = await this.nativeProvider.trx.getBlock(blockTag)\n return Block.from(response)\n }\n\n /**\n * Gets the block with transactions specified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<BlockWithTransactions>} A promise that resolves to the block with transactions.\n */\n async getBlockWithTransactions(blockTag: string | number): Promise<BlockWithTransactions> {\n const response = await this.nativeProvider.trx.getBlock(blockTag)\n return BlockWithTransactions.from(response)\n }\n\n /**\n * Gets the current block number.\n *\n * @returns {Promise<number>} A promise that resolves to the current block number.\n */\n async getBlockNumber(): Promise<number> {\n return this.nativeProvider.trx\n .getBlock('latest')\n .then((block: { block_header: { raw_data: { number?: number } } }) => {\n if (block.block_header.raw_data.number === undefined) {\n throw new Error('Invalid block, block_header.raw_data.number is undefined')\n }\n return block.block_header.raw_data.number\n })\n }\n\n /**\n * Gets the UNIX timestamp for the block identified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<number>} A promise that resolves to the UNIX timestamp of the block.\n */\n async getBlockTimestamp(blockTag: string | number): Promise<number> {\n return this.nativeProvider.trx\n .getBlock(blockTag)\n .then((block: { block_header: { raw_data: { timestamp?: number } } }) => {\n if (block.block_header.raw_data.timestamp === undefined) {\n throw new Error('Invalid block, block_header.raw_data.timestamp is undefined')\n }\n return block.block_header.raw_data.timestamp\n })\n }\n\n /**\n * Gets the current slot number for commitment, not suitable for Tron.\n *\n * @param {Finality} [finality] - The commitment level (optional).\n * @returns {Promise<number>} A promise that resolves to the current slot number.\n * @throws {Error} Method not implemented.\n */\n async getSlot(_finality?: Finality): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not implemented.')\n }\n\n /**\n * Gets information about a transaction.\n *\n * @param {string} txHash - The hash of the transaction.\n * @returns {Promise<TransactionResponse>} A promise that resolves to the transaction response.\n */\n async getTransaction(txHash: string): Promise<TransactionResponse> {\n const response = await this.nativeProvider.trx.getTransaction(txHash)\n return TransactionResponse.from(response)\n }\n\n /**\n * Gets the receipt of a transaction.\n *\n * @param {string} txHash - The hash of the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async getTransactionReceipt(txHash: string): Promise<TransactionReceipt> {\n // reference: https://developers.tron.network/reference/gettransactioninfobyid-1\n const response = await this.nativeProvider.trx.getTransactionInfo(txHash)\n return TransactionReceipt.from(response)\n }\n\n /**\n * Gets the number of transactions sent from the specified address.\n *\n * @param {string | Promise<string>} _addressOrName - The address to get the number of transactions from.\n * @param {BlockTag | Promise<BlockTag>} [_blockTag] - The block tag to get the number of transactions from (optional).\n * @returns {Promise<number>} A promise that resolves to the number of transactions sent from the address.\n * @throws {Error} Method not supported in Tron.\n */\n async getTransactionCount(\n _addressOrName: string | Promise<string>,\n _blockTag?: BlockTag | Promise<BlockTag>\n ): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not supported in Tron.')\n }\n\n /**\n * Sends a signed transaction to the blockchain.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [sendOptions] - Optional parameters for sending the transaction.\n * @returns {Promise<TransactionPending>} A promise that resolves to the pending transaction.\n */\n async sendTransaction(\n transaction: SignedTransaction,\n sendOptions?: { confirmations?: number }\n ): Promise<TransactionPending> {\n // reference: https://developers.tron.network/reference/broadcasttransaction\n type NativeSignedTransaction = Parameters<typeof this.nativeProvider.trx.sendRawTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n const response = await this.nativeProvider.trx.sendRawTransaction(stx, sendOptions)\n\n if (response.code !== undefined) {\n const error = {\n error: response.code,\n message: response.message !== undefined ? TronWeb.toUtf8(response.message) : response.code,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n if (response.txid === undefined) {\n throw new Error('Invalid response, txid is undefined')\n }\n\n return TransactionPending.from(response)\n }\n\n /**\n * Confirms a pending transaction.\n *\n * @param {TransactionPending} pending - The pending transaction to confirm.\n * @param {object} [opts] - Optional parameters for the confirmation.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async confirmTransaction(\n pending: TransactionPending,\n opts?: { confirmations?: number }\n ): Promise<TransactionReceipt> {\n const nativePending = pending.pending as {\n result: boolean\n txid: string\n code: string\n message: string\n transaction: unknown\n wait: (confirmations?: number) => Promise<unknown>\n }\n const txHash = nativePending.txid\n const confirmations = opts?.confirmations\n let tries = 0\n while (tries++ < (confirmations ?? 20)) {\n // FIXME: not fully implemented\n const receipt = await this.getTransactionReceipt(txHash)\n const response = receipt.receipt as TransactionInfo\n if (!Object.keys(response).length) {\n // reference: https://developers.tron.network/page/faq\n // Within current testing environment, one block is produced every 3 seconds.\n // But for the local environment, it may take 1 minute to produce a block.\n await sleep(1200)\n continue\n }\n\n if (response.result !== undefined && response.result === 'FAILED') {\n const error = {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n error: TronWeb.toUtf8(response.resMessage ?? ''),\n response: response,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n if (!('contractResult' in response)) {\n const error = {\n error: 'Failed to execute: ' + JSON.stringify(response, null, 2),\n response: response,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n return TransactionReceipt.from(response)\n }\n throw new Error(`Transaction not confirmed, txHash: ${txHash}`)\n }\n\n /**\n * Sends a signed transaction and waits for confirmation.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [opts] - Optional parameters for sending and confirming the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async sendAndConfirm(\n transaction: SignedTransaction,\n opts?: { confirmations?: number }\n ): Promise<TransactionReceipt> {\n // reference: https://developers.tron.network/reference/broadcasttransaction\n const pending = await this.sendTransaction(transaction, opts)\n return this.confirmTransaction(pending, opts)\n }\n}\n","import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\nimport {\n Provider,\n SignedTransaction,\n Signer,\n TransactionPending,\n TransactionReceipt,\n TransactionRequest,\n} from '@layerzerolabs/lz-core'\nimport { Memoizee, trim0x } from '@layerzerolabs/lz-utilities'\nimport { sendTronTransaction, signTronTx } from '@layerzerolabs/tron-utilities'\n\nimport { ensureJsonRpcUrlPostfix, removeJsonRpcUrlPostfix, toValidHash } from '../utils/tron'\n\n/**\n * TronSigner is a wrapper around TronWeb that implements the Signer interface\n * It is implemented using ethers.js\n */\nexport class TronSigner implements Signer {\n private readonly nativeSigner: ethers.Signer\n\n /**\n * Creates an instance of TronSigner.\n *\n * @param {ethers.Signer} signer - The Ethers signer to use.\n */\n private constructor(signer: ethers.Signer) {\n this.nativeSigner = signer\n }\n\n /**\n * Creates an instance of TronSigner from an Ethers signer.\n *\n * @param {ethers.Signer} source - The Ethers signer to create the TronSigner from.\n * @returns {Signer} The created TronSigner instance.\n */\n static from(source: ethers.Signer): Signer\n\n /**\n * Creates an instance of TronSigner from a TronWeb client.\n *\n * @param {TronWeb} client - The TronWeb client to create the TronSigner from.\n * @returns {Signer} The created TronSigner instance.\n */\n static from(client: TronWeb): Signer\n\n /**\n * Creates an instance of TronSigner from a private key.\n *\n * @param {string} privKey - The private key to create the TronSigner from.\n * @returns {Signer} The created TronSigner instance.\n */\n static from(privKey: string): Signer\n\n /**\n * Creates an instance of TronSigner from a mnemonic and derivation path.\n *\n * @param {string} mnemonic - The mnemonic to create the TronSigner from.\n * @param {string} path - The derivation path (e.g., m/44'/195'/0'/0/0).\n * @returns {Signer} The created TronSigner instance.\n */\n static from(mnemonic: string, path: string): Signer\n\n /**\n * Creates an instance of TronSigner from the given source.\n *\n * @param {ethers.Signer | TronWeb | string} source - The source to create the TronSigner from.\n * @param {string} [path] - The derivation path (optional).\n * @returns {Signer} The created TronSigner instance.\n * @throws {Error} If the parameters are invalid.\n */\n static from(source: ethers.Signer | TronWeb | string, path?: string): Signer {\n if (source instanceof ethers.Signer) {\n return new this(source)\n } else if (source instanceof TronWeb) {\n const apiKey = source.fullNode.headers['TRON-PRO-API-KEY']\n const provider = new ethers.providers.JsonRpcProvider({\n url: ensureJsonRpcUrlPostfix(source.fullNode.host),\n headers: { ...(typeof apiKey !== 'undefined' ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n\n return new this(new ethers.Wallet(source.defaultPrivateKey as string, provider))\n } else if (typeof source === 'string' && path === undefined) {\n return new this(new ethers.Wallet(source))\n } else if (typeof source === 'string' && path !== undefined) {\n return new this(ethers.Wallet.fromMnemonic(source, path))\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n /**\n * Gets the native signer instance.\n *\n * @returns {unknown} The native signer instance.\n */\n get native(): unknown {\n return this.nativeSigner\n }\n\n /**\n * Connects the signer to a provider.\n * IMPORTANT: native provider must be an instance of ethers.providers.JsonRpcProvider.\n *\n * @param {Provider} provider - The provider to connect to.\n * @returns {Signer} The connected signer.\n * @throws {Error} If the provider is not an instance of JsonRpcProvider.\n */\n connect(provider: Provider): Signer {\n if (!(provider.native instanceof ethers.providers.JsonRpcProvider)) {\n throw new Error('Only JsonRpcProvider is supported.')\n }\n\n const signer = this.nativeSigner.connect(provider.native as ethers.providers.Provider)\n // hack: ethers.utils.defineReadOnly does not work with private properties\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n ethers.utils.defineReadOnly(this, 'nativeSigner' as keyof this, signer as any)\n\n return this\n }\n\n /**\n * Builds a TronWeb instance from the given signer.\n * IMPORTANT: signer must be an instance of ethers.Wallet.\n *\n * @param {ethers.Signer} signer - The signer to build the TronWeb instance from.\n * @returns {TronWeb} The built TronWeb instance.\n * @throws {Error} If the signer is not supported.\n */\n static buildTronWebFrom(signer: ethers.Signer): TronWeb {\n if (signer instanceof ethers.Wallet) {\n if (signer.provider instanceof ethers.providers.JsonRpcProvider) {\n const apiKey = signer.provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n return this.createTronWeb(signer.provider.connection.url, signer.privateKey, apiKey)\n }\n }\n throw new Error(`The nativeSigner is not supported.`)\n }\n\n /**\n * Creates a TronWeb instance.\n * The result will be cached based on the arguments.\n *\n * @param {string} url - The URL of the Tron node.\n * @param {string} privateKey - The private key to use.\n * @param {string} [apiKey] - The API key for accessing the Tron node (optional).\n * @returns {TronWeb} The created TronWeb instance.\n */\n @Memoizee({\n normalizer: (args: [string, string, string | undefined]) => JSON.stringify(args),\n })\n static createTronWeb(url: string, privateKey: string, apiKey?: string): TronWeb {\n return new TronWeb({\n privateKey: trim0x(privateKey),\n fullHost: removeJsonRpcUrlPostfix(url),\n headers: { ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n }\n\n /**\n * Gets the address of the signer.\n *\n * @returns {Promise<string>} A promise that resolves to the address of the signer.\n */\n async getAddress(): Promise<string> {\n // reference: https://developers.tron.network/docs/tvm#differences-from-evm\n return this.nativeSigner.getAddress()\n }\n\n /**\n * Sends a signed transaction and waits for confirmation.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [opts] - Optional parameters for sending and confirming the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async sendAndConfirm(transaction: SignedTransaction, _opts?: object): Promise<TransactionReceipt> {\n const pending = (await this.sendTransaction(transaction)).pending as {\n txId: string\n wait: () => unknown\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n await pending.wait()\n const response = await this.nativeSigner.provider?.getTransactionReceipt(toValidHash(pending.txId))\n return TransactionReceipt.from(response)\n }\n\n /**\n * Signs a transaction.\n *\n * @param {TransactionRequest} transaction - The transaction request to sign.\n * @returns {Promise<SignedTransaction>} A promise that resolves to the signed transaction.\n * @throws {Error} If the transaction is invalid.\n */\n async signTransaction(transaction: TransactionRequest): Promise<SignedTransaction> {\n type NativeSignedTransaction = ethers.PopulatedTransaction\n const tx = transaction.request as NativeSignedTransaction\n if (tx.data === undefined || tx.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n\n TronSigner.validateTransaction(tx)\n const client = TronSigner.buildTronWebFrom(this.nativeSigner)\n const response = await signTronTx(\n {\n data: tx.data,\n to: tx.to,\n gasLimit: tx.gasLimit?.toNumber(),\n gasPrice: tx.gasPrice?.toNumber(),\n value: tx.value?.toNumber(),\n // energyFactor: transaction.energyFactor, // TODO: add energyFactor\n },\n client\n )\n return SignedTransaction.from(response)\n }\n\n /**\n * Sends a signed transaction.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [sendOptions] - Optional parameters for sending the transaction.\n * @returns {Promise<TransactionPending>} A promise that resolves to the pending transaction.\n */\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n\n const tronWeb = TronSigner.buildTronWebFrom(this.nativeSigner)\n const response = await sendTronTransaction(stx, tronWeb)\n return TransactionPending.from(response)\n }\n\n /**\n * Signs a buffer (e.g., a message hash) using the native Tron signer.\n *\n * @param {Uint8Array} buffer - The buffer to sign.\n * @returns {Promise<Uint8Array>} A promise that resolves to the signed buffer as a Uint8Array.\n */\n async signBuffer(buffer: Uint8Array): Promise<Uint8Array> {\n // ETH_MESSAGE_HEADER is defined as '\\x19Ethereum Signed Message:\\n32' in TronWeb,\n // which will cause the signature to be different from ethers.js if the message length is not 32 bytes\n const signedMessage = await this.nativeSigner.signMessage(buffer)\n return ethers.utils.arrayify(signedMessage)\n }\n\n /**\n * Validates a transaction.\n *\n * @param {ethers.PopulatedTransaction} transaction - The transaction to validate.\n * @returns {boolean} True if the transaction is valid, false otherwise.\n * @throws {Error} If the transaction is invalid.\n */\n static validateTransaction(transaction: ethers.PopulatedTransaction): boolean {\n if (transaction.data === undefined || transaction.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n return true\n }\n\n /**\n * Builds a transaction.\n *\n * @param {unknown} buildTxRequest - The transaction request to build.\n * @returns {Promise<TransactionRequest>} A promise that resolves to the built transaction request.\n * @throws {Error} Method not implemented.\n */\n async buildTransaction(buildTxRequest: unknown): Promise<TransactionRequest> {\n return Promise.reject(new Error('Method not implemented.'))\n }\n}\n","import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\nimport {\n Provider,\n SignedTransaction,\n Signer,\n TransactionPending,\n TransactionReceipt,\n TransactionRequest,\n} from '@layerzerolabs/lz-core'\nimport { trim0x } from '@layerzerolabs/lz-utilities'\nimport { sendTronTransaction, signTronTx } from '@layerzerolabs/tron-utilities'\n\n/**\n * TronWebSigner is a wrapper around TronWeb that implements the Signer interface\n *\n * PITFALL:\n * - This class is not compatible with ethers.js and is not fully tested.\n * - The signature produced by signBuffer is different from the ethers signer\n * when the message length is not 32 bytes\n * - The format of the response from sendTransaction differs from that of the ethers signer.\n */\nexport class TronWebSigner implements Signer {\n private readonly nativeSigner: TronWeb\n\n /**\n * Creates an instance of TronWebSigner.\n *\n * @param {TronWeb} signer - The TronWeb signer to use.\n */\n private constructor(signer: TronWeb) {\n this.nativeSigner = signer\n }\n\n /**\n * Creates an instance of TronWebSigner from a TronWeb client.\n *\n * @param {TronWeb} signer - The TronWeb client to create the TronWebSigner from.\n * @returns {Signer} The created TronWebSigner instance.\n */\n static from(signer: TronWeb): Signer\n\n /**\n * Creates an instance of TronWebSigner from a private key.\n *\n * @param {string} privKey - The private key to create the TronWebSigner from.\n * @returns {Signer} The created TronWebSigner instance.\n */\n static from(privKey: string): Signer\n\n /**\n * Creates an instance of TronWebSigner from a mnemonic and derivation path.\n *\n * @param {string} mnemonic - The mnemonic to create the TronWebSigner from.\n * @param {string} [path] - The derivation path (optional).\n * @returns {Signer} The created TronWebSigner instance.\n */\n static from(mnemonic: string, path?: string): Signer\n\n /**\n * Creates an instance of TronWebSigner from the given source.\n *\n * @param {TronWeb | string} source - The source to create the TronWebSigner from.\n * @param {string} [path] - The derivation path (optional).\n * @returns {Signer} The created TronWebSigner instance.\n * @throws {Error} If the parameters are invalid.\n */\n static from(source: TronWeb | string, path?: string): Signer {\n const fullHost = 'https://api.trongrid.io'\n if (source instanceof TronWeb) {\n return new this(source)\n } else if (typeof source === 'string' && path === undefined) {\n const privateKey = trim0x(source)\n return new this(new TronWeb({ privateKey, fullHost }))\n } else if (typeof source === 'string' && path !== undefined) {\n const privateKey = trim0x(TronWeb.fromMnemonic(source, path).privateKey)\n return new this(new TronWeb({ privateKey, fullHost }))\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n /**\n * Gets the native TronWeb signer instance.\n *\n * @returns {unknown} The native TronWeb signer instance.\n */\n get native(): unknown {\n return this.nativeSigner\n }\n\n /**\n * Connects the signer to a provider.\n *\n * @param {Provider} provider - The provider to connect to.\n * @returns {Signer} The connected signer.\n */\n connect(provider: Provider): Signer {\n const nativeProvider = provider.native as TronWeb\n const { fullNode, solidityNode, eventServer } = nativeProvider.currentProviders() as {\n fullNode: unknown\n solidityNode: unknown\n eventServer: unknown\n }\n this.nativeSigner.setFullNode(fullNode)\n this.nativeSigner.setSolidityNode(solidityNode)\n this.nativeSigner.setEventServer(eventServer)\n return this\n }\n\n /**\n * Gets the address of the signer.\n *\n * @returns {Promise<string>} A promise that resolves to the address of the signer.\n */\n async getAddress(): Promise<string> {\n if (typeof this.nativeSigner.defaultAddress.hex !== 'string') {\n throw new Error('Invalid address')\n }\n const retval = this.nativeSigner.defaultAddress.hex.replace(/^41/, '0x')\n return Promise.resolve(retval)\n }\n\n /**\n * Sends a signed transaction and waits for confirmation.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [sendOptions] - Optional parameters for sending and confirming the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async sendAndConfirm(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionReceipt> {\n const pending = (await this.sendTransaction(transaction)).pending as {\n txId: string\n wait: () => unknown\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const response = await pending.wait()\n return TransactionReceipt.from(response)\n }\n\n /**\n * Signs a transaction.\n *\n * @param {TransactionRequest} transaction - The transaction request to sign.\n * @returns {Promise<SignedTransaction>} A promise that resolves to the signed transaction.\n * @throws {Error} If the transaction is invalid.\n */\n async signTransaction(transaction: TransactionRequest): Promise<SignedTransaction> {\n type NativeSignedTransaction = ethers.PopulatedTransaction\n const tx = transaction.request as NativeSignedTransaction\n if (tx.data === undefined || tx.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n\n TronWebSigner.validateTransaction(tx)\n const response = await signTronTx(\n {\n data: tx.data,\n to: tx.to,\n gasLimit: tx.gasLimit?.toNumber(),\n gasPrice: tx.gasPrice?.toNumber(),\n value: tx.value?.toNumber(),\n // energyFactor: transaction.energyFactor, // FIXME: add energyFactor\n },\n this.nativeSigner\n )\n return SignedTransaction.from(response)\n }\n\n /**\n * Sends a signed transaction.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [sendOptions] - Optional parameters for sending the transaction.\n * @returns {Promise<TransactionPending>} A promise that resolves to the pending transaction.\n */\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n\n const response = await sendTronTransaction(stx, this.nativeSigner)\n return TransactionPending.from(response)\n }\n\n /**\n * signBuffer signs a buffer using the native signer\n * but the signString function of native signer is different from the ethers signer,\n * TronWeb uses a message header with a fixed 32 bytes length, which means that only if\n * the message length is 32 bytes, the signature will be the same as the ethereum signature.\n * you can find the signString function here:\n * https://github.com/tronprotocol/tronweb/blob/master/src/lib/trx.js\n *\n * @param {Uint8Array} buffer - The buffer to sign.\n * @returns {Promise<Uint8Array>} A promise that resolves to the signed buffer as a Uint8Array.\n * @throws {Error} If the private key is invalid.\n */\n async signBuffer(buffer: Uint8Array): Promise<Uint8Array> {\n // ETH_MESSAGE_HEADER is defined as '\\x19Ethereum Signed Message:\\n32',\n // so that the signature will be the same as the ethereum signature only if\n // the message length is 32 bytes.\n if (typeof this.nativeSigner.defaultPrivateKey !== 'string') {\n throw new Error('Invalid private key')\n }\n const signedMessage = await TronWeb.Trx.signString(\n ethers.utils.hexlify(buffer),\n this.nativeSigner.defaultPrivateKey,\n false\n )\n const retval = ethers.utils.arrayify(signedMessage)\n return Promise.resolve(retval)\n }\n\n /**\n * Validates a transaction.\n *\n * @param {ethers.PopulatedTransaction} transaction - The transaction to validate.\n * @returns {boolean} True if the transaction is valid, false otherwise.\n * @throws {Error} If the transaction is invalid.\n */\n static validateTransaction(transaction: ethers.PopulatedTransaction): boolean {\n if (transaction.data === undefined || transaction.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n return true\n }\n\n /**\n * Builds a transaction.\n *\n * @param {unknown} buildTxRequest - The transaction request to build.\n * @returns {Promise<TransactionRequest>} A promise that resolves to the built transaction request.\n * @throws {Error} Method not implemented.\n */\n async buildTransaction(buildTxRequest: unknown): Promise<TransactionRequest> {\n return Promise.reject(new Error('Method not implemented.'))\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/tron.ts","../src/providers/tron.ts","../src/providers/tronweb.ts","../src/signers/tron.ts","../src/signers/tronweb.ts"],"names":["TronWeb","ethers","StrategyFactory","Block","BlockWithTransactions","TransactionResponse","TransactionReceipt","sendTronTransaction","TransactionPending","Memoizee","sleep","trim0x","signTronTx","SignedTransaction"],"mappings":"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","file":"index.cjs","sourcesContent":["import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\n/**\n * Ensures that the URL conforms to the TronGrid API convention by appending /jsonrpc if necessary.\n *\n * @param {string} url - The URL to ensure.\n * @returns {string} The URL with /jsonrpc appended if necessary.\n */\nexport function ensureJsonRpcUrlPostfix(url: string): string {\n // reference: https://developers.tron.network/docs/networks#mainnet\n // TronGrid API:https://api.trongrid.io\n // TronGrid JSON-RPC API: https://api.trongrid.io/jsonrpc\n // so that /jsonrpc is required to connect the JSON-RPC API endpoint\n const value = url.trim().replace(/\\/*$/, '')\n if (!value.endsWith('/jsonrpc')) {\n return value + '/jsonrpc'\n }\n return value\n}\n\n/**\n * Removes the /jsonrpc postfix from the URL.\n *\n * @param {string} url - The URL to remove the postfix from.\n * @returns {string} The URL without the /jsonrpc postfix.\n */\nexport function removeJsonRpcUrlPostfix(url: string): string {\n return url.replace(/\\/jsonrpc$/, '')\n}\n\n/**\n * Converts a Tron address to an Ethereum hex address.\n * reference: https://developers.tron.network/docs/account#account-address-format\n * the TRON network account address can be a Hex format and Base58 format.\n * - The hex format is 42 characters long, removing the leading 41 from Hex format to get the Ethereum address.\n * - The Base58 format is 34 characters long, all Base58 addresses begin with T.\n *\n * @param {string} address - The Tron address to convert.\n * @returns {string} The Ethereum hex address.\n * @throws {Error} If the address format is invalid.\n */\nexport function toEtherFormat(address: string): string {\n if (address.startsWith('T') && address.length === 34) {\n return TronWeb.address.toHex(address).slice(2)\n } else if (address.startsWith('41') && address.length === 42) {\n return address.slice(2)\n } else {\n return address\n }\n}\n\n/**\n * Convert a transaction hash to a valid hash\n * reference: https://developers.tron.network/reference/eth_gettransactionbyhash\n * txHash should be a hex string with 0x, otherwise it will throw an error \"invalid hash\" - INVALID_ARGUMENT\n *\n * @param {string} txHash - The transaction hash to convert.\n * @returns {string} The valid transaction hash.\n */\nexport function toValidHash(txHash: string): string {\n return ethers.utils.hexlify(txHash, { allowMissingPrefix: true })\n}\n","import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\nimport {\n Block,\n BlockTag,\n BlockWithTransactions,\n Finality,\n Provider,\n SignedTransaction,\n TransactionPending,\n TransactionReceipt,\n TransactionResponse,\n} from '@layerzerolabs/lz-core'\nimport { Memoizee } from '@layerzerolabs/lz-utilities'\nimport { StrategyFactory, sendTronTransaction } from '@layerzerolabs/tron-utilities'\n\nimport { toEtherFormat, toValidHash } from '../utils/tron'\n\n/**\n * TronProvider is a wrapper around TronWeb that implements the Provider interface\n * It is implemented using ethers.js\n */\nexport class TronProvider implements Provider {\n nativeProvider: ethers.providers.StaticJsonRpcProvider\n\n /**\n * Creates an instance of TronProvider.\n *\n * @param {string} url - RPC endpoint of the Tron full node, e.g. 'https://api.trongrid.io'\n * @param {string} [apiKey] - The API key for accessing the Tron full node (optional).\n */\n private constructor(\n public url: string,\n apiKey?: string\n ) {\n this.nativeProvider = new ethers.providers.StaticJsonRpcProvider({\n url: StrategyFactory.get(url).asJSONRPC(url),\n headers: {\n // use object destructuring to conditionally add header\n ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}),\n },\n })\n }\n\n /**\n * Creates an instance of TronProvider from the given URL and API key.\n *\n * @param {string} url - The URL of the Tron node.\n * @param {string} [apiKey] - The API key for accessing the Tron node (optional).\n * @returns {TronProvider} The created TronProvider instance.\n */\n static from(url: string, apiKey?: string): TronProvider\n\n /**\n * Creates an instance of TronProvider from a TronWeb client.\n *\n * @param {TronWeb} client - The TronWeb client to create the provider from.\n * @returns {TronProvider} The created TronProvider instance.\n */\n static from(client: TronWeb): TronProvider\n\n /**\n * Creates an instance of TronProvider from the given source.\n *\n * @param {string | TronWeb} source - The source to create the provider from.\n * @param {string} [apiKey] - The API key for accessing the Tron node (optional).\n * @returns {TronProvider} The created TronProvider instance.\n * @throws {Error} If the parameters are invalid.\n */\n static from(source: string | TronWeb, apiKey?: string): TronProvider {\n if (typeof source === 'string') {\n return new this(source, apiKey)\n } else if (source instanceof TronWeb) {\n const { host, headers } = source.fullNode\n return this.from(host, headers['TRON-PRO-API-KEY'])\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n /**\n * Returns the native provider.\n *\n * @returns {unknown} The native provider.\n */\n get native(): unknown {\n return this.nativeProvider\n }\n\n /**\n * Builds a TronWeb instance from the given provider.\n * The result will be cached based on the provider's URL and API key.\n *\n * @param {ethers.providers.Provider} provider - The provider to build the TronWeb instance from.\n * @returns {TronWeb} The built TronWeb instance.\n * @throws {Error} If the provider is not supported.\n */\n @Memoizee({\n normalizer: (args: [ethers.providers.Provider]) => {\n const provider = args[0]\n if (provider instanceof ethers.providers.JsonRpcProvider) {\n const { url } = provider.connection\n const apiKey = provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n return JSON.stringify({ url, apiKey })\n }\n return JSON.stringify(provider)\n },\n })\n private buildTronWebFrom(provider: ethers.providers.Provider): TronWeb {\n if (provider instanceof ethers.providers.JsonRpcProvider) {\n const { url } = provider.connection\n const apiKey = provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n\n return new TronWeb({\n privateKey: undefined,\n fullHost: StrategyFactory.get(url).asREST(url),\n headers: { ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n }\n\n throw new Error(`The nativeSigner is not supported.`)\n }\n\n /**\n * Gets the balance of the specified address.\n *\n * @param {string} address - The address to get the balance of.\n * @returns {Promise<string>} A promise that resolves to the balance of the address.\n */\n async getBalance(address: string): Promise<string> {\n return this.nativeProvider.getBalance(toEtherFormat(address)).then((balance) => balance.toString())\n }\n\n /**\n * Gets the block specified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<Block>} A promise that resolves to the block.\n */\n async getBlock(blockTag: string | number): Promise<Block> {\n const response = await this.nativeProvider.getBlock(blockTag)\n return Block.from(response)\n }\n\n /**\n * Gets the block with transactions specified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<BlockWithTransactions>} A promise that resolves to the block with transactions.\n */\n async getBlockWithTransactions(blockTag: string | number): Promise<BlockWithTransactions> {\n const response = await this.nativeProvider.getBlockWithTransactions(blockTag)\n return BlockWithTransactions.from(response)\n }\n\n /**\n * Gets the current block number.\n *\n * @returns {Promise<number>} A promise that resolves to the current block number.\n */\n async getBlockNumber(): Promise<number> {\n return this.nativeProvider.getBlockNumber()\n }\n\n /**\n * Gets the UNIX timestamp for the block identified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<number>} A promise that resolves to the UNIX timestamp of the block.\n */\n async getBlockTimestamp(blockTag: string | number): Promise<number> {\n return this.nativeProvider.getBlock(blockTag).then((block) => block.timestamp)\n }\n\n /**\n * Gets the current slot number for commitment, not suitable for Tron.\n *\n * @param {Finality} [finality] - The commitment level (optional).\n * @returns {Promise<number>} A promise that resolves to the current slot number.\n * @throws {Error} Method not implemented.\n */\n async getSlot(_finality?: Finality): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not implemented.')\n }\n\n /**\n * Gets information about a transaction.\n *\n * @param {string} txHash - The hash of the transaction.\n * @returns {Promise<TransactionResponse>} A promise that resolves to the transaction response.\n */\n async getTransaction(txHash: string): Promise<TransactionResponse> {\n const response = await this.nativeProvider.getTransaction(toValidHash(txHash))\n return TransactionResponse.from(response)\n }\n\n /**\n * Gets the receipt of a transaction.\n *\n * @param {string} txHash - The hash of the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async getTransactionReceipt(txHash: string): Promise<TransactionReceipt> {\n const response = await this.nativeProvider.getTransactionReceipt(toValidHash(txHash))\n return TransactionReceipt.from(response)\n }\n\n /**\n * Gets the number of transactions sent from the specified address.\n *\n * @param {string | Promise<string>} _addressOrName - The address to get the number of transactions from.\n * @param {BlockTag | Promise<BlockTag>} [_blockTag] - The block tag to get the number of transactions from (optional).\n * @returns {Promise<number>} A promise that resolves to the number of transactions sent from the address.\n * @throws {Error} Method not supported in Tron.\n */\n async getTransactionCount(\n _addressOrName: string | Promise<string>,\n _blockTag?: BlockTag | Promise<BlockTag>\n ): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not supported in Tron.')\n }\n\n /**\n * Sends a signed transaction to the blockchain.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [sendOptions] - Optional parameters for sending the transaction.\n * @returns {Promise<TransactionPending>} A promise that resolves to the pending transaction.\n */\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n // reference: https://developers.tron.network/reference/json-rpc-api-overview\n // eth_sendRawTransaction is not supported in the JSON-RPC API of the TRON network\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n const client = this.buildTronWebFrom(this.nativeProvider)\n const response = await sendTronTransaction(stx, client)\n\n return TransactionPending.from(response)\n }\n\n /**\n * Confirms a pending transaction.\n *\n * @param {TransactionPending} pending - The pending transaction to confirm.\n * @param {object} [opts] - Optional parameters for the confirmation.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async confirmTransaction(pending: TransactionPending, _opts?: object): Promise<TransactionReceipt> {\n const nativePending = pending.pending as {\n txId: string\n result: unknown\n wait: () => Promise<unknown>\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const response = await nativePending.wait()\n return TransactionReceipt.from(response)\n }\n\n /**\n * Sends a signed transaction and waits for confirmation.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [opts] - Optional parameters for sending and confirming the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async sendAndConfirm(transaction: SignedTransaction, opts?: object): Promise<TransactionReceipt> {\n const pending = await this.sendTransaction(transaction, opts)\n return this.confirmTransaction(pending, opts)\n }\n}\n","import TronWeb from 'tronweb'\n\nimport {\n Block,\n BlockTag,\n BlockWithTransactions,\n Finality,\n Provider,\n SignedTransaction,\n TransactionPending,\n TransactionReceipt,\n TransactionResponse,\n} from '@layerzerolabs/lz-core'\nimport { sleep } from '@layerzerolabs/lz-utilities'\n\nimport type { TransactionInfo } from 'tronweb'\n\n/**\n * TronWebProvider is a wrapper around TronWeb that implements the Provider interface\n *\n * PITFALL:\n * - This class is not compatible with ethers.js and is not fully tested.\n * - The format of the response from sendTransaction and the receipt from getTransactionReceipt differs\n * from that of the ethers provider.\n */\nexport class TronWebProvider implements Provider {\n nativeProvider: TronWeb\n\n /**\n * Creates a new TronWebProvider.\n *\n * @param {string} url - The RPC endpoint of the Tron full node, e.g., 'https://api.trongrid.io'.\n * @param {string} [apiKey] - The API key for accessing the Tron full node (optional).\n */\n constructor(\n public url: string,\n private apiKey?: string\n ) {\n this.nativeProvider = new TronWeb({\n fullHost: url,\n headers: {\n // use object destructuring to conditionally add header\n ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}),\n },\n })\n }\n\n /**\n * Creates an instance of TronWebProvider from the given URL and API key.\n *\n * @param {string} url - The URL of the Tron node.\n * @param {string} [apiKey] - The API key for accessing the Tron node (optional).\n * @returns {TronWebProvider} The created TronWebProvider instance.\n */\n static from(url: string, apiKey?: string): TronWebProvider\n\n /**\n * Creates an instance of TronWebProvider from the given source.\n *\n * @param {string} source - The source to create the provider from.\n * @param {string} [apiKey] - The API key for accessing the Tron node (optional).\n * @returns {TronWebProvider} The created TronWebProvider instance.\n * @throws {Error} If the parameters are invalid.\n */\n static from(source: string, apiKey?: string): TronWebProvider {\n if (typeof source === 'string') {\n return new this(source, apiKey)\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n /**\n * Gets the native TronWeb provider instance.\n *\n * @returns {TronWeb} The native TronWeb provider instance.\n */\n get native(): unknown {\n return this.nativeProvider\n }\n\n /**\n * Gets the balance of the specified address.\n *\n * @param {string} address - The address to get the balance of.\n * @returns {Promise<string>} A promise that resolves to the balance of the address.\n */\n async getBalance(address: string): Promise<string> {\n return this.nativeProvider.trx.getBalance(address).then((balance: number) => balance.toString())\n }\n\n /**\n * Gets the block specified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<Block>} A promise that resolves to the block.\n */\n async getBlock(blockTag: string | number): Promise<Block> {\n const response = await this.nativeProvider.trx.getBlock(blockTag)\n return Block.from(response)\n }\n\n /**\n * Gets the block with transactions specified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<BlockWithTransactions>} A promise that resolves to the block with transactions.\n */\n async getBlockWithTransactions(blockTag: string | number): Promise<BlockWithTransactions> {\n const response = await this.nativeProvider.trx.getBlock(blockTag)\n return BlockWithTransactions.from(response)\n }\n\n /**\n * Gets the current block number.\n *\n * @returns {Promise<number>} A promise that resolves to the current block number.\n */\n async getBlockNumber(): Promise<number> {\n return this.nativeProvider.trx\n .getBlock('latest')\n .then((block: { block_header: { raw_data: { number?: number } } }) => {\n if (block.block_header.raw_data.number === undefined) {\n throw new Error('Invalid block, block_header.raw_data.number is undefined')\n }\n return block.block_header.raw_data.number\n })\n }\n\n /**\n * Gets the UNIX timestamp for the block identified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<number>} A promise that resolves to the UNIX timestamp of the block.\n */\n async getBlockTimestamp(blockTag: string | number): Promise<number> {\n return this.nativeProvider.trx\n .getBlock(blockTag)\n .then((block: { block_header: { raw_data: { timestamp?: number } } }) => {\n if (block.block_header.raw_data.timestamp === undefined) {\n throw new Error('Invalid block, block_header.raw_data.timestamp is undefined')\n }\n return block.block_header.raw_data.timestamp\n })\n }\n\n /**\n * Gets the current slot number for commitment, not suitable for Tron.\n *\n * @param {Finality} [finality] - The commitment level (optional).\n * @returns {Promise<number>} A promise that resolves to the current slot number.\n * @throws {Error} Method not implemented.\n */\n async getSlot(_finality?: Finality): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not implemented.')\n }\n\n /**\n * Gets information about a transaction.\n *\n * @param {string} txHash - The hash of the transaction.\n * @returns {Promise<TransactionResponse>} A promise that resolves to the transaction response.\n */\n async getTransaction(txHash: string): Promise<TransactionResponse> {\n const response = await this.nativeProvider.trx.getTransaction(txHash)\n return TransactionResponse.from(response)\n }\n\n /**\n * Gets the receipt of a transaction.\n *\n * @param {string} txHash - The hash of the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async getTransactionReceipt(txHash: string): Promise<TransactionReceipt> {\n // reference: https://developers.tron.network/reference/gettransactioninfobyid-1\n const response = await this.nativeProvider.trx.getTransactionInfo(txHash)\n return TransactionReceipt.from(response)\n }\n\n /**\n * Gets the number of transactions sent from the specified address.\n *\n * @param {string | Promise<string>} _addressOrName - The address to get the number of transactions from.\n * @param {BlockTag | Promise<BlockTag>} [_blockTag] - The block tag to get the number of transactions from (optional).\n * @returns {Promise<number>} A promise that resolves to the number of transactions sent from the address.\n * @throws {Error} Method not supported in Tron.\n */\n async getTransactionCount(\n _addressOrName: string | Promise<string>,\n _blockTag?: BlockTag | Promise<BlockTag>\n ): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not supported in Tron.')\n }\n\n /**\n * Sends a signed transaction to the blockchain.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [sendOptions] - Optional parameters for sending the transaction.\n * @returns {Promise<TransactionPending>} A promise that resolves to the pending transaction.\n */\n async sendTransaction(\n transaction: SignedTransaction,\n sendOptions?: { confirmations?: number }\n ): Promise<TransactionPending> {\n // reference: https://developers.tron.network/reference/broadcasttransaction\n type NativeSignedTransaction = Parameters<typeof this.nativeProvider.trx.sendRawTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n const response = await this.nativeProvider.trx.sendRawTransaction(stx, sendOptions)\n\n if (response.code !== undefined) {\n const error = {\n error: response.code,\n message: response.message !== undefined ? TronWeb.toUtf8(response.message) : response.code,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n if (response.txid === undefined) {\n throw new Error('Invalid response, txid is undefined')\n }\n\n return TransactionPending.from(response)\n }\n\n /**\n * Confirms a pending transaction.\n *\n * @param {TransactionPending} pending - The pending transaction to confirm.\n * @param {object} [opts] - Optional parameters for the confirmation.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async confirmTransaction(\n pending: TransactionPending,\n opts?: { confirmations?: number }\n ): Promise<TransactionReceipt> {\n const nativePending = pending.pending as {\n result: boolean\n txid: string\n code: string\n message: string\n transaction: unknown\n wait: (confirmations?: number) => Promise<unknown>\n }\n const txHash = nativePending.txid\n const confirmations = opts?.confirmations\n let tries = 0\n while (tries++ < (confirmations ?? 20)) {\n // FIXME: not fully implemented\n const receipt = await this.getTransactionReceipt(txHash)\n const response = receipt.receipt as TransactionInfo\n if (!Object.keys(response).length) {\n // reference: https://developers.tron.network/page/faq\n // Within current testing environment, one block is produced every 3 seconds.\n // But for the local environment, it may take 1 minute to produce a block.\n await sleep(1200)\n continue\n }\n\n if (response.result !== undefined && response.result === 'FAILED') {\n const error = {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n error: TronWeb.toUtf8(response.resMessage ?? ''),\n response: response,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n if (!('contractResult' in response)) {\n const error = {\n error: 'Failed to execute: ' + JSON.stringify(response, null, 2),\n response: response,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n return TransactionReceipt.from(response)\n }\n throw new Error(`Transaction not confirmed, txHash: ${txHash}`)\n }\n\n /**\n * Sends a signed transaction and waits for confirmation.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [opts] - Optional parameters for sending and confirming the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async sendAndConfirm(\n transaction: SignedTransaction,\n opts?: { confirmations?: number }\n ): Promise<TransactionReceipt> {\n // reference: https://developers.tron.network/reference/broadcasttransaction\n const pending = await this.sendTransaction(transaction, opts)\n return this.confirmTransaction(pending, opts)\n }\n}\n","import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\nimport {\n Provider,\n SignedTransaction,\n Signer,\n TransactionPending,\n TransactionReceipt,\n TransactionRequest,\n} from '@layerzerolabs/lz-core'\nimport { Memoizee, trim0x } from '@layerzerolabs/lz-utilities'\nimport { sendTronTransaction, signTronTx } from '@layerzerolabs/tron-utilities'\n\nimport { ensureJsonRpcUrlPostfix, removeJsonRpcUrlPostfix, toValidHash } from '../utils/tron'\n\n/**\n * TronSigner is a wrapper around TronWeb that implements the Signer interface\n * It is implemented using ethers.js\n */\nexport class TronSigner implements Signer {\n private readonly nativeSigner: ethers.Signer\n\n /**\n * Creates an instance of TronSigner.\n *\n * @param {ethers.Signer} signer - The Ethers signer to use.\n */\n private constructor(signer: ethers.Signer) {\n this.nativeSigner = signer\n }\n\n /**\n * Creates an instance of TronSigner from an Ethers signer.\n *\n * @param {ethers.Signer} source - The Ethers signer to create the TronSigner from.\n * @returns {Signer} The created TronSigner instance.\n */\n static from(source: ethers.Signer): Signer\n\n /**\n * Creates an instance of TronSigner from a TronWeb client.\n *\n * @param {TronWeb} client - The TronWeb client to create the TronSigner from.\n * @returns {Signer} The created TronSigner instance.\n */\n static from(client: TronWeb): Signer\n\n /**\n * Creates an instance of TronSigner from a private key.\n *\n * @param {string} privKey - The private key to create the TronSigner from.\n * @returns {Signer} The created TronSigner instance.\n */\n static from(privKey: string): Signer\n\n /**\n * Creates an instance of TronSigner from a mnemonic and derivation path.\n *\n * @param {string} mnemonic - The mnemonic to create the TronSigner from.\n * @param {string} path - The derivation path (e.g., m/44'/195'/0'/0/0).\n * @returns {Signer} The created TronSigner instance.\n */\n static from(mnemonic: string, path: string): Signer\n\n /**\n * Creates an instance of TronSigner from the given source.\n *\n * @param {ethers.Signer | TronWeb | string} source - The source to create the TronSigner from.\n * @param {string} [path] - The derivation path (optional).\n * @returns {Signer} The created TronSigner instance.\n * @throws {Error} If the parameters are invalid.\n */\n static from(source: ethers.Signer | TronWeb | string, path?: string): Signer {\n if (source instanceof ethers.Signer) {\n return new this(source)\n } else if (source instanceof TronWeb) {\n const apiKey = source.fullNode.headers['TRON-PRO-API-KEY']\n const provider = new ethers.providers.JsonRpcProvider({\n url: ensureJsonRpcUrlPostfix(source.fullNode.host),\n headers: { ...(typeof apiKey !== 'undefined' ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n\n return new this(new ethers.Wallet(source.defaultPrivateKey as string, provider))\n } else if (typeof source === 'string' && path === undefined) {\n return new this(new ethers.Wallet(source))\n } else if (typeof source === 'string' && path !== undefined) {\n return new this(ethers.Wallet.fromMnemonic(source, path))\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n /**\n * Gets the native signer instance.\n *\n * @returns {unknown} The native signer instance.\n */\n get native(): unknown {\n return this.nativeSigner\n }\n\n /**\n * Connects the signer to a provider.\n * IMPORTANT: native provider must be an instance of ethers.providers.JsonRpcProvider.\n *\n * @param {Provider} provider - The provider to connect to.\n * @returns {Signer} The connected signer.\n * @throws {Error} If the provider is not an instance of JsonRpcProvider.\n */\n connect(provider: Provider): Signer {\n if (!(provider.native instanceof ethers.providers.JsonRpcProvider)) {\n throw new Error('Only JsonRpcProvider is supported.')\n }\n\n const signer = this.nativeSigner.connect(provider.native as ethers.providers.Provider)\n // hack: ethers.utils.defineReadOnly does not work with private properties\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n ethers.utils.defineReadOnly(this, 'nativeSigner' as keyof this, signer as any)\n\n return this\n }\n\n /**\n * Builds a TronWeb instance from the given signer.\n * IMPORTANT: signer must be an instance of ethers.Wallet.\n *\n * @param {ethers.Signer} signer - The signer to build the TronWeb instance from.\n * @returns {TronWeb} The built TronWeb instance.\n * @throws {Error} If the signer is not supported.\n */\n static buildTronWebFrom(signer: ethers.Signer): TronWeb {\n if (signer instanceof ethers.Wallet) {\n if (signer.provider instanceof ethers.providers.JsonRpcProvider) {\n const apiKey = signer.provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n return this.createTronWeb(signer.provider.connection.url, signer.privateKey, apiKey)\n }\n }\n throw new Error(`The nativeSigner is not supported.`)\n }\n\n /**\n * Creates a TronWeb instance.\n * The result will be cached based on the arguments.\n *\n * @param {string} url - The URL of the Tron node.\n * @param {string} privateKey - The private key to use.\n * @param {string} [apiKey] - The API key for accessing the Tron node (optional).\n * @returns {TronWeb} The created TronWeb instance.\n */\n @Memoizee({\n normalizer: (args: [string, string, string | undefined]) => JSON.stringify(args),\n })\n static createTronWeb(url: string, privateKey: string, apiKey?: string): TronWeb {\n return new TronWeb({\n privateKey: trim0x(privateKey),\n fullHost: removeJsonRpcUrlPostfix(url),\n headers: { ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n }\n\n /**\n * Gets the address of the signer.\n *\n * @returns {Promise<string>} A promise that resolves to the address of the signer.\n */\n async getAddress(): Promise<string> {\n // reference: https://developers.tron.network/docs/tvm#differences-from-evm\n return this.nativeSigner.getAddress()\n }\n\n /**\n * Sends a signed transaction and waits for confirmation.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [opts] - Optional parameters for sending and confirming the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async sendAndConfirm(transaction: SignedTransaction, _opts?: object): Promise<TransactionReceipt> {\n const pending = (await this.sendTransaction(transaction)).pending as {\n txId: string\n wait: () => unknown\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n await pending.wait()\n const response = await this.nativeSigner.provider?.getTransactionReceipt(toValidHash(pending.txId))\n return TransactionReceipt.from(response)\n }\n\n /**\n * Signs a transaction.\n *\n * @param {TransactionRequest} transaction - The transaction request to sign.\n * @returns {Promise<SignedTransaction>} A promise that resolves to the signed transaction.\n * @throws {Error} If the transaction is invalid.\n */\n async signTransaction(transaction: TransactionRequest): Promise<SignedTransaction> {\n type NativeSignedTransaction = ethers.PopulatedTransaction\n const tx = transaction.request as NativeSignedTransaction\n if (tx.data === undefined || tx.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n\n TronSigner.validateTransaction(tx)\n const client = TronSigner.buildTronWebFrom(this.nativeSigner)\n const response = await signTronTx(\n {\n data: tx.data,\n to: tx.to,\n gasLimit: tx.gasLimit?.toNumber(),\n gasPrice: tx.gasPrice?.toNumber(),\n value: tx.value?.toNumber(),\n // energyFactor: transaction.energyFactor, // TODO: add energyFactor\n },\n client\n )\n return SignedTransaction.from(response)\n }\n\n /**\n * Sends a signed transaction.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [sendOptions] - Optional parameters for sending the transaction.\n * @returns {Promise<TransactionPending>} A promise that resolves to the pending transaction.\n */\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n\n const tronWeb = TronSigner.buildTronWebFrom(this.nativeSigner)\n const response = await sendTronTransaction(stx, tronWeb)\n return TransactionPending.from(response)\n }\n\n /**\n * Signs a buffer (e.g., a message hash) using the native Tron signer.\n *\n * @param {Uint8Array} buffer - The buffer to sign.\n * @returns {Promise<Uint8Array>} A promise that resolves to the signed buffer as a Uint8Array.\n */\n async signBuffer(buffer: Uint8Array): Promise<Uint8Array> {\n // ETH_MESSAGE_HEADER is defined as '\\x19Ethereum Signed Message:\\n32' in TronWeb,\n // which will cause the signature to be different from ethers.js if the message length is not 32 bytes\n const signedMessage = await this.nativeSigner.signMessage(buffer)\n return ethers.utils.arrayify(signedMessage)\n }\n\n /**\n * Validates a transaction.\n *\n * @param {ethers.PopulatedTransaction} transaction - The transaction to validate.\n * @returns {boolean} True if the transaction is valid, false otherwise.\n * @throws {Error} If the transaction is invalid.\n */\n static validateTransaction(transaction: ethers.PopulatedTransaction): boolean {\n if (transaction.data === undefined || transaction.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n return true\n }\n}\n","import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\nimport {\n Provider,\n SignedTransaction,\n Signer,\n TransactionPending,\n TransactionReceipt,\n TransactionRequest,\n} from '@layerzerolabs/lz-core'\nimport { trim0x } from '@layerzerolabs/lz-utilities'\nimport { sendTronTransaction, signTronTx } from '@layerzerolabs/tron-utilities'\n\n/**\n * TronWebSigner is a wrapper around TronWeb that implements the Signer interface\n *\n * PITFALL:\n * - This class is not compatible with ethers.js and is not fully tested.\n * - The signature produced by signBuffer is different from the ethers signer\n * when the message length is not 32 bytes\n * - The format of the response from sendTransaction differs from that of the ethers signer.\n */\nexport class TronWebSigner implements Signer {\n private readonly nativeSigner: TronWeb\n\n /**\n * Creates an instance of TronWebSigner.\n *\n * @param {TronWeb} signer - The TronWeb signer to use.\n */\n private constructor(signer: TronWeb) {\n this.nativeSigner = signer\n }\n\n /**\n * Creates an instance of TronWebSigner from a TronWeb client.\n *\n * @param {TronWeb} signer - The TronWeb client to create the TronWebSigner from.\n * @returns {Signer} The created TronWebSigner instance.\n */\n static from(signer: TronWeb): Signer\n\n /**\n * Creates an instance of TronWebSigner from a private key.\n *\n * @param {string} privKey - The private key to create the TronWebSigner from.\n * @returns {Signer} The created TronWebSigner instance.\n */\n static from(privKey: string): Signer\n\n /**\n * Creates an instance of TronWebSigner from a mnemonic and derivation path.\n *\n * @param {string} mnemonic - The mnemonic to create the TronWebSigner from.\n * @param {string} [path] - The derivation path (optional).\n * @returns {Signer} The created TronWebSigner instance.\n */\n static from(mnemonic: string, path?: string): Signer\n\n /**\n * Creates an instance of TronWebSigner from the given source.\n *\n * @param {TronWeb | string} source - The source to create the TronWebSigner from.\n * @param {string} [path] - The derivation path (optional).\n * @returns {Signer} The created TronWebSigner instance.\n * @throws {Error} If the parameters are invalid.\n */\n static from(source: TronWeb | string, path?: string): Signer {\n const fullHost = 'https://api.trongrid.io'\n if (source instanceof TronWeb) {\n return new this(source)\n } else if (typeof source === 'string' && path === undefined) {\n const privateKey = trim0x(source)\n return new this(new TronWeb({ privateKey, fullHost }))\n } else if (typeof source === 'string' && path !== undefined) {\n const privateKey = trim0x(TronWeb.fromMnemonic(source, path).privateKey)\n return new this(new TronWeb({ privateKey, fullHost }))\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n /**\n * Gets the native TronWeb signer instance.\n *\n * @returns {unknown} The native TronWeb signer instance.\n */\n get native(): unknown {\n return this.nativeSigner\n }\n\n /**\n * Connects the signer to a provider.\n *\n * @param {Provider} provider - The provider to connect to.\n * @returns {Signer} The connected signer.\n */\n connect(provider: Provider): Signer {\n const nativeProvider = provider.native as TronWeb\n const { fullNode, solidityNode, eventServer } = nativeProvider.currentProviders() as {\n fullNode: unknown\n solidityNode: unknown\n eventServer: unknown\n }\n this.nativeSigner.setFullNode(fullNode)\n this.nativeSigner.setSolidityNode(solidityNode)\n this.nativeSigner.setEventServer(eventServer)\n return this\n }\n\n /**\n * Gets the address of the signer.\n *\n * @returns {Promise<string>} A promise that resolves to the address of the signer.\n */\n async getAddress(): Promise<string> {\n if (typeof this.nativeSigner.defaultAddress.hex !== 'string') {\n throw new Error('Invalid address')\n }\n const retval = this.nativeSigner.defaultAddress.hex.replace(/^41/, '0x')\n return Promise.resolve(retval)\n }\n\n /**\n * Sends a signed transaction and waits for confirmation.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [sendOptions] - Optional parameters for sending and confirming the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async sendAndConfirm(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionReceipt> {\n const pending = (await this.sendTransaction(transaction)).pending as {\n txId: string\n wait: () => unknown\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const response = await pending.wait()\n return TransactionReceipt.from(response)\n }\n\n /**\n * Signs a transaction.\n *\n * @param {TransactionRequest} transaction - The transaction request to sign.\n * @returns {Promise<SignedTransaction>} A promise that resolves to the signed transaction.\n * @throws {Error} If the transaction is invalid.\n */\n async signTransaction(transaction: TransactionRequest): Promise<SignedTransaction> {\n type NativeSignedTransaction = ethers.PopulatedTransaction\n const tx = transaction.request as NativeSignedTransaction\n if (tx.data === undefined || tx.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n\n TronWebSigner.validateTransaction(tx)\n const response = await signTronTx(\n {\n data: tx.data,\n to: tx.to,\n gasLimit: tx.gasLimit?.toNumber(),\n gasPrice: tx.gasPrice?.toNumber(),\n value: tx.value?.toNumber(),\n // energyFactor: transaction.energyFactor, // FIXME: add energyFactor\n },\n this.nativeSigner\n )\n return SignedTransaction.from(response)\n }\n\n /**\n * Sends a signed transaction.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [sendOptions] - Optional parameters for sending the transaction.\n * @returns {Promise<TransactionPending>} A promise that resolves to the pending transaction.\n */\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n\n const response = await sendTronTransaction(stx, this.nativeSigner)\n return TransactionPending.from(response)\n }\n\n /**\n * signBuffer signs a buffer using the native signer\n * but the signString function of native signer is different from the ethers signer,\n * TronWeb uses a message header with a fixed 32 bytes length, which means that only if\n * the message length is 32 bytes, the signature will be the same as the ethereum signature.\n * you can find the signString function here:\n * https://github.com/tronprotocol/tronweb/blob/master/src/lib/trx.js\n *\n * @param {Uint8Array} buffer - The buffer to sign.\n * @returns {Promise<Uint8Array>} A promise that resolves to the signed buffer as a Uint8Array.\n * @throws {Error} If the private key is invalid.\n */\n async signBuffer(buffer: Uint8Array): Promise<Uint8Array> {\n // ETH_MESSAGE_HEADER is defined as '\\x19Ethereum Signed Message:\\n32',\n // so that the signature will be the same as the ethereum signature only if\n // the message length is 32 bytes.\n if (typeof this.nativeSigner.defaultPrivateKey !== 'string') {\n throw new Error('Invalid private key')\n }\n const signedMessage = await TronWeb.Trx.signString(\n ethers.utils.hexlify(buffer),\n this.nativeSigner.defaultPrivateKey,\n false\n )\n const retval = ethers.utils.arrayify(signedMessage)\n return Promise.resolve(retval)\n }\n\n /**\n * Validates a transaction.\n *\n * @param {ethers.PopulatedTransaction} transaction - The transaction to validate.\n * @returns {boolean} True if the transaction is valid, false otherwise.\n * @throws {Error} If the transaction is invalid.\n */\n static validateTransaction(transaction: ethers.PopulatedTransaction): boolean {\n if (transaction.data === undefined || transaction.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n return true\n }\n}\n"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -387,14 +387,6 @@ declare class TronSigner implements Signer {
|
|
|
387
387
|
* @throws {Error} If the transaction is invalid.
|
|
388
388
|
*/
|
|
389
389
|
static validateTransaction(transaction: ethers.PopulatedTransaction): boolean;
|
|
390
|
-
/**
|
|
391
|
-
* Builds a transaction.
|
|
392
|
-
*
|
|
393
|
-
* @param {unknown} buildTxRequest - The transaction request to build.
|
|
394
|
-
* @returns {Promise<TransactionRequest>} A promise that resolves to the built transaction request.
|
|
395
|
-
* @throws {Error} Method not implemented.
|
|
396
|
-
*/
|
|
397
|
-
buildTransaction(buildTxRequest: unknown): Promise<TransactionRequest>;
|
|
398
390
|
}
|
|
399
391
|
|
|
400
392
|
/**
|
|
@@ -500,14 +492,6 @@ declare class TronWebSigner implements Signer {
|
|
|
500
492
|
* @throws {Error} If the transaction is invalid.
|
|
501
493
|
*/
|
|
502
494
|
static validateTransaction(transaction: ethers.PopulatedTransaction): boolean;
|
|
503
|
-
/**
|
|
504
|
-
* Builds a transaction.
|
|
505
|
-
*
|
|
506
|
-
* @param {unknown} buildTxRequest - The transaction request to build.
|
|
507
|
-
* @returns {Promise<TransactionRequest>} A promise that resolves to the built transaction request.
|
|
508
|
-
* @throws {Error} Method not implemented.
|
|
509
|
-
*/
|
|
510
|
-
buildTransaction(buildTxRequest: unknown): Promise<TransactionRequest>;
|
|
511
495
|
}
|
|
512
496
|
|
|
513
497
|
export { TronProvider, TronSigner, TronWebProvider, TronWebSigner };
|
package/dist/index.d.ts
CHANGED
|
@@ -387,14 +387,6 @@ declare class TronSigner implements Signer {
|
|
|
387
387
|
* @throws {Error} If the transaction is invalid.
|
|
388
388
|
*/
|
|
389
389
|
static validateTransaction(transaction: ethers.PopulatedTransaction): boolean;
|
|
390
|
-
/**
|
|
391
|
-
* Builds a transaction.
|
|
392
|
-
*
|
|
393
|
-
* @param {unknown} buildTxRequest - The transaction request to build.
|
|
394
|
-
* @returns {Promise<TransactionRequest>} A promise that resolves to the built transaction request.
|
|
395
|
-
* @throws {Error} Method not implemented.
|
|
396
|
-
*/
|
|
397
|
-
buildTransaction(buildTxRequest: unknown): Promise<TransactionRequest>;
|
|
398
390
|
}
|
|
399
391
|
|
|
400
392
|
/**
|
|
@@ -500,14 +492,6 @@ declare class TronWebSigner implements Signer {
|
|
|
500
492
|
* @throws {Error} If the transaction is invalid.
|
|
501
493
|
*/
|
|
502
494
|
static validateTransaction(transaction: ethers.PopulatedTransaction): boolean;
|
|
503
|
-
/**
|
|
504
|
-
* Builds a transaction.
|
|
505
|
-
*
|
|
506
|
-
* @param {unknown} buildTxRequest - The transaction request to build.
|
|
507
|
-
* @returns {Promise<TransactionRequest>} A promise that resolves to the built transaction request.
|
|
508
|
-
* @throws {Error} Method not implemented.
|
|
509
|
-
*/
|
|
510
|
-
buildTransaction(buildTxRequest: unknown): Promise<TransactionRequest>;
|
|
511
495
|
}
|
|
512
496
|
|
|
513
497
|
export { TronProvider, TronSigner, TronWebProvider, TronWebSigner };
|
package/dist/index.mjs
CHANGED
|
@@ -7,12 +7,11 @@ import { StrategyFactory, sendTronTransaction, signTronTx } from '@layerzerolabs
|
|
|
7
7
|
var __defProp = Object.defineProperty;
|
|
8
8
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
9
9
|
var __decorateClass = (decorators, target, key, kind) => {
|
|
10
|
-
var result =
|
|
10
|
+
var result = __getOwnPropDesc(target, key) ;
|
|
11
11
|
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
12
12
|
if (decorator = decorators[i])
|
|
13
|
-
result = (
|
|
14
|
-
if (
|
|
15
|
-
__defProp(target, key, result);
|
|
13
|
+
result = (decorator(target, key, result) ) || result;
|
|
14
|
+
if (result) __defProp(target, key, result);
|
|
16
15
|
return result;
|
|
17
16
|
};
|
|
18
17
|
function ensureJsonRpcUrlPostfix(url) {
|
|
@@ -232,7 +231,7 @@ __decorateClass([
|
|
|
232
231
|
return JSON.stringify(provider);
|
|
233
232
|
}
|
|
234
233
|
})
|
|
235
|
-
], TronProvider.prototype, "buildTronWebFrom"
|
|
234
|
+
], TronProvider.prototype, "buildTronWebFrom");
|
|
236
235
|
var TronWebProvider = class {
|
|
237
236
|
/**
|
|
238
237
|
* Creates a new TronWebProvider.
|
|
@@ -612,22 +611,12 @@ var _TronSigner = class _TronSigner {
|
|
|
612
611
|
}
|
|
613
612
|
return true;
|
|
614
613
|
}
|
|
615
|
-
/**
|
|
616
|
-
* Builds a transaction.
|
|
617
|
-
*
|
|
618
|
-
* @param {unknown} buildTxRequest - The transaction request to build.
|
|
619
|
-
* @returns {Promise<TransactionRequest>} A promise that resolves to the built transaction request.
|
|
620
|
-
* @throws {Error} Method not implemented.
|
|
621
|
-
*/
|
|
622
|
-
async buildTransaction(buildTxRequest) {
|
|
623
|
-
return Promise.reject(new Error("Method not implemented."));
|
|
624
|
-
}
|
|
625
614
|
};
|
|
626
615
|
__decorateClass([
|
|
627
616
|
Memoizee({
|
|
628
617
|
normalizer: (args) => JSON.stringify(args)
|
|
629
618
|
})
|
|
630
|
-
], _TronSigner, "createTronWeb"
|
|
619
|
+
], _TronSigner, "createTronWeb");
|
|
631
620
|
var TronSigner = _TronSigner;
|
|
632
621
|
var TronWebSigner = class _TronWebSigner {
|
|
633
622
|
/**
|
|
@@ -781,18 +770,8 @@ var TronWebSigner = class _TronWebSigner {
|
|
|
781
770
|
}
|
|
782
771
|
return true;
|
|
783
772
|
}
|
|
784
|
-
/**
|
|
785
|
-
* Builds a transaction.
|
|
786
|
-
*
|
|
787
|
-
* @param {unknown} buildTxRequest - The transaction request to build.
|
|
788
|
-
* @returns {Promise<TransactionRequest>} A promise that resolves to the built transaction request.
|
|
789
|
-
* @throws {Error} Method not implemented.
|
|
790
|
-
*/
|
|
791
|
-
async buildTransaction(buildTxRequest) {
|
|
792
|
-
return Promise.reject(new Error("Method not implemented."));
|
|
793
|
-
}
|
|
794
773
|
};
|
|
795
774
|
|
|
796
775
|
export { TronProvider, TronSigner, TronWebProvider, TronWebSigner };
|
|
797
|
-
//# sourceMappingURL=
|
|
776
|
+
//# sourceMappingURL=index.mjs.map
|
|
798
777
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/providers/tron.ts","../src/utils/tron.ts","../src/providers/tronweb.ts","../src/signers/tron.ts","../src/signers/tronweb.ts"],"names":["ethers","TronWeb","Block","BlockWithTransactions","TransactionPending","TransactionReceipt","TransactionResponse","SignedTransaction","Memoizee","sendTronTransaction","trim0x","signTronTx"],"mappings":"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","sourcesContent":["import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\nimport {\n Block,\n BlockTag,\n BlockWithTransactions,\n Finality,\n Provider,\n SignedTransaction,\n TransactionPending,\n TransactionReceipt,\n TransactionResponse,\n} from '@layerzerolabs/lz-core'\nimport { Memoizee } from '@layerzerolabs/lz-utilities'\nimport { StrategyFactory, sendTronTransaction } from '@layerzerolabs/tron-utilities'\n\nimport { toEtherFormat, toValidHash } from '../utils/tron'\n\n/**\n * TronProvider is a wrapper around TronWeb that implements the Provider interface\n * It is implemented using ethers.js\n */\nexport class TronProvider implements Provider {\n nativeProvider: ethers.providers.StaticJsonRpcProvider\n\n /**\n * Creates an instance of TronProvider.\n *\n * @param {string} url - RPC endpoint of the Tron full node, e.g. 'https://api.trongrid.io'\n * @param {string} [apiKey] - The API key for accessing the Tron full node (optional).\n */\n private constructor(\n public url: string,\n apiKey?: string\n ) {\n this.nativeProvider = new ethers.providers.StaticJsonRpcProvider({\n url: StrategyFactory.get(url).asJSONRPC(url),\n headers: {\n // use object destructuring to conditionally add header\n ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}),\n },\n })\n }\n\n /**\n * Creates an instance of TronProvider from the given URL and API key.\n *\n * @param {string} url - The URL of the Tron node.\n * @param {string} [apiKey] - The API key for accessing the Tron node (optional).\n * @returns {TronProvider} The created TronProvider instance.\n */\n static from(url: string, apiKey?: string): TronProvider\n\n /**\n * Creates an instance of TronProvider from a TronWeb client.\n *\n * @param {TronWeb} client - The TronWeb client to create the provider from.\n * @returns {TronProvider} The created TronProvider instance.\n */\n static from(client: TronWeb): TronProvider\n\n /**\n * Creates an instance of TronProvider from the given source.\n *\n * @param {string | TronWeb} source - The source to create the provider from.\n * @param {string} [apiKey] - The API key for accessing the Tron node (optional).\n * @returns {TronProvider} The created TronProvider instance.\n * @throws {Error} If the parameters are invalid.\n */\n static from(source: string | TronWeb, apiKey?: string): TronProvider {\n if (typeof source === 'string') {\n return new this(source, apiKey)\n } else if (source instanceof TronWeb) {\n const { host, headers } = source.fullNode\n return this.from(host, headers['TRON-PRO-API-KEY'])\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n /**\n * Returns the native provider.\n *\n * @returns {unknown} The native provider.\n */\n get native(): unknown {\n return this.nativeProvider\n }\n\n /**\n * Builds a TronWeb instance from the given provider.\n * The result will be cached based on the provider's URL and API key.\n *\n * @param {ethers.providers.Provider} provider - The provider to build the TronWeb instance from.\n * @returns {TronWeb} The built TronWeb instance.\n * @throws {Error} If the provider is not supported.\n */\n @Memoizee({\n normalizer: (args: [ethers.providers.Provider]) => {\n const provider = args[0]\n if (provider instanceof ethers.providers.JsonRpcProvider) {\n const { url } = provider.connection\n const apiKey = provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n return JSON.stringify({ url, apiKey })\n }\n return JSON.stringify(provider)\n },\n })\n private buildTronWebFrom(provider: ethers.providers.Provider): TronWeb {\n if (provider instanceof ethers.providers.JsonRpcProvider) {\n const { url } = provider.connection\n const apiKey = provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n\n return new TronWeb({\n privateKey: undefined,\n fullHost: StrategyFactory.get(url).asREST(url),\n headers: { ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n }\n\n throw new Error(`The nativeSigner is not supported.`)\n }\n\n /**\n * Gets the balance of the specified address.\n *\n * @param {string} address - The address to get the balance of.\n * @returns {Promise<string>} A promise that resolves to the balance of the address.\n */\n async getBalance(address: string): Promise<string> {\n return this.nativeProvider.getBalance(toEtherFormat(address)).then((balance) => balance.toString())\n }\n\n /**\n * Gets the block specified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<Block>} A promise that resolves to the block.\n */\n async getBlock(blockTag: string | number): Promise<Block> {\n const response = await this.nativeProvider.getBlock(blockTag)\n return Block.from(response)\n }\n\n /**\n * Gets the block with transactions specified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<BlockWithTransactions>} A promise that resolves to the block with transactions.\n */\n async getBlockWithTransactions(blockTag: string | number): Promise<BlockWithTransactions> {\n const response = await this.nativeProvider.getBlockWithTransactions(blockTag)\n return BlockWithTransactions.from(response)\n }\n\n /**\n * Gets the current block number.\n *\n * @returns {Promise<number>} A promise that resolves to the current block number.\n */\n async getBlockNumber(): Promise<number> {\n return this.nativeProvider.getBlockNumber()\n }\n\n /**\n * Gets the UNIX timestamp for the block identified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<number>} A promise that resolves to the UNIX timestamp of the block.\n */\n async getBlockTimestamp(blockTag: string | number): Promise<number> {\n return this.nativeProvider.getBlock(blockTag).then((block) => block.timestamp)\n }\n\n /**\n * Gets the current slot number for commitment, not suitable for Tron.\n *\n * @param {Finality} [finality] - The commitment level (optional).\n * @returns {Promise<number>} A promise that resolves to the current slot number.\n * @throws {Error} Method not implemented.\n */\n async getSlot(_finality?: Finality): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not implemented.')\n }\n\n /**\n * Gets information about a transaction.\n *\n * @param {string} txHash - The hash of the transaction.\n * @returns {Promise<TransactionResponse>} A promise that resolves to the transaction response.\n */\n async getTransaction(txHash: string): Promise<TransactionResponse> {\n const response = await this.nativeProvider.getTransaction(toValidHash(txHash))\n return TransactionResponse.from(response)\n }\n\n /**\n * Gets the receipt of a transaction.\n *\n * @param {string} txHash - The hash of the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async getTransactionReceipt(txHash: string): Promise<TransactionReceipt> {\n const response = await this.nativeProvider.getTransactionReceipt(toValidHash(txHash))\n return TransactionReceipt.from(response)\n }\n\n /**\n * Gets the number of transactions sent from the specified address.\n *\n * @param {string | Promise<string>} _addressOrName - The address to get the number of transactions from.\n * @param {BlockTag | Promise<BlockTag>} [_blockTag] - The block tag to get the number of transactions from (optional).\n * @returns {Promise<number>} A promise that resolves to the number of transactions sent from the address.\n * @throws {Error} Method not supported in Tron.\n */\n async getTransactionCount(\n _addressOrName: string | Promise<string>,\n _blockTag?: BlockTag | Promise<BlockTag>\n ): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not supported in Tron.')\n }\n\n /**\n * Sends a signed transaction to the blockchain.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [sendOptions] - Optional parameters for sending the transaction.\n * @returns {Promise<TransactionPending>} A promise that resolves to the pending transaction.\n */\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n // reference: https://developers.tron.network/reference/json-rpc-api-overview\n // eth_sendRawTransaction is not supported in the JSON-RPC API of the TRON network\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n const client = this.buildTronWebFrom(this.nativeProvider)\n const response = await sendTronTransaction(stx, client)\n\n return TransactionPending.from(response)\n }\n\n /**\n * Confirms a pending transaction.\n *\n * @param {TransactionPending} pending - The pending transaction to confirm.\n * @param {object} [opts] - Optional parameters for the confirmation.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async confirmTransaction(pending: TransactionPending, _opts?: object): Promise<TransactionReceipt> {\n const nativePending = pending.pending as {\n txId: string\n result: unknown\n wait: () => Promise<unknown>\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const response = await nativePending.wait()\n return TransactionReceipt.from(response)\n }\n\n /**\n * Sends a signed transaction and waits for confirmation.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [opts] - Optional parameters for sending and confirming the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async sendAndConfirm(transaction: SignedTransaction, opts?: object): Promise<TransactionReceipt> {\n const pending = await this.sendTransaction(transaction, opts)\n return this.confirmTransaction(pending, opts)\n }\n}\n","import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\n/**\n * Ensures that the URL conforms to the TronGrid API convention by appending /jsonrpc if necessary.\n *\n * @param {string} url - The URL to ensure.\n * @returns {string} The URL with /jsonrpc appended if necessary.\n */\nexport function ensureJsonRpcUrlPostfix(url: string): string {\n // reference: https://developers.tron.network/docs/networks#mainnet\n // TronGrid API:https://api.trongrid.io\n // TronGrid JSON-RPC API: https://api.trongrid.io/jsonrpc\n // so that /jsonrpc is required to connect the JSON-RPC API endpoint\n const value = url.trim().replace(/\\/*$/, '')\n if (!value.endsWith('/jsonrpc')) {\n return value + '/jsonrpc'\n }\n return value\n}\n\n/**\n * Removes the /jsonrpc postfix from the URL.\n *\n * @param {string} url - The URL to remove the postfix from.\n * @returns {string} The URL without the /jsonrpc postfix.\n */\nexport function removeJsonRpcUrlPostfix(url: string): string {\n return url.replace(/\\/jsonrpc$/, '')\n}\n\n/**\n * Converts a Tron address to an Ethereum hex address.\n * reference: https://developers.tron.network/docs/account#account-address-format\n * the TRON network account address can be a Hex format and Base58 format.\n * - The hex format is 42 characters long, removing the leading 41 from Hex format to get the Ethereum address.\n * - The Base58 format is 34 characters long, all Base58 addresses begin with T.\n *\n * @param {string} address - The Tron address to convert.\n * @returns {string} The Ethereum hex address.\n * @throws {Error} If the address format is invalid.\n */\nexport function toEtherFormat(address: string): string {\n if (address.startsWith('T') && address.length === 34) {\n return TronWeb.address.toHex(address).slice(2)\n } else if (address.startsWith('41') && address.length === 42) {\n return address.slice(2)\n } else {\n return address\n }\n}\n\n/**\n * Convert a transaction hash to a valid hash\n * reference: https://developers.tron.network/reference/eth_gettransactionbyhash\n * txHash should be a hex string with 0x, otherwise it will throw an error \"invalid hash\" - INVALID_ARGUMENT\n *\n * @param {string} txHash - The transaction hash to convert.\n * @returns {string} The valid transaction hash.\n */\nexport function toValidHash(txHash: string): string {\n return ethers.utils.hexlify(txHash, { allowMissingPrefix: true })\n}\n","import TronWeb from 'tronweb'\n\nimport {\n Block,\n BlockTag,\n BlockWithTransactions,\n Finality,\n Provider,\n SignedTransaction,\n TransactionPending,\n TransactionReceipt,\n TransactionResponse,\n} from '@layerzerolabs/lz-core'\nimport { sleep } from '@layerzerolabs/lz-utilities'\n\nimport type { TransactionInfo } from 'tronweb'\n\n/**\n * TronWebProvider is a wrapper around TronWeb that implements the Provider interface\n *\n * PITFALL:\n * - This class is not compatible with ethers.js and is not fully tested.\n * - The format of the response from sendTransaction and the receipt from getTransactionReceipt differs\n * from that of the ethers provider.\n */\nexport class TronWebProvider implements Provider {\n nativeProvider: TronWeb\n\n /**\n * Creates a new TronWebProvider.\n *\n * @param {string} url - The RPC endpoint of the Tron full node, e.g., 'https://api.trongrid.io'.\n * @param {string} [apiKey] - The API key for accessing the Tron full node (optional).\n */\n constructor(\n public url: string,\n private apiKey?: string\n ) {\n this.nativeProvider = new TronWeb({\n fullHost: url,\n headers: {\n // use object destructuring to conditionally add header\n ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}),\n },\n })\n }\n\n /**\n * Creates an instance of TronWebProvider from the given URL and API key.\n *\n * @param {string} url - The URL of the Tron node.\n * @param {string} [apiKey] - The API key for accessing the Tron node (optional).\n * @returns {TronWebProvider} The created TronWebProvider instance.\n */\n static from(url: string, apiKey?: string): TronWebProvider\n\n /**\n * Creates an instance of TronWebProvider from the given source.\n *\n * @param {string} source - The source to create the provider from.\n * @param {string} [apiKey] - The API key for accessing the Tron node (optional).\n * @returns {TronWebProvider} The created TronWebProvider instance.\n * @throws {Error} If the parameters are invalid.\n */\n static from(source: string, apiKey?: string): TronWebProvider {\n if (typeof source === 'string') {\n return new this(source, apiKey)\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n /**\n * Gets the native TronWeb provider instance.\n *\n * @returns {TronWeb} The native TronWeb provider instance.\n */\n get native(): unknown {\n return this.nativeProvider\n }\n\n /**\n * Gets the balance of the specified address.\n *\n * @param {string} address - The address to get the balance of.\n * @returns {Promise<string>} A promise that resolves to the balance of the address.\n */\n async getBalance(address: string): Promise<string> {\n return this.nativeProvider.trx.getBalance(address).then((balance: number) => balance.toString())\n }\n\n /**\n * Gets the block specified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<Block>} A promise that resolves to the block.\n */\n async getBlock(blockTag: string | number): Promise<Block> {\n const response = await this.nativeProvider.trx.getBlock(blockTag)\n return Block.from(response)\n }\n\n /**\n * Gets the block with transactions specified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<BlockWithTransactions>} A promise that resolves to the block with transactions.\n */\n async getBlockWithTransactions(blockTag: string | number): Promise<BlockWithTransactions> {\n const response = await this.nativeProvider.trx.getBlock(blockTag)\n return BlockWithTransactions.from(response)\n }\n\n /**\n * Gets the current block number.\n *\n * @returns {Promise<number>} A promise that resolves to the current block number.\n */\n async getBlockNumber(): Promise<number> {\n return this.nativeProvider.trx\n .getBlock('latest')\n .then((block: { block_header: { raw_data: { number?: number } } }) => {\n if (block.block_header.raw_data.number === undefined) {\n throw new Error('Invalid block, block_header.raw_data.number is undefined')\n }\n return block.block_header.raw_data.number\n })\n }\n\n /**\n * Gets the UNIX timestamp for the block identified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<number>} A promise that resolves to the UNIX timestamp of the block.\n */\n async getBlockTimestamp(blockTag: string | number): Promise<number> {\n return this.nativeProvider.trx\n .getBlock(blockTag)\n .then((block: { block_header: { raw_data: { timestamp?: number } } }) => {\n if (block.block_header.raw_data.timestamp === undefined) {\n throw new Error('Invalid block, block_header.raw_data.timestamp is undefined')\n }\n return block.block_header.raw_data.timestamp\n })\n }\n\n /**\n * Gets the current slot number for commitment, not suitable for Tron.\n *\n * @param {Finality} [finality] - The commitment level (optional).\n * @returns {Promise<number>} A promise that resolves to the current slot number.\n * @throws {Error} Method not implemented.\n */\n async getSlot(_finality?: Finality): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not implemented.')\n }\n\n /**\n * Gets information about a transaction.\n *\n * @param {string} txHash - The hash of the transaction.\n * @returns {Promise<TransactionResponse>} A promise that resolves to the transaction response.\n */\n async getTransaction(txHash: string): Promise<TransactionResponse> {\n const response = await this.nativeProvider.trx.getTransaction(txHash)\n return TransactionResponse.from(response)\n }\n\n /**\n * Gets the receipt of a transaction.\n *\n * @param {string} txHash - The hash of the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async getTransactionReceipt(txHash: string): Promise<TransactionReceipt> {\n // reference: https://developers.tron.network/reference/gettransactioninfobyid-1\n const response = await this.nativeProvider.trx.getTransactionInfo(txHash)\n return TransactionReceipt.from(response)\n }\n\n /**\n * Gets the number of transactions sent from the specified address.\n *\n * @param {string | Promise<string>} _addressOrName - The address to get the number of transactions from.\n * @param {BlockTag | Promise<BlockTag>} [_blockTag] - The block tag to get the number of transactions from (optional).\n * @returns {Promise<number>} A promise that resolves to the number of transactions sent from the address.\n * @throws {Error} Method not supported in Tron.\n */\n async getTransactionCount(\n _addressOrName: string | Promise<string>,\n _blockTag?: BlockTag | Promise<BlockTag>\n ): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not supported in Tron.')\n }\n\n /**\n * Sends a signed transaction to the blockchain.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [sendOptions] - Optional parameters for sending the transaction.\n * @returns {Promise<TransactionPending>} A promise that resolves to the pending transaction.\n */\n async sendTransaction(\n transaction: SignedTransaction,\n sendOptions?: { confirmations?: number }\n ): Promise<TransactionPending> {\n // reference: https://developers.tron.network/reference/broadcasttransaction\n type NativeSignedTransaction = Parameters<typeof this.nativeProvider.trx.sendRawTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n const response = await this.nativeProvider.trx.sendRawTransaction(stx, sendOptions)\n\n if (response.code !== undefined) {\n const error = {\n error: response.code,\n message: response.message !== undefined ? TronWeb.toUtf8(response.message) : response.code,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n if (response.txid === undefined) {\n throw new Error('Invalid response, txid is undefined')\n }\n\n return TransactionPending.from(response)\n }\n\n /**\n * Confirms a pending transaction.\n *\n * @param {TransactionPending} pending - The pending transaction to confirm.\n * @param {object} [opts] - Optional parameters for the confirmation.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async confirmTransaction(\n pending: TransactionPending,\n opts?: { confirmations?: number }\n ): Promise<TransactionReceipt> {\n const nativePending = pending.pending as {\n result: boolean\n txid: string\n code: string\n message: string\n transaction: unknown\n wait: (confirmations?: number) => Promise<unknown>\n }\n const txHash = nativePending.txid\n const confirmations = opts?.confirmations\n let tries = 0\n while (tries++ < (confirmations ?? 20)) {\n // FIXME: not fully implemented\n const receipt = await this.getTransactionReceipt(txHash)\n const response = receipt.receipt as TransactionInfo\n if (!Object.keys(response).length) {\n // reference: https://developers.tron.network/page/faq\n // Within current testing environment, one block is produced every 3 seconds.\n // But for the local environment, it may take 1 minute to produce a block.\n await sleep(1200)\n continue\n }\n\n if (response.result !== undefined && response.result === 'FAILED') {\n const error = {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n error: TronWeb.toUtf8(response.resMessage ?? ''),\n response: response,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n if (!('contractResult' in response)) {\n const error = {\n error: 'Failed to execute: ' + JSON.stringify(response, null, 2),\n response: response,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n return TransactionReceipt.from(response)\n }\n throw new Error(`Transaction not confirmed, txHash: ${txHash}`)\n }\n\n /**\n * Sends a signed transaction and waits for confirmation.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [opts] - Optional parameters for sending and confirming the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async sendAndConfirm(\n transaction: SignedTransaction,\n opts?: { confirmations?: number }\n ): Promise<TransactionReceipt> {\n // reference: https://developers.tron.network/reference/broadcasttransaction\n const pending = await this.sendTransaction(transaction, opts)\n return this.confirmTransaction(pending, opts)\n }\n}\n","import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\nimport {\n Provider,\n SignedTransaction,\n Signer,\n TransactionPending,\n TransactionReceipt,\n TransactionRequest,\n} from '@layerzerolabs/lz-core'\nimport { Memoizee, trim0x } from '@layerzerolabs/lz-utilities'\nimport { sendTronTransaction, signTronTx } from '@layerzerolabs/tron-utilities'\n\nimport { ensureJsonRpcUrlPostfix, removeJsonRpcUrlPostfix, toValidHash } from '../utils/tron'\n\n/**\n * TronSigner is a wrapper around TronWeb that implements the Signer interface\n * It is implemented using ethers.js\n */\nexport class TronSigner implements Signer {\n private readonly nativeSigner: ethers.Signer\n\n /**\n * Creates an instance of TronSigner.\n *\n * @param {ethers.Signer} signer - The Ethers signer to use.\n */\n private constructor(signer: ethers.Signer) {\n this.nativeSigner = signer\n }\n\n /**\n * Creates an instance of TronSigner from an Ethers signer.\n *\n * @param {ethers.Signer} source - The Ethers signer to create the TronSigner from.\n * @returns {Signer} The created TronSigner instance.\n */\n static from(source: ethers.Signer): Signer\n\n /**\n * Creates an instance of TronSigner from a TronWeb client.\n *\n * @param {TronWeb} client - The TronWeb client to create the TronSigner from.\n * @returns {Signer} The created TronSigner instance.\n */\n static from(client: TronWeb): Signer\n\n /**\n * Creates an instance of TronSigner from a private key.\n *\n * @param {string} privKey - The private key to create the TronSigner from.\n * @returns {Signer} The created TronSigner instance.\n */\n static from(privKey: string): Signer\n\n /**\n * Creates an instance of TronSigner from a mnemonic and derivation path.\n *\n * @param {string} mnemonic - The mnemonic to create the TronSigner from.\n * @param {string} path - The derivation path (e.g., m/44'/195'/0'/0/0).\n * @returns {Signer} The created TronSigner instance.\n */\n static from(mnemonic: string, path: string): Signer\n\n /**\n * Creates an instance of TronSigner from the given source.\n *\n * @param {ethers.Signer | TronWeb | string} source - The source to create the TronSigner from.\n * @param {string} [path] - The derivation path (optional).\n * @returns {Signer} The created TronSigner instance.\n * @throws {Error} If the parameters are invalid.\n */\n static from(source: ethers.Signer | TronWeb | string, path?: string): Signer {\n if (source instanceof ethers.Signer) {\n return new this(source)\n } else if (source instanceof TronWeb) {\n const apiKey = source.fullNode.headers['TRON-PRO-API-KEY']\n const provider = new ethers.providers.JsonRpcProvider({\n url: ensureJsonRpcUrlPostfix(source.fullNode.host),\n headers: { ...(typeof apiKey !== 'undefined' ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n\n return new this(new ethers.Wallet(source.defaultPrivateKey as string, provider))\n } else if (typeof source === 'string' && path === undefined) {\n return new this(new ethers.Wallet(source))\n } else if (typeof source === 'string' && path !== undefined) {\n return new this(ethers.Wallet.fromMnemonic(source, path))\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n /**\n * Gets the native signer instance.\n *\n * @returns {unknown} The native signer instance.\n */\n get native(): unknown {\n return this.nativeSigner\n }\n\n /**\n * Connects the signer to a provider.\n * IMPORTANT: native provider must be an instance of ethers.providers.JsonRpcProvider.\n *\n * @param {Provider} provider - The provider to connect to.\n * @returns {Signer} The connected signer.\n * @throws {Error} If the provider is not an instance of JsonRpcProvider.\n */\n connect(provider: Provider): Signer {\n if (!(provider.native instanceof ethers.providers.JsonRpcProvider)) {\n throw new Error('Only JsonRpcProvider is supported.')\n }\n\n const signer = this.nativeSigner.connect(provider.native as ethers.providers.Provider)\n // hack: ethers.utils.defineReadOnly does not work with private properties\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n ethers.utils.defineReadOnly(this, 'nativeSigner' as keyof this, signer as any)\n\n return this\n }\n\n /**\n * Builds a TronWeb instance from the given signer.\n * IMPORTANT: signer must be an instance of ethers.Wallet.\n *\n * @param {ethers.Signer} signer - The signer to build the TronWeb instance from.\n * @returns {TronWeb} The built TronWeb instance.\n * @throws {Error} If the signer is not supported.\n */\n static buildTronWebFrom(signer: ethers.Signer): TronWeb {\n if (signer instanceof ethers.Wallet) {\n if (signer.provider instanceof ethers.providers.JsonRpcProvider) {\n const apiKey = signer.provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n return this.createTronWeb(signer.provider.connection.url, signer.privateKey, apiKey)\n }\n }\n throw new Error(`The nativeSigner is not supported.`)\n }\n\n /**\n * Creates a TronWeb instance.\n * The result will be cached based on the arguments.\n *\n * @param {string} url - The URL of the Tron node.\n * @param {string} privateKey - The private key to use.\n * @param {string} [apiKey] - The API key for accessing the Tron node (optional).\n * @returns {TronWeb} The created TronWeb instance.\n */\n @Memoizee({\n normalizer: (args: [string, string, string | undefined]) => JSON.stringify(args),\n })\n static createTronWeb(url: string, privateKey: string, apiKey?: string): TronWeb {\n return new TronWeb({\n privateKey: trim0x(privateKey),\n fullHost: removeJsonRpcUrlPostfix(url),\n headers: { ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n }\n\n /**\n * Gets the address of the signer.\n *\n * @returns {Promise<string>} A promise that resolves to the address of the signer.\n */\n async getAddress(): Promise<string> {\n // reference: https://developers.tron.network/docs/tvm#differences-from-evm\n return this.nativeSigner.getAddress()\n }\n\n /**\n * Sends a signed transaction and waits for confirmation.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [opts] - Optional parameters for sending and confirming the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async sendAndConfirm(transaction: SignedTransaction, _opts?: object): Promise<TransactionReceipt> {\n const pending = (await this.sendTransaction(transaction)).pending as {\n txId: string\n wait: () => unknown\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n await pending.wait()\n const response = await this.nativeSigner.provider?.getTransactionReceipt(toValidHash(pending.txId))\n return TransactionReceipt.from(response)\n }\n\n /**\n * Signs a transaction.\n *\n * @param {TransactionRequest} transaction - The transaction request to sign.\n * @returns {Promise<SignedTransaction>} A promise that resolves to the signed transaction.\n * @throws {Error} If the transaction is invalid.\n */\n async signTransaction(transaction: TransactionRequest): Promise<SignedTransaction> {\n type NativeSignedTransaction = ethers.PopulatedTransaction\n const tx = transaction.request as NativeSignedTransaction\n if (tx.data === undefined || tx.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n\n TronSigner.validateTransaction(tx)\n const client = TronSigner.buildTronWebFrom(this.nativeSigner)\n const response = await signTronTx(\n {\n data: tx.data,\n to: tx.to,\n gasLimit: tx.gasLimit?.toNumber(),\n gasPrice: tx.gasPrice?.toNumber(),\n value: tx.value?.toNumber(),\n // energyFactor: transaction.energyFactor, // TODO: add energyFactor\n },\n client\n )\n return SignedTransaction.from(response)\n }\n\n /**\n * Sends a signed transaction.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [sendOptions] - Optional parameters for sending the transaction.\n * @returns {Promise<TransactionPending>} A promise that resolves to the pending transaction.\n */\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n\n const tronWeb = TronSigner.buildTronWebFrom(this.nativeSigner)\n const response = await sendTronTransaction(stx, tronWeb)\n return TransactionPending.from(response)\n }\n\n /**\n * Signs a buffer (e.g., a message hash) using the native Tron signer.\n *\n * @param {Uint8Array} buffer - The buffer to sign.\n * @returns {Promise<Uint8Array>} A promise that resolves to the signed buffer as a Uint8Array.\n */\n async signBuffer(buffer: Uint8Array): Promise<Uint8Array> {\n // ETH_MESSAGE_HEADER is defined as '\\x19Ethereum Signed Message:\\n32' in TronWeb,\n // which will cause the signature to be different from ethers.js if the message length is not 32 bytes\n const signedMessage = await this.nativeSigner.signMessage(buffer)\n return ethers.utils.arrayify(signedMessage)\n }\n\n /**\n * Validates a transaction.\n *\n * @param {ethers.PopulatedTransaction} transaction - The transaction to validate.\n * @returns {boolean} True if the transaction is valid, false otherwise.\n * @throws {Error} If the transaction is invalid.\n */\n static validateTransaction(transaction: ethers.PopulatedTransaction): boolean {\n if (transaction.data === undefined || transaction.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n return true\n }\n\n /**\n * Builds a transaction.\n *\n * @param {unknown} buildTxRequest - The transaction request to build.\n * @returns {Promise<TransactionRequest>} A promise that resolves to the built transaction request.\n * @throws {Error} Method not implemented.\n */\n async buildTransaction(buildTxRequest: unknown): Promise<TransactionRequest> {\n return Promise.reject(new Error('Method not implemented.'))\n }\n}\n","import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\nimport {\n Provider,\n SignedTransaction,\n Signer,\n TransactionPending,\n TransactionReceipt,\n TransactionRequest,\n} from '@layerzerolabs/lz-core'\nimport { trim0x } from '@layerzerolabs/lz-utilities'\nimport { sendTronTransaction, signTronTx } from '@layerzerolabs/tron-utilities'\n\n/**\n * TronWebSigner is a wrapper around TronWeb that implements the Signer interface\n *\n * PITFALL:\n * - This class is not compatible with ethers.js and is not fully tested.\n * - The signature produced by signBuffer is different from the ethers signer\n * when the message length is not 32 bytes\n * - The format of the response from sendTransaction differs from that of the ethers signer.\n */\nexport class TronWebSigner implements Signer {\n private readonly nativeSigner: TronWeb\n\n /**\n * Creates an instance of TronWebSigner.\n *\n * @param {TronWeb} signer - The TronWeb signer to use.\n */\n private constructor(signer: TronWeb) {\n this.nativeSigner = signer\n }\n\n /**\n * Creates an instance of TronWebSigner from a TronWeb client.\n *\n * @param {TronWeb} signer - The TronWeb client to create the TronWebSigner from.\n * @returns {Signer} The created TronWebSigner instance.\n */\n static from(signer: TronWeb): Signer\n\n /**\n * Creates an instance of TronWebSigner from a private key.\n *\n * @param {string} privKey - The private key to create the TronWebSigner from.\n * @returns {Signer} The created TronWebSigner instance.\n */\n static from(privKey: string): Signer\n\n /**\n * Creates an instance of TronWebSigner from a mnemonic and derivation path.\n *\n * @param {string} mnemonic - The mnemonic to create the TronWebSigner from.\n * @param {string} [path] - The derivation path (optional).\n * @returns {Signer} The created TronWebSigner instance.\n */\n static from(mnemonic: string, path?: string): Signer\n\n /**\n * Creates an instance of TronWebSigner from the given source.\n *\n * @param {TronWeb | string} source - The source to create the TronWebSigner from.\n * @param {string} [path] - The derivation path (optional).\n * @returns {Signer} The created TronWebSigner instance.\n * @throws {Error} If the parameters are invalid.\n */\n static from(source: TronWeb | string, path?: string): Signer {\n const fullHost = 'https://api.trongrid.io'\n if (source instanceof TronWeb) {\n return new this(source)\n } else if (typeof source === 'string' && path === undefined) {\n const privateKey = trim0x(source)\n return new this(new TronWeb({ privateKey, fullHost }))\n } else if (typeof source === 'string' && path !== undefined) {\n const privateKey = trim0x(TronWeb.fromMnemonic(source, path).privateKey)\n return new this(new TronWeb({ privateKey, fullHost }))\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n /**\n * Gets the native TronWeb signer instance.\n *\n * @returns {unknown} The native TronWeb signer instance.\n */\n get native(): unknown {\n return this.nativeSigner\n }\n\n /**\n * Connects the signer to a provider.\n *\n * @param {Provider} provider - The provider to connect to.\n * @returns {Signer} The connected signer.\n */\n connect(provider: Provider): Signer {\n const nativeProvider = provider.native as TronWeb\n const { fullNode, solidityNode, eventServer } = nativeProvider.currentProviders() as {\n fullNode: unknown\n solidityNode: unknown\n eventServer: unknown\n }\n this.nativeSigner.setFullNode(fullNode)\n this.nativeSigner.setSolidityNode(solidityNode)\n this.nativeSigner.setEventServer(eventServer)\n return this\n }\n\n /**\n * Gets the address of the signer.\n *\n * @returns {Promise<string>} A promise that resolves to the address of the signer.\n */\n async getAddress(): Promise<string> {\n if (typeof this.nativeSigner.defaultAddress.hex !== 'string') {\n throw new Error('Invalid address')\n }\n const retval = this.nativeSigner.defaultAddress.hex.replace(/^41/, '0x')\n return Promise.resolve(retval)\n }\n\n /**\n * Sends a signed transaction and waits for confirmation.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [sendOptions] - Optional parameters for sending and confirming the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async sendAndConfirm(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionReceipt> {\n const pending = (await this.sendTransaction(transaction)).pending as {\n txId: string\n wait: () => unknown\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const response = await pending.wait()\n return TransactionReceipt.from(response)\n }\n\n /**\n * Signs a transaction.\n *\n * @param {TransactionRequest} transaction - The transaction request to sign.\n * @returns {Promise<SignedTransaction>} A promise that resolves to the signed transaction.\n * @throws {Error} If the transaction is invalid.\n */\n async signTransaction(transaction: TransactionRequest): Promise<SignedTransaction> {\n type NativeSignedTransaction = ethers.PopulatedTransaction\n const tx = transaction.request as NativeSignedTransaction\n if (tx.data === undefined || tx.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n\n TronWebSigner.validateTransaction(tx)\n const response = await signTronTx(\n {\n data: tx.data,\n to: tx.to,\n gasLimit: tx.gasLimit?.toNumber(),\n gasPrice: tx.gasPrice?.toNumber(),\n value: tx.value?.toNumber(),\n // energyFactor: transaction.energyFactor, // FIXME: add energyFactor\n },\n this.nativeSigner\n )\n return SignedTransaction.from(response)\n }\n\n /**\n * Sends a signed transaction.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [sendOptions] - Optional parameters for sending the transaction.\n * @returns {Promise<TransactionPending>} A promise that resolves to the pending transaction.\n */\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n\n const response = await sendTronTransaction(stx, this.nativeSigner)\n return TransactionPending.from(response)\n }\n\n /**\n * signBuffer signs a buffer using the native signer\n * but the signString function of native signer is different from the ethers signer,\n * TronWeb uses a message header with a fixed 32 bytes length, which means that only if\n * the message length is 32 bytes, the signature will be the same as the ethereum signature.\n * you can find the signString function here:\n * https://github.com/tronprotocol/tronweb/blob/master/src/lib/trx.js\n *\n * @param {Uint8Array} buffer - The buffer to sign.\n * @returns {Promise<Uint8Array>} A promise that resolves to the signed buffer as a Uint8Array.\n * @throws {Error} If the private key is invalid.\n */\n async signBuffer(buffer: Uint8Array): Promise<Uint8Array> {\n // ETH_MESSAGE_HEADER is defined as '\\x19Ethereum Signed Message:\\n32',\n // so that the signature will be the same as the ethereum signature only if\n // the message length is 32 bytes.\n if (typeof this.nativeSigner.defaultPrivateKey !== 'string') {\n throw new Error('Invalid private key')\n }\n const signedMessage = await TronWeb.Trx.signString(\n ethers.utils.hexlify(buffer),\n this.nativeSigner.defaultPrivateKey,\n false\n )\n const retval = ethers.utils.arrayify(signedMessage)\n return Promise.resolve(retval)\n }\n\n /**\n * Validates a transaction.\n *\n * @param {ethers.PopulatedTransaction} transaction - The transaction to validate.\n * @returns {boolean} True if the transaction is valid, false otherwise.\n * @throws {Error} If the transaction is invalid.\n */\n static validateTransaction(transaction: ethers.PopulatedTransaction): boolean {\n if (transaction.data === undefined || transaction.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n return true\n }\n\n /**\n * Builds a transaction.\n *\n * @param {unknown} buildTxRequest - The transaction request to build.\n * @returns {Promise<TransactionRequest>} A promise that resolves to the built transaction request.\n * @throws {Error} Method not implemented.\n */\n async buildTransaction(buildTxRequest: unknown): Promise<TransactionRequest> {\n return Promise.reject(new Error('Method not implemented.'))\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/tron.ts","../src/providers/tron.ts","../src/providers/tronweb.ts","../src/signers/tron.ts","../src/signers/tronweb.ts"],"names":["TronWeb","ethers","Block","BlockWithTransactions","TransactionResponse","TransactionReceipt","TransactionPending","SignedTransaction","sendTronTransaction","Memoizee","trim0x","signTronTx"],"mappings":";;;;;;;;;;;;;;;;AASO,SAAS,wBAAwB,GAAqB,EAAA;AAKzD,EAAA,MAAM,QAAQ,GAAI,CAAA,IAAA,EAAO,CAAA,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC3C,EAAA,IAAI,CAAC,KAAA,CAAM,QAAS,CAAA,UAAU,CAAG,EAAA;AAC7B,IAAA,OAAO,KAAQ,GAAA,UAAA;AAAA;AAEnB,EAAO,OAAA,KAAA;AACX;AAQO,SAAS,wBAAwB,GAAqB,EAAA;AACzD,EAAO,OAAA,GAAA,CAAI,OAAQ,CAAA,YAAA,EAAc,EAAE,CAAA;AACvC;AAaO,SAAS,cAAc,OAAyB,EAAA;AACnD,EAAA,IAAI,QAAQ,UAAW,CAAA,GAAG,CAAK,IAAA,OAAA,CAAQ,WAAW,EAAI,EAAA;AAClD,IAAA,OAAOA,SAAQ,OAAQ,CAAA,KAAA,CAAM,OAAO,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,aACtC,OAAQ,CAAA,UAAA,CAAW,IAAI,CAAK,IAAA,OAAA,CAAQ,WAAW,EAAI,EAAA;AAC1D,IAAO,OAAA,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,GACnB,MAAA;AACH,IAAO,OAAA,OAAA;AAAA;AAEf;AAUO,SAAS,YAAY,MAAwB,EAAA;AAChD,EAAA,OAAO,OAAO,KAAM,CAAA,OAAA,CAAQ,QAAQ,EAAE,kBAAA,EAAoB,MAAM,CAAA;AACpE;;;ACvCO,IAAM,eAAN,MAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASlC,WAAA,CACG,KACP,MACF,EAAA;AAFS,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAGP,IAAA,IAAA,CAAK,cAAiB,GAAA,IAAIC,MAAO,CAAA,SAAA,CAAU,qBAAsB,CAAA;AAAA,MAC7D,KAAK,eAAgB,CAAA,GAAA,CAAI,GAAG,CAAA,CAAE,UAAU,GAAG,CAAA;AAAA,MAC3C,OAAS,EAAA;AAAA;AAAA,QAEL,GAAI,MAAW,KAAA,KAAA,CAAA,GAAY,EAAE,kBAAoB,EAAA,MAAA,KAAW;AAAC;AACjE,KACH,CAAA;AAAA;AACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BA,OAAO,IAAK,CAAA,MAAA,EAA0B,MAA+B,EAAA;AACjE,IAAI,IAAA,OAAO,WAAW,QAAU,EAAA;AAC5B,MAAO,OAAA,IAAI,IAAK,CAAA,MAAA,EAAQ,MAAM,CAAA;AAAA,KAClC,MAAA,IAAW,kBAAkBD,QAAS,EAAA;AAClC,MAAA,MAAM,EAAE,IAAA,EAAM,OAAQ,EAAA,GAAI,MAAO,CAAA,QAAA;AACjC,MAAA,OAAO,IAAK,CAAA,IAAA,CAAK,IAAM,EAAA,OAAA,CAAQ,kBAAkB,CAAC,CAAA;AAAA,KAC/C,MAAA;AACH,MAAM,MAAA,IAAI,MAAM,oBAAoB,CAAA;AAAA;AACxC;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,MAAkB,GAAA;AAClB,IAAA,OAAO,IAAK,CAAA,cAAA;AAAA;AAChB,EAqBQ,iBAAiB,QAA8C,EAAA;AACnE,IAAI,IAAA,QAAA,YAAoBC,MAAO,CAAA,SAAA,CAAU,eAAiB,EAAA;AACtD,MAAM,MAAA,EAAE,GAAI,EAAA,GAAI,QAAS,CAAA,UAAA;AACzB,MAAA,MAAM,MAAS,GAAA,QAAA,CAAS,UAAW,CAAA,OAAA,GAAU,kBAAkB,CAAA;AAE/D,MAAA,OAAO,IAAID,QAAQ,CAAA;AAAA,QACf,UAAY,EAAA,KAAA,CAAA;AAAA,QACZ,UAAU,eAAgB,CAAA,GAAA,CAAI,GAAG,CAAA,CAAE,OAAO,GAAG,CAAA;AAAA,QAC7C,OAAA,EAAS,EAAE,GAAI,MAAW,KAAA,KAAA,CAAA,GAAY,EAAE,kBAAoB,EAAA,MAAA,EAAW,GAAA,EAAI;AAAA,OAC9E,CAAA;AAAA;AAGL,IAAM,MAAA,IAAI,MAAM,CAAoC,kCAAA,CAAA,CAAA;AAAA;AACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAW,OAAkC,EAAA;AAC/C,IAAA,OAAO,IAAK,CAAA,cAAA,CAAe,UAAW,CAAA,aAAA,CAAc,OAAO,CAAC,CAAE,CAAA,IAAA,CAAK,CAAC,OAAA,KAAY,OAAQ,CAAA,QAAA,EAAU,CAAA;AAAA;AACtG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SAAS,QAA2C,EAAA;AACtD,IAAA,MAAM,QAAW,GAAA,MAAM,IAAK,CAAA,cAAA,CAAe,SAAS,QAAQ,CAAA;AAC5D,IAAO,OAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA;AAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,yBAAyB,QAA2D,EAAA;AACtF,IAAA,MAAM,QAAW,GAAA,MAAM,IAAK,CAAA,cAAA,CAAe,yBAAyB,QAAQ,CAAA;AAC5E,IAAO,OAAA,qBAAA,CAAsB,KAAK,QAAQ,CAAA;AAAA;AAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAkC,GAAA;AACpC,IAAO,OAAA,IAAA,CAAK,eAAe,cAAe,EAAA;AAAA;AAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,kBAAkB,QAA4C,EAAA;AAChE,IAAO,OAAA,IAAA,CAAK,eAAe,QAAS,CAAA,QAAQ,EAAE,IAAK,CAAA,CAAC,KAAU,KAAA,KAAA,CAAM,SAAS,CAAA;AAAA;AACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,QAAQ,SAAuC,EAAA;AACjD,IAAA,MAAM,QAAQ,OAAQ,EAAA;AACtB,IAAM,MAAA,IAAI,MAAM,yBAAyB,CAAA;AAAA;AAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,eAAe,MAA8C,EAAA;AAC/D,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,eAAe,cAAe,CAAA,WAAA,CAAY,MAAM,CAAC,CAAA;AAC7E,IAAO,OAAA,mBAAA,CAAoB,KAAK,QAAQ,CAAA;AAAA;AAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,sBAAsB,MAA6C,EAAA;AACrE,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,eAAe,qBAAsB,CAAA,WAAA,CAAY,MAAM,CAAC,CAAA;AACpF,IAAO,OAAA,kBAAA,CAAmB,KAAK,QAAQ,CAAA;AAAA;AAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,mBACF,CAAA,cAAA,EACA,SACe,EAAA;AACf,IAAA,MAAM,QAAQ,OAAQ,EAAA;AACtB,IAAM,MAAA,IAAI,MAAM,+BAA+B,CAAA;AAAA;AACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAgB,CAAA,WAAA,EAAgC,YAAoD,EAAA;AAItG,IAAA,MAAM,MAAM,WAAY,CAAA,MAAA;AACxB,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,gBAAiB,CAAA,IAAA,CAAK,cAAc,CAAA;AACxD,IAAA,MAAM,QAAW,GAAA,MAAM,mBAAoB,CAAA,GAAA,EAAK,MAAM,CAAA;AAEtD,IAAO,OAAA,kBAAA,CAAmB,KAAK,QAAQ,CAAA;AAAA;AAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,kBAAmB,CAAA,OAAA,EAA6B,KAA6C,EAAA;AAC/F,IAAA,MAAM,gBAAgB,OAAQ,CAAA,OAAA;AAM9B,IAAM,MAAA,QAAA,GAAW,MAAM,aAAA,CAAc,IAAK,EAAA;AAC1C,IAAO,OAAA,kBAAA,CAAmB,KAAK,QAAQ,CAAA;AAAA;AAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,cAAe,CAAA,WAAA,EAAgC,IAA4C,EAAA;AAC7F,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,eAAA,CAAgB,aAAa,IAAI,CAAA;AAC5D,IAAO,OAAA,IAAA,CAAK,kBAAmB,CAAA,OAAA,EAAS,IAAI,CAAA;AAAA;AAEpD;AAnKY,eAAA,CAAA;AAAA,EAXP,QAAS,CAAA;AAAA,IACN,UAAA,EAAY,CAAC,IAAsC,KAAA;AAC/C,MAAM,MAAA,QAAA,GAAW,KAAK,CAAC,CAAA;AACvB,MAAI,IAAA,QAAA,YAAoBC,MAAO,CAAA,SAAA,CAAU,eAAiB,EAAA;AACtD,QAAM,MAAA,EAAE,GAAI,EAAA,GAAI,QAAS,CAAA,UAAA;AACzB,QAAA,MAAM,MAAS,GAAA,QAAA,CAAS,UAAW,CAAA,OAAA,GAAU,kBAAkB,CAAA;AAC/D,QAAA,OAAO,IAAK,CAAA,SAAA,CAAU,EAAE,GAAA,EAAK,QAAQ,CAAA;AAAA;AAEzC,MAAO,OAAA,IAAA,CAAK,UAAU,QAAQ,CAAA;AAAA;AAClC,GACH;AAAA,CAAA,EArFQ,YAsFD,CAAA,SAAA,EAAA,kBAAA,CAAA;ACpFL,IAAM,kBAAN,MAA0C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS7C,WAAA,CACW,KACC,MACV,EAAA;AAFS,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACC,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAER,IAAK,IAAA,CAAA,cAAA,GAAiB,IAAID,QAAQ,CAAA;AAAA,MAC9B,QAAU,EAAA,GAAA;AAAA,MACV,OAAS,EAAA;AAAA;AAAA,QAEL,GAAI,MAAW,KAAA,KAAA,CAAA,GAAY,EAAE,kBAAoB,EAAA,MAAA,KAAW;AAAC;AACjE,KACH,CAAA;AAAA;AACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,IAAK,CAAA,MAAA,EAAgB,MAAkC,EAAA;AAC1D,IAAI,IAAA,OAAO,WAAW,QAAU,EAAA;AAC5B,MAAO,OAAA,IAAI,IAAK,CAAA,MAAA,EAAQ,MAAM,CAAA;AAAA,KAC3B,MAAA;AACH,MAAM,MAAA,IAAI,MAAM,oBAAoB,CAAA;AAAA;AACxC;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,MAAkB,GAAA;AAClB,IAAA,OAAO,IAAK,CAAA,cAAA;AAAA;AAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAW,OAAkC,EAAA;AAC/C,IAAO,OAAA,IAAA,CAAK,cAAe,CAAA,GAAA,CAAI,UAAW,CAAA,OAAO,CAAE,CAAA,IAAA,CAAK,CAAC,OAAA,KAAoB,OAAQ,CAAA,QAAA,EAAU,CAAA;AAAA;AACnG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SAAS,QAA2C,EAAA;AACtD,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,cAAe,CAAA,GAAA,CAAI,SAAS,QAAQ,CAAA;AAChE,IAAOE,OAAAA,KAAAA,CAAM,KAAK,QAAQ,CAAA;AAAA;AAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,yBAAyB,QAA2D,EAAA;AACtF,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,cAAe,CAAA,GAAA,CAAI,SAAS,QAAQ,CAAA;AAChE,IAAOC,OAAAA,qBAAAA,CAAsB,KAAK,QAAQ,CAAA;AAAA;AAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAkC,GAAA;AACpC,IAAO,OAAA,IAAA,CAAK,eAAe,GACtB,CAAA,QAAA,CAAS,QAAQ,CACjB,CAAA,IAAA,CAAK,CAAC,KAA+D,KAAA;AAClE,MAAA,IAAI,KAAM,CAAA,YAAA,CAAa,QAAS,CAAA,MAAA,KAAW,KAAW,CAAA,EAAA;AAClD,QAAM,MAAA,IAAI,MAAM,0DAA0D,CAAA;AAAA;AAE9E,MAAO,OAAA,KAAA,CAAM,aAAa,QAAS,CAAA,MAAA;AAAA,KACtC,CAAA;AAAA;AACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,kBAAkB,QAA4C,EAAA;AAChE,IAAO,OAAA,IAAA,CAAK,eAAe,GACtB,CAAA,QAAA,CAAS,QAAQ,CACjB,CAAA,IAAA,CAAK,CAAC,KAAkE,KAAA;AACrE,MAAA,IAAI,KAAM,CAAA,YAAA,CAAa,QAAS,CAAA,SAAA,KAAc,KAAW,CAAA,EAAA;AACrD,QAAM,MAAA,IAAI,MAAM,6DAA6D,CAAA;AAAA;AAEjF,MAAO,OAAA,KAAA,CAAM,aAAa,QAAS,CAAA,SAAA;AAAA,KACtC,CAAA;AAAA;AACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,QAAQ,SAAuC,EAAA;AACjD,IAAA,MAAM,QAAQ,OAAQ,EAAA;AACtB,IAAM,MAAA,IAAI,MAAM,yBAAyB,CAAA;AAAA;AAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,eAAe,MAA8C,EAAA;AAC/D,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,cAAe,CAAA,GAAA,CAAI,eAAe,MAAM,CAAA;AACpE,IAAOC,OAAAA,mBAAAA,CAAoB,KAAK,QAAQ,CAAA;AAAA;AAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,sBAAsB,MAA6C,EAAA;AAErE,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,cAAe,CAAA,GAAA,CAAI,mBAAmB,MAAM,CAAA;AACxE,IAAOC,OAAAA,kBAAAA,CAAmB,KAAK,QAAQ,CAAA;AAAA;AAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,mBACF,CAAA,cAAA,EACA,SACe,EAAA;AACf,IAAA,MAAM,QAAQ,OAAQ,EAAA;AACtB,IAAM,MAAA,IAAI,MAAM,+BAA+B,CAAA;AAAA;AACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eACF,CAAA,WAAA,EACA,WAC2B,EAAA;AAG3B,IAAA,MAAM,MAAM,WAAY,CAAA,MAAA;AACxB,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,eAAe,GAAI,CAAA,kBAAA,CAAmB,KAAK,WAAW,CAAA;AAElF,IAAI,IAAA,QAAA,CAAS,SAAS,KAAW,CAAA,EAAA;AAC7B,MAAA,MAAM,KAAQ,GAAA;AAAA,QACV,OAAO,QAAS,CAAA,IAAA;AAAA,QAChB,OAAA,EAAS,SAAS,OAAY,KAAA,KAAA,CAAA,GAAYL,SAAQ,MAAO,CAAA,QAAA,CAAS,OAAO,CAAA,GAAI,QAAS,CAAA;AAAA,OAC1F;AACA,MAAA,MAAM,IAAI,KAAM,CAAA,IAAA,CAAK,UAAU,KAAO,EAAA,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA;AAGlD,IAAI,IAAA,QAAA,CAAS,SAAS,KAAW,CAAA,EAAA;AAC7B,MAAM,MAAA,IAAI,MAAM,qCAAqC,CAAA;AAAA;AAGzD,IAAOM,OAAAA,kBAAAA,CAAmB,KAAK,QAAQ,CAAA;AAAA;AAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,kBACF,CAAA,OAAA,EACA,IAC2B,EAAA;AAC3B,IAAA,MAAM,gBAAgB,OAAQ,CAAA,OAAA;AAQ9B,IAAA,MAAM,SAAS,aAAc,CAAA,IAAA;AAC7B,IAAA,MAAM,gBAAgB,IAAM,EAAA,aAAA;AAC5B,IAAA,IAAI,KAAQ,GAAA,CAAA;AACZ,IAAO,OAAA,KAAA,EAAA,IAAW,iBAAiB,EAAK,CAAA,EAAA;AAEpC,MAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,qBAAA,CAAsB,MAAM,CAAA;AACvD,MAAA,MAAM,WAAW,OAAQ,CAAA,OAAA;AACzB,MAAA,IAAI,CAAC,MAAA,CAAO,IAAK,CAAA,QAAQ,EAAE,MAAQ,EAAA;AAI/B,QAAA,MAAM,MAAM,IAAI,CAAA;AAChB,QAAA;AAAA;AAGJ,MAAA,IAAI,QAAS,CAAA,MAAA,KAAW,KAAa,CAAA,IAAA,QAAA,CAAS,WAAW,QAAU,EAAA;AAC/D,QAAA,MAAM,KAAQ,GAAA;AAAA;AAAA,UAEV,KAAON,EAAAA,QAAAA,CAAQ,MAAO,CAAA,QAAA,CAAS,cAAc,EAAE,CAAA;AAAA,UAC/C;AAAA,SACJ;AACA,QAAA,MAAM,IAAI,KAAM,CAAA,IAAA,CAAK,UAAU,KAAO,EAAA,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA;AAGlD,MAAI,IAAA,EAAE,oBAAoB,QAAW,CAAA,EAAA;AACjC,QAAA,MAAM,KAAQ,GAAA;AAAA,UACV,OAAO,qBAAwB,GAAA,IAAA,CAAK,SAAU,CAAA,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,UAC/D;AAAA,SACJ;AACA,QAAA,MAAM,IAAI,KAAM,CAAA,IAAA,CAAK,UAAU,KAAO,EAAA,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA;AAGlD,MAAOK,OAAAA,kBAAAA,CAAmB,KAAK,QAAQ,CAAA;AAAA;AAE3C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAsC,mCAAA,EAAA,MAAM,CAAE,CAAA,CAAA;AAAA;AAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,cACF,CAAA,WAAA,EACA,IAC2B,EAAA;AAE3B,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,eAAA,CAAgB,aAAa,IAAI,CAAA;AAC5D,IAAO,OAAA,IAAA,CAAK,kBAAmB,CAAA,OAAA,EAAS,IAAI,CAAA;AAAA;AAEpD;ACvRO,IAAM,WAAA,GAAN,MAAM,WAA6B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ9B,YAAY,MAAuB,EAAA;AACvC,IAAA,IAAA,CAAK,YAAe,GAAA,MAAA;AAAA;AACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2CA,OAAO,IAAK,CAAA,MAAA,EAA0C,IAAuB,EAAA;AACzE,IAAI,IAAA,MAAA,YAAkBJ,OAAO,MAAQ,EAAA;AACjC,MAAO,OAAA,IAAI,KAAK,MAAM,CAAA;AAAA,KAC1B,MAAA,IAAW,kBAAkBD,QAAS,EAAA;AAClC,MAAA,MAAM,MAAS,GAAA,MAAA,CAAO,QAAS,CAAA,OAAA,CAAQ,kBAAkB,CAAA;AACzD,MAAA,MAAM,QAAW,GAAA,IAAIC,MAAO,CAAA,SAAA,CAAU,eAAgB,CAAA;AAAA,QAClD,GAAK,EAAA,uBAAA,CAAwB,MAAO,CAAA,QAAA,CAAS,IAAI,CAAA;AAAA,QACjD,OAAA,EAAS,EAAE,GAAI,OAAO,MAAA,KAAW,WAAc,GAAA,EAAE,kBAAoB,EAAA,MAAA,EAAW,GAAA,EAAI;AAAA,OACvF,CAAA;AAED,MAAO,OAAA,IAAI,KAAK,IAAIA,MAAAA,CAAO,OAAO,MAAO,CAAA,iBAAA,EAA6B,QAAQ,CAAC,CAAA;AAAA,KACxE,MAAA,IAAA,OAAO,MAAW,KAAA,QAAA,IAAY,SAAS,KAAW,CAAA,EAAA;AACzD,MAAA,OAAO,IAAI,IAAK,CAAA,IAAIA,MAAO,CAAA,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,KAClC,MAAA,IAAA,OAAO,MAAW,KAAA,QAAA,IAAY,SAAS,KAAW,CAAA,EAAA;AACzD,MAAA,OAAO,IAAI,IAAKA,CAAAA,MAAAA,CAAO,OAAO,YAAa,CAAA,MAAA,EAAQ,IAAI,CAAC,CAAA;AAAA,KACrD,MAAA;AACH,MAAM,MAAA,IAAI,MAAM,oBAAoB,CAAA;AAAA;AACxC;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,MAAkB,GAAA;AAClB,IAAA,OAAO,IAAK,CAAA,YAAA;AAAA;AAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,QAAQ,QAA4B,EAAA;AAChC,IAAA,IAAI,EAAE,QAAA,CAAS,MAAkBA,YAAAA,MAAAA,CAAO,UAAU,eAAkB,CAAA,EAAA;AAChE,MAAM,MAAA,IAAI,MAAM,oCAAoC,CAAA;AAAA;AAGxD,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,YAAa,CAAA,OAAA,CAAQ,SAAS,MAAmC,CAAA;AAGrF,IAAAA,MAAO,CAAA,KAAA,CAAM,cAAe,CAAA,IAAA,EAAM,gBAA8B,MAAa,CAAA;AAE7E,IAAO,OAAA,IAAA;AAAA;AACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,iBAAiB,MAAgC,EAAA;AACpD,IAAI,IAAA,MAAA,YAAkBA,OAAO,MAAQ,EAAA;AACjC,MAAA,IAAI,MAAO,CAAA,QAAA,YAAoBA,MAAO,CAAA,SAAA,CAAU,eAAiB,EAAA;AAC7D,QAAA,MAAM,MAAS,GAAA,MAAA,CAAO,QAAS,CAAA,UAAA,CAAW,UAAU,kBAAkB,CAAA;AACtE,QAAO,OAAA,IAAA,CAAK,cAAc,MAAO,CAAA,QAAA,CAAS,WAAW,GAAK,EAAA,MAAA,CAAO,YAAY,MAAM,CAAA;AAAA;AACvF;AAEJ,IAAM,MAAA,IAAI,MAAM,CAAoC,kCAAA,CAAA,CAAA;AAAA;AACxD,EAcA,OAAO,aAAA,CAAc,GAAa,EAAA,UAAA,EAAoB,MAA0B,EAAA;AAC5E,IAAA,OAAO,IAAID,QAAQ,CAAA;AAAA,MACf,UAAA,EAAY,OAAO,UAAU,CAAA;AAAA,MAC7B,QAAA,EAAU,wBAAwB,GAAG,CAAA;AAAA,MACrC,OAAA,EAAS,EAAE,GAAI,MAAW,KAAA,KAAA,CAAA,GAAY,EAAE,kBAAoB,EAAA,MAAA,EAAW,GAAA,EAAI;AAAA,KAC9E,CAAA;AAAA;AACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAA8B,GAAA;AAEhC,IAAO,OAAA,IAAA,CAAK,aAAa,UAAW,EAAA;AAAA;AACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,cAAe,CAAA,WAAA,EAAgC,KAA6C,EAAA;AAC9F,IAAA,MAAM,OAAW,GAAA,CAAA,MAAM,IAAK,CAAA,eAAA,CAAgB,WAAW,CAAG,EAAA,OAAA;AAK1D,IAAA,MAAM,QAAQ,IAAK,EAAA;AACnB,IAAM,MAAA,QAAA,GAAW,MAAM,IAAK,CAAA,YAAA,CAAa,UAAU,qBAAsB,CAAA,WAAA,CAAY,OAAQ,CAAA,IAAI,CAAC,CAAA;AAClG,IAAOK,OAAAA,kBAAAA,CAAmB,KAAK,QAAQ,CAAA;AAAA;AAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,gBAAgB,WAA6D,EAAA;AAE/E,IAAA,MAAM,KAAK,WAAY,CAAA,OAAA;AACvB,IAAA,IAAI,EAAG,CAAA,IAAA,KAAS,KAAa,CAAA,IAAA,EAAA,CAAG,OAAO,KAAW,CAAA,EAAA;AAC9C,MAAM,MAAA,IAAI,MAAM,yCAAyC,CAAA;AAAA;AAG7D,IAAA,WAAA,CAAW,oBAAoB,EAAE,CAAA;AACjC,IAAA,MAAM,MAAS,GAAA,WAAA,CAAW,gBAAiB,CAAA,IAAA,CAAK,YAAY,CAAA;AAC5D,IAAA,MAAM,WAAW,MAAM,UAAA;AAAA,MACnB;AAAA,QACI,MAAM,EAAG,CAAA,IAAA;AAAA,QACT,IAAI,EAAG,CAAA,EAAA;AAAA,QACP,QAAA,EAAU,EAAG,CAAA,QAAA,EAAU,QAAS,EAAA;AAAA,QAChC,QAAA,EAAU,EAAG,CAAA,QAAA,EAAU,QAAS,EAAA;AAAA,QAChC,KAAA,EAAO,EAAG,CAAA,KAAA,EAAO,QAAS;AAAA;AAAA,OAE9B;AAAA,MACA;AAAA,KACJ;AACA,IAAOE,OAAAA,iBAAAA,CAAkB,KAAK,QAAQ,CAAA;AAAA;AAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAgB,CAAA,WAAA,EAAgC,YAAoD,EAAA;AAEtG,IAAA,MAAM,MAAM,WAAY,CAAA,MAAA;AAExB,IAAA,MAAM,OAAU,GAAA,WAAA,CAAW,gBAAiB,CAAA,IAAA,CAAK,YAAY,CAAA;AAC7D,IAAA,MAAM,QAAW,GAAA,MAAMC,mBAAoB,CAAA,GAAA,EAAK,OAAO,CAAA;AACvD,IAAOF,OAAAA,kBAAAA,CAAmB,KAAK,QAAQ,CAAA;AAAA;AAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAW,MAAyC,EAAA;AAGtD,IAAA,MAAM,aAAgB,GAAA,MAAM,IAAK,CAAA,YAAA,CAAa,YAAY,MAAM,CAAA;AAChE,IAAOL,OAAAA,MAAAA,CAAO,KAAM,CAAA,QAAA,CAAS,aAAa,CAAA;AAAA;AAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,oBAAoB,WAAmD,EAAA;AAC1E,IAAA,IAAI,WAAY,CAAA,IAAA,KAAS,KAAa,CAAA,IAAA,WAAA,CAAY,OAAO,KAAW,CAAA,EAAA;AAChE,MAAM,MAAA,IAAI,MAAM,yCAAyC,CAAA;AAAA;AAE7D,IAAO,OAAA,IAAA;AAAA;AAEf,CAAA;AA5GW,eAAA,CAAA;AAAA,EAHNQ,QAAS,CAAA;AAAA,IACN,UAAY,EAAA,CAAC,IAA+C,KAAA,IAAA,CAAK,UAAU,IAAI;AAAA,GAClF;AAAA,CAAA,EApIQ,WAqIF,EAAA,eAAA,CAAA;AArIJ,IAAM,UAAN,GAAA;ACGM,IAAA,aAAA,GAAN,MAAM,cAAgC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQjC,YAAY,MAAiB,EAAA;AACjC,IAAA,IAAA,CAAK,YAAe,GAAA,MAAA;AAAA;AACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmCA,OAAO,IAAK,CAAA,MAAA,EAA0B,IAAuB,EAAA;AACzD,IAAA,MAAM,QAAW,GAAA,yBAAA;AACjB,IAAA,IAAI,kBAAkBT,QAAS,EAAA;AAC3B,MAAO,OAAA,IAAI,KAAK,MAAM,CAAA;AAAA,KACf,MAAA,IAAA,OAAO,MAAW,KAAA,QAAA,IAAY,SAAS,KAAW,CAAA,EAAA;AACzD,MAAM,MAAA,UAAA,GAAaU,OAAO,MAAM,CAAA;AAChC,MAAO,OAAA,IAAI,KAAK,IAAIV,QAAAA,CAAQ,EAAE,UAAY,EAAA,QAAA,EAAU,CAAC,CAAA;AAAA,KAC9C,MAAA,IAAA,OAAO,MAAW,KAAA,QAAA,IAAY,SAAS,KAAW,CAAA,EAAA;AACzD,MAAA,MAAM,aAAaU,MAAOV,CAAAA,QAAAA,CAAQ,aAAa,MAAQ,EAAA,IAAI,EAAE,UAAU,CAAA;AACvE,MAAO,OAAA,IAAI,KAAK,IAAIA,QAAAA,CAAQ,EAAE,UAAY,EAAA,QAAA,EAAU,CAAC,CAAA;AAAA,KAClD,MAAA;AACH,MAAM,MAAA,IAAI,MAAM,oBAAoB,CAAA;AAAA;AACxC;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,MAAkB,GAAA;AAClB,IAAA,OAAO,IAAK,CAAA,YAAA;AAAA;AAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAQ,QAA4B,EAAA;AAChC,IAAA,MAAM,iBAAiB,QAAS,CAAA,MAAA;AAChC,IAAA,MAAM,EAAE,QAAU,EAAA,YAAA,EAAc,WAAY,EAAA,GAAI,eAAe,gBAAiB,EAAA;AAKhF,IAAK,IAAA,CAAA,YAAA,CAAa,YAAY,QAAQ,CAAA;AACtC,IAAK,IAAA,CAAA,YAAA,CAAa,gBAAgB,YAAY,CAAA;AAC9C,IAAK,IAAA,CAAA,YAAA,CAAa,eAAe,WAAW,CAAA;AAC5C,IAAO,OAAA,IAAA;AAAA;AACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAA8B,GAAA;AAChC,IAAA,IAAI,OAAO,IAAA,CAAK,YAAa,CAAA,cAAA,CAAe,QAAQ,QAAU,EAAA;AAC1D,MAAM,MAAA,IAAI,MAAM,iBAAiB,CAAA;AAAA;AAErC,IAAA,MAAM,SAAS,IAAK,CAAA,YAAA,CAAa,eAAe,GAAI,CAAA,OAAA,CAAQ,OAAO,IAAI,CAAA;AACvE,IAAO,OAAA,OAAA,CAAQ,QAAQ,MAAM,CAAA;AAAA;AACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,cAAe,CAAA,WAAA,EAAgC,YAAoD,EAAA;AACrG,IAAA,MAAM,OAAW,GAAA,CAAA,MAAM,IAAK,CAAA,eAAA,CAAgB,WAAW,CAAG,EAAA,OAAA;AAK1D,IAAM,MAAA,QAAA,GAAW,MAAM,OAAA,CAAQ,IAAK,EAAA;AACpC,IAAOK,OAAAA,kBAAAA,CAAmB,KAAK,QAAQ,CAAA;AAAA;AAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,gBAAgB,WAA6D,EAAA;AAE/E,IAAA,MAAM,KAAK,WAAY,CAAA,OAAA;AACvB,IAAA,IAAI,EAAG,CAAA,IAAA,KAAS,KAAa,CAAA,IAAA,EAAA,CAAG,OAAO,KAAW,CAAA,EAAA;AAC9C,MAAM,MAAA,IAAI,MAAM,yCAAyC,CAAA;AAAA;AAG7D,IAAA,cAAA,CAAc,oBAAoB,EAAE,CAAA;AACpC,IAAA,MAAM,WAAW,MAAMM,UAAAA;AAAA,MACnB;AAAA,QACI,MAAM,EAAG,CAAA,IAAA;AAAA,QACT,IAAI,EAAG,CAAA,EAAA;AAAA,QACP,QAAA,EAAU,EAAG,CAAA,QAAA,EAAU,QAAS,EAAA;AAAA,QAChC,QAAA,EAAU,EAAG,CAAA,QAAA,EAAU,QAAS,EAAA;AAAA,QAChC,KAAA,EAAO,EAAG,CAAA,KAAA,EAAO,QAAS;AAAA;AAAA,OAE9B;AAAA,MACA,IAAK,CAAA;AAAA,KACT;AACA,IAAOJ,OAAAA,iBAAAA,CAAkB,KAAK,QAAQ,CAAA;AAAA;AAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAgB,CAAA,WAAA,EAAgC,YAAoD,EAAA;AAEtG,IAAA,MAAM,MAAM,WAAY,CAAA,MAAA;AAExB,IAAA,MAAM,QAAW,GAAA,MAAMC,mBAAoB,CAAA,GAAA,EAAK,KAAK,YAAY,CAAA;AACjE,IAAOF,OAAAA,kBAAAA,CAAmB,KAAK,QAAQ,CAAA;AAAA;AAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,WAAW,MAAyC,EAAA;AAItD,IAAA,IAAI,OAAO,IAAA,CAAK,YAAa,CAAA,iBAAA,KAAsB,QAAU,EAAA;AACzD,MAAM,MAAA,IAAI,MAAM,qBAAqB,CAAA;AAAA;AAEzC,IAAM,MAAA,aAAA,GAAgB,MAAMN,QAAAA,CAAQ,GAAI,CAAA,UAAA;AAAA,MACpCC,MAAAA,CAAO,KAAM,CAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,MAC3B,KAAK,YAAa,CAAA,iBAAA;AAAA,MAClB;AAAA,KACJ;AACA,IAAA,MAAM,MAASA,GAAAA,MAAAA,CAAO,KAAM,CAAA,QAAA,CAAS,aAAa,CAAA;AAClD,IAAO,OAAA,OAAA,CAAQ,QAAQ,MAAM,CAAA;AAAA;AACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,oBAAoB,WAAmD,EAAA;AAC1E,IAAA,IAAI,WAAY,CAAA,IAAA,KAAS,KAAa,CAAA,IAAA,WAAA,CAAY,OAAO,KAAW,CAAA,EAAA;AAChE,MAAM,MAAA,IAAI,MAAM,yCAAyC,CAAA;AAAA;AAE7D,IAAO,OAAA,IAAA;AAAA;AAEf","file":"index.mjs","sourcesContent":["import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\n/**\n * Ensures that the URL conforms to the TronGrid API convention by appending /jsonrpc if necessary.\n *\n * @param {string} url - The URL to ensure.\n * @returns {string} The URL with /jsonrpc appended if necessary.\n */\nexport function ensureJsonRpcUrlPostfix(url: string): string {\n // reference: https://developers.tron.network/docs/networks#mainnet\n // TronGrid API:https://api.trongrid.io\n // TronGrid JSON-RPC API: https://api.trongrid.io/jsonrpc\n // so that /jsonrpc is required to connect the JSON-RPC API endpoint\n const value = url.trim().replace(/\\/*$/, '')\n if (!value.endsWith('/jsonrpc')) {\n return value + '/jsonrpc'\n }\n return value\n}\n\n/**\n * Removes the /jsonrpc postfix from the URL.\n *\n * @param {string} url - The URL to remove the postfix from.\n * @returns {string} The URL without the /jsonrpc postfix.\n */\nexport function removeJsonRpcUrlPostfix(url: string): string {\n return url.replace(/\\/jsonrpc$/, '')\n}\n\n/**\n * Converts a Tron address to an Ethereum hex address.\n * reference: https://developers.tron.network/docs/account#account-address-format\n * the TRON network account address can be a Hex format and Base58 format.\n * - The hex format is 42 characters long, removing the leading 41 from Hex format to get the Ethereum address.\n * - The Base58 format is 34 characters long, all Base58 addresses begin with T.\n *\n * @param {string} address - The Tron address to convert.\n * @returns {string} The Ethereum hex address.\n * @throws {Error} If the address format is invalid.\n */\nexport function toEtherFormat(address: string): string {\n if (address.startsWith('T') && address.length === 34) {\n return TronWeb.address.toHex(address).slice(2)\n } else if (address.startsWith('41') && address.length === 42) {\n return address.slice(2)\n } else {\n return address\n }\n}\n\n/**\n * Convert a transaction hash to a valid hash\n * reference: https://developers.tron.network/reference/eth_gettransactionbyhash\n * txHash should be a hex string with 0x, otherwise it will throw an error \"invalid hash\" - INVALID_ARGUMENT\n *\n * @param {string} txHash - The transaction hash to convert.\n * @returns {string} The valid transaction hash.\n */\nexport function toValidHash(txHash: string): string {\n return ethers.utils.hexlify(txHash, { allowMissingPrefix: true })\n}\n","import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\nimport {\n Block,\n BlockTag,\n BlockWithTransactions,\n Finality,\n Provider,\n SignedTransaction,\n TransactionPending,\n TransactionReceipt,\n TransactionResponse,\n} from '@layerzerolabs/lz-core'\nimport { Memoizee } from '@layerzerolabs/lz-utilities'\nimport { StrategyFactory, sendTronTransaction } from '@layerzerolabs/tron-utilities'\n\nimport { toEtherFormat, toValidHash } from '../utils/tron'\n\n/**\n * TronProvider is a wrapper around TronWeb that implements the Provider interface\n * It is implemented using ethers.js\n */\nexport class TronProvider implements Provider {\n nativeProvider: ethers.providers.StaticJsonRpcProvider\n\n /**\n * Creates an instance of TronProvider.\n *\n * @param {string} url - RPC endpoint of the Tron full node, e.g. 'https://api.trongrid.io'\n * @param {string} [apiKey] - The API key for accessing the Tron full node (optional).\n */\n private constructor(\n public url: string,\n apiKey?: string\n ) {\n this.nativeProvider = new ethers.providers.StaticJsonRpcProvider({\n url: StrategyFactory.get(url).asJSONRPC(url),\n headers: {\n // use object destructuring to conditionally add header\n ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}),\n },\n })\n }\n\n /**\n * Creates an instance of TronProvider from the given URL and API key.\n *\n * @param {string} url - The URL of the Tron node.\n * @param {string} [apiKey] - The API key for accessing the Tron node (optional).\n * @returns {TronProvider} The created TronProvider instance.\n */\n static from(url: string, apiKey?: string): TronProvider\n\n /**\n * Creates an instance of TronProvider from a TronWeb client.\n *\n * @param {TronWeb} client - The TronWeb client to create the provider from.\n * @returns {TronProvider} The created TronProvider instance.\n */\n static from(client: TronWeb): TronProvider\n\n /**\n * Creates an instance of TronProvider from the given source.\n *\n * @param {string | TronWeb} source - The source to create the provider from.\n * @param {string} [apiKey] - The API key for accessing the Tron node (optional).\n * @returns {TronProvider} The created TronProvider instance.\n * @throws {Error} If the parameters are invalid.\n */\n static from(source: string | TronWeb, apiKey?: string): TronProvider {\n if (typeof source === 'string') {\n return new this(source, apiKey)\n } else if (source instanceof TronWeb) {\n const { host, headers } = source.fullNode\n return this.from(host, headers['TRON-PRO-API-KEY'])\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n /**\n * Returns the native provider.\n *\n * @returns {unknown} The native provider.\n */\n get native(): unknown {\n return this.nativeProvider\n }\n\n /**\n * Builds a TronWeb instance from the given provider.\n * The result will be cached based on the provider's URL and API key.\n *\n * @param {ethers.providers.Provider} provider - The provider to build the TronWeb instance from.\n * @returns {TronWeb} The built TronWeb instance.\n * @throws {Error} If the provider is not supported.\n */\n @Memoizee({\n normalizer: (args: [ethers.providers.Provider]) => {\n const provider = args[0]\n if (provider instanceof ethers.providers.JsonRpcProvider) {\n const { url } = provider.connection\n const apiKey = provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n return JSON.stringify({ url, apiKey })\n }\n return JSON.stringify(provider)\n },\n })\n private buildTronWebFrom(provider: ethers.providers.Provider): TronWeb {\n if (provider instanceof ethers.providers.JsonRpcProvider) {\n const { url } = provider.connection\n const apiKey = provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n\n return new TronWeb({\n privateKey: undefined,\n fullHost: StrategyFactory.get(url).asREST(url),\n headers: { ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n }\n\n throw new Error(`The nativeSigner is not supported.`)\n }\n\n /**\n * Gets the balance of the specified address.\n *\n * @param {string} address - The address to get the balance of.\n * @returns {Promise<string>} A promise that resolves to the balance of the address.\n */\n async getBalance(address: string): Promise<string> {\n return this.nativeProvider.getBalance(toEtherFormat(address)).then((balance) => balance.toString())\n }\n\n /**\n * Gets the block specified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<Block>} A promise that resolves to the block.\n */\n async getBlock(blockTag: string | number): Promise<Block> {\n const response = await this.nativeProvider.getBlock(blockTag)\n return Block.from(response)\n }\n\n /**\n * Gets the block with transactions specified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<BlockWithTransactions>} A promise that resolves to the block with transactions.\n */\n async getBlockWithTransactions(blockTag: string | number): Promise<BlockWithTransactions> {\n const response = await this.nativeProvider.getBlockWithTransactions(blockTag)\n return BlockWithTransactions.from(response)\n }\n\n /**\n * Gets the current block number.\n *\n * @returns {Promise<number>} A promise that resolves to the current block number.\n */\n async getBlockNumber(): Promise<number> {\n return this.nativeProvider.getBlockNumber()\n }\n\n /**\n * Gets the UNIX timestamp for the block identified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<number>} A promise that resolves to the UNIX timestamp of the block.\n */\n async getBlockTimestamp(blockTag: string | number): Promise<number> {\n return this.nativeProvider.getBlock(blockTag).then((block) => block.timestamp)\n }\n\n /**\n * Gets the current slot number for commitment, not suitable for Tron.\n *\n * @param {Finality} [finality] - The commitment level (optional).\n * @returns {Promise<number>} A promise that resolves to the current slot number.\n * @throws {Error} Method not implemented.\n */\n async getSlot(_finality?: Finality): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not implemented.')\n }\n\n /**\n * Gets information about a transaction.\n *\n * @param {string} txHash - The hash of the transaction.\n * @returns {Promise<TransactionResponse>} A promise that resolves to the transaction response.\n */\n async getTransaction(txHash: string): Promise<TransactionResponse> {\n const response = await this.nativeProvider.getTransaction(toValidHash(txHash))\n return TransactionResponse.from(response)\n }\n\n /**\n * Gets the receipt of a transaction.\n *\n * @param {string} txHash - The hash of the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async getTransactionReceipt(txHash: string): Promise<TransactionReceipt> {\n const response = await this.nativeProvider.getTransactionReceipt(toValidHash(txHash))\n return TransactionReceipt.from(response)\n }\n\n /**\n * Gets the number of transactions sent from the specified address.\n *\n * @param {string | Promise<string>} _addressOrName - The address to get the number of transactions from.\n * @param {BlockTag | Promise<BlockTag>} [_blockTag] - The block tag to get the number of transactions from (optional).\n * @returns {Promise<number>} A promise that resolves to the number of transactions sent from the address.\n * @throws {Error} Method not supported in Tron.\n */\n async getTransactionCount(\n _addressOrName: string | Promise<string>,\n _blockTag?: BlockTag | Promise<BlockTag>\n ): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not supported in Tron.')\n }\n\n /**\n * Sends a signed transaction to the blockchain.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [sendOptions] - Optional parameters for sending the transaction.\n * @returns {Promise<TransactionPending>} A promise that resolves to the pending transaction.\n */\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n // reference: https://developers.tron.network/reference/json-rpc-api-overview\n // eth_sendRawTransaction is not supported in the JSON-RPC API of the TRON network\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n const client = this.buildTronWebFrom(this.nativeProvider)\n const response = await sendTronTransaction(stx, client)\n\n return TransactionPending.from(response)\n }\n\n /**\n * Confirms a pending transaction.\n *\n * @param {TransactionPending} pending - The pending transaction to confirm.\n * @param {object} [opts] - Optional parameters for the confirmation.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async confirmTransaction(pending: TransactionPending, _opts?: object): Promise<TransactionReceipt> {\n const nativePending = pending.pending as {\n txId: string\n result: unknown\n wait: () => Promise<unknown>\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const response = await nativePending.wait()\n return TransactionReceipt.from(response)\n }\n\n /**\n * Sends a signed transaction and waits for confirmation.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [opts] - Optional parameters for sending and confirming the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async sendAndConfirm(transaction: SignedTransaction, opts?: object): Promise<TransactionReceipt> {\n const pending = await this.sendTransaction(transaction, opts)\n return this.confirmTransaction(pending, opts)\n }\n}\n","import TronWeb from 'tronweb'\n\nimport {\n Block,\n BlockTag,\n BlockWithTransactions,\n Finality,\n Provider,\n SignedTransaction,\n TransactionPending,\n TransactionReceipt,\n TransactionResponse,\n} from '@layerzerolabs/lz-core'\nimport { sleep } from '@layerzerolabs/lz-utilities'\n\nimport type { TransactionInfo } from 'tronweb'\n\n/**\n * TronWebProvider is a wrapper around TronWeb that implements the Provider interface\n *\n * PITFALL:\n * - This class is not compatible with ethers.js and is not fully tested.\n * - The format of the response from sendTransaction and the receipt from getTransactionReceipt differs\n * from that of the ethers provider.\n */\nexport class TronWebProvider implements Provider {\n nativeProvider: TronWeb\n\n /**\n * Creates a new TronWebProvider.\n *\n * @param {string} url - The RPC endpoint of the Tron full node, e.g., 'https://api.trongrid.io'.\n * @param {string} [apiKey] - The API key for accessing the Tron full node (optional).\n */\n constructor(\n public url: string,\n private apiKey?: string\n ) {\n this.nativeProvider = new TronWeb({\n fullHost: url,\n headers: {\n // use object destructuring to conditionally add header\n ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}),\n },\n })\n }\n\n /**\n * Creates an instance of TronWebProvider from the given URL and API key.\n *\n * @param {string} url - The URL of the Tron node.\n * @param {string} [apiKey] - The API key for accessing the Tron node (optional).\n * @returns {TronWebProvider} The created TronWebProvider instance.\n */\n static from(url: string, apiKey?: string): TronWebProvider\n\n /**\n * Creates an instance of TronWebProvider from the given source.\n *\n * @param {string} source - The source to create the provider from.\n * @param {string} [apiKey] - The API key for accessing the Tron node (optional).\n * @returns {TronWebProvider} The created TronWebProvider instance.\n * @throws {Error} If the parameters are invalid.\n */\n static from(source: string, apiKey?: string): TronWebProvider {\n if (typeof source === 'string') {\n return new this(source, apiKey)\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n /**\n * Gets the native TronWeb provider instance.\n *\n * @returns {TronWeb} The native TronWeb provider instance.\n */\n get native(): unknown {\n return this.nativeProvider\n }\n\n /**\n * Gets the balance of the specified address.\n *\n * @param {string} address - The address to get the balance of.\n * @returns {Promise<string>} A promise that resolves to the balance of the address.\n */\n async getBalance(address: string): Promise<string> {\n return this.nativeProvider.trx.getBalance(address).then((balance: number) => balance.toString())\n }\n\n /**\n * Gets the block specified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<Block>} A promise that resolves to the block.\n */\n async getBlock(blockTag: string | number): Promise<Block> {\n const response = await this.nativeProvider.trx.getBlock(blockTag)\n return Block.from(response)\n }\n\n /**\n * Gets the block with transactions specified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<BlockWithTransactions>} A promise that resolves to the block with transactions.\n */\n async getBlockWithTransactions(blockTag: string | number): Promise<BlockWithTransactions> {\n const response = await this.nativeProvider.trx.getBlock(blockTag)\n return BlockWithTransactions.from(response)\n }\n\n /**\n * Gets the current block number.\n *\n * @returns {Promise<number>} A promise that resolves to the current block number.\n */\n async getBlockNumber(): Promise<number> {\n return this.nativeProvider.trx\n .getBlock('latest')\n .then((block: { block_header: { raw_data: { number?: number } } }) => {\n if (block.block_header.raw_data.number === undefined) {\n throw new Error('Invalid block, block_header.raw_data.number is undefined')\n }\n return block.block_header.raw_data.number\n })\n }\n\n /**\n * Gets the UNIX timestamp for the block identified by blockTag.\n *\n * @param {BlockTag} blockTag - The block tag to specify the block.\n * @returns {Promise<number>} A promise that resolves to the UNIX timestamp of the block.\n */\n async getBlockTimestamp(blockTag: string | number): Promise<number> {\n return this.nativeProvider.trx\n .getBlock(blockTag)\n .then((block: { block_header: { raw_data: { timestamp?: number } } }) => {\n if (block.block_header.raw_data.timestamp === undefined) {\n throw new Error('Invalid block, block_header.raw_data.timestamp is undefined')\n }\n return block.block_header.raw_data.timestamp\n })\n }\n\n /**\n * Gets the current slot number for commitment, not suitable for Tron.\n *\n * @param {Finality} [finality] - The commitment level (optional).\n * @returns {Promise<number>} A promise that resolves to the current slot number.\n * @throws {Error} Method not implemented.\n */\n async getSlot(_finality?: Finality): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not implemented.')\n }\n\n /**\n * Gets information about a transaction.\n *\n * @param {string} txHash - The hash of the transaction.\n * @returns {Promise<TransactionResponse>} A promise that resolves to the transaction response.\n */\n async getTransaction(txHash: string): Promise<TransactionResponse> {\n const response = await this.nativeProvider.trx.getTransaction(txHash)\n return TransactionResponse.from(response)\n }\n\n /**\n * Gets the receipt of a transaction.\n *\n * @param {string} txHash - The hash of the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async getTransactionReceipt(txHash: string): Promise<TransactionReceipt> {\n // reference: https://developers.tron.network/reference/gettransactioninfobyid-1\n const response = await this.nativeProvider.trx.getTransactionInfo(txHash)\n return TransactionReceipt.from(response)\n }\n\n /**\n * Gets the number of transactions sent from the specified address.\n *\n * @param {string | Promise<string>} _addressOrName - The address to get the number of transactions from.\n * @param {BlockTag | Promise<BlockTag>} [_blockTag] - The block tag to get the number of transactions from (optional).\n * @returns {Promise<number>} A promise that resolves to the number of transactions sent from the address.\n * @throws {Error} Method not supported in Tron.\n */\n async getTransactionCount(\n _addressOrName: string | Promise<string>,\n _blockTag?: BlockTag | Promise<BlockTag>\n ): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not supported in Tron.')\n }\n\n /**\n * Sends a signed transaction to the blockchain.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [sendOptions] - Optional parameters for sending the transaction.\n * @returns {Promise<TransactionPending>} A promise that resolves to the pending transaction.\n */\n async sendTransaction(\n transaction: SignedTransaction,\n sendOptions?: { confirmations?: number }\n ): Promise<TransactionPending> {\n // reference: https://developers.tron.network/reference/broadcasttransaction\n type NativeSignedTransaction = Parameters<typeof this.nativeProvider.trx.sendRawTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n const response = await this.nativeProvider.trx.sendRawTransaction(stx, sendOptions)\n\n if (response.code !== undefined) {\n const error = {\n error: response.code,\n message: response.message !== undefined ? TronWeb.toUtf8(response.message) : response.code,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n if (response.txid === undefined) {\n throw new Error('Invalid response, txid is undefined')\n }\n\n return TransactionPending.from(response)\n }\n\n /**\n * Confirms a pending transaction.\n *\n * @param {TransactionPending} pending - The pending transaction to confirm.\n * @param {object} [opts] - Optional parameters for the confirmation.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async confirmTransaction(\n pending: TransactionPending,\n opts?: { confirmations?: number }\n ): Promise<TransactionReceipt> {\n const nativePending = pending.pending as {\n result: boolean\n txid: string\n code: string\n message: string\n transaction: unknown\n wait: (confirmations?: number) => Promise<unknown>\n }\n const txHash = nativePending.txid\n const confirmations = opts?.confirmations\n let tries = 0\n while (tries++ < (confirmations ?? 20)) {\n // FIXME: not fully implemented\n const receipt = await this.getTransactionReceipt(txHash)\n const response = receipt.receipt as TransactionInfo\n if (!Object.keys(response).length) {\n // reference: https://developers.tron.network/page/faq\n // Within current testing environment, one block is produced every 3 seconds.\n // But for the local environment, it may take 1 minute to produce a block.\n await sleep(1200)\n continue\n }\n\n if (response.result !== undefined && response.result === 'FAILED') {\n const error = {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n error: TronWeb.toUtf8(response.resMessage ?? ''),\n response: response,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n if (!('contractResult' in response)) {\n const error = {\n error: 'Failed to execute: ' + JSON.stringify(response, null, 2),\n response: response,\n }\n throw new Error(JSON.stringify(error, null, 2))\n }\n\n return TransactionReceipt.from(response)\n }\n throw new Error(`Transaction not confirmed, txHash: ${txHash}`)\n }\n\n /**\n * Sends a signed transaction and waits for confirmation.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [opts] - Optional parameters for sending and confirming the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async sendAndConfirm(\n transaction: SignedTransaction,\n opts?: { confirmations?: number }\n ): Promise<TransactionReceipt> {\n // reference: https://developers.tron.network/reference/broadcasttransaction\n const pending = await this.sendTransaction(transaction, opts)\n return this.confirmTransaction(pending, opts)\n }\n}\n","import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\nimport {\n Provider,\n SignedTransaction,\n Signer,\n TransactionPending,\n TransactionReceipt,\n TransactionRequest,\n} from '@layerzerolabs/lz-core'\nimport { Memoizee, trim0x } from '@layerzerolabs/lz-utilities'\nimport { sendTronTransaction, signTronTx } from '@layerzerolabs/tron-utilities'\n\nimport { ensureJsonRpcUrlPostfix, removeJsonRpcUrlPostfix, toValidHash } from '../utils/tron'\n\n/**\n * TronSigner is a wrapper around TronWeb that implements the Signer interface\n * It is implemented using ethers.js\n */\nexport class TronSigner implements Signer {\n private readonly nativeSigner: ethers.Signer\n\n /**\n * Creates an instance of TronSigner.\n *\n * @param {ethers.Signer} signer - The Ethers signer to use.\n */\n private constructor(signer: ethers.Signer) {\n this.nativeSigner = signer\n }\n\n /**\n * Creates an instance of TronSigner from an Ethers signer.\n *\n * @param {ethers.Signer} source - The Ethers signer to create the TronSigner from.\n * @returns {Signer} The created TronSigner instance.\n */\n static from(source: ethers.Signer): Signer\n\n /**\n * Creates an instance of TronSigner from a TronWeb client.\n *\n * @param {TronWeb} client - The TronWeb client to create the TronSigner from.\n * @returns {Signer} The created TronSigner instance.\n */\n static from(client: TronWeb): Signer\n\n /**\n * Creates an instance of TronSigner from a private key.\n *\n * @param {string} privKey - The private key to create the TronSigner from.\n * @returns {Signer} The created TronSigner instance.\n */\n static from(privKey: string): Signer\n\n /**\n * Creates an instance of TronSigner from a mnemonic and derivation path.\n *\n * @param {string} mnemonic - The mnemonic to create the TronSigner from.\n * @param {string} path - The derivation path (e.g., m/44'/195'/0'/0/0).\n * @returns {Signer} The created TronSigner instance.\n */\n static from(mnemonic: string, path: string): Signer\n\n /**\n * Creates an instance of TronSigner from the given source.\n *\n * @param {ethers.Signer | TronWeb | string} source - The source to create the TronSigner from.\n * @param {string} [path] - The derivation path (optional).\n * @returns {Signer} The created TronSigner instance.\n * @throws {Error} If the parameters are invalid.\n */\n static from(source: ethers.Signer | TronWeb | string, path?: string): Signer {\n if (source instanceof ethers.Signer) {\n return new this(source)\n } else if (source instanceof TronWeb) {\n const apiKey = source.fullNode.headers['TRON-PRO-API-KEY']\n const provider = new ethers.providers.JsonRpcProvider({\n url: ensureJsonRpcUrlPostfix(source.fullNode.host),\n headers: { ...(typeof apiKey !== 'undefined' ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n\n return new this(new ethers.Wallet(source.defaultPrivateKey as string, provider))\n } else if (typeof source === 'string' && path === undefined) {\n return new this(new ethers.Wallet(source))\n } else if (typeof source === 'string' && path !== undefined) {\n return new this(ethers.Wallet.fromMnemonic(source, path))\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n /**\n * Gets the native signer instance.\n *\n * @returns {unknown} The native signer instance.\n */\n get native(): unknown {\n return this.nativeSigner\n }\n\n /**\n * Connects the signer to a provider.\n * IMPORTANT: native provider must be an instance of ethers.providers.JsonRpcProvider.\n *\n * @param {Provider} provider - The provider to connect to.\n * @returns {Signer} The connected signer.\n * @throws {Error} If the provider is not an instance of JsonRpcProvider.\n */\n connect(provider: Provider): Signer {\n if (!(provider.native instanceof ethers.providers.JsonRpcProvider)) {\n throw new Error('Only JsonRpcProvider is supported.')\n }\n\n const signer = this.nativeSigner.connect(provider.native as ethers.providers.Provider)\n // hack: ethers.utils.defineReadOnly does not work with private properties\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n ethers.utils.defineReadOnly(this, 'nativeSigner' as keyof this, signer as any)\n\n return this\n }\n\n /**\n * Builds a TronWeb instance from the given signer.\n * IMPORTANT: signer must be an instance of ethers.Wallet.\n *\n * @param {ethers.Signer} signer - The signer to build the TronWeb instance from.\n * @returns {TronWeb} The built TronWeb instance.\n * @throws {Error} If the signer is not supported.\n */\n static buildTronWebFrom(signer: ethers.Signer): TronWeb {\n if (signer instanceof ethers.Wallet) {\n if (signer.provider instanceof ethers.providers.JsonRpcProvider) {\n const apiKey = signer.provider.connection.headers?.['TRON-PRO-API-KEY'] as string | undefined\n return this.createTronWeb(signer.provider.connection.url, signer.privateKey, apiKey)\n }\n }\n throw new Error(`The nativeSigner is not supported.`)\n }\n\n /**\n * Creates a TronWeb instance.\n * The result will be cached based on the arguments.\n *\n * @param {string} url - The URL of the Tron node.\n * @param {string} privateKey - The private key to use.\n * @param {string} [apiKey] - The API key for accessing the Tron node (optional).\n * @returns {TronWeb} The created TronWeb instance.\n */\n @Memoizee({\n normalizer: (args: [string, string, string | undefined]) => JSON.stringify(args),\n })\n static createTronWeb(url: string, privateKey: string, apiKey?: string): TronWeb {\n return new TronWeb({\n privateKey: trim0x(privateKey),\n fullHost: removeJsonRpcUrlPostfix(url),\n headers: { ...(apiKey !== undefined ? { 'TRON-PRO-API-KEY': apiKey } : {}) },\n })\n }\n\n /**\n * Gets the address of the signer.\n *\n * @returns {Promise<string>} A promise that resolves to the address of the signer.\n */\n async getAddress(): Promise<string> {\n // reference: https://developers.tron.network/docs/tvm#differences-from-evm\n return this.nativeSigner.getAddress()\n }\n\n /**\n * Sends a signed transaction and waits for confirmation.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [opts] - Optional parameters for sending and confirming the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async sendAndConfirm(transaction: SignedTransaction, _opts?: object): Promise<TransactionReceipt> {\n const pending = (await this.sendTransaction(transaction)).pending as {\n txId: string\n wait: () => unknown\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n await pending.wait()\n const response = await this.nativeSigner.provider?.getTransactionReceipt(toValidHash(pending.txId))\n return TransactionReceipt.from(response)\n }\n\n /**\n * Signs a transaction.\n *\n * @param {TransactionRequest} transaction - The transaction request to sign.\n * @returns {Promise<SignedTransaction>} A promise that resolves to the signed transaction.\n * @throws {Error} If the transaction is invalid.\n */\n async signTransaction(transaction: TransactionRequest): Promise<SignedTransaction> {\n type NativeSignedTransaction = ethers.PopulatedTransaction\n const tx = transaction.request as NativeSignedTransaction\n if (tx.data === undefined || tx.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n\n TronSigner.validateTransaction(tx)\n const client = TronSigner.buildTronWebFrom(this.nativeSigner)\n const response = await signTronTx(\n {\n data: tx.data,\n to: tx.to,\n gasLimit: tx.gasLimit?.toNumber(),\n gasPrice: tx.gasPrice?.toNumber(),\n value: tx.value?.toNumber(),\n // energyFactor: transaction.energyFactor, // TODO: add energyFactor\n },\n client\n )\n return SignedTransaction.from(response)\n }\n\n /**\n * Sends a signed transaction.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [sendOptions] - Optional parameters for sending the transaction.\n * @returns {Promise<TransactionPending>} A promise that resolves to the pending transaction.\n */\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n\n const tronWeb = TronSigner.buildTronWebFrom(this.nativeSigner)\n const response = await sendTronTransaction(stx, tronWeb)\n return TransactionPending.from(response)\n }\n\n /**\n * Signs a buffer (e.g., a message hash) using the native Tron signer.\n *\n * @param {Uint8Array} buffer - The buffer to sign.\n * @returns {Promise<Uint8Array>} A promise that resolves to the signed buffer as a Uint8Array.\n */\n async signBuffer(buffer: Uint8Array): Promise<Uint8Array> {\n // ETH_MESSAGE_HEADER is defined as '\\x19Ethereum Signed Message:\\n32' in TronWeb,\n // which will cause the signature to be different from ethers.js if the message length is not 32 bytes\n const signedMessage = await this.nativeSigner.signMessage(buffer)\n return ethers.utils.arrayify(signedMessage)\n }\n\n /**\n * Validates a transaction.\n *\n * @param {ethers.PopulatedTransaction} transaction - The transaction to validate.\n * @returns {boolean} True if the transaction is valid, false otherwise.\n * @throws {Error} If the transaction is invalid.\n */\n static validateTransaction(transaction: ethers.PopulatedTransaction): boolean {\n if (transaction.data === undefined || transaction.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n return true\n }\n}\n","import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\nimport {\n Provider,\n SignedTransaction,\n Signer,\n TransactionPending,\n TransactionReceipt,\n TransactionRequest,\n} from '@layerzerolabs/lz-core'\nimport { trim0x } from '@layerzerolabs/lz-utilities'\nimport { sendTronTransaction, signTronTx } from '@layerzerolabs/tron-utilities'\n\n/**\n * TronWebSigner is a wrapper around TronWeb that implements the Signer interface\n *\n * PITFALL:\n * - This class is not compatible with ethers.js and is not fully tested.\n * - The signature produced by signBuffer is different from the ethers signer\n * when the message length is not 32 bytes\n * - The format of the response from sendTransaction differs from that of the ethers signer.\n */\nexport class TronWebSigner implements Signer {\n private readonly nativeSigner: TronWeb\n\n /**\n * Creates an instance of TronWebSigner.\n *\n * @param {TronWeb} signer - The TronWeb signer to use.\n */\n private constructor(signer: TronWeb) {\n this.nativeSigner = signer\n }\n\n /**\n * Creates an instance of TronWebSigner from a TronWeb client.\n *\n * @param {TronWeb} signer - The TronWeb client to create the TronWebSigner from.\n * @returns {Signer} The created TronWebSigner instance.\n */\n static from(signer: TronWeb): Signer\n\n /**\n * Creates an instance of TronWebSigner from a private key.\n *\n * @param {string} privKey - The private key to create the TronWebSigner from.\n * @returns {Signer} The created TronWebSigner instance.\n */\n static from(privKey: string): Signer\n\n /**\n * Creates an instance of TronWebSigner from a mnemonic and derivation path.\n *\n * @param {string} mnemonic - The mnemonic to create the TronWebSigner from.\n * @param {string} [path] - The derivation path (optional).\n * @returns {Signer} The created TronWebSigner instance.\n */\n static from(mnemonic: string, path?: string): Signer\n\n /**\n * Creates an instance of TronWebSigner from the given source.\n *\n * @param {TronWeb | string} source - The source to create the TronWebSigner from.\n * @param {string} [path] - The derivation path (optional).\n * @returns {Signer} The created TronWebSigner instance.\n * @throws {Error} If the parameters are invalid.\n */\n static from(source: TronWeb | string, path?: string): Signer {\n const fullHost = 'https://api.trongrid.io'\n if (source instanceof TronWeb) {\n return new this(source)\n } else if (typeof source === 'string' && path === undefined) {\n const privateKey = trim0x(source)\n return new this(new TronWeb({ privateKey, fullHost }))\n } else if (typeof source === 'string' && path !== undefined) {\n const privateKey = trim0x(TronWeb.fromMnemonic(source, path).privateKey)\n return new this(new TronWeb({ privateKey, fullHost }))\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n /**\n * Gets the native TronWeb signer instance.\n *\n * @returns {unknown} The native TronWeb signer instance.\n */\n get native(): unknown {\n return this.nativeSigner\n }\n\n /**\n * Connects the signer to a provider.\n *\n * @param {Provider} provider - The provider to connect to.\n * @returns {Signer} The connected signer.\n */\n connect(provider: Provider): Signer {\n const nativeProvider = provider.native as TronWeb\n const { fullNode, solidityNode, eventServer } = nativeProvider.currentProviders() as {\n fullNode: unknown\n solidityNode: unknown\n eventServer: unknown\n }\n this.nativeSigner.setFullNode(fullNode)\n this.nativeSigner.setSolidityNode(solidityNode)\n this.nativeSigner.setEventServer(eventServer)\n return this\n }\n\n /**\n * Gets the address of the signer.\n *\n * @returns {Promise<string>} A promise that resolves to the address of the signer.\n */\n async getAddress(): Promise<string> {\n if (typeof this.nativeSigner.defaultAddress.hex !== 'string') {\n throw new Error('Invalid address')\n }\n const retval = this.nativeSigner.defaultAddress.hex.replace(/^41/, '0x')\n return Promise.resolve(retval)\n }\n\n /**\n * Sends a signed transaction and waits for confirmation.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [sendOptions] - Optional parameters for sending and confirming the transaction.\n * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n */\n async sendAndConfirm(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionReceipt> {\n const pending = (await this.sendTransaction(transaction)).pending as {\n txId: string\n wait: () => unknown\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const response = await pending.wait()\n return TransactionReceipt.from(response)\n }\n\n /**\n * Signs a transaction.\n *\n * @param {TransactionRequest} transaction - The transaction request to sign.\n * @returns {Promise<SignedTransaction>} A promise that resolves to the signed transaction.\n * @throws {Error} If the transaction is invalid.\n */\n async signTransaction(transaction: TransactionRequest): Promise<SignedTransaction> {\n type NativeSignedTransaction = ethers.PopulatedTransaction\n const tx = transaction.request as NativeSignedTransaction\n if (tx.data === undefined || tx.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n\n TronWebSigner.validateTransaction(tx)\n const response = await signTronTx(\n {\n data: tx.data,\n to: tx.to,\n gasLimit: tx.gasLimit?.toNumber(),\n gasPrice: tx.gasPrice?.toNumber(),\n value: tx.value?.toNumber(),\n // energyFactor: transaction.energyFactor, // FIXME: add energyFactor\n },\n this.nativeSigner\n )\n return SignedTransaction.from(response)\n }\n\n /**\n * Sends a signed transaction.\n *\n * @param {SignedTransaction} transaction - The signed transaction to send.\n * @param {object} [sendOptions] - Optional parameters for sending the transaction.\n * @returns {Promise<TransactionPending>} A promise that resolves to the pending transaction.\n */\n async sendTransaction(transaction: SignedTransaction, _sendOptions?: object): Promise<TransactionPending> {\n type NativeSignedTransaction = Parameters<typeof sendTronTransaction>[0]\n const stx = transaction.signed as NativeSignedTransaction\n\n const response = await sendTronTransaction(stx, this.nativeSigner)\n return TransactionPending.from(response)\n }\n\n /**\n * signBuffer signs a buffer using the native signer\n * but the signString function of native signer is different from the ethers signer,\n * TronWeb uses a message header with a fixed 32 bytes length, which means that only if\n * the message length is 32 bytes, the signature will be the same as the ethereum signature.\n * you can find the signString function here:\n * https://github.com/tronprotocol/tronweb/blob/master/src/lib/trx.js\n *\n * @param {Uint8Array} buffer - The buffer to sign.\n * @returns {Promise<Uint8Array>} A promise that resolves to the signed buffer as a Uint8Array.\n * @throws {Error} If the private key is invalid.\n */\n async signBuffer(buffer: Uint8Array): Promise<Uint8Array> {\n // ETH_MESSAGE_HEADER is defined as '\\x19Ethereum Signed Message:\\n32',\n // so that the signature will be the same as the ethereum signature only if\n // the message length is 32 bytes.\n if (typeof this.nativeSigner.defaultPrivateKey !== 'string') {\n throw new Error('Invalid private key')\n }\n const signedMessage = await TronWeb.Trx.signString(\n ethers.utils.hexlify(buffer),\n this.nativeSigner.defaultPrivateKey,\n false\n )\n const retval = ethers.utils.arrayify(signedMessage)\n return Promise.resolve(retval)\n }\n\n /**\n * Validates a transaction.\n *\n * @param {ethers.PopulatedTransaction} transaction - The transaction to validate.\n * @returns {boolean} True if the transaction is valid, false otherwise.\n * @throws {Error} If the transaction is invalid.\n */\n static validateTransaction(transaction: ethers.PopulatedTransaction): boolean {\n if (transaction.data === undefined || transaction.to === undefined) {\n throw new Error('Invalid transaction, missing data or to')\n }\n return true\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@layerzerolabs/lz-corekit-tron",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.17",
|
|
4
4
|
"description": "LayerZero Core Library",
|
|
5
5
|
"license": "BUSL-1.1",
|
|
6
6
|
"exports": {
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
"clean-prebuild": "rimraf dist"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@layerzerolabs/lz-core": "^3.0.
|
|
27
|
-
"@layerzerolabs/lz-utilities": "^3.0.
|
|
28
|
-
"@layerzerolabs/tron-utilities": "^3.0.
|
|
26
|
+
"@layerzerolabs/lz-core": "^3.0.17",
|
|
27
|
+
"@layerzerolabs/lz-utilities": "^3.0.17",
|
|
28
|
+
"@layerzerolabs/tron-utilities": "^3.0.17",
|
|
29
29
|
"ethers": "^5.7.2",
|
|
30
30
|
"mem": "^8.1.1",
|
|
31
31
|
"tiny-invariant": "^1.3.1",
|
|
@@ -34,15 +34,15 @@
|
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@jest/globals": "^29.7.0",
|
|
36
36
|
"@layerzerolabs/tronweb-typescript": "^0.0.0",
|
|
37
|
-
"@layerzerolabs/tsup-config-next": "^3.0.
|
|
38
|
-
"@layerzerolabs/typescript-config-next": "^3.0.
|
|
37
|
+
"@layerzerolabs/tsup-config-next": "^3.0.17",
|
|
38
|
+
"@layerzerolabs/typescript-config-next": "^3.0.17",
|
|
39
39
|
"@types/jest": "^29.5.10",
|
|
40
40
|
"@types/tronweb": "npm:@layerzerolabs/tronweb-typescript@workspace:^",
|
|
41
41
|
"jest": "^29.7.0",
|
|
42
42
|
"jest-extended": "^4.0.2",
|
|
43
43
|
"rimraf": "^5.0.5",
|
|
44
44
|
"ts-jest": "^29.1.1",
|
|
45
|
-
"tsup": "^8.
|
|
45
|
+
"tsup": "^8.3.5",
|
|
46
46
|
"typescript": "~5.2.2"
|
|
47
47
|
},
|
|
48
48
|
"publishConfig": {
|