From 925b64b8ec832066725e598fda1fbde6ecc1d402 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 5 May 2023 10:31:41 +0200 Subject: [PATCH 01/35] Add TIP-44 skeleton --- tips/TIP-0044/tip-0044.md | 427 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 427 insertions(+) create mode 100644 tips/TIP-0044/tip-0044.md diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md new file mode 100644 index 000000000..55bd7e821 --- /dev/null +++ b/tips/TIP-0044/tip-0044.md @@ -0,0 +1,427 @@ +--- +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. + +## Foundry Output + +A foundry output is an output that **controls the supply of user defined native tokens.** It can mint and melt tokens +according to the **policy** defined in the `Token Scheme` field of the output. Foundries can only be created and +controlled by aliases. + +**The concatenation of `Address` || `Serial Number` || `Token Scheme Type` fields defines the unique identifier of the +foundry, the `Foundry ID`.** + +Upon creation of the foundry, the alias defined in the `Address` field of the +Immutable Alias Address Unlock Condition must be unlocked in the same transaction, and its `Foundry Counter` +field must increment. This incremented value defines `Serial Number`, while the `Token Scheme` can be chosen freely. + +`Foundry ID` is not allowed to change after deployment, therefore neither `Address`, nor `Serial Number` or +`Token Scheme` can change during the lifetime of the foundry. + +Foundries control the supply of tokens with unique identifiers, so-called `Token IDs`. The **`Token ID` of tokens +controlled by a specific foundry is the same as the **`Foundry ID`**. + + +
+ Foundry Output +
+ Describes a foundry output that is controlled by an alias. +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Output Typeuint8 + Set to value 5 to denote a Foundry Output. +
Amountuint64The amount of IOTA coins to held by the output.
Native Tokens Countuint8The number of different native tokens held by the output.
Native Tokens optAnyOf +
+ Native Token + + + + + + + + + + + + + + + + +
NameTypeDescription
Token IDByteArray[38] + Identifier of the native tokens. +
Amountuint256Amount of native tokens of the given Token ID.
+
+
Serial Numberuint32The serial number of the foundry with respect to the controlling alias.
Token Scheme oneOf +
+ Simple Token Scheme + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Token Scheme Typeuint8 + Set to value 0 to denote an Simple Token Scheme. +
Minted Tokensuint256Amount of tokens minted by this foundry.
Melted Tokensuint256Amount of tokens melted by this foundry.
Maximum Supplyuint256Maximum supply of tokens controlled by this foundry.
+
+
Unlock Conditions Countuint8The number of unlock conditions following.
Unlock Conditions atMostOneOfEach +
+ Immutable Alias Address Unlock Condition + + + + + + + + + + + + + + + +
NameTypeDescription
Unlock Condition Typeuint8 + Set to value 6 to denote an Immutable Alias Address Unlock Condition. +
Address +
+ 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.
+
+
+
+
Features Countuint8The number of features following.
Features atMostOneOfEach +
+ 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.
+
+
Immutable Features Countuint8The number of immutable features following. Immutable features are defined upon deployment of the UTXO state machine and are not allowed to change in any future state transition.
Immutable Features atMostOneOfEach +
+ 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.
+
+
+ + + +### Additional Transaction Syntactic Validation Rules + +#### Output Syntactic Validation + +- `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 `Unlock Conditions Count` = `1`. +- `Unlock Condition Type` of an Unlock Condition must define one of the following types: + - Immutable Alias Address Unlock Condition +- Syntactic validation of all present unlock conditions must pass. +- It must hold true that `0` ≤ `Features Count` ≤ `1`. +- `Feature Type` of a Feature in `Features` must define one of the following types: + - Metadata Feature +- It must hold true that `0` ≤ `Immutable Features Count` ≤ `1`. +- `Feature Type` of a Feature in `Immutable Features` must define one of the following types: + - Metadata Feature +- Syntactic validation of all present features must pass. +- `Token Scheme` must define one of the following types: + - Simple Token Scheme + +##### Simple Token Scheme Syntactic Validation +- `Token Scheme Type` of a Simple Token Scheme must be `0`. +- `Minted Tokens` - `Melted Tokens` must not be greater than `Maximum Supply`. +- `Melted Tokens` must not be greater than `Minted Tokens`. +- `Maximum Supply` must be larger than zero. + +### Additional Transaction Semantic Validation Rules + +A foundry is essentially a UTXO state machine. A transaction might either create a new foundry with a unique +`Foundry ID`, transition an already existing foundry or destroy it. The current and next states of the state machine +are encoded in inputs and outputs respectively. + +- The **current state of the foundry** with `Foundry ID` `X` in a transaction is defined as the consumed foundry output + where `Foundry ID` = `X`. +- The **next state of the foundry** with `Foundry ID` `X` in a transaction is defined as the created foundry output + where `Foundry ID` = `X`. +- `Foundry Diff` is the pair of the **current and next state** of the foundry output in the transaction. + +| A transaction that... | Current State | Next State | +|-------------------------|-------------------------|--------------------------| +| Creates the foundry | Empty | Output with `Foundry ID` | +| Transitions the foundry | Input with `Foundry ID` | Output with `Foundry ID` | +| Destroys the foundry | Input with `Foundry ID` | Empty | + +- The foundry output must be unlocked like any other output type where the __Address Unlock Condition__ defines an + __Alias Address__, by transitioning the alias in the very same transaction. See section + [alias unlocking](#unlocking-chain-script-locked-outputs) for more details. +- When the current state of the foundry with `Foundry ID` is empty, it must hold true for `Serial Number` in the next + state, that: + - `Foundry Counter(InputAlias) < Serial Number <= Foundry Counter(OutputAlias)` + - An alias can create several new foundries in one transaction. It was written for the alias output that freshly + created foundry outputs must be sorted in the list of outputs based on their `Serial Number`. No duplicates are + allowed. + - The two previous rules make sure that each foundry output produced by an alias has a unique `Serial Number`, + hence each `Foundry ID` is unique. +- Native tokens present in a transaction are all native tokens present in inputs and outputs of the transaction. Native + tokens of a transaction must be a set based on their `Token ID`. +- There must be at most one `Token ID` in the native token set of the transaction that maps to a specific `Foundry ID`. +- When neither `Current State` nor `Next State` is empty: + - Immutable Alias Address Unlock Condition must not change. + - `Serial Number` must not change. + - `Token Scheme Type` must not change. + - Features in `Immutable Features` must not change. +- [Token Scheme Semantic Validation Rules](#token-scheme-semantic-validation-rules) must be fulfilled. + +#### Token Scheme Semantic Validation Rules +`Token Scheme Validation` takes `Token Diff` and `Foundry Diff` and validates if the scheme constraints are respected. + +##### Simple Token Scheme Validation Rules +- Let `Token Diff` denote the **difference between native token balances of the input and the output side** of the + transaction of the single `Token ID` that maps to the `Foundry ID`. Minting results in excess of tokens on the output + side (positive diff), melting results in excess on the input side (negative diff). Now, the following conditions must + hold for `Token Diff`: + 1. When `Token Diff` > 0 + - `Current State(Minted Tokens) + Token Diff = Next State(Minted Tokens)`. + - `Current State(Melted Tokens) = Next State(Melted Tokens)` + 2. When `Token Diff` < 0, it must hold true that: + - `Current State(Melted Tokens) <= Next State(Melted Tokens)` + - `[Next State(Melted Tokens) - Current State(Melted Tokens)] <= |Token Diff|`. + - When `Current State(Melted Tokens) != Next State(Melted Tokens)`, it must be true that `Current State(Minted Tokens) = Next State(Minted Tokens)` + 3. When `Current State` is empty, `Current State(Minted Tokens) = 0` and `Current State(Melted Tokens) = 0`. + 4. When `Next State` is empty, condition `1` and `2` are ignored. It must hold true, that + `Current State(Minted Tokens) + Token Diff = Current State(Melted Tokens)` +- When neither `Current State` nor `Next State` is empty: + - `Maximum Supply` field must not change. + +### Notes + +- A token scheme is a list of hard coded constraints. It is not feasible at the moment to foresee the future + needs/requirements of hard coded constraints, so it is impossible to design token schemes as any possible combination + of those constraints. A better design would be to have a list of possible constraints (and their related fields) from + which the user can choose. The chosen combination should still be encoded as a bitmask inside the `Token ID`. +- Additional token schemes will be defined that make use of the `Foundry Diff` as well, for example validating that + a certain amount of tokens can only be minted/melted after a certain date. +- For now, only token scheme `0` is supported. Additional token schemes will be designed iteratively when the need arises. +- The `Foundry ID` of a foundry output should be queryable in indexers, so that given a `Foundry ID`, the + `Output ID` of the foundry output can be retrieved. `Foundry ID` behaves like an address that can't unlock anything. + While it is not necessarily needed for the protocol, it is needed for client side operations, such as: + - Retrieving the current state of the foundry. + - Accessing token metadata in foundry based on `Foundry ID`/`Tokend ID`. + +# Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From 99524a57f0de6a9097977550d8639e8c19a35579 Mon Sep 17 00:00:00 2001 From: Roman Overko Date: Fri, 19 May 2023 12:21:27 +0200 Subject: [PATCH 02/35] Changed alias to account, added storage deposit calc --- ...iota_FoundryOutput_(max_functionality).jpg | Bin 0 -> 53420 bytes ...iota_FoundryOutput_(min_functionality).jpg | Bin 0 -> 52336 bytes tips/TIP-0044/tip-0044.md | 405 +++++++++++++++++- 3 files changed, 385 insertions(+), 20 deletions(-) create mode 100644 tips/TIP-0044/assets/deposit_miota_FoundryOutput_(max_functionality).jpg create mode 100644 tips/TIP-0044/assets/deposit_miota_FoundryOutput_(min_functionality).jpg diff --git a/tips/TIP-0044/assets/deposit_miota_FoundryOutput_(max_functionality).jpg b/tips/TIP-0044/assets/deposit_miota_FoundryOutput_(max_functionality).jpg new file mode 100644 index 0000000000000000000000000000000000000000..d92c6e76629819b37ee40715d07c06b216a5af78 GIT binary patch literal 53420 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 GGWc)plPrz^ literal 0 HcmV?d00001 diff --git a/tips/TIP-0044/assets/deposit_miota_FoundryOutput_(min_functionality).jpg b/tips/TIP-0044/assets/deposit_miota_FoundryOutput_(min_functionality).jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c62c9bcb72aabfbac8b3f8ef10d52f499f27ef7 GIT binary patch literal 52336 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%0AS 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 DDSEl6 literal 0 HcmV?d00001 diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index 55bd7e821..25ddb63d9 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.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 @@ -75,13 +75,13 @@ constraints to transaction validation when they are placed in outputs. A foundry output is an output that **controls the supply of user defined native tokens.** It can mint and melt tokens according to the **policy** defined in the `Token Scheme` field of the output. Foundries can only be created and -controlled by aliases. +controlled by accounts. **The concatenation of `Address` || `Serial Number` || `Token Scheme Type` fields defines the unique identifier of the foundry, the `Foundry ID`.** -Upon creation of the foundry, the alias defined in the `Address` field of the -Immutable Alias Address Unlock Condition must be unlocked in the same transaction, and its `Foundry Counter` +Upon creation of the foundry, the account defined in the `Address` field of the +Immutable Account Address Unlock Condition must be unlocked in the same transaction, and its `Foundry Counter` field must increment. This incremented value defines `Serial Number`, while the `Token Scheme` can be chosen freely. `Foundry ID` is not allowed to change after deployment, therefore neither `Address`, nor `Serial Number` or @@ -94,7 +94,7 @@ controlled by a specific foundry is the same as the **`Foundry ID`**.
Foundry Output
- Describes a foundry output that is controlled by an alias. + Describes a foundry output that is controlled by an account.
@@ -112,7 +112,7 @@ controlled by a specific foundry is the same as the **`Foundry ID`**. - + @@ -149,7 +149,7 @@ controlled by a specific foundry is the same as the **`Foundry ID`**. - + @@ -197,7 +197,7 @@ controlled by a specific foundry is the same as the **`Foundry ID`**.
Amount uint64The amount of IOTA coins to held by the output.The amount of IOTA coins held by the output.
Native Tokens Count
Serial Number uint32The serial number of the foundry with respect to the controlling alias.The serial number of the foundry with respect to the controlling account.
Token Scheme oneOfUnlock Conditions atMostOneOfEach
- Immutable Alias Address Unlock Condition + Immutable Account Address Unlock Condition @@ -208,14 +208,14 @@ controlled by a specific foundry is the same as the **`Foundry ID`**.
NameUnlock Condition Type uint8 - Set to value 6 to denote an Immutable Alias Address Unlock Condition. + Set to value 6 to denote an Immutable Account Address Unlock Condition.
Address
- Alias Address + Account Address @@ -226,13 +226,13 @@ controlled by a specific foundry is the same as the **`Foundry ID`**. - + - +
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.
@@ -329,7 +329,7 @@ controlled by a specific foundry is the same as the **`Foundry ID`**. - `Amount` of any Native Token must not be `0`. - It must hold true that `Unlock Conditions Count` = `1`. - `Unlock Condition Type` of an Unlock Condition must define one of the following types: - - Immutable Alias Address Unlock Condition + - Immutable Account Address Unlock Condition - Syntactic validation of all present unlock conditions must pass. - It must hold true that `0` ≤ `Features Count` ≤ `1`. - `Feature Type` of a Feature in `Features` must define one of the following types: @@ -366,21 +366,21 @@ are encoded in inputs and outputs respectively. | Destroys the foundry | Input with `Foundry ID` | Empty | - The foundry output must be unlocked like any other output type where the __Address Unlock Condition__ defines an - __Alias Address__, by transitioning the alias in the very same transaction. See section - [alias unlocking](#unlocking-chain-script-locked-outputs) for more details. + __Account Address__, by transitioning the account in the very same transaction. See section + [account unlocking](#unlocking-chain-script-locked-outputs) for more details. - When the current state of the foundry with `Foundry ID` is empty, it must hold true for `Serial Number` in the next state, that: - - `Foundry Counter(InputAlias) < Serial Number <= Foundry Counter(OutputAlias)` - - An alias can create several new foundries in one transaction. It was written for the alias output that freshly + - `Foundry Counter(InputAccount) < Serial Number <= Foundry Counter(OutputAccount)` + - An account can create several new foundries in one transaction. It was written for the account output that freshly created foundry outputs must be sorted in the list of outputs based on their `Serial Number`. No duplicates are allowed. - - The two previous rules make sure that each foundry output produced by an alias has a unique `Serial Number`, + - The two previous rules make sure that each foundry output produced by an account has a unique `Serial Number`, hence each `Foundry ID` is unique. - Native tokens present in a transaction are all native tokens present in inputs and outputs of the transaction. Native tokens of a transaction must be a set based on their `Token ID`. - There must be at most one `Token ID` in the native token set of the transaction that maps to a specific `Foundry ID`. - When neither `Current State` nor `Next State` is empty: - - Immutable Alias Address Unlock Condition must not change. + - Immutable Account Address Unlock Condition must not change. - `Serial Number` must not change. - `Token Scheme Type` must not change. - Features in `Immutable Features` must not change. @@ -407,6 +407,371 @@ are encoded in inputs and outputs respectively. - When neither `Current State` nor `Next State` is empty: - `Maximum Supply` field must not change. +### Storage Deposit Calculation + +The following table shows the Foundry Output including the possible fields and their specific weight. + + +
+ Foundry Output +
+ Describes a foundry output that is controlled by an account. +
+
+ + + + + + + + + + + + + + + + +
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 5 to denote a Foundry Output. +
Amountdata88The amount of IOTA coins held by the output.
Native Tokens Countdata11The number of different 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. +
+
+
Serial Numberdata44The serial number of the foundry with respect to the controlling account.
Token Scheme oneOf +
+ Simple Token Scheme + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Token Scheme Typedata11 + Set to value 0 to denote an Simple Token Scheme. +
Minted Tokensdata3232Amount of tokens minted by this foundry.
Melted Tokensdata3232Amount of tokens melted by this foundry.
Maximum Supplydata3232Maximum supply of tokens controlled by this foundry.
+
+
Unlock Conditions Countdata11The number of unlock conditions following.
Unlock Conditions atMostOneOfEach +
+ Immutable Account Address Unlock Condition + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Unlock Condition Typedata11 + Set to value 6 to denote an Immutable Account Address Unlock Condition. +
Address +
+ 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.
+
+
+
+
Features Countdata11The number of features following.
Features atMostOneOfEach +
+ 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.
+
+
Immutable Features Countdata11The number of immutable features following. Immutable features are defined upon deployment of the UTXO state machine and are not allowed to change in any future state transition.
Immutable Features atMostOneOfEach +
+ 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.
+
+
+
v_byte Minimum528
v_byte Maximum21398
+ +
+ +![](assets/deposit_miota_FoundryOutput_(min_functionality).jpg) + +![](assets/deposit_miota_FoundryOutput_(max_functionality).jpg) + ### Notes - A token scheme is a list of hard coded constraints. It is not feasible at the moment to foresee the future From 7bb6a420ba243176d5d01c3c4e4d1a8fff4743c5 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 23 May 2023 17:46:02 +0200 Subject: [PATCH 03/35] Add summary & motivation --- tips/TIP-0044/tip-0044.md | 89 +++++++++++++-------------------------- 1 file changed, 30 insertions(+), 59 deletions(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index 25ddb63d9..4959853ff 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -1,7 +1,7 @@ --- -tip: TODO -title: TODO -description: TODO +tip: 44 +title: Foundry Output Type +description: Support for layer 1 native token foundries author: TODO discussions-to: TODO status: Draft @@ -16,18 +16,17 @@ 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. [Foundry Output](#foundry-output) +5. [Storage Deposit](#storage-deposit) 6. [Copyright](#copyright) # Summary -TODO: Adapt from TIP-18 summary. +This document defines the Foundry output type and transaction validation rules for the IOTA protocol to support user-defined layer 1 native tokens. The output defines the supply of such tokens. It was originally introduced in TIP-18 and the functionality defined in this document is an exact copy of the Foundry output of TIP-18. # Motivation -TODO: Adapt from TIP-18 motivation. +The aim of this TIP is to define a Foundry output type to support seamless interoperability between layer 1 and layer 2 tokenization concepts. The foundry can define the supply of native tokens on layer 1, which can be minted, melted and transferred with zero fees. # Building Blocks @@ -43,35 +42,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. - -## Foundry Output +# Foundry Output A foundry output is an output that **controls the supply of user defined native tokens.** It can mint and melt tokens according to the **policy** defined in the `Token Scheme` field of the output. Foundries can only be created and @@ -316,9 +287,9 @@ controlled by a specific foundry is the same as the **`Foundry ID`**.
-### Additional Transaction Syntactic Validation Rules +## Additional Transaction Syntactic Validation Rules -#### Output Syntactic Validation +### Output Syntactic Validation - `Amount` field must fulfill the dust protection requirements and must not be `0`. - `Amount` field must be ≤ `Max IOTA Supply`. @@ -341,13 +312,13 @@ controlled by a specific foundry is the same as the **`Foundry ID`**. - `Token Scheme` must define one of the following types: - Simple Token Scheme -##### Simple Token Scheme Syntactic Validation +#### Simple Token Scheme Syntactic Validation - `Token Scheme Type` of a Simple Token Scheme must be `0`. - `Minted Tokens` - `Melted Tokens` must not be greater than `Maximum Supply`. - `Melted Tokens` must not be greater than `Minted Tokens`. - `Maximum Supply` must be larger than zero. -### Additional Transaction Semantic Validation Rules +## Additional Transaction Semantic Validation Rules A foundry is essentially a UTXO state machine. A transaction might either create a new foundry with a unique `Foundry ID`, transition an already existing foundry or destroy it. The current and next states of the state machine @@ -386,10 +357,10 @@ are encoded in inputs and outputs respectively. - Features in `Immutable Features` must not change. - [Token Scheme Semantic Validation Rules](#token-scheme-semantic-validation-rules) must be fulfilled. -#### Token Scheme Semantic Validation Rules +### Token Scheme Semantic Validation Rules `Token Scheme Validation` takes `Token Diff` and `Foundry Diff` and validates if the scheme constraints are respected. -##### Simple Token Scheme Validation Rules +#### Simple Token Scheme Validation Rules - Let `Token Diff` denote the **difference between native token balances of the input and the output side** of the transaction of the single `Token ID` that maps to the `Foundry ID`. Minting results in excess of tokens on the output side (positive diff), melting results in excess on the input side (negative diff). Now, the following conditions must @@ -407,7 +378,22 @@ are encoded in inputs and outputs respectively. - When neither `Current State` nor `Next State` is empty: - `Maximum Supply` field must not change. -### Storage Deposit Calculation +## Notes + +- A token scheme is a list of hard coded constraints. It is not feasible at the moment to foresee the future + needs/requirements of hard coded constraints, so it is impossible to design token schemes as any possible combination + of those constraints. A better design would be to have a list of possible constraints (and their related fields) from + which the user can choose. The chosen combination should still be encoded as a bitmask inside the `Token ID`. +- Additional token schemes will be defined that make use of the `Foundry Diff` as well, for example validating that + a certain amount of tokens can only be minted/melted after a certain date. +- For now, only token scheme `0` is supported. Additional token schemes will be designed iteratively when the need arises. +- The `Foundry ID` of a foundry output should be queryable in indexers, so that given a `Foundry ID`, the + `Output ID` of the foundry output can be retrieved. `Foundry ID` behaves like an address that can't unlock anything. + While it is not necessarily needed for the protocol, it is needed for client side operations, such as: + - Retrieving the current state of the foundry. + - Accessing token metadata in foundry based on `Foundry ID`/`Tokend ID`. + +# Storage Deposit The following table shows the Foundry Output including the possible fields and their specific weight. @@ -772,21 +758,6 @@ The following table shows the Foundry Output including the possible fields and t ![](assets/deposit_miota_FoundryOutput_(max_functionality).jpg) -### Notes - -- A token scheme is a list of hard coded constraints. It is not feasible at the moment to foresee the future - needs/requirements of hard coded constraints, so it is impossible to design token schemes as any possible combination - of those constraints. A better design would be to have a list of possible constraints (and their related fields) from - which the user can choose. The chosen combination should still be encoded as a bitmask inside the `Token ID`. -- Additional token schemes will be defined that make use of the `Foundry Diff` as well, for example validating that - a certain amount of tokens can only be minted/melted after a certain date. -- For now, only token scheme `0` is supported. Additional token schemes will be designed iteratively when the need arises. -- The `Foundry ID` of a foundry output should be queryable in indexers, so that given a `Foundry ID`, the - `Output ID` of the foundry output can be retrieved. `Foundry ID` behaves like an address that can't unlock anything. - While it is not necessarily needed for the protocol, it is needed for client side operations, such as: - - Retrieving the current state of the foundry. - - Accessing token metadata in foundry based on `Foundry ID`/`Tokend ID`. - # Copyright Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From 101a9476b2bf1ec4522933e5c7830933b7a13c86 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 23 May 2023 17:46:42 +0200 Subject: [PATCH 04/35] Remove storage deposit figures --- ..._miota_FoundryOutput_(max_functionality).jpg | Bin 53420 -> 0 bytes ..._miota_FoundryOutput_(min_functionality).jpg | Bin 52336 -> 0 bytes tips/TIP-0044/tip-0044.md | 4 ---- 3 files changed, 4 deletions(-) delete mode 100644 tips/TIP-0044/assets/deposit_miota_FoundryOutput_(max_functionality).jpg delete mode 100644 tips/TIP-0044/assets/deposit_miota_FoundryOutput_(min_functionality).jpg diff --git a/tips/TIP-0044/assets/deposit_miota_FoundryOutput_(max_functionality).jpg b/tips/TIP-0044/assets/deposit_miota_FoundryOutput_(max_functionality).jpg deleted file mode 100644 index d92c6e76629819b37ee40715d07c06b216a5af78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53420 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 GGWc)plPrz^ diff --git a/tips/TIP-0044/assets/deposit_miota_FoundryOutput_(min_functionality).jpg b/tips/TIP-0044/assets/deposit_miota_FoundryOutput_(min_functionality).jpg deleted file mode 100644 index 8c62c9bcb72aabfbac8b3f8ef10d52f499f27ef7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52336 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%0AS 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 DDSEl6 diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index 4959853ff..e7bb0b843 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -754,10 +754,6 @@ The following table shows the Foundry Output including the possible fields and t
-![](assets/deposit_miota_FoundryOutput_(min_functionality).jpg) - -![](assets/deposit_miota_FoundryOutput_(max_functionality).jpg) - # Copyright Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From 0b31647ec93f88faff7102eafe0038c791312ca8 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Sat, 27 May 2023 14:07:59 +0200 Subject: [PATCH 05/35] Update heaer --- tips/TIP-0044/tip-0044.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index e7bb0b843..afdfbcf17 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.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 @@ -40,7 +41,7 @@ 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. # Foundry Output From c980ce0a2aeacf9e7d3947e7d03f64c60fdc4374 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 31 May 2023 09:57:36 +0200 Subject: [PATCH 06/35] Format markdown --- tips/TIP-0044/tip-0044.md | 72 ++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 31 deletions(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index afdfbcf17..3f9617bcb 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -23,11 +23,15 @@ replaces: TIP-18 # Summary -This document defines the Foundry output type and transaction validation rules for the IOTA protocol to support user-defined layer 1 native tokens. The output defines the supply of such tokens. It was originally introduced in TIP-18 and the functionality defined in this document is an exact copy of the Foundry output of TIP-18. +This document defines the Foundry output type and transaction validation rules for the IOTA protocol to support +user-defined layer 1 native tokens. The output defines the supply of such tokens. It was originally introduced in TIP-18 +and the functionality defined in this document is an exact copy of the Foundry output of TIP-18. # Motivation -The aim of this TIP is to define a Foundry output type to support seamless interoperability between layer 1 and layer 2 tokenization concepts. The foundry can define the supply of native tokens on layer 1, which can be minted, melted and transferred with zero fees. +The aim of this TIP is to define a Foundry output type to support seamless interoperability between layer 1 and layer 2 +tokenization concepts. The foundry can define the supply of native tokens on layer 1, which can be minted, melted and +transferred with zero fees. # Building Blocks @@ -37,7 +41,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 @@ -52,15 +57,15 @@ controlled by accounts. **The concatenation of `Address` || `Serial Number` || `Token Scheme Type` fields defines the unique identifier of the foundry, the `Foundry ID`.** -Upon creation of the foundry, the account defined in the `Address` field of the -Immutable Account Address Unlock Condition must be unlocked in the same transaction, and its `Foundry Counter` -field must increment. This incremented value defines `Serial Number`, while the `Token Scheme` can be chosen freely. +Upon creation of the foundry, the account defined in the `Address` field of the Immutable Account Address Unlock +Condition must be unlocked in the same transaction, and its `Foundry Counter` field must increment. This incremented +value defines `Serial Number`, while the `Token Scheme` can be chosen freely. `Foundry ID` is not allowed to change after deployment, therefore neither `Address`, nor `Serial Number` or `Token Scheme` can change during the lifetime of the foundry. Foundries control the supply of tokens with unique identifiers, so-called `Token IDs`. The **`Token ID` of tokens -controlled by a specific foundry is the same as the **`Foundry ID`**. +controlled by a specific foundry is the same as the **`Foundry ID`\*\*.
@@ -314,6 +319,7 @@ controlled by a specific foundry is the same as the **`Foundry ID`**. - Simple Token Scheme #### Simple Token Scheme Syntactic Validation + - `Token Scheme Type` of a Simple Token Scheme must be `0`. - `Minted Tokens` - `Melted Tokens` must not be greater than `Maximum Supply`. - `Melted Tokens` must not be greater than `Minted Tokens`. @@ -322,8 +328,8 @@ controlled by a specific foundry is the same as the **`Foundry ID`**. ## Additional Transaction Semantic Validation Rules A foundry is essentially a UTXO state machine. A transaction might either create a new foundry with a unique -`Foundry ID`, transition an already existing foundry or destroy it. The current and next states of the state machine -are encoded in inputs and outputs respectively. +`Foundry ID`, transition an already existing foundry or destroy it. The current and next states of the state machine are +encoded in inputs and outputs respectively. - The **current state of the foundry** with `Foundry ID` `X` in a transaction is defined as the consumed foundry output where `Foundry ID` = `X`. @@ -332,22 +338,22 @@ are encoded in inputs and outputs respectively. - `Foundry Diff` is the pair of the **current and next state** of the foundry output in the transaction. | A transaction that... | Current State | Next State | -|-------------------------|-------------------------|--------------------------| +| ----------------------- | ----------------------- | ------------------------ | | Creates the foundry | Empty | Output with `Foundry ID` | | Transitions the foundry | Input with `Foundry ID` | Output with `Foundry ID` | | Destroys the foundry | Input with `Foundry ID` | Empty | -- The foundry output must be unlocked like any other output type where the __Address Unlock Condition__ defines an - __Account Address__, by transitioning the account in the very same transaction. See section +- The foundry output must be unlocked like any other output type where the **Address Unlock Condition** defines an + **Account Address**, by transitioning the account in the very same transaction. See section [account unlocking](#unlocking-chain-script-locked-outputs) for more details. - When the current state of the foundry with `Foundry ID` is empty, it must hold true for `Serial Number` in the next state, that: - - `Foundry Counter(InputAccount) < Serial Number <= Foundry Counter(OutputAccount)` - - An account can create several new foundries in one transaction. It was written for the account output that freshly - created foundry outputs must be sorted in the list of outputs based on their `Serial Number`. No duplicates are - allowed. - - The two previous rules make sure that each foundry output produced by an account has a unique `Serial Number`, - hence each `Foundry ID` is unique. + - `Foundry Counter(InputAccount) < Serial Number <= Foundry Counter(OutputAccount)` + - An account can create several new foundries in one transaction. It was written for the account output that freshly + created foundry outputs must be sorted in the list of outputs based on their `Serial Number`. No duplicates are + allowed. + - The two previous rules make sure that each foundry output produced by an account has a unique `Serial Number`, hence + each `Foundry ID` is unique. - Native tokens present in a transaction are all native tokens present in inputs and outputs of the transaction. Native tokens of a transaction must be a set based on their `Token ID`. - There must be at most one `Token ID` in the native token set of the transaction that maps to a specific `Foundry ID`. @@ -359,20 +365,23 @@ are encoded in inputs and outputs respectively. - [Token Scheme Semantic Validation Rules](#token-scheme-semantic-validation-rules) must be fulfilled. ### Token Scheme Semantic Validation Rules + `Token Scheme Validation` takes `Token Diff` and `Foundry Diff` and validates if the scheme constraints are respected. #### Simple Token Scheme Validation Rules + - Let `Token Diff` denote the **difference between native token balances of the input and the output side** of the transaction of the single `Token ID` that maps to the `Foundry ID`. Minting results in excess of tokens on the output side (positive diff), melting results in excess on the input side (negative diff). Now, the following conditions must hold for `Token Diff`: 1. When `Token Diff` > 0 - - `Current State(Minted Tokens) + Token Diff = Next State(Minted Tokens)`. - - `Current State(Melted Tokens) = Next State(Melted Tokens)` + - `Current State(Minted Tokens) + Token Diff = Next State(Minted Tokens)`. + - `Current State(Melted Tokens) = Next State(Melted Tokens)` 2. When `Token Diff` < 0, it must hold true that: - - `Current State(Melted Tokens) <= Next State(Melted Tokens)` - - `[Next State(Melted Tokens) - Current State(Melted Tokens)] <= |Token Diff|`. - - When `Current State(Melted Tokens) != Next State(Melted Tokens)`, it must be true that `Current State(Minted Tokens) = Next State(Minted Tokens)` + - `Current State(Melted Tokens) <= Next State(Melted Tokens)` + - `[Next State(Melted Tokens) - Current State(Melted Tokens)] <= |Token Diff|`. + - When `Current State(Melted Tokens) != Next State(Melted Tokens)`, it must be true that + `Current State(Minted Tokens) = Next State(Minted Tokens)` 3. When `Current State` is empty, `Current State(Minted Tokens) = 0` and `Current State(Melted Tokens) = 0`. 4. When `Next State` is empty, condition `1` and `2` are ignored. It must hold true, that `Current State(Minted Tokens) + Token Diff = Current State(Melted Tokens)` @@ -385,14 +394,15 @@ are encoded in inputs and outputs respectively. needs/requirements of hard coded constraints, so it is impossible to design token schemes as any possible combination of those constraints. A better design would be to have a list of possible constraints (and their related fields) from which the user can choose. The chosen combination should still be encoded as a bitmask inside the `Token ID`. -- Additional token schemes will be defined that make use of the `Foundry Diff` as well, for example validating that - a certain amount of tokens can only be minted/melted after a certain date. -- For now, only token scheme `0` is supported. Additional token schemes will be designed iteratively when the need arises. -- The `Foundry ID` of a foundry output should be queryable in indexers, so that given a `Foundry ID`, the - `Output ID` of the foundry output can be retrieved. `Foundry ID` behaves like an address that can't unlock anything. - While it is not necessarily needed for the protocol, it is needed for client side operations, such as: - - Retrieving the current state of the foundry. - - Accessing token metadata in foundry based on `Foundry ID`/`Tokend ID`. +- Additional token schemes will be defined that make use of the `Foundry Diff` as well, for example validating that a + certain amount of tokens can only be minted/melted after a certain date. +- For now, only token scheme `0` is supported. Additional token schemes will be designed iteratively when the need + arises. +- The `Foundry ID` of a foundry output should be queryable in indexers, so that given a `Foundry ID`, the `Output ID` of + the foundry output can be retrieved. `Foundry ID` behaves like an address that can't unlock anything. While it is not + necessarily needed for the protocol, it is needed for client side operations, such as: + - Retrieving the current state of the foundry. + - Accessing token metadata in foundry based on `Foundry ID`/`Tokend ID`. # Storage Deposit From 0f7be538f676690192746f0538a2d5e0f0deb6f0 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 4 Jul 2023 12:00:35 +0200 Subject: [PATCH 07/35] Add change summary --- tips/TIP-0044/tip-0044.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index 3f9617bcb..bd130f46a 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -27,6 +27,10 @@ This document defines the Foundry output type and transaction validation rules f user-defined layer 1 native tokens. The output defines the supply of such tokens. It was originally introduced in TIP-18 and the functionality defined in this document is an exact copy of the Foundry output of TIP-18. +## Summary of changes compared to TIP-18 + +- Rename "Alias" to "Account". + # Motivation The aim of this TIP is to define a Foundry output type to support seamless interoperability between layer 1 and layer 2 From 5a5e0795138212729165bd985516b2e718000db8 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 15 Aug 2023 10:48:05 +0200 Subject: [PATCH 08/35] Update storage deposit calculation offset --- tips/TIP-0044/tip-0044.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index bd130f46a..8208b06ef 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -440,23 +440,23 @@ The following table shows the Foundry Output including the possible fields and t
- - + + - + - - - + + + - + - - - + + +
Block ID (included) data32324040 The ID of the block in which the transaction payload that created this output was included.
Confirmation Milestone IndexSlot Booked data44The index of the milestone which confirmed the transaction that created the output.88The index of the slot in which the transaction that created it was booked.
Confirmation Unix TimestampSlot Created data44The unix timestamp of the milestone which confirmed the transaction that created the output.88The index of the slot in which the transaction was created.
@@ -758,12 +758,12 @@ The following table shows the Foundry Output including the possible fields and t - v_byte Minimum - 528 + v_byte Minimum (TODO: Recalculate) + 0 - v_byte Maximum - 21398 + v_byte Maximum (TODO: Recalculate) + 0 From fc9796f43ed7df38cca20b5faa174f2d22ecfc15 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 15 Aug 2023 12:46:30 +0200 Subject: [PATCH 09/35] Fix formatting issue around Foundry ID --- tips/TIP-0044/tip-0044.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index 8208b06ef..fd8d0a1ba 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -68,8 +68,8 @@ value defines `Serial Number`, while the `Token Scheme` can be chosen freely. `Foundry ID` is not allowed to change after deployment, therefore neither `Address`, nor `Serial Number` or `Token Scheme` can change during the lifetime of the foundry. -Foundries control the supply of tokens with unique identifiers, so-called `Token IDs`. The **`Token ID` of tokens -controlled by a specific foundry is the same as the **`Foundry ID`\*\*. +Foundries control the supply of tokens with unique identifiers, so-called `Token IDs`. The `Token ID` of tokens +controlled by a specific foundry is the same as the `Foundry ID`.
From 39a6eb4104f08bd566132d3806293b15c3495ccf Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 24 Aug 2023 16:04:59 +0200 Subject: [PATCH 10/35] Fix broken link --- tips/TIP-0044/tip-0044.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index fd8d0a1ba..fd74961b5 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -349,7 +349,7 @@ encoded in inputs and outputs respectively. - The foundry output must be unlocked like any other output type where the **Address Unlock Condition** defines an **Account Address**, by transitioning the account in the very same transaction. See section - [account unlocking](#unlocking-chain-script-locked-outputs) for more details. + [account unlocking](../TIP-0038/tip-0038.md#unlocking-chain-script-locked-outputs) for more details. - When the current state of the foundry with `Foundry ID` is empty, it must hold true for `Serial Number` in the next state, that: - `Foundry Counter(InputAccount) < Serial Number <= Foundry Counter(OutputAccount)` From 9e5d9e04cb1c81546460770ac090ffde83f8e0c9 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 21 Sep 2023 14:43:24 +0200 Subject: [PATCH 11/35] Format schema tables (no content changes) --- tips/TIP-0044/tip-0044.md | 1292 +++++++++++++++++++++---------------- 1 file changed, 721 insertions(+), 571 deletions(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index fd74961b5..09191f61e 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -71,230 +71,251 @@ value defines `Serial Number`, while the `Token Scheme` can be chosen freely. Foundries control the supply of tokens with unique identifiers, so-called `Token IDs`. The `Token ID` of tokens controlled by a specific foundry is the same as the `Foundry ID`. +
+ Foundry Output +
Describes a foundry output that is controlled by an account.
+
-
- Foundry Output -
- Describes a foundry output that is controlled by an account. -
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Output Typeuint8Set to value 6 to denote a Foundry Output.
Amountuint64The amount of IOTA coins 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 5 to denote a Foundry Output. -
Amountuint64The amount of IOTA coins held by the output.
Native Tokens Countuint8The number of different native tokens held by the output.
Native Tokens optAnyOf -
- Native Token - - - - - - - - - - - - - - - - -
NameTypeDescription
Token IDByteArray[38] - Identifier of the native tokens. -
Amountuint256Amount of native tokens of the given Token ID.
-
-
Serial Numberuint32The serial number of the foundry with respect to the controlling account.
Token Scheme oneOf -
- Simple Token Scheme - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Token Scheme Typeuint8 - Set to value 0 to denote an Simple Token Scheme. -
Minted Tokensuint256Amount of tokens minted by this foundry.
Melted Tokensuint256Amount of tokens melted by this foundry.
Maximum Supplyuint256Maximum supply of tokens controlled by this foundry.
-
-
Unlock Conditions Countuint8The number of unlock conditions following.
Unlock Conditions atMostOneOfEach -
- Immutable Account Address Unlock Condition - - - - - - - - - - - - - - - -
NameTypeDescription
Unlock Condition Typeuint8 - Set to value 6 to denote an Immutable Account Address Unlock Condition. -
Address -
- 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.
-
-
-
-
Features Countuint8The number of features following.
Features atMostOneOfEach -
- 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.
-
-
Immutable Features Countuint8The number of immutable features following. Immutable features are defined upon deployment of the UTXO state machine and are not allowed to change in any future state transition.
Immutable Features atMostOneOfEach -
- 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.
-
-
+ Name + + Type + + Description +
Token IDByteArray[38]Identifier of the native token.
Amountuint256Amount of native tokens of the given Token ID.
+
+
Serial Numberuint32The serial number of the foundry with respect to the controlling account.
Token Scheme oneOf +
+ Simple Token Scheme + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Token Scheme Typeuint8Set to value 0 to denote a Simple Token Scheme.
Minted Tokensuint256Amount of tokens minted by this foundry.
Melted Tokensuint256Amount of tokens melted by this foundry.
Maximum Supplyuint256Maximum supply of tokens controlled by this foundry.
+
+
Unlock Conditions Countuint8The number of unlock conditions following.
Unlock Conditions atMostOneOfEach +
+ Immutable Account Address Unlock Condition +
Defines the permanent Account Address that owns this output.
+ + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Unlock Condition Typeuint8Set to value 6 to denote an Immutable Account Address Unlock Condition.
Address oneOf +
+ 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.
+
+
-
+ +
Features Countuint8The number of features following.
Features atMostOneOfEach +
+ 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.
+
+
Immutable Features Countuint8The number of immutable features following. Immutable features are defined upon deployment of the UTXO state machine and are not allowed to change in any future state transition.
Immutable Features atMostOneOfEach +
+ 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.
+
+
## Additional Transaction Syntactic Validation Rules @@ -412,361 +433,490 @@ encoded in inputs and outputs respectively. The following table shows the Foundry Output including the possible fields and their specific weight. +
+ Foundry Output +
Describes a foundry output that is controlled by an account.
+
-
- Foundry Output -
- Describes a foundry output that is controlled by an account. -
-
- - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 6 to denote a Foundry Output.
Amount + data + 88The amount of IOTA coins 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 +
+
+
Serial Number + data + 44The serial number of the foundry with respect to the controlling account.
Token Scheme oneOf +
+ Simple Token Scheme + + + + - - - - - - - - - -
Fields - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Output Typedata11 - Set to value 5 to denote a Foundry Output. -
Amountdata88The amount of IOTA coins held by the output.
Native Tokens Countdata11The number of different 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. -
-
-
Serial Numberdata44The serial number of the foundry with respect to the controlling account.
Token Scheme oneOf -
- Simple Token Scheme - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Token Scheme Typedata11 - Set to value 0 to denote an Simple Token Scheme. -
Minted Tokensdata3232Amount of tokens minted by this foundry.
Melted Tokensdata3232Amount of tokens melted by this foundry.
Maximum Supplydata3232Maximum supply of tokens controlled by this foundry.
-
-
Unlock Conditions Countdata11The number of unlock conditions following.
Unlock Conditions atMostOneOfEach -
- Immutable Account Address Unlock Condition - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Unlock Condition Typedata11 - Set to value 6 to denote an Immutable Account Address Unlock Condition. -
Address -
- 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.
-
-
-
-
Features Countdata11The number of features following.
Features atMostOneOfEach -
- 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.
-
-
Immutable Features Countdata11The number of immutable features following. Immutable features are defined upon deployment of the UTXO state machine and are not allowed to change in any future state transition.
Immutable Features atMostOneOfEach -
- 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.
-
-
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Token Scheme Type + data + 11Set to value 0 to denote a Simple Token Scheme.
Minted Tokens + data + 3232Amount of tokens minted by this foundry.
Melted Tokens + data + 3232Amount of tokens melted by this foundry.
Maximum Supply + data + 3232Maximum supply of tokens controlled by this foundry.
-
v_byte Minimum (TODO: Recalculate)0
v_byte Maximum (TODO: Recalculate)0
-
+
+ +
Unlock Conditions Count + data + 11The number of unlock conditions following.
Unlock Conditions atMostOneOfEach +
+ Immutable Account Address Unlock Condition +
Defines the permanent Account Address that owns this output.
+ + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Unlock Condition Type + data + 11Set to value 6 to denote an Immutable Account Address Unlock Condition.
Address oneOf +
+ 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.
+
+
+
+
+
+
Features Count + data + 11The number of features following.
Features atMostOneOfEach +
+ 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 + data + 38194Binary data. A leading uint16 denotes its length.
+
+
+
Immutable Features Count + data + 11The number of immutable features following. Immutable features are defined upon deployment of the UTXO state machine and are not allowed to change in any future state transition.
Immutable Features atMostOneOfEach +
+ 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 + data + 38194Binary data. A leading uint16 denotes its length.
+
+
+
+ + + + v_byte Minimum + TODO + + + v_byte Maximum + TODO + # Copyright From 65d82c2d92ee891d6d70d0c0ad0404d26158b3cc Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 21 Sep 2023 14:45:33 +0200 Subject: [PATCH 12/35] Fix output type value --- tips/TIP-0044/tip-0044.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index 09191f61e..143365052 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -90,7 +90,7 @@ controlled by a specific foundry is the same as the `Foundry ID`. Output Type uint8 - Set to value 6 to denote a Foundry Output. + Set to value 5 to denote a Foundry Output. Amount @@ -526,7 +526,7 @@ The following table shows the Foundry Output including the possible fields and t 1 1 - Set to value 6 to denote a Foundry Output. + Set to value 5 to denote a Foundry Output. Amount From bbf5f281d1017fd4a6223133d423807097522ec8 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 22 Sep 2023 13:56:29 +0200 Subject: [PATCH 13/35] Remove descriptions from storage deposit table --- tips/TIP-0044/tip-0044.md | 80 ++++++++++++--------------------------- 1 file changed, 24 insertions(+), 56 deletions(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index 143365052..641d07907 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -100,7 +100,7 @@ controlled by a specific foundry is the same as the `Foundry ID`. 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 @@ -122,7 +122,7 @@ controlled by a specific foundry is the same as the `Foundry ID`. Token ID ByteArray[38] - Identifier of the native token. + Identifier of the native token. Its derivation is defined in TIP-44. Amount @@ -455,9 +455,6 @@ The following table shows the Foundry Output including the possible fields and t Length Maximum - - Description - OutputID @@ -466,7 +463,6 @@ The following table shows the Foundry Output including the possible fields and t 34 34 - The ID of the output. Block ID (included) @@ -475,7 +471,6 @@ The following table shows the Foundry Output including the possible fields and t 40 40 - The ID of the block in which the transaction payload that created this output was included. Slot Booked @@ -484,7 +479,6 @@ The following table shows the Foundry Output including the possible fields and t 8 8 - The index of the slot in which the transaction that created it was booked. Slot Created @@ -493,7 +487,6 @@ The following table shows the Foundry Output including the possible fields and t 8 8 - The index of the slot in which the transaction was created. @@ -515,9 +508,6 @@ The following table shows the Foundry Output including the possible fields and t Length Maximum - - Description - Output Type @@ -526,7 +516,6 @@ The following table shows the Foundry Output including the possible fields and t 1 1 - Set to value 5 to denote a Foundry Output. Amount @@ -535,7 +524,6 @@ The following table shows the Foundry Output including the possible fields and t 8 8 - The amount of IOTA coins held by the output. Native Tokens Count @@ -544,7 +532,6 @@ The following table shows the Foundry Output including the possible fields and t 1 1 - The number of native tokens held by the output. Native Tokens optAnyOf @@ -569,9 +556,6 @@ The following table shows the Foundry Output including the possible fields and t Length Maximum - - Description - Token ID @@ -580,7 +564,6 @@ The following table shows the Foundry Output including the possible fields and t 38 38 - Identifier of the native token. Amount @@ -589,7 +572,6 @@ The following table shows the Foundry Output including the possible fields and t 32 32 - Amount of native tokens of the given Token ID. @@ -605,7 +587,6 @@ The following table shows the Foundry Output including the possible fields and t 4 4 - The serial number of the foundry with respect to the controlling account. Token Scheme oneOf @@ -630,9 +611,6 @@ The following table shows the Foundry Output including the possible fields and t Length Maximum - - Description - Token Scheme Type @@ -641,7 +619,6 @@ The following table shows the Foundry Output including the possible fields and t 1 1 - Set to value 0 to denote a Simple Token Scheme. Minted Tokens @@ -650,7 +627,6 @@ The following table shows the Foundry Output including the possible fields and t 32 32 - Amount of tokens minted by this foundry. Melted Tokens @@ -659,7 +635,6 @@ The following table shows the Foundry Output including the possible fields and t 32 32 - Amount of tokens melted by this foundry. Maximum Supply @@ -668,7 +643,6 @@ The following table shows the Foundry Output including the possible fields and t 32 32 - Maximum supply of tokens controlled by this foundry. @@ -684,7 +658,6 @@ The following table shows the Foundry Output including the possible fields and t 1 1 - The number of unlock conditions following. Unlock Conditions atMostOneOfEach @@ -710,9 +683,6 @@ The following table shows the Foundry Output including the possible fields and t Length Maximum - - Description - Unlock Condition Type @@ -721,7 +691,6 @@ The following table shows the Foundry Output including the possible fields and t 1 1 - Set to value 6 to denote an Immutable Account Address Unlock Condition. Address oneOf @@ -746,9 +715,6 @@ The following table shows the Foundry Output including the possible fields and t Length Maximum - - Description - Address Type @@ -757,7 +723,6 @@ The following table shows the Foundry Output including the possible fields and t 1 1 - Set to value 8 to denote an Account Address. Account ID @@ -766,7 +731,6 @@ The following table shows the Foundry Output including the possible fields and t 32 32 - The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -789,7 +753,6 @@ The following table shows the Foundry Output including the possible fields and t 1 1 - The number of features following. Features atMostOneOfEach @@ -815,9 +778,6 @@ The following table shows the Foundry Output including the possible fields and t Length Maximum - - Description - Feature Type @@ -826,16 +786,22 @@ The following table shows the Foundry Output including the possible fields and t 1 1 - Set to value 2 to denote a Metadata Feature. + + + Data Length + + data + + 2 + 2 Data data - 3 - 8194 - Binary data. A leading uint16 denotes its length. + 1 + 8192 @@ -851,7 +817,6 @@ The following table shows the Foundry Output including the possible fields and t 1 1 - The number of immutable features following. Immutable features are defined upon deployment of the UTXO state machine and are not allowed to change in any future state transition. Immutable Features atMostOneOfEach @@ -877,9 +842,6 @@ The following table shows the Foundry Output including the possible fields and t Length Maximum - - Description - Feature Type @@ -888,16 +850,22 @@ The following table shows the Foundry Output including the possible fields and t 1 1 - Set to value 2 to denote a Metadata Feature. + + + Data Length + + data + + 2 + 2 Data data - 3 - 8194 - Binary data. A leading uint16 denotes its length. + 1 + 8192 @@ -911,11 +879,11 @@ The following table shows the Foundry Output including the possible fields and t v_byte Minimum - TODO + 544 v_byte Maximum - TODO + 21414 From b3de91b981eb5d500c55535322a8cadba09716c7 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 27 Sep 2023 10:35:56 +0200 Subject: [PATCH 14/35] Add Immutable Acc Addr UC --- tips/TIP-0044/tip-0044.md | 79 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 73 insertions(+), 6 deletions(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index 641d07907..fbd5ad863 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -17,9 +17,10 @@ replaces: TIP-18 1. [Summary](#summary) 2. [Motivation](#motivation) 3. [Building Blocks](#building-blocks) -4. [Foundry Output](#foundry-output) -5. [Storage Deposit](#storage-deposit) -6. [Copyright](#copyright) +4. [Immutable Account Address Unlock Condition](#immutable-account-address-unlock-condition) +5. [Foundry Output](#foundry-output) +6. [Storage Deposit](#storage-deposit) +7. [Copyright](#copyright) # Summary @@ -43,15 +44,81 @@ transferred with zero fees. 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 [TIP-45](../TIP-0045/tip-0045.md) is the basis for output validation in this TIP. +# Immutable Account Address Unlock Condition + +An unlock condition defined for chain constrained UTXOs that can only be unlocked by a permanent Account Address. + +Output unlocking is functionally equivalent to an Address Unlock Condition with an Account Address, +however there are additional transition constraints: the next state of the UTXO machine must have the same Immutable +Account Address Unlock Condition. + +
+ Immutable Account Address Unlock Condition +
Defines the permanent Account Address that owns this output.
+
+ + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Unlock Condition Typeuint8Set to value 6 to denote an Immutable Account Address Unlock Condition.
Address oneOf +
+ 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.
+
+
+ +### Additional semantic transaction validation rules: + +- The output must be unlocked with an [Account Unlock](#account-unlock-semantic-validation). +- The next state of the UTXO state machine must have the same Immutable Account Address Unlock Condition defined. + # Foundry Output A foundry output is an output that **controls the supply of user defined native tokens.** It can mint and melt tokens From ac395dc0f94a770a116741c77e97b54a8c37f767 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 29 Sep 2023 17:31:15 +0200 Subject: [PATCH 15/35] Use protocol parameter Token Supply in amount rule --- tips/TIP-0044/tip-0044.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index fbd5ad863..948ba73c6 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -389,8 +389,8 @@ controlled by a specific foundry is the same as the `Foundry ID`. ### Output Syntactic Validation -- `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 2292b7f0531db49cb1fbee44973afa3b8b28c825 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 4 Oct 2023 16:09:20 +0200 Subject: [PATCH 16/35] Add Native Tok. Feat & Token ID == Foundry ID rule --- tips/TIP-0044/tip-0044.md | 85 ++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 45 deletions(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index 948ba73c6..b7c218225 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -164,42 +164,6 @@ controlled by a specific foundry is the same as the `Foundry ID`. uint64 The amount of IOTA coins 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.
-
- - Serial Number uint32 @@ -210,6 +174,7 @@ controlled by a specific foundry is the same as the `Foundry ID`.
Simple Token Scheme +
A Token Scheme which allows for minting and melting Native Tokens up to the maximum supply. Defined in TIP-44 (Simple Token Scheme).
@@ -256,7 +221,7 @@ controlled by a specific foundry is the same as the `Foundry ID`.
Immutable Account Address Unlock Condition -
Defines the permanent Account Address that owns this output.
+
Defines the permanent Account Address that owns this output. Defined in TIP-44 (Immutable Account Address Unlock Condition).
@@ -279,6 +244,7 @@ controlled by a specific foundry is the same as the `Foundry ID`.
Account Address +
An Address derived from an Account ID which can be unlocked by unlocking the corresponding Account. Defined in TIP-38 (Account Address).
@@ -356,7 +354,7 @@ controlled by a specific foundry is the same as the `Foundry ID`.
@@ -319,7 +285,7 @@ controlled by a specific foundry is the same as the `Foundry ID`.
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).
@@ -344,6 +310,38 @@ controlled by a specific foundry is the same as the `Foundry ID`.
+
+ 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 (Foundry Output).
Amountuint256Amount of native tokens of the given Token ID.
+
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).
- + From 8d77ef805cf591be4ed77667f512f5c7e66af9bc Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 23 Oct 2023 12:58:24 +0100 Subject: [PATCH 23/35] Remove manually added Table of Contents GitHub and the Wiki both auto-generate a ToC, so it's unnecessary to maintain it. --- tips/TIP-0044/tip-0044.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index df1916cd3..1d42ff542 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -12,15 +12,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. [Immutable Account Address Unlock Condition](#immutable-account-address-unlock-condition) -5. [Foundry Output](#foundry-output) -6. [Copyright](#copyright) - # Summary This document defines the Foundry output type and transaction validation rules for the IOTA protocol to support From 174cfe093b3e412778df81934686b4cc07c85d87 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 23 Oct 2023 12:58:49 +0100 Subject: [PATCH 24/35] Format Markdown --- tips/TIP-0044/tip-0044.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index 1d42ff542..7943c4ec4 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -2,7 +2,9 @@ tip: 44 title: Foundry Output Type description: Layer 1 Native Token Foundries -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 @@ -21,7 +23,8 @@ and the functionality defined in this document is an exact copy of the Foundry o ## Summary of changes compared to TIP-18 - Rename "Alias" to "Account". -- Remove `Native Tokens` field and add `Native Token Feature` to 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 allowed features. See + [TIP-38 (Native Token Migration)](../TIP-0038/tip-0038.md#native-token-migration) for migration details. # Motivation @@ -391,7 +394,8 @@ controlled by a specific foundry is the same as the `Foundry ID`. - It must hold true that `0` ≤ `Immutable Features Count` ≤ `1`. - `Feature Type` of a Feature in `Immutable Features` must define one of the following types: - Metadata Feature -- If a _Native Token Feature_ is present in `Features`, its `Token ID` must match the `Foundry ID` of the foundry in which it is contained. +- If a _Native Token Feature_ is present in `Features`, its `Token ID` must match the `Foundry ID` of the foundry in + which it is contained. - Syntactic validation of all present features must pass. - `Token Scheme` must define one of the following types: - Simple Token Scheme From 6930c0279001efb4836ffa221fc64d82cb455803 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 23 Oct 2023 18:13:27 +0100 Subject: [PATCH 25/35] Remove unimportant summary mention --- tips/TIP-0044/tip-0044.md | 1 - 1 file changed, 1 deletion(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index 7943c4ec4..9763d5ec2 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -22,7 +22,6 @@ and the functionality defined in this document is an exact copy of the Foundry o ## Summary of changes compared to TIP-18 -- Rename "Alias" to "Account". - Remove `Native Tokens` field and add `Native Token Feature` to allowed features. See [TIP-38 (Native Token Migration)](../TIP-0038/tip-0038.md#native-token-migration) for migration details. From 5d61a18c91b2992bf6d84557e5d97277510944fc Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 26 Oct 2023 11:29:39 +0100 Subject: [PATCH 26/35] Add can destroy tx capability flag rule --- tips/TIP-0044/tip-0044.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index 9763d5ec2..18cdda78d 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -424,9 +424,9 @@ encoded in inputs and outputs respectively. | Transitions the foundry | Input with `Foundry ID` | Output with `Foundry ID` | | Destroys the foundry | Input with `Foundry ID` | Empty | -- The foundry output must be unlocked like any other output type where the **Address Unlock Condition** defines an - **Account Address**, by transitioning the account in the very same transaction. See section - [account unlocking](../TIP-0038/tip-0038.md#unlocking-chain-script-locked-outputs) for more details. +- The foundry output must be unlocked like any other output type where the **Immutable Account Address Unlock + Condition** defines an **Account Address**, by transitioning the account in the very same transaction. See + [TIP-42 (Account Locking & Unlocking)](../TIP-0042/tip-0042.md#account-locking--unlocking) for more details. - When the current state of the foundry with `Foundry ID` is empty, it must hold true for `Serial Number` in the next state, that: - `Foundry Counter(InputAccount) < Serial Number <= Foundry Counter(OutputAccount)` @@ -444,6 +444,8 @@ encoded in inputs and outputs respectively. - `Token Scheme Type` must not change. - Features in `Immutable Features` must not change. - [Token Scheme Semantic Validation Rules](#token-scheme-semantic-validation-rules) must be fulfilled. +- When the Next State is empty, the transaction is invalid if the _Can Destroy Foundry Outputs_ flag in the _Transaction + Capabilities_ is **unset**. ### Token Scheme Semantic Validation Rules From aeb755f778582e45acf707be62c5113b0b84cc55 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 3 Nov 2023 10:00:42 +0100 Subject: [PATCH 27/35] Update Foundry type and add Account Addr descr. --- tips/TIP-0044/tip-0044.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index 18cdda78d..79b7d8df5 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -79,6 +79,7 @@ Account Address Unlock Condition.
@@ -391,21 +389,18 @@ controlled by a specific foundry is the same as the `Foundry ID`. - `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 `Unlock Conditions Count` = `1`. - `Unlock Condition Type` of an Unlock Condition must define one of the following types: - Immutable Account Address Unlock Condition - Syntactic validation of all present unlock conditions must pass. -- It must hold true that `0` ≤ `Features Count` ≤ `1`. +- It must hold true that `0` ≤ `Features Count` ≤ `2`. - `Feature Type` of a Feature in `Features` must define one of the following types: - Metadata Feature + - Native Token Feature - It must hold true that `0` ≤ `Immutable Features Count` ≤ `1`. - `Feature Type` of a Feature in `Immutable Features` must define one of the following types: - Metadata Feature +- If a _Native Token Feature_ is present in `Features`, its `Token ID` must match the `Foundry ID` of the foundry in which it is contained. - Syntactic validation of all present features must pass. - `Token Scheme` must define one of the following types: - Simple Token Scheme From 9b36e15c95607568472fca047aa4226d7dd6b182 Mon Sep 17 00:00:00 2001 From: Roman Overko Date: Mon, 16 Oct 2023 10:43:39 +0200 Subject: [PATCH 17/35] Add Roman as author --- tips/TIP-0044/tip-0044.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index b7c218225..d194136b3 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -2,7 +2,8 @@ tip: 44 title: Foundry Output Type description: Support for layer 1 native token foundries -author: TODO +author: + TODO, Roman Overko (@roman1e2f5p8s) discussions-to: TODO status: Draft type: Standards From cc9f34840dce42a1f15678e258b15ba71ebcca45 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 16 Oct 2023 11:06:18 +0100 Subject: [PATCH 18/35] Add authors --- tips/TIP-0044/tip-0044.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index d194136b3..2aabd4321 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -1,9 +1,8 @@ --- tip: 44 title: Foundry Output Type -description: Support for layer 1 native token foundries -author: - TODO, Roman Overko (@roman1e2f5p8s) +description: Layer 1 Native Token Foundries +author: Philipp Gackstatter (@PhilippGackstatter) , Levente Pap (@lzpap) , Roman Overko (@roman1e2f5p8s) discussions-to: TODO status: Draft type: Standards From 436b71a94a569643f7ab58f33985041cfc4c2343 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 16 Oct 2023 13:22:49 +0100 Subject: [PATCH 19/35] Add native token migration notice --- tips/TIP-0044/tip-0044.md | 1 + 1 file changed, 1 insertion(+) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index 2aabd4321..efa36ad9c 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -31,6 +31,7 @@ and the functionality defined in this document is an exact copy of the Foundry o ## Summary of changes compared to TIP-18 - Rename "Alias" to "Account". +- Remove `Native Tokens` field and add `Native Token Feature` to allowed features. See [TIP-38 (Native Token Migration)](../TIP-0038/tip-0038.md#native-token-migration) for migration details. # Motivation From ffffc2f378ce98131f3a66da8bf9ba1e57e9c2a4 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 16 Oct 2023 13:23:15 +0100 Subject: [PATCH 20/35] Remove storage deposit table --- tips/TIP-0044/tip-0044.md | 461 +------------------------------------- 1 file changed, 1 insertion(+), 460 deletions(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index efa36ad9c..c63b43df1 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -19,8 +19,7 @@ replaces: TIP-18 3. [Building Blocks](#building-blocks) 4. [Immutable Account Address Unlock Condition](#immutable-account-address-unlock-condition) 5. [Foundry Output](#foundry-output) -6. [Storage Deposit](#storage-deposit) -7. [Copyright](#copyright) +6. [Copyright](#copyright) # Summary @@ -492,464 +491,6 @@ encoded in inputs and outputs respectively. - Retrieving the current state of the foundry. - Accessing token metadata in foundry based on `Foundry ID`/`Tokend ID`. -# Storage Deposit - -The following table shows the Foundry Output including the possible fields and their specific weight. - -
- Foundry Output -
Describes a foundry output that is controlled by an account.
-
- - - - - - - - - - - - - - - - - -
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
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
-
-
-
Serial Number - data - 44
Token Scheme oneOf -
- Simple Token Scheme - - - - - -
Fields - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Token Scheme Type - data - 11
Minted Tokens - data - 3232
Melted Tokens - data - 3232
Maximum Supply - data - 3232
-
-
-
Unlock Conditions Count - data - 11
Unlock Conditions atMostOneOfEach -
- Immutable Account Address Unlock Condition -
Defines the permanent Account Address that owns this output.
- - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Unlock Condition Type - data - 11
Address oneOf -
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
-
-
-
Features Count - data - 11
Features atMostOneOfEach -
- 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
-
-
-
Immutable Features Count - data - 11
Immutable Features atMostOneOfEach -
- 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
-
-
-
-
v_byte Minimum544
v_byte Maximum21414
- # Copyright Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From 1d8c21042a2fa06116e8f2b35d280b42515b3c63 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 16 Oct 2023 13:46:04 +0100 Subject: [PATCH 21/35] Fix Token ID typo --- tips/TIP-0044/tip-0044.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index c63b43df1..d423dee4e 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -489,7 +489,7 @@ encoded in inputs and outputs respectively. the foundry output can be retrieved. `Foundry ID` behaves like an address that can't unlock anything. While it is not necessarily needed for the protocol, it is needed for client side operations, such as: - Retrieving the current state of the foundry. - - Accessing token metadata in foundry based on `Foundry ID`/`Tokend ID`. + - Accessing token metadata in foundry based on `Foundry ID`/`Token ID`. # Copyright From 225edf67eab1357de9d3262ad06130350f7b6400 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 17 Oct 2023 14:50:39 +0100 Subject: [PATCH 22/35] Set new Foundry Output type prefix --- tips/TIP-0044/tip-0044.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index d423dee4e..df1916cd3 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -157,7 +157,7 @@ controlled by a specific foundry is the same as the `Foundry ID`.
Output Type uint8Set to value 5 to denote a Foundry Output.Set to value 2 to denote a Foundry Output.
Amount
Account Address +
An Address derived from an Account ID which can be unlocked by unlocking the corresponding Account. Defined in TIP-38 (Account Address).
- + @@ -167,7 +168,7 @@ controlled by a specific foundry is the same as the `Foundry ID`.
@@ -150,7 +151,7 @@ controlled by a specific foundry is the same as the `Foundry ID`.
Output Type uint8Set to value 2 to denote a Foundry Output.Set to value 3 to denote a Foundry Output.
Amount
Simple Token Scheme -
A Token Scheme which allows for minting and melting Native Tokens up to the maximum supply. Defined in TIP-44 (Simple Token Scheme).
+
A Token Scheme which allows for minting and melting Native Tokens up to the maximum supply.
- + @@ -348,7 +380,7 @@ controlled by a specific foundry is the same as the `Foundry ID`. - + @@ -424,7 +424,7 @@ controlled by a specific foundry is the same as the `Foundry ID`. - + From 6a20be4531045b0a36ac25836a3ce7d171f00b94 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 19 Mar 2024 12:18:20 +0100 Subject: [PATCH 35/35] Do not allow burning while melting --- tips/TIP-0044/tip-0044.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index 193615444..8b256c457 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -525,7 +525,7 @@ encoded in inputs and outputs respectively. - `Current State(Melted Tokens) = Next State(Melted Tokens)` 2. When `Token Diff` < 0, it must hold true that: - `Current State(Melted Tokens) <= Next State(Melted Tokens)` - - `[Next State(Melted Tokens) - Current State(Melted Tokens)] <= |Token Diff|`. + - `[Next State(Melted Tokens) - Current State(Melted Tokens)] == |Token Diff|`. - When `Current State(Melted Tokens) != Next State(Melted Tokens)`, it must be true that `Current State(Minted Tokens) = Next State(Minted Tokens)` 3. When `Current State` is empty, `Current State(Minted Tokens) = 0` and `Current State(Melted Tokens) = 0`.
From 2afd7dafba4e9247f5e41b91aeed4b1823de7c48 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 3 Nov 2023 11:07:35 +0100 Subject: [PATCH 28/35] Format Markdown --- tips/TIP-0044/tip-0044.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index 79b7d8df5..1ee985507 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -110,7 +110,7 @@ Account Address Unlock Condition. ### Additional semantic transaction validation rules: -- The output must be unlocked with an [Account Unlock](#account-unlock-semantic-validation). +- The output must be unlocked with an [_Account Unlock_](#account-unlock-semantic-validation). - The next state of the UTXO state machine must have the same Immutable Account Address Unlock Condition defined. # Foundry Output From 1786fa3c5d2ec5e49ab3b2181c2211baea270b09 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 8 Nov 2023 13:43:09 +0100 Subject: [PATCH 29/35] Remove `Amount <= Token Supply` check --- tips/TIP-0044/tip-0044.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index 1ee985507..8e46cde3c 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -381,8 +381,8 @@ controlled by a specific foundry is the same as the `Foundry ID`. ### Output Syntactic Validation -- `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 `Unlock Conditions Count` = `1`. - `Unlock Condition Type` of an Unlock Condition must define one of the following types: - Immutable Account Address Unlock Condition From 4e22d7ed7f30fa9bc442ec8bf3c057f4db62e69f Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 8 Nov 2023 15:43:38 +0100 Subject: [PATCH 30/35] Remove `Amount` rules (moved to TIP-45) --- tips/TIP-0044/tip-0044.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index 8e46cde3c..0871285a9 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -381,8 +381,6 @@ controlled by a specific foundry is the same as the `Foundry ID`. ### Output Syntactic Validation -- `Amount` field must not be `0`. -- `Amount` field must fulfill the [storage deposit requirements](../TIP-0047/tip-0047.md). - It must hold true that `Unlock Conditions Count` = `1`. - `Unlock Condition Type` of an Unlock Condition must define one of the following types: - Immutable Account Address Unlock Condition From f050d0b8f4c4d20736a05480096b9d13abe84e41 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 20 Nov 2023 12:50:43 +0100 Subject: [PATCH 31/35] Update feat type prefixes, replace metadata feat --- tips/TIP-0044/tip-0044.md | 82 ++++++++++++++++++++++++++++++++++----- 1 file changed, 73 insertions(+), 9 deletions(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index 0871285a9..668e78c17 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -279,7 +279,7 @@ controlled by a specific foundry is the same as the `Foundry ID`.
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).
- - - + + + + + + +
@@ -298,9 +298,41 @@ controlled by a specific foundry is the same as the `Foundry ID`. 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.
+
+
@@ -322,7 +354,7 @@ controlled by a specific foundry is the same as the `Foundry ID`.
Feature Type uint8Set to value 4 to denote a Native Token Feature.Set to value 5 to denote a Native Token Feature.
Token ID
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).
- - - + + + + + + +
@@ -367,9 +399,41 @@ controlled by a specific foundry is the same as the `Foundry ID`. 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.
+
+
From e9638a10dc23a1dce937149ac98e1167b53bce9a Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 21 Dec 2023 14:06:12 +0100 Subject: [PATCH 32/35] Add storage score test vector --- tips/TIP-0044/tip-0044.md | 55 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index 668e78c17..9a3a6f07f 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -550,6 +550,61 @@ encoded in inputs and outputs respectively. - Retrieving the current state of the foundry. - Accessing token metadata in foundry based on `Foundry ID`/`Token ID`. +# 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). + +Foundry Output (json-encoded): + +```json +{ + "type": 3, + "amount": "420000000", + "serialNumber": 0, + "tokenScheme": { + "type": 0, + "mintedTokens": "0x9c40", + "meltedTokens": "0x2710", + "maximumSupply": "0xc350" + }, + "unlockConditions": [ + { + "type": 6, + "address": { + "type": 8, + "accountId": "0x17432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a" + } + } + ], + "features": [ + { + "type": 2, + "entries": { + "iota": "0x322e3030303030303030303030303030303030303030303030303030303030303030303030303030303030303030" + } + }, + { + "type": 5, + "id": "0x0817432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a0000000000", + "amount": "0xa410" + } + ] +} +``` + +Foundry Output (hex-encoded binary serialization): + +``` +0x0300b10819000000000000000000409c000000000000000000000000000000000000000000000000000000000000102700000000000000000000000000000000000000000000000000000000000050c300000000000000000000000000000000000000000000000000000000000001060817432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a02020104696f74612e00322e3030303030303030303030303030303030303030303030303030303030303030303030303030303030303030050817432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000000000010a400000000000000000000000000000000000000000000000000000000000000 +``` + +Foundry Output Storage Score: `361`. + # Copyright Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From d1a64c9bb44c007f8366e5fd22dae3207d3ae679 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 17 Jan 2024 16:35:13 +0100 Subject: [PATCH 33/35] Set valid serial number in test vector --- tips/TIP-0044/tip-0044.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index 9a3a6f07f..0ec418ab2 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -565,7 +565,7 @@ Foundry Output (json-encoded): { "type": 3, "amount": "420000000", - "serialNumber": 0, + "serialNumber": 1, "tokenScheme": { "type": 0, "mintedTokens": "0x9c40", @@ -590,7 +590,7 @@ Foundry Output (json-encoded): }, { "type": 5, - "id": "0x0817432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a0000000000", + "id": "0x0817432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a0100000000", "amount": "0xa410" } ] @@ -600,7 +600,7 @@ Foundry Output (json-encoded): Foundry Output (hex-encoded binary serialization): ``` -0x0300b10819000000000000000000409c000000000000000000000000000000000000000000000000000000000000102700000000000000000000000000000000000000000000000000000000000050c300000000000000000000000000000000000000000000000000000000000001060817432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a02020104696f74612e00322e3030303030303030303030303030303030303030303030303030303030303030303030303030303030303030050817432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a000000000010a400000000000000000000000000000000000000000000000000000000000000 +0x0300b10819000000000100000000409c000000000000000000000000000000000000000000000000000000000000102700000000000000000000000000000000000000000000000000000000000050c300000000000000000000000000000000000000000000000000000000000001060817432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a02020104696f74612e00322e3030303030303030303030303030303030303030303030303030303030303030303030303030303030303030050817432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a010000000010a400000000000000000000000000000000000000000000000000000000000000 ``` Foundry Output Storage Score: `361`. From 79b0927d64cde0ca2a9da43f73d6f36a91dbf0a6 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 25 Jan 2024 10:00:41 +0100 Subject: [PATCH 34/35] Update metadata feature description --- tips/TIP-0044/tip-0044.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0044/tip-0044.md b/tips/TIP-0044/tip-0044.md index 0ec418ab2..193615444 100644 --- a/tips/TIP-0044/tip-0044.md +++ b/tips/TIP-0044/tip-0044.md @@ -323,7 +323,7 @@ controlled by a specific foundry is the same as the `Foundry ID`.
Key (uint8)ByteArrayA 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
Key (uint8)ByteArrayA 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