Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Send a payment

You need:

  • An encrypted wallet (see Create a wallet)
  • Enough EXFER in it (exfer wallet balance ...)
  • The recipient's 64-hex address
  • A reachable RPC node (your own, or a community node)

One-liner

RPC="http://82.221.100.201:9334"

exfer wallet send \
    --wallet ~/my-wallet.key \
    --to     8d896d64864f53214acb49aeb44a09a03d5bb23d19a417a6ce7b0da65c7bd750 \
    --amount "10 EXFER" \
    --fee    "0.001 EXFER" \
    --rpc    "$RPC" \
    --json

You'll be prompted for the wallet passphrase. The transaction is signed locally (the private key never leaves your machine) and submitted to the RPC node, which broadcasts it.

Output:

{
  "tx_id":      "fb8a634fcce6cfc124de86fa0a4b3e6130a1e6bfda68a34dc4f30ec7a2a2b68c",
  "size":       227,
  "tip_height": 5553,
  "submitted":  true
}

Save the tx_id — you'll use it to track confirmation.

Flag reference

FlagWhat it does
--walletPath to your encrypted .key file
--toRecipient's 64-hex address
--amountAmount to send. Accepts "10 EXFER" or "1000000000" (exfers)
--feeTransaction fee. Default 0.001 EXFER (100_000 exfers). Higher = faster inclusion under load
--rpcRPC node URL. Fetches your UTXOs and submits the tx
--datadirUse a local node instead of RPC (--rpc and --datadir are mutually exclusive)
--jsonMachine-readable output

Wait for confirmation

Poll get_transaction until block_height appears:

TX_ID="fb8a634fcce6cfc124de86fa0a4b3e6130a1e6bfda68a34dc4f30ec7a2a2b68c"

for i in $(seq 1 60); do
    RESULT=$(curl -s -X POST "$RPC" \
        -H 'content-type: application/json' \
        -d "{\"jsonrpc\":\"2.0\",\"method\":\"get_transaction\",\"params\":{\"hash\":\"$TX_ID\"},\"id\":1}")
    if echo "$RESULT" | grep -q '"block_height"'; then
        echo "Confirmed: $RESULT"
        break
    fi
    echo "Pending… ($i/60)"
    sleep 10
done

Once block_height is set, the transaction is in a block. Wait for the number of confirmations appropriate for your value (see Confirmation depth).

Fees

Exfer uses a per-transaction fee, not per-byte. There is no fee auction:

  • Mempool ordering: FIFO within a fee-rate band; higher fees go first.
  • Minimum: consensus-enforced minimum relay fee.
  • Typical: 0.001 EXFER (100_000 exfers) clears reliably under normal load.

Under sustained mempool pressure, bumping the fee gets you in the next block sooner. Replace-by-fee is not currently supported — if your tx is stuck, wait for it to drop from mempool (no eviction-based replacement yet).

What's actually happening under the hood

  1. exfer wallet send decrypts your wallet using the passphrase.
  2. Calls get_address_utxos over RPC to find your spendable outputs.
  3. Selects enough UTXOs to cover amount + fee (skips immature coinbases).
  4. Builds an unsigned transaction with one output to --to, one change output back to you, and a fee output to the miner.
  5. Signs every input locally with your Ed25519 private key.
  6. Calls send_raw_transaction with the signed tx hex.
  7. Returns the tx_id to you.

The private key only ever decrypts in step 1 and signs in step 5, both in your local process.

Common errors

  • insufficient funds — your balance minus fee is less than the requested amount. Check with exfer wallet balance.
  • Mempool pre-check failed: duplicate tx — you submitted the same signed tx twice. Wait for the first one to confirm.
  • Transaction validation failed: input ... is immature coinbase — you tried to spend a coinbase output before 360 confirmations. Either wait or fund the wallet from a non-coinbase source.

For the full list of error codes, see Error codes.