Build on Aeva
Every app on the testnet’s ecosystem page is built from public pieces, nothing in them is privileged. This page lists the pieces and how the testnet’s own apps use them, so you can build yours. Testnet, tokens have no value.
The pieces
| Piece | What it gives you | Start here |
|---|---|---|
| Native messages | assets, rights, settlements, encumbrances, income, credentials, the chain’s own modules, with policies enforced on every move | Concepts, Messages |
TypeScript SDK (@aeva/sdk) | message builders (tx.createAsset, tx.propose, tx.pledge, …), a typed indexer client, exact decimal units | SDK |
| EVM + AE-20 | every right kind and every bundle is an ERC-20 at a derived address; any Solidity contract or Ethereum wallet can hold and move rights | The EVM facade & AE-20, Read rights over the EVM |
| Indexer API | blocks, transactions, accounts, assets, holders, settlements, distributions, quests and network stats, reconciled against the chain every block | Indexer API |
| Endpoints | RPC, REST, gRPC, EVM JSON-RPC, indexer, faucet | Endpoints |
How the testnet’s apps are built
| App | Built from |
|---|---|
| Swap | Uniswap v2, unmodified math, deployed on the EVM; its pools hold AE-20s, so every swap is a native transfer under the asset’s policy |
| Trade desk | a small service that signs MsgPropose for an RFQ and MsgAccept for settlements proposed to it; prices from the pools |
| Borrow | a service that watches pledges to its address (x/encumbrance), sends aeUSD, accepts repayment settlements and releases in the same transaction |
| Launch | the SDK’s createAsset, issue and lockIssuance in one transaction, plus a content-addressed metadata store for the meta_hash |
| Quests | indexer queries over events anyone can read |
| Network stats | the indexer’s totals plus getReserves() on each pool |
| The hourly dividends | a bot that sends MsgDistribute to each test stock’s INCOME kind every hour |
The services are single-signer Go programs of a few hundred lines each: build a message, simulate, sign, broadcast, wait for the block. Nothing they do needs permission from the chain beyond an account with gas.
A first app in four calls
Read an account’s holdings, quote a trade, and propose it as one settlement,
with curl and aevad only (see the setup block):
ASSET=84f50ea918e0c15c9321362330d513593fd4536b807e1b40a39682dab3e21b55 # tAAPL
curl -s "$AEVA_INDEXER/v1/assets/$ASSET" | jq -r '.asset | "\(.kind_count) kinds, bundle AE-20 \(.bundle_address)"'
curl -s "$AEVA_INDEXER/v1/assets/$ASSET/kinds/1/holders?limit=3" | jq -r '.holders[] | "\(.holder): \(.units) INCOME units"'
curl -s "$AEVA_APP/api/desk/quotes" | jq -r '.quotes[] | select(.symbol == "tAAPL" and .kind == 1) | "INCOME strip bid: \(.bid)"'3 kinds, bundle AE-20 0x3AcfD0e4c178474d452B61B5e0C57321def4E998
aeva1…: <units> INCOME units
…
INCOME strip bid: <aeusd base units>From there, aevad tx settlement propose <counterparty> "give:right:$ASSET:1:<units>,get:coin:<amount>aeusd" --expires-in 1h
is a delivery-versus-payment trade with anyone, the pattern the trade desk
uses. See Trade: propose, decline, expire.
Rules of the road
- Say “Testnet, tokens have no value” wherever you show a balance, and never promise rewards, airdrops or returns: test tokens are for testing.
- Denominate in aeUSD (6 decimals) or AEVA (18 decimals,
aaevaon chain), never a bare$or “USD”. - The testnet may be reset. Keep your deployment scripts, not your state.