Run an Akash Migrate reporter

A reporter verifies finalized Solana outcomes and reports them on Akash. Reporters can also veto conflicting refunds and finalize eligible refunds. They cannot mint tokens on Solana.

These instructions use the independently released reporter image from node, against an existing compatible bridge.

Requirements

  • Your own Akash node with current blocks and the expected chain ID.
  • Your own replaying Solana node with transaction history, on the expected genesis.
  • A dedicated Akash reporter account with an owner-only software key.
  • The reviewed reporter image; its runtime is included.

Keep Solana history for the outages you need to recover from plus the challenge period. Reporters must use independent observation sources. Finalized commitment does not make a dishonest RPC response trustworthy.

Install and configure

Complete Docker Compose setup with ROLE=reporter and VERSION=0.1.4-rc1 (a prerelease). Run the following host commands from /opt/akt-reporter.

Use either a new key or your existing Akash wallet.

Create a new key

Terminal window
docker run --rm --user "$(id -u akt-reporter):$(id -g akt-reporter)" \
--mount type=bind,src=/etc/akt-reporter,dst=/keys \
ghcr.io/akash-network/akt-reporter:$VERSION keys create --out /keys/reporter.key

Only the public Akash address is printed. Back up the key securely. It is an unencrypted software key, readable only by the service user (0600); use a dedicated key, never a validator consensus key. No KMS or custom signer is required.

Continue at Configure the reporter.

Use an existing Akash wallet

Use the native Akash node CLI, akash, on your secure workstation for this one-time export. It does not need a running node. The commands below use akash keys; CLI versions that export only encrypted armor cannot produce a reporter key file directly.

Recover the same account

If the wallet is already in an Akash CLI keyring, skip recovery. Set KEY_HOME, KEY_BACKEND and KEY_NAME below to that keyring and key.

Otherwise, recover from your existing mnemonic into a separate keyring:

Terminal window
KEY_HOME="$HOME/.akash-reporter-export"
KEY_BACKEND=file
KEY_NAME=existing-reporter
HD_PATH="m/44'/118'/0'/0/0"
akash keys add "$KEY_NAME" --recover --no-backup \
--hd-path "$HD_PATH" --home "$KEY_HOME" --keyring-backend "$KEY_BACKEND"

Enter the mnemonic at the prompt. Use your wallet’s actual derivation path and account index; the example selects the first standard Cosmos account. If the wallet uses a BIP39 passphrase, add --interactive and enter that passphrase. The keyring encryption password is separate from the BIP39 passphrase.

Print the recovered address:

Terminal window
akash keys show "$KEY_NAME" --address \
--home "$KEY_HOME" --keyring-backend "$KEY_BACKEND"

Compare it with the address in your existing wallet. Continue only when they match. Recovery does not create a new on-chain account or move funds.

Export and install the private key

Export directly to a new owner-only file. This prints no private key to the terminal and refuses to overwrite an existing file:

Terminal window
(
umask 077
set -o noclobber
akash keys export "$KEY_NAME" --unsafe --unarmored-hex --yes \
--home "$KEY_HOME" --keyring-backend "$KEY_BACKEND" \
> "$KEY_HOME/reporter.key"
)

The result is 64 lowercase hex characters without 0x. The reporter accepts this raw private key, not the mnemonic or an encrypted keyring export.

Transfer reporter.key to /root/reporter.key on the reporter host over SSH. As the host administrator, install it into the empty service key path:

Terminal window
test ! -e /etc/akt-reporter/reporter.key &&
install -o akt-reporter -g akt-reporter -m 0600 \
/root/reporter.key /etc/akt-reporter/reporter.key
docker compose run --rm reporter keys address --key-file /run/keys/key

Confirm the printed address still matches your wallet. Set reporter to that address and keyFile to /run/keys/key in the config.

Keep a secure backup and remove temporary transfer copies.

Configure the reporter

Fund the verified address with AKT for fees and share it with the governance coordinator.

Edit /etc/akt-reporter/config.json. The shared setup fills in the mainnet program, mint and network identities. Set your independent RPC endpoints and verified reporter address. Leave lightClientProgram unset to follow the bridge pin, or pin the reviewed light client to stop on a change. Keep the container key path keyFile=/run/keys/key; .env maps the host file to that path.

For an isolated deployment, set OPERATOR_NETWORK=testnet in .env and use its chain ID and genesis hash. Use the same network in the check below:

Terminal window
docker compose run --rm reporter keys address --key-file /run/keys/key
docker compose run --rm reporter check --config /etc/akt/config.json --network mainnet

Use --network testnet for a test deployment. Check validates configuration without loading the key or contacting a node. Run only one signing process per account. External signers remain optional; software signing needs no KMS.

Preview before broadcasting

After your address is admitted by governance, start in preview mode:

Terminal window
docker compose up -d
docker compose logs -f reporter

Preview reads both chains without signing or broadcasting. Before governance admits the address it stops with not a current reporter; this is not a successful observation scan. After admission, verify freshness, transfer outcomes and alert delivery. Treat missing history or RPC failures as unavailable evidence, not as a void.

Join the reporter policy

Akash governance chooses reporter membership and the decimal threshold. Query the configuration and current policy with akt v1.1.1 using your mainnet context:

Terminal window
akt query sink params -o json
akt query sink reporters -o json

Share your public reporter address for the network’s governance process. A proposal adds it to the complete parameter set. The akt CLI guide describes the proposal helper. Do not enable signing until the proposal passes and the current policy includes your account.

After passage, confirm your address is in the current policy. Quorum is the member count multiplied by the decimal threshold, rounded up, and must exceed two thirds of the members. Policy version and settlement round are separate; each report must match both.

Enable signing

After governance admission and a successful preview scan, enable broadcasting. Set VERSION to the version already installed if this is a new shell:

Terminal window
VERSION=0.1.4-rc1
BASE=https://github.com/akash-network/node/releases/download/reporter%2Fv$VERSION
curl -fLO "$BASE/akt-reporter-broadcast.yaml"
sha256sum --ignore-missing --check "akt-reporter_${VERSION}_checksums.txt"
mv akt-reporter-broadcast.yaml broadcast.yaml
docker compose -f docker-compose.yaml -f broadcast.yaml up -d
docker compose -f docker-compose.yaml -f broadcast.yaml logs -f reporter

Keep both Compose files in subsequent restart/upgrade commands. Omit the override to return to preview. Verify a real signed report, its committed receipt, the remaining fee balance, and the expected settlement. Configuration validation alone does not prove signer access or transaction delivery.

Monitor and recover

Page on conflicting outcomes, unavailable audits, stale nodes, signer errors, and light-client changes. Reporters inspect disputes even when a transfer is already minted or refunded. See the operations guide.

Refunds require the recorded challenge deadline and all native payment conditions. Standard builds enforce a minimum of 72 hours. If evidence cannot be checked before a deadline, escalate through governance or the refund pause; do not fabricate an outcome.

The reporter needs no local state directory: retained votes and settlement state are read from Akash. After a restart, confirm the same chain and program identities, retained votes, and balances. Follow service recovery when changing releases.