-
Notifications
You must be signed in to change notification settings - Fork 296
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add nft module #296
Add nft module #296
Conversation
non-fungible-token/src/lib.rs
Outdated
impl<T: Trait> Module<T> { | ||
/// Create NFT(non fungible token) class | ||
pub fn create_class(owner: &T::AccountId, metadata: CID, data: T::ClassData) -> Result<T::ClassId, DispatchError> { | ||
let class_id = Self::next_class_id(); |
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.
let class_id = NextClassId::<T>::try_mutate(|id| {
let currentId = *id;
*id = id.checked_add(One::one()).ok_or(Error::<T>::NoAvailableClassId);
currentId
})?;
non-fungible-token/src/lib.rs
Outdated
info.owner = to.clone(); | ||
} | ||
}); | ||
TokensByOwner::<T>::remove(from.clone(), token); |
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.
TokensByOwner::<T>::remove(from.clone(), token); | |
TokensByOwner::<T>::remove(from, token); |
the key can be a reference so never need to clone the key. take a reference if needed.
non-fungible-token/src/lib.rs
Outdated
} | ||
}); | ||
TokensByOwner::<T>::remove(from.clone(), token); | ||
TokensByOwner::<T>::insert(to.clone(), token, ()); |
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.
TokensByOwner::<T>::insert(to.clone(), token, ()); | |
TokensByOwner::<T>::insert(to, token, ()); |
non-fungible-token/src/lib.rs
Outdated
|
||
/// Transfer NFT(non fungible token) from `from` account to `to` account | ||
pub fn transfer(from: &T::AccountId, to: &T::AccountId, token: (T::ClassId, T::TokenId)) -> DispatchResult { | ||
ensure!(Tokens::<T>::contains_key(token.0, token.1), Error::<T>::TokenNotFound); |
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.
should be able to combine the contains_key
and mutate
with try_mutate_exists
, same for TokensByOwner
One example
open-runtime-module-library/auction/src/lib.rs
Lines 127 to 128 in 27d55f6
<Auctions<T>>::try_mutate_exists(id, |auction| -> DispatchResult { | |
let mut auction = auction.as_mut().ok_or(Error::<T>::AuctionNotExist)?; |
non-fungible-token/src/lib.rs
Outdated
Ok(()) | ||
})?; | ||
Tokens::<T>::insert(class_id, token_id, token_info); | ||
TokensByOwner::<T>::insert(owner.clone(), (class_id, token_id), ()); |
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.
TokensByOwner::<T>::insert(owner.clone(), (class_id, token_id), ()); | |
TokensByOwner::<T>::insert(owner, (class_id, token_id), ()); |
non-fungible-token/src/lib.rs
Outdated
data: T::TokenData, | ||
) -> Result<T::TokenId, DispatchError> { | ||
let token_id = Self::next_token_id(); | ||
ensure!(token_id != T::TokenId::max_value(), Error::<T>::NoAvailableTokenId); |
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.
Missing update next token id?
non-fungible-token/src/lib.rs
Outdated
if let Some(info) = class_info { | ||
info.total_issuance = info | ||
.total_issuance | ||
.checked_sub(&1.into()) |
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.
use One::one()
over 1.into()
. Learn from Gav paritytech/substrate#5715 (comment)
non-fungible-token/src/lib.rs
Outdated
} | ||
Ok(()) | ||
})?; | ||
Tokens::<T>::remove(token.0, token.1); |
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.
Should be able to use take().ok_or(Error::<T>::TokenNotFound)
to combine remove and check.
non-fungible-token/src/lib.rs
Outdated
|
||
/// Destroy NFT(non fungible token) class | ||
pub fn destroy_class(owner: &T::AccountId, class_id: T::ClassId) -> DispatchResult { | ||
ensure!(Classes::<T>::contains_key(class_id), Error::<T>::ClassNotFound); |
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.
use try_mutate_exists to avoid multiple access
Looks good. Just needs some small optimizations and improvements. |
non-fungible-token/src/lib.rs
Outdated
Ok(current_id) | ||
})?; | ||
|
||
Classes::<T>::try_mutate(class_id, |class_info| -> DispatchResult { |
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 could fail and NextTokenId still get updated.
Should put rest of the method into the NextTokenId::try_mutate
closure
non-fungible-token/src/lib.rs
Outdated
ensure!(token_info.take().is_some(), Error::<T>::TokenNotFound); | ||
Ok(()) | ||
})?; | ||
TokensByOwner::<T>::try_mutate_exists(owner, token, |info| -> DispatchResult { |
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 could fail and Tokens still get updates.
Should put rest of the method into the Tokens:: try_mutate_exists
closure
No description provided.