@zebec-network/tron-transfer-sdk 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/config.d.ts CHANGED
@@ -1,16 +1,33 @@
1
- import 'dotenv/config';
2
1
  export type TronNetwork = 'mainnet' | 'testnet';
3
- export interface NetworkConfig {
2
+ /** Settings passed to TronTransferService. Everything except `network` has a default. */
3
+ export interface TronTransferServiceConfig {
4
+ network: TronNetwork;
5
+ /** Full-node URL. Defaults to TronGrid: api.trongrid.io on mainnet, nile.trongrid.io on testnet. */
6
+ fullHost?: string | undefined;
7
+ /** TronGrid API key, sent as the TRON-PRO-API-KEY header. Required for mainnet on api.trongrid.io. */
8
+ apiKey?: string | undefined;
9
+ /** Default token for transferToken(). Defaults to USDT when `fullHost` is a known TronGrid host. */
10
+ usdtContract?: string | undefined;
11
+ /** Max TRX (in SUN) one token transfer may burn for energy. Default: 100_000_000 (100 TRX). */
12
+ feeLimitSun?: number | undefined;
13
+ /** How many times to retry a request the node answers with HTTP 429, with backoff. Default: 3. */
14
+ rateLimitRetries?: number | undefined;
15
+ }
16
+ /** A validated TronTransferServiceConfig with defaults applied. */
17
+ export interface ServiceConfig {
4
18
  network: TronNetwork;
5
19
  fullHost: string;
6
20
  apiKey: string | undefined;
7
- privateKey: string;
8
21
  usdtContract: string | undefined;
9
22
  feeLimitSun: number;
23
+ rateLimitRetries: number;
24
+ }
25
+ /** A ServiceConfig plus the sender's private key, as read from .env by loadConfig(). */
26
+ export interface NetworkConfig extends ServiceConfig {
27
+ privateKey: string;
10
28
  }
11
- /**
12
- * Reads the configuration for a network from environment variables.
13
- * Defaults to the network named by TRON_NETWORK.
14
- */
15
- export declare function loadConfig(network?: TronNetwork): NetworkConfig;
29
+ export declare const DEFAULT_FEE_LIMIT_SUN = 100000000;
30
+ export declare const DEFAULT_RATE_LIMIT_RETRIES = 3;
31
+ /** Validates a service config and fills in the defaults for its network. */
32
+ export declare function resolveServiceConfig(config: TronTransferServiceConfig): ServiceConfig;
16
33
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAEvB,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;CACrB;AAkCD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,WAAmD,GAAG,aAAa,CAuBtG"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAEhD,yFAAyF;AACzF,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,WAAW,CAAC;IACrB,oGAAoG;IACpG,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,sGAAsG;IACtG,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,oGAAoG;IACpG,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,+FAA+F;IAC/F,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,kGAAkG;IAClG,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,mEAAmE;AACnE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,wFAAwF;AACxF,MAAM,WAAW,aAAc,SAAQ,aAAa;IAClD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,qBAAqB,YAAc,CAAC;AACjD,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAsB5C,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,yBAAyB,GAAG,aAAa,CAgCrF"}
package/dist/config.js CHANGED
@@ -1,55 +1,49 @@
1
- import 'dotenv/config';
2
- const DEFAULT_FEE_LIMIT_SUN = 100_000_000; // 100 TRX
3
- function readEnv(name) {
4
- const value = process.env[name]?.trim();
5
- return value ? value : undefined;
6
- }
7
- function requireEnv(name) {
8
- const value = readEnv(name);
9
- if (!value) {
10
- throw new Error(`Missing required environment variable ${name}. See .env.example.`);
1
+ import { TronWeb } from 'tronweb';
2
+ export const DEFAULT_FEE_LIMIT_SUN = 100_000_000; // 100 TRX
3
+ export const DEFAULT_RATE_LIMIT_RETRIES = 3;
4
+ const DEFAULT_FULL_HOST = {
5
+ mainnet: 'https://api.trongrid.io',
6
+ testnet: 'https://nile.trongrid.io',
7
+ };
8
+ // USDT is deployed at a different address on each network, so the default follows the host.
9
+ const USDT_BY_HOST = {
10
+ 'api.trongrid.io': 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',
11
+ 'nile.trongrid.io': 'TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf',
12
+ 'api.shasta.trongrid.io': 'TG3XXyExBkPp9nzdajDZsozEu4BkaSJozs',
13
+ };
14
+ function parseHost(fullHost) {
15
+ try {
16
+ return new URL(fullHost);
17
+ }
18
+ catch {
19
+ throw new Error(`fullHost must be a URL such as https://nile.trongrid.io, got "${fullHost}".`);
11
20
  }
12
- return value;
13
21
  }
14
- function parseNetwork(value) {
15
- const network = (value ?? 'testnet').toLowerCase();
22
+ /** Validates a service config and fills in the defaults for its network. */
23
+ export function resolveServiceConfig(config) {
24
+ const { network } = config;
16
25
  if (network !== 'mainnet' && network !== 'testnet') {
17
- throw new Error(`TRON_NETWORK must be "mainnet" or "testnet", got "${value}".`);
26
+ throw new Error(`network must be "mainnet" or "testnet", got "${network}".`);
18
27
  }
19
- return network;
20
- }
21
- function parseFeeLimit(value) {
22
- if (value === undefined)
23
- return DEFAULT_FEE_LIMIT_SUN;
24
- const feeLimit = Number(value);
25
- if (!Number.isSafeInteger(feeLimit) || feeLimit <= 0) {
26
- throw new Error(`TRON_FEE_LIMIT_SUN must be a positive integer (in SUN), got "${value}".`);
28
+ const fullHost = config.fullHost?.trim() || DEFAULT_FULL_HOST[network];
29
+ const { hostname } = parseHost(fullHost);
30
+ const apiKey = config.apiKey?.trim() || undefined;
31
+ if (network === 'mainnet' && !apiKey && /(^|\.)trongrid\.io$/i.test(hostname)) {
32
+ // Keyless TronGrid requests are limited per IP (about 1 request/s); a token transfer makes several in a row.
33
+ throw new Error(`A TronGrid API key is required for ${fullHost} on mainnet (apiKey, or TRON_MAINNET_API_KEY in .env). Get one at https://www.trongrid.io.`);
27
34
  }
28
- return feeLimit;
29
- }
30
- /**
31
- * Reads the configuration for a network from environment variables.
32
- * Defaults to the network named by TRON_NETWORK.
33
- */
34
- export function loadConfig(network = parseNetwork(readEnv('TRON_NETWORK'))) {
35
- const prefix = `TRON_${network.toUpperCase()}`;
36
- const privateKey = requireEnv(`${prefix}_PRIVATE_KEY`).replace(/^0x/i, '');
37
- if (!/^[0-9a-fA-F]{64}$/.test(privateKey)) {
38
- throw new Error(`${prefix}_PRIVATE_KEY must be a 64-character hex string.`);
35
+ const usdtContract = config.usdtContract?.trim() || USDT_BY_HOST[hostname.toLowerCase()];
36
+ if (usdtContract && !TronWeb.isAddress(usdtContract)) {
37
+ throw new Error(`usdtContract must be a TRON address, got "${usdtContract}".`);
38
+ }
39
+ const feeLimitSun = config.feeLimitSun ?? DEFAULT_FEE_LIMIT_SUN;
40
+ if (!Number.isSafeInteger(feeLimitSun) || feeLimitSun <= 0) {
41
+ throw new Error(`feeLimitSun must be a positive integer (in SUN), got ${feeLimitSun}.`);
39
42
  }
40
- const fullHost = requireEnv(`${prefix}_FULL_HOST`);
41
- const apiKey = readEnv(`${prefix}_API_KEY`);
42
- if (network === 'mainnet' && !apiKey && /(^|\.)trongrid\.io$/i.test(new URL(fullHost).hostname)) {
43
- // Keyless TronGrid mainnet requests get HTTP 429 after a few calls, often mid-transfer.
44
- throw new Error(`${prefix}_API_KEY is required for ${fullHost}. Get one at https://www.trongrid.io.`);
43
+ const rateLimitRetries = config.rateLimitRetries ?? DEFAULT_RATE_LIMIT_RETRIES;
44
+ if (!Number.isSafeInteger(rateLimitRetries) || rateLimitRetries < 0) {
45
+ throw new Error(`rateLimitRetries must be a non-negative integer, got ${rateLimitRetries}.`);
45
46
  }
46
- return {
47
- network,
48
- fullHost,
49
- apiKey,
50
- privateKey,
51
- usdtContract: readEnv(`${prefix}_USDT_CONTRACT`),
52
- feeLimitSun: parseFeeLimit(readEnv('TRON_FEE_LIMIT_SUN')),
53
- };
47
+ return { network, fullHost, apiKey, usdtContract, feeLimitSun, rateLimitRetries };
54
48
  }
55
49
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAavB,MAAM,qBAAqB,GAAG,WAAW,CAAC,CAAC,UAAU;AAErD,SAAS,OAAO,CAAC,IAAY;IAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;IACxC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACnC,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,yCAAyC,IAAI,qBAAqB,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,KAAyB;IAC7C,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IACnD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,qDAAqD,KAAK,IAAI,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,aAAa,CAAC,KAAyB;IAC9C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,qBAAqB,CAAC;IACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,gEAAgE,KAAK,IAAI,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,UAAuB,YAAY,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,QAAQ,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;IAC/C,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,MAAM,cAAc,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAE3E,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,iDAAiD,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,MAAM,YAAY,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC;IAC5C,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,MAAM,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChG,wFAAwF;QACxF,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,4BAA4B,QAAQ,uCAAuC,CAAC,CAAC;IACxG,CAAC;IAED,OAAO;QACL,OAAO;QACP,QAAQ;QACR,MAAM;QACN,UAAU;QACV,YAAY,EAAE,OAAO,CAAC,GAAG,MAAM,gBAAgB,CAAC;QAChD,WAAW,EAAE,aAAa,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;KAC1D,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAkClC,MAAM,CAAC,MAAM,qBAAqB,GAAG,WAAW,CAAC,CAAC,UAAU;AAC5D,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC;AAE5C,MAAM,iBAAiB,GAAgC;IACrD,OAAO,EAAE,yBAAyB;IAClC,OAAO,EAAE,0BAA0B;CACpC,CAAC;AAEF,4FAA4F;AAC5F,MAAM,YAAY,GAA2B;IAC3C,iBAAiB,EAAE,oCAAoC;IACvD,kBAAkB,EAAE,oCAAoC;IACxD,wBAAwB,EAAE,oCAAoC;CAC/D,CAAC;AAEF,SAAS,SAAS,CAAC,QAAgB;IACjC,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,iEAAiE,QAAQ,IAAI,CAAC,CAAC;IACjG,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,oBAAoB,CAAC,MAAiC;IACpE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAC3B,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,gDAAgD,OAAO,IAAI,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACvE,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAClD,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,MAAM,IAAI,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9E,6GAA6G;QAC7G,MAAM,IAAI,KAAK,CACb,sCAAsC,QAAQ,4FAA4F,CAC3I,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACzF,IAAI,YAAY,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,6CAA6C,YAAY,IAAI,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,qBAAqB,CAAC;IAChE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,wDAAwD,WAAW,GAAG,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,0BAA0B,CAAC;IAC/E,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,KAAK,CAAC,wDAAwD,gBAAgB,GAAG,CAAC,CAAC;IAC/F,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;AACpF,CAAC"}
package/dist/env.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import 'dotenv/config';
2
+ import type { NetworkConfig, TronNetwork } from './config.js';
3
+ /**
4
+ * Reads the configuration for a network from environment variables.
5
+ * Defaults to the network named by TRON_NETWORK.
6
+ */
7
+ export declare function loadConfig(network?: TronNetwork): NetworkConfig;
8
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AACA,OAAO,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAgC9D;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,WAAmD,GAAG,aAAa,CAgBtG"}
package/dist/env.js ADDED
@@ -0,0 +1,50 @@
1
+ // Node-only: dotenv reads the filesystem when imported, so nothing in the browser entry imports this file.
2
+ import 'dotenv/config';
3
+ import { resolveServiceConfig } from './config.js';
4
+ function readEnv(name) {
5
+ const value = process.env[name]?.trim();
6
+ return value ? value : undefined;
7
+ }
8
+ function requireEnv(name) {
9
+ const value = readEnv(name);
10
+ if (!value) {
11
+ throw new Error(`Missing required environment variable ${name}. See .env.example.`);
12
+ }
13
+ return value;
14
+ }
15
+ function parseNetwork(value) {
16
+ const network = (value ?? 'testnet').toLowerCase();
17
+ if (network !== 'mainnet' && network !== 'testnet') {
18
+ throw new Error(`TRON_NETWORK must be "mainnet" or "testnet", got "${value}".`);
19
+ }
20
+ return network;
21
+ }
22
+ function parseFeeLimit(value) {
23
+ if (value === undefined)
24
+ return undefined;
25
+ const feeLimit = Number(value);
26
+ if (!Number.isSafeInteger(feeLimit) || feeLimit <= 0) {
27
+ throw new Error(`TRON_FEE_LIMIT_SUN must be a positive integer (in SUN), got "${value}".`);
28
+ }
29
+ return feeLimit;
30
+ }
31
+ /**
32
+ * Reads the configuration for a network from environment variables.
33
+ * Defaults to the network named by TRON_NETWORK.
34
+ */
35
+ export function loadConfig(network = parseNetwork(readEnv('TRON_NETWORK'))) {
36
+ const prefix = `TRON_${network.toUpperCase()}`;
37
+ const privateKey = requireEnv(`${prefix}_PRIVATE_KEY`).replace(/^0x/i, '');
38
+ if (!/^[0-9a-fA-F]{64}$/.test(privateKey)) {
39
+ throw new Error(`${prefix}_PRIVATE_KEY must be a 64-character hex string.`);
40
+ }
41
+ const config = resolveServiceConfig({
42
+ network,
43
+ fullHost: requireEnv(`${prefix}_FULL_HOST`),
44
+ apiKey: readEnv(`${prefix}_API_KEY`),
45
+ usdtContract: readEnv(`${prefix}_USDT_CONTRACT`),
46
+ feeLimitSun: parseFeeLimit(readEnv('TRON_FEE_LIMIT_SUN')),
47
+ });
48
+ return { ...config, privateKey };
49
+ }
50
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,2GAA2G;AAC3G,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGnD,SAAS,OAAO,CAAC,IAAY;IAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;IACxC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACnC,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,yCAAyC,IAAI,qBAAqB,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,KAAyB;IAC7C,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IACnD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,qDAAqD,KAAK,IAAI,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,aAAa,CAAC,KAAyB;IAC9C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,gEAAgE,KAAK,IAAI,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,UAAuB,YAAY,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,QAAQ,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;IAC/C,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,MAAM,cAAc,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAE3E,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,iDAAiD,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,MAAM,GAAG,oBAAoB,CAAC;QAClC,OAAO;QACP,QAAQ,EAAE,UAAU,CAAC,GAAG,MAAM,YAAY,CAAC;QAC3C,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,UAAU,CAAC;QACpC,YAAY,EAAE,OAAO,CAAC,GAAG,MAAM,gBAAgB,CAAC;QAChD,WAAW,EAAE,aAAa,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;KAC1D,CAAC,CAAC;IACH,OAAO,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,CAAC;AACnC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,11 @@
1
- export { transferTrx, transferToken, TronTransferError } from './services.js';
2
- export { loadConfig } from './config.js';
3
- export type { NetworkConfig, TronNetwork } from './config.js';
1
+ export { TronTransferService, TronTransferError } from './services.js';
2
+ export type { TronTransferErrorCode } from './services.js';
3
+ export { PrivateKeySigner } from './signer.js';
4
+ export type { TronSigner } from './signer.js';
5
+ export { resolveServiceConfig, DEFAULT_FEE_LIMIT_SUN, DEFAULT_RATE_LIMIT_RETRIES } from './config.js';
6
+ export type { NetworkConfig, ServiceConfig, TronNetwork, TronTransferServiceConfig } from './config.js';
4
7
  export { createTronWeb } from './client.js';
5
- export { toBaseUnits } from './utils.js';
6
- export type { Amount, TransferOptions, TransferResult, TransferTokenParams, TransferTrxParams } from './types.js';
8
+ export type { TronWebOptions } from './client.js';
9
+ export { fromBaseUnits, toBaseUnits } from './utils.js';
10
+ export type { Amount, EnvTransferOptions, TokenBalanceParams, TransferOptions, TransferResult, TransferTokenParams, TransferTrxParams, } from './types.js';
7
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvE,YAAY,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACtG,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxG,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACxD,YAAY,EACV,MAAM,EACN,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,7 @@
1
- export { transferTrx, transferToken, TronTransferError } from './services.js';
2
- export { loadConfig } from './config.js';
1
+ // Browser-safe entry: no dotenv, no filesystem or process.env access. The .env helpers live in ./node.
2
+ export { TronTransferService, TronTransferError } from './services.js';
3
+ export { PrivateKeySigner } from './signer.js';
4
+ export { resolveServiceConfig, DEFAULT_FEE_LIMIT_SUN, DEFAULT_RATE_LIMIT_RETRIES } from './config.js';
3
5
  export { createTronWeb } from './client.js';
4
- export { toBaseUnits } from './utils.js';
6
+ export { fromBaseUnits, toBaseUnits } from './utils.js';
5
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uGAAuG;AACvG,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAEtG,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
package/dist/node.d.ts ADDED
@@ -0,0 +1,25 @@
1
+ import type { TronNetwork } from './config.js';
2
+ import { loadConfig } from './env.js';
3
+ import { TronTransferService } from './services.js';
4
+ import type { EnvTransferOptions, TransferResult, TransferTokenParams, TransferTrxParams } from './types.js';
5
+ export * from './index.js';
6
+ export { loadConfig };
7
+ /** A TronTransferService that signs with TRON_<NET>_PRIVATE_KEY from .env. */
8
+ export declare function createTransferServiceFromEnv(network?: TronNetwork): TronTransferService;
9
+ /**
10
+ * Sends native TRX from the account configured in .env.
11
+ *
12
+ * @example
13
+ * await transferTrx({ to: 'TXYZ...', amount: '10' }); // 10 TRX
14
+ */
15
+ export declare function transferTrx(params: TransferTrxParams & EnvTransferOptions): Promise<TransferResult>;
16
+ /**
17
+ * Sends a TRC-20 token (USDT by default) from the account configured in .env.
18
+ * The sender needs TRX to pay for energy; up to `feeLimitSun` may be burned.
19
+ *
20
+ * @example
21
+ * await transferToken({ to: 'TXYZ...', amount: '5' }); // 5 USDT
22
+ * await transferToken({ to: 'TXYZ...', amount: '1.25', tokenAddress: 'T...' }); // any TRC-20
23
+ */
24
+ export declare function transferToken(params: TransferTokenParams & EnvTransferOptions): Promise<TransferResult>;
25
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE7G,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,CAAC;AAEtB,8EAA8E;AAC9E,wBAAgB,4BAA4B,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,mBAAmB,CAGvF;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC,CAGzG;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC,CAG7G"}
package/dist/node.js ADDED
@@ -0,0 +1,33 @@
1
+ import { loadConfig } from './env.js';
2
+ import { TronTransferService } from './services.js';
3
+ import { PrivateKeySigner } from './signer.js';
4
+ export * from './index.js';
5
+ export { loadConfig };
6
+ /** A TronTransferService that signs with TRON_<NET>_PRIVATE_KEY from .env. */
7
+ export function createTransferServiceFromEnv(network) {
8
+ const config = loadConfig(network);
9
+ return new TronTransferService(new PrivateKeySigner(config.privateKey), config);
10
+ }
11
+ /**
12
+ * Sends native TRX from the account configured in .env.
13
+ *
14
+ * @example
15
+ * await transferTrx({ to: 'TXYZ...', amount: '10' }); // 10 TRX
16
+ */
17
+ export async function transferTrx(params) {
18
+ const { network, ...transfer } = params;
19
+ return createTransferServiceFromEnv(network).transferTrx(transfer);
20
+ }
21
+ /**
22
+ * Sends a TRC-20 token (USDT by default) from the account configured in .env.
23
+ * The sender needs TRX to pay for energy; up to `feeLimitSun` may be burned.
24
+ *
25
+ * @example
26
+ * await transferToken({ to: 'TXYZ...', amount: '5' }); // 5 USDT
27
+ * await transferToken({ to: 'TXYZ...', amount: '1.25', tokenAddress: 'T...' }); // any TRC-20
28
+ */
29
+ export async function transferToken(params) {
30
+ const { network, ...transfer } = params;
31
+ return createTransferServiceFromEnv(network).transferToken(transfer);
32
+ }
33
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/C,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,CAAC;AAEtB,8EAA8E;AAC9E,MAAM,UAAU,4BAA4B,CAAC,OAAqB;IAChE,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACnC,OAAO,IAAI,mBAAmB,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;AAClF,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAA8C;IAC9E,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,CAAC;IACxC,OAAO,4BAA4B,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;AACrE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAgD;IAClF,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,CAAC;IACxC,OAAO,4BAA4B,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AACvE,CAAC"}
@@ -1,23 +1,64 @@
1
- import type { TransferResult, TransferTokenParams, TransferTrxParams } from './types.js';
2
- /** Thrown for any failed transfer. `txid` is set when the transaction reached the network. */
1
+ import { TronWeb } from 'tronweb';
2
+ import type { ServiceConfig, TronTransferServiceConfig } from './config.js';
3
+ import type { TronSigner } from './signer.js';
4
+ import type { TokenBalanceParams, TransferResult, TransferTokenParams, TransferTrxParams } from './types.js';
5
+ /**
6
+ * Machine-readable reason for some failures, for UIs to branch on:
7
+ * - `RATE_LIMITED`: the node answered HTTP 429 even after retries.
8
+ * - `ACCESS_DENIED`: the node answered HTTP 403 (IP blocked, daily quota used up, or a bad apiKey).
9
+ * - `NOT_SIGNED`: the signer threw, e.g. the user rejected the request in their wallet.
10
+ */
11
+ export type TronTransferErrorCode = 'RATE_LIMITED' | 'ACCESS_DENIED' | 'NOT_SIGNED';
12
+ /** Thrown for any failed transfer. `txid` is set when the transaction may have reached the network. */
3
13
  export declare class TronTransferError extends Error {
4
14
  readonly txid: string | undefined;
5
- constructor(message: string, txid?: string);
15
+ readonly code: TronTransferErrorCode | undefined;
16
+ constructor(message: string, txid?: string, options?: {
17
+ cause?: unknown;
18
+ code?: TronTransferErrorCode;
19
+ });
6
20
  }
7
21
  /**
8
- * Sends native TRX from the account configured in .env.
22
+ * Sends TRX and TRC-20 tokens, with every transaction signed by `signer`.
9
23
  *
10
- * @example
11
- * await transferTrx({ to: 'TXYZ...', amount: '10' }); // 10 TRX
12
- */
13
- export declare function transferTrx(params: TransferTrxParams): Promise<TransferResult>;
14
- /**
15
- * Sends a TRC-20 token (USDT by default) from the account configured in .env.
16
- * The sender needs TRX to pay for energy; up to `feeLimitSun` may be burned.
24
+ * In a browser, pass the connected wallet adapter (or `useWallet()`) as the signer: the SDK builds
25
+ * and checks the transaction, the wallet asks the user to approve it, and the SDK broadcasts it and
26
+ * waits for confirmation. The TronWeb client here never holds a private key.
17
27
  *
18
28
  * @example
19
- * await transferToken({ to: 'TXYZ...', amount: '5' }); // 5 USDT
20
- * await transferToken({ to: 'TXYZ...', amount: '1.25', tokenAddress: 'T...' }); // any TRC-20
29
+ * const service = new TronTransferService(adapter, { network: 'mainnet', apiKey: TRONGRID_KEY });
30
+ * await service.transferToken({ to: 'TXYZ...', amount: '5' }); // 5 USDT
21
31
  */
22
- export declare function transferToken(params: TransferTokenParams): Promise<TransferResult>;
32
+ export declare class TronTransferService {
33
+ #private;
34
+ readonly signer: TronSigner;
35
+ readonly config: ServiceConfig;
36
+ readonly tronWeb: TronWeb;
37
+ constructor(signer: TronSigner, config: TronTransferServiceConfig);
38
+ /**
39
+ * Sends native TRX from the signer's account.
40
+ *
41
+ * @example
42
+ * await service.transferTrx({ to: 'TXYZ...', amount: '10' }); // 10 TRX
43
+ */
44
+ transferTrx(params: TransferTrxParams): Promise<TransferResult>;
45
+ /**
46
+ * Sends a TRC-20 token (USDT by default) from the signer's account.
47
+ * The sender needs TRX to pay for energy; up to `feeLimitSun` may be burned.
48
+ *
49
+ * @example
50
+ * await service.transferToken({ to: 'TXYZ...', amount: '5' }); // 5 USDT
51
+ * await service.transferToken({ to: 'TXYZ...', amount: '1.25', tokenAddress: 'T...' }); // any TRC-20
52
+ */
53
+ transferToken(params: TransferTokenParams): Promise<TransferResult>;
54
+ /**
55
+ * TRX balance in whole TRX (e.g. "12.5"), from the full node's latest state.
56
+ * Defaults to the signer's address.
57
+ */
58
+ getTrxBalance(address?: string): Promise<string>;
59
+ /**
60
+ * TRC-20 balance in whole tokens (e.g. "5.25"). Defaults to USDT and the signer's address.
61
+ */
62
+ getTokenBalance(params?: TokenBalanceParams): Promise<string>;
63
+ }
23
64
  //# sourceMappingURL=services.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAmB,cAAc,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAO1G,8FAA8F;AAC9F,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;gBAEtB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;CAK3C;AAqHD;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,CAqBpF;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CAwCxF"}
1
+ {"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAIlC,OAAO,KAAK,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EACV,kBAAkB,EAElB,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AASpB;;;;;GAKG;AACH,MAAM,MAAM,qBAAqB,GAAG,cAAc,GAAG,eAAe,GAAG,YAAY,CAAC;AAEpF,uGAAuG;AACvG,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,qBAAqB,GAAG,SAAS,CAAC;gBAErC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,qBAAqB,CAAA;KAAO;CAM5G;AAwCD;;;;;;;;;;GAUG;AACH,qBAAa,mBAAmB;;IAO5B,QAAQ,CAAC,MAAM,EAAE,UAAU;IAN7B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;gBAKf,MAAM,EAAE,UAAU,EAC3B,MAAM,EAAE,yBAAyB;IAMnC;;;;;OAKG;IACG,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;IAwBrE;;;;;;;OAOG;IACG,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC;IAuCzE;;;OAGG;IACG,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOtD;;OAEG;IACG,eAAe,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC;CA8NxE"}