This repository has been archived by the owner on Nov 15, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Uniques: An economically-secure basic-featured NFT pallet #8813
Merged
Merged
Changes from 48 commits
Commits
Show all changes
61 commits
Select commit
Hold shift + click to select a range
2d98b0d
Uniques: An economically-secure basic-featured NFT pallet
gavofyork 628b1bd
Merge remote-tracking branch 'origin/master' into gav-uniques
gavofyork aa84878
force_transfer
gavofyork 0c0c4cb
freeze/thaw
gavofyork a203c1f
team management
gavofyork b2c20f8
approvals
gavofyork f98dcaf
Fixes
gavofyork da78f22
force_asset_status
gavofyork ee5f32a
class_metadata
gavofyork c148760
instance metadata
gavofyork ec47648
Fixes
gavofyork 2949d12
use nmap
gavofyork 30f2f9e
Fixes
gavofyork 00c8e04
class metadata has information field
gavofyork 326beba
Intiial mock/tests and a fix
gavofyork f5c9d1d
Remove impl_non_fungibles
gavofyork 7874135
Docs
gavofyork 6a231a8
Update frame/uniques/src/lib.rs
gavofyork 4699b23
Update frame/uniques/src/lib.rs
gavofyork fb6ea03
Update frame/uniques/src/lib.rs
gavofyork 87cc1d8
Update frame/uniques/src/lib.rs
gavofyork 3ad9a52
Merge remote-tracking branch 'origin/master' into gav-uniques
gavofyork 8e8b4df
Reserve, don't transfer.
gavofyork 01f9713
Fixes
gavofyork 4bf6f54
Tests
gavofyork 821de3d
Tests
gavofyork d410298
refresh_deposit
gavofyork d703510
Tests and proper handling of metdata destruction
gavofyork 59ff5e9
test burn
gavofyork 4be8928
Tests
gavofyork de1eb5a
Update impl_fungibles.rs
gavofyork 53c666c
Initial benchmarking
gavofyork 1545abe
benchmark
gavofyork 24e08cc
Fixes
gavofyork 3027c7b
Merge branch 'master' of https://github.com/paritytech/substrate into…
da6f748
cargo run --release --features=runtime-benchmarks --manifest-path=bin…
95e49b9
Attributes
gavofyork ccaf6ec
Attribute metadata
gavofyork c51153f
Fixes
gavofyork 5361afb
Update frame/uniques/README.md
gavofyork 87ab1b4
Merge branch 'gav-uniques-attributes' into gav-uniques
gavofyork 8a45594
Docs
gavofyork dad10a7
Docs
gavofyork 33fd4a8
Docs
gavofyork 31c6e03
Simple metadata
gavofyork 092127c
Use BoundedVec
gavofyork 67b190b
Merge branch 'master' of https://github.com/paritytech/substrate into…
f9f6f51
cargo run --release --features=runtime-benchmarks --manifest-path=bin…
f38e9b9
Update frame/uniques/src/lib.rs
gavofyork 04c900a
Update frame/uniques/src/lib.rs
gavofyork d41c1b4
Update frame/uniques/src/lib.rs
gavofyork 7353b34
Update frame/uniques/src/lib.rs
gavofyork f84688d
Update frame/uniques/src/lib.rs
gavofyork bd82d6e
Fixes
gavofyork dce127c
Merge branch 'gav-uniques' of github.com:paritytech/substrate into ga…
gavofyork ca0b97c
Update frame/uniques/README.md
gavofyork 59dbd0f
Update frame/uniques/README.md
gavofyork 2e36b5c
Update frame/uniques/README.md
gavofyork f50d089
Docs
gavofyork f240bc4
Bump
gavofyork 765a780
Merge branch 'master' into gav-uniques
gavofyork File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
[package] | ||
name = "pallet-uniques" | ||
version = "3.0.0" | ||
authors = ["Parity Technologies <admin@parity.io>"] | ||
edition = "2018" | ||
license = "Apache-2.0" | ||
homepage = "https://substrate.dev" | ||
repository = "https://github.com/paritytech/substrate/" | ||
description = "FRAME NFT asset management pallet" | ||
readme = "README.md" | ||
|
||
[package.metadata.docs.rs] | ||
targets = ["x86_64-unknown-linux-gnu"] | ||
|
||
[dependencies] | ||
codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false } | ||
sp-std = { version = "3.0.0", default-features = false, path = "../../primitives/std" } | ||
sp-core = { version = "3.0.0", default-features = false, path = "../../primitives/core" } | ||
sp-runtime = { version = "3.0.0", default-features = false, path = "../../primitives/runtime" } | ||
frame-support = { version = "3.0.0", default-features = false, path = "../support" } | ||
frame-system = { version = "3.0.0", default-features = false, path = "../system" } | ||
frame-benchmarking = { version = "3.1.0", default-features = false, path = "../benchmarking", optional = true } | ||
|
||
[dev-dependencies] | ||
sp-std = { version = "3.0.0", path = "../../primitives/std" } | ||
sp-core = { version = "3.0.0", path = "../../primitives/core" } | ||
sp-io = { version = "3.0.0", path = "../../primitives/io" } | ||
pallet-balances = { version = "3.0.0", path = "../balances" } | ||
|
||
[features] | ||
default = ["std"] | ||
std = [ | ||
"codec/std", | ||
"sp-std/std", | ||
"sp-core/std", | ||
"sp-runtime/std", | ||
"frame-support/std", | ||
"frame-system/std", | ||
"frame-benchmarking/std", | ||
] | ||
runtime-benchmarks = [ | ||
"frame-benchmarking", | ||
"sp-runtime/runtime-benchmarks", | ||
"frame-system/runtime-benchmarks", | ||
] | ||
try-runtime = ["frame-support/try-runtime"] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
# Uniques Module | ||
|
||
A simple, secure module for dealing with fungible assets. | ||
gavofyork marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
## Overview | ||
|
||
The Assets module provides functionality for asset management of fungible asset classes | ||
with a fixed supply, including: | ||
gavofyork marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
* Asset Issuance | ||
* Asset Transfer | ||
* Asset Destruction | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. should be deleted or updated |
||
|
||
To use it in your runtime, you need to implement the assets [`assets::Trait`](https://docs.rs/pallet-assets/latest/pallet_assets/trait.Trait.html). | ||
|
||
The supported dispatchable functions are documented in the [`assets::Call`](https://docs.rs/pallet-assets/latest/pallet_assets/enum.Call.html) enum. | ||
gavofyork marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
### Terminology | ||
|
||
* **Asset issuance:** The creation of a new asset, whose total supply will belong to the | ||
account that issues the asset. | ||
* **Asset transfer:** The action of transferring assets from one account to another. | ||
* **Asset destruction:** The process of an account removing its entire holding of an asset. | ||
* **Fungible asset:** An asset whose units are interchangeable. | ||
* **Non-fungible asset:** An asset for which each unit has unique characteristics. | ||
|
||
### Goals | ||
|
||
The assets system in Substrate is designed to make the following possible: | ||
|
||
* Issue a unique asset to its creator's account. | ||
* Move assets between accounts. | ||
* Remove an account's balance of an asset when requested by that account's owner and update | ||
the asset's total supply. | ||
|
||
## Interface | ||
|
||
### Dispatchable Functions | ||
|
||
* `issue` - Issues the total supply of a new fungible asset to the account of the caller of the function. | ||
* `transfer` - Transfers an `amount` of units of fungible asset `id` from the balance of | ||
the function caller's account (`origin`) to a `target` account. | ||
* `destroy` - Destroys the entire holding of a fungible asset `id` associated with the account | ||
that called the function. | ||
|
||
Please refer to the [`Call`](https://docs.rs/pallet-assets/latest/pallet_assets/enum.Call.html) enum and its associated variants for documentation on each function. | ||
|
||
### Public Functions | ||
<!-- Original author of descriptions: @gavofyork --> | ||
|
||
* `balance` - Get the asset `id` balance of `who`. | ||
* `total_supply` - Get the total supply of an asset `id`. | ||
|
||
Please refer to the [`Module`](https://docs.rs/pallet-assets/latest/pallet_assets/struct.Module.html) struct for details on publicly available functions. | ||
|
||
## Usage | ||
|
||
The following example shows how to use the Assets module in your runtime by exposing public functions to: | ||
|
||
* Issue a new fungible asset for a token distribution event (airdrop). | ||
* Query the fungible asset holding balance of an account. | ||
* Query the total supply of a fungible asset that has been issued. | ||
|
||
### Prerequisites | ||
|
||
Import the Assets module and types and derive your runtime's configuration traits from the Assets module trait. | ||
|
||
### Simple Code Snippet | ||
|
||
```rust | ||
use pallet_assets as assets; | ||
use frame_support::{decl_module, dispatch, ensure}; | ||
use frame_system::ensure_signed; | ||
use sp_runtime::ArithmeticError; | ||
|
||
pub trait Config: assets::Config { } | ||
|
||
decl_module! { | ||
pub struct Module<T: Config> for enum Call where origin: T::Origin { | ||
pub fn issue_token_airdrop(origin) -> dispatch::DispatchResult { | ||
let sender = ensure_signed(origin).map_err(|e| e.as_str())?; | ||
|
||
const ACCOUNT_ALICE: u64 = 1; | ||
const ACCOUNT_BOB: u64 = 2; | ||
const COUNT_AIRDROP_RECIPIENTS: u64 = 2; | ||
const TOKENS_FIXED_SUPPLY: u64 = 100; | ||
|
||
ensure!(!COUNT_AIRDROP_RECIPIENTS.is_zero(), ArithmeticError::DivisionByZero); | ||
|
||
let asset_id = Self::next_asset_id(); | ||
|
||
<NextAssetId<T>>::mutate(|asset_id| *asset_id += 1); | ||
<Balances<T>>::insert((asset_id, &ACCOUNT_ALICE), TOKENS_FIXED_SUPPLY / COUNT_AIRDROP_RECIPIENTS); | ||
<Balances<T>>::insert((asset_id, &ACCOUNT_BOB), TOKENS_FIXED_SUPPLY / COUNT_AIRDROP_RECIPIENTS); | ||
<TotalSupply<T>>::insert(asset_id, TOKENS_FIXED_SUPPLY); | ||
|
||
Self::deposit_event(RawEvent::Issued(asset_id, sender, TOKENS_FIXED_SUPPLY)); | ||
Ok(()) | ||
} | ||
} | ||
} | ||
``` | ||
|
||
## Assumptions | ||
|
||
Below are assumptions that must be held when using this module. If any of | ||
them are violated, the behavior of this module is undefined. | ||
|
||
* The total count of assets should be less than | ||
`Config::AssetId::max_value()`. | ||
gavofyork marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
## Related Modules | ||
|
||
* [`System`](https://docs.rs/frame-system/latest/frame_system/) | ||
* [`Support`](https://docs.rs/frame-support/latest/frame_support/) | ||
|
||
License: Apache-2.0 |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this seems redundant as they are part of deps above already