difftreelog
refactor combine sponsorship fields
in: master
5 files changed
node/src/chain_spec.rsdiffbeforeafterboth--- a/node/src/chain_spec.rs
+++ b/node/src/chain_spec.rs
@@ -193,8 +193,7 @@
mint_mode: false,
offchain_schema: vec![],
schema_version: SchemaVersion::default(),
- sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),
- sponsor_confirmed: true,
+ sponsorship: SponsorshipState::Confirmed(get_account_id_from_seed::<sr25519::Public>("Alice")),
const_on_chain_schema: vec![],
variable_on_chain_schema: vec![],
limits: CollectionLimits::default()
pallets/nft/src/lib.rsdiffbeforeafterboth--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -123,6 +123,42 @@
pub fraction: u128,
}
+#[derive(Encode, Decode, Debug, Clone, PartialEq)]
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+pub enum SponsorshipState<AccountId> {
+ /// The fees are applied to the transaction sender
+ Disabled,
+ Unconfirmed(AccountId),
+ /// Transactions are sponsored by specified account
+ Confirmed(AccountId),
+}
+
+impl<AccountId> SponsorshipState<AccountId> {
+ fn sponsor(&self) -> Option<&AccountId> {
+ match self {
+ Self::Confirmed(sponsor) => Some(sponsor),
+ _ => None,
+ }
+ }
+
+ fn pending_sponsor(&self) -> Option<&AccountId> {
+ match self {
+ Self::Unconfirmed(sponsor) | Self::Confirmed(sponsor) => Some(sponsor),
+ _ => None,
+ }
+ }
+
+ fn confirmed(&self) -> bool {
+ matches!(self, Self::Confirmed(_))
+ }
+}
+
+impl<T> Default for SponsorshipState<T> {
+ fn default() -> Self {
+ Self::Disabled
+ }
+}
+
#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub struct CollectionType<AccountId> {
@@ -136,8 +172,7 @@
pub mint_mode: bool,
pub offchain_schema: Vec<u8>,
pub schema_version: SchemaVersion,
- pub sponsor: AccountId, // Who pays fees. If set to default address, the fees are applied to the transaction sender
- pub sponsor_confirmed: bool, // False if sponsor address has not yet confirmed sponsorship. True otherwise.
+ pub sponsorship: SponsorshipState<AccountId>,
pub limits: CollectionLimits, // Collection private restrictions
pub variable_on_chain_schema: Vec<u8>, //
pub const_on_chain_schema: Vec<u8>, //
@@ -665,8 +700,7 @@
token_prefix: token_prefix,
offchain_schema: Vec::new(),
schema_version: SchemaVersion::ImageURL,
- sponsor: T::AccountId::default(),
- sponsor_confirmed: false,
+ sponsorship: SponsorshipState::Disabled,
variable_on_chain_schema: Vec::new(),
const_on_chain_schema: Vec::new(),
limits,
@@ -922,8 +956,7 @@
let mut target_collection = <Collection<T>>::get(collection_id);
ensure!(sender == target_collection.owner, Error::<T>::NoPermission);
- target_collection.sponsor = new_sponsor;
- target_collection.sponsor_confirmed = false;
+ target_collection.sponsorship = SponsorshipState::Unconfirmed(new_sponsor);
<Collection<T>>::insert(collection_id, target_collection);
Ok(())
@@ -943,9 +976,12 @@
ensure!(<Collection<T>>::contains_key(collection_id), Error::<T>::CollectionNotFound);
let mut target_collection = <Collection<T>>::get(collection_id);
- ensure!(sender == target_collection.sponsor, Error::<T>::ConfirmUnsetSponsorFail);
+ ensure!(
+ target_collection.sponsorship.pending_sponsor() == Some(&sender),
+ Error::<T>::ConfirmUnsetSponsorFail
+ );
- target_collection.sponsor_confirmed = true;
+ target_collection.sponsorship = SponsorshipState::Confirmed(sender);
<Collection<T>>::insert(collection_id, target_collection);
Ok(())
@@ -969,8 +1005,7 @@
let mut target_collection = <Collection<T>>::get(collection_id);
ensure!(sender == target_collection.owner, Error::<T>::NoPermission);
- target_collection.sponsor = T::AccountId::default();
- target_collection.sponsor_confirmed = false;
+ target_collection.sponsorship = SponsorshipState::Disabled;
<Collection<T>>::insert(collection_id, target_collection);
Ok(())
@@ -2485,7 +2520,9 @@
// sponsor timeout
let block_number = <system::Module<T>>::block_number() as T::BlockNumber;
- let limit = <Collection<T>>::get(collection_id).limits.sponsor_transfer_timeout;
+ let collection = <Collection<T>>::get(collection_id);
+
+ let limit = collection.limits.sponsor_transfer_timeout;
let mut sponsored = true;
if <CreateItemBasket<T>>::contains_key((collection_id, &who)) {
let last_tx_block = <CreateItemBasket<T>>::get((collection_id, &who));
@@ -2499,11 +2536,12 @@
}
// check free create limit
- if (<Collection<T>>::get(collection_id).limits.sponsored_data_size >= (_properties.len() as u32)) &&
- (<Collection<T>>::get(collection_id).sponsor_confirmed) &&
+ if (collection.limits.sponsored_data_size >= (_properties.len() as u32)) &&
(sponsored)
{
- <Collection<T>>::get(collection_id).sponsor
+ collection.sponsorship.sponsor()
+ .cloned()
+ .unwrap_or_default()
} else {
T::AccountId::default()
}
@@ -2511,7 +2549,7 @@
Some(Call::transfer(_new_owner, collection_id, item_id, _value)) => {
let mut sponsor_transfer = false;
- if <Collection<T>>::get(collection_id).sponsor_confirmed {
+ if <Collection<T>>::get(collection_id).sponsorship.confirmed() {
let collection_limits = <Collection<T>>::get(collection_id).limits;
let collection_mode = <Collection<T>>::get(collection_id).mode;
@@ -2598,7 +2636,9 @@
if !sponsor_transfer {
T::AccountId::default()
} else {
- <Collection<T>>::get(collection_id).sponsor
+ <Collection<T>>::get(collection_id).sponsorship.sponsor()
+ .cloned()
+ .unwrap_or_default()
}
}
runtime_types.jsondiffbeforeafterboth1{2 "AccessMode": {3 "_enum": [4 "Normal",5 "WhiteList"6 ]7 },8 "DecimalPoints": "u8",9 "CollectionMode": {10 "_enum": {11 "Invalid": null,12 "NFT": null,13 "Fungible": "DecimalPoints",14 "ReFungible": null15 }16 },17 "Ownership": {18 "Owner": "AccountId",19 "Fraction": "u128"20 },21 "FungibleItemType": {22 "Value": "u128"23 },24 "NftItemType": {25 "Owner": "AccountId",26 "ConstData": "Vec<u8>",27 "VariableData": "Vec<u8>"28 },29 "ReFungibleItemType": {30 "Owner": "Vec<Ownership<AccountId>>",31 "ConstData": "Vec<u8>",32 "VariableData": "Vec<u8>"33 },34 "CollectionType": {35 "Owner": "AccountId",36 "Mode": "CollectionMode",37 "Access": "AccessMode",38 "DecimalPoints": "DecimalPoints",39 "Name": "Vec<u16>",40 "Description": "Vec<u16>",41 "TokenPrefix": "Vec<u8>",42 "MintMode": "bool",43 "OffchainSchema": "Vec<u8>",44 "SchemaVersion": "SchemaVersion",45 "Sponsor": "AccountId",46 "SponsorConfirmed": "bool",47 "Limits": "CollectionLimits",48 "VariableOnChainSchema": "Vec<u8>",49 "ConstOnChainSchema": "Vec<u8>"50 },51 "RawData": "Vec<u8>",52 "Address": "AccountId",53 "LookupSource": "AccountId",54 "Weight": "u64",55 "CreateNftData": {56 "const_data": "Vec<u8>",57 "variable_data": "Vec<u8>" 58 },59 "CreateFungibleData": {60 "value": "u128"61 },62 "CreateReFungibleData": {63 "const_data": "Vec<u8>",64 "variable_data": "Vec<u8>",65 "pieces": "u128"66 },67 "CreateItemData": {68 "_enum": {69 "NFT": "CreateNftData",70 "Fungible": "CreateFungibleData",71 "ReFungible": "CreateReFungibleData"72 }73 },74 "SchemaVersion": {75 "_enum": [76 "ImageURL",77 "Unique"78 ]79 },80 "CollectionId": "u32",81 "TokenId": "u32",82 "ChainLimits": {83 "CollectionNumbersLimit": "u32",84 "AccountTokenOwnershipLimit": "u32",85 "CollectionAdminsLimit": "u64",86 "CustomDataLimit": "u32",87 "NftSponsorTimeout": "u32",88 "FungibleSponsorTimeout": "u32",89 "RefungibleSponsorTimeout": "u32",90 "OffchainSchemaLimit": "u32",91 "VariableOnChainSchemaLimit": "u32",92 "ConstOnChainSchemaLimit": "u32"93 },94 "CollectionLimits": {95 "AccountTokenOwnershipLimit": "u32",96 "SponsoredMintSize": "u32",97 "TokenLimit": "u32",98 "SponsorTimeout": "u32",99 "OwnerCanTransfer": "bool",100 "OwnerCanDestroy": "bool"101 }102}1{2 "AccessMode": {3 "_enum": [4 "Normal",5 "WhiteList"6 ]7 },8 "DecimalPoints": "u8",9 "CollectionMode": {10 "_enum": {11 "Invalid": null,12 "NFT": null,13 "Fungible": "DecimalPoints",14 "ReFungible": null15 }16 },17 "Ownership": {18 "Owner": "AccountId",19 "Fraction": "u128"20 },21 "FungibleItemType": {22 "Value": "u128"23 },24 "NftItemType": {25 "Owner": "AccountId",26 "ConstData": "Vec<u8>",27 "VariableData": "Vec<u8>"28 },29 "ReFungibleItemType": {30 "Owner": "Vec<Ownership<AccountId>>",31 "ConstData": "Vec<u8>",32 "VariableData": "Vec<u8>"33 },34 "SponsorshipState": {35 "_enum": {36 "Disabled": null,37 "Unconfirmed": "AccountId",38 "Confirmed": "AccountId"39 }40 },41 "CollectionType": {42 "Owner": "AccountId",43 "Mode": "CollectionMode",44 "Access": "AccessMode",45 "DecimalPoints": "DecimalPoints",46 "Name": "Vec<u16>",47 "Description": "Vec<u16>",48 "TokenPrefix": "Vec<u8>",49 "MintMode": "bool",50 "OffchainSchema": "Vec<u8>",51 "SchemaVersion": "SchemaVersion",52 "Sponsorship": "SponsorshipState",53 "Limits": "CollectionLimits",54 "VariableOnChainSchema": "Vec<u8>",55 "ConstOnChainSchema": "Vec<u8>"56 },57 "RawData": "Vec<u8>",58 "Address": "AccountId",59 "LookupSource": "AccountId",60 "Weight": "u64",61 "CreateNftData": {62 "const_data": "Vec<u8>",63 "variable_data": "Vec<u8>" 64 },65 "CreateFungibleData": {66 "value": "u128"67 },68 "CreateReFungibleData": {69 "const_data": "Vec<u8>",70 "variable_data": "Vec<u8>",71 "pieces": "u128"72 },73 "CreateItemData": {74 "_enum": {75 "NFT": "CreateNftData",76 "Fungible": "CreateFungibleData",77 "ReFungible": "CreateReFungibleData"78 }79 },80 "SchemaVersion": {81 "_enum": [82 "ImageURL",83 "Unique"84 ]85 },86 "CollectionId": "u32",87 "TokenId": "u32",88 "ChainLimits": {89 "CollectionNumbersLimit": "u32",90 "AccountTokenOwnershipLimit": "u32",91 "CollectionAdminsLimit": "u64",92 "CustomDataLimit": "u32",93 "NftSponsorTimeout": "u32",94 "FungibleSponsorTimeout": "u32",95 "RefungibleSponsorTimeout": "u32",96 "OffchainSchemaLimit": "u32",97 "VariableOnChainSchemaLimit": "u32",98 "ConstOnChainSchemaLimit": "u32"99 },100 "CollectionLimits": {101 "AccountTokenOwnershipLimit": "u32",102 "SponsoredMintSize": "u32",103 "TokenLimit": "u32",104 "SponsorTimeout": "u32",105 "OwnerCanTransfer": "bool",106 "OwnerCanDestroy": "bool"107 }108}tests/package.jsondiffbeforeafterboth--- a/tests/package.json
+++ b/tests/package.json
@@ -26,6 +26,7 @@
"testSetVariableMetaData": "mocha --timeout 9999999 -r ts-node/register ./**/setVariableMetaData.test.ts",
"testSetCollectionLimits": "mocha --timeout 9999999 -r ts-node/register ./**/setCollectionLimits.test.ts",
"testRemoveCollectionAdmin": "mocha --timeout 9999999 -r ts-node/register ./**/removeCollectionAdmin.test.ts",
+ "testRemoveCollectionSponsor": "mocha --timeout 9999999 -r ts-node/register ./**/removeCollectionSponsor.test.ts",
"testRemoveFromWhiteList": "mocha --timeout 9999999 -r ts-node/register ./**/removeFromWhiteList.test.ts",
"testConnection": "mocha --timeout 9999999 -r ts-node/register ./**/connection.test.ts",
"testCollection": "mocha --timeout 9999999 -r ts-node/register ./**/createCollection.test.ts",
tests/src/util/helpers.tsdiffbeforeafterboth--- a/tests/src/util/helpers.ts
+++ b/tests/src/util/helpers.ts
@@ -396,8 +396,7 @@
// What to expect
expect(result.success).to.be.true;
- expect(collection.Sponsor).to.be.equal(nullPublicKey);
- expect(collection.SponsorConfirmed).to.be.false;
+ expect(collection.Sponsorship).to.be.deep.equal({ Disabled: null });
});
}