Closed justintim-es closed 4 years ago
the documentation of them should in the trait documentation https://substrate.dev/rustdocs/master/pallet_contracts/trait.Trait.html
you can also look at one implementation in substrate node: https://github.com/paritytech/substrate/blob/8091a0e5360c7d26a03c099e703c832c81ee2e4d/bin/node/runtime/src/lib.rs#L380-L419
//! The Substrate Node Template runtime. This can be compiled with #[no_std]
, ready for Wasm.
// construct_runtime!
does a lot of recursion and requires us to increase the limit to 256.
// Make the WASM binary available.
include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));
use rstd::prelude::*; use primitives::{OpaqueMetadata, crypto::key_types}; use sr_primitives::{ ApplyResult, transaction_validity::TransactionValidity, generic, create_runtime_str, impl_opaque_keys, AnySignature }; use sr_primitives::traits::{NumberFor, BlakeTwo256, Block as BlockT, StaticLookup, Verify, ConvertInto}; use sr_primitives::weights::Weight; use client::{ block_builder::api::{CheckInherentsResult, InherentData, self as block_builder_api}, runtime_api as client_api, impl_runtime_apis }; use aura_primitives::sr25519::AuthorityId as AuraId; use grandpa::{AuthorityId as GrandpaId, AuthorityWeight as GrandpaWeight}; use grandpa::fg_primitives; use version::RuntimeVersion;
use version::NativeVersion;
// A few exports that help ease life for downstream crates.
pub use sr_primitives::BuildStorage; pub use timestamp::Call as TimestampCall; pub use balances::Call as BalancesCall; pub use sr_primitives::{Permill, Perbill}; pub use support::{StorageValue, construct_runtime, parameter_types, traits::Randomness};
/// An index to a block. pub type BlockNumber = u32;
/// Alias to 512-bit hash when used in the context of a transaction signature on the chain. pub type Signature = AnySignature;
/// Some way of identifying an account on the chain. We intentionally make it equivalent
/// to the public key of our transaction signing scheme.
pub type AccountId =
/// The type for looking up accounts. We don't expect more than 4 billion of them, but you /// never know... pub type AccountIndex = u32;
/// Balance of an account. pub type Balance = u128;
/// Index of a transaction in the chain. pub type Index = u32;
/// A hash of some data used by the chain. pub type Hash = primitives::H256;
/// Digest item type.
pub type DigestItem = generic::DigestItem
/// Used for the module template in ./template.rs
mod template;
/// Opaque types. These are used by the CLI to instantiate machinery that don't need to know /// the specifics of the runtime. They can then be made to be agnostic over specific formats /// of data like extrinsics, allowing for them to continue syncing the network through upgrades /// to even the core datastructures. pub mod opaque { use super::*;
pub use sr_primitives::OpaqueExtrinsic as UncheckedExtrinsic;
/// Opaque block header type.
pub type Header = generic::Header<BlockNumber, BlakeTwo256>;
/// Opaque block type.
pub type Block = generic::Block<Header, UncheckedExtrinsic>;
/// Opaque block identifier type.
pub type BlockId = generic::BlockId<Block>;
impl_opaque_keys! {
pub struct SessionKeys {
#[id(key_types::AURA)]
pub aura: AuraId,
#[id(key_types::GRANDPA)]
pub grandpa: GrandpaId,
}
}
}
/// This runtime version. pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("node-template"), impl_name: create_runtime_str!("node-template"), authoring_version: 3, spec_version: 4, impl_version: 4, apis: RUNTIME_API_VERSIONS, };
pub const MILLISECS_PER_BLOCK: u64 = 6000;
pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK;
pub const EPOCH_DURATION_IN_BLOCKS: u32 = 10 * MINUTES;
// These time units are defined in number of blocks. pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); pub const HOURS: BlockNumber = MINUTES 60; pub const DAYS: BlockNumber = HOURS 24;
// 1 in 4 blocks (on average, not counting collisions) will be primary babe blocks. pub const PRIMARY_PROBABILITY: (u64, u64) = (1, 4);
/// The version infromation used to identify this runtime when compiled natively.
pub fn native_version() -> NativeVersion { NativeVersion { runtime_version: VERSION, can_author_with: Default::default(), } }
parameter_types! { pub const BlockHashCount: BlockNumber = 250; pub const MaximumBlockWeight: Weight = 1_000_000; pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); pub const MaximumBlockLength: u32 = 5 1024 1024; pub const Version: RuntimeVersion = VERSION; }
impl system::Trait for Runtime { /// The identifier used to distinguish between accounts. type AccountId = AccountId; /// The aggregated dispatch type that is available for extrinsics. type Call = Call; /// The lookup mechanism to get account ID from whatever is passed in dispatchers. type Lookup = Indices; /// The index type for storing how many extrinsics an account has signed. type Index = Index; /// The index type for blocks. type BlockNumber = BlockNumber; /// The type for hashing blocks and tries. type Hash = Hash; /// The hashing algorithm used. type Hashing = BlakeTwo256; /// The header type. type Header = generic::Header<BlockNumber, BlakeTwo256>; /// The ubiquitous event type. type Event = Event; /// The ubiquitous origin type. type Origin = Origin; /// Maximum number of block number to block hash mappings to keep (oldest pruned first). type BlockHashCount = BlockHashCount; /// Maximum weight of each block. type MaximumBlockWeight = MaximumBlockWeight; /// Maximum size of all encoded transactions (in bytes) that are allowed in one block. type MaximumBlockLength = MaximumBlockLength; /// Portion of the block weight that is available to all normal transactions. type AvailableBlockRatio = AvailableBlockRatio; /// Version of the runtime. type Version = Version; }
impl aura::Trait for Runtime { type AuthorityId = AuraId; }
impl grandpa::Trait for Runtime { type Event = Event; }
impl indices::Trait for Runtime { /// The type for recording indexing into the account enumeration. If this ever overflows, there /// will be problems! type AccountIndex = u32; /// Use the standard means of resolving an index hint from an id. type ResolveHint = indices::SimpleResolveHint<Self::AccountId, Self::AccountIndex>; /// Determine whether an account is dead. type IsDeadAccount = Balances; /// The ubiquitous event type. type Event = Event; }
parameter_types! { pub const MinimumPeriod: u64 = SLOT_DURATION / 2; }
impl timestamp::Trait for Runtime { /// A timestamp: milliseconds since the unix epoch. type Moment = u64; type OnTimestampSet = Aura; type MinimumPeriod = MinimumPeriod; }
parameter_types! { pub const ExistentialDeposit: u128 = 500; pub const TransferFee: u128 = 0; pub const CreationFee: u128 = 0; }
impl balances::Trait for Runtime { /// The type for recording an account's balance. type Balance = Balance; /// What to do if an account's free balance gets zeroed. type OnFreeBalanceZero = (Contract); /// What to do if a new account is created. type OnNewAccount = Indices; /// The ubiquitous event type. type Event = Event; type DustRemoval = (); type TransferPayment = (); type ExistentialDeposit = ExistentialDeposit; type TransferFee = TransferFee; type CreationFee = CreationFee; }
parameter_types! { pub const TransactionBaseFee: Balance = 0; pub const TransactionByteFee: Balance = 1; }
impl transaction_payment::Trait for Runtime {
type Currency = balances::Module
impl sudo::Trait for Runtime { type Event = Event; type Proposal = Call; }
/// Used for the module template in ./template.rs
impl template::Trait for Runtime {
type Event = Event;
}
impl contract::Trait for Runtime {
type Currency = Balances;
type Time = Timestamp;
type Randomness = RandomnessCollectiveFlip;
type Call = Call;
type Event = Event;
type DetermineContractAddress = contract::SimpleAddressDeterminator
construct_runtime!(
pub enum Runtime where
Block = Block,
NodeBlock = opaque::Block,
UncheckedExtrinsic = UncheckedExtrinsic
{
System: system::{Module, Call, Storage, Config, Event},
Timestamp: timestamp::{Module, Call, Storage, Inherent},
Aura: aura::{Module, Config./template.rs
TemplateModule: template::{Module, Call, Storage, Event
/// The address format for describing accounts.
pub type Address =
impl_runtime_apis! {
impl client_api::Core
fn execute_block(block: Block) {
Executive::execute_block(block)
}
fn initialize_block(header: &<Block as BlockT>::Header) {
Executive::initialize_block(header)
}
}
impl client_api::Metadata<Block> for Runtime {
fn metadata() -> OpaqueMetadata {
Runtime::metadata().into()
}
}
impl block_builder_api::BlockBuilder<Block> for Runtime {
fn apply_extrinsic(extrinsic: <Block as BlockT>::Extrinsic) -> ApplyResult {
Executive::apply_extrinsic(extrinsic)
}
fn finalize_block() -> <Block as BlockT>::Header {
Executive::finalize_block()
}
fn inherent_extrinsics(data: InherentData) -> Vec<<Block as BlockT>::Extrinsic> {
data.create_extrinsics()
}
fn check_inherents(block: Block, data: InherentData) -> CheckInherentsResult {
data.check_extrinsics(&block)
}
fn random_seed() -> <Block as BlockT>::Hash {
RandomnessCollectiveFlip::random_seed()
}
}
impl client_api::TaggedTransactionQueue<Block> for Runtime {
fn validate_transaction(tx: <Block as BlockT>::Extrinsic) -> TransactionValidity {
Executive::validate_transaction(tx)
}
}
impl offchain_primitives::OffchainWorkerApi<Block> for Runtime {
fn offchain_worker(number: NumberFor<Block>) {
Executive::offchain_worker(number)
}
}
impl aura_primitives::AuraApi<Block, AuraId> for Runtime {
fn slot_duration() -> u64 {
Aura::slot_duration()
}
fn authorities() -> Vec<AuraId> {
Aura::authorities()
}
}
impl substrate_session::SessionKeys<Block> for Runtime {
fn generate_session_keys(seed: Option<Vec<u8>>) -> Vec<u8> {
let seed = seed.as_ref().map(|s| rstd::str::from_utf8(&s).expect("Seed is an utf8 string"));
opaque::SessionKeys::generate(seed)
}
}
impl fg_primitives::GrandpaApi<Block> for Runtime {
fn grandpa_authorities() -> Vec<(GrandpaId, GrandpaWeight)> {
Grandpa::grandpa_authorities()
}
}
}
error: failed to run custom build command for node-template-runtime v2.0.0 (/home/noone/subnodewithcontract/substrate-node-template/runtime)
Caused by:
process didn't exit successfully: /home/noone/subnodewithcontract/substrate-node-template/target/release/build/node-template-runtime-63f84f0f85d169bf/build-script-build
(exit code: 1)
--- stdout
Executing build command: "rustup" "run" "nightly" "cargo" "build" "--target=wasm32-unknown-unknown" "--manifest-path=/home/noone/subnodewithcontract/substrate-node-template/target/release/wbuild/node-template-runtime/Cargo.toml" "--release"
--- stderr
Compiling wasm-build-runner-impl v1.0.0 (/home/noone/subnodewithcontract/substrate-node-template/target/release/wbuild-runner/node-template-runtime)
Finished release [optimized] target(s) in 0.72s
Running /home/noone/subnodewithcontract/substrate-node-template/target/release/wbuild-runner/node-template-runtime/target/release/wasm-build-runner-impl
Compiling node-template-runtime v2.0.0 (/home/noone/subnodewithcontract/substrate-node-template/runtime)
error[E0437]: type RentPayment
is not a member of trait contract::Trait
--> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:253:2
|
253 | type RentPayment = ();
| ^^^^^^^^^^^^^^^^^^^^^^ not a member of trait contract::Trait
error[E0433]: failed to resolve: use of undeclared type or module contracts
--> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:254:29
|
254 | type SignedClaimHandicap = contracts::DefaultSignedClaimHandicap;
| ^^^^^^^^^ use of undeclared type or module contracts
error[E0433]: failed to resolve: use of undeclared type or module contracts
--> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:256:27
|
256 | type StorageSizeOffset = contracts::DefaultStorageSizeOffset;
| ^^^^^^^^^ use of undeclared type or module contracts
error[E0412]: cannot find type TombstoneDeposit
in this scope
--> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:255:26
|
255 | type TombstoneDeposit = TombstoneDeposit;
| ^^^^^^^^^^^^^^^^ help: try: Self::TombstoneDeposit
error[E0412]: cannot find type RentByteFee
in this scope
--> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:257:21
|
257 | type RentByteFee = RentByteFee;
| ^^^^^^^^^^^ help: try: Self::RentByteFee
error[E0412]: cannot find type RentDepositOffset
in this scope
--> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:258:27
|
258 | type RentDepositOffset = RentDepositOffset;
| ^^^^^^^^^^^^^^^^^ help: try: Self::RentDepositOffset
error[E0412]: cannot find type SurchargeReward
in this scope
--> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:259:25
|
259 | type SurchargeReward = SurchargeReward;
| ^^^^^^^^^^^^^^^ help: try: Self::SurchargeReward
error[E0412]: cannot find type ContractTransferFee
in this scope
--> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:260:21
|
260 | type TransferFee = ContractTransferFee;
| ^^^^^^^^^^^^^^^^^^^ not found in this scope
error[E0412]: cannot find type ContractCreationFee
in this scope
--> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:261:21
|
261 | type CreationFee = ContractCreationFee;
| ^^^^^^^^^^^^^^^^^^^ not found in this scope
error[E0412]: cannot find type ContractTransactionBaseFee in this scope
--> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:262:28 |
220 | / parameter_types! { 221 | pub const TransactionBaseFee: Balance = 0; 222 | pub const TransactionByteFee: Balance = 1; 223 | } | _- similarly named struct TransactionBaseFee defined here
...
262 |
type TransactionBaseFee = ContractTransactionBaseFee; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: a struct with a similar name exists: TransactionBaseFee |
---|
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
error[E0412]: cannot find type ContractTransactionByteFee in this scope
--> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:263:28 |
220 | / parameter_types! { 221 | pub const TransactionBaseFee: Balance = 0; 222 | pub const TransactionByteFee: Balance = 1; 223 | } | _- similarly named struct TransactionByteFee defined here
...
263 |
type TransactionByteFee = ContractTransactionByteFee; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: a struct with a similar name exists: TransactionByteFee |
---|
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
error[E0412]: cannot find type ContractFee
in this scope
--> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:264:21
|
264 | type ContractFee = ContractFee;
| ^^^^^^^^^^^ help: try: Self::ContractFee
warning: unnecessary parentheses around type --> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:208:27 | 208 | type OnFreeBalanceZero = (Contract); | ^^^^^^^^^^ help: remove these parentheses |
---|
= note: `#[warn(unused_parens)]` on by default
error: aborting due to 12 previous errors
Some errors have detailed explanations: E0412, E0433, E0437.
For more information about an error, try rustc --explain E0412
.
error: could not compile node-template-runtime
.
To learn more, run the command again with --verbose.
you probably mixed formatting, files should be linked or put in gist, what is your issue ?
thanks for your help!
Do you mean it is fixed ? If documentation is not helpful enough feel free to ask in riot substrate technical channels or reopen this issue or open a new one.
I got the same error trying to add contracts pallet follow this tutorial: https://substrate.dev/docs/en/tutorials/add-a-pallet-to-your-runtime/
Fix:
Add the following lines to parameter_types!
in substrate-node-template/runtime/src/lib.rs
:
parameter_types! {
// ...
pub const TombstoneDeposit: Balance = 1 * DOLLARS;
pub const RentByteFee: Balance = 1 * DOLLARS;
pub const RentDepositOffset: Balance = 1000 * DOLLARS;
pub const SurchargeReward: Balance = 150 * DOLLARS;
}
Since the updrage to substrate 2.0 we have to implement some extra types with the contracts trait. Can anyone help me? the console helps me so far = help: implement the missing item:
type Time = Type;
= help: implement the missing item:type Randomness = Type;
= help: implement the missing item:type SignedClaimHandicap = Type;
= help: implement the missing item:type TombstoneDeposit = Type;
= help: implement the missing item:type StorageSizeOffset = Type;
= help: implement the missing item:type RentByteFee = Type;
= help: implement the missing item:type RentDepositOffset = Type;
= help: implement the missing item:type SurchargeReward = Type;
= help: implement the missing item:type TransferFee = Type;
= help: implement the missing item:type CreationFee = Type;
= help: implement the missing item:type TransactionBaseFee = Type;
= help: implement the missing item:type TransactionByteFee = Type;
= help: implement the missing item:type ContractFee = Type;
= help: implement the missing item:type CallBaseFee = Type;
= help: implement the missing item:type InstantiateBaseFee = Type;
= help: implement the missing item:type MaxDepth = Type;
= help: implement the missing item:type MaxValueSize = Type;
= help: implement the missing item:type BlockGasLimit = Type;