diff --git a/Cargo.lock b/Cargo.lock index dc4d160cdd..72201b4676 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4902,7 +4902,6 @@ dependencies = [ "frame-system", "parity-scale-codec", "serde", - "sp-application-crypto", "sp-core", "sp-runtime", "sp-std", diff --git a/node/primitives/Cargo.toml b/node/primitives/Cargo.toml index f4f06cd169..8502d95008 100644 --- a/node/primitives/Cargo.toml +++ b/node/primitives/Cargo.toml @@ -9,7 +9,6 @@ bstringify = "0.1.2" codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false, features = ["derive"] } serde = { version = "1.0.124", optional = true } frame-system = { version = "3.0.0", default-features = false } -sp-application-crypto = { version = "3.0.0", default-features = false } sp-core = { version = "3.0.0", default-features = false } sp-runtime = { version = "3.0.0", default-features = false } sp-std = { version = "3.0.0", default-features = false } @@ -21,7 +20,6 @@ std = [ "codec/std", "frame-system/std", "serde", - "sp-application-crypto/std", "sp-core/std", "sp-runtime/std", "sp-std/std", diff --git a/node/primitives/src/bridge.rs b/node/primitives/src/bridge.rs new file mode 100644 index 0000000000..4a8ef4ad1a --- /dev/null +++ b/node/primitives/src/bridge.rs @@ -0,0 +1,60 @@ +// This file is part of Bifrost. + +// Copyright (C) 2019-2021 Liebi Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use codec::{Decode, Encode}; +use sp_std::prelude::*; + +/// Blockchain types +#[derive(PartialEq, Debug, Clone, Encode, Decode)] +pub enum BlockchainType { + BIFROST, + EOS, + IOST, +} + +impl Default for BlockchainType { + fn default() -> Self { + BlockchainType::BIFROST + } +} + +/// Symbol type of bridge asset +#[derive(Clone, Default, Encode, Decode)] +pub struct BridgeAssetSymbol { + pub blockchain: BlockchainType, + pub symbol: Vec, + pub precision: Precision, +} + +impl BridgeAssetSymbol { + pub fn new(blockchain: BlockchainType, symbol: Vec, precision: Precision) -> Self { + BridgeAssetSymbol { blockchain, symbol, precision } + } +} + +/// Bridge asset type +#[derive(Clone, Default, Encode, Decode)] +pub struct BridgeAssetBalance { + pub symbol: BridgeAssetSymbol, + pub amount: Balance, + pub memo: Vec, + // store the account who send transaction to EOS + pub from: AccountId, + // which token type is sent to EOS + pub asset_id: AssetId, +} diff --git a/node/primitives/src/currency.rs b/node/primitives/src/currency.rs index edfdec4ca3..3b77216b22 100644 --- a/node/primitives/src/currency.rs +++ b/node/primitives/src/currency.rs @@ -36,10 +36,10 @@ use crate::{ }; macro_rules! create_currency_id { - ($(#[$meta:meta])* + ($(#[$meta:meta])* $vis:vis enum TokenSymbol { - $($(#[$vmeta:meta])* $symbol:ident($name:expr, $deci:literal) = $val:literal,)* - }) => { + $($(#[$vmeta:meta])* $symbol:ident($name:expr, $deci:literal) = $val:literal,)* + }) => { $(#[$meta])* $vis enum TokenSymbol { $($(#[$vmeta])* $symbol = $val,)* @@ -68,12 +68,12 @@ macro_rules! create_currency_id { impl TokenInfo for CurrencyId { // DATA LAYOUT - // - // Currency Discriminant: 1byte - // TokenSymbol Discriminant: 1byte - // ParaId: 2byte - // LeasePeriod: 2byte - // LeasePeriod: 2byte + // + // Currency Discriminant: 1byte + // TokenSymbol Discriminant: 1byte + // ParaId: 2byte + // LeasePeriod: 2byte + // LeasePeriod: 2byte fn currency_id(&self) -> u64 { let c_discr = self.discriminant() as u64; @@ -86,7 +86,7 @@ macro_rules! create_currency_id { | Self::VSBond(ts, ..) => ts as u8, } as u64; - let discr = (c_discr << 8) + t_discr; + let discr = (c_discr << 8) + t_discr; match *self { Self::Token(..) @@ -112,7 +112,7 @@ macro_rules! create_currency_id { (discr << 48) + (pid << 32) + (lp1 << 16) + lp2 } - } + } } fn name(&self) -> &str { diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index 287c95afd9..f2ffbd6caf 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -20,27 +20,21 @@ #![cfg_attr(not(feature = "std"), no_std)] -use core::convert::TryFrom; - -use codec::{Decode, Encode}; -#[cfg(feature = "std")] -use serde::{Deserialize, Serialize}; use sp_runtime::{ generic, traits::{BlakeTwo256, IdentifyAccount, Verify}, - MultiSignature, OpaqueExtrinsic, RuntimeDebug, SaturatedConversion, + MultiSignature, OpaqueExtrinsic, }; -use sp_std::{convert::Into, prelude::*}; +mod bridge; mod currency; +mod tests; pub mod traits; pub use crate::{ + bridge::*, currency::{CurrencyId, TokenSymbol}, - traits::{ - AssetReward, BridgeAssetFrom, BridgeAssetTo, CurrencyIdExt, MinterRewardExt, RewardHandler, - RewardTrait, TokenInfo, VtokenMintExt, - }, + traits::*, }; /// An index to a block. @@ -121,452 +115,8 @@ pub type EraId = u32; /// Signed version of Balance pub type Amount = i128; -/// The balance of zenlink asset -pub type TokenBalance = u128; - -/// The pair id of the zenlink dex. -pub type PairId = u32; - /// Parachain Id pub type ParaId = u32; /// The measurement type for counting lease periods (generally the same as `BlockNumber`). pub type LeasePeriod = BlockNumber; - -#[derive(Encode, Decode, Clone, Copy, Eq, PartialEq, Debug)] -#[cfg_attr(feature = "std", derive(Deserialize, Serialize))] -pub enum TokenType { - /// Native token, only used by BNC - Native, - /// Stable token - Stable, - /// Origin token from bridge - Token, - // v-token of origin token - VToken, -} - -impl Default for TokenType { - fn default() -> Self { - Self::Native - } -} - -impl TokenType { - pub fn is_base_token(&self) -> bool { - *self == TokenType::Native - } - - pub fn is_stable(&self) -> bool { - *self == TokenType::Stable - } - - pub fn is_token(&self) -> bool { - *self == TokenType::Token - } - - pub fn is_v_token(&self) -> bool { - *self == TokenType::VToken - } -} - -/// Token struct -#[derive(Encode, Decode, Default, Clone, Eq, PartialEq, Debug)] -#[cfg_attr(feature = "std", derive(serde::Deserialize, serde::Serialize))] -pub struct Token { - pub symbol: Vec, - pub precision: u16, - pub total_supply: Balance, - pub token_type: TokenType, - pub pair: Option, -} - -impl Token { - pub fn new( - symbol: Vec, - precision: u16, - total_supply: Balance, - token_type: TokenType, - ) -> Self { - Self { symbol, precision, total_supply, token_type, pair: None } - } - - pub fn add_pair(&mut self, asset_id: AssetId) { - self.pair = Some(asset_id); - } -} - -#[derive(Encode, Decode, Default, Clone, Eq, PartialEq, Debug)] -#[cfg_attr(feature = "std", derive(serde::Deserialize, serde::Serialize))] -pub struct AccountAsset { - pub balance: Balance, - pub locked: Balance, - pub available: Balance, - pub cost: Balance, - pub income: Balance, -} - -#[derive(Encode, Decode, Default, Clone, Eq, PartialEq, Debug)] -#[cfg_attr(feature = "std", derive(serde::Deserialize, serde::Serialize))] -pub struct VtokenPool { - /// A pool that hold the total amount of token minted to vtoken - pub token_pool: Balance, - /// A pool that hold the total amount of vtoken minted from token - pub vtoken_pool: Balance, - /// Total reward for current mint duration - pub current_reward: Balance, - /// Total reward for next mint duration - pub pending_reward: Balance, -} - -impl VtokenPool { - pub fn new(token_amount: Balance, vtoken_amount: Balance) -> Self { - Self { token_pool: token_amount, vtoken_pool: vtoken_amount, ..Default::default() } - } - - pub fn new_round(&mut self) { - self.current_reward = self.pending_reward; - self.pending_reward = Default::default(); - } -} - -/// Blockchain types -#[derive(PartialEq, Debug, Clone, Encode, Decode)] -pub enum BlockchainType { - BIFROST, - EOS, - IOST, -} - -impl Default for BlockchainType { - fn default() -> Self { - BlockchainType::BIFROST - } -} - -/// Symbol type of bridge asset -#[derive(Clone, Default, Encode, Decode)] -pub struct BridgeAssetSymbol { - pub blockchain: BlockchainType, - pub symbol: Vec, - pub precision: Precision, -} - -impl BridgeAssetSymbol { - pub fn new(blockchain: BlockchainType, symbol: Vec, precision: Precision) -> Self { - BridgeAssetSymbol { blockchain, symbol, precision } - } -} - -/// Bridge asset type -#[derive(Clone, Default, Encode, Decode)] -pub struct BridgeAssetBalance { - pub symbol: BridgeAssetSymbol, - pub amount: Balance, - pub memo: Vec, - // store the account who send transaction to EOS - pub from: AccountId, - // which token type is sent to EOS - pub asset_id: AssetId, -} - -/// Zenlink type -#[derive(Encode, Decode, Eq, PartialEq, Clone, RuntimeDebug)] -pub struct Pair { - pub token_0: ZenlinkAssetId, - pub token_1: ZenlinkAssetId, - - pub account: AccountId, - pub total_liquidity: TokenBalance, -} - -/// The id of Zenlink asset -/// NativeCurrency is this parachain native currency. -/// Other parachain's currency is represented by `ParaCurrency(u32)`, `u32` cast to the ParaId. -#[derive(Encode, Decode, Eq, PartialEq, Copy, Clone, RuntimeDebug, PartialOrd, Ord)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] -pub enum ZenlinkAssetId { - NativeCurrency, - ParaCurrency(u32), -} - -impl ZenlinkAssetId { - pub fn is_para_currency(&self) -> bool { - matches!(self, ZenlinkAssetId::ParaCurrency(_)) - } -} - -impl From for ZenlinkAssetId { - fn from(id: u32) -> Self { - ZenlinkAssetId::ParaCurrency(id) - } -} - -impl From for ZenlinkAssetId { - fn from(id: u128) -> Self { - ZenlinkAssetId::ParaCurrency(id as u32) - } -} - -impl From for ZenlinkAssetId { - fn from(id: CurrencyId) -> Self { - if id.is_native() { - ZenlinkAssetId::NativeCurrency - } else { - match id { - CurrencyId::Token(some_id) => { - let u32_id = some_id as u32; - ZenlinkAssetId::ParaCurrency(u32_id) - } - _ => todo!("Not support now."), - } - } - } -} - -impl Into for ZenlinkAssetId { - fn into(self) -> CurrencyId { - match self { - ZenlinkAssetId::NativeCurrency => CurrencyId::Native(TokenSymbol::ASG), - ZenlinkAssetId::ParaCurrency(some_id) => { - let id: u8 = some_id.saturated_into(); - CurrencyId::Token(TokenSymbol::try_from(id).unwrap()) - } - } - } -} - -#[derive(Encode, Decode, Clone, Copy, Debug, PartialEq)] -#[cfg_attr(feature = "std", derive(serde::Deserialize, serde::Serialize))] -#[non_exhaustive] -pub enum StorageVersion { - V0, - V1, - V2, - V3, -} - -impl Default for StorageVersion { - fn default() -> Self { - Self::V0 - } -} - -/// App-specific crypto used for reporting equivocation/misbehavior in BABE and -/// GRANDPA. Any rewards for misbehavior reporting will be paid out to this -/// account. -pub mod report { - use frame_system::offchain::AppCrypto; - use sp_core::crypto::{key_types, KeyTypeId}; - - use super::{Signature, Verify}; - - /// Key type for the reporting module. Used for reporting BABE and GRANDPA - /// equivocations. - pub const KEY_TYPE: KeyTypeId = key_types::REPORTING; - - mod app { - use sp_application_crypto::{app_crypto, sr25519}; - app_crypto!(sr25519, super::KEY_TYPE); - } - - /// Identity of the equivocation/misbehavior reporter. - pub type ReporterId = app::Public; - - /// An `AppCrypto` type to allow submitting signed transactions using the reporting - /// application key as signer. - pub struct ReporterAppCrypto; - - impl AppCrypto<::Signer, Signature> for ReporterAppCrypto { - type GenericPublic = sp_core::sr25519::Public; - type GenericSignature = sp_core::sr25519::Signature; - type RuntimeAppPublic = ReporterId; - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn currency_id_from_string_should_work() { - let currency_id = CurrencyId::try_from("DOT".as_bytes().to_vec()); - assert!(currency_id.is_ok()); - assert_eq!(currency_id.unwrap(), CurrencyId::Token(TokenSymbol::DOT)); - } - - #[test] - fn currency_id_to_u64_should_work() { - let e00 = CurrencyId::Token(TokenSymbol::ASG); - let e01 = CurrencyId::Token(TokenSymbol::BNC); - let e02 = CurrencyId::Token(TokenSymbol::AUSD); - let e03 = CurrencyId::Token(TokenSymbol::DOT); - let e04 = CurrencyId::Token(TokenSymbol::KSM); - let e05 = CurrencyId::Token(TokenSymbol::ETH); - - assert_eq!(0x0000_0000_0000_0000, e00.currency_id()); - assert_eq!(0x0001_0000_0000_0000, e01.currency_id()); - assert_eq!(0x0002_0000_0000_0000, e02.currency_id()); - assert_eq!(0x0003_0000_0000_0000, e03.currency_id()); - assert_eq!(0x0004_0000_0000_0000, e04.currency_id()); - assert_eq!(0x0005_0000_0000_0000, e05.currency_id()); - - let e10 = CurrencyId::VToken(TokenSymbol::ASG); - let e11 = CurrencyId::VToken(TokenSymbol::BNC); - let e12 = CurrencyId::VToken(TokenSymbol::AUSD); - let e13 = CurrencyId::VToken(TokenSymbol::DOT); - let e14 = CurrencyId::VToken(TokenSymbol::KSM); - let e15 = CurrencyId::VToken(TokenSymbol::ETH); - - assert_eq!(0x0100_0000_0000_0000, e10.currency_id()); - assert_eq!(0x0101_0000_0000_0000, e11.currency_id()); - assert_eq!(0x0102_0000_0000_0000, e12.currency_id()); - assert_eq!(0x0103_0000_0000_0000, e13.currency_id()); - assert_eq!(0x0104_0000_0000_0000, e14.currency_id()); - assert_eq!(0x0105_0000_0000_0000, e15.currency_id()); - - let e20 = CurrencyId::Native(TokenSymbol::ASG); - let e21 = CurrencyId::Native(TokenSymbol::BNC); - let e22 = CurrencyId::Native(TokenSymbol::AUSD); - let e23 = CurrencyId::Native(TokenSymbol::DOT); - let e24 = CurrencyId::Native(TokenSymbol::KSM); - let e25 = CurrencyId::Native(TokenSymbol::ETH); - - assert_eq!(0x0200_0000_0000_0000, e20.currency_id()); - assert_eq!(0x0201_0000_0000_0000, e21.currency_id()); - assert_eq!(0x0202_0000_0000_0000, e22.currency_id()); - assert_eq!(0x0203_0000_0000_0000, e23.currency_id()); - assert_eq!(0x0204_0000_0000_0000, e24.currency_id()); - assert_eq!(0x0205_0000_0000_0000, e25.currency_id()); - - let e30 = CurrencyId::Stable(TokenSymbol::ASG); - let e31 = CurrencyId::Stable(TokenSymbol::BNC); - let e32 = CurrencyId::Stable(TokenSymbol::AUSD); - let e33 = CurrencyId::Stable(TokenSymbol::DOT); - let e34 = CurrencyId::Stable(TokenSymbol::KSM); - let e35 = CurrencyId::Stable(TokenSymbol::ETH); - - assert_eq!(0x0300_0000_0000_0000, e30.currency_id()); - assert_eq!(0x0301_0000_0000_0000, e31.currency_id()); - assert_eq!(0x0302_0000_0000_0000, e32.currency_id()); - assert_eq!(0x0303_0000_0000_0000, e33.currency_id()); - assert_eq!(0x0304_0000_0000_0000, e34.currency_id()); - assert_eq!(0x0305_0000_0000_0000, e35.currency_id()); - - let e40 = CurrencyId::VSToken(TokenSymbol::ASG); - let e41 = CurrencyId::VSToken(TokenSymbol::BNC); - let e42 = CurrencyId::VSToken(TokenSymbol::AUSD); - let e43 = CurrencyId::VSToken(TokenSymbol::DOT); - let e44 = CurrencyId::VSToken(TokenSymbol::KSM); - let e45 = CurrencyId::VSToken(TokenSymbol::ETH); - - assert_eq!(0x0400_0000_0000_0000, e40.currency_id()); - assert_eq!(0x0401_0000_0000_0000, e41.currency_id()); - assert_eq!(0x0402_0000_0000_0000, e42.currency_id()); - assert_eq!(0x0403_0000_0000_0000, e43.currency_id()); - assert_eq!(0x0404_0000_0000_0000, e44.currency_id()); - assert_eq!(0x0405_0000_0000_0000, e45.currency_id()); - - let e50 = CurrencyId::VSBond(TokenSymbol::ASG, 0x07d0, 0x0000, 0x000f); - let e51 = CurrencyId::VSBond(TokenSymbol::BNC, 0x07d1, 0x000f, 0x001f); - let e52 = CurrencyId::VSBond(TokenSymbol::AUSD, 0x07d2, 0x001f, 0x002f); - let e53 = CurrencyId::VSBond(TokenSymbol::DOT, 0x07d3, 0x002f, 0x003f); - let e54 = CurrencyId::VSBond(TokenSymbol::KSM, 0x07d4, 0x003f, 0x004f); - let e55 = CurrencyId::VSBond(TokenSymbol::ETH, 0x07d5, 0x004f, 0x005f); - - assert_eq!(0x0500_07d0_0000_000f, e50.currency_id()); - assert_eq!(0x0501_07d1_000f_001f, e51.currency_id()); - assert_eq!(0x0502_07d2_001f_002f, e52.currency_id()); - assert_eq!(0x0503_07d3_002f_003f, e53.currency_id()); - assert_eq!(0x0504_07d4_003f_004f, e54.currency_id()); - assert_eq!(0x0505_07d5_004f_005f, e55.currency_id()); - } - - #[test] - fn u64_to_currency_id_should_work() { - let e00 = CurrencyId::Token(TokenSymbol::ASG); - let e01 = CurrencyId::Token(TokenSymbol::BNC); - let e02 = CurrencyId::Token(TokenSymbol::AUSD); - let e03 = CurrencyId::Token(TokenSymbol::DOT); - let e04 = CurrencyId::Token(TokenSymbol::KSM); - let e05 = CurrencyId::Token(TokenSymbol::ETH); - - assert_eq!(e00, CurrencyId::try_from(0x0000_0000_0000_0000).unwrap()); - assert_eq!(e01, CurrencyId::try_from(0x0001_0000_0000_0000).unwrap()); - assert_eq!(e02, CurrencyId::try_from(0x0002_0000_0000_0000).unwrap()); - assert_eq!(e03, CurrencyId::try_from(0x0003_0000_0000_0000).unwrap()); - assert_eq!(e04, CurrencyId::try_from(0x0004_0000_0000_0000).unwrap()); - assert_eq!(e05, CurrencyId::try_from(0x0005_0000_0000_0000).unwrap()); - - let e10 = CurrencyId::VToken(TokenSymbol::ASG); - let e11 = CurrencyId::VToken(TokenSymbol::BNC); - let e12 = CurrencyId::VToken(TokenSymbol::AUSD); - let e13 = CurrencyId::VToken(TokenSymbol::DOT); - let e14 = CurrencyId::VToken(TokenSymbol::KSM); - let e15 = CurrencyId::VToken(TokenSymbol::ETH); - - assert_eq!(e10, CurrencyId::try_from(0x0100_0000_0000_0000).unwrap()); - assert_eq!(e11, CurrencyId::try_from(0x0101_0000_0000_0000).unwrap()); - assert_eq!(e12, CurrencyId::try_from(0x0102_0000_0000_0000).unwrap()); - assert_eq!(e13, CurrencyId::try_from(0x0103_0000_0000_0000).unwrap()); - assert_eq!(e14, CurrencyId::try_from(0x0104_0000_0000_0000).unwrap()); - assert_eq!(e15, CurrencyId::try_from(0x0105_0000_0000_0000).unwrap()); - - let e20 = CurrencyId::Native(TokenSymbol::ASG); - let e21 = CurrencyId::Native(TokenSymbol::BNC); - let e22 = CurrencyId::Native(TokenSymbol::AUSD); - let e23 = CurrencyId::Native(TokenSymbol::DOT); - let e24 = CurrencyId::Native(TokenSymbol::KSM); - let e25 = CurrencyId::Native(TokenSymbol::ETH); - - assert_eq!(e20, CurrencyId::try_from(0x0200_0000_0000_0000).unwrap()); - assert_eq!(e21, CurrencyId::try_from(0x0201_0000_0000_0000).unwrap()); - assert_eq!(e22, CurrencyId::try_from(0x0202_0000_0000_0000).unwrap()); - assert_eq!(e23, CurrencyId::try_from(0x0203_0000_0000_0000).unwrap()); - assert_eq!(e24, CurrencyId::try_from(0x0204_0000_0000_0000).unwrap()); - assert_eq!(e25, CurrencyId::try_from(0x0205_0000_0000_0000).unwrap()); - - let e30 = CurrencyId::Stable(TokenSymbol::ASG); - let e31 = CurrencyId::Stable(TokenSymbol::BNC); - let e32 = CurrencyId::Stable(TokenSymbol::AUSD); - let e33 = CurrencyId::Stable(TokenSymbol::DOT); - let e34 = CurrencyId::Stable(TokenSymbol::KSM); - let e35 = CurrencyId::Stable(TokenSymbol::ETH); - - assert_eq!(e30, CurrencyId::try_from(0x0300_0000_0000_0000).unwrap()); - assert_eq!(e31, CurrencyId::try_from(0x0301_0000_0000_0000).unwrap()); - assert_eq!(e32, CurrencyId::try_from(0x0302_0000_0000_0000).unwrap()); - assert_eq!(e33, CurrencyId::try_from(0x0303_0000_0000_0000).unwrap()); - assert_eq!(e34, CurrencyId::try_from(0x0304_0000_0000_0000).unwrap()); - assert_eq!(e35, CurrencyId::try_from(0x0305_0000_0000_0000).unwrap()); - - let e40 = CurrencyId::VSToken(TokenSymbol::ASG); - let e41 = CurrencyId::VSToken(TokenSymbol::BNC); - let e42 = CurrencyId::VSToken(TokenSymbol::AUSD); - let e43 = CurrencyId::VSToken(TokenSymbol::DOT); - let e44 = CurrencyId::VSToken(TokenSymbol::KSM); - let e45 = CurrencyId::VSToken(TokenSymbol::ETH); - - assert_eq!(e40, CurrencyId::try_from(0x0400_0000_0000_0000).unwrap()); - assert_eq!(e41, CurrencyId::try_from(0x0401_0000_0000_0000).unwrap()); - assert_eq!(e42, CurrencyId::try_from(0x0402_0000_0000_0000).unwrap()); - assert_eq!(e43, CurrencyId::try_from(0x0403_0000_0000_0000).unwrap()); - assert_eq!(e44, CurrencyId::try_from(0x0404_0000_0000_0000).unwrap()); - assert_eq!(e45, CurrencyId::try_from(0x0405_0000_0000_0000).unwrap()); - - let e50 = CurrencyId::VSBond(TokenSymbol::ASG, 0x07d0, 0x0000, 0x000f); - let e51 = CurrencyId::VSBond(TokenSymbol::BNC, 0x07d1, 0x000f, 0x001f); - let e52 = CurrencyId::VSBond(TokenSymbol::AUSD, 0x07d2, 0x001f, 0x002f); - let e53 = CurrencyId::VSBond(TokenSymbol::DOT, 0x07d3, 0x002f, 0x003f); - let e54 = CurrencyId::VSBond(TokenSymbol::KSM, 0x07d4, 0x003f, 0x004f); - let e55 = CurrencyId::VSBond(TokenSymbol::ETH, 0x07d5, 0x004f, 0x005f); - - assert_eq!(e50, CurrencyId::try_from(0x0500_07d0_0000_000f).unwrap()); - assert_eq!(e51, CurrencyId::try_from(0x0501_07d1_000f_001f).unwrap()); - assert_eq!(e52, CurrencyId::try_from(0x0502_07d2_001f_002f).unwrap()); - assert_eq!(e53, CurrencyId::try_from(0x0503_07d3_002f_003f).unwrap()); - assert_eq!(e54, CurrencyId::try_from(0x0504_07d4_003f_004f).unwrap()); - assert_eq!(e55, CurrencyId::try_from(0x0505_07d5_004f_005f).unwrap()); - } -} diff --git a/node/primitives/src/tests.rs b/node/primitives/src/tests.rs new file mode 100644 index 0000000000..650c70f380 --- /dev/null +++ b/node/primitives/src/tests.rs @@ -0,0 +1,203 @@ +// This file is part of Bifrost. + +// Copyright (C) 2019-2021 Liebi Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#![cfg(test)] +use core::convert::TryFrom; + +use super::*; + +#[test] +fn currency_id_from_string_should_work() { + let currency_id = CurrencyId::try_from("DOT".as_bytes().to_vec()); + assert!(currency_id.is_ok()); + assert_eq!(currency_id.unwrap(), CurrencyId::Token(TokenSymbol::DOT)); +} + +#[test] +fn currency_id_to_u64_should_work() { + let e00 = CurrencyId::Token(TokenSymbol::ASG); + let e01 = CurrencyId::Token(TokenSymbol::BNC); + let e02 = CurrencyId::Token(TokenSymbol::AUSD); + let e03 = CurrencyId::Token(TokenSymbol::DOT); + let e04 = CurrencyId::Token(TokenSymbol::KSM); + let e05 = CurrencyId::Token(TokenSymbol::ETH); + + assert_eq!(0x0000_0000_0000_0000, e00.currency_id()); + assert_eq!(0x0001_0000_0000_0000, e01.currency_id()); + assert_eq!(0x0002_0000_0000_0000, e02.currency_id()); + assert_eq!(0x0003_0000_0000_0000, e03.currency_id()); + assert_eq!(0x0004_0000_0000_0000, e04.currency_id()); + assert_eq!(0x0005_0000_0000_0000, e05.currency_id()); + + let e10 = CurrencyId::VToken(TokenSymbol::ASG); + let e11 = CurrencyId::VToken(TokenSymbol::BNC); + let e12 = CurrencyId::VToken(TokenSymbol::AUSD); + let e13 = CurrencyId::VToken(TokenSymbol::DOT); + let e14 = CurrencyId::VToken(TokenSymbol::KSM); + let e15 = CurrencyId::VToken(TokenSymbol::ETH); + + assert_eq!(0x0100_0000_0000_0000, e10.currency_id()); + assert_eq!(0x0101_0000_0000_0000, e11.currency_id()); + assert_eq!(0x0102_0000_0000_0000, e12.currency_id()); + assert_eq!(0x0103_0000_0000_0000, e13.currency_id()); + assert_eq!(0x0104_0000_0000_0000, e14.currency_id()); + assert_eq!(0x0105_0000_0000_0000, e15.currency_id()); + + let e20 = CurrencyId::Native(TokenSymbol::ASG); + let e21 = CurrencyId::Native(TokenSymbol::BNC); + let e22 = CurrencyId::Native(TokenSymbol::AUSD); + let e23 = CurrencyId::Native(TokenSymbol::DOT); + let e24 = CurrencyId::Native(TokenSymbol::KSM); + let e25 = CurrencyId::Native(TokenSymbol::ETH); + + assert_eq!(0x0200_0000_0000_0000, e20.currency_id()); + assert_eq!(0x0201_0000_0000_0000, e21.currency_id()); + assert_eq!(0x0202_0000_0000_0000, e22.currency_id()); + assert_eq!(0x0203_0000_0000_0000, e23.currency_id()); + assert_eq!(0x0204_0000_0000_0000, e24.currency_id()); + assert_eq!(0x0205_0000_0000_0000, e25.currency_id()); + + let e30 = CurrencyId::Stable(TokenSymbol::ASG); + let e31 = CurrencyId::Stable(TokenSymbol::BNC); + let e32 = CurrencyId::Stable(TokenSymbol::AUSD); + let e33 = CurrencyId::Stable(TokenSymbol::DOT); + let e34 = CurrencyId::Stable(TokenSymbol::KSM); + let e35 = CurrencyId::Stable(TokenSymbol::ETH); + + assert_eq!(0x0300_0000_0000_0000, e30.currency_id()); + assert_eq!(0x0301_0000_0000_0000, e31.currency_id()); + assert_eq!(0x0302_0000_0000_0000, e32.currency_id()); + assert_eq!(0x0303_0000_0000_0000, e33.currency_id()); + assert_eq!(0x0304_0000_0000_0000, e34.currency_id()); + assert_eq!(0x0305_0000_0000_0000, e35.currency_id()); + + let e40 = CurrencyId::VSToken(TokenSymbol::ASG); + let e41 = CurrencyId::VSToken(TokenSymbol::BNC); + let e42 = CurrencyId::VSToken(TokenSymbol::AUSD); + let e43 = CurrencyId::VSToken(TokenSymbol::DOT); + let e44 = CurrencyId::VSToken(TokenSymbol::KSM); + let e45 = CurrencyId::VSToken(TokenSymbol::ETH); + + assert_eq!(0x0400_0000_0000_0000, e40.currency_id()); + assert_eq!(0x0401_0000_0000_0000, e41.currency_id()); + assert_eq!(0x0402_0000_0000_0000, e42.currency_id()); + assert_eq!(0x0403_0000_0000_0000, e43.currency_id()); + assert_eq!(0x0404_0000_0000_0000, e44.currency_id()); + assert_eq!(0x0405_0000_0000_0000, e45.currency_id()); + + let e50 = CurrencyId::VSBond(TokenSymbol::ASG, 0x07d0, 0x0000, 0x000f); + let e51 = CurrencyId::VSBond(TokenSymbol::BNC, 0x07d1, 0x000f, 0x001f); + let e52 = CurrencyId::VSBond(TokenSymbol::AUSD, 0x07d2, 0x001f, 0x002f); + let e53 = CurrencyId::VSBond(TokenSymbol::DOT, 0x07d3, 0x002f, 0x003f); + let e54 = CurrencyId::VSBond(TokenSymbol::KSM, 0x07d4, 0x003f, 0x004f); + let e55 = CurrencyId::VSBond(TokenSymbol::ETH, 0x07d5, 0x004f, 0x005f); + + assert_eq!(0x0500_07d0_0000_000f, e50.currency_id()); + assert_eq!(0x0501_07d1_000f_001f, e51.currency_id()); + assert_eq!(0x0502_07d2_001f_002f, e52.currency_id()); + assert_eq!(0x0503_07d3_002f_003f, e53.currency_id()); + assert_eq!(0x0504_07d4_003f_004f, e54.currency_id()); + assert_eq!(0x0505_07d5_004f_005f, e55.currency_id()); +} + +#[test] +fn u64_to_currency_id_should_work() { + let e00 = CurrencyId::Token(TokenSymbol::ASG); + let e01 = CurrencyId::Token(TokenSymbol::BNC); + let e02 = CurrencyId::Token(TokenSymbol::AUSD); + let e03 = CurrencyId::Token(TokenSymbol::DOT); + let e04 = CurrencyId::Token(TokenSymbol::KSM); + let e05 = CurrencyId::Token(TokenSymbol::ETH); + + assert_eq!(e00, CurrencyId::try_from(0x0000_0000_0000_0000).unwrap()); + assert_eq!(e01, CurrencyId::try_from(0x0001_0000_0000_0000).unwrap()); + assert_eq!(e02, CurrencyId::try_from(0x0002_0000_0000_0000).unwrap()); + assert_eq!(e03, CurrencyId::try_from(0x0003_0000_0000_0000).unwrap()); + assert_eq!(e04, CurrencyId::try_from(0x0004_0000_0000_0000).unwrap()); + assert_eq!(e05, CurrencyId::try_from(0x0005_0000_0000_0000).unwrap()); + + let e10 = CurrencyId::VToken(TokenSymbol::ASG); + let e11 = CurrencyId::VToken(TokenSymbol::BNC); + let e12 = CurrencyId::VToken(TokenSymbol::AUSD); + let e13 = CurrencyId::VToken(TokenSymbol::DOT); + let e14 = CurrencyId::VToken(TokenSymbol::KSM); + let e15 = CurrencyId::VToken(TokenSymbol::ETH); + + assert_eq!(e10, CurrencyId::try_from(0x0100_0000_0000_0000).unwrap()); + assert_eq!(e11, CurrencyId::try_from(0x0101_0000_0000_0000).unwrap()); + assert_eq!(e12, CurrencyId::try_from(0x0102_0000_0000_0000).unwrap()); + assert_eq!(e13, CurrencyId::try_from(0x0103_0000_0000_0000).unwrap()); + assert_eq!(e14, CurrencyId::try_from(0x0104_0000_0000_0000).unwrap()); + assert_eq!(e15, CurrencyId::try_from(0x0105_0000_0000_0000).unwrap()); + + let e20 = CurrencyId::Native(TokenSymbol::ASG); + let e21 = CurrencyId::Native(TokenSymbol::BNC); + let e22 = CurrencyId::Native(TokenSymbol::AUSD); + let e23 = CurrencyId::Native(TokenSymbol::DOT); + let e24 = CurrencyId::Native(TokenSymbol::KSM); + let e25 = CurrencyId::Native(TokenSymbol::ETH); + + assert_eq!(e20, CurrencyId::try_from(0x0200_0000_0000_0000).unwrap()); + assert_eq!(e21, CurrencyId::try_from(0x0201_0000_0000_0000).unwrap()); + assert_eq!(e22, CurrencyId::try_from(0x0202_0000_0000_0000).unwrap()); + assert_eq!(e23, CurrencyId::try_from(0x0203_0000_0000_0000).unwrap()); + assert_eq!(e24, CurrencyId::try_from(0x0204_0000_0000_0000).unwrap()); + assert_eq!(e25, CurrencyId::try_from(0x0205_0000_0000_0000).unwrap()); + + let e30 = CurrencyId::Stable(TokenSymbol::ASG); + let e31 = CurrencyId::Stable(TokenSymbol::BNC); + let e32 = CurrencyId::Stable(TokenSymbol::AUSD); + let e33 = CurrencyId::Stable(TokenSymbol::DOT); + let e34 = CurrencyId::Stable(TokenSymbol::KSM); + let e35 = CurrencyId::Stable(TokenSymbol::ETH); + + assert_eq!(e30, CurrencyId::try_from(0x0300_0000_0000_0000).unwrap()); + assert_eq!(e31, CurrencyId::try_from(0x0301_0000_0000_0000).unwrap()); + assert_eq!(e32, CurrencyId::try_from(0x0302_0000_0000_0000).unwrap()); + assert_eq!(e33, CurrencyId::try_from(0x0303_0000_0000_0000).unwrap()); + assert_eq!(e34, CurrencyId::try_from(0x0304_0000_0000_0000).unwrap()); + assert_eq!(e35, CurrencyId::try_from(0x0305_0000_0000_0000).unwrap()); + + let e40 = CurrencyId::VSToken(TokenSymbol::ASG); + let e41 = CurrencyId::VSToken(TokenSymbol::BNC); + let e42 = CurrencyId::VSToken(TokenSymbol::AUSD); + let e43 = CurrencyId::VSToken(TokenSymbol::DOT); + let e44 = CurrencyId::VSToken(TokenSymbol::KSM); + let e45 = CurrencyId::VSToken(TokenSymbol::ETH); + + assert_eq!(e40, CurrencyId::try_from(0x0400_0000_0000_0000).unwrap()); + assert_eq!(e41, CurrencyId::try_from(0x0401_0000_0000_0000).unwrap()); + assert_eq!(e42, CurrencyId::try_from(0x0402_0000_0000_0000).unwrap()); + assert_eq!(e43, CurrencyId::try_from(0x0403_0000_0000_0000).unwrap()); + assert_eq!(e44, CurrencyId::try_from(0x0404_0000_0000_0000).unwrap()); + assert_eq!(e45, CurrencyId::try_from(0x0405_0000_0000_0000).unwrap()); + + let e50 = CurrencyId::VSBond(TokenSymbol::ASG, 0x07d0, 0x0000, 0x000f); + let e51 = CurrencyId::VSBond(TokenSymbol::BNC, 0x07d1, 0x000f, 0x001f); + let e52 = CurrencyId::VSBond(TokenSymbol::AUSD, 0x07d2, 0x001f, 0x002f); + let e53 = CurrencyId::VSBond(TokenSymbol::DOT, 0x07d3, 0x002f, 0x003f); + let e54 = CurrencyId::VSBond(TokenSymbol::KSM, 0x07d4, 0x003f, 0x004f); + let e55 = CurrencyId::VSBond(TokenSymbol::ETH, 0x07d5, 0x004f, 0x005f); + + assert_eq!(e50, CurrencyId::try_from(0x0500_07d0_0000_000f).unwrap()); + assert_eq!(e51, CurrencyId::try_from(0x0501_07d1_000f_001f).unwrap()); + assert_eq!(e52, CurrencyId::try_from(0x0502_07d2_001f_002f).unwrap()); + assert_eq!(e53, CurrencyId::try_from(0x0503_07d3_002f_003f).unwrap()); + assert_eq!(e54, CurrencyId::try_from(0x0504_07d4_003f_004f).unwrap()); + assert_eq!(e55, CurrencyId::try_from(0x0505_07d5_004f_005f).unwrap()); +} diff --git a/node/primitives/src/traits.rs b/node/primitives/src/traits.rs index 4c65f7c521..b513bfb30f 100644 --- a/node/primitives/src/traits.rs +++ b/node/primitives/src/traits.rs @@ -27,7 +27,7 @@ use sp_runtime::{ }; use sp_std::{fmt::Debug, vec::Vec}; -use crate::{AccountAsset, BridgeAssetBalance, Token}; +use crate::BridgeAssetBalance; pub trait TokenInfo { fn currency_id(&self) -> u64; @@ -48,55 +48,6 @@ pub trait CurrencyIdExt { fn into(symbol: Self::TokenSymbol) -> Self; } -/// A handler to manipulate assets module -pub trait AssetTrait -where - CurrencyId: CurrencyIdExt, -{ - type Error; - fn asset_issue(asset_id: CurrencyId, target: &AccountId, amount: Balance); - - fn asset_destroy(asset_id: CurrencyId, target: &AccountId, amount: Balance); - - fn asset_id_exists(who: &AccountId, symbol: &[u8], precision: u16) -> Option; - - fn token_exists(asset_id: CurrencyId) -> bool; - - fn get_account_asset(asset_id: CurrencyId, target: &AccountId) -> AccountAsset; - - fn get_token(asset_id: CurrencyId) -> Token; -} - -/// Default impls -impl AssetTrait for () -where - CurrencyId: Default + CurrencyIdExt, - AccountId: Default, - Balance: Default, -{ - type Error = core::convert::Infallible; - - fn asset_issue(_: CurrencyId, _: &AccountId, _: Balance) {} - - fn asset_destroy(_: CurrencyId, _: &AccountId, _: Balance) {} - - fn asset_id_exists(_: &AccountId, _: &[u8], _: u16) -> Option { - Default::default() - } - - fn token_exists(_: CurrencyId) -> bool { - Default::default() - } - - fn get_account_asset(_: CurrencyId, _: &AccountId) -> AccountAsset { - Default::default() - } - - fn get_token(_: CurrencyId) -> Token { - Default::default() - } -} - pub trait TokenPriceHandler { fn set_token_price(asset_id: CurrencyId, price: Price); } diff --git a/node/service/src/chain_spec/asgard.rs b/node/service/src/chain_spec/asgard.rs index bf6e554628..021aa4b069 100644 --- a/node/service/src/chain_spec/asgard.rs +++ b/node/service/src/chain_spec/asgard.rs @@ -110,7 +110,6 @@ pub fn asgard_genesis( ], reward_by_one_block: 5 * DOLLARS / 100, round_index: 1, - storage_version: Default::default(), }, vtoken_mint: VtokenMintConfig { pools: vec![ diff --git a/node/service/src/chain_spec/mod.rs b/node/service/src/chain_spec/mod.rs index 3dfcc08dab..aa74a54baa 100644 --- a/node/service/src/chain_spec/mod.rs +++ b/node/service/src/chain_spec/mod.rs @@ -27,7 +27,7 @@ use std::{ }; use hex_literal::hex; -pub use node_primitives::{AccountAsset, AccountId, Balance, Signature, VtokenPool}; +pub use node_primitives::{AccountId, Block, Signature}; use sc_chain_spec::{ChainSpecExtension, ChainSpecGroup}; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use serde_json as json; diff --git a/pallets/minter-reward/src/lib.rs b/pallets/minter-reward/src/lib.rs index 648928f292..7aa2faccad 100644 --- a/pallets/minter-reward/src/lib.rs +++ b/pallets/minter-reward/src/lib.rs @@ -150,12 +150,6 @@ pub mod pallet { pub(crate) type UserBNCReward = StorageMap<_, Blake2_128Concat, T::AccountId, BalanceOf, ValueQuery>; - /// Current storage version - #[pallet::storage] - #[pallet::getter(fn storage_version)] - pub(crate) type StorageVersion = - StorageValue<_, node_primitives::StorageVersion, ValueQuery>; - /// Record maximum vtoken value is minted and when minted #[pallet::storage] #[pallet::getter(fn current_round)] @@ -267,7 +261,6 @@ pub mod pallet { pub wegiths: Vec<(CurrencyIdOf, T::ShareWeight)>, pub reward_by_one_block: BalanceOf, pub round_index: u8, - pub storage_version: node_primitives::StorageVersion, } #[cfg(feature = "std")] impl Default for GenesisConfig { @@ -276,7 +269,6 @@ pub mod pallet { wegiths: Default::default(), reward_by_one_block: Default::default(), round_index: Default::default(), - storage_version: Default::default(), } } } @@ -290,7 +282,6 @@ pub mod pallet { CurrentRound::::put(self.round_index); BNCRewardByOneBlock::::put(self.reward_by_one_block); - StorageVersion::::put(self.storage_version); } } diff --git a/pallets/minter-reward/src/mock.rs b/pallets/minter-reward/src/mock.rs index 5cd05fb5e2..bb36e33e15 100644 --- a/pallets/minter-reward/src/mock.rs +++ b/pallets/minter-reward/src/mock.rs @@ -326,7 +326,6 @@ impl ExtBuilder { ], reward_by_one_block: 300, round_index: 1, - storage_version: Default::default(), } .assimilate_storage(&mut t) .unwrap();