Working with the chain · ≈ 12 min

Addresses, and the signatures behind them

Why Animica addresses look the way they do, and why the signature scheme is unusual — and larger than you expect.

An Animica address is bech32m with the prefix anim1:

anim1zqpsmegc0qcvzjfukm89xs0zeu3eqyyyel7kelehuszvwfarqypky2gr946ga

bech32m matters specifically — not plain bech32. The two differ only in a checksum constant, so a plain-bech32 validator will happily accept addresses the chain rejects, and reject valid ones. If you write a validator, use the bech32m constant 0x2bc830a3 and test it against a real address.

The format earns its awkwardness: the charset excludes 1, b, i and o because they are misread, and the checksum catches any single-character error. Given that a payment to a malformed address is unrecoverable, that is a good trade.

Animica signatures are post-quantum, and that has visible consequences.

The current scheme is ML-DSA-65 (FIPS 204, the standardised successor of Dilithium3). Its keys and signatures are much larger than the elliptic-curve ones you may be used to: on this chain a secret key is 4,032 bytes and a public key 1,952 bytes, against 32 and 33 for secp256k1.

That means transactions are kilobytes, not hundreds of bytes. If you are sizing batches, estimating bandwidth, or wondering why a raw transaction looks enormous, this is why. The upside is that a quantum computer capable of breaking elliptic-curve signatures does not break these.

Enumerate schemes; do not hard-code the id. Ask the node:

{"method":"tx.getSupportedSignatureSchemes","params":{}}

Live response, 2026-08-20: dilithium3 (0x1), sphincs_shake_128s (0x2), sphincs_shake_128f (0x3, disabled), sphincs_shake_256s (0x4, disabled), and ml_dsa_65 (0xb).

Note the last one: parts of this repository's documentation describe ML-DSA-65 as scheme 0x1003, and the running node reports 0xb. They are numbering different things. This is exactly why the rule is to enumerate rather than hard-code — the node is the authority, and a constant copied from a document can be quietly wrong for a long time.

SPHINCS+ is legacy here. Build on ML-DSA-65.

Amounts are integers, always. 1 ANM = 10^9 nANM (nano-ANM), so:

10 ANM  =  10_000_000_000 nANM

Every API takes base units. Never send a float — the VM has no floats, for the same determinism reason that rules out clocks and randomness, and a float that survives your client will be rejected or, worse, rounded.

Stuck? Ask

Answered by Animica's own free inference network. It is donated GPU capacity, so give it 20-30 seconds.