difftreelog
add force methods for collection in `Unique` , add events Stake, Unstake, SetAdmin
in: master
8 files changed
Cargo.lockdiffbeforeafterboth--- a/Cargo.lock
+++ b/Cargo.lock
@@ -6473,7 +6473,7 @@
[[package]]
name = "pallet-unique"
-version = "0.1.3"
+version = "0.1.4"
dependencies = [
"ethereum",
"evm-coder",
pallets/app-promotion/src/benchmarking.rsdiffbeforeafterboth--- a/pallets/app-promotion/src/benchmarking.rs
+++ b/pallets/app-promotion/src/benchmarking.rs
@@ -54,7 +54,7 @@
payout_stakers{
let pallet_admin = account::<T::AccountId>("admin", 0, SEED);
- let share = Perbill::from_rational(1u32, 10);
+ let share = Perbill::from_rational(1u32, 100);
PromototionPallet::<T>::set_admin_address(RawOrigin::Root.into(), T::CrossAccountId::from_sub(pallet_admin.clone()))?;
let _ = <T as Config>::Currency::make_free_balance_be(&pallet_admin, Perbill::from_rational(1u32, 2) * BalanceOf::<T>::max_value());
let staker: T::AccountId = account("caller", 0, SEED);
pallets/app-promotion/src/lib.rsdiffbeforeafterboth--- a/pallets/app-promotion/src/lib.rs
+++ b/pallets/app-promotion/src/lib.rs
@@ -70,16 +70,11 @@
};
pub const LOCK_IDENTIFIER: [u8; 8] = *b"appstake";
+
const PENDING_LIMIT_PER_BLOCK: u32 = 3;
type BalanceOf<T> =
<<T as Config>::Currency as Currency<<T as frame_system::Config>::AccountId>>::Balance;
-
-// const SECONDS_TO_BLOCK: u32 = 6;
-// const DAY: u32 = 60 * 60 * 24 / SECONDS_TO_BLOCK;
-// const WEEK: u32 = 7 * DAY;
-// const TWO_WEEK: u32 = 2 * WEEK;
-// const YEAR: u32 = DAY * 365;
#[frame_support::pallet]
pub mod pallet {
@@ -115,9 +110,9 @@
#[pallet::constant]
type PendingInterval: Get<Self::BlockNumber>;
- /// In chain blocks.
- #[pallet::constant]
- type Day: Get<Self::BlockNumber>; // useless
+ // /// In chain blocks.
+ // #[pallet::constant]
+ // type Day: Get<Self::BlockNumber>; // useless
#[pallet::constant]
type Nominal: Get<BalanceOf<Self>>;
@@ -150,6 +145,9 @@
/// Amount of accrued interest
BalanceOf<T>,
),
+ Stake(T::AccountId, BalanceOf<T>),
+ Unstake(T::AccountId, BalanceOf<T>),
+ SetAdmin(T::AccountId),
}
#[pallet::error]
@@ -205,9 +203,9 @@
ValueQuery,
>;
- /// A block when app-promotion has started .I think this is redundant, because we only need `NextInterestBlock`.
- #[pallet::storage]
- pub type StartBlock<T: Config> = StorageValue<Value = T::BlockNumber, QueryKind = ValueQuery>;
+ // /// A block when app-promotion has started .I think this is redundant, because we only need `NextInterestBlock`.
+ // #[pallet::storage]
+ // pub type StartBlock<T: Config> = StorageValue<Value = T::BlockNumber, QueryKind = ValueQuery>;
// /// Next target block when interest is recalculated
// #[pallet::storage]
@@ -257,50 +255,14 @@
#[pallet::weight(T::WeightInfo::set_admin_address())]
pub fn set_admin_address(origin: OriginFor<T>, admin: T::CrossAccountId) -> DispatchResult {
ensure_root(origin)?;
+
<Admin<T>>::set(Some(admin.as_sub().to_owned()));
+ Self::deposit_event(Event::SetAdmin(admin.as_sub().to_owned()));
+
Ok(())
}
-
- // #[pallet::weight(T::WeightInfo::start_app_promotion())]
- // pub fn start_app_promotion(
- // origin: OriginFor<T>,
- // promotion_start_relay_block: Option<T::BlockNumber>,
- // ) -> DispatchResult
- // where
- // <T as frame_system::Config>::BlockNumber: From<u32>,
- // {
- // ensure_root(origin)?;
-
- // // Start app-promotion mechanics if it has not been yet initialized
- // if <StartBlock<T>>::get() == 0u32.into() {
- // let start_block = promotion_start_relay_block
- // .unwrap_or(T::RelayBlockNumberProvider::current_block_number());
-
- // // Set promotion global start block
- // <StartBlock<T>>::set(start_block);
-
- // <NextInterestBlock<T>>::set(start_block + T::RecalculationInterval::get());
- // }
-
- // Ok(())
- // }
- // #[pallet::weight(T::WeightInfo::stop_app_promotion())]
- // pub fn stop_app_promotion(origin: OriginFor<T>) -> DispatchResult
- // where
- // <T as frame_system::Config>::BlockNumber: From<u32>,
- // {
- // ensure_root(origin)?;
-
- // if <StartBlock<T>>::get() != 0u32.into() {
- // <StartBlock<T>>::set(T::BlockNumber::default());
- // <NextInterestBlock<T>>::set(T::BlockNumber::default());
- // }
-
- // Ok(())
- // }
-
#[pallet::weight(T::WeightInfo::stake())]
pub fn stake(staker: OriginFor<T>, amount: BalanceOf<T>) -> DispatchResult {
let staker_id = ensure_signed(staker)?;
@@ -350,6 +312,9 @@
);
StakesPerAccount::<T>::mutate(&staker_id, |stakes| *stakes += 1);
+
+ Self::deposit_event(Event::Stake(staker_id, amount));
+
Ok(())
}
@@ -392,6 +357,8 @@
StakesPerAccount::<T>::remove(&staker_id);
+ Self::deposit_event(Event::Unstake(staker_id, total_staked));
+
Ok(None.into())
}
@@ -527,13 +494,13 @@
// }
// }
// }
-
+
{
let mut stakers_number = stakers_number.unwrap_or(20);
- let last_id = RefCell::new(None);
+ let last_id = RefCell::new(None);
let income_acc = RefCell::new(BalanceOf::<T>::default());
let amount_acc = RefCell::new(BalanceOf::<T>::default());
-
+
let flush_stake = || -> DispatchResult {
if let Some(last_id) = &*last_id.borrow() {
if !income_acc.borrow().is_zero() {
@@ -573,7 +540,7 @@
};
*last_id.borrow_mut() = Some(current_id.clone());
if current_recalc_block >= next_recalc_block_for_stake {
- *amount_acc.borrow_mut() += amount;
+ *amount_acc.borrow_mut() += amount;
Self::recalculate_and_insert_stake(
¤t_id,
staked_block,
@@ -588,7 +555,6 @@
}
flush_stake()?;
}
-
Ok(())
}
pallets/app-promotion/src/types.rsdiffbeforeafterboth1use codec::EncodeLike;2use frame_support::{3 traits::LockableCurrency, WeakBoundedVec, Parameter, dispatch::DispatchResult, ensure,4};56use pallet_balances::{BalanceLock, Config as BalancesConfig, Pallet as PalletBalances};7use pallet_common::CollectionHandle;8use pallet_unique::{Event as UniqueEvent, Error as UniqueError};9use sp_runtime::DispatchError;10use up_data_structs::{CollectionId, SponsorshipState};11use sp_std::borrow::ToOwned;12use pallet_evm_contract_helpers::{Pallet as EvmHelpersPallet, Config as EvmHelpersConfig, Sponsoring};1314pub trait ExtendedLockableCurrency<AccountId: Parameter>: LockableCurrency<AccountId> {15 fn locks<KArg>(who: KArg) -> WeakBoundedVec<BalanceLock<Self::Balance>, Self::MaxLocks>16 where17 KArg: EncodeLike<AccountId>;18}1920impl<T: BalancesConfig<I>, I: 'static> ExtendedLockableCurrency<T::AccountId>21 for PalletBalances<T, I>22{23 fn locks<KArg>(who: KArg) -> WeakBoundedVec<BalanceLock<Self::Balance>, Self::MaxLocks>24 where25 KArg: EncodeLike<T::AccountId>,26 {27 Self::locks(who)28 }29}3031pub trait CollectionHandler {32 type CollectionId;33 type AccountId;3435 fn set_sponsor(36 sponsor_id: Self::AccountId,37 collection_id: Self::CollectionId,38 ) -> DispatchResult;3940 fn remove_collection_sponsor(collection_id: Self::CollectionId) -> DispatchResult;4142 fn get_sponsor(43 collection_id: Self::CollectionId,44 ) -> Result<Option<Self::AccountId>, DispatchError>;45}4647impl<T: pallet_unique::Config> CollectionHandler for pallet_unique::Pallet<T> {48 type CollectionId = CollectionId;4950 type AccountId = T::AccountId;5152 fn set_sponsor(53 sponsor_id: Self::AccountId,54 collection_id: Self::CollectionId,55 ) -> DispatchResult {56 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;57 target_collection.check_is_internal()?;58 target_collection.set_sponsor(sponsor_id.clone())?;5960 Self::deposit_event(UniqueEvent::<T>::CollectionSponsorSet(61 collection_id,62 sponsor_id.clone(),63 ));6465 ensure!(66 target_collection.confirm_sponsorship(&sponsor_id)?,67 UniqueError::<T>::ConfirmUnsetSponsorFail68 );6970 Self::deposit_event(UniqueEvent::<T>::SponsorshipConfirmed(71 collection_id,72 sponsor_id,73 ));7475 target_collection.save()76 }7778 fn remove_collection_sponsor(collection_id: Self::CollectionId) -> DispatchResult {79 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;80 target_collection.check_is_internal()?;81 target_collection.sponsorship = SponsorshipState::Disabled;8283 Self::deposit_event(UniqueEvent::<T>::CollectionSponsorRemoved(collection_id));8485 target_collection.save()86 }8788 fn get_sponsor(89 collection_id: Self::CollectionId,90 ) -> Result<Option<Self::AccountId>, DispatchError> {91 Ok(<CollectionHandle<T>>::try_get(collection_id)?92 .sponsorship93 .pending_sponsor()94 .map(|acc| acc.to_owned()))95 }96}9798pub trait ContractHandler {99 type ContractId;100 type AccountId;101102 fn set_sponsor(sponsor_id: Self::AccountId, contract_id: Self::ContractId) -> DispatchResult;103104 fn remove_contract_sponsor(contract_id: Self::ContractId) -> DispatchResult;105106 fn get_sponsor(contract_id: Self::ContractId)107 -> Result<Option<Self::AccountId>, DispatchError>;108}109110impl<T: EvmHelpersConfig> ContractHandler for EvmHelpersPallet<T> {111 type ContractId = sp_core::H160;112113 type AccountId = T::CrossAccountId;114115 fn set_sponsor(sponsor_id: Self::AccountId, contract_id: Self::ContractId) -> DispatchResult {116 Sponsoring::<T>::insert(117 contract_id,118 SponsorshipState::<T::CrossAccountId>::Confirmed(sponsor_id),119 );120 Ok(())121 }122123 fn remove_contract_sponsor(contract_id: Self::ContractId) -> DispatchResult {124 Sponsoring::<T>::remove(contract_id);125 Ok(())126 }127128 fn get_sponsor(129 contract_id: Self::ContractId,130 ) -> Result<Option<Self::AccountId>, DispatchError> {131 Ok(Self::get_sponsor(contract_id))132 }133}1use codec::EncodeLike;2use frame_support::{3 traits::LockableCurrency, WeakBoundedVec, Parameter, dispatch::DispatchResult, ensure,4};56use pallet_balances::{BalanceLock, Config as BalancesConfig, Pallet as PalletBalances};7use pallet_common::CollectionHandle;89use sp_runtime::DispatchError;10use up_data_structs::{CollectionId, SponsorshipState};11use sp_std::borrow::ToOwned;12use pallet_evm_contract_helpers::{Pallet as EvmHelpersPallet, Config as EvmHelpersConfig, Sponsoring};1314pub trait ExtendedLockableCurrency<AccountId: Parameter>: LockableCurrency<AccountId> {15 fn locks<KArg>(who: KArg) -> WeakBoundedVec<BalanceLock<Self::Balance>, Self::MaxLocks>16 where17 KArg: EncodeLike<AccountId>;18}1920impl<T: BalancesConfig<I>, I: 'static> ExtendedLockableCurrency<T::AccountId>21 for PalletBalances<T, I>22{23 fn locks<KArg>(who: KArg) -> WeakBoundedVec<BalanceLock<Self::Balance>, Self::MaxLocks>24 where25 KArg: EncodeLike<T::AccountId>,26 {27 Self::locks(who)28 }29}3031pub trait CollectionHandler {32 type CollectionId;33 type AccountId;3435 fn set_sponsor(36 sponsor_id: Self::AccountId,37 collection_id: Self::CollectionId,38 ) -> DispatchResult;3940 fn remove_collection_sponsor(collection_id: Self::CollectionId) -> DispatchResult;4142 fn get_sponsor(43 collection_id: Self::CollectionId,44 ) -> Result<Option<Self::AccountId>, DispatchError>;45}4647impl<T: pallet_unique::Config> CollectionHandler for pallet_unique::Pallet<T> {48 type CollectionId = CollectionId;4950 type AccountId = T::AccountId;5152 fn set_sponsor(53 sponsor_id: Self::AccountId,54 collection_id: Self::CollectionId,55 ) -> DispatchResult {56 Self::force_set_sponsor(sponsor_id, collection_id)57 }5859 fn remove_collection_sponsor(collection_id: Self::CollectionId) -> DispatchResult {60 Self::force_remove_collection_sponsor(collection_id)61 }6263 fn get_sponsor(64 collection_id: Self::CollectionId,65 ) -> Result<Option<Self::AccountId>, DispatchError> {66 Ok(<CollectionHandle<T>>::try_get(collection_id)?67 .sponsorship68 .pending_sponsor()69 .map(|acc| acc.to_owned()))70 }71}7273pub trait ContractHandler {74 type ContractId;75 type AccountId;7677 fn set_sponsor(sponsor_id: Self::AccountId, contract_id: Self::ContractId) -> DispatchResult;7879 fn remove_contract_sponsor(contract_id: Self::ContractId) -> DispatchResult;8081 fn get_sponsor(contract_id: Self::ContractId)82 -> Result<Option<Self::AccountId>, DispatchError>;83}8485impl<T: EvmHelpersConfig> ContractHandler for EvmHelpersPallet<T> {86 type ContractId = sp_core::H160;8788 type AccountId = T::CrossAccountId;8990 fn set_sponsor(sponsor_id: Self::AccountId, contract_id: Self::ContractId) -> DispatchResult {91 Sponsoring::<T>::insert(92 contract_id,93 SponsorshipState::<T::CrossAccountId>::Confirmed(sponsor_id),94 );95 Ok(())96 }9798 fn remove_contract_sponsor(contract_id: Self::ContractId) -> DispatchResult {99 Sponsoring::<T>::remove(contract_id);100 Ok(())101 }102103 fn get_sponsor(104 contract_id: Self::ContractId,105 ) -> Result<Option<Self::AccountId>, DispatchError> {106 Ok(Self::get_sponsor(contract_id))107 }108}pallets/unique/CHANGELOG.mddiffbeforeafterboth--- a/pallets/unique/CHANGELOG.md
+++ b/pallets/unique/CHANGELOG.md
@@ -3,22 +3,27 @@
All notable changes to this project will be documented in this file.
<!-- bureaucrate goes here -->
+
+## [v0.1.4] 2022-09-5
+
+### Added
+
## [v0.1.3] 2022-08-16
### Other changes
-- build: Upgrade polkadot to v0.9.27 2c498572636f2b34d53b1c51b7283a761a7dc90a
+- build: Upgrade polkadot to v0.9.27 2c498572636f2b34d53b1c51b7283a761a7dc90a
-- build: Upgrade polkadot to v0.9.26 85515e54c4ca1b82a2630034e55dcc804c643bf8
+- build: Upgrade polkadot to v0.9.26 85515e54c4ca1b82a2630034e55dcc804c643bf8
-- refactor: Remove `#[transactional]` from extrinsics 7fd36cea2f6e00c02c67ccc1de9649ae404efd31
+- refactor: Remove `#[transactional]` from extrinsics 7fd36cea2f6e00c02c67ccc1de9649ae404efd31
Every extrinsic now runs in transaction implicitly, and
`#[transactional]` on pallet dispatchable is now meaningless
Upstream-Change: https://github.com/paritytech/substrate/issues/10806
-- refactor: Switch to new prefix removal methods 26734e9567589d75cdd99e404eabf11d5a97d975
+- refactor: Switch to new prefix removal methods 26734e9567589d75cdd99e404eabf11d5a97d975
New methods allows to call `remove_prefix` with limit multiple times
in the same block
@@ -27,10 +32,12 @@
Upstream-Change: https://github.com/paritytech/substrate/pull/11490
-- build: Upgrade polkadot to v0.9.25 cdfb9bdc7b205ff1b5134f034ef9973d769e5e6b
+- build: Upgrade polkadot to v0.9.25 cdfb9bdc7b205ff1b5134f034ef9973d769e5e6b
## [v0.1.1] - 2022-07-25
+
### Added
-- Method for creating `ERC721Metadata` compatible NFT collection.
-- Method for creating `ERC721Metadata` compatible ReFungible collection.
-- Method for creating ReFungible collection.
+
+- Method for creating `ERC721Metadata` compatible NFT collection.
+- Method for creating `ERC721Metadata` compatible ReFungible collection.
+- Method for creating ReFungible collection.
pallets/unique/Cargo.tomldiffbeforeafterboth--- a/pallets/unique/Cargo.toml
+++ b/pallets/unique/Cargo.toml
@@ -9,7 +9,7 @@
license = 'GPLv3'
name = 'pallet-unique'
repository = 'https://github.com/UniqueNetwork/unique-chain'
-version = "0.1.3"
+version = "0.1.4"
[package.metadata.docs.rs]
targets = ['x86_64-unknown-linux-gnu']
pallets/unique/src/lib.rsdiffbeforeafterboth--- a/pallets/unique/src/lib.rs
+++ b/pallets/unique/src/lib.rs
@@ -1103,3 +1103,35 @@
}
}
}
+
+impl<T: Config> Pallet<T> {
+ pub fn force_set_sponsor(sponsor: T::AccountId, collection_id: CollectionId) -> DispatchResult {
+ let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
+ target_collection.check_is_internal()?;
+ target_collection.set_sponsor(sponsor.clone())?;
+
+ Self::deposit_event(Event::<T>::CollectionSponsorSet(
+ collection_id,
+ sponsor.clone(),
+ ));
+
+ ensure!(
+ target_collection.confirm_sponsorship(&sponsor)?,
+ Error::<T>::ConfirmUnsetSponsorFail
+ );
+
+ Self::deposit_event(Event::<T>::SponsorshipConfirmed(collection_id, sponsor));
+
+ target_collection.save()
+ }
+
+ pub fn force_remove_collection_sponsor(collection_id: CollectionId) -> DispatchResult {
+ let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
+ target_collection.check_is_internal()?;
+ target_collection.sponsorship = SponsorshipState::Disabled;
+
+ Self::deposit_event(Event::<T>::CollectionSponsorRemoved(collection_id));
+
+ target_collection.save()
+ }
+}
runtime/common/config/pallets/app_promotion.rsdiffbeforeafterboth--- a/runtime/common/config/pallets/app_promotion.rs
+++ b/runtime/common/config/pallets/app_promotion.rs
@@ -22,7 +22,7 @@
use frame_support::{parameter_types, PalletId};
use sp_arithmetic::Perbill;
use up_common::{
- constants::{DAYS, UNIQUE, RELAY_DAYS},
+ constants::{ UNIQUE, RELAY_DAYS},
types::Balance,
};
@@ -32,7 +32,7 @@
pub const RecalculationInterval: BlockNumber = 20;
pub const PendingInterval: BlockNumber = 10;
pub const Nominal: Balance = UNIQUE;
- pub const Day: BlockNumber = DAYS;
+ // pub const Day: BlockNumber = DAYS;
pub IntervalIncome: Perbill = Perbill::from_rational(RecalculationInterval::get(), RELAY_DAYS) * Perbill::from_rational(5u32, 10_000);
}
@@ -42,7 +42,7 @@
pub const RecalculationInterval: BlockNumber = RELAY_DAYS;
pub const PendingInterval: BlockNumber = 7 * RELAY_DAYS;
pub const Nominal: Balance = UNIQUE;
- pub const Day: BlockNumber = RELAY_DAYS;
+ // pub const Day: BlockNumber = RELAY_DAYS;
pub IntervalIncome: Perbill = Perbill::from_rational(5u32, 10_000);
}
@@ -56,7 +56,7 @@
type RelayBlockNumberProvider = RelayChainBlockNumberProvider<Runtime>;
type RecalculationInterval = RecalculationInterval;
type PendingInterval = PendingInterval;
- type Day = Day;
+ // type Day = Day;
type Nominal = Nominal;
type IntervalIncome = IntervalIncome;
type Event = Event;