Extra currencies
TON supports up to extra currencies besides its native currency — Gram. They are protocol-level fungible assets stored alongside Gram in account balances. Extra currencies can be similarly attached to internal messages, but they cannot be used to pay transfer fees in place of Gram.
Unlike jettons, extra currencies cannot have custom behavior — they can only be stored and transferred. Furthermore, minting of new extra currencies is controlled by the masterchain config.
Mainnet status
There are no active extra currencies on the mainnet — use jettons to create new fungible tokens.
Representation
The block.tlb schema defines an extra-currency collection as a dictionary, which is then kept in the CurrencyCollection structure next to the Gram balance:
extra_currencies$_ dict:(HashmapE 32 (VarUInteger 32))
= ExtraCurrencyCollection;
currencies$_ grams:Grams other:ExtraCurrencyCollection
= CurrencyCollection;Each 32-bit dictionary key is a currency ID. Each value is a positive integer of at most 248 bits — zero balances are omitted.
Transfers and fees
A contract reads its remaining CurrencyCollection balance through TVM and specifies extra-currency amounts in an outbound internal message. The action phase subtracts each amount from the account balance. An insufficient balance produces action result code 38.
Extra currencies cannot pay storage, computation, or message-forwarding fees. These fees remain denominated in Gram.
Since global TVM version 10, send modes 64 and 128 change only the Gram component of a message. They do not add extra currencies from the incoming message or account balance.
Incoming and outgoing external messages cannot carry any currencies.
Minting
Extra-currency minting is controlled by the masterchain configuration:
- Parameter 7 stores target amounts by currency ID.
- Parameter 2 identifies the minter account. Parameter 0 is the fallback when parameter 2 is absent.
- Parameter 6 stores two Gram price fields intended for minting governance. The collator does not use them to calculate the minted amount.
For each parameter 7 entry, a masterchain collator subtracts the previous masterchain state's global balance from the configured target. A positive difference for a nonzero currency ID is minted in that masterchain block. An equal or lower target mints nothing — lowering the target does not burn currency.
When the difference is positive, the block contains a special internal message from the zero masterchain address to the minter account. Its CurrencyCollection carries the minted extra currencies, and its body is empty. Validators recompute the difference and reject a block whose minted value or special message does not match the configuration.
Changing a mint target requires a configuration update. A contract cannot create extra currency through a TVM instruction.