Sending Transactions

Now, for the fun part: sending transactions. If you have someone else’s testnet address, you can send them any amount of any asset you have.

First, use balance to find the amount of assets you have:

cargo run --release --bin pcli view balance

Second, if I wanted to send 10 penumbra tokens to my friend, I could do that like this (filling in their full address at the end):

cargo run --quiet --release --bin pcli tx send 10penumbra --to penumbrav2t...

Notice that asset amounts are typed amounts, specified without a space between the amount (10) and the asset name (penumbra). If you have the asset in your wallet to send, then so it shall be done!


In addition, to sending an asset, one may also stake penumbra tokens to validators.

Find a validator to stake to:

cargo run --release --bin pcli query validator list

Copy and paste the identity key of one of the validators to stake to, then construct the staking tx:

cargo run --release --bin pcli tx delegate 10penumbra --to penumbravalid...

To undelegate from a validator, use the pcli tx undelegate command, passing it the typed amount of delegation tokens you wish to undelegate. Wait a moment for the network to process the undelegation, then reclaim your funds:

cargo run --release --bin pcli tx undelegate-claim

Inspect the output; a message may instruct you to wait longer, for a new epoch. Check back and rerun the command later to add the previously delegated funds to your wallet.


Penumbra features on-chain governance similar to Cosmos Hub where anyone can submit proposals and both validators and delegators to vote on them. Penumbra’s governance model incorporates a single DAO account, into which anyone can freely deposit, but from which only a successful governance vote can spend. For details on using governance, see the governance section.

Swapping Assets

One of the most exciting features of Penumbra is that by using IBC (inter-blockchain communication) and our shielded pool design, any tokens can be exchanged in a private way.

NOTE: Since there’s not yet a way to open liquidity positions, we have implemented a stub Uniswap-V2-style constant-product market maker with some hardcoded liquidity for a few trading pairs: gm:gn, penumbra:gm, and penumbra:gn.

This allows testing the shielded pool integration, and will cause a floating exchange rate based on the volume of swaps occurring in each pair.

You can check the current reserves for a trading pair using the cpmm-reserves dex query:

cargo run --release --bin pcli -- q dex cpmm-reserves gm:penumbra

If you wanted to exchange 1 penumbra tokens for gm tokens, you could do so like so:

cargo run --release --bin pcli -- tx swap --into gm 1penumbra

This will handle generating the swap transaction and you’d soon have the market-rate equivalent of 1 penumbra in gm tokens returned to you, or the original investment of 1 penumbra tokens returned if there wasn’t enough liquidity available to perform the swap.