From 1cf784285cf1a0ab1f72232234c81781369a62eb Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 5 May 2023 10:30:38 +0200 Subject: [PATCH 01/47] Add TIP-41 skeleton --- tips/TIP-0041/tip-0041.md | 670 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 670 insertions(+) create mode 100644 tips/TIP-0041/tip-0041.md diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md new file mode 100644 index 000000000..b371a449d --- /dev/null +++ b/tips/TIP-0041/tip-0041.md @@ -0,0 +1,670 @@ +--- +tip: TODO +title: TODO +description: TODO +author: TODO +discussions-to: TODO +status: Draft +type: Standards +layer: Core +created: 2023-05-03 +requires: TIP-19, TIP-20, TIP-21 and TIP-22 +--- + +# Table of Contents + +1. [Summary](#summary) +2. [Motivation](#motivation) +3. [Building Blocks](#building-blocks) +4. [Unlock Conditions](#unlock-conditions) + - [Account Locking & Unlocking](#account-locking--unlocking) +5. [Outputs](#outputs) +6. [Copyright](#copyright) + +# Summary + +TODO: Adapt from TIP-18 summary. + +# Motivation + +TODO: Adapt from TIP-18 motivation. + +# Building Blocks + +## Data Types & Subschema Notation + +Data types and subschemas used throughout this TIP are defined in [TIP-21](../TIP-0021/tip-0021.md). + +## Global Protocol Parameters + +Global protocol parameters used throughout this TIP are defined in [TIP-22 (IOTA)](../TIP-0022/tip-0022.md) and [TIP-32 (Shimmer)](../TIP-0032/tip-0032.md). + +## Transaction Payload + +[TIP-20](../TIP-0020/tip-0020.md) is the basis for output validation in this TIP. + +# Outputs + +In the following, we define four new output types. They are all designed with specific use cases in mind: +- **Basic Output**: transfer of funds with attached metadata and optional spending restrictions. Main use cases are + on-ledger ISC requests, native asset transfers and indexed data storage in the UTXO ledger. +- **Alias Output**: representing ISC chain accounts on L1 that can process requests and transfer funds. +- **Foundry Output**: supply control of user defined native tokens. A vehicle for cross-chain asset transfers and asset + wrapping. +- **NFT Output**: an output that represents a Non-fungible token with attached metadata and proof-of-origin. A NFT is + represented as an output so that the token and metadata are transferred together, for example as a smart contract + requests. NFTs are possible to implement with native tokens as well, but then ownership of the token does not mean + ownership of the foundry that holds its metadata. + +The validation of outputs is part of the transaction validation process. There are two levels of validation for +transactions: syntactic and semantic validation. The former validates the structure of the transaction (and outputs), +while the latter validates whether protocol rules are respected in the semantic context of the transaction. Outputs +hence are validated on both levels: +1. **Transaction Syntactic Validation**: validates the structure of each output created by the transaction. +2. **Transaction Semantic Validation**: + - **For consumed outputs**: validates whether the output can be unlocked in a transaction given the semantic + transaction context. + - **For created outputs**: validates whether the output can be created in a transaction given the semantic + transaction context. + +Each new output type may add its own validation rules which become part of the transaction validation rules if the +output is placed inside a transaction. Unlock Conditions and Features described previously also add +constraints to transaction validation when they are placed in outputs. + +## Basic Output + +Basic Output can hold native tokens and might have several unlock conditions and optional features. The +combination of several features provide the base functionality for the output to be used as an on-ledger smart contract +request: +- Verified `Sender`, +- Attached `Metadata` that can encode the request payload for layer 2, +- `Return Amount` to get back the storage deposit, +- `Timelock` to be able to time requests, +- `Expiration` to recover funds in case of chain inactivity. + +Besides, the Tag Feature is a tool to store arbitrary, indexed data with verified origin in the ledger. + +Note, that a Basic Output in its simplest possible form with only an Address Unlock Condition and +without features or native tokens is functionally equivalent to a SigLockedSingleOutput: it has an address +and an IOTA balance. Therefore, +aforementioned output type, that was [introduced for Chrysalis Part 2 via TIP-7](../TIP-0007/tip-0007.md) +is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-0020/tip-0020.md). + + +
+ Basic Output +
+ Describes a basic output with optional features. +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Output Typeuint8 + Set to value 3 to denote a Basic Output. +
Amountuint64The amount of IOTA coins to held by the output.
Native Tokens Countuint8The number of native tokens held by the output.
Native Tokens optAnyOf +
+ Native Token + + + + + + + + + + + + + + + + +
NameTypeDescription
Token IDByteArray[38] + Identifier of the native token. +
Amountuint256 + Amount of native tokens of the given Token ID. +
+
+
Unlock Conditions Countuint8The number of unlock conditions following.
Unlock Conditions atMostOneOfEach +
+ Address Unlock Condition + + + + + + + + + + + + + + + +
NameTypeDescription
Unlock Condition Typeuint8 + Set to value 0 to denote an Address Unlock Condition. +
Address +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 0 to denote an Ed25519 Address. +
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Alias Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 8 to denote an Alias Address. +
Alias IDByteArray[32]The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 16 to denote an NFT Address. +
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+
+
+ Storage Deposit Return Unlock Condition +
+ Defines the amount of IOTAs used as storage deposit that have to be returned to Return Address. +
+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Unlock Condition Typeuint8 + Set to value 1 to denote a Storage Deposit Return Unlock Condition. +
Return Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 0 to denote an Ed25519 Address. +
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Alias Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 8 to denote an Alias Address. +
Alias IDByteArray[32]The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 16 to denote an NFT Address. +
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
Return Amountuint64 + Amount of IOTA coins the consuming transaction should deposit to the address defined in Return Address. +
+
+
+ Timelock Unlock Condition +
+ Defines a unix timestamp until which the output can not be unlocked. +
+ + + + + + + + + + + + + + + + +
NameTypeDescription
Unlock Condition Typeuint8 + Set to value 2 to denote a Timelock Unlock Condition. +
Unix Timeuint32 + Unix time (seconds since Unix epoch) starting from which the output can be consumed. +
+
+
+ Expiration Unlock Condition +
+ Defines a unix time until which only Address, defined in Address Unlock Condition, is allowed to + unlock the output. After the unix time is reached or passed, only Return Address can unlock it. +
+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Unlock Condition Typeuint8 + Set to value 3 to denote a Expiration Unlock Condition. +
Return Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 0 to denote an Ed25519 Address. +
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Alias Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 8 to denote an Alias Address. +
Alias IDByteArray[32]The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 16 to denote an NFT Address. +
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
Unix Timeuint32 + Before this unix time, Address Unlock Condition is allowed to unlock the output, after that only the address defined in Return Address. +
+
+
Features Countuint8The number of features following.
Features atMostOneOfEach +
+ Sender Feature +
+ Identifies the validated sender of the output. +
+ + + + + + + + + + + + + + + +
NameTypeDescription
Feature Typeuint8 + Set to value 0 to denote a Sender Feature. +
Sender oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 0 to denote an Ed25519 Address. +
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Alias Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 8 to denote an Alias Address. +
Alias IDByteArray[32]The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 16 to denote an NFT Address. +
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+
+
+ Metadata Feature +
+ Defines metadata (arbitrary binary data) that will be stored in the output. +
+ + + + + + + + + + + + + + + + +
NameTypeDescription
Feature Typeuint8 + Set to value 2 to denote a Metadata Feature. +
Data(uint16)ByteArrayBinary data. A leading uint16 denotes its length.
+
+
+ Tag Feature +
+ Defines an indexation tag to which the output can be indexed by additional node plugins. +
+ + + + + + + + + + + + + + + + +
NameTypeDescription
Feature Typeuint8 + Set to value 3 to denote a Tag Feature. +
Tag(uint8)ByteArrayBinary indexation data. A leading uint8 denotes its length.
+
+
+ + + +### Additional Transaction Syntactic Validation Rules + +- `Amount` field must fulfill the dust protection requirements and must not be `0`. +- `Amount` field must be ≤ `Max IOTA Supply`. +- `Native Tokens Count` must not be greater than `Max Native Tokens Count`. +- `Native Tokens` must be lexicographically sorted based on `Token ID`. +- Each Native Token must be unique in the set of `Native Tokens` based on its `Token ID`. No duplicates are + allowed. +- `Amount` of any Native Token must not be `0`. +- It must hold true that `1` ≤ `Unlock Conditions Count` ≤ `4`. +- `Unlock Condition Type` of an Unlock Condition must define one of the following types: + - Address Unlock Condition + - Storage Deposit Return Unlock Condition + - Timelock Unlock Condition + - Expiration Unlock Condition +- Unlock Conditions must be sorted in ascending order based on their `Unlock Condition Type`. +- Syntactic validation of all present unlock conditions must pass. +- Address Unlock Condition must be present. +- It must hold true that `0` ≤ `Features Count` ≤ `3`. +- `Feature Type` of a Feature must define one of the following types: + - Sender Feature + - Metadata Feature + - Tag Feature +- Features must be sorted in ascending order based on their `Feature Type`. +- Syntactic validation of all present features must pass. + +### Additional Transaction Semantic Validation Rules + +#### Consumed Outputs + +- The unlock of the input must correspond to `Address` field in the Address Unlock Condition and the + unlock must be valid. +- The unlock is valid if and only if all unlock conditions and features present in the output validate. + +#### Created Outputs + +- All Unlock Condition imposed transaction validation criteria must be fulfilled. +- All Feature imposed transaction validation criteria must be fulfilled. + + +# Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From fa9fb71ba8194e166b1b018d43d5c7c9997e7b28 Mon Sep 17 00:00:00 2001 From: Roman Overko Date: Fri, 12 May 2023 16:32:26 +0200 Subject: [PATCH 02/47] Add mana_amount field --- tips/TIP-0041/tip-0041.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index b371a449d..9ce8614a9 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -114,6 +114,11 @@ is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-00 uint64 The amount of IOTA coins to held by the output. + + Mana Amount mana_amount + uint64 + The amount of (stored) Mana held by the output. + Native Tokens Count uint8 @@ -629,6 +634,7 @@ is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-00 - `Amount` field must fulfill the dust protection requirements and must not be `0`. - `Amount` field must be ≤ `Max IOTA Supply`. +- Mana Amount `mana_amount` field must be ≥ `0`. - `Native Tokens Count` must not be greater than `Max Native Tokens Count`. - `Native Tokens` must be lexicographically sorted based on `Token ID`. - Each Native Token must be unique in the set of `Native Tokens` based on its `Token ID`. No duplicates are From 7b3f8c56c70e89cf75c34e400508cc2bd5cbc143 Mon Sep 17 00:00:00 2001 From: Roman Overko Date: Wed, 17 May 2023 15:15:00 +0200 Subject: [PATCH 03/47] Added storage deposit calculation --- ..._miota_BasicOutput_(max_functionality).jpg | Bin 0 -> 51437 bytes ..._miota_BasicOutput_(min_functionality).jpg | Bin 0 -> 53610 bytes tips/TIP-0041/tip-0041.md | 747 +++++++++++++++++- 3 files changed, 746 insertions(+), 1 deletion(-) create mode 100644 tips/TIP-0041/assets/deposit_miota_BasicOutput_(max_functionality).jpg create mode 100644 tips/TIP-0041/assets/deposit_miota_BasicOutput_(min_functionality).jpg diff --git a/tips/TIP-0041/assets/deposit_miota_BasicOutput_(max_functionality).jpg b/tips/TIP-0041/assets/deposit_miota_BasicOutput_(max_functionality).jpg new file mode 100644 index 0000000000000000000000000000000000000000..aa14e244cda257a674b65f0ad3236efb2c6b39f6 GIT binary patch literal 51437 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
cXqTEZKG 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 DT%mj} literal 0 HcmV?d00001 diff --git a/tips/TIP-0041/assets/deposit_miota_BasicOutput_(min_functionality).jpg b/tips/TIP-0041/assets/deposit_miota_BasicOutput_(min_functionality).jpg new file mode 100644 index 0000000000000000000000000000000000000000..4c55672c9ed2254add27db23ea67336d297fc976 GIT binary patch literal 53610 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

D?-L>njrx_U? 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

PLlNnstgKP5EwdkSu2`~HCD!I`n7{@ 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 L|Kq>$f9?Mdm?{Kh literal 0 HcmV?d00001 diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 9ce8614a9..294a741b6 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -112,7 +112,7 @@ is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-00 Amount uint64 - The amount of IOTA coins to held by the output. + The amount of IOTA coins held by the output. Mana Amount mana_amount @@ -670,6 +670,751 @@ is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-00 - All Unlock Condition imposed transaction validation criteria must be fulfilled. - All Feature imposed transaction validation criteria must be fulfilled. +### Storage Deposit Calculation + +The following table shows the Basic Output including the possible fields and their specific weight. + + +
+ Basic Output +
+ Describes a basic output with optional features. +
+
+ + + + + + + + + + + + + + + + +
Offset + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldField typeLength MinimumLength MaximumDescription
OutputIDkey3434The ID of the output.
Block ID (included)data3232The ID of the block in which the transaction payload that created this output was included.
Confirmation Milestone Indexdata44The index of the milestone which confirmed the transaction that created the output.
Confirmation Unix Timestampdata44The unix timestamp of the milestone which confirmed the transaction that created the output.
+
Fields + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Output Typedata11 + Set to value 3 to denote an Basic Output. +
Amountdata88The amount of IOTA coins held by the output.
Native Tokens Countdata11The number of native tokens held by the output.
Native Tokens optAnyOf +
+ Native Token + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Token IDdata3838 + Identifier of the native token. +
Amountdata3232 + Amount of native tokens of the given Token ID. +
+
+
Unlock Conditions Countdata11The number of unlock conditions following.
Unlock Conditions atMostOneOfEach +
+ Address Unlock Condition + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Unlock Condition Typedata11 + Set to value 0 to denote an Address Unlock Condition. +
Address +
+ Ed25519 Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 0 to denote an Ed25519 Address. +
PubKeyHashdata3232The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Alias Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 8 to denote an Alias Address. +
Alias IDdata3232The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 16 to denote an NFT Address. +
NFT IDdata3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+
+
+ Storage Deposit Return Unlock Condition +
+ Defines the amount of IOTAs used as storage deposit that have to be returned to Return Address. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Unlock Condition Typedata11 + Set to value 1 to denote a Storage Deposit Return Unlock Condition. +
Return Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 0 to denote an Ed25519 Address. +
PubKeyHashdata3232The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Alias Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 8 to denote an Alias Address. +
Alias IDdata3232The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 16 to denote an NFT Address. +
NFT IDdata3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
Return Amountdata88 + Amount of IOTA coins the consuming transaction should deposit to the address defined in Return Address. +
+
+
+ Timelock Unlock Condition +
+ Defines a unix timestamp until which the output can not be unlocked. +
+ + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Unlock Condition Typedata11 + Set to value 2 to denote a Timelock Unlock Condition. +
Unix Timedata44 + Unix time (seconds since Unix epoch) starting from which the output can be consumed. +
+
+
+ Expiration Unlock Condition +
+ Defines a unix time until which only Address, defined in Address Unlock Condition, is allowed to + unlock the output. After the unix time is reached/passed, only Return Address can unlock it. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Unlock Condition Typedata11 + Set to value 3 to denote a Expiration Unlock Condition. +
Return Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 0 to denote an Ed25519 Address. +
PubKeyHashdata3232The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Alias Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 8 to denote an Alias Address. +
Alias IDdata3232The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 16 to denote an NFT Address. +
NFT IDdata3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
Unix Timedata44 + Before this unix time, Address Unlock Condition is allowed to unlock the output, after that only the address defined in Return Address. +
+
+
Features Countdata11The number of features following.
Features atMostOneOfEach +
+ Sender Feature +
+ Identifies the validated sender of the output. +
+ + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Feature Typedata11 + Set to value 0 to denote a Sender Feature. +
Sender oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 0 to denote an Ed25519 Address. +
PubKeyHashdata3232The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Alias Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 8 to denote an Alias Address. +
Alias IDdata3232The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 16 to denote an NFT Address. +
NFT IDdata3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+
+
+ Metadata Feature +
+ Defines metadata (arbitrary binary data) that will be stored in the output. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Feature Typedata11 + Set to value 2 to denote a Metadata Feature. +
Data Lengthdata22 + Length of the following data field in bytes. +
Datadata18192Binary data.
+
+
+ Tag Feature +
+ Defines an indexation tag to which the output can be indexed by additional node plugins. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Feature Typedata11 + Set to value 3 to denote a Tag Feature. +
Tag Lengthdata11 + Length of the following tag field in bytes. +
Tagdata1255Binary indexation data.
+
+
+
v_byte Minimum426
v_byte Maximum13477
+ + + +![](assets/deposit_miota_BasicOutput_(min_functionality).jpg) + +![](assets/deposit_miota_BasicOutput_(max_functionality).jpg) # Copyright From 11ef89e4ef1f43b0a9ce3f83ccbaf8d789abaf00 Mon Sep 17 00:00:00 2001 From: Roman Overko Date: Wed, 17 May 2023 15:30:49 +0200 Subject: [PATCH 04/47] Added mana_amount to both tables --- tips/TIP-0041/tip-0041.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 294a741b6..28baff829 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -634,7 +634,7 @@ is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-00 - `Amount` field must fulfill the dust protection requirements and must not be `0`. - `Amount` field must be ≤ `Max IOTA Supply`. -- Mana Amount `mana_amount` field must be ≥ `0`. +- Mana Amount `mana_amount` field must be ≥ `0` and ≤ `TOTAL_MANA`. - `Native Tokens Count` must not be greater than `Max Native Tokens Count`. - `Native Tokens` must be lexicographically sorted based on `Token ID`. - Each Native Token must be unique in the set of `Native Tokens` based on its `Token ID`. No duplicates are @@ -750,6 +750,13 @@ The following table shows the Basic Output including the possible fields and the 8 The amount of IOTA coins held by the output. + + Mana Amount `mana_amount` + data + 8 + 8 + The amount of (stored) Mana held by the output. + Native Tokens Count data From 6b53b23800d66f5080af7880b463b69226f4f481 Mon Sep 17 00:00:00 2001 From: Roman Overko Date: Wed, 17 May 2023 15:33:35 +0200 Subject: [PATCH 05/47] Added mana_amount to both tables --- tips/TIP-0041/tip-0041.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 28baff829..baf277a28 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -751,7 +751,7 @@ The following table shows the Basic Output including the possible fields and the The amount of IOTA coins held by the output. - Mana Amount `mana_amount` + Mana Amount mana_amount data 8 8 From f789cb2f7f09b8021f293d176d3a82dce59a71bd Mon Sep 17 00:00:00 2001 From: Roman Overko Date: Fri, 19 May 2023 12:39:06 +0200 Subject: [PATCH 06/47] Renamed alias to account --- tips/TIP-0041/tip-0041.md | 66 +++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index baf277a28..5e8559327 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -48,7 +48,7 @@ Global protocol parameters used throughout this TIP are defined in [TIP-22 (IOTA In the following, we define four new output types. They are all designed with specific use cases in mind: - **Basic Output**: transfer of funds with attached metadata and optional spending restrictions. Main use cases are on-ledger ISC requests, native asset transfers and indexed data storage in the UTXO ledger. -- **Alias Output**: representing ISC chain accounts on L1 that can process requests and transfer funds. +- **Account Output**: representing ISC chain accounts on L1 that can process requests and transfer funds. - **Foundry Output**: supply control of user defined native tokens. A vehicle for cross-chain asset transfers and asset wrapping. - **NFT Output**: an output that represents a Non-fungible token with attached metadata and proof-of-origin. A NFT is @@ -202,7 +202,7 @@ is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-00

- Alias Address + Account Address @@ -213,13 +213,13 @@ is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-00 - + - +
NameAddress Type uint8 - Set to value 8 to denote an Alias Address. + Set to value 8 to denote an Account Address.
Alias IDAccount ID ByteArray[32]The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
@@ -293,7 +293,7 @@ is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-00
- Alias Address + Account Address @@ -304,13 +304,13 @@ is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-00 - + - +
NameAddress Type uint8 - Set to value 8 to denote an Alias Address. + Set to value 8 to denote an Account Address.
Alias IDAccount ID ByteArray[32]The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
@@ -419,7 +419,7 @@ is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-00
- Alias Address + Account Address @@ -430,13 +430,13 @@ is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-00 - + - +
NameAddress Type uint8 - Set to value 8 to denote an Alias Address. + Set to value 8 to denote an Account Address.
Alias IDAccount ID ByteArray[32]The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
@@ -527,7 +527,7 @@ is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-00
- Alias Address + Account Address @@ -538,13 +538,13 @@ is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-00 - + - +
NameAddress Type uint8 - Set to value 8 to denote an Alias Address. + Set to value 8 to denote an Account Address.
Alias IDAccount ID ByteArray[32]The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
@@ -860,7 +860,7 @@ The following table shows the Basic Output including the possible fields and the
- Alias Address + Account Address @@ -875,15 +875,15 @@ The following table shows the Basic Output including the possible fields and the - + - +
Name1 1 - Set to value 8 to denote an Alias Address. + Set to value 8 to denote an Account Address.
Alias IDAccount ID data 32 32The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
@@ -973,7 +973,7 @@ The following table shows the Basic Output including the possible fields and the
- Alias Address + Account Address @@ -988,15 +988,15 @@ The following table shows the Basic Output including the possible fields and the - + - +
Name1 1 - Set to value 8 to denote an Alias Address. + Set to value 8 to denote an Account Address.
Alias IDAccount ID data 32 32The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
@@ -1129,7 +1129,7 @@ The following table shows the Basic Output including the possible fields and the
- Alias Address + Account Address @@ -1144,15 +1144,15 @@ The following table shows the Basic Output including the possible fields and the - + - +
Name1 1 - Set to value 8 to denote an Alias Address. + Set to value 8 to denote an Account Address.
Alias IDAccount ID data 32 32The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
@@ -1263,7 +1263,7 @@ The following table shows the Basic Output including the possible fields and the
- Alias Address + Account Address @@ -1278,15 +1278,15 @@ The following table shows the Basic Output including the possible fields and the - + - +
Name1 1 - Set to value 8 to denote an Alias Address. + Set to value 8 to denote an Account Address.
Alias IDAccount ID data 32 32The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
From 8f78c2faf7a0ea122f2810ec4900efd7d00b689b Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 23 May 2023 10:48:57 +0200 Subject: [PATCH 07/47] Add motivation & summary, fix indentation --- tips/TIP-0041/tip-0041.md | 60 ++++++++++++--------------------------- 1 file changed, 18 insertions(+), 42 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 5e8559327..7082920f0 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -1,7 +1,7 @@ --- -tip: TODO -title: TODO -description: TODO +tip: 41 +title: Basic Output Type +description: Support for IOTA and native token transfers, Layer 2 smart contract requests and storing mana author: TODO discussions-to: TODO status: Draft @@ -16,18 +16,22 @@ requires: TIP-19, TIP-20, TIP-21 and TIP-22 1. [Summary](#summary) 2. [Motivation](#motivation) 3. [Building Blocks](#building-blocks) -4. [Unlock Conditions](#unlock-conditions) - - [Account Locking & Unlocking](#account-locking--unlocking) -5. [Outputs](#outputs) +4. [Basic Output](#basic-output) +5. [Storage Deposit](#storage-deposit) 6. [Copyright](#copyright) # Summary -TODO: Adapt from TIP-18 summary. +This document defines the Basic output type and transaction validation rules for the IOTA protocol to support storage of IOTA tokens, native tokens and Mana as well as layer 2 smart contract requests, among other functionality. It was originally introduced in [TIP-18](../TIP-0018/tip-0018.md) and the functionality defined in this document is a strict extension of the Basic output of TIP-18. + +## Summary of changes compared to TIP-18 + +- Rename "Alias" to "Account". +- Add `Mana Amount` field. # Motivation -TODO: Adapt from TIP-18 motivation. +The aim of this TIP is to define a Basic output type for the support of basic ledger functionality. Such outputs can store IOTA tokens, native tokens and Mana. All unlock conditions and features defined in [TIP-38](../TIP-0038/tip-0038.md) are supported and can be composed to create spending restrictions, attach metadata or enable indexed data storage in the UTXO ledger. Layer 2 smart contract requests are enabled by posting requests through the Tangle. Such requests can be crafted by including commands in the metadata of Basic outputs. This output thus supports both the native tokenization on layer 1 as well as layer 1 smart contracts. # Building Blocks @@ -43,35 +47,7 @@ Global protocol parameters used throughout this TIP are defined in [TIP-22 (IOTA [TIP-20](../TIP-0020/tip-0020.md) is the basis for output validation in this TIP. -# Outputs - -In the following, we define four new output types. They are all designed with specific use cases in mind: -- **Basic Output**: transfer of funds with attached metadata and optional spending restrictions. Main use cases are - on-ledger ISC requests, native asset transfers and indexed data storage in the UTXO ledger. -- **Account Output**: representing ISC chain accounts on L1 that can process requests and transfer funds. -- **Foundry Output**: supply control of user defined native tokens. A vehicle for cross-chain asset transfers and asset - wrapping. -- **NFT Output**: an output that represents a Non-fungible token with attached metadata and proof-of-origin. A NFT is - represented as an output so that the token and metadata are transferred together, for example as a smart contract - requests. NFTs are possible to implement with native tokens as well, but then ownership of the token does not mean - ownership of the foundry that holds its metadata. - -The validation of outputs is part of the transaction validation process. There are two levels of validation for -transactions: syntactic and semantic validation. The former validates the structure of the transaction (and outputs), -while the latter validates whether protocol rules are respected in the semantic context of the transaction. Outputs -hence are validated on both levels: -1. **Transaction Syntactic Validation**: validates the structure of each output created by the transaction. -2. **Transaction Semantic Validation**: - - **For consumed outputs**: validates whether the output can be unlocked in a transaction given the semantic - transaction context. - - **For created outputs**: validates whether the output can be created in a transaction given the semantic - transaction context. - -Each new output type may add its own validation rules which become part of the transaction validation rules if the -output is placed inside a transaction. Unlock Conditions and Features described previously also add -constraints to transaction validation when they are placed in outputs. - -## Basic Output +# Basic Output Basic Output can hold native tokens and might have several unlock conditions and optional features. The combination of several features provide the base functionality for the output to be used as an on-ledger smart contract @@ -630,7 +606,7 @@ is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-00 -### Additional Transaction Syntactic Validation Rules +## Additional Transaction Syntactic Validation Rules - `Amount` field must fulfill the dust protection requirements and must not be `0`. - `Amount` field must be ≤ `Max IOTA Supply`. @@ -657,20 +633,20 @@ is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-00 - Features must be sorted in ascending order based on their `Feature Type`. - Syntactic validation of all present features must pass. -### Additional Transaction Semantic Validation Rules +## Additional Transaction Semantic Validation Rules -#### Consumed Outputs +### Consumed Outputs - The unlock of the input must correspond to `Address` field in the Address Unlock Condition and the unlock must be valid. - The unlock is valid if and only if all unlock conditions and features present in the output validate. -#### Created Outputs +### Created Outputs - All Unlock Condition imposed transaction validation criteria must be fulfilled. - All Feature imposed transaction validation criteria must be fulfilled. -### Storage Deposit Calculation +# Storage Deposit The following table shows the Basic Output including the possible fields and their specific weight. From c06acc5e45b55a889c40389617499dc624a6b776 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 23 May 2023 17:52:36 +0200 Subject: [PATCH 08/47] Use `Mana Amount` as field name --- tips/TIP-0041/tip-0041.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 7082920f0..bff43b491 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -91,7 +91,7 @@ is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-00 The amount of IOTA coins held by the output. - Mana Amount mana_amount + Mana Amount uint64 The amount of (stored) Mana held by the output. @@ -727,7 +727,7 @@ The following table shows the Basic Output including the possible fields and the The amount of IOTA coins held by the output. - Mana Amount mana_amount + Mana Amount data 8 8 From 67ee26950f9473b1a1a3935e4594a06aa36cbd67 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 23 May 2023 17:53:10 +0200 Subject: [PATCH 09/47] Remove storage deposit figures --- ...it_miota_BasicOutput_(max_functionality).jpg | Bin 51437 -> 0 bytes ...it_miota_BasicOutput_(min_functionality).jpg | Bin 53610 -> 0 bytes tips/TIP-0041/tip-0041.md | 4 ---- 3 files changed, 4 deletions(-) delete mode 100644 tips/TIP-0041/assets/deposit_miota_BasicOutput_(max_functionality).jpg delete mode 100644 tips/TIP-0041/assets/deposit_miota_BasicOutput_(min_functionality).jpg diff --git a/tips/TIP-0041/assets/deposit_miota_BasicOutput_(max_functionality).jpg b/tips/TIP-0041/assets/deposit_miota_BasicOutput_(max_functionality).jpg deleted file mode 100644 index aa14e244cda257a674b65f0ad3236efb2c6b39f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51437 zcmeFZ2UHZ>wl-RTfD%Q5D4|ghkRV79i47`AL_j2ifMgI5ksKO9M2P|d3X*e{(BvQ@ zNy$0qoHI?+;g#-lw&339-gEzV$N9&2F414&`yc;cKLZq}advU5 z@Ng~zxD+^e6gb$g00aPV@WIypXz)LNaB%TX;S&&^K0`zdJ^()p;Nsxn;hw_7$3Jxn zeA)y2KX8fy|Je zl|w-AhR{u6k=u8qWn|^#@2WmjQ`gYc(l#E*M9cw-|Lw7|54BW?AWh<4Fe>2 zIN;>rQ28 zx4V8m0f_k9{Jd@Z|G)VEiNQ(i{YY>MY3fDe&z^w$uZ}VvVrSWU?YI~h7uXc~+VZ@j zhVq2KerRRMwK+VNz>fgol-`=XClMA1^<2SxsR+SDDoT<_5O0cvk-yqKE33cDUW?6e+auW(GYpN^A zy0nLqiX!gW7?nrd3e0F>4g=Z%<==-u_V;=tP$sFdj9)Or#M$Y!5ecP5uP!ZA1ys6H zKgNw19C^b;;*d*9sZ~7iByM{A>SOa%b2jhi#4LO~Y6g7#&0^-2~D&FZ5eQFE*lyX*xYOWZu5cWa%dE1lt5yWdH9l>4q(m!MO$WMT|hj0wz4^adAz z@HW1q2IV1AfxM8+QC-XXUAN6cWx`%bn_7R7Rlcb@5jWJFa2gAo9H}lWaN6ue?V?U6 zY?Fuw!&+Rd_-sT+CsjcwKqp4nJtn{^MJJ0+|!$EQAo&nVkfiJf)9P zglu{tL@~a4l%S|x21U&(DalKC0wL+n0LpgW8&I|>U|XQ%oG38Q-yc|jP2p@hp@}Nk zFu;#_{?U4JpV~#WF6bsM*!l_%cD#4+O}3X8r#FRscOTFgP|?wr(NSRmr|}#taI(N$ zHz?w;1`FiPU;*h=o&RhrV?og(tee>7Sd2&D{Ln606q5uQDAF2tK#@KTiu7W}Us|O8 zFS=Gyk!gknAVL#+qp-!|1d@>drJ?*kYUKa%kt0JB9pz?i>PtbUcpaD8| zkPZD^S{`*^By4L}%CJC}h591if3}tXjtKsxMQXW!+qJyBEG;b1)OLV&f*`rs@tFT( zYLe`hYvJnXIh3IzDZ5$aB{bI`t+@Dd`0ncW|5h$j9k$pceNmOB<<)ODX-7apM}o&4&~pu57mZ zUL?!ezYaj@)ou5o!Gcf(dVqVC8Cqxg!4TmE-Q{rCCoMiSKDQk0i%I0MXDK5*jPDOI zQFK>5f}e+H^1On0#?Q;AAcX2PO02ma(RZfni%64|*zr!a6WA^JSN{eRc?j73;vRv< z(xR8rXXEsvSazR@#2av`7ewTzHEvZ`ueJXMSf+Ie=19obAkHJUyM>>2o@Y<+ua>MZ zq7}-<$!N`Q zM{??O@g8cGQZjSA@MX?_K;u%*(9yeszh}^fQYYFljt+TUXY{G)&Ry;l&hWy`^ET z9b*a!Z1L#ws2b$~+d<_k4K~`@gSAB<$)6p_v#rzL<{5(xYN%j=?w0J7-)>~!Dr!hq z_jBb)#}(P79o}`Kl|s);Ha@LSgKD>cg2JW)0#=U-Dh3M#ac_^&=c5o7IDh~57dv6Owh5Tx<@}u94Fu0N+j8%bCl9K% znpmNt`^m-e4b>Rsx6QhWH=YpyBQ0Wf$X*F{#cPV(l$zb?y}2ac-y0TN#iroirc##2 zWAqE-wDfO$@XX0{%iq6HtXjZYs+jb?o{&P7pJHj>8qe<94HHggSxT91Um0P^2Hh-r z`$5yx{^GIQjpWm!N2C(#<3in!i{J`_+Jt2h#ujqJlV@uko=KhxAFjUUfBR;oLgwDa zg&`}7CD)+TwAged`d8~ii7rm;bw(ox1Qi0bay3+Y6~CTsucVh@4(8QT;?VidM);8;dTB9%99nwL z+41PBt7Cfl^0wA;REL|bTiR`|mwsyaXZ#jq9+Y+9(asmJe5$=@>&wz_u!Sc}km$nF zai%PCon7<(rO_@*rm18Gx5++9e&*UbqWZ6z!Fy!UJQN!@AX^41U)8J!QB z3Fl~dj=t~#_=jtqL~Ed1#H574M4=lnrs)}!7-%XMu!DWb{6ofm$QgLxrpBY(Ctw41 zSRko8w@=~Z(u@1M*?b%qImR9qVS$jC4dgm>S6dms;&1#gj$=4_@_Dt26H3UQB~;P= zA>C{(YQK{L#lu9ny`sA}@ii8gV8~|Rd>A8c9mOoT02gS>yj$2z7Vb|cf0LY_6$#tg z0o7Ws2@`M^{Pz^cmP~SE#FPcIYPUio2YC(I#Ddynx4T7_qWylXC8_v5pH>~?miE3y z=e3aO?0r)A2MP-q8JMQhWB`n3r(j%x>uI8kv0SHv*-hL}8}8OqBP4GG<@EeE>pwtu z>HS**rr<9N&p0T`U;*W*@-SUIRL6==$s?-H=O{W4jzQkV_LxCW?r`ahCdY|M`o6hB zg#lFnb?5xcyr4wO^9yNfl^VMpyUA;hpuJe2cW7|QE-vWm=){rGcHSV6004LiRK;$Z zJg;Ok^4qUK<)R%v|UIg-<9boRtfJUQ1_6C~HN{_)ls&@N4`+Hy=2QG>Kw`c9iiASUA zkE)ZFpROEe2YIgy+?qZ`!p)QLM#D<@G+rPUpn!&G!|mv8r=X-07Li*5G>@cPZ#Yr< z?ohUvJRBdjQJ#7sewR#E8OQ9)&hU7fzdY}3?pQkQ=%?NTM=0+sWnPP zc#GmX5L>XmSdAF?=DfciRC;}^-ka7aaoS5HYaT_71umlp(7p~3G*>j-LDBYZ7jv+p zhH6oPJXx<*W-v*w&l@;?o&D2TI)?S{r zSfcKyTz>Y9#_TtKGr%lCA}I^@#bGKRc_tr?4F6%}U$QWCGqbt2wze=B&lBxGVn1*p z4GTP8jNc{c!2+8M&@V+%#kG}Iv@Pnj6@4|ZdD9Sjgl#L^k)quTEWnilTK^Uko3YMT z7;h^q;Q8a)alC5#uwz#c5)4^%oSis;p!tjZE05JO}j*<$6grNpQ;3pf|EpYpBr( z?thw@%}(Q|f4=jCqr`HU%QUa~dwOwwi%J@9vXxDT%L}iOHe~M_RrfF(|H^6~p`VV1*9zJkW3eS7@bQg&&h zW9#PUSc5fjY19S@o9htmawEO-A5xcH(Ge4`Yy=fmY%dMGkhey?lrDMurH3c-p$!Kv zwdfl*rY-Fok7z&ak(XE@zgXr)+L{pMmiej+HNDrgv2GuEc#ikxBuTHU(#wUy>h5tY zpnK$y7aSPv4mG1FoV!5~TFS6`HsTci^8GUj#GY)uJUz-?&#iB)tlC?uHZv~DxX$5bJEf?+-nZL; zT(eDV23~wGN=*cD|LUr{lnZBG0clXf@RF(M>puTT{VOxV9yw&U>_cB@$B_(NgELrZ z6nNZSP%ehcXls`$B?9H_AljS1{VFClpn64=G5Ouc?+)gqk zk_qgAH!nR6K;7A!FD{NHm>$tD8xYh}=NviYj_eW(fL&&vA<@B6C}0Wig#$KhD3}6f z8Vm5N_OVu$c<;3qHPEt`jZT_{D`9#*VS)G&*b$N)w~t!m=zcv0W{m|l7L$LSCJ;YV z(_a%MKSY;ef!d^yU#DK&Dr&IeRp`S01P0>|{qqbsx!C7a>dCa&@DS^L#=A!p&NTZ( z1k^if3*dJliVNXGz$%t=ZyWJvX{Iz0gHrp{{NUdTTGJVa* z#Lj81>cCW9N{Yn8QyS6`JlUtdwO-_TcgdCBj;#C9eJW2`+nwA<#JGmsbN>F&nJ{-xDMWfo<2#P?*@dDEZV{uP3EP`SfE+hO2OsI zVr>U1SZU4k5A#Lyhxx*3V~D~65s=N7DCPX5(Hn-m(qGeeOjeUu z&gl~=%wY`ooNI$hcd!6+d?CVR>bn?Cv0D_RLCm*S>IG8cwnh4oX5NT`9QQys`xh+0 zq4Z0pkBN6tgnY-elYlS#?J0F`wG%SU^GmGMtR3jClvQy%0i?Vf_k2PNWOp+J1lj*X zBKFae6`mp)=0oin!%{>aK@(NUO4qk^{^%ns4r?TTl!H-wJOR zrfqO6WrPix90^732l;*5u`hDGITmaeSC+>w*DEk~W1YHCiDpbJCvt^)E@I)`i&&{A zEwpMx!Y#~RR%HofWjT8*iZMtG%NZ!JI_^ADtW2@~c4PBB5&uDmV4sTQX-RQOsP;UHiV($opi6#8 zWC=xT2|kCnAviJ8NBKuY%RjCGTWwg=N9a0H^rt=IARA&%=&IYzYx1h|hq*yjBu4X$ zd$H)m8CxXYAPB5=SfHUlG;KED;ox1eeHLUzXAzn!QBDDy(ObZ<>Rw5+gfX!u1NPCSjj%z)HuRIhk?l~0 z%?`^-$n$Ob7V#QM&EjVUIM&SshVs1lr%E@b6U{dy5fyB z3b!Xu9Bq%}BHVLpDvJW$2Dqn1V?=8y5w|Q%y{&o2bb%wEJ2t28QL?4Uu;7il4)CxI zl`55f!+`Vk@|*aWSZqdj&oC zWxqzpC0m%#O>*kC7rc^ac%28Umrz2nj&mQ;bQIXa$L5U8hQ*5JpU;T8=k(D@;UE&H zRXqE@XP_fTj;`hnJUzQA>W?cU8&mo86k}X3PJc(fdH=AbrRs7Cg{Cl$O-h;cn>UMi z;Xa4G(Vm&YxHeu~4VS$LPT_|AQm@0~4ZW=>z>(qsWcx>$Jv-vTu{g9O&8MHWW{$61wE0Lr z!n2mZTpR|#uE9I>P;#3n(!z0tfEE#aZ)PxX_Tq7I(AAD98T;J(5K6g~r$65;i$^Gk zDQ0Y?Ahhp*VTF=E!V0qcO2Kd_0@a^ejOf_ZVb%1!i3NtT&_4QA70BUD|*+_%sb#;kp4e);`;h$U?K3D@)H z4w-kaeyqs57uWi3WvBr-okZH=Ip^!~cY4JGCmMvdJEy=v$(eo!GKUb#F_HLc>axLF z@K$i&3Xh*BeQ}+YY`GmuwOMJA7kYO&BV~)4@y$q&QnMAQyk#HS0oB^Z@umHnRWBUw zjZX=jvh$sJj8u;#OvoxZ7Kx-mZAawX}X)0T4muXF#;|NWR!>Ia?V#S>r*iu*?- zr(BH-3(U+PVJbt=H1BY%{_DB_Lz4b1jmY&W#MBcyS5=F=o;41(tHKH821PqXfyK`mp z$CRyoidKeuRARp6a@gwF_pl>EmwifjpIOQ6uqt>vb9>>~aJFN;M97;90 znxflkVC?R(I&~>V64sc_-2QJjI(la65QO)5PPZLxWiXB%41F!Kx_GEc; zrC~HZyI5%i44(40*xFha%*umCKOaT`Lxm%*+FKkeq*bcpp{i6|^Fmjo$${uw;wKqN z1DU6C9p#zsZ=ehF`Yo_8A(xd752LpAHxr2ZMQB3OwA-xGm(*`W?!a>W$H$oEZ#K08 zbu+=1I;5QUyK{p|Vhyd#aIOTZZ{}FaFF#En3jecV+bp2B^Z|AS3lIT*O5Fl&EOG*4 zBHgWbM^b1yx!gK3hY1vETqUB?M?36I(uPKqgj>7oag*g>!%W5)L7`AK6zcmS4?^Ww zFG!*#qON^>z9cXr1iEWaI;B)VGnPQrads z^lzJ^Ku0Xj*Ju5No2j@|zmkgLb*BeFn;}RFxz~T4F+E*dU*9qc z*SXuBo8#)zl@V&fO;K3v$z)V*=tz%o=;d46B1vR9O@Ib9I${QNew}mZB_4z}P0rC}H)HEEA3?OFU~Q< zFi}Ie=9+3;eIj1E<;IBt3&|1OOsUbIhiC*KMqtowUalGj#Iw#_T@8h5IOsiZq;^GZpqYv-V*c*RJH6Ed`j z^C)fTLa2RYGY~8z1c{*)5Hm(fm%hGa{TKr+7`=Udn2YpX6e;`5Z%eUWQ}U*4&vxeQ zI%gbv+srnRW2=56>)g9=D~~N+{)&d}Ii*(Ovp2nSJygZo8eAgbK@^MAg?`yZnGUsd1%q{&I9dc30H&qSl zr~{fsla5$G1X_r4$^;FY@dB%K8Q0Vb6Tg`dbaeip;FdrQY}Rb=CFXSLHWmiv(za>;7dl>`d} zuZ8-NpG>HG{b7mu9B3AKMiUCUJPF$y0L$f%37E!Jv~xg*CQU4pvLwFCvW7Uw-t0(K z+MoDgAqgCD|59B&y|64L_bfn#_cLDldUu}6nn4XMPh8?^8s=(kq#p&Coi;7cu+MQ$ zo9jg{=DzBKHp6D%&%RF$_;H^$gNH3OZ7E%X{>Z&#|IEFx*(yRWYfmh{(g0aTpmcRZ{!pK$PH|{+%Y0bv)!5Egc%qGjbbitxwXUHi=s7_=MoLoi zdea9?_JP^_=dlCVNz<%&f+eM_?=0GJ>C~Nkca8j%9k#!ApMSy*)XV*( zxZ||MyJ&BVPVRu=Iy-@~>%MP3jl8+Qk)`=@_ko)-f!WI$755Ev)U>G9sVk2Z71WL% z>J*kM*SL9&AISo{?c}P@x!Y2{tlqKq7mB{p*!F(G(YcZT;{YLu4l(g(`ImC10@VFm zlHK&q?V0hTmfq0g>*6;ONI|Q_g3+s+w;gP`tG}wWoyvG1H>><@S>`m;rWE~Subb7} z&{Fu4n0%TPLvBR%%Mw=?BI*qxYFpmmE^jX;@n=dv;3UZ98v?U2A*dUej_ulFOlO=; zt4r-N%h7!d7H|_SLTPS1@=ZtR*CV9|hKt9D?-iB}YqXUV2Mg6L^Ci%$1$aOdiff}W zBZ@_@wqbjv6rZzM;x~9NK!X4wH9z%e_Qr5GGb<*jsGfH5lwShzWuqN1y+p$;=j^C_ zpq?g`sqbfK^O@#Ix17m#lJXWyVS7&|OsAc>9^{6Jg8o1T*7w*8e&w~zL9;i=?O6rTa z>BkBP;Q_gP@iDeXn-eHK9T3}GT>Vg}5!l2lFvzjEy+?j{2*!?UL2hM3Uj_Sr@oJV+ zbV+PFt}RdQ@J2(pcnLi4TIFydSRV8Uwf0BYDIc*)q|i-@GDLeH-IxUAs{a+j3As zU*o5^Sk)0T%-Jf?MP9L$PAw5#)CFDyqcMM8q1`L^BPQU~HuwG!3 zgxoHm^#Udyq1!i&s}Vk#*O&_mdfx83xG--t!#BOKgIVe#pb!bjLIKRu}88N0J z+kX-9K%ZxaJUe}>1OuD3y8$CD{(kEMDmx0ZyST7RM!2L$nikeiT+$|R^aI^;_OSqK zt~RHz+D8nVz1)MB64a0Xi&;+S%$!?>?CgLk3{TLN2}nLJE$WL2B-xr9HC-+x)1#1^ zHmxkPtB>M^7_tVAiA}&sngUVW@tHk7KQ{ire_hxA+N;@C3}?>8*%*bV2N(87};ng7sm{?^Qs zwPuwROn4;iST~eOJRN&4-!fP&VI!)ZdxDOF^IwVBk|g!93Z9?nZp_1;wVj0t?S_zz z)@)RpSsR#>BdV4^C-gyF@x=vJ==V|*ojv-)OS5fHb?I(!T#1_%;9y9$2`UpEwRvJI&uP9?IA;PB49~6xmr4zYg7jD zXhLKcXy3dlg$h05s;XNqxT*qj#$b2FbK<&SUTzlE30MFh8B;I?hg+NH|50gxf0k5?>O5uP4``oO_HDQGE=nK7mA&;vQoiHo{h}F+&bo%Zh{AhG~x!Zuu88|n z;w0^|J1Tk+RBj?6E}o~wBQ&Z&sKWxMW;{n`zQ z2ot6b${!q)pJpbl{`gedjh@JXrPMe2auBEdcb`b6#;nuK^KA4Ni?Xy3e(IazStIhc zw%OGQLT5*1NS=w_`qo^ZP|qvg_zoI!gdQS zK?n8(`1ay-f$lcW1Lz^~C~N?Xx$Lrm(X``N&;RLz|M^!<4xDWs(EQb9#sZyjxqTCxbFMM`)Zs50({#by?rhI$ zUYT*CdR0Ii2GyQNsYG>bf^F9bmFecZtB87EQ*^%2cDDVS{|v0C%E1m(q*YL=I()MZ ziX`7l#!xUgdfHTJIjw)n)SsBt@w?_kS(^ZY8|74f8~4h)W~?RjTU^4hEs z$N?Q}yUi#+WS7`teWW8&g(We{SQeydxH}P)ByOhp5RP_RD;+J>9?qxrA^~nYbYj%67jRm~FF$Anu~1?Hcl5uAlF0or6XDuVy3< z^}2oElv>TIUO@05*y#R%L~v~W0f{Q;n3?R5y^6M=iny-EGvEZnavdM4th%+Jr}jLz zVX#AbThwKd)t`ts_V_{at|1Cs#(f=(K)j3lC*BR1NHczke+W@a?bDxce+2Oxrw`cB zmcNPxY)mmP)j>C@)8Hst5sa64g1pKO!2;=l!C$`bHoDzW0@K9C|&_Mxxm{BWVpI`1aqBj=VmWWFjZm~^bFt}!JW8{;1ltanzr zUs?|0_m8lPIs}~Ot@O_>gt2r@Qce1 zf!BBOU$@y~@cW9F#6$(&z@BuqWKLA@M#z~6J$ozF!Q_2faNsPtGI>83d&WWg*n|9q zw|}Grl?jf~|Bf;A)c?qfd+{^(K6#ZX8dG-Ty%BKebISV=^Emex`)}|wroU_kqbZ9T z&z*E70&dV;53d-k>?$+2BrUI+#<#m=?`%nfXl~A#*{c zu>+ZoT)pKDHq8!~7={x6Mfn;~p|3pP`g)Be3f-)Oe4$o5WvHzPQs1>@lApRgzT|UA zsl3vIF%o){RMRaI|F;~oa$CgRy(17zuYh1`3W6z2L}Fy7GNe3ZY5$vBr8i6l^RBwe zl@)VOUn^ipXxmKnSYy;Q_vkKV-Jf44O{4uRVNl0Z1ACuCzB<963(M(SkICK$7OPVsifgBo4ku$Ftcwr(ZeX>~CFUl82kZ#5G9t@^hq@S}4&9#r; z%*#og-+9<;Ltf=WxI>V8d-I^az+*)o%!PV_kfYM3wnly6CvH~!0L*87=24v9`03jI zvDV}q)?7k>wx&JTAGT&Hxv#)!iTQ9#*aSFU9fF<=65l4!(y>+g>vytIzBD<=6q-C_ z>cPiwltRx4M!a}rDWoC;G)bYG@s_Gv)(O_T{JQw))6`?&{DTAl`Uu8t)LA!?d>0Hc z<_u^HeYrh75>jrPJaTpYfJkX^;ZUWr!3nY=rjRm{xpv{f54%%uo-iR9Bmn$G-c`|` zCe~BfU}?{e!%WnLp2= zmiCLc`#)~T|M*pY?!S;Rv-N*z|Bd5hkkS{6|NfBtk6OYkU@l>*hWx0E5BuB6ir82+ zIy!J%*$b7{@UWK+*|2oHJ<_4Sm6kLiH5C4f@%(r55QI`mWYfDph^B*n%eXy_#=WpU zv@t-=Zt~UU*$wtpajC3_^GMz~kD!Uat@_hMlPBa+crzA|(?RP) zjLtVyJ=8qBGPqd#CzJaZryDeUro`Z|J(2s#Z0JHrC+PTGuY&DKTmqFj;*(D5ah;c=WCv=uRyBuzqF?6Mppz?)M?A5xrWW)v3R=@g^^@sr; zH*n84Njzt<&sJo!eb^b_H_r1(Iva#3}C6<50Jd5(+EXXsH>xPS3 z?R_YYCttFA@rLxZg>eL|vMj|-MpB$EeMV34f8fD1>yJ7Y9eHkx-)L{XMSu);_r0RZ3h2Z+FVrC24x99S=sZISkx)qG>gbjlH1|yg>)vFEWemTHR^C3fiUXB)rc4khcL!u9gVs#3^q}RKG+vYwiVS#i1 z(6|!++1e@g0b?wnF{KlVISR!Bh5pczDlIl-Em>pj#y99!l~t4e30E>1hhmK@`x|sE zJ$FBapcgu}U9Zo)5nbx?teuf9#B3kcN42h)=P9f*-hfqS56WUz4X}Vf@)3E%Gg!{n zMV_Nj@=YqYEBy*vSb%9xul;AmH2o83Gygol!b^}NLCB`>7!Ci)Y>>5%O<&Ui4#Ptb-11}t3z?^15B)0cVXk)e?@q7zXw2tzjpT&Ew{4sg@=s^%IU({S$OqeqI2U;$j zYix&>Tj8Raanse*Xw?8WBH>IJ=MlJP4S!~E7KBUj5)dxcLAWgX37337;PN5}m$)!Q zxSlnYeGf+eD-UB6XhEHksRU<>Xf)(t7IgVds9@I4g&cW!CvQ;_=~5wN_$>v zt)$nhUI>h{isw`;km18)U1;xtJ0D@*XKu~Bfdz^N&gv{<1_uu04rNeQGdP z5rVk2u8($ly>|gRX@>mKYBv`wAWtYN%!818GJ$qX&1k^_*0P9;&rsrBINt?(z`F<|CwoY{RE=^95rz;AQ_sc?C``4(db7lA6+bfiZ#nE>5 zq(wdP%#2@9EbJ>y5gvUd(T76z!WhUn_g_pcKGf3IiT@dq$)4?B>M<>{`}Ym zhvSBN}jq21PE1|3Q9wbjL2g$L$m3l0@3>C3Lbkr{msHkFAZD4ORA$NMN z!7DSbaT!Dmvkyk;&W6=P6Hr;h=AadBuTTh)JCEX2Tg}b=c5p9hYu>B+nlUVe8!at4 zadubvX{O@>`n}(tVD}Z@kFaOm_(&Q2`xzO$S-?J({ex978RS*kHmu&Fz14PuGi)NT(52aSg);quGbF5 zDr?N$oLgijgR?bbGfqpXnzERkg+p=3mahE7A9A>2o;-{N90-L%TReOkHwM%}%o(i1 zSSYgwO}p66$qw|fP$ZhlH8FF)=yZj&SKd7a%w22ocWP$oSHVwj&E+))HuYnQ$cQ7eEJt{ZX*!noVb_+4W z1RfnN2zn_7dGS*m$q%@A`v+WDIr=~9Pd>UQoI2W~L}G5yqfi2U*s+t@bGzHlO)>u06$J$QFQmz5Or2-@5_eKvVww8ZlN8q*-ur3+ z7al9&RX=~HOehSd4P_!gLV@-IhMWhASOd3yS?KTV<-sPmL8C8tKvo)fx{o>IhdEcd zb)~UFV9Ml)f$ds$jmd=2d;a;^t+`F-3p1Iy`iNTs`G?2>=%xz@R!vsP;J1c4PTn&I z7a(TP_K455#{z^=@hHa%5q7+ff4K|d-+!rMe6hg(cC3v+AMG799a-_k9#E44lyBjAXbuNANL-g}D7$@HwbVr5?R^v(;? z?I}WGyl>(n*82&hL2Pxru?jlpqb@Fg=6R?Uzm{E4!E>4G;~SSlR9$!n?IOMFsI-?)#& z$Zqa6ApDnA*@dq2`EsPM`_xA0k`dqo&!Hy;yHBB()Y-Ffx}7-owyr#nDX&ice&5#k zk=EANkM3DbAD`#B)o)DSjQ+0by-pn9k~0@}CtSy^-f>*Z_$r-DBH1M0*%#i?v$~Kw&cU3v!}E4DV`(p zCpQt1I`6=*0kjo*PS4Agna-kK+BXqqtoeWMg*$Z@Z@liT$rMvGu}NzF{;Xl9EgGL) zzWtupwlH^izn6&ZNu~O$E|w#5ufZp%M~9ViEZ^!#Cu+48jObPASDU_f`Jnm{l{~oh zaZ-(&`C<7Mr?U;Wkw!(~D?J?B0G-hoBRdI6N3IlO_PUXtg;@$o2AbHZeDdY~TiZ>_ z16N+e&XA+w?zMcvGPHbn^;aRjV6OBx9LPX%*|F7sC!{=_O0Se~1a_d^CWmD+aqyT# zCA)Ozw06?R%iHS<%F%Y#F1A?$B|X4}&%DN`H+>Kf1B0tN38j7qF%t`kGcT952dl~k z)Nx#sT0wJ3FR06f!gyApqhp>V&bdjF^ZjNj`U}FTPP@wUa&2wz9`U=93U8~%2$NfM z&f6`Y+0Q$!ngz?Z$=gkXUY$iW{AJX2?Xi`l&jGQ9AHSuk(q+JhRU~JITIUql3Bi#oVFUf*TqWA5iku_>EUzoj(EdG1?>a<5XrhK7Ds zX+=qGdFdy=yKhA=Zf-Fe0*d?B-T>U4MQ!ip{y zsGC~=SpYfQ{I}s1h!@k_1JQx}lmru;${zr79Q=}3bxoqrBy{ZpRo$=WSZeRX)0T=x zTZ_zj5212?P`785E784e^)i0- zfB+&yG57G3nDMT-%gm_(VW(Wne&oYw>j+fojoV*kl@yjX?%gxoc3Ksp(|WOE&xoRI zGEBM}(X9QRLCOXyD8ECnhPOq@jP-vM4XuRtOj>r zs?Hh%le&YM3rIUj8i9^8gK4GNI{FhU6o;iQJu}wNmb5k1Pdi26>V6{AXIWqnc?|L- zf1AL(i(kkQa<(XPiEIx~Q#ZX^gwdQs24>eQvOXsBv`VtflXb$Zr5E>uxIu>gHf6s>c&lW^JwQ=gp^P&5xc6s2pUaTvK$l#8(6+08(Z=O3)Ocz&DZTrho z`*-$>y1)dHh3liVia-L4Lh74Djf!5jvf;popKxUj_*7h7)yMwaT6Ek4{69IziFHaa zANK94sP2Ap&4$F3nXA8fUD=yxHgM8gMtm`*9?9Ldsu8|Kb8hSo5bRVU^StTa^$WDQ z7uoTkM})GN9`LuN0Mps-*|-0E#~y>>M|LYFn1dgidZd)1so=mmwj*B1U(!u9_qwGH z2)RX=YThMDZQR3k#ee-Omvx+IeN2S;yEho++M7*npYh^86Gg3-%rDtgy{_plcpqu) z<9thsgIxC>_{65d?D{o~O!$q4fl(k7yFUtTZCwyE?%2kwm|2o+x5Ip zf-1JhccZLJ^L};BPI^W0uJ@Sy+3;s1EaPg&uWp&T0VYOL?e^E0*lF} z9uKrV)lPQo**IGO6we=yQiNu=5NaN)2amt7CQ-DE_#Od2Z9Pz?74WJ1T!cwJV~E=8 z+ackeoeZ`g7&;Rt*jvbO60B#?6gw@PmUe;X*5{tCSaB8enKehqs_j;R)b|fPk}u6V^mtdX12nS($P4bpW}V z3rJXX`Bxa+|MO$RPoMGLPj}E zwvcBC)3bz#`3!`jJ~UM9O_f`;0nRRGEov?Znmd75s)MxD>yM%=&`}lZ4POtEERhg} zNyE5fC}rgEm<7m1FDZAWx>)wuGS$?jsC?MmG+H9FcY_r#qEl;tpL)@&O{Jtd7S})3 z%ibaAm%zF^G8$L0TY`@7T);G5zLm`QJi~80D%9~i5c4_I$#|E zyvSAy0L7ryqia62E@aX;X1Jl=1h+3Y4zQ4yq;Gr)Z_8Df|GZuEF-`YgTwlNk!lJMj zjUhy4Lqku7G6HzhCPzlwiMoe1@&%tPpK5=L>av|Y6R5&K|3+*mJIqXT=Bv(!GxfvQ zWoZ$omvC7bGV?*Yz@4YQ`{25O4}RJ)31t?FP}nOx+6NqW8NhLG&HZI}h$k;}M!28g z4aMl>G!7H;;w~c?X|xW&ip8zy@2&yyf)F5H5UhT#R>#O_mY_yH|H0X3!78_&mD!{P z#S;opO$@>&5>wI1H;r>w29VNmq4Nw;eGhJEm#Y5zb9%=DMCgw-QO9dZ2&V5|xf=A7 z72uT@0A9J5NDqcz=T|lQb~vFx2)G{D4C2*Gn6q0D#1I(!O*GnmRelWuBD&a*k-?sY zdeN`Tz$Ji6MC=Et{?WRcV>R8VtB7oE2sKt#Ow6}M&c_>YhX}ZvoC?K$>i>)HuKe>y zc#c)Qk5!c4i}&w;>;O^wG~UPMqa*AuBzm_5#h^=3A{bJ44vf2f4~lpa3eTzgqmB>l z|JVfn&+NAU*^2kgfJ$$QvA0Y|#Lj5dcCd z!{0+G^gt+uCZGN|6MYlNi-Xa{!GHVJ^Jc?Of0&AWpT4Oa=l}!>{{|XkJMk;-Pm<{W z>f-8hzq0!vf|7$j$nuq-5y)o!EEDvBkCg2sUvGi^1=9jpn{>6W zh^z4w)ai){#kGXR#+|WwyUSGbg!ZR3+PqS~fg}g7hx4^h*VNv;L-Edr)rU-m<`NZq zP_#5N&ZMV+)!rJHN?$%dfrxA8GsaQ@V$RpHLewf}*VMUc`IARR#vhI@$3Ca1pxT`d z=p(<{rtle$Xioc$(ittjP6AyBQhc&?l$I;qqlfNZ(eys8MC*mCAu*XN4jIFWAIeHA zm?Oz+IcP{+;z4JCKHF<6$I@|WY5o~2uxNQEOKXestyISe$%g$8O^)^AL zu;mMr$m$1cFxn!9MgdrI+mGNK9KcZe9WzGe?=WM2bPy2c2H$D}m@p`Ix(Qy+%V5fR zzAm86uk6nB_*sT5Z!DB~)Fi(N?VZ=Wa}t~2!L?15_|y_XfDmOLEt0_0B7h?^5wL8j zjA~nvIq(bR>p>h1aPG6UX}&BkLd#&hb?eBgT*)_dCRnVm!D%K(Ub)nVW|?j}9YwxC zzkuEwEr$E~ZEas3vS`viM)Zaf%OBtDvD;h_uFOQ(T39YBFli3*9YV$X(Y#4+6Tn8v|t%#jNr)YWM zz;ifp&!C}l_sjkygS?z@0A5jV4pS)ubl{0mxTO067O$(7HPBfAK*Zl;0t#~L+R!fm z5qaAs^;RBsE7AWg6mPEqv^=za>dWAMjBSQwu9kbEL%7oYp11AzLQDgbCEtOk2B1rI zQ)m=;=FvX8W>EfFmO6`Lda@a5<=Q3V73ko~wd}*BH8cls@L#bi0BYGqO(iBh5Ml;fuY51 z4WDm3zt9eL#iw__AfL8eJ}US|r?zWx&hc&IUe5#keEA&FqLt!WVdp_Q1B&-i_q~}! z>nUGGc5LYKjmN9TmLR)b0@yXYtC2zSL=;xrnDqQrCV2`C<lR3B-JP1F#C^B5}B3}KYZ25-a@hE$4baJBi^6A=seXGA{G zB@t7-uR}HMOq{Sl+a9gR8AUZt_BhhhJ!k6RS=nr`9&AplzdPzox=%~ZGrKokoFCQR ze0^}~48-;H{0m+UNpm@PRM$Q%>R^I8FVEh`Aak77bG_|J_+9_f=bWA&K3cvN`Ls1TW-q4WLUS6>)`k|Ra#aDJP!u6=Q^Zne2HMo$_GQfVl-*(S`zQEaUFQcv5=-!=L^iIK-zN&o^&OXJ?4f&FYRBc`eh+9CR~Y0x6OwAM zP#VrWX>&vHD!sm0#6=k0ORtQocWwgt6HTrK{IOCwa(OzdN-G;TzJYRmD0pcFKl>RG z+MEN0-JGltg&1XZ&2s7J59TSntPUVB;nKV7s21wX*>dhtblCQ}X(DY=WImnG(H zi&dwm$5bc*l8?59V^am8q)jc=&XR)*ubjno=q%gBOmItjYbEX7^Yl%QLz2kT_tTWS z-2#)uZ^;q7+_g}-sI)CHhgVHAQ+xUS_*bXsgX7^ln8v<^a;+}^h#N-nLgJQRN1|Rd za6d}=R1*vGg6_irljIxdj+Wy|RQB;Cw0#3m-qZ`DKiO6L8+6PMs;ZpY}{~BF95wqaY4h#fzO$Pp;p%DBag)4Q+C$P-=nN+naF49<24~D1B}v zCr*3Js~=;%b4W*mw{AGcR~_n`Uq&xG71t#_>fm$Pz|^4+Pn}bf(f*?YYI&emz#?Py z3PR6}@@AgG`M8>lH|#|!U-2{UaW6>F@+qtBD`>Py7YoF`nx(qKj$2yvj1@;+;;O$G z=ydOy&m0V6E!teLIOi;`?U2dNE6Y8!w|n7933PaL#6cmhs-;t;CdYY{s@fAX7IDaX4vcE zZW(1LaX%0tnBi=BIKV5+nUi@Y^%;&KC^1I?WbtzkZ*J<(N>k|vQpy?GKW!fSj;(bP z$%UJ*4x&U=TU=3j7{SxF%WoNgBl6tFG3lb4n2n>${ z&N(96>r+kZd+zzgxgds#wR&tdqj-f+-FRpmD1a+1(}+~*sJK=U@B=@fth?80v#a%J}Lz!GBxPI{N3#Y~F6 z@d4E>$ndcy@y~y!pdS!R#p%(JZ3A5bG$mYJd^E{ce|=mZg*0}QdV+9lxh2k`<84I# z1!~Mr+apmm5pQt%m}aQ99BC9^-fH@Om(uDT?z;UUeo;QDil)rfd$#GU=W_WJrJOh8 za`l#{F1RVW#RyPp(inB8mG9`@8xX$|A>mmE5n$wr z%)DO+QZc`wYtA5AzWueny7)ur1M{QcG~a8iRyeI zwRFq{eCNmS<@xanyknWj(P4VgJ+lLk1#KI4GXgs!xs~p44qV{mD65MjD4KZW&A!9+_GVQpFWk(vo_%)Vr?<@qMjQ* z=Y!<5_mUkn6Ec_euvz zRdmi-Tz6Y=C~?i7mSQy88G4iSrifMa3~RY`qQBU9_@pG%-NMn{!g@g#b`Wfty~A{7 zwEIZ#vCTyxI%^4kuJ`8e};{GGC8^x~_!at58cZFH~urB8u^nA9*JoNnIu#o^bFoT{zJbP@LT6BcMs zF2WBsC7p{RM`loeulY;DR;TJT0zkX2Yim|i2rvBY!B0=DQuJE*ih|BgDpLiph{dtD zna*2el?LDId|17GHRN3v?2XS>%Go;)Q^xqDn8Baqi-Q;{+gJ4Bq(DmlZdBgkr+#M8 zSFErjHW*2+of4jkj5|70kdgvf`*z1IGRO$tx|NR|s_Z-Ii~auvnsWk##s2T0dUCS= z09h(m9m^jAowx%QjLYf-P*!{rSLi3$s$b&2e7`WO9i;fvEsc9z=Ug#m0{klT`nIv_W3zf}0=myOw zU>V@t>a~wx$lN{+?yt$YW^=$XS^;P75h{lxwIAKDPR~0a>0sn!82o^50tV1(>4WWV z>9KzpJXLW3RGz8&v&Ia=0O7(4Iqe3 zw$d=YxCyO3^?G~43WvPR_m@bBFc5jHq(XsmJ-w7!%bvTr(!ltxk9+6wV@zq%6Zqyk zz%@P&j?Sc7j=T?T_1(T?2W4qU$*)$h3WB&_)&&VR_;kn)xVX=Mb8(}g#BL%E zx9h${7otbznD(gwHN8xK?Le65moQv93in#kjt?hw#)*!N7_AmGa)LInP-C!QY=FoG z7DCu+{vX9Ob59oSz5)F@Kk(;}Vn03WUqK`LN0;KV!$h`9^(-nY@VjYC&IyT7W_Goi zm0^9Zl#_5C|0UEkV4frXZr)Xc2^$fV^@?>`%}JB`pHoV|fmEipDt7tBKmsICXDItq zzwvLN8~b|)*``0-b2iYAKYU+P5xdy0MY6JyD8
cXqTEZKG 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 DT%mj} diff --git a/tips/TIP-0041/assets/deposit_miota_BasicOutput_(min_functionality).jpg b/tips/TIP-0041/assets/deposit_miota_BasicOutput_(min_functionality).jpg deleted file mode 100644 index 4c55672c9ed2254add27db23ea67336d297fc976..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53610 zcmeFZ2UJtrx+uJmUIdX|BLbozARQ?NVbesUgHl9Ax)5p731C4{h=PEE^xi>wjr1nH zgY@28fB;GOmwVrRHhBJX?!D){``#FDJQ!=RCRsD z82kl}M*#(Zgouckh>(Psn3$B5gp7jrECo3^1=D#NDq1#X2s;}yE9(U=0iFvNuX3`o zUY59W^_q~Vs3?Tzx~!zIjDU!!@Xs&7BPAuJAg5qFdzMj{gOx-0zx{Lk4WK5$L!GI_ z$GZrep~l0f#yhSDAOL_z2txZ4;Q#o+JA+R^NJLCRN=6PoP;?GBgNKiQh5(gMk8{Kd;x0k7W#hJ=0$ z3y=8pIWi$JDLExIEj{CFL19sGNoiSmZC!msV^ecWYfo=q|G?nT@W|Bk%DW{0`Cfy^)ZZdi<(JAh&pG*6FW&gE>`Tt8R``g0)TGt3bfsY4n z9zHby1@;dwC-{>6-4*v9k86?=1!$>{$BvtJ1TA6bFpGG7I_X$e#H4VdVC554YV0ci}w!1xx>#_cvZRuiRq} zc-|2|ec2^(n(Yy39A#bu>GQTAQ~O=K1Rml?3tX}Cyy|APTDFFYgF=S+tjz$+@vaEQ^+mBdaD3pLTP(ZdP7V)*ZQm;|>{Xe*9sEq~eo^*Y}tEc3dIK zvO;<{I9CRqRa0$IMsrC$*SPdqQXioaqvB^Z%Je}qZog%wnlHIWw5+i7{uLM7F*(*J z5^7`z51yF{h%z3|7gTy516&*R$UXA1W1w4Ijy9q;hM3yli#r818+`%3MLU63s>DAA z3lcd;w^ksb0&+yQQ~$SB@{=U3mgMo`AP7}bT~TDpNay_sP6c9 zvm>;ynZmuNZ>tDCH1lN;R^&}Qr>@8n>o?dt;(HzP>sMbs242{HgQBilL(sgYxQi8M zGZ&$};<<5{GCb$lZ?qReeaBt0-R{hXNiMOF%wM8rS zEY#N1J!QPX!R4|)%h~+O4UP_4yGPNq#jX$VT4?dYjscQEU-;tP9_Xen5~B#&400pJ zy$s?!1_;%TfqK2Ut?&qJkZW2yVIP&XWKm>?Nl3T4`Ub@>y^f3uwJs7d=^v8;cpUJ~tC z5n+3VlH>yFf3zADp%TdDmK6ASWUKj|URb~*l8e6A|9%-)R;D!YuMv9jq@42% z0*RDvV9oUAfiC^Gs}W>GK&T&@446kw(QGPX$)sR7(k2k8%9x8jBp}w6)j_OF{v_k< z1mEj|=-)8ZAaMsrfyC_qZm||f0*){ zIot{F9Ir4;=fS*OI|f!>#2%j4B$oc=ebCcTo7mCfwVZw*;#ZIjj1&P!)6F+%PTWg2 ziDQ6Z<`{ULcp7H9fo?h0h+k3glNwHf?NX>o%>ADO)L`tUQRCyCGeKq@=bri$*MiS! z=CFT#fzIrgmv-NWH?S2mUCWbklIt)rn z=JaGN!?(#Qj)5FOOc3Doyw->0+c6NR_9rd<9U`B{CI2gQ1NmhabBY6j+5dHftb*34 zVT5j}TK_?%H_fJ?gjoNH@0%%+opU+!xR$e_!DYkk&n)9JMl3P@+0d0hIENhT!v7+= z`Oo)67v_>Ja;I}tjNFO@$M6yVz$GQrgF`%|;@U5K@ps&OrNs2SGYN}%#gF?cZsY{Y zp~t|P1_O}3bL$Tg%my!$6lJ+89>pC^uHjt1*7c2LdMrNL65YFli^M7B{>o80k2jHi z7v;Czbkr2t?iKois;!9^xn~eu1VtYW*g2y+H;pdc^#P^GaC$dJ;%jt$WKMdT&3USW zrAv4?%iYA`n_fCcMGQr0I7aV7ie4|FN$WL=w^Kp9=GKo#mXb65CB8V)^df9ZeqpxZ zuBV^(gZ_&BZAif+9BtKg77MCz6uK4nI49puA92&m_r$!-H?JkaL?1*Mg zNHiCmgVh%gb+(GUi%s!fDbI1-$K6tTdkj3t+`zKfs#q#3(rV)UdEJh*%AO2ypH+zu zQmYKE(bJ^}QC$R5`(<@U&$6S(YkNn$V>G0=1ZCY$2Za?{tN^^xsi)e$My;d?sDTpL$cLvLwI zyc1@ekqkn75-NMcI_K8lN6{mmEJ{?GN`N@%h{!(}NA2l8@5uR)FBF#j65>yAVA6dktT0X4)izzNCJSwkatB#~%&7vv$E7^DS>E??#6@btWVA;jYI zOpsQxeU4m>*}6wxpYENk)GeP^?~@t5pi$R5>6PPKuMQe@t-DCpI5C7h*q0ao#`=Q5 z->Ig_tU1T9Q=`8S%TsrlRLsz0v{YVH-}3lo_%zG)^LJ-jXT!}YQ(;_`Qh}&eJ`siQ zIfZL#nz+6#E-CXNg{Zpe`6h4n=C!-SwimwV@@`m5vy4O=A_En99 zKhAgL>ks2k-*XxsJ(0i^k_i(%wJl2UmCVe{jHN`^>Gw_C>Jzlv<>Pa}D=4v62^YM^ zI3)0FR_c8d`Cw#gxAW)*q3YC8)Cx;QTBrg&1LUD!s?{Y**0Y%*x^u6TA(uNu?uRJ? zPSqrN<-Hie^W(K$#u^R|&Rs%Guhm4FX=h3)@b=ps%N^U|-SlDPHXhF^d5R+~O3Hg? zzGQ#1X6kz0ezo%YRR;QAqtWcy`4)SfCyi%@_20XUt3FaaKoIOiE-N1n98#^^ zi8~Yb9P83_1a7zPE&*gE2RecC_vQIXXMbK9A@Jt=6Sz`U&`{tuIyC}}{(R`f-!sVz z7_XsYV9@CpNEpxVSL;L{*DlV^YB*_v8QO6#w5Tmj= zm6EDy&3XH#wp7{t7Hx_@9|IRMH4dj^n++~{sZFn`n5l1e4tE^`Y%?aYKd_h;G zS^C|YJ;b>t^CxB|Z=S?nGj?bO7Pd0?=+Q|LGY8bWZ!y%cIoS90lo%Gb@1d<9E-ZJ{ zD9_uH?KiQr<~Muaxxxsi09s<}9S#Q`L(e)FzgJ7YZ))21qfG!0Q--zmXsbPBk9}^J zJjzG;uB9qqdRWx(ovR%V&trR-8~tSq{c14PJ}AzHp($m$!eEC9_t86XnkW^QF;J)W z4rNVZ0m@fo*t1FC8WE6yuqE8A@!F*_lh{(n6iOn{@?zc!(Pj+{A?ZimH@5|MnwAW* zs@dHfI|;K!rkb`iIAC25e8T#=Ri}An1!3w?jw~_m?A(>ydHtf^)hq+M}b>p-{%y=@CHJasL=-QR#-S(t&PMqMdExFVaJ#EeZ$~kGI<&p9F5%6j7tk6>>8@xt-cHL59Yjjebs|G zetM04MbqxacKfbGWY42o7QRnY%fZQS9Ntakqx;p_)+aYhUI#@-FWXYfR3uh?<_S@) zC(#T+ULo|#BTfdc7p}=41BQjjs?G2yx_ZZWiM-_}mlO$TTI-XWAWy%rzp5bHi887p z6hIBjNKdP^VecD#3ct&u74j@xc=ERS%TKTOQfBrItN|*8#Xh`Nb*IdGUW&bT5Iy(8 zl_R5cpXLWazbT1O{H9J3iXU+0kV z!GUeFGB5gq)}D3}t#;YLw*$WpVMbIOiPv@Sw3Mo>MZ=(_YFj#gH~SbdWw$x1?L0XK zjzoJoR%%@zPPeze6>Pe`c5aJ)RLdr>F6^RqPk`F|QFopu?UyfmyV=p?@=>=dkbQz1 zFV_=&S{81j(iYwz&yV8ddPdyUKk9p<9RjJ3{jP1iRLl@UDv*_(`c(W? zIQJvs6qWP{v8o=+c9@eB1V@v57T%=}-{_0QsEc_yP35&mtGh#YS~WEGZFP=_m5+fq zbp#GS6|G|+-y;FV+{*Ge20F_$Fl5xBZ2AbN47goh%mx!4PX~X0|XZGB+{vUi8h#xCXERbWazK^hE;- zkDeW{P6XSFv6zzD7`_V2WFcL(yHwUHAHqbYbXTy01fR1fVNfh;Hoxm?mi++vnBf$M zZAf4vH??SRjRs5JCnm;)RJ!=-Y~~}=E`h>KetB}biZ_!ns&==BgZk3R@N=kS-4FGy zR|=)ww+a{EH>`w?czD6lHos5z1BS zqf}6GST^RvZ`#*w7CRW={LC5&o|P zz&W;?la!Rw7DWhu^~TR>{Oc*(%OxdR_r)-pFR0b%C-@$nf0~*1RJFs1C(;xxAB3&W zb7}u=eB35{>B-Jbs`q(~QGq0bP7hu^8s?gv$!h>4Zddh-<}xTG*cc-BzDPV1bYbmL zV1==MDCZMw21b7KeK-4#U0pTXbeW-=x3Eie?ebVa$DCc4(C5-KH_@$;j0-g$IJLcgCL@EDc>gXqn>%Z*f%KNkI1Xfk}G=j zBB5B9L7M7@qMVJ6=Tphc6clvz-X7o#UQvsjhD$AXcHA?xo7>J<3O32_ zOf>{zzm3c_=31tEr=Z80>^!dHW;4xFQ^?%?*&_m`PJzTRnmf1u?XNT;X61K|A#vDF7;R)V33Loxui7af4X zjUEFN-O7L6>OYkwWMudE<%3%f!8_NGSS;<|?&vJ>yR`fkFP|y->-m2=l}=w>sd@Rm zWW{rnDRd`ouVyUsU_!X>)1E>?`qT+CZ9aS+6?}+ zeDwGur*1A2eb0bOg`7N@GRUk;u0j{~ zCUCgG$B`YM$<`yZ3U4m=Ud9!*f}z6cH8q_4eQx?zxPQA4`mr6ZNDNtLLTB1u6~2C` z(AN$cUwLpt*=VsXjdjz_+PyII&AJWv=G^E6#Ld3#!ZNuC)s&yw!WOGfQIKGL;?q&* z?DO+pDECiF$Q0!j6O)JlXFDjwyqDkXVRvPo(T>bOIB{HJOyG#bE_{|XEV(iSWjgP^ zznA*12zubvjY@)|`c3i=N>E_TNe{VTxb<=H!fx;t`P^j{EMM0j+=0ka^|~VX8$|yt zI?5+&_G;yo$+oNK!h1_`R~9B>>m;#!J|i>A1?u5nhrY#*y-q;%6khwCtqQ_aJEvX6 zf+Q8D^m(K2)DdIFf1)Kj)ka)vsW@%_Dc{vwB*MVW2J83N+~^E$;~(+%A`TwKHtW(0 z{zY{El;{2pcKvTp6}c+L!d3EM@adJEWJzJXnr9cY|0XPG$0Vr=ppflxQ!HaY48Kd0 z5Vj^wb$|tf1jvLuo^t<%X(hz0I%|b<=IZJLhoe!`TgxDloFWn-=S5AA2uTvO_e@VJMOP1*MMC1!= zuv_Cb)pKZfeglO8u^<_@M*}P8Ni6anhm)IAr;l=_y}oPDGQ{o|5En;*q_Qbkj(j0v zXv5B5is(>`{r*;csPf&LXO~?Vmx)-In#7jG>XvS>Y_SzrQRb#sfA;hs{*kBz+Q)<<&mRLr0zZ8) zF=xFF^bt;V;thP2;itrj^cA;<&Wu3!Lk|KA^m6{ZZ6C0&R3PjT`0&uq0q=Ifts#!D zZbx;+yov0V50jnj|A+yUX{=GPz`NL+a5yTQzy}z{HoOsGHW)h&j&g^pS2iF#p9i&! zBlZGUvA%KTX&B7;VsZ&|APbCObsjYm*& z$o1Ny?<sh>1C&R!@jRBM-4 zvU*|{rrXB%#auVGT#_&<4*yaale0toJ+yeIj_0#NsqejGybc78&7m?@aVW(PzQ+6H z<8jJy3h6_}*2loexd|gx^Fri^ww}-$+nq^=KsA0HjlS%&V=s5J`}4S%;y#;5uI%6k zZeul8aXwXZ?(iYVX2_6ts=Z8X1w&NKsO#$3==DwycpxUX5Iu1u4I6?Ntlk)##g2{J z9#lymFm@JS#_tuy8madux{Hp<_v~`onI|K4WR*Hu;TYxUD&jcsKX= zHs;W!aL&j%yYX7VH))4XM%-T)Z`+TYi3iT7h8VGWPe`y2Cs%|w&P?maip_>^-)l)| z-P7R2XA$~v`=#n+NR-sG&L>^OdM@cpd*V?0%Ie~h!f!XcdNP!s_s;XM_6_WxGZ}4i zuoHDsxbP!HsU|ESjnkj6)k}KTy_)>!PUmWDp-t?g9iMrxx;-yT#O{5I3Hz`CG;!OJ zK*gR3@&RtR^ypG&S;5>`NwG|)NGh8ZzWp&^(v5oi5~1DypJiE(98HD0|{@Z^9HOi<0zIU6r#k5-Z8-kV_>l) z(?xp+cjF0sr3}m^!t_6f(H5Meb>TwA5hmp4dKtx8A22Xy7f*;_S0R18QvUOtc102Bl_8(z*4c`mPTXIh4GmD%iBmGg`8#h^*U@I?6nfrX6#2B_Ln9>IaW@ z8bqF}l(2j+XgJlhS;GYDoAfCnowsSs?!1e@Y$f($fglr|e?TRqgE&B!)LHoJ2DSq-dt!>b6U z)-9tsVor zzw00Sj8h|DvIRl-Y?2jnkE|Np+Tx<_!RwyK05_*17>U)}#|0I|Q3jugc2PPtcntM& z_>=JX-ftZpV91Ny`V7=ul&pT(0uh=i@vwZwZwD)6S%{qP!JSpIW}cR`dnY8IWoCsb z=8jm8t|@Diz!zOJap9M!Crw|<8y+iKy<#yi$UsEI&lI9~dGszj(>4j~UQ#a|VktlEpm$WPu!E*g0c`bd4m%lu`6^4a%(+_E^fZ8SilG zauel`q|7`@Adcm0H>Sro)QidrrU$IFReVg496&BxX%j8pcVqOl)ur-slMB@WmY#cj zZ#N2o<*8Z`lH%>a1%h>Ae>utQSn8G7A?7Epd{6ATBd7VS%ytND?kka1e8ToGgg!@! zHJhN}CUz3Kn}vo}o@@$Qo-g|hq;nqURd#DG^Z-Uo7_0u*_U3XZa?Y)kGgx zZTF!}Ywt);#&?XtmDrYg|EWh8QLtaGM#i{}K11;pYtPj3tC_So=f_g(Cb>m-9Qx=8 z99A^l4t&w>)0!%sdnTPs$3Tj@o(w~x@sev~VP-Pi%sS#Mby2TZJ&fP?hS?OU-dNZq z&A!ukJUVDQvnOd0394mSAgM$t>{erg$|GT+(H>u^3V$#z0tMqDdXXuS z=7{hLyN3$FOqyqIyo%iuIR<1WwoNzV$VKaqI(KnlRKrx5efZHFyf(9jyhW^)DT=z8 z)+@8uCRW1(=uXJ=eh-F1T#tcj1I*t) zl&cj;c1YmAn{-CeD#kBvF4-kFB;RdHEp|2JFDD7Ub4Q19WlabB55Dh=LW=d?A$-qE zT)%tR?#kZdH~O-vX(L2Js^%%yhvxBxdHF>}#ay8j=Q1v7n0}21LFueE zbh;jZkCjm-oppr6%9KUuh#Q)?Th+5Ze1xGS$?ISs)d5 zwmLrPu1O8?;iq-}5Jf~uE6D{PS}uXXp1K9`z92@g%)W5;n0~X>0GuZhyN#TZBR79& zo-&eM^fI|ByL>zUCgX1qImv`GpuY?U{bh}>kb`y5M{PX@UP>H^f8XJ*bS!!H0iQ;W z{;RAa6MI4?+~O|0GYpA6r2Xp-&yurG>%%f{$)0%t=D-L3R+?974w zvd>G%U$?-$=3Uyy9)YRcucFQ~gbehbbFoka^tsoOlPeT&?5{EfY}PS?lr$69uXH}5 zHs^LKBj!$%#)sw0&AW69YcsOEOMzB6rqVuEhwagqrd>3L+U`CAec*(Nx8qc~F8Nm3ZXDroJ0DHL3xP3~n;G;dI2*UaCh;k%=dJ z{)qfJA2WPZwlp+=ovr9X3yi-PF&(3Wi8vE{OADP0SHwMB<87M?sxmz=HtKvm&Q>IC zRvNx^Xy<_LtLVpjtA;&9 zH=GkMU2~)SrkA_gMs=|L(}|Y%y*ld=xFC4PhwCpxrsxDd^$GU!jJ#C3F|WkH4ZTfy#UH@8A2 z6p)pl1!u}b3?kiO3G&<56j}V`RYuNaykx~xSAN1cZjD-X-LFn(j~plveIxo_^v9

D?-L>njrx_U? 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

PLlNnstgKP5EwdkSu2`~HCD!I`n7{@ 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 L|Kq>$f9?Mdm?{Kh diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index bff43b491..3c67aa4f7 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -1395,10 +1395,6 @@ The following table shows the Basic Output including the possible fields and the -![](assets/deposit_miota_BasicOutput_(min_functionality).jpg) - -![](assets/deposit_miota_BasicOutput_(max_functionality).jpg) - # Copyright Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From d45c281ca8137dd422fd91d61c5a36e29e76f055 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 23 May 2023 17:56:42 +0200 Subject: [PATCH 10/47] Make `Mana Amount` rule consistent --- tips/TIP-0041/tip-0041.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 3c67aa4f7..f78ace789 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -610,7 +610,7 @@ is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-00 - `Amount` field must fulfill the dust protection requirements and must not be `0`. - `Amount` field must be ≤ `Max IOTA Supply`. -- Mana Amount `mana_amount` field must be ≥ `0` and ≤ `TOTAL_MANA`. +- Mana Amount field must be ≤ `Total Mana`. - `Native Tokens Count` must not be greater than `Max Native Tokens Count`. - `Native Tokens` must be lexicographically sorted based on `Token ID`. - Each Native Token must be unique in the set of `Native Tokens` based on its `Token ID`. No duplicates are From 7ce764afae4712ad1143d3fda0af265a76ea7389 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 23 May 2023 18:25:37 +0200 Subject: [PATCH 11/47] Update v_byte min and max --- tips/TIP-0041/tip-0041.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index f78ace789..f6aedacd4 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -1385,11 +1385,11 @@ The following table shows the Basic Output including the possible fields and the v_byte Minimum - 426 + 434 v_byte Maximum - 13477 + 13485 From 227cb9e1e559bc1fe393fdd06bbc8162134fcf64 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Sat, 27 May 2023 13:57:46 +0200 Subject: [PATCH 12/47] Update Timelock and Expiration UC --- tips/TIP-0041/tip-0041.md | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index f6aedacd4..81361ca19 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -8,7 +8,8 @@ status: Draft type: Standards layer: Core created: 2023-05-03 -requires: TIP-19, TIP-20, TIP-21 and TIP-22 +requires: TIP-21, TIP-22, TIP-45 and TIP-47 +replaces: TIP-18 --- # Table of Contents @@ -45,11 +46,11 @@ Global protocol parameters used throughout this TIP are defined in [TIP-22 (IOTA ## Transaction Payload -[TIP-20](../TIP-0020/tip-0020.md) is the basis for output validation in this TIP. +[TIP-45](../TIP-0045/tip-0045.md) is the basis for output validation in this TIP. # Basic Output -Basic Output can hold native tokens and might have several unlock conditions and optional features. The +A Basic Output can hold native tokens and might have several unlock conditions and optional features. The combination of several features provide the base functionality for the output to be used as an on-ledger smart contract request: - Verified `Sender`, @@ -60,12 +61,6 @@ request: Besides, the Tag Feature is a tool to store arbitrary, indexed data with verified origin in the ledger. -Note, that a Basic Output in its simplest possible form with only an Address Unlock Condition and -without features or native tokens is functionally equivalent to a SigLockedSingleOutput: it has an address -and an IOTA balance. Therefore, -aforementioned output type, that was [introduced for Chrysalis Part 2 via TIP-7](../TIP-0007/tip-0007.md) -is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-0020/tip-0020.md). -
Basic Output @@ -326,7 +321,7 @@ is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-00
Timelock Unlock Condition
- Defines a unix timestamp until which the output can not be unlocked. + Defines a slot index until which the output can not be unlocked.
@@ -342,10 +337,10 @@ is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-00 - - + + +
Unix Timeuint32Slot Indexuint64 - Unix time (seconds since Unix epoch) starting from which the output can be consumed. + Slot index starting from which the output can be consumed.
@@ -353,8 +348,9 @@ is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-00

Expiration Unlock Condition
- Defines a unix time until which only Address, defined in Address Unlock Condition, is allowed to - unlock the output. After the unix time is reached or passed, only Return Address can unlock it. + Defines a slot index until which only Address, defined in Address Unlock Condition, + is allowed to unlock the output. After the slot index is reached/passed, only + Return Address can unlock it.
@@ -366,7 +362,7 @@ is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-00 @@ -441,10 +437,10 @@ is deprecated with the replacement of the [TIP-20 Transaction Payload](../TIP-00 - - + +
Unlock Condition Type uint8 - Set to value 3 to denote a Expiration Unlock Condition. + Set to value 3 to denote an Expiration Unlock Condition.
Unix Timeuint32Slot Indexuint64 - Before this unix time, Address Unlock Condition is allowed to unlock the output, after that only the address defined in Return Address. + Before this slot index, Address Unlock Condition is allowed to unlock the output, after that only the address defined in Return Address.
From baf121d27b4f4e94899b639b9a85c9964daf9a00 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Sat, 27 May 2023 14:30:53 +0200 Subject: [PATCH 13/47] Update storage deposit calculation --- tips/TIP-0041/tip-0041.md | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 81361ca19..57315de9e 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -338,7 +338,7 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with Slot Index - uint64+ + uint64 Slot index starting from which the output can be consumed. @@ -1016,7 +1016,7 @@ The following table shows the Basic Output including the possible fields and the
Timelock Unlock Condition
- Defines a unix timestamp until which the output can not be unlocked. + Defines a slot index until which the output can not be unlocked.
@@ -1036,12 +1036,12 @@ The following table shows the Basic Output including the possible fields and the - - - - + + + +
Unix Timedata44Slot Indexdata88 - Unix time (seconds since Unix epoch) starting from which the output can be consumed. + Slot index starting from which the output can be consumed.
@@ -1049,8 +1049,9 @@ The following table shows the Basic Output including the possible fields and the
Expiration Unlock Condition
- Defines a unix time until which only Address, defined in Address Unlock Condition, is allowed to - unlock the output. After the unix time is reached/passed, only Return Address can unlock it. + Defines a slot index until which only Address, defined in + Address Unlock Condition, is allowed to unlock the output. + After the slot index is reached/passed, only Return Address can unlock it.
@@ -1159,12 +1160,12 @@ The following table shows the Basic Output including the possible fields and the - - - - + + + +
Unix Timedata44Slot Indexdata88 - Before this unix time, Address Unlock Condition is allowed to unlock the output, after that only the address defined in Return Address. + Slot index starting from which the output can be consumed.
@@ -1381,11 +1382,11 @@ The following table shows the Basic Output including the possible fields and the v_byte Minimum - 434 + 442 v_byte Maximum - 13485 + 13493
From e01b4dd451a344ba67871eb3cc7e335bfe1eae8f Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 31 May 2023 09:54:58 +0200 Subject: [PATCH 14/47] Format markdown --- tips/TIP-0041/tip-0041.md | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 57315de9e..ca7542df0 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -23,7 +23,10 @@ replaces: TIP-18 # Summary -This document defines the Basic output type and transaction validation rules for the IOTA protocol to support storage of IOTA tokens, native tokens and Mana as well as layer 2 smart contract requests, among other functionality. It was originally introduced in [TIP-18](../TIP-0018/tip-0018.md) and the functionality defined in this document is a strict extension of the Basic output of TIP-18. +This document defines the Basic output type and transaction validation rules for the IOTA protocol to support storage of +IOTA tokens, native tokens and Mana as well as layer 2 smart contract requests, among other functionality. It was +originally introduced in [TIP-18](../TIP-0018/tip-0018.md) and the functionality defined in this document is a strict +extension of the Basic output of TIP-18. ## Summary of changes compared to TIP-18 @@ -32,7 +35,12 @@ This document defines the Basic output type and transaction validation rules for # Motivation -The aim of this TIP is to define a Basic output type for the support of basic ledger functionality. Such outputs can store IOTA tokens, native tokens and Mana. All unlock conditions and features defined in [TIP-38](../TIP-0038/tip-0038.md) are supported and can be composed to create spending restrictions, attach metadata or enable indexed data storage in the UTXO ledger. Layer 2 smart contract requests are enabled by posting requests through the Tangle. Such requests can be crafted by including commands in the metadata of Basic outputs. This output thus supports both the native tokenization on layer 1 as well as layer 1 smart contracts. +The aim of this TIP is to define a Basic output type for the support of basic ledger functionality. Such outputs can +store IOTA tokens, native tokens and Mana. All unlock conditions and features defined in +[TIP-38](../TIP-0038/tip-0038.md) are supported and can be composed to create spending restrictions, attach metadata or +enable indexed data storage in the UTXO ledger. Layer 2 smart contract requests are enabled by posting requests through +the Tangle. Such requests can be crafted by including commands in the metadata of Basic outputs. This output thus +supports both the native tokenization on layer 1 as well as layer 1 smart contracts. # Building Blocks @@ -42,7 +50,8 @@ Data types and subschemas used throughout this TIP are defined in [TIP-21](../TI ## Global Protocol Parameters -Global protocol parameters used throughout this TIP are defined in [TIP-22 (IOTA)](../TIP-0022/tip-0022.md) and [TIP-32 (Shimmer)](../TIP-0032/tip-0032.md). +Global protocol parameters used throughout this TIP are defined in [TIP-22 (IOTA)](../TIP-0022/tip-0022.md) and +[TIP-32 (Shimmer)](../TIP-0032/tip-0032.md). ## Transaction Payload @@ -53,6 +62,7 @@ Global protocol parameters used throughout this TIP are defined in [TIP-22 (IOTA A Basic Output can hold native tokens and might have several unlock conditions and optional features. The combination of several features provide the base functionality for the output to be used as an on-ledger smart contract request: + - Verified `Sender`, - Attached `Metadata` that can encode the request payload for layer 2, - `Return Amount` to get back the storage deposit, @@ -633,8 +643,8 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with ### Consumed Outputs -- The unlock of the input must correspond to `Address` field in the Address Unlock Condition and the - unlock must be valid. +- The unlock of the input must correspond to `Address` field in the Address Unlock Condition and the unlock must + be valid. - The unlock is valid if and only if all unlock conditions and features present in the output validate. ### Created Outputs From 2c0df18bb98a67e364900154ac0832619c286c70 Mon Sep 17 00:00:00 2001 From: Andrew Cullen <45826600+cyberphysic4l@users.noreply.github.com> Date: Wed, 7 Jun 2023 08:45:43 +0100 Subject: [PATCH 15/47] remove mana amount less than supply check --- tips/TIP-0041/tip-0041.md | 1 - 1 file changed, 1 deletion(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index ca7542df0..3df24eb3d 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -616,7 +616,6 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with - `Amount` field must fulfill the dust protection requirements and must not be `0`. - `Amount` field must be ≤ `Max IOTA Supply`. -- Mana Amount field must be ≤ `Total Mana`. - `Native Tokens Count` must not be greater than `Max Native Tokens Count`. - `Native Tokens` must be lexicographically sorted based on `Token ID`. - Each Native Token must be unique in the set of `Native Tokens` based on its `Token ID`. No duplicates are From 4971d4edabddca19af57b77f60807299af185868 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 4 Jul 2023 11:56:33 +0200 Subject: [PATCH 16/47] Rename `Mana Amount` -> `Mana` --- tips/TIP-0041/tip-0041.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 3df24eb3d..08d52f4b3 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -31,7 +31,7 @@ extension of the Basic output of TIP-18. ## Summary of changes compared to TIP-18 - Rename "Alias" to "Account". -- Add `Mana Amount` field. +- Add `Mana` field. # Motivation @@ -96,7 +96,7 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with The amount of IOTA coins held by the output. - Mana Amount + Mana uint64 The amount of (stored) Mana held by the output. @@ -732,7 +732,7 @@ The following table shows the Basic Output including the possible fields and the The amount of IOTA coins held by the output. - Mana Amount + Mana data 8 8 From cf498ce855ca36f8309438973b58694cfff54a55 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 15 Aug 2023 10:50:53 +0200 Subject: [PATCH 17/47] Update storage deposit calculation offset --- tips/TIP-0041/tip-0041.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 08d52f4b3..96db60bf8 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -683,23 +683,23 @@ The following table shows the Basic Output including the possible fields and the Block ID (included) data - 32 - 32 + 40 + 40 The ID of the block in which the transaction payload that created this output was included. - Confirmation Milestone Index + Slot Booked data - 4 - 4 - The index of the milestone which confirmed the transaction that created the output. + 8 + 8 + The index of the slot in which the transaction that created it was booked. - Confirmation Unix Timestamp + Slot Created data - 4 - 4 - The unix timestamp of the milestone which confirmed the transaction that created the output. + 8 + 8 + The index of the slot in which the transaction was created. @@ -1390,12 +1390,12 @@ The following table shows the Basic Output including the possible fields and the - v_byte Minimum - 442 + v_byte Minimum (TODO: Recalculate) + 0 - v_byte Maximum - 13493 + v_byte Maximum (TODO: Recalculate) + 0
From 65fe31fe8b51008b1003fac5bb12fac6e3aa3c20 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 4 Sep 2023 09:55:14 +0200 Subject: [PATCH 18/47] Apply suggestions from code review Co-authored-by: Thibault Martinez --- tips/TIP-0041/tip-0041.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 96db60bf8..c2af9c436 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -40,7 +40,7 @@ store IOTA tokens, native tokens and Mana. All unlock conditions and features de [TIP-38](../TIP-0038/tip-0038.md) are supported and can be composed to create spending restrictions, attach metadata or enable indexed data storage in the UTXO ledger. Layer 2 smart contract requests are enabled by posting requests through the Tangle. Such requests can be crafted by including commands in the metadata of Basic outputs. This output thus -supports both the native tokenization on layer 1 as well as layer 1 smart contracts. +supports both the native tokenization on layer 1 as well as layer 2 smart contracts. # Building Blocks @@ -1046,7 +1046,7 @@ The following table shows the Basic Output including the possible fields and the Slot Index - data + data 8 8 @@ -1170,7 +1170,7 @@ The following table shows the Basic Output including the possible fields and the Slot Index - data + data 8 8 From f8c66e032b8bb9001eb1743cb99974607439dad0 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 11 Sep 2023 08:55:40 +0200 Subject: [PATCH 19/47] Add v_byte min/max --- tips/TIP-0041/tip-0041.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index c2af9c436..0967c1e1b 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -1390,12 +1390,12 @@ The following table shows the Basic Output including the possible fields and the - v_byte Minimum (TODO: Recalculate) - 0 + v_byte Minimum + 450 - v_byte Maximum (TODO: Recalculate) - 0 + v_byte Maximum + 13509
From 29b1bb343c07e919a1401cb0c5c29bdc6cf4ad93 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 11 Sep 2023 09:01:19 +0200 Subject: [PATCH 20/47] Revert "Add v_byte min/max" This reverts commit f8c66e032b8bb9001eb1743cb99974607439dad0. --- tips/TIP-0041/tip-0041.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 0967c1e1b..c2af9c436 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -1390,12 +1390,12 @@ The following table shows the Basic Output including the possible fields and the - v_byte Minimum - 450 + v_byte Minimum (TODO: Recalculate) + 0 - v_byte Maximum - 13509 + v_byte Maximum (TODO: Recalculate) + 0 From 281ddc600e40de7181f1dcf77bd63170c35caaff Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 21 Sep 2023 10:32:43 +0200 Subject: [PATCH 21/47] Format schema tables (no content changes) --- tips/TIP-0041/tip-0041.md | 2996 +++++++++++++++++++++---------------- 1 file changed, 1721 insertions(+), 1275 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index c2af9c436..0847b7287 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -71,545 +71,603 @@ request: Besides, the Tag Feature is a tool to store arbitrary, indexed data with verified origin in the ledger. +
+ Basic Output +
Describes a basic output with optional features.
+
-
- Basic Output -
- Describes a basic output with optional features. -
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Output Typeuint8Set to value 3 to denote a Basic Output.
Amountuint64The amount of IOTA coins held by the output.
Manauint64The amount of (stored) Mana held by the output.
Native Tokens Countuint8The number of native tokens held by the output.
Native Tokens optAnyOf +
+ Native Token - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
NameTypeDescription
Output Typeuint8 - Set to value 3 to denote a Basic Output. -
Amountuint64The amount of IOTA coins held by the output.
Manauint64The amount of (stored) Mana held by the output.
Native Tokens Countuint8The number of native tokens held by the output.
Native Tokens optAnyOf -
- Native Token - - - - - - - - - - - - - - - - -
NameTypeDescription
Token IDByteArray[38] - Identifier of the native token. -
Amountuint256 - Amount of native tokens of the given Token ID. -
-
-
Unlock Conditions Countuint8The number of unlock conditions following.
Unlock Conditions atMostOneOfEach -
- Address Unlock Condition - - - - - - - - - - - - - - - -
NameTypeDescription
Unlock Condition Typeuint8 - Set to value 0 to denote an Address Unlock Condition. -
Address -
- Ed25519 Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 0 to denote an Ed25519 Address. -
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 8 to denote an Account Address. -
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 16 to denote an NFT Address. -
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
-
-
- Storage Deposit Return Unlock Condition -
- Defines the amount of IOTAs used as storage deposit that have to be returned to Return Address. -
- - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Unlock Condition Typeuint8 - Set to value 1 to denote a Storage Deposit Return Unlock Condition. -
Return Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 0 to denote an Ed25519 Address. -
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 8 to denote an Account Address. -
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 16 to denote an NFT Address. -
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
Return Amountuint64 - Amount of IOTA coins the consuming transaction should deposit to the address defined in Return Address. -
-
-
- Timelock Unlock Condition -
- Defines a slot index until which the output can not be unlocked. -
- - - - - - - - - - - - - - - - -
NameTypeDescription
Unlock Condition Typeuint8 - Set to value 2 to denote a Timelock Unlock Condition. -
Slot Indexuint64 - Slot index starting from which the output can be consumed. -
-
-
- Expiration Unlock Condition -
- Defines a slot index until which only Address, defined in Address Unlock Condition, - is allowed to unlock the output. After the slot index is reached/passed, only - Return Address can unlock it. -
- - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Unlock Condition Typeuint8 - Set to value 3 to denote an Expiration Unlock Condition. -
Return Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 0 to denote an Ed25519 Address. -
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 8 to denote an Account Address. -
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 16 to denote an NFT Address. -
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
Slot Indexuint64 - Before this slot index, Address Unlock Condition is allowed to unlock the output, after that only the address defined in Return Address. -
-
-
Features Countuint8The number of features following.
Features atMostOneOfEach -
- Sender Feature -
- Identifies the validated sender of the output. -
- - - - - - - - - - - - - - - -
NameTypeDescription
Feature Typeuint8 - Set to value 0 to denote a Sender Feature. -
Sender oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 0 to denote an Ed25519 Address. -
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 8 to denote an Account Address. -
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 16 to denote an NFT Address. -
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
-
-
- Metadata Feature -
- Defines metadata (arbitrary binary data) that will be stored in the output. -
- - - - - - - - - - - - - - - - -
NameTypeDescription
Feature Typeuint8 - Set to value 2 to denote a Metadata Feature. -
Data(uint16)ByteArrayBinary data. A leading uint16 denotes its length.
-
-
- Tag Feature -
- Defines an indexation tag to which the output can be indexed by additional node plugins. -
- - - - - - - - - - - - - - - - -
NameTypeDescription
Feature Typeuint8 - Set to value 3 to denote a Tag Feature. -
Tag(uint8)ByteArrayBinary indexation data. A leading uint8 denotes its length.
-
-
+ Name + + Type + + Description +
Token IDByteArray[38]Identifier of the native token.
Amountuint256Amount of native tokens of the given Token ID.
+
+
Unlock Conditions Countuint8The number of unlock conditions following.
Unlock Conditions atMostOneOfEach +
+ Address Unlock Condition + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Unlock Condition Typeuint8Set to value 0 to denote an Address Unlock Condition.
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+
+ Storage Deposit Return Unlock Condition +
Defines the amount of IOTAs used as storage deposit that have to be returned to Return Address.
+ + + + + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Unlock Condition Typeuint8Set to value 1 to denote a Storage Deposit Return Unlock Condition.
Return Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
Return Amountuint64Amount of IOTA coins the consuming transaction should deposit to the address defined in Return Address.
+
+
+ Timelock Unlock Condition +
Defines a slot index until which the output can not be unlocked.
+ + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Unlock Condition Typeuint8Set to value 2 to denote a Timelock Unlock Condition.
Slot Indexuint64Slot index starting from which the output can be consumed.
+
+
+ Expiration Unlock Condition +
Defines a slot index until which only Address, defined in Address Unlock Condition, is allowed to unlock the output. After the slot index is reached/passed, only Return Address can unlock it.
+ + + + + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Unlock Condition Typeuint8Set to value 3 to denote an Expiration Unlock Condition.
Return Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
Slot Indexuint64Before this slot index, Address Unlock Condition is allowed to unlock the output, after that only the address defined in Return Address.
+
+
Features Countuint8The number of features following.
Features atMostOneOfEach +
+ Sender Feature +
Identifies the validated sender of the output.
+ + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Feature Typeuint8Set to value 0 to denote a Sender Feature.
Sender oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+
+ Metadata Feature +
Defines metadata (arbitrary binary data) that will be stored in the output.
+ + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Feature Typeuint8Set to value 2 to denote a Metadata Feature.
Data(uint16)ByteArrayBinary data. A leading uint16 denotes its length.
-
+ +
+ Tag Feature +
Defines an indexation tag to which the output can be indexed by additional node plugins.
+ + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Feature Typeuint8Set to value 3 to denote a Tag Feature.
Tag(uint8)ByteArrayBinary indexation data. A leading uint8 denotes its length.
+
+
## Additional Transaction Syntactic Validation Rules @@ -655,750 +713,1138 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with The following table shows the Basic Output including the possible fields and their specific weight. +
+ Basic Output +
Describes a basic output with optional features.
+
-
- Basic Output -
- Describes a basic output with optional features. -
-
- - - + + + + + + + + + + + + + + + + + + +
Offset +
Offset + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
OutputID + key + 3434The ID of the output.
Block ID (included) + data + 4040The ID of the block in which the transaction payload that created this output was included.
Slot Booked + data + 88The index of the slot in which the transaction that created it was booked.
Slot Created + data + 88The index of the slot in which the transaction was created.
+
Fields + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Output Type + data + 11Set to value 3 to denote a Basic Output.
Amount + data + 88The amount of IOTA coins held by the output.
Mana + data + 88The amount of (stored) Mana held by the output.
Native Tokens Count + data + 11The number of native tokens held by the output.
Native Tokens optAnyOf +
+ Native Token + + + + - - - - + +
Fields - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + +
FieldField typeLength MinimumLength MaximumDescription
OutputIDkey3434The ID of the output.
Block ID (included)data4040The ID of the block in which the transaction payload that created this output was included.
Slot Bookeddata88The index of the slot in which the transaction that created it was booked.
Slot Createddata88The index of the slot in which the transaction was created.
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Token ID + data + 3838Identifier of the native token.
Amount + data + 3232Amount of native tokens of the given Token ID.
-
Fields +
+
+
Unlock Conditions Count + data + 11The number of unlock conditions following.
Unlock Conditions atMostOneOfEach +
+ Address Unlock Condition + + + + - - - - - - - - - -
Fields - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Output Typedata11 - Set to value 3 to denote an Basic Output. -
Amountdata88The amount of IOTA coins held by the output.
Manadata88The amount of (stored) Mana held by the output.
Native Tokens Countdata11The number of native tokens held by the output.
Native Tokens optAnyOf -
- Native Token - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Token IDdata3838 - Identifier of the native token. -
Amountdata3232 - Amount of native tokens of the given Token ID. -
-
-
Unlock Conditions Countdata11The number of unlock conditions following.
Unlock Conditions atMostOneOfEach -
- Address Unlock Condition - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Unlock Condition Typedata11 - Set to value 0 to denote an Address Unlock Condition. -
Address -
- Ed25519 Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 0 to denote an Ed25519 Address. -
PubKeyHashdata3232The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 8 to denote an Account Address. -
Account IDdata3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 16 to denote an NFT Address. -
NFT IDdata3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
-
-
- Storage Deposit Return Unlock Condition -
- Defines the amount of IOTAs used as storage deposit that have to be returned to Return Address. -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Unlock Condition Typedata11 - Set to value 1 to denote a Storage Deposit Return Unlock Condition. -
Return Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 0 to denote an Ed25519 Address. -
PubKeyHashdata3232The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 8 to denote an Account Address. -
Account IDdata3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 16 to denote an NFT Address. -
NFT IDdata3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
Return Amountdata88 - Amount of IOTA coins the consuming transaction should deposit to the address defined in Return Address. -
-
-
- Timelock Unlock Condition -
- Defines a slot index until which the output can not be unlocked. -
- - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Unlock Condition Typedata11 - Set to value 2 to denote a Timelock Unlock Condition. -
Slot Indexdata88 - Slot index starting from which the output can be consumed. -
-
-
- Expiration Unlock Condition -
- Defines a slot index until which only Address, defined in - Address Unlock Condition, is allowed to unlock the output. - After the slot index is reached/passed, only Return Address can unlock it. -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Unlock Condition Typedata11 - Set to value 3 to denote a Expiration Unlock Condition. -
Return Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 0 to denote an Ed25519 Address. -
PubKeyHashdata3232The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 8 to denote an Account Address. -
Account IDdata3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 16 to denote an NFT Address. -
NFT IDdata3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
Slot Indexdata88 - Slot index starting from which the output can be consumed. -
-
-
Features Countdata11The number of features following.
Features atMostOneOfEach -
- Sender Feature -
- Identifies the validated sender of the output. -
- - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Feature Typedata11 - Set to value 0 to denote a Sender Feature. -
Sender oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 0 to denote an Ed25519 Address. -
PubKeyHashdata3232The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 8 to denote an Account Address. -
Account IDdata3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 16 to denote an NFT Address. -
NFT IDdata3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
-
-
- Metadata Feature -
- Defines metadata (arbitrary binary data) that will be stored in the output. -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Feature Typedata11 - Set to value 2 to denote a Metadata Feature. -
Data Lengthdata22 - Length of the following data field in bytes. -
Datadata18192Binary data.
-
-
- Tag Feature -
- Defines an indexation tag to which the output can be indexed by additional node plugins. -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Feature Typedata11 - Set to value 3 to denote a Tag Feature. -
Tag Lengthdata11 - Length of the following tag field in bytes. -
Tagdata1255Binary indexation data.
-
-
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Unlock Condition Type + data + 11Set to value 0 to denote an Address Unlock Condition.
Address oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 0 to denote an Ed25519 Address.
PubKeyHash + data + 3232The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 8 to denote an Account Address.
Account ID + data + 3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 16 to denote an NFT Address.
NFT ID + data + 3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
-
v_byte Minimum (TODO: Recalculate)0
v_byte Maximum (TODO: Recalculate)0
-
+
+ +
+ Storage Deposit Return Unlock Condition +
Defines the amount of IOTAs used as storage deposit that have to be returned to Return Address.
+ + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Unlock Condition Type + data + 11Set to value 1 to denote a Storage Deposit Return Unlock Condition.
Return Address oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 0 to denote an Ed25519 Address.
PubKeyHash + data + 3232The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 8 to denote an Account Address.
Account ID + data + 3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 16 to denote an NFT Address.
NFT ID + data + 3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
Return Amount + data + 88Amount of IOTA coins the consuming transaction should deposit to the address defined in Return Address.
+
+
+
+ Timelock Unlock Condition +
Defines a slot index until which the output can not be unlocked.
+ + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Unlock Condition Type + data + 11Set to value 2 to denote a Timelock Unlock Condition.
Slot Index + data + 88Slot index starting from which the output can be consumed.
+
+
+
+ Expiration Unlock Condition +
Defines a slot index until which only Address, defined in Address Unlock Condition, is allowed to unlock the output. After the slot index is reached/passed, only Return Address can unlock it.
+ + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Unlock Condition Type + data + 11Set to value 3 to denote an Expiration Unlock Condition.
Return Address oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 0 to denote an Ed25519 Address.
PubKeyHash + data + 3232The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 8 to denote an Account Address.
Account ID + data + 3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 16 to denote an NFT Address.
NFT ID + data + 3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
Slot Index + data + 88Before this slot index, Address Unlock Condition is allowed to unlock the output, after that only the address defined in Return Address.
+
+
+
Features Count + data + 11The number of features following.
Features atMostOneOfEach +
+ Sender Feature +
Identifies the validated sender of the output.
+ + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Feature Type + data + 11Set to value 0 to denote a Sender Feature.
Sender oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 0 to denote an Ed25519 Address.
PubKeyHash + data + 3232The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 8 to denote an Account Address.
Account ID + data + 3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 16 to denote an NFT Address.
NFT ID + data + 3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+
+
+
+ Metadata Feature +
Defines metadata (arbitrary binary data) that will be stored in the output.
+ + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Feature Type + data + 11Set to value 2 to denote a Metadata Feature.
Data Length + data + 22Length of the following field.
Data + data + 38194Binary data. A leading uint16 denotes its length.
+
+
+
+ Tag Feature +
Defines an indexation tag to which the output can be indexed by additional node plugins.
+ + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Feature Type + data + 11Set to value 3 to denote a Tag Feature.
Tag Length + data + 11Length of the following field.
Tag + data + 2256Binary indexation data. A leading uint8 denotes its length.
+
+
+
+ + + + v_byte Minimum + TODO + + + v_byte Maximum + TODO + # Copyright From 13c4bbab0cff8b98994d496d807725efbd4c50fe Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 21 Sep 2023 16:48:54 +0200 Subject: [PATCH 22/47] Update with new address types --- tips/TIP-0041/tip-0041.md | 1127 ++++++++++++++++++++++++++++++++++++- 1 file changed, 1101 insertions(+), 26 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 0847b7287..66622f0a1 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -100,12 +100,12 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with Mana uint64 - The amount of (stored) Mana held by the output. + The amount of Stored Mana held by the output. Native Tokens Count uint8 - The number of native tokens held by the output. + The number of different native tokens held by the output. Native Tokens optAnyOf @@ -127,7 +127,7 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with Token ID ByteArray[38] - Identifier of the native token. + Identifier of the native token. Its derivation is defined in TIP-44. Amount @@ -148,6 +148,7 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with
Address Unlock Condition +
Defines the Address that owns this output. It can unlock the output with the proper Unlock in a transaction.
@@ -246,6 +247,402 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with
+
+ Multi Address + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf +
+ Address with Weight + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
Weightuint8The weight of the unlocked address.
+
+
+
+
+ Restricted Address + + + + + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 40 to denote a Restricted Address.
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ Multi Address + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf +
+ Address with Weight + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
Weightuint8The weight of the unlocked address.
+
+
+
+
Allowed Capabilities(uint8)ByteArrayBitflags expressed as a series of bytes. A leading uint8 denotes its length.
+
+
+ Implicit Account Creation Address +
Defines an address on which an Implicit Account is created when it receives a Basic Output.
+ + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 24 to denote an Implicit Account Creation Address.
PubKeyHashByteArray[32]The raw bytes of the Implicit Account Creation Address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
@@ -824,7 +1221,7 @@ The following table shows the Basic Output including the possible fields and the 8 8 - The amount of (stored) Mana held by the output. + The amount of Stored Mana held by the output. Native Tokens Count @@ -833,7 +1230,7 @@ The following table shows the Basic Output including the possible fields and the 1 1 - The number of native tokens held by the output. + The number of different native tokens held by the output. Native Tokens optAnyOf @@ -869,7 +1266,7 @@ The following table shows the Basic Output including the possible fields and the 38 38 - Identifier of the native token. + Identifier of the native token. Its derivation is defined in TIP-44. Amount @@ -901,6 +1298,7 @@ The following table shows the Basic Output including the possible fields and the
Address Unlock Condition +
Defines the Address that owns this output. It can unlock the output with the proper Unlock in a transaction.
@@ -1076,6 +1474,701 @@ The following table shows the Basic Output including the possible fields and the
Fields
+
+ Multi Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 32 to denote a Multi Address.
Addresses anyOf +
+ Address with Weight + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 0 to denote an Ed25519 Address.
PubKeyHash + data + 3232The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 8 to denote an Account Address.
Account ID + data + 3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 16 to denote an NFT Address.
NFT ID + data + 3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
Weight + data + 11The weight of the unlocked address.
+
+
+
+
+
+
+ Restricted Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 40 to denote a Restricted Address.
Address oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 0 to denote an Ed25519 Address.
PubKeyHash + data + 3232The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 8 to denote an Account Address.
Account ID + data + 3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 16 to denote an NFT Address.
NFT ID + data + 3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+ Multi Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 32 to denote a Multi Address.
Addresses anyOf +
+ Address with Weight + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 0 to denote an Ed25519 Address.
PubKeyHash + data + 3232The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 8 to denote an Account Address.
Account ID + data + 3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 16 to denote an NFT Address.
NFT ID + data + 3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
Weight + data + 11The weight of the unlocked address.
+
+
+
+
+
+
Allowed Capabilities + data + 12Bitflags expressed as a series of bytes. A leading uint8 denotes its length.
+
+
+
+ Implicit Account Creation Address +
Defines an address on which an Implicit Account is created when it receives a Basic Output.
+ + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 24 to denote an Implicit Account Creation Address.
PubKeyHash + data + 3232The raw bytes of the Implicit Account Creation Address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
@@ -1752,15 +2845,6 @@ The following table shows the Basic Output including the possible fields and the 1 Set to value 2 to denote a Metadata Feature. - - Data Length - - data - - 2 - 2 - Length of the following field. - Data @@ -1809,15 +2893,6 @@ The following table shows the Basic Output including the possible fields and the 1 Set to value 3 to denote a Tag Feature. - - Tag Length - - data - - 1 - 1 - Length of the following field. - Tag @@ -1839,11 +2914,11 @@ The following table shows the Basic Output including the possible fields and the v_byte Minimum - TODO + 450 v_byte Maximum - TODO + 13820 From c5de3ea79c49b618545eb77c51fbd777b54432fd Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 22 Sep 2023 13:20:35 +0200 Subject: [PATCH 23/47] Update with new address types (2) --- tips/TIP-0041/tip-0041.md | 926 ++++++++++++++++++++++++++++++++++---- 1 file changed, 832 insertions(+), 94 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 66622f0a1..9111bf70c 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -748,67 +748,8 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with - - - - Return Amount - uint64 - Amount of IOTA coins the consuming transaction should deposit to the address defined in Return Address. - - - -
- Timelock Unlock Condition -
Defines a slot index until which the output can not be unlocked.
- - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Unlock Condition Typeuint8Set to value 2 to denote a Timelock Unlock Condition.
Slot Indexuint64Slot index starting from which the output can be consumed.
-
-
- Expiration Unlock Condition -
Defines a slot index until which only Address, defined in Address Unlock Condition, is allowed to unlock the output. After the slot index is reached/passed, only Return Address can unlock it.
- - - - - - - - - - - - - - + + + + + + +
- Name - - Type - - Description -
Unlock Condition Typeuint8Set to value 3 to denote an Expiration Unlock Condition.
Return Address oneOf
- Ed25519 Address + Multi Address - - - - - - + -
@@ -824,43 +765,121 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with
Address Type uint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.Set to value 32 to denote a Multi Address.
-
-
- Account Address - - - - + - - - - - - - - - -
- Name - - Type - - Description + Addresses anyOf +
+ Address with Weight + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
Weightuint8The weight of the unlocked address.
+
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
- NFT Address + Restricted Address - + - - - + + + + + + + + +
@@ -876,12 +895,731 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with
Address Type uint8Set to value 16 to denote an NFT Address.Set to value 40 to denote a Restricted Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ Multi Address + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf +
+ Address with Weight + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
Weightuint8The weight of the unlocked address.
+
+
+
+
Allowed Capabilities(uint8)ByteArrayBitflags expressed as a series of bytes. A leading uint8 denotes its length.
+
+
Return Amountuint64Amount of IOTA coins the consuming transaction should deposit to the address defined in Return Address.
+
+
+ Timelock Unlock Condition +
Defines a slot index until which the output can not be unlocked.
+ + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Unlock Condition Typeuint8Set to value 2 to denote a Timelock Unlock Condition.
Slot Indexuint64Slot index starting from which the output can be consumed.
+
+
+ Expiration Unlock Condition +
Defines a slot index until which only Address, defined in Address Unlock Condition, is allowed to unlock the output. After the slot index is reached/passed, only Return Address can unlock it.
+ + + + + + + + + + + + + +
+ Name + + Type + + Description +
Unlock Condition Typeuint8Set to value 3 to denote an Expiration Unlock Condition.
Return Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ Multi Address + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf +
+ Address with Weight + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
Weightuint8The weight of the unlocked address.
+
+
+
+
+ Restricted Address + + + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 40 to denote a Restricted Address.
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ Multi Address + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf +
+ Address with Weight + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
Weightuint8The weight of the unlocked address.
+
+
+
+
Allowed Capabilities(uint8)ByteArrayBitflags expressed as a series of bytes. A leading uint8 denotes its length.
From 2e275f695ef12911396c46345c1079876e5a4d86 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 22 Sep 2023 13:21:24 +0200 Subject: [PATCH 24/47] Update storage deposit with new addr types --- tips/TIP-0041/tip-0041.md | 1704 ++++++++++++++++++++++++++++++++----- 1 file changed, 1499 insertions(+), 205 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 9111bf70c..b05ca6c6a 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -3092,203 +3092,8 @@ The following table shows the Basic Output including the possible fields and the
- - - - Return Amount - - data - - 8 - 8 - Amount of IOTA coins the consuming transaction should deposit to the address defined in Return Address. - - - - - - -
- Timelock Unlock Condition -
Defines a slot index until which the output can not be unlocked.
- - - - - -
Fields - - - - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum - - Description -
Unlock Condition Type - data - 11Set to value 2 to denote a Timelock Unlock Condition.
Slot Index - data - 88Slot index starting from which the output can be consumed.
-
-
-
- Expiration Unlock Condition -
Defines a slot index until which only Address, defined in Address Unlock Condition, is allowed to unlock the output. After the slot index is reached/passed, only Return Address can unlock it.
- - - - + + + + + + + + +
Fields - - - - - - - - - - - - - - - - - - + +
- Field - - Field type - - Length Minimum - - Length Maximum - - Description -
Unlock Condition Type - data - 11Set to value 3 to denote an Expiration Unlock Condition.
Return Address oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum - - Description -
Address Type - data - 11Set to value 0 to denote an Ed25519 Address.
PubKeyHash - data - 3232The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum - - Description -
Address Type - data - 11Set to value 8 to denote an Account Address.
Account ID - data - 3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address + Multi Address @@ -3318,16 +3123,1505 @@ The following table shows the Basic Output including the possible fields and the - + - - - - - + + + +
Fields 1 1Set to value 16 to denote an NFT Address.Set to value 32 to denote a Multi Address.
NFT ID - data - 3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.Addresses anyOf +
+ Address with Weight + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 0 to denote an Ed25519 Address.
PubKeyHash + data + 3232The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 8 to denote an Account Address.
Account ID + data + 3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 16 to denote an NFT Address.
NFT ID + data + 3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
Weight + data + 11The weight of the unlocked address.
+
+
+
+
+ +
+ Restricted Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 40 to denote a Restricted Address.
Address oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 0 to denote an Ed25519 Address.
PubKeyHash + data + 3232The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 8 to denote an Account Address.
Account ID + data + 3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 16 to denote an NFT Address.
NFT ID + data + 3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+ Multi Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 32 to denote a Multi Address.
Addresses anyOf +
+ Address with Weight + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 0 to denote an Ed25519 Address.
PubKeyHash + data + 3232The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 8 to denote an Account Address.
Account ID + data + 3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 16 to denote an NFT Address.
NFT ID + data + 3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
Weight + data + 11The weight of the unlocked address.
+
+
+
+
+
+
Allowed Capabilities + data + 12Bitflags expressed as a series of bytes. A leading uint8 denotes its length.
+
+
+
Return Amount + data + 88Amount of IOTA coins the consuming transaction should deposit to the address defined in Return Address.
+ + + +
+
+ Timelock Unlock Condition +
Defines a slot index until which the output can not be unlocked.
+ + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Unlock Condition Type + data + 11Set to value 2 to denote a Timelock Unlock Condition.
Slot Index + data + 88Slot index starting from which the output can be consumed.
+
+
+
+ Expiration Unlock Condition +
Defines a slot index until which only Address, defined in Address Unlock Condition, is allowed to unlock the output. After the slot index is reached/passed, only Return Address can unlock it.
+ + + + + + + + + + + + -
Fields + + + + + + + + + + + + + + + + + + + + + + + + + + -
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Unlock Condition Type + data + 11Set to value 3 to denote an Expiration Unlock Condition.
Return Address oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 0 to denote an Ed25519 Address.
PubKeyHash + data + 3232The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 8 to denote an Account Address.
Account ID + data + 3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 16 to denote an NFT Address.
NFT ID + data + 3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+ Multi Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 32 to denote a Multi Address.
Addresses anyOf +
+ Address with Weight + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 0 to denote an Ed25519 Address.
PubKeyHash + data + 3232The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 8 to denote an Account Address.
Account ID + data + 3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 16 to denote an NFT Address.
NFT ID + data + 3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
Weight + data + 11The weight of the unlocked address.
+
+
+
+
+
+
+ Restricted Address + + + + @@ -3656,7 +4950,7 @@ The following table shows the Basic Output including the possible fields and the - +
Fields + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 40 to denote a Restricted Address.
Address oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 0 to denote an Ed25519 Address.
PubKeyHash + data + 3232The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 8 to denote an Account Address.
Account ID + data + 3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 16 to denote an NFT Address.
NFT ID + data + 3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+ Multi Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 32 to denote a Multi Address.
Addresses anyOf +
+ Address with Weight + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 0 to denote an Ed25519 Address.
PubKeyHash + data + 3232The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 8 to denote an Account Address.
Account ID + data + 3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 16 to denote an NFT Address.
NFT ID + data + 3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
Weight + data + 11The weight of the unlocked address.
+
+
+
+
+
+
Allowed Capabilities + data + 12Bitflags expressed as a series of bytes. A leading uint8 denotes its length.
v_byte Maximum1382014442
From dab87f4ee6ea8800c108cf6d8c8bc0f21143406d Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 22 Sep 2023 13:30:50 +0200 Subject: [PATCH 25/47] Add length prefix of variable size byte arrays --- tips/TIP-0041/tip-0041.md | 59 ++++++++++++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 7 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index b05ca6c6a..a8dc71826 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -2845,13 +2845,22 @@ The following table shows the Basic Output including the possible fields and the
Allowed Capabilities Length + data + 11Length of the following field.
Allowed Capabilities data 0 12 Bitflags expressed as a series of bytes. A leading uint8 denotes its length.
@@ -3725,13 +3734,22 @@ The following table shows the Basic Output including the possible fields and the
Allowed Capabilities Length + data + 11Length of the following field.
Allowed Capabilities data 0 12 Bitflags expressed as a series of bytes. A leading uint8 denotes its length.
@@ -4614,13 +4632,22 @@ The following table shows the Basic Output including the possible fields and the
+ + Allowed Capabilities Length + + data + + 1 + 1 + Length of the following field. + Allowed Capabilities data + 0 1 - 2 Bitflags expressed as a series of bytes. A leading uint8 denotes its length. @@ -4877,13 +4904,22 @@ The following table shows the Basic Output including the possible fields and the 1 Set to value 2 to denote a Metadata Feature. + + Data Length + + data + + 2 + 2 + Length of the following field. + Data data - 3 - 8194 + 1 + 8192 Binary data. A leading uint16 denotes its length. @@ -4925,13 +4961,22 @@ The following table shows the Basic Output including the possible fields and the 1 Set to value 3 to denote a Tag Feature. + + Tag Length + + data + + 1 + 1 + Length of the following field. + Tag data - 2 - 256 + 1 + 255 Binary indexation data. A leading uint8 denotes its length. From a70545de5126f920b6d79c3759b84b80fea5d5c8 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 22 Sep 2023 13:31:22 +0200 Subject: [PATCH 26/47] Don't duplicate description in storage deposit --- tips/TIP-0041/tip-0041.md | 322 -------------------------------------- 1 file changed, 322 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index a8dc71826..40bb1ab4f 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -1870,9 +1870,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - OutputID @@ -1881,7 +1878,6 @@ The following table shows the Basic Output including the possible fields and the 34 34 - The ID of the output. Block ID (included) @@ -1890,7 +1886,6 @@ The following table shows the Basic Output including the possible fields and the 40 40 - The ID of the block in which the transaction payload that created this output was included. Slot Booked @@ -1899,7 +1894,6 @@ The following table shows the Basic Output including the possible fields and the 8 8 - The index of the slot in which the transaction that created it was booked. Slot Created @@ -1908,7 +1902,6 @@ The following table shows the Basic Output including the possible fields and the 8 8 - The index of the slot in which the transaction was created. @@ -1930,9 +1923,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Output Type @@ -1941,7 +1931,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 3 to denote a Basic Output. Amount @@ -1950,7 +1939,6 @@ The following table shows the Basic Output including the possible fields and the 8 8 - The amount of IOTA coins held by the output. Mana @@ -1959,7 +1947,6 @@ The following table shows the Basic Output including the possible fields and the 8 8 - The amount of Stored Mana held by the output. Native Tokens Count @@ -1968,7 +1955,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - The number of different native tokens held by the output. Native Tokens optAnyOf @@ -1993,9 +1979,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Token ID @@ -2004,7 +1987,6 @@ The following table shows the Basic Output including the possible fields and the 38 38 - Identifier of the native token. Its derivation is defined in TIP-44. Amount @@ -2013,7 +1995,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - Amount of native tokens of the given Token ID. @@ -2029,7 +2010,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - The number of unlock conditions following. Unlock Conditions atMostOneOfEach @@ -2055,9 +2035,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Unlock Condition Type @@ -2066,7 +2043,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 0 to denote an Address Unlock Condition. Address oneOf @@ -2091,9 +2067,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -2102,7 +2075,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 0 to denote an Ed25519 Address. PubKeyHash @@ -2111,7 +2083,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key. @@ -2138,9 +2109,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -2149,7 +2117,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 8 to denote an Account Address. Account ID @@ -2158,7 +2125,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -2185,9 +2151,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -2196,7 +2159,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 16 to denote an NFT Address. NFT ID @@ -2205,7 +2167,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -2232,9 +2193,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -2243,7 +2201,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 32 to denote a Multi Address. Addresses anyOf @@ -2268,9 +2225,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address oneOf @@ -2295,9 +2249,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -2306,7 +2257,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 0 to denote an Ed25519 Address. PubKeyHash @@ -2315,7 +2265,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key. @@ -2342,9 +2291,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -2353,7 +2299,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 8 to denote an Account Address. Account ID @@ -2362,7 +2307,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -2389,9 +2333,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -2400,7 +2341,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 16 to denote an NFT Address. NFT ID @@ -2409,7 +2349,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -2425,7 +2364,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - The weight of the unlocked address. @@ -2459,9 +2397,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -2470,7 +2405,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 40 to denote a Restricted Address. Address oneOf @@ -2495,9 +2429,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -2506,7 +2437,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 0 to denote an Ed25519 Address. PubKeyHash @@ -2515,7 +2445,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key. @@ -2542,9 +2471,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -2553,7 +2479,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 8 to denote an Account Address. Account ID @@ -2562,7 +2487,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -2589,9 +2513,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -2600,7 +2521,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 16 to denote an NFT Address. NFT ID @@ -2609,7 +2529,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -2636,9 +2555,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -2647,7 +2563,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 32 to denote a Multi Address. Addresses anyOf @@ -2672,9 +2587,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address oneOf @@ -2699,9 +2611,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -2710,7 +2619,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 0 to denote an Ed25519 Address. PubKeyHash @@ -2719,7 +2627,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key. @@ -2746,9 +2653,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -2757,7 +2661,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 8 to denote an Account Address. Account ID @@ -2766,7 +2669,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -2793,9 +2695,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -2804,7 +2703,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 16 to denote an NFT Address. NFT ID @@ -2813,7 +2711,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -2829,7 +2726,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - The weight of the unlocked address. @@ -2852,7 +2748,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Length of the following field. Allowed Capabilities @@ -2861,7 +2756,6 @@ The following table shows the Basic Output including the possible fields and the 0 1 - Bitflags expressed as a series of bytes. A leading uint8 denotes its length. @@ -2889,9 +2783,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -2900,7 +2791,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 24 to denote an Implicit Account Creation Address. PubKeyHash @@ -2909,7 +2799,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Implicit Account Creation Address which is the BLAKE2b-256 hash of the Ed25519 public key. @@ -2944,9 +2833,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Unlock Condition Type @@ -2955,7 +2841,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 1 to denote a Storage Deposit Return Unlock Condition. Return Address oneOf @@ -2980,9 +2865,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -2991,7 +2873,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 0 to denote an Ed25519 Address. PubKeyHash @@ -3000,7 +2881,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key. @@ -3027,9 +2907,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -3038,7 +2915,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 8 to denote an Account Address. Account ID @@ -3047,7 +2923,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -3074,9 +2949,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -3085,7 +2957,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 16 to denote an NFT Address. NFT ID @@ -3094,7 +2965,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -3121,9 +2991,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -3132,7 +2999,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 32 to denote a Multi Address. Addresses anyOf @@ -3157,9 +3023,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address oneOf @@ -3184,9 +3047,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -3195,7 +3055,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 0 to denote an Ed25519 Address. PubKeyHash @@ -3204,7 +3063,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key. @@ -3231,9 +3089,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -3242,7 +3097,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 8 to denote an Account Address. Account ID @@ -3251,7 +3105,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -3278,9 +3131,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -3289,7 +3139,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 16 to denote an NFT Address. NFT ID @@ -3298,7 +3147,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -3314,7 +3162,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - The weight of the unlocked address. @@ -3348,9 +3195,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -3359,7 +3203,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 40 to denote a Restricted Address. Address oneOf @@ -3384,9 +3227,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -3395,7 +3235,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 0 to denote an Ed25519 Address. PubKeyHash @@ -3404,7 +3243,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key. @@ -3431,9 +3269,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -3442,7 +3277,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 8 to denote an Account Address. Account ID @@ -3451,7 +3285,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -3478,9 +3311,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -3489,7 +3319,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 16 to denote an NFT Address. NFT ID @@ -3498,7 +3327,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -3525,9 +3353,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -3536,7 +3361,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 32 to denote a Multi Address. Addresses anyOf @@ -3561,9 +3385,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address oneOf @@ -3588,9 +3409,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -3599,7 +3417,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 0 to denote an Ed25519 Address. PubKeyHash @@ -3608,7 +3425,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key. @@ -3635,9 +3451,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -3646,7 +3459,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 8 to denote an Account Address. Account ID @@ -3655,7 +3467,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -3682,9 +3493,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -3693,7 +3501,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 16 to denote an NFT Address. NFT ID @@ -3702,7 +3509,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -3718,7 +3524,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - The weight of the unlocked address. @@ -3741,7 +3546,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Length of the following field. Allowed Capabilities @@ -3750,7 +3554,6 @@ The following table shows the Basic Output including the possible fields and the 0 1 - Bitflags expressed as a series of bytes. A leading uint8 denotes its length. @@ -3766,7 +3569,6 @@ The following table shows the Basic Output including the possible fields and the 8 8 - Amount of IOTA coins the consuming transaction should deposit to the address defined in Return Address. @@ -3794,9 +3596,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Unlock Condition Type @@ -3805,7 +3604,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 2 to denote a Timelock Unlock Condition. Slot Index @@ -3814,7 +3612,6 @@ The following table shows the Basic Output including the possible fields and the 8 8 - Slot index starting from which the output can be consumed. @@ -3842,9 +3639,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Unlock Condition Type @@ -3853,7 +3647,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 3 to denote an Expiration Unlock Condition. Return Address oneOf @@ -3878,9 +3671,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -3889,7 +3679,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 0 to denote an Ed25519 Address. PubKeyHash @@ -3898,7 +3687,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key. @@ -3925,9 +3713,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -3936,7 +3721,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 8 to denote an Account Address. Account ID @@ -3945,7 +3729,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -3972,9 +3755,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -3983,7 +3763,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 16 to denote an NFT Address. NFT ID @@ -3992,7 +3771,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -4019,9 +3797,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -4030,7 +3805,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 32 to denote a Multi Address. Addresses anyOf @@ -4055,9 +3829,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address oneOf @@ -4082,9 +3853,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -4093,7 +3861,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 0 to denote an Ed25519 Address. PubKeyHash @@ -4102,7 +3869,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key. @@ -4129,9 +3895,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -4140,7 +3903,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 8 to denote an Account Address. Account ID @@ -4149,7 +3911,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -4176,9 +3937,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -4187,7 +3945,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 16 to denote an NFT Address. NFT ID @@ -4196,7 +3953,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -4212,7 +3968,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - The weight of the unlocked address. @@ -4246,9 +4001,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -4257,7 +4009,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 40 to denote a Restricted Address. Address oneOf @@ -4282,9 +4033,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -4293,7 +4041,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 0 to denote an Ed25519 Address. PubKeyHash @@ -4302,7 +4049,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key. @@ -4329,9 +4075,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -4340,7 +4083,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 8 to denote an Account Address. Account ID @@ -4349,7 +4091,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -4376,9 +4117,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -4387,7 +4125,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 16 to denote an NFT Address. NFT ID @@ -4396,7 +4133,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -4423,9 +4159,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -4434,7 +4167,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 32 to denote a Multi Address. Addresses anyOf @@ -4459,9 +4191,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address oneOf @@ -4486,9 +4215,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -4497,7 +4223,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 0 to denote an Ed25519 Address. PubKeyHash @@ -4506,7 +4231,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key. @@ -4533,9 +4257,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -4544,7 +4265,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 8 to denote an Account Address. Account ID @@ -4553,7 +4273,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -4580,9 +4299,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -4591,7 +4307,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 16 to denote an NFT Address. NFT ID @@ -4600,7 +4315,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -4616,7 +4330,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - The weight of the unlocked address. @@ -4639,7 +4352,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Length of the following field. Allowed Capabilities @@ -4648,7 +4360,6 @@ The following table shows the Basic Output including the possible fields and the 0 1 - Bitflags expressed as a series of bytes. A leading uint8 denotes its length. @@ -4664,7 +4375,6 @@ The following table shows the Basic Output including the possible fields and the 8 8 - Before this slot index, Address Unlock Condition is allowed to unlock the output, after that only the address defined in Return Address. @@ -4680,7 +4390,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - The number of features following. Features atMostOneOfEach @@ -4706,9 +4415,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Feature Type @@ -4717,7 +4423,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 0 to denote a Sender Feature. Sender oneOf @@ -4742,9 +4447,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -4753,7 +4455,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 0 to denote an Ed25519 Address. PubKeyHash @@ -4762,7 +4463,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key. @@ -4789,9 +4489,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -4800,7 +4497,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 8 to denote an Account Address. Account ID @@ -4809,7 +4505,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -4836,9 +4531,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Address Type @@ -4847,7 +4539,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 16 to denote an NFT Address. NFT ID @@ -4856,7 +4547,6 @@ The following table shows the Basic Output including the possible fields and the 32 32 - The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -4891,9 +4581,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Feature Type @@ -4902,7 +4589,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 2 to denote a Metadata Feature. Data Length @@ -4911,7 +4597,6 @@ The following table shows the Basic Output including the possible fields and the 2 2 - Length of the following field. Data @@ -4920,7 +4605,6 @@ The following table shows the Basic Output including the possible fields and the 1 8192 - Binary data. A leading uint16 denotes its length. @@ -4948,9 +4632,6 @@ The following table shows the Basic Output including the possible fields and the Length Maximum - - Description - Feature Type @@ -4959,7 +4640,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Set to value 3 to denote a Tag Feature. Tag Length @@ -4968,7 +4648,6 @@ The following table shows the Basic Output including the possible fields and the 1 1 - Length of the following field. Tag @@ -4977,7 +4656,6 @@ The following table shows the Basic Output including the possible fields and the 1 255 - Binary indexation data. A leading uint8 denotes its length. From 11f4390999d3a9d7b93db0199e288b3f846f1edd Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 29 Sep 2023 17:29:56 +0200 Subject: [PATCH 27/47] Use protocol parameter Token Supply in amount rule --- tips/TIP-0041/tip-0041.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 40bb1ab4f..66d85ebcd 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -1807,8 +1807,8 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with ## Additional Transaction Syntactic Validation Rules -- `Amount` field must fulfill the dust protection requirements and must not be `0`. -- `Amount` field must be ≤ `Max IOTA Supply`. +- `Amount` field must fulfill the [storage deposit requirements](../TIP-0047/tip-0047.md) and must not be `0`. +- `Amount` field must be ≤ `Token Supply`. - `Native Tokens Count` must not be greater than `Max Native Tokens Count`. - `Native Tokens` must be lexicographically sorted based on `Token ID`. - Each Native Token must be unique in the set of `Native Tokens` based on its `Token ID`. No duplicates are From a2ce02740312e54e35316b2e8029c6549f8fbb42 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 4 Oct 2023 15:28:09 +0200 Subject: [PATCH 28/47] Remove Native Tokens Field & add NT Feature --- tips/TIP-0041/tip-0041.md | 1498 ++----------------------------------- 1 file changed, 66 insertions(+), 1432 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 66d85ebcd..f9dc3d3eb 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -102,42 +102,6 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with uint64 The amount of Stored Mana held by the output. - - Native Tokens Count - uint8 - The number of different native tokens held by the output. - - - Native Tokens optAnyOf - -
- Native Token - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Token IDByteArray[38]Identifier of the native token. Its derivation is defined in TIP-44.
Amountuint256Amount of native tokens of the given Token ID.
-
- - Unlock Conditions Count uint8 @@ -148,7 +112,7 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with
Address Unlock Condition -
Defines the Address that owns this output. It can unlock the output with the proper Unlock in a transaction.
+
Defines the Address that owns this output. It can unlock the output with the proper Unlock in a transaction. Defined in TIP-38 (Address Unlock Condition).
@@ -649,7 +163,7 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with
Storage Deposit Return Unlock Condition -
Defines the amount of IOTAs used as storage deposit that have to be returned to Return Address.
+
Defines the amount of IOTAs used as storage deposit that have to be returned to Return Address. Defined in TIP-38 (Storage Deposit Return Unlock Condition).
@@ -171,477 +135,27 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with
Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
An Address derived from an Ed25519 Public Key. Defined in TIP-38 (Ed25519 Address).
Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
An Address derived from an Account ID which can be unlocked by unlocking the corresponding Account. Defined in TIP-38 (Account Address).
NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
An Address derived from an NFT ID which can be unlocked by unlocking the corresponding NFT. Defined in TIP-38 (NFT Address).
Multi Address - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf -
- Address with Weight - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
Weightuint8The weight of the unlocked address.
-
-
+
Defines a Multi Address that consists of addresses with weights and a threshold value. The Multi Address can be unlocked if the cumulative weight of all unlocked addresses is equal to or exceeds the threshold. Defined in TIP-52 (Multi Address).
Restricted Address - - - - - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 40 to denote a Restricted Address.
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- Multi Address - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf -
- Address with Weight - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
Weightuint8The weight of the unlocked address.
-
-
-
-
Allowed Capabilities(uint8)ByteArrayBitflags expressed as a series of bytes. A leading uint8 denotes its length.
+
An address that contains another address and allows for configuring its capabilities. Defined in TIP-50 (Restricted Address).
Implicit Account Creation Address -
Defines an address on which an Implicit Account is created when it receives a Basic Output.
- - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 24 to denote an Implicit Account Creation Address.
PubKeyHashByteArray[32]The raw bytes of the Implicit Account Creation Address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
Defines an address on which an Implicit Account is created when it receives a Basic Output. Defined in TIP-42 (Implicit Account Creation Address).
@@ -1128,7 +215,7 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with
Timelock Unlock Condition -
Defines a slot index until which the output can not be unlocked.
+
Defines a slot index until which the output can not be unlocked. Defined in TIP-38 (Timelock Unlock Condition).
@@ -672,450 +186,23 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with
Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
An Address derived from an Ed25519 Public Key. Defined in TIP-38 (Ed25519 Address).
Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
An Address derived from an Account ID which can be unlocked by unlocking the corresponding Account. Defined in TIP-38 (Account Address).
NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
An Address derived from an NFT ID which can be unlocked by unlocking the corresponding NFT. Defined in TIP-38 (NFT Address).
Multi Address - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf -
- Address with Weight - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
Weightuint8The weight of the unlocked address.
-
-
+
Defines a Multi Address that consists of addresses with weights and a threshold value. The Multi Address can be unlocked if the cumulative weight of all unlocked addresses is equal to or exceeds the threshold. Defined in TIP-52 (Multi Address).
Restricted Address - - - - - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 40 to denote a Restricted Address.
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- Multi Address - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf -
- Address with Weight - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
Weightuint8The weight of the unlocked address.
-
-
-
-
Allowed Capabilities(uint8)ByteArrayBitflags expressed as a series of bytes. A leading uint8 denotes its length.
+
An address that contains another address and allows for configuring its capabilities. Defined in TIP-50 (Restricted Address).
- + From cac99d5ea95d7945a089ee8924b77a76a4e33910 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 23 Oct 2023 12:21:08 +0100 Subject: [PATCH 37/47] Point protocol params to TIP-49 --- tips/TIP-0041/tip-0041.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 0927c0fd9..7596e96c3 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -50,10 +50,9 @@ supports both the native tokenization on layer 1 as well as layer 2 smart contra Data types and subschemas used throughout this TIP are defined in [TIP-21](../TIP-0021/tip-0021.md). -## Global Protocol Parameters +## Protocol Parameters -Global protocol parameters used throughout this TIP are defined in [TIP-22 (IOTA)](../TIP-0022/tip-0022.md) and -[TIP-32 (Shimmer)](../TIP-0032/tip-0032.md). +Protocol parameters used throughout this TIP are defined in [TIP-49](../TIP-0049/tip-0049.md). ## Transaction Payload From b10693274e90a0d4dfa4ab9c577e25296e90a195 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 23 Oct 2023 12:21:21 +0100 Subject: [PATCH 38/47] Remove manually added Table of Contents GitHub and the Wiki both auto-generate a ToC, so it's unnecessary to maintain it. --- tips/TIP-0041/tip-0041.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 7596e96c3..a56595991 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -14,14 +14,6 @@ requires: TIP-21, TIP-22, TIP-45 and TIP-47 replaces: TIP-18 --- -# Table of Contents - -1. [Summary](#summary) -2. [Motivation](#motivation) -3. [Building Blocks](#building-blocks) -4. [Basic Output](#basic-output) -5. [Copyright](#copyright) - # Summary This document defines the Basic Output type and transaction validation rules for the IOTA protocol to support storage of From b6a37b16ad9d08ec1a577353200cc855d868507f Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 23 Oct 2023 12:22:52 +0100 Subject: [PATCH 39/47] Polish motivation --- tips/TIP-0041/tip-0041.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index a56595991..8cec9310c 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -23,13 +23,12 @@ extension of the Basic output of TIP-18. ## Summary of changes compared to TIP-18 -- Rename "Alias" to "Account". - Add `Mana` field. - Remove `Native Tokens` field and add `Native Token Feature` to the allowed features. See [TIP-38 (Native Token Migration)](../TIP-0038/tip-0038.md#native-token-migration) for migration details. # Motivation -The aim of this TIP is to define a Basic output type for the support of basic ledger functionality. Such outputs can +This TIP defines an output type for the support of basic ledger functionality. Such outputs can store IOTA tokens, native tokens and Mana. All unlock conditions and features defined in [TIP-38](../TIP-0038/tip-0038.md) are supported and can be composed to create spending restrictions, attach metadata or enable indexed data storage in the UTXO ledger. Layer 2 smart contract requests are enabled by posting requests through From b55d6fdd89eaef5d816c18a4a78a8156356ac3a1 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 23 Oct 2023 12:26:20 +0100 Subject: [PATCH 40/47] Capitalize "Mana" --- tips/TIP-0041/tip-0041.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 8cec9310c..8ed90f23e 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -1,7 +1,7 @@ --- tip: 41 title: Basic Output Type -description: Support for IOTA and native token transfers, Layer 2 smart contract requests and storing mana +description: Support for IOTA and native token transfers, Layer 2 smart contract requests and storing Mana author: Philipp Gackstatter (@PhilippGackstatter) , Levente Pap (@lzpap) , Roman Overko (@roman1e2f5p8s) From 783f557d27b0bf2b006b0b4a4915a1edcec07aab Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 23 Oct 2023 12:27:00 +0100 Subject: [PATCH 41/47] Replace "IOTA tokens" -> "IOTA coins" --- tips/TIP-0041/tip-0041.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 8ed90f23e..b115dcdd3 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -17,23 +17,24 @@ replaces: TIP-18 # Summary This document defines the Basic Output type and transaction validation rules for the IOTA protocol to support storage of -IOTA tokens, native tokens and Mana as well as layer 2 smart contract requests, among other functionality. It was +IOTA coins, native tokens and Mana as well as layer 2 smart contract requests, among other functionality. It was originally introduced in [TIP-18](../TIP-0018/tip-0018.md) and the functionality defined in this document is an extension of the Basic output of TIP-18. ## Summary of changes compared to TIP-18 - Add `Mana` field. -- Remove `Native Tokens` field and add `Native Token Feature` to the allowed features. See [TIP-38 (Native Token Migration)](../TIP-0038/tip-0038.md#native-token-migration) for migration details. +- Remove `Native Tokens` field and add `Native Token Feature` to the allowed features. See + [TIP-38 (Native Token Migration)](../TIP-0038/tip-0038.md#native-token-migration) for migration details. # Motivation -This TIP defines an output type for the support of basic ledger functionality. Such outputs can -store IOTA tokens, native tokens and Mana. All unlock conditions and features defined in -[TIP-38](../TIP-0038/tip-0038.md) are supported and can be composed to create spending restrictions, attach metadata or -enable indexed data storage in the UTXO ledger. Layer 2 smart contract requests are enabled by posting requests through -the Tangle. Such requests can be crafted by including commands in the metadata of Basic outputs. This output thus -supports both the native tokenization on layer 1 as well as layer 2 smart contracts. +This TIP defines an output type for the support of basic ledger functionality. Such outputs can store IOTA coins, native +tokens and Mana. All unlock conditions and features defined in [TIP-38](../TIP-0038/tip-0038.md) are supported and can +be composed to create spending restrictions, attach metadata or enable indexed data storage in the UTXO ledger. Layer 2 +smart contract requests are enabled by posting requests through the Tangle. Such requests can be crafted by including +commands in the metadata of Basic outputs. This output thus supports both the native tokenization on layer 1 as well as +layer 2 smart contracts. # Building Blocks From 167e440b6b030a80c24973ce546966e9d163a53f Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 2 Nov 2023 16:55:02 +0100 Subject: [PATCH 42/47] Add `Anchor Address` in supported UCs --- tips/TIP-0041/tip-0041.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index b115dcdd3..accc85fd8 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -138,6 +138,10 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with NFT Address
An Address derived from an NFT ID which can be unlocked by unlocking the corresponding NFT. Defined in TIP-38 (NFT Address).
+
+ Anchor Address +
An Address derived from an Anchor ID which can be unlocked by unlocking the corresponding Anchor. Defined in TIP-38 (Anchor Address).
+
Multi Address
Defines a Multi Address that consists of addresses with weights and a threshold value. The Multi Address can be unlocked if the cumulative weight of all unlocked addresses is equal to or exceeds the threshold. Defined in TIP-52 (Multi Address).
@@ -189,6 +193,10 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with NFT Address
An Address derived from an NFT ID which can be unlocked by unlocking the corresponding NFT. Defined in TIP-38 (NFT Address).
+
+ Anchor Address +
An Address derived from an Anchor ID which can be unlocked by unlocking the corresponding Anchor. Defined in TIP-38 (Anchor Address).
+
Multi Address
Defines a Multi Address that consists of addresses with weights and a threshold value. The Multi Address can be unlocked if the cumulative weight of all unlocked addresses is equal to or exceeds the threshold. Defined in TIP-52 (Multi Address).
@@ -268,6 +276,10 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with NFT Address
An Address derived from an NFT ID which can be unlocked by unlocking the corresponding NFT. Defined in TIP-38 (NFT Address).
+
+ Anchor Address +
An Address derived from an Anchor ID which can be unlocked by unlocking the corresponding Anchor. Defined in TIP-38 (Anchor Address).
+
Multi Address
Defines a Multi Address that consists of addresses with weights and a threshold value. The Multi Address can be unlocked if the cumulative weight of all unlocked addresses is equal to or exceeds the threshold. Defined in TIP-52 (Multi Address).
@@ -330,6 +342,10 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with NFT Address
An Address derived from an NFT ID which can be unlocked by unlocking the corresponding NFT. Defined in TIP-38 (NFT Address).
+
+ Anchor Address +
An Address derived from an Anchor ID which can be unlocked by unlocking the corresponding Anchor. Defined in TIP-38 (Anchor Address).
+
Multi Address
Defines a Multi Address that consists of addresses with weights and a threshold value. The Multi Address can be unlocked if the cumulative weight of all unlocked addresses is equal to or exceeds the threshold. Defined in TIP-52 (Multi Address).
From 43ced7ae9b508f972d230a9faec0a8a20699b450 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 8 Nov 2023 13:40:50 +0100 Subject: [PATCH 43/47] Remove `Amount <= Token Supply` check --- tips/TIP-0041/tip-0041.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index accc85fd8..083fb1a76 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -450,8 +450,8 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with ## Additional Transaction Syntactic Validation Rules -- `Amount` field must fulfill the [storage deposit requirements](../TIP-0047/tip-0047.md) and must not be `0`. -- `Amount` field must be ≤ `Token Supply`. +- `Amount` field must not be `0`. +- `Amount` field must fulfill the [storage deposit requirements](../TIP-0047/tip-0047.md). - It must hold true that `1` ≤ `Unlock Conditions Count` ≤ `4`. - `Unlock Condition Type` of an Unlock Condition must define one of the following types: - Address Unlock Condition From 9d8488db4a59edb9880938b130a9a69560a3554b Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 8 Nov 2023 15:42:34 +0100 Subject: [PATCH 44/47] Remove `Amount` rules (moved to TIP-45) --- tips/TIP-0041/tip-0041.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 083fb1a76..a63be8afe 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -450,8 +450,6 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with ## Additional Transaction Syntactic Validation Rules -- `Amount` field must not be `0`. -- `Amount` field must fulfill the [storage deposit requirements](../TIP-0047/tip-0047.md). - It must hold true that `1` ≤ `Unlock Conditions Count` ≤ `4`. - `Unlock Condition Type` of an Unlock Condition must define one of the following types: - Address Unlock Condition From 5e9b11c1851c3dbac6dd86d0f47e6365ace059a8 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 20 Nov 2023 12:45:25 +0100 Subject: [PATCH 45/47] Update to new metadata feat --- tips/TIP-0041/tip-0041.md | 44 +++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index a63be8afe..287216cf6 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -360,7 +360,7 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with
Metadata Feature -
Defines metadata (arbitrary binary data) that will be stored in the output. Defined in TIP-38 (Metadata Feature).
+
Defines a map of key-value pairs that is stored in the output. Defined in TIP-38 (Metadata Feature).
@@ -1155,7 +242,7 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with
Expiration Unlock Condition -
Defines a slot index until which only Address, defined in Address Unlock Condition, is allowed to unlock the output. After the slot index is reached/passed, only Return Address can unlock it.
+
Defines a slot index until which only Address, defined in Address Unlock Condition, is allowed to unlock the output. After the slot index is reached/passed, only Return Address can unlock it. Defined in TIP-38 (Expiration Unlock Condition).
@@ -1644,7 +304,7 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with - + @@ -237,14 +237,14 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with - +
@@ -1178,450 +265,23 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with
Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
An Address derived from an Ed25519 Public Key. Defined in TIP-38 (Ed25519 Address).
Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
An Address derived from an Account ID which can be unlocked by unlocking the corresponding Account. Defined in TIP-38 (Account Address).
NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
An Address derived from an NFT ID which can be unlocked by unlocking the corresponding NFT. Defined in TIP-38 (NFT Address).
Multi Address - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf -
- Address with Weight - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
Weightuint8The weight of the unlocked address.
-
-
+
Defines a Multi Address that consists of addresses with weights and a threshold value. The Multi Address can be unlocked if the cumulative weight of all unlocked addresses is equal to or exceeds the threshold. Defined in TIP-52 (Multi Address).
Restricted Address - - - - - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 40 to denote a Restricted Address.
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- Multi Address - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf -
- Address with Weight - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
Weightuint8The weight of the unlocked address.
-
-
-
-
Allowed Capabilities(uint8)ByteArrayBitflags expressed as a series of bytes. A leading uint8 denotes its length.
+
An address that contains another address and allows for configuring its capabilities. Defined in TIP-50 (Restricted Address).
Sender Feature -
Identifies the validated sender of the output.
+
Identifies the validated sender of the output. Defined in TIP-38 (Sender Feature).
@@ -1749,7 +351,7 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with
Metadata Feature -
Defines metadata (arbitrary binary data) that will be stored in the output.
+
Defines metadata (arbitrary binary data) that will be stored in the output. Defined in TIP-38 (Metadata Feature).
@@ -1667,81 +327,23 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with
Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
An Address derived from an Ed25519 Public Key. Defined in TIP-38 (Ed25519 Address).
Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
An Address derived from an Account ID which can be unlocked by unlocking the corresponding Account. Defined in TIP-38 (Account Address).
NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
An Address derived from an NFT ID which can be unlocked by unlocking the corresponding NFT. Defined in TIP-38 (NFT Address).
+
+
+ Multi Address +
Defines a Multi Address that consists of addresses with weights and a threshold value. The Multi Address can be unlocked if the cumulative weight of all unlocked addresses is equal to or exceeds the threshold. Defined in TIP-52 (Multi Address).
+
+
+ Restricted Address +
An address that contains another address and allows for configuring its capabilities. Defined in TIP-50 (Restricted Address).
@@ -1776,7 +378,7 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with
Tag Feature -
Defines an indexation tag to which the output can be indexed by additional node plugins.
+
Defines an indexation tag to which the output can be indexed by additional node plugins. Defined in TIP-38 (Tag Feature).
@@ -1801,6 +403,38 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with
+
+ Native Token Feature +
A feature that carries a user-defined Native Token minted by a Foundry Output. Defined in TIP-38 (Native Token Feature).
+ + + + + + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Feature Typeuint8Set to value 4 to denote a Native Token Feature.
Token IDByteArray[38]Identifier of the native token. Its derivation is defined in TIP-44.
Amountuint256Amount of native tokens of the given Token ID.
+
From 8acbdf2fc083ec194028c567932de26fa8a0108d Mon Sep 17 00:00:00 2001 From: Roman Overko Date: Mon, 16 Oct 2023 10:36:28 +0200 Subject: [PATCH 29/47] Add Roman as author --- tips/TIP-0041/tip-0041.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index f9dc3d3eb..da979d599 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -2,7 +2,8 @@ tip: 41 title: Basic Output Type description: Support for IOTA and native token transfers, Layer 2 smart contract requests and storing mana -author: TODO +author: + TODO, Roman Overko (@roman1e2f5p8s) discussions-to: TODO status: Draft type: Standards From 41cf7ff86f5363915fab8bc047d1f4ac306fb58f Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 16 Oct 2023 11:04:59 +0100 Subject: [PATCH 30/47] Add authors --- tips/TIP-0041/tip-0041.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index da979d599..cefce12fb 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -2,8 +2,7 @@ tip: 41 title: Basic Output Type description: Support for IOTA and native token transfers, Layer 2 smart contract requests and storing mana -author: - TODO, Roman Overko (@roman1e2f5p8s) +author: Philipp Gackstatter (@PhilippGackstatter) , Levente Pap (@lzpap) , Roman Overko (@roman1e2f5p8s) discussions-to: TODO status: Draft type: Standards From 61744caa6ab4f155da6cf339304e01f3b17d9600 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 16 Oct 2023 12:59:19 +0100 Subject: [PATCH 31/47] Remove Native Token rules --- tips/TIP-0041/tip-0041.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index cefce12fb..cdb8fd350 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -443,11 +443,6 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with - `Amount` field must fulfill the [storage deposit requirements](../TIP-0047/tip-0047.md) and must not be `0`. - `Amount` field must be ≤ `Token Supply`. -- `Native Tokens Count` must not be greater than `Max Native Tokens Count`. -- `Native Tokens` must be lexicographically sorted based on `Token ID`. -- Each Native Token must be unique in the set of `Native Tokens` based on its `Token ID`. No duplicates are - allowed. -- `Amount` of any Native Token must not be `0`. - It must hold true that `1` ≤ `Unlock Conditions Count` ≤ `4`. - `Unlock Condition Type` of an Unlock Condition must define one of the following types: - Address Unlock Condition @@ -457,11 +452,12 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with - Unlock Conditions must be sorted in ascending order based on their `Unlock Condition Type`. - Syntactic validation of all present unlock conditions must pass. - Address Unlock Condition must be present. -- It must hold true that `0` ≤ `Features Count` ≤ `3`. +- It must hold true that `0` ≤ `Features Count` ≤ `4`. - `Feature Type` of a Feature must define one of the following types: - Sender Feature - Metadata Feature - Tag Feature + - Native Token Feature - Features must be sorted in ascending order based on their `Feature Type`. - Syntactic validation of all present features must pass. From 2d2225458593675964b8657f14ca53f251284885 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 16 Oct 2023 13:11:08 +0100 Subject: [PATCH 32/47] Remove Storage Deposit table --- tips/TIP-0041/tip-0041.md | 2836 +------------------------------------ 1 file changed, 1 insertion(+), 2835 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index cdb8fd350..a126ebf24 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -18,8 +18,7 @@ replaces: TIP-18 2. [Motivation](#motivation) 3. [Building Blocks](#building-blocks) 4. [Basic Output](#basic-output) -5. [Storage Deposit](#storage-deposit) -6. [Copyright](#copyright) +5. [Copyright](#copyright) # Summary @@ -474,2839 +473,6 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with - All Unlock Condition imposed transaction validation criteria must be fulfilled. - All Feature imposed transaction validation criteria must be fulfilled. -# Storage Deposit - -The following table shows the Basic Output including the possible fields and their specific weight. - -
- Basic Output -
Describes a basic output with optional features.
-
- - - - - - - - - - - - - - - - - -
Offset - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
OutputID - key - 3434
Block ID (included) - data - 4040
Slot Booked - data - 88
Slot Created - data - 88
-
Fields - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Output Type - data - 11
Amount - data - 88
Mana - data - 88
Native Tokens Count - data - 11
Native Tokens optAnyOf -
- Native Token - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Token ID - data - 3838
Amount - data - 3232
-
-
-
Unlock Conditions Count - data - 11
Unlock Conditions atMostOneOfEach -
- Address Unlock Condition -
Defines the Address that owns this output. It can unlock the output with the proper Unlock in a transaction.
- - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Unlock Condition Type - data - 11
Address oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
- Multi Address - - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Addresses anyOf -
- Address with Weight - - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
Weight - data - 11
-
-
-
-
-
-
- Restricted Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Address oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
- Multi Address - - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Addresses anyOf -
- Address with Weight - - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
Weight - data - 11
-
-
-
-
-
-
Allowed Capabilities Length - data - 11
Allowed Capabilities - data - 01
-
-
-
- Implicit Account Creation Address -
Defines an address on which an Implicit Account is created when it receives a Basic Output.
- - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
-
-
-
- Storage Deposit Return Unlock Condition -
Defines the amount of IOTAs used as storage deposit that have to be returned to Return Address.
- - - - - -
Fields - - - - - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Unlock Condition Type - data - 11
Return Address oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
- Multi Address - - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Addresses anyOf -
- Address with Weight - - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
Weight - data - 11
-
-
-
-
-
-
- Restricted Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Address oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
- Multi Address - - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Addresses anyOf -
- Address with Weight - - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
Weight - data - 11
-
-
-
-
-
-
Allowed Capabilities Length - data - 11
Allowed Capabilities - data - 01
-
-
-
Return Amount - data - 88
-
-
-
- Timelock Unlock Condition -
Defines a slot index until which the output can not be unlocked.
- - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Unlock Condition Type - data - 11
Slot Index - data - 88
-
-
-
- Expiration Unlock Condition -
Defines a slot index until which only Address, defined in Address Unlock Condition, is allowed to unlock the output. After the slot index is reached/passed, only Return Address can unlock it.
- - - - - -
Fields - - - - - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Unlock Condition Type - data - 11
Return Address oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
- Multi Address - - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Addresses anyOf -
- Address with Weight - - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
Weight - data - 11
-
-
-
-
-
-
- Restricted Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Address oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
- Multi Address - - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Addresses anyOf -
- Address with Weight - - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
Weight - data - 11
-
-
-
-
-
-
Allowed Capabilities Length - data - 11
Allowed Capabilities - data - 01
-
-
-
Slot Index - data - 88
-
-
-
Features Count - data - 11
Features atMostOneOfEach -
- Sender Feature -
Identifies the validated sender of the output.
- - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Feature Type - data - 11
Sender oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
-
-
-
- Metadata Feature -
Defines metadata (arbitrary binary data) that will be stored in the output.
- - - - - -
Fields - - - - - - - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Feature Type - data - 11
Data Length - data - 22
Data - data - 18192
-
-
-
- Tag Feature -
Defines an indexation tag to which the output can be indexed by additional node plugins.
- - - - - -
Fields - - - - - - - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Feature Type - data - 11
Tag Length - data - 11
Tag - data - 1255
-
-
-
-
v_byte Minimum450
v_byte Maximum14442
- # Copyright Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From fce0368057bfb5339b8828915891218f5c205ced Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 16 Oct 2023 13:12:03 +0100 Subject: [PATCH 33/47] Add Native Token migration notice --- tips/TIP-0041/tip-0041.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index a126ebf24..492592022 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -2,7 +2,9 @@ tip: 41 title: Basic Output Type description: Support for IOTA and native token transfers, Layer 2 smart contract requests and storing mana -author: Philipp Gackstatter (@PhilippGackstatter) , Levente Pap (@lzpap) , Roman Overko (@roman1e2f5p8s) +author: + Philipp Gackstatter (@PhilippGackstatter) , Levente Pap (@lzpap) , + Roman Overko (@roman1e2f5p8s) discussions-to: TODO status: Draft type: Standards @@ -22,15 +24,16 @@ replaces: TIP-18 # Summary -This document defines the Basic output type and transaction validation rules for the IOTA protocol to support storage of +This document defines the Basic Output type and transaction validation rules for the IOTA protocol to support storage of IOTA tokens, native tokens and Mana as well as layer 2 smart contract requests, among other functionality. It was -originally introduced in [TIP-18](../TIP-0018/tip-0018.md) and the functionality defined in this document is a strict +originally introduced in [TIP-18](../TIP-0018/tip-0018.md) and the functionality defined in this document is an extension of the Basic output of TIP-18. ## Summary of changes compared to TIP-18 - Rename "Alias" to "Account". - Add `Mana` field. +- Remove `Native Tokens` field. See [TIP-38 (Migration)](../TIP-0038/tip-0038.md) for migration details. # Motivation @@ -58,9 +61,9 @@ Global protocol parameters used throughout this TIP are defined in [TIP-22 (IOTA # Basic Output -A Basic Output can hold native tokens and might have several unlock conditions and optional features. The -combination of several features provide the base functionality for the output to be used as an on-ledger smart contract -request: +A Basic Output can have several unlock conditions and optional features, including the ability to hold Native +Tokens. The combination of several features provide the base functionality for the output to be used as an on-ledger +smart contract request: - Verified `Sender`, - Attached `Metadata` that can encode the request payload for layer 2, From e538f8cb7bf962c5a6bd08c583f94d6b1e14d602 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 16 Oct 2023 13:14:07 +0100 Subject: [PATCH 34/47] Fix migration link --- tips/TIP-0041/tip-0041.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 492592022..de965f462 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -33,7 +33,7 @@ extension of the Basic output of TIP-18. - Rename "Alias" to "Account". - Add `Mana` field. -- Remove `Native Tokens` field. See [TIP-38 (Migration)](../TIP-0038/tip-0038.md) for migration details. +- Remove `Native Tokens` field. See [TIP-38 (Migration)](../TIP-0038/tip-0038.md#native-tokens-1) for migration details. # Motivation From 405099667546055c8f7e2b26897cc796a778456f Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 16 Oct 2023 13:18:47 +0100 Subject: [PATCH 35/47] Update native token migration notice --- tips/TIP-0041/tip-0041.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index de965f462..3089086bd 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -33,7 +33,7 @@ extension of the Basic output of TIP-18. - Rename "Alias" to "Account". - Add `Mana` field. -- Remove `Native Tokens` field. See [TIP-38 (Migration)](../TIP-0038/tip-0038.md#native-tokens-1) for migration details. +- Remove `Native Tokens` field and add `Native Token Feature` to the allowed features. See [TIP-38 (Native Token Migration)](../TIP-0038/tip-0038.md#native-token-migration) for migration details. # Motivation From 33a2fb4d3b57b576c508e28e27339fb0fc8853c7 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 17 Oct 2023 14:47:07 +0100 Subject: [PATCH 36/47] Set new Basic Output type prefix (+slot index u32) --- tips/TIP-0041/tip-0041.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 3089086bd..0927c0fd9 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -92,7 +92,7 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with
Output Type uint8Set to value 3 to denote a Basic Output.Set to value 0 to denote a Basic Output.
Amount
Slot Indexuint64uint32 Slot index starting from which the output can be consumed.
Expiration Unlock Condition -
Defines a slot index until which only Address, defined in Address Unlock Condition, is allowed to unlock the output. After the slot index is reached/passed, only Return Address can unlock it. Defined in TIP-38 (Expiration Unlock Condition).
+
Defines a slot index until which only the Address defined in the Address Unlock Condition is allowed to unlock the output. After the slot index is reached/passed, only the Return Address can unlock it. Defined in TIP-38 (Expiration Unlock Condition).
- +
@@ -289,7 +289,7 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with
Slot Indexuint64uint32 Before this slot index, Address Unlock Condition is allowed to unlock the output, after that only the address defined in Return Address.
@@ -428,7 +428,7 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with
Token ID ByteArray[38]Identifier of the native token. Its derivation is defined in TIP-44.Identifier of the native token. Its derivation is defined in TIP-44 (Foundry Output).
Amount
- - - + + + + + + +
@@ -379,9 +379,41 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with Set to value 2 to denote a Metadata Feature.
Data(uint16)ByteArrayBinary data. A leading uint16 denotes its length.Entries Countuint8The number of entries in the map.
Entries anyOf +
+ Metadata Entry +
A map entry consisting of a string key and an arbitrary byte value.
+ + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Key(uint8)ByteArrayA string which may only consist of ASCII characters. A leading uint8 denotes its length.
Value(uint16)ByteArrayAn array of arbitrary binary data. A leading uint16 denotes its length.
+
+
@@ -403,7 +435,7 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with Feature Type uint8 - Set to value 3 to denote a Tag Feature. + Set to value 4 to denote a Tag Feature. Tag @@ -430,7 +462,7 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with Feature Type uint8 - Set to value 4 to denote a Native Token Feature. + Set to value 5 to denote a Native Token Feature. Token ID From a2aa984cc88ae22a2eef3f188866fe7993fd5ade Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 21 Dec 2023 13:53:14 +0100 Subject: [PATCH 46/47] Add storage score test vector --- tips/TIP-0041/tip-0041.md | 57 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index 287216cf6..d04c77f70 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -513,6 +513,63 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with - All Unlock Condition imposed transaction validation criteria must be fulfilled. - All Feature imposed transaction validation criteria must be fulfilled. +# Test Vectors + +The protocol parameters used in the following test vectors are the same as in +[TIP-49 (Protocol Parameters Hash)](../TIP-0049/tip-0049.md#protocol-parameters-hash). + +## Storage Score + +The following test vector shows the calculation of the storage score according to [TIP-47](../TIP-0047/tip-0047.md). + +Basic Output (json-encoded): + +```json +{ + "type": 0, + "amount": "200000000", + "mana": "555000000", + "unlockConditions": [ + { + "type": 0, + "address": { + "type": 0, + "pubKeyHash": "0xed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a" + } + }, + { + "type": 2, + "slot": 999 + } + ], + "features": [ + { + "type": 2, + "entries": { + "iota": "0x322e30" + } + }, + { + "type": 4, + "tag": "0x73746f726167655f73636f7265" + }, + { + "type": 5, + "id": "0x083ef5555d65ba314fb1680147da0d54b08cecfd9a728bdcf5f1ebda1fedb9f852435d8d1000", + "amount": "0x2a" + } + ] +} +``` + +Basic Output (hex-encoded binary serialization): + +``` +0x0000c2eb0b00000000c0a0142100000000020000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a02e703000003020104696f74610300322e30040d73746f726167655f73636f726505083ef5555d65ba314fb1680147da0d54b08cecfd9a728bdcf5f1ebda1fedb9f852435d8d10002a00000000000000000000000000000000000000000000000000000000000000 +``` + +Basic Output Storage Score: `244`. + # Copyright Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From a304de5b25c43fe0ba9f58da15c8b9df002f91d9 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 25 Jan 2024 09:59:37 +0100 Subject: [PATCH 47/47] Update metadata feature description --- tips/TIP-0041/tip-0041.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0041/tip-0041.md b/tips/TIP-0041/tip-0041.md index d04c77f70..8648a9cf8 100644 --- a/tips/TIP-0041/tip-0041.md +++ b/tips/TIP-0041/tip-0041.md @@ -404,7 +404,7 @@ Besides, the Tag Feature is a tool to store arbitrary, indexed data with Key (uint8)ByteArray - A string which may only consist of ASCII characters. A leading uint8 denotes its length. + A string which may only consist of printable ASCII characters. A leading uint8 denotes its length. Value