Skip to content
Tenzro
← All tutorials
Tutorial · Execution and bridges

Bridge with Wormhole

Look up Wormhole chain IDs, send TNZO or a supported token through the Wormhole adapter, follow the VAA, and see where Native Token Transfers fit.

Intermediate20 min

Wormhole is a generic cross-chain messaging network. A message published on the source chain is observed by Wormhole's guardian network, whose signatures form a Verified Action Approval (VAA). The VAA is then redeemed on the destination chain, where the token bridge or a Native Token Transfers (NTT) manager mints or releases the tokens. Tenzro nodes verify guardian signatures on inbound VAAs before acting on them.

On Tenzro Network 1, Wormhole is one adapter in the node's bridge router, with its own tenzro wormhole CLI group and tenzro_wormhole* RPC methods.

Prerequisites

  • The tenzro CLI (see CLI reference).
  • A funded Tenzro account. Fund it by transferring TNZO to its address from another wallet or account.
  • A recipient address on the destination chain. For Solana, use a base58 address.
bash
export RPC=https://rpc.tenzro.xyz
export ME=0x<your-address>

1. Look up chain IDs

Wormhole identifies chains by its own numeric IDs, which differ from EVM chain IDs. You need them when reading VAAs or configuring contracts:

bash
tenzro wormhole chain-id --chain solana --rpc $RPC
tenzro wormhole chain-id --chain base --rpc $RPC
json
{ "chain": "solana", "wormhole_chain_id": 1 }

2. See the NTT catalog

Tokens deployed with Native Token Transfers move as the native token on every chain, with no wrapped copies. List the chains in the node's NTT catalog:

bash
tenzro wormhole-ntt list-chains --rpc $RPC

3. Compare the route

bash
tenzro bridge quote --rpc $RPC \
  --from-chain tenzro --to-chain solana \
  --token TNZO --amount 5000000000000000000 \
  --protocol wormhole

The quote shows the estimated fee, output and time for the Wormhole route, and all_routes lists the alternatives when you drop --protocol.

4. Send

The transfer moves your funds, so the request must be signed by the sending account (see RPC access). The amount is in the smallest unit:

bash
tenzro wormhole bridge --rpc $RPC \
  --source-chain tenzro --dest-chain solana \
  --asset TNZO --amount 5000000000000000000 \
  --sender $ME \
  --recipient <solana-address>
json
{
  "transfer_id": "...",
  "source_chain": "tenzro",
  "dest_chain": "solana",
  "tx_hash": "0x...",
  "fee_paid": "...",
  "estimated_arrival_ms": ...
}

If the node has no Wormhole adapter registered, the response carries status: "failed", an error, and the list of registered_adapters, so you can pick another rail.

5. Follow the VAA

A Wormhole VAA is identified as chain/emitter/sequence. Split an ID into its parts to look it up on a Wormhole explorer or pass it to a destination contract:

bash
tenzro wormhole parse-vaa --vaa-id 2/0000000000000000000000003ee18b2214aff97000d974cf647e7c347e8fa585/1234 --rpc $RPC
json
{
  "emitter_chain": 2,
  "emitter_address": "0000000000000000000000003ee18b2214aff97000d974cf647e7c347e8fa585",
  "sequence": 1234
}

Track the transfer through the router:

bash
tenzro bridge status <transfer_id> --protocol wormhole --rpc $RPC

The transfer completes once enough guardians have signed the VAA and it has been redeemed on the destination chain. How long that takes depends mostly on the finality of the source chain.

6. From the TypeScript SDK

ts
import { TenzroClient } from "tenzro-sdk";

const client = new TenzroClient({
  endpoint: "https://rpc.tenzro.xyz",
  apiEndpoint: "https://api.tenzro.xyz",
});

const wh = client.wormhole();
console.log(await wh.chainId("solana"));
console.log(await wh.parseVaaId("2/0000...a585/1234"));

Next steps