difftreelog
build(rmrk) rmrk freed
in: master
8 files changed
node/cli/src/service.rsdiffbeforeafterboth--- a/node/cli/src/service.rs
+++ b/node/cli/src/service.rs
@@ -66,10 +66,10 @@
use unique_runtime_common::types::{AuraId, RuntimeInstance, AccountId, Balance, Index, Hash, Block};
// RMRK
-/* TODO free RMRK! use up_data_structs::{
+use up_data_structs::{
RmrkCollectionInfo, RmrkInstanceInfo, RmrkResourceInfo, RmrkPropertyInfo, RmrkBaseInfo,
RmrkPartType, RmrkTheme,
-};*/
+};
/// Unique native executor instance.
#[cfg(feature = "unique-runtime")]
@@ -354,7 +354,6 @@
+ pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi<Block, Balance>
+ sp_api::ApiExt<Block, StateBackend = sc_client_api::StateBackendFor<FullBackend, Block>>
+ up_rpc::UniqueApi<Block, Runtime::CrossAccountId, AccountId>
- /* TODO free RMRK!
+ rmrk_rpc::RmrkApi<
Block,
AccountId,
@@ -365,7 +364,7 @@
RmrkBaseInfo<AccountId>,
RmrkPartType,
RmrkTheme,
- >*/
+ >
+ substrate_frame_rpc_system::AccountNonceApi<Block, AccountId, Index>
+ sp_api::Metadata<Block>
+ sp_offchain::OffchainWorkerApi<Block>
@@ -661,7 +660,6 @@
+ pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi<Block, Balance>
+ sp_api::ApiExt<Block, StateBackend = sc_client_api::StateBackendFor<FullBackend, Block>>
+ up_rpc::UniqueApi<Block, Runtime::CrossAccountId, AccountId>
- /* TODO free RMRK!
+ rmrk_rpc::RmrkApi<
Block,
AccountId,
@@ -672,7 +670,7 @@
RmrkBaseInfo<AccountId>,
RmrkPartType,
RmrkTheme,
- >*/
+ >
+ substrate_frame_rpc_system::AccountNonceApi<Block, AccountId, Index>
+ sp_api::Metadata<Block>
+ sp_offchain::OffchainWorkerApi<Block>
@@ -807,7 +805,6 @@
+ pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi<Block, Balance>
+ sp_api::ApiExt<Block, StateBackend = sc_client_api::StateBackendFor<FullBackend, Block>>
+ up_rpc::UniqueApi<Block, Runtime::CrossAccountId, AccountId>
- /* TODO free RMRK!
+ rmrk_rpc::RmrkApi<
Block,
AccountId,
@@ -818,7 +815,7 @@
RmrkBaseInfo<AccountId>,
RmrkPartType,
RmrkTheme,
- >*/
+ >
+ substrate_frame_rpc_system::AccountNonceApi<Block, AccountId, Index>
+ sp_api::Metadata<Block>
+ sp_offchain::OffchainWorkerApi<Block>
node/rpc/src/lib.rsdiffbeforeafterboth--- a/node/rpc/src/lib.rs
+++ b/node/rpc/src/lib.rs
@@ -44,10 +44,10 @@
Hash, AccountId, RuntimeInstance, Index, Block, BlockNumber, Balance,
};
// RMRK
-/* TODO free RMRK! use up_data_structs::{
+use up_data_structs::{
RmrkCollectionInfo, RmrkInstanceInfo, RmrkResourceInfo, RmrkPropertyInfo, RmrkBaseInfo,
RmrkPartType, RmrkTheme,
-};*/
+};
/// Extra dependencies for GRANDPA
pub struct GrandpaDeps<B> {
@@ -146,7 +146,6 @@
C::Api: fp_rpc::EthereumRuntimeRPCApi<Block>,
C::Api: fp_rpc::ConvertTransactionRuntimeApi<Block>,
C::Api: up_rpc::UniqueApi<Block, <R as RuntimeInstance>::CrossAccountId, AccountId>,
- /* TODO free RMRK!
C::Api: rmrk_rpc::RmrkApi<
Block,
AccountId,
@@ -157,7 +156,7 @@
RmrkBaseInfo<AccountId>,
RmrkPartType,
RmrkTheme,
- >,*/
+ >,
B: sc_client_api::Backend<Block> + Send + Sync + 'static,
B::State: sc_client_api::backend::StateBackend<sp_runtime::traits::HashFor<Block>>,
P: TransactionPool<Block = Block> + 'static,
@@ -223,10 +222,8 @@
.into_rpc(),
)?;
- // todo look into
- //let unique = Unique::new(client.clone());
io.merge(Unique::new(client.clone()).into_rpc())?;
- // TODO free RMRK! io.extend_with(RmrkApi::to_delegate(Unique::new(client.clone())));
+ // TODO RMRK
if let Some(filter_pool) = filter_pool {
io.merge(
runtime/common/src/runtime_apis.rsdiffbeforeafterboth--- a/runtime/common/src/runtime_apis.rs
+++ b/runtime/common/src/runtime_apis.rs
@@ -128,8 +128,6 @@
}
}
- /*
- TODO free RMRK!
impl rmrk_rpc::RmrkApi<
Block,
AccountId,
@@ -463,7 +461,7 @@
Ok(Some(theme))
}
- }*/
+ }
impl sp_api::Core<Block> for Runtime {
fn version() -> RuntimeVersion {
runtime/opal/src/lib.rsdiffbeforeafterboth--- a/runtime/opal/src/lib.rs
+++ b/runtime/opal/src/lib.rs
@@ -914,15 +914,13 @@
type WeightInfo = pallet_nonfungible::weights::SubstrateWeight<Self>;
}
-/*
-TODO free RMRK!
impl pallet_proxy_rmrk_core::Config for Runtime {
type Event = Event;
}
impl pallet_proxy_rmrk_equip::Config for Runtime {
type Event = Event;
-}*/
+}
impl pallet_unique::Config for Runtime {
type Event = Event;
@@ -1164,10 +1162,8 @@
Refungible: pallet_refungible::{Pallet, Storage} = 68,
Nonfungible: pallet_nonfungible::{Pallet, Storage} = 69,
Structure: pallet_structure::{Pallet, Call, Storage, Event<T>} = 70,
- /* TODO free RMRK!
RmrkCore: pallet_proxy_rmrk_core::{Pallet, Call, Storage, Event<T>} = 71,
RmrkEquip: pallet_proxy_rmrk_equip::{Pallet, Call, Storage, Event<T>} = 72,
- */
// Frontier
EVM: pallet_evm::{Pallet, Config, Call, Storage, Event<T>} = 100,
runtime/quartz/src/lib.rsdiffbeforeafterboth--- a/runtime/quartz/src/lib.rs
+++ b/runtime/quartz/src/lib.rs
@@ -912,14 +912,14 @@
impl pallet_nonfungible::Config for Runtime {
type WeightInfo = pallet_nonfungible::weights::SubstrateWeight<Self>;
}
-/* TODO free RMRK!
+
impl pallet_proxy_rmrk_core::Config for Runtime {
type Event = Event;
}
impl pallet_proxy_rmrk_equip::Config for Runtime {
type Event = Event;
-}*/
+}
impl pallet_unique::Config for Runtime {
type Event = Event;
@@ -1160,9 +1160,8 @@
Refungible: pallet_refungible::{Pallet, Storage} = 68,
Nonfungible: pallet_nonfungible::{Pallet, Storage} = 69,
Structure: pallet_structure::{Pallet, Call, Storage, Event<T>} = 70,
- /* TODO free RMRK!
RmrkCore: pallet_proxy_rmrk_core::{Pallet, Call, Storage, Event<T>} = 71,
- RmrkEquip: pallet_proxy_rmrk_equip::{Pallet, Call, Storage, Event<T>} = 72,*/
+ RmrkEquip: pallet_proxy_rmrk_equip::{Pallet, Call, Storage, Event<T>} = 72,
// Frontier
EVM: pallet_evm::{Pallet, Config, Call, Storage, Event<T>} = 100,
runtime/unique/src/lib.rsdiffbeforeafterboth--- a/runtime/unique/src/lib.rs
+++ b/runtime/unique/src/lib.rs
@@ -911,14 +911,14 @@
impl pallet_nonfungible::Config for Runtime {
type WeightInfo = pallet_nonfungible::weights::SubstrateWeight<Self>;
}
-/* TODO free RMRK!
+
impl pallet_proxy_rmrk_core::Config for Runtime {
type Event = Event;
}
impl pallet_proxy_rmrk_equip::Config for Runtime {
type Event = Event;
-}*/
+}
impl pallet_unique::Config for Runtime {
type Event = Event;
@@ -1159,9 +1159,8 @@
Refungible: pallet_refungible::{Pallet, Storage} = 68,
Nonfungible: pallet_nonfungible::{Pallet, Storage} = 69,
Structure: pallet_structure::{Pallet, Call, Storage, Event<T>} = 70,
- /* TODO free RMRK!
RmrkCore: pallet_proxy_rmrk_core::{Pallet, Call, Storage, Event<T>} = 71,
- RmrkEquip: pallet_proxy_rmrk_equip::{Pallet, Call, Storage, Event<T>} = 72,*/
+ RmrkEquip: pallet_proxy_rmrk_equip::{Pallet, Call, Storage, Event<T>} = 72,
// Frontier
EVM: pallet_evm::{Pallet, Config, Call, Storage, Event<T>} = 100,
tests/src/interfaces/definitions.tsdiffbeforeafterboth--- a/tests/src/interfaces/definitions.ts
+++ b/tests/src/interfaces/definitions.ts
@@ -15,5 +15,5 @@
// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
export {default as unique} from './unique/definitions';
-// TODO free RMRK! export {default as rmrk} from './rmrk/definitions';
+export {default as rmrk} from './rmrk/definitions';
export {default as default} from './default/definitions';
\ No newline at end of file
tests/src/substrate/substrate-api.tsdiffbeforeafterboth1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617import {ApiPromise, WsProvider} from '@polkadot/api';18import {ApiOptions, ApiTypes, SubmittableExtrinsic} from '@polkadot/api/types';19import {ExtrinsicStatus} from '@polkadot/types/interfaces/author/types';20import {EventRecord} from '@polkadot/types/interfaces/system/types';21import {IKeyringPair} from '@polkadot/types/types';22import config from '../config';23import '../interfaces/augment-api-events';24import * as defs from '../interfaces/definitions';25import privateKey from './privateKey';26import promisifySubstrate from './promisify-substrate';27282930function defaultApiOptions(): ApiOptions {31 const wsProvider = new WsProvider(config.substrateUrl);32 return {33 provider: wsProvider, signedExtensions: {34 ContractHelpers: {35 extrinsic: {},36 payload: {},37 },38 FakeTransactionFinalizer: {39 extrinsic: {},40 payload: {},41 },42 },43 rpc: {44 unique: defs.unique.rpc,45 // TODO free RMRK! rmrk: defs.rmrk.rpc,46 eth: {47 feeHistory: {48 description: 'Dummy',49 params: [],50 type: 'u8',51 },52 maxPriorityFeePerGas: {53 description: 'Dummy',54 params: [],55 type: 'u8',56 },57 },58 },59 };60}6162export default async function usingApi<T = void>(action: (api: ApiPromise, privateKeyWrapper: (account: string) => IKeyringPair) => Promise<T>, settings: ApiOptions | undefined = undefined): Promise<T> {63 settings = settings || defaultApiOptions();64 const api: ApiPromise = new ApiPromise(settings);65 let result: T = null as unknown as T;6667 // TODO: Remove, this is temporary: Filter unneeded API output68 // (Jaco promised it will be removed in the next version)69 const consoleErr = console.error;70 const consoleLog = console.log;71 const consoleWarn = console.warn;7273 const outFn = (printer: any) => (...args: any[]) => {74 for (const arg of args) {75 if (typeof arg !== 'string')76 continue;77 if (arg.includes('1000:: Normal connection closure' || arg === 'Normal connection closure'))78 return;79 }80 printer(...args);81 };8283 console.error = outFn(consoleErr.bind(console));84 console.log = outFn(consoleLog.bind(console));85 console.warn = outFn(consoleWarn.bind(console));8687 try {88 await promisifySubstrate(api, async () => {89 if (api) {90 await api.isReadyOrError;91 const ss58Format = (api.registry.getChainProperties())!.toHuman().ss58Format;92 const privateKeyWrapper = (account: string) => privateKey(account, Number(ss58Format));93 result = await action(api, privateKeyWrapper);94 }95 })();96 } finally {97 await api.disconnect();98 console.error = consoleErr;99 console.log = consoleLog;100 console.warn = consoleWarn;101 }102 return result as T;103}104105enum TransactionStatus {106 Success,107 Fail,108 NotReady109}110111function getTransactionStatus(events: EventRecord[], status: ExtrinsicStatus): TransactionStatus {112 if (status.isReady) {113 return TransactionStatus.NotReady;114 }115 if (status.isBroadcast) {116 return TransactionStatus.NotReady;117 }118 if (status.isInBlock || status.isFinalized) {119 if(events.filter(e => e.event.data.method === 'ExtrinsicFailed').length > 0) {120 return TransactionStatus.Fail;121 }122 if(events.filter(e => e.event.data.method === 'ExtrinsicSuccess').length > 0) {123 return TransactionStatus.Success;124 }125 }126127 return TransactionStatus.Fail;128}129130export function executeTransaction(api: ApiPromise, sender: IKeyringPair, transaction: SubmittableExtrinsic<'promise'>): Promise<EventRecord[]> {131 return new Promise(async (res, rej) => {132 try {133 await transaction.signAndSend(sender, ({events, status}) => {134 if (!status.isInBlock && !status.isFinalized) return;135 for (const {event} of events) {136 if (api.events.system.ExtrinsicSuccess.is(event)) {137 res(events);138 } else if (api.events.system.ExtrinsicFailed.is(event)) {139 const {data: [error]} = event;140 if (error.isModule) {141 const decoded = api.registry.findMetaError(error.asModule);142 const {method, section} = decoded;143 rej(new Error(`${section}.${method}`));144 } else {145 rej(new Error(error.toString()));146 }147 }148 }149 });150 } catch (e) {151 rej(e);152 }153 });154}155156export function157submitTransactionAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {158 /* eslint no-async-promise-executor: "off" */159 return new Promise(async (resolve, reject) => {160 try {161 await transaction.signAndSend(sender, ({events = [], status}) => {162 const transactionStatus = getTransactionStatus(events, status);163164 if (transactionStatus === TransactionStatus.Success) {165 resolve(events);166 } else if (transactionStatus === TransactionStatus.Fail) {167 console.log(`Something went wrong with transaction. Status: ${status}`);168 reject(events);169 }170 });171 } catch (e) {172 console.log('Error: ', e);173 reject(e);174 }175 });176}177178export function submitTransactionExpectFailAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {179 console.error = () => {};180 console.log = () => {};181182 /* eslint no-async-promise-executor: "off" */183 return new Promise<EventRecord[]>(async function(res, rej) {184 const resolve = (rec: EventRecord[]) => {185 setTimeout(() => {186 res(rec);187 });188 };189 const reject = (errror: any) => {190 setTimeout(() => {191 rej(errror);192 });193 };194 try {195 await transaction.signAndSend(sender, ({events = [], status}) => {196 const transactionStatus = getTransactionStatus(events, status);197198 // console.log('transactionStatus', transactionStatus, 'events', events);199200 if (transactionStatus === TransactionStatus.Success) {201 resolve(events);202 } else if (transactionStatus === TransactionStatus.Fail) {203 reject(events);204 }205 });206 } catch (e) {207 reject(e);208 }209 });210}1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617import {ApiPromise, WsProvider} from '@polkadot/api';18import {ApiOptions, ApiTypes, SubmittableExtrinsic} from '@polkadot/api/types';19import {ExtrinsicStatus} from '@polkadot/types/interfaces/author/types';20import {EventRecord} from '@polkadot/types/interfaces/system/types';21import {IKeyringPair} from '@polkadot/types/types';22import config from '../config';23import '../interfaces/augment-api-events';24import * as defs from '../interfaces/definitions';25import privateKey from './privateKey';26import promisifySubstrate from './promisify-substrate';27282930function defaultApiOptions(): ApiOptions {31 const wsProvider = new WsProvider(config.substrateUrl);32 return {33 provider: wsProvider, signedExtensions: {34 ContractHelpers: {35 extrinsic: {},36 payload: {},37 },38 FakeTransactionFinalizer: {39 extrinsic: {},40 payload: {},41 },42 },43 rpc: {44 unique: defs.unique.rpc,45 rmrk: defs.rmrk.rpc,46 eth: {47 feeHistory: {48 description: 'Dummy',49 params: [],50 type: 'u8',51 },52 maxPriorityFeePerGas: {53 description: 'Dummy',54 params: [],55 type: 'u8',56 },57 },58 },59 };60}6162export default async function usingApi<T = void>(action: (api: ApiPromise, privateKeyWrapper: (account: string) => IKeyringPair) => Promise<T>, settings: ApiOptions | undefined = undefined): Promise<T> {63 settings = settings || defaultApiOptions();64 const api: ApiPromise = new ApiPromise(settings);65 let result: T = null as unknown as T;6667 // TODO: Remove, this is temporary: Filter unneeded API output68 // (Jaco promised it will be removed in the next version)69 const consoleErr = console.error;70 const consoleLog = console.log;71 const consoleWarn = console.warn;7273 const outFn = (printer: any) => (...args: any[]) => {74 for (const arg of args) {75 if (typeof arg !== 'string')76 continue;77 if (arg.includes('1000:: Normal connection closure' || arg === 'Normal connection closure'))78 return;79 }80 printer(...args);81 };8283 console.error = outFn(consoleErr.bind(console));84 console.log = outFn(consoleLog.bind(console));85 console.warn = outFn(consoleWarn.bind(console));8687 try {88 await promisifySubstrate(api, async () => {89 if (api) {90 await api.isReadyOrError;91 const ss58Format = (api.registry.getChainProperties())!.toHuman().ss58Format;92 const privateKeyWrapper = (account: string) => privateKey(account, Number(ss58Format));93 result = await action(api, privateKeyWrapper);94 }95 })();96 } finally {97 await api.disconnect();98 console.error = consoleErr;99 console.log = consoleLog;100 console.warn = consoleWarn;101 }102 return result as T;103}104105enum TransactionStatus {106 Success,107 Fail,108 NotReady109}110111function getTransactionStatus(events: EventRecord[], status: ExtrinsicStatus): TransactionStatus {112 if (status.isReady) {113 return TransactionStatus.NotReady;114 }115 if (status.isBroadcast) {116 return TransactionStatus.NotReady;117 }118 if (status.isInBlock || status.isFinalized) {119 if(events.filter(e => e.event.data.method === 'ExtrinsicFailed').length > 0) {120 return TransactionStatus.Fail;121 }122 if(events.filter(e => e.event.data.method === 'ExtrinsicSuccess').length > 0) {123 return TransactionStatus.Success;124 }125 }126127 return TransactionStatus.Fail;128}129130export function executeTransaction(api: ApiPromise, sender: IKeyringPair, transaction: SubmittableExtrinsic<'promise'>): Promise<EventRecord[]> {131 return new Promise(async (res, rej) => {132 try {133 await transaction.signAndSend(sender, ({events, status}) => {134 if (!status.isInBlock && !status.isFinalized) return;135 for (const {event} of events) {136 if (api.events.system.ExtrinsicSuccess.is(event)) {137 res(events);138 } else if (api.events.system.ExtrinsicFailed.is(event)) {139 const {data: [error]} = event;140 if (error.isModule) {141 const decoded = api.registry.findMetaError(error.asModule);142 const {method, section} = decoded;143 rej(new Error(`${section}.${method}`));144 } else {145 rej(new Error(error.toString()));146 }147 }148 }149 });150 } catch (e) {151 rej(e);152 }153 });154}155156export function157submitTransactionAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {158 /* eslint no-async-promise-executor: "off" */159 return new Promise(async (resolve, reject) => {160 try {161 await transaction.signAndSend(sender, ({events = [], status}) => {162 const transactionStatus = getTransactionStatus(events, status);163164 if (transactionStatus === TransactionStatus.Success) {165 resolve(events);166 } else if (transactionStatus === TransactionStatus.Fail) {167 console.log(`Something went wrong with transaction. Status: ${status}`);168 reject(events);169 }170 });171 } catch (e) {172 console.log('Error: ', e);173 reject(e);174 }175 });176}177178export function submitTransactionExpectFailAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {179 console.error = () => {};180 console.log = () => {};181182 /* eslint no-async-promise-executor: "off" */183 return new Promise<EventRecord[]>(async function(res, rej) {184 const resolve = (rec: EventRecord[]) => {185 setTimeout(() => {186 res(rec);187 });188 };189 const reject = (errror: any) => {190 setTimeout(() => {191 rej(errror);192 });193 };194 try {195 await transaction.signAndSend(sender, ({events = [], status}) => {196 const transactionStatus = getTransactionStatus(events, status);197198 // console.log('transactionStatus', transactionStatus, 'events', events);199200 if (transactionStatus === TransactionStatus.Success) {201 resolve(events);202 } else if (transactionStatus === TransactionStatus.Fail) {203 reject(events);204 }205 });206 } catch (e) {207 reject(e);208 }209 });210}