Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Commit

Permalink
contracts: Expose environment types for offchain tooling (#14750)
Browse files Browse the repository at this point in the history
* Expose environment types for offchain tooling

* Use EnvironmentType wrapper

* Add type impl to test config

---------

Co-authored-by: parity-processbot <>
  • Loading branch information
athei authored Aug 23, 2023
1 parent 30998d1 commit a732a9a
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 3 deletions.
1 change: 1 addition & 0 deletions bin/node/runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1265,6 +1265,7 @@ impl pallet_contracts::Config for Runtime {
type CodeHashLockupDepositPercent = CodeHashLockupDepositPercent;
#[cfg(feature = "unsafe-debug")]
type Debug = ();
type Environment = ();
}

impl pallet_sudo::Config for Runtime {
Expand Down
47 changes: 44 additions & 3 deletions frame/contracts/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ pub mod weights;
#[cfg(test)]
mod tests;
use crate::{
exec::{AccountIdOf, ErrorOrigin, ExecError, Executable, Key, Stack as ExecStack},
exec::{AccountIdOf, ErrorOrigin, ExecError, Executable, Key, MomentOf, Stack as ExecStack},
gas::GasMeter,
storage::{meter::Meter as StorageMeter, ContractInfo, DeletionQueueManager},
wasm::{CodeInfo, WasmBlob},
Expand All @@ -122,9 +122,13 @@ use frame_support::{
ConstU32, Contains, Get, Randomness, Time,
},
weights::Weight,
BoundedVec, RuntimeDebug, RuntimeDebugNoBound,
BoundedVec, DefaultNoBound, RuntimeDebug, RuntimeDebugNoBound,
};
use frame_system::{
ensure_signed,
pallet_prelude::{BlockNumberFor, OriginFor},
EventRecord, Pallet as System,
};
use frame_system::{ensure_signed, pallet_prelude::OriginFor, EventRecord, Pallet as System};
use pallet_contracts_primitives::{
Code, CodeUploadResult, CodeUploadReturnValue, ContractAccessError, ContractExecResult,
ContractInstantiateResult, ContractResult, ExecReturnValue, GetStorageResult,
Expand Down Expand Up @@ -179,6 +183,36 @@ const SENTINEL: u32 = u32::MAX;
/// Example: `RUST_LOG=runtime::contracts=debug my_code --dev`
const LOG_TARGET: &str = "runtime::contracts";

/// Wrapper around `PhantomData` to prevent it being filtered by `scale-info`.
///
/// `scale-info` filters out `PhantomData` fields because usually we are only interested
/// in sized types. However, when trying to communicate **types** as opposed to **values**
/// we want to have those zero sized types be included.
#[derive(Encode, Decode, DefaultNoBound, TypeInfo)]
#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))]
pub struct EnvironmentType<T>(PhantomData<T>);

/// List of all runtime configurable types that are used in the communication between
/// `pallet-contracts` and any given contract.
///
/// Since those types are configurable they can vary between
/// chains all using `pallet-contracts`. Hence we need a mechanism to communicate those types
/// in a way that can be consumed by offchain tooling.
///
/// This type only exists in order to appear in the metadata where it can be read by
/// offchain tooling.
#[derive(Encode, Decode, DefaultNoBound, TypeInfo)]
#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))]
#[scale_info(skip_type_params(T))]
pub struct Environment<T: Config> {
account_id: EnvironmentType<AccountIdOf<T>>,
balance: EnvironmentType<BalanceOf<T>>,
hash: EnvironmentType<<T as frame_system::Config>::Hash>,
hasher: EnvironmentType<<T as frame_system::Config>::Hashing>,
timestamp: EnvironmentType<MomentOf<T>>,
block_number: EnvironmentType<BlockNumberFor<T>>,
}

#[frame_support::pallet]
pub mod pallet {
use super::*;
Expand Down Expand Up @@ -360,6 +394,13 @@ pub mod pallet {
/// Do **not** use it in a production environment or for benchmarking purposes.
#[cfg(feature = "unsafe-debug")]
type Debug: unsafe_debug::UnsafeDebug<Self>;

/// Type that bundles together all the runtime configurable interface types.
///
/// This is not a real config. We just mention the type here as constant so that
/// its type appears in the metadata. Only valid value is `()`.
#[pallet::constant]
type Environment: Get<Environment<Self>>;
}

#[pallet::hooks]
Expand Down
1 change: 1 addition & 0 deletions frame/contracts/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -481,6 +481,7 @@ impl Config for Test {
type MaxDelegateDependencies = MaxDelegateDependencies;
#[cfg(feature = "unsafe-debug")]
type Debug = unsafe_debug::TestDebugger;
type Environment = ();
}

pub const ALICE: AccountId32 = AccountId32::new([1u8; 32]);
Expand Down

0 comments on commit a732a9a

Please sign in to comment.