tronlink-signer
GitHub: https://github.com/TronLink/mcp-tronlink-signer
Standalone SDK for signing TRON transactions via the TronLink browser wallet. Private keys never leave TronLink — all signing happens in the browser through a local approval page.
Installation
npm install tronlink-signer
Quick Start
import { TronSigner } from "tronlink-signer";
const signer = new TronSigner();
await signer.start();
const { address } = await signer.connectWallet();
const { txId } = await signer.sendTrx("TXxx...", 1);
const { balance } = await signer.getBalance("TXxx...");
await signer.stop();
API
new TronSigner(config?: Partial<AppConfig>)
Creates a new signer instance. If no config is provided, it reads from environment variables via loadConfig().
signer.start(): Promise<void>
Starts the local HTTP server for browser approval.
signer.stop(): Promise<void>
Stops the server and clears all pending requests.
signer.getConfig(): AppConfig
Returns the current configuration.
signer.connectWallet(network?: TronNetwork): Promise<{ address: string }>
Opens the browser to connect TronLink and retrieve the wallet address.
signer.sendTrx(to, amount, network?): Promise<{ txId: string }>
Sends TRX to a recipient address. Opens a browser approval page for the user to confirm.
| Parameter | Type | Description |
|---|---|---|
to | string | Recipient Tron address (base58) |
amount | number | Amount of TRX to send |
network | TronNetwork | Optional network override |
signer.sendTrc20(contractAddress, to, amount, decimals?, network?): Promise<{ txId: string }>
Sends TRC20 tokens. Opens a browser approval page.
| Parameter | Type | Description |
|---|---|---|
contractAddress | string | TRC20 token contract address |
to | string | Recipient Tron address (base58) |
amount | string | Amount in smallest unit |
decimals | number | Token decimals (default: 6) |
network | TronNetwork | Optional network override |
signer.signMessage(message, network?): Promise<{ signature: string }>
Signs a plain text message.
signer.signTypedData(typedData, network?): Promise<{ signature: string }>
Signs EIP-712 typed data.
const { signature } = await signer.signTypedData({
domain: { name: "MyDApp", version: "1", chainId: 728126428 },
types: {
Greeting: [{ name: "contents", type: "string" }],
},
primaryType: "Greeting",
message: { contents: "Hello Tron!" },
});
signer.signTransaction(transaction, network?): Promise<{ signedTransaction: Record<string, unknown> }>
Signs a raw transaction without broadcasting it.
signer.getBalance(address, network?): Promise<{ balance: string; balanceSun: number }>
Gets TRX balance for an address. No browser approval needed.
How It Works
- Your code calls a signing method (e.g.,
signMessage) - A local HTTP server starts on port 3386 and the browser opens an approval page
- The approval page discovers the wallet via TIP-6963 protocol (fallback to
window.tron) - Auto-unlocks wallet and switches network if needed
- User reviews and clicks Approve / Reject
- TronLink handles signing in the browser
- The result is returned to your code
The local server binds to 127.0.0.1 only. If port 3386 is in use, it auto-increments. Requests timeout after 5 minutes.
Networks
All signing methods accept an optional network parameter:
| Network | Full Host | Explorer |
|---|---|---|
mainnet (default) | https://api.trongrid.io | https://tronscan.org |
nile | https://nile.trongrid.io | https://nile.tronscan.org |
shasta | https://api.shasta.trongrid.io | https://shasta.tronscan.org |
Environment Variables
| Variable | Description | Default |
|---|---|---|
TRON_NETWORK | Default network | mainnet |
TRON_HTTP_PORT | Local HTTP server port | 3386 |
TRON_API_KEY | TronGrid API key (optional) | - |
Types
type TronNetwork = "mainnet" | "nile" | "shasta";
interface AppConfig {
network: TronNetwork;
httpPort: number;
apiKey?: string;
}
interface NetworkConfig {
name: string;
fullHost: string;
explorerUrl: string;
}
Exports
// Class
export { TronSigner } from "./tron-signer.js";
// Config
export { NETWORKS, DEFAULT_HTTP_PORT, REQUEST_TIMEOUT_MS, loadConfig } from "./config.js";
// Types
export type {
TronNetwork, NetworkConfig, AppConfig,
PendingRequestType, PendingRequest,
ConnectData, SendTrxData, SendTrc20Data,
SignMessageData, SignTypedDataData, SignTransactionData,
} from "./types.js";