Everything is encoded in Little-Endian without any padding or alignment.
Strings have a fixed length but can be null-terminated if they are shorter.
All integer numbers are always encoded in 8 bytes using two's complement representation.
Boolean values are encoded in one byte, with 0x00
meaning false
and any other value meaning true
.
IOTA addresses are always transferred in their 81 character base-27 encoding without checksum information.
Field
Type
Content
Range
CLA
byte (1)
Always 0x80
INS
byte (1)
0x01
P1-P2
byte (2)
ignored
L
byte (1)
Number of bytes to follow
$[0,255]$
path[0]
signed int64 (8)
Level 0 of path
path[1]
signed int64 (8)
Level 1 of path
path[2]
signed int64 (8)
Level 2 of path
path[3]
signed int64 (8)
Level 3 of path
path[4]
signed int64 (8)
Level 4 of path
security
signed int64 (8)
set the used security level
$[1,3]$
Field
Type
Content
SW1-SW2
byte (2)
0x9000
for success
Get Public Key of active Seed
Field
Type
Content
Range
CLA
byte (1)
Always 0x80
INS
byte (1)
0x02
P1-P2
byte (2)
ignored
L
byte (1)
Number of bytes to follow
$[0,255]$
idx
signed int64 (8)
Index of the address
$[0, 2^{32}-1]$
Field
Type
Content
address
81 char string (81)
Base-27 encoding of public address
SW1-SW2
byte (2)
0x9000
for success
The transactions must form a valid bundle:
The bundle contains at least 2 transactions and at least 1 input transaction. Currently, the maximum number of transactions is limited to 8.
Meta transactions have to be included (similar to a finalized bundle in iota.lib.js)
The last index is identical for all transactions and corresponds to the index of the last transaction.
The total values of all transactions sum up to $0$ .
The normalized bundle hash does not contain a M
.
Field
Type
Content
Range
CLA
byte (1)
Always 0x80
INS
byte (1)
0x03
P1-P2
byte (2)
ignored
L
byte (1)
Number of bytes to follow
$[0,255]$
address
81 char string (81)
Base-27 encoding of transaction address
address_idx
signed int64 (8)
Corresponding index of the address; ignored for non-input transactions
$[0, 2^{32}-1]$
value
signed int64 (8)
Transaction value
$<0$ for input transactions $\geq 0$ otherwise
obsolete_tag
27 char string (27)
Base-27 encoding of transaction tag
index
signed int64 (8)
Index of that transaction in the bundle
$[0, 9]$
last_index
signed int64 (8)
Last transaction index in the bundle
$[2, 9]$
timestamp
signed int64 (8)
Timestamp
$[0, 2^{32}-1]$
Field
Type
Content
finalized
bool (1)
Whether the bundle was finalized, i.e. the last transaction has been transmitted
hash
81 char string (81)
Base-27 encoding of the bundle hash; undefined if bundle was not finalized
SW1-SW2
byte (2)
0x9000
for success
Sign a single transaction input
Called multiple times for the same index, to query all signature fragments.
Field
Type
Content
Range
CLA
byte (1)
Always 0x80
INS
byte (1)
0x04
P1-P2
byte (2)
ignored
L
byte (1)
Number of bytes to follow
$[0,255]$
transaction_idx
signed int64 (8)
Index of the input transaction in the bundle; must be an input transaction
$[0, 9]$
Field
Type
Content
signature_fragment
243 char string (243)
Base-27 encoding of the signature fragment
fragments_remaining
bool (1)
true
if more fragments need to be queried
SW1-SW2
byte (2)
0x9000
for success
SW1
SW2
Description
0x67
0x00
Wrong Length - the data has invalid length for this instruction
0x69
0x82
Security Status not Satisfied - the user declined the transaction, or the bundle cannot be verified
0x69
0x84
Command Invalid Data - the data is not in the format or within the ranges specified above
0x69
0x85
Command Invalid State - this command cannot be run in the current state
0x69
0x86
App not Initialized - the Ledger App has not been correctly initialized
0x6B
0x00
Wrong P1-P2 - P1,P2 are invalid for that particular instruction
0x6C
0x00
Incorrect Length L - the length specified in the header does not match
0x6D
0x00
Instruction not Supported - invalid INS-code
0x6E
0x00
CLA not Supported - invalid CLA-code
0x6F
XX
Unspecified Internal Error
0x90
0x00
Success