IOTA - Account ID Specification
| Author | Enrico Marconi |
|---|---|
| Status | Draft |
| Type | Informational |
| Created | 2025-07-28 |
| Requires | CAIP-2, CAIP-10 |
Table of Contents
CAIP-10
For context, see the CAIP-10 specification.
Introduction
This document defines how IOTA addresses can be encoded as CAIP-10’s account IDs.
Specification
Semantics
In IOTA’s object-based model, account addresses are just a subset of the whole address namespace, which is shared among objects, packages, and accounts.
Therefore, an IOTA address may refer to either an object, a package or a more traditional key-based account. Most importantly, it is impossible to distinguish what an IOTA address refers to without querying a node.
Nonetheless, all IOTA addresses can own assets (i.e. other objects), with the only difference being that key-derived address are the only types of address that can execute transactions.
Syntax
An IOTA CAIP-10’s account ID is a case-sensitive string that is computed by appending
an IOTA address to an IOTA CAIP-2 Profile’s chain ID, interlieved by the : character.
The syntax of an IOTA address matches the following regular expression:
0x[0-9a-f]{64}
Hence, the regular expression that matches the whole CAIP-10’s account ID is:
iota:(mainnet|testnet|devnet|[0-9a-f]{8}):0x[0-9a-f]{64}
Resolution Mechanics
Any Account ID conforming to the aforementioned syntax is a valid IOTA Account ID, independently of whether it is already in use by a wallet or on-chain object.
It is possible to check whether a given Account ID refers to a key-pair derived address,
an object, or a smart contract package by invoking the iota_getObject JSON-RPC API.
For instance, checking IOTA address 0x53e4567ccafa5f36ce84c80aa8bc9be64e0d5ae796884274aef3005ae6733809 with
{
"jsonrpc": "2.0",
"id": 1,
"method": "iota_getObject",
"params": [
"0x53e4567ccafa5f36ce84c80aa8bc9be64e0d5ae796884274aef3005ae6733809",
{
"showType": true,
"showOwner": true,
"showPreviousTransaction": false,
"showDisplay": false,
"showContent": false,
"showBcs": false,
"showStorageRebate": false,
}
]
}
yields the following response:
{
"jsonrpc": "2.0",
"result": {
"data": {
"objectId": "0x53e4567ccafa5f36ce84c80aa8bc9be64e0d5ae796884274aef3005ae6733809",
"version": "1",
"digest": "33K5ZXJ3RyubvYaHuEnQ1QXmmbhgtrFwp199dnEbL4n7",
"type": "0x2::coin::Coin<0x2::iota::IOTA>",
"owner": {
"AddressOwner": "0xc8ec1d5b84dd6289e193b9f88de4a994358c9f856135236c3e75a925e1c77ac3"
}
}
},
"id": 1
}
which shows that address 0x53e4567ccafa5f36ce84c80aa8bc9be64e0d5ae796884274aef3005ae6733809 is actually
an IOTA object of type 0x2::coin::Coin<0x2::iota::IOTA> - i.e. an IOTA Coin - owned by address
0xc8ec1d5b84dd6289e193b9f88de4a994358c9f856135236c3e75a925e1c77ac3.
If we were to do the same for the coin owner’s address
0xc8ec1d5b84dd6289e193b9f88de4a994358c9f856135236c3e75a925e1c77ac3 we’d get the following response:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"error": {
"code": "notExists",
"object_id": "0xc8ec1d5b84dd6289e193b9f88de4a994358c9f856135236c3e75a925e1c77ac3"
}
}
}
Which hints at the fact that address 0xc8ec1d5b84dd6289e193b9f88de4a994358c9f856135236c3e75a925e1c77ac3 is not
an object, but a key-derived address.
Rationale
IOTA addresses are lowercase-hex encoded 32 bytes string, which in the case of key-pair derived addresses - i.e.
traditional accounts - are computed by hashing with the blake2b algorithm a public key’s bytes. If the signature scheme to be computed with those bytes is anything other than Ed25519, the public key bytes have a sigil prepended before hashing.
IOTA address currently supports pure Ed25519, Secp256k1, Secp256r1, and MultiSig with corresponding flag bytes of 0x00 (not prepended), 0x01, 0x02, and 0x03, respectively.
As already mentioned above, all IOTA addresses can own assets and funds.
Test Cases
# IOTA Mainnet
iota:mainnet:0x7b4a34f6a011794f0ecbe5e5beb96102d3eef6122eb929b9f50a8d757bfbdd67
# IOTA Testnet
iota:testnet:0x2d3eef6122eb929b9f50a8d757bfbdd677b4a34f6a011794f0ecbe5e5beb9610
# IOTA Devnet
iota:devnet:0x929b9f50a8d757bfbdd677b4a34f6a011794f0ecbe5e5beb96102d3eef6122eb
# IOTA custom network
iota:f3aa51bd:0xe5e5beb96102d37b4a34f6a011794f0ecbeef6122eb929b9f50a8d757bfbdd67
References
Copyright
Copyright and related rights waived via CC0.
Citation
Please cite this document as:
Enrico Marconi, "namespaces/iota-caip10: IOTA - Account ID Specification [DRAFT]," Chain Agnostic Namespaces, iota-caip10, July 2025 / . [Online serial]. Available: https://github.com/ChainAgnostic/namespaces/iota-caip10.md