Commit 321fe03a authored by Hero Bird's avatar Hero Bird Committed by GitHub

Implementation of ink! env (revision 3) (#312)

* [core] initial implementation of env revision 3

* add engine abstraction layer and implement api functions

* add support for dispatch_call to env3

* add missing invoke_runtime to api.rs

* [core] fix restore_contract docs

* [core] initial implementation of off-chain environment

* [core] clean-up of env3 fundamental types

* [core] add WasmEnv::reset_buffer

* show test submodule of env3 when compiling with rustdoc

* [core] initial implementation of the off-chain env instance

Also many other adjustments.

* [core] further enhancements to off-chain env

* [core] implement untyped Env for off-chain environment

* [core] implemented a good chunk of TypedEnv for the off-chain environment

* [core] minor improvements to env3

* [core] further improvements and additions to test-api of env3

* [core] remove former test-api file

* [core] env3: add support for ext_tombstone_deposit

* [core] env3: add setting of rent allowance in off-chain env

* [core] env3: remove buffer.rs

* [core] env3: remove property.rs

* [core] env3: mark some TypedEnv methods as not-todo

* [core] env3: enable off-chain api for non test/doc builds

* [core] env3: use a static buffer instead of Vec<u8>

* [core] env3: move static buffer into its own module

* fix doc comment
Co-Authored-By: Michael Müller's avatarMichael Müller <mich@elmueller.net>

* [core] env3: add missing license header

* [core] env3: remove deprecated doc note

* [core] env3: add off-chain {set/get}_runtime_storage

* [core] env3: add off-chain invoke_runtime dispatch

This also enables support for registering custom runtime call handlers.

* [core] env3: slightly improve env3::random docs comment

* [core] env3: move off-chain errors under EnvError

* [core] env3: add ext_random support for the off-chain environment

* [core] env3: minor clean ups

* [core] env3: improve TypedEncoded::assign

* [core] env3: un-mut some variables

* [core] env3: fix some clippy warnings

* [core] env3: add past_printlns to off-chain test api

* [core] env3: minor refactoring

* [core] env3: apply rustfmt

* [core] env3: clean up of call and instantiate contract

* [core] env3: rename moment -> time_stamp

* [core] env3: make get_runtime_storage return a Result instead of RetCode

* [core] env3: remove unneeded import

* [core] env3: add some trait impls for EnvTypes::Hash

* [core] env3: remove last remaining usages of RetCode

* [core] env3: refactor some errors

* [core] env3: document the EnvError enum

* [core] env3: add impls for fire methods on call and create builders

* [core] env3: add doc comment to past_printlns

* [core] env3: apply rustfmt

* [core] env3: update license headers

* [core] env3: support querying and emitting of events in off-chain env

* [core] env3: missing license header adjustment

* [core] env3: apply rustfmt

* [core] env3: rename some methods in off-chain test-api

* [core] env3: add doc comment to test::emitted_events

* [core] env3: add stub for test::advance_block

* [core] env3: rename some more test API methods

* [core] env3: initialize entropy of block randomly

* [core] env3: extend EnvTypes trait bounds

This change makes the trait bounds more similar to what Substrate defines.

* [core] env3: document SimpleArithmetic trait

* [core] env3: add From<u32> to SimpleArithmetic trait

* [core] env3: made some trait bounds more explicit in SimpleArithmetic trait

* [core] env3: add comment describing potential future extensions to SimpleArithmetic trait

* [core] env3: rename EnvTypes::Moment to TimeStamp

* [core] env3: add block_time to ChainSpec

* [core] env3: remove CodeDb again

Not needed right now. Maybe re-added at a later point.

* [core] env3: apply rustfmt

* [core] env3: implement off-chain test::advance_block

* [core] env3: fix bug in off-chain test::advance_block impl

* [core] env3: made SimpleArithmetic trait more explicit towards Output types

* [core] env3: add default initialization routines for off-chain environment

* [core] env3: remove test::create_user_account for now

* [core] env3: fix missing renaming from Moment -> TimeStamp

* [core] env3: impl PartialEq and Eq for off-chain error types

* [core] env3: add test::run_test for off-chain testing with default setup

* [core] env3: fix several minor bugs with the off-chain environment

* [core] convert key.rs tests to new env3

* [core] remove commented out code in key.rs tests

* [core] evn3: add test::get_contract_storage_rw

* [core] use env3 instead of env1 in storage cells

* [core] integrate env3 into storage::TypedChunk

* [core] remove storage::RawChunk and NonCloneMarker

* [core] adjust SyncChunk slightly for TypedChunk modifications

* [core] simplify transitioned env3 tests for TypedChunk

* [core] transition tests for SynChunk to env3

* [core] transition storage::Stash tests to env3

* [core] transition storage::HashMap tests to env3

* [core] transition storage::BinaryHeap tests to env3

* [lang] remove the entire ink! lang crate

It has been deprecated for a whole while.

* [model] remove ink! model crate entirely

It has been deprecated for a whole while.

* [core] remove the old env1 sub-module of ink_core

It has been deprecated for a whole while.

* [examples] remove model examples

* [examples] remove lang examples

* [examples] remove core examples

* remove "If given too few endowment" from docs
Co-Authored-By: Andrew Jones's avatarAndrew Jones <ascjones@gmail.com>

* fix doc comment
Co-Authored-By: Andrew Jones's avatarAndrew Jones <ascjones@gmail.com>

* fix doc comment
Co-Authored-By: Andrew Jones's avatarAndrew Jones <ascjones@gmail.com>

* [lang2] initial steps towards basing on env3 instead of env2

With this commit `cargo contract build` already works.
However, cargo test etc. are still broken.

* [lang2] make macros work for `cargo test`

* [core, lang2] make contracts compile as ink-as-dependency

* [lang2] make events work for ink_lang2 on env3

* [lang2] remove AccessEnv - no longer needed

* [core] remove env2

* [lang2] fix tests

- Fix warning in ink_lang2
- Remove no longer needed test case
- Adjust some passing tests after default module import removal

* [*] apply rustfmt

* [lang2] silence unused warning for now

* [core] rename {create|Create}* to {instantiate|Instantiate}*

- CreateBuilder -> InstantiateBuilder
- CreateParams -> InstantiateParams
- create -> instantiate

* [core] rename endowment -> transferred_value for CallBuilder/Params

* [examples] adjust Delegator contracts for recents changes

* [core] rename now_in_ms -> block_timestamp

* [core] follow-up of the call renamings (transferred_value)

* [lang2] rename now_in_ms -> block_timestamp

* [examples] move examples out of the examples/lang2 folder

* [examples] fix runtime-storage example contract

* [examples] fix Flipper contract

* [examples] fix Incrementer contract

* [examples] fix Erc20 contract

* [utils] add Key and byte_utils to ink_utils

* [utils -> primitives] rename ink_utils -> ink_primitives

* [*] move all links from ink_utils -> ink_primitives

* [primitives] update Cargo.toml description

* [*] use ink_primitives::Key remove ink_core::Key

* [primitives] refactor new crate, make it more usable in ink! context

* [*] relink to ink_primitives for Key usage

* [abi] refactor macros and relink to ink_primitives::Key

* [lang2] fix usage of renamed Create{Builder, Params}

* [examples] fix examples under recent changes with ink_primitives

* [*] apply rustfmt

* [lang2/macro] remove deprecated feature usage of proc_macro_hygiene

* [examples] remove deprecated proc_macro_hygiene feature

* [core] remove test_utils

* [core] rename env3 to env

* [*] rename all usages of env3 to env

* [core] fix feature usage in num-traits of ink_core Cargo.toml

* [*] update README

* [primitives] conditionally compile type_metadata from ink_primitives

* [core] make env::get_contract_storage return Option<Result<T>>

* [core] fix some faulty doc comments

* [ci] fix GitLab CI

* [primitives] fix no_std compilation

* [primitives] fix warning

* [core] make `rand` dependency optional for `std` crate feature

* [core] remove the test-env crate feature from the ink_core crate

* [core,primitives] move some tests from primitives to core

* [lang] move lang2/ to lang/

* [*] rename all instances of ink_lang2 or lang2 to ink_lang or lang

* [lang/macro] fix ink_primitives dependency

* [*] apply rustfmt

* [core] fix clippy warning

* [ci] eliminate README from examples CI checks

* [examples] apply rustfmt

* [lang/macro] improve event codegen

* [core] rename TimeStamp/time_stamp to Timestamp/timestamp

* [lang] remove unused extern crate alloc

* [core] rename env::address to env::account_id

* [lang] perform renamings on ink_lang::EnvAccess but with deprecation instead of removal

* [core] fix missing time_stamp renamings

* [lang] fix missing TimeStamp renamings

* improve doc comment
Co-Authored-By: Andrew Jones's avatarAndrew Jones <ascjones@gmail.com>

* improve doc comment
Co-Authored-By: Andrew Jones's avatarAndrew Jones <ascjones@gmail.com>

* rename create_contract -> instantiate_contract
Co-Authored-By: Andrew Jones's avatarAndrew Jones <ascjones@gmail.com>

* rename create_contract -> instantiate_contract
Co-Authored-By: Andrew Jones's avatarAndrew Jones <ascjones@gmail.com>

* improve doc comment
Co-Authored-By: Andrew Jones's avatarAndrew Jones <ascjones@gmail.com>

* impr
Co-Authored-By: Andrew Jones's avatarAndrew Jones <ascjones@gmail.com>

* improve doc comment
Co-Authored-By: Andrew Jones's avatarAndrew Jones <ascjones@gmail.com>

* improve doc comment
Co-Authored-By: Andrew Jones's avatarAndrew Jones <ascjones@gmail.com>

* improve doc comment
Co-Authored-By: Andrew Jones's avatarAndrew Jones <ascjones@gmail.com>

* rename endowment -> transferred_value
Co-Authored-By: Andrew Jones's avatarAndrew Jones <ascjones@gmail.com>

* improve doc comment
Co-Authored-By: Andrew Jones's avatarAndrew Jones <ascjones@gmail.com>

* rename create_contract -> instantiate_contract
Co-Authored-By: Andrew Jones's avatarAndrew Jones <ascjones@gmail.com>

* rename create_contract -> instantiate_contract
Co-Authored-By: Andrew Jones's avatarAndrew Jones <ascjones@gmail.com>

* rename time stamp to timestamp
Co-Authored-By: Andrew Jones's avatarAndrew Jones <ascjones@gmail.com>

* rename SRML to env in docs
Co-Authored-By: Andrew Jones's avatarAndrew Jones <ascjones@gmail.com>

* remove SRML word from docs
Co-Authored-By: Andrew Jones's avatarAndrew Jones <ascjones@gmail.com>

* remove SRML word from docs
Co-Authored-By: Andrew Jones's avatarAndrew Jones <ascjones@gmail.com>

* [lang] fix doc comment for filtered_keys in restore_contract

* [core] rename create_contract -> instantiate_contract

* [core] rename create_contract -> instantiate_contract

* [core] fix some renamings around endowment -> transferred_value

* [lang] rename create_contract -> instantiate_contract follow-up

* [core] apply rustfmt

* [core] improve restore_contract doc comment

* [core, lang] link to ink_core::env::* doc comments from all api places

* [core] apply rustfmt
Co-authored-by: Michael Müller's avatarMichael Müller <mich@elmueller.net>
Co-authored-by: Andrew Jones's avatarAndrew Jones <ascjones@gmail.com>
parent 6fd834d0
Pipeline #77049 passed with stages
in 12 minutes and 9 seconds
......@@ -18,7 +18,7 @@ variables:
CARGO_TARGET_DIR: "/ci-cache/${CI_PROJECT_NAME}/targets/${CI_COMMIT_REF_NAME}/${CI_JOB_NAME}"
CI_SERVER_NAME: "GitLab CI"
REGISTRY: registry.parity.io/parity/infrastructure/scripts
ALL_CRATES: "core alloc prelude utils lang2 lang2/macro"
ALL_CRATES: "core alloc prelude primitives lang lang/macro"
.collect-artifacts: &collect-artifacts
artifacts:
......@@ -147,7 +147,7 @@ examples-test:
stage: examples
<<: *docker-env
script:
- for example in examples/lang2/*; do
- for example in examples/*/; do
cargo test --verbose --manifest-path ${example}/Cargo.toml;
done
......@@ -155,7 +155,7 @@ examples-fmt:
stage: examples
<<: *docker-env
script:
- for example in examples/lang2/*; do
- for example in examples/*/; do
cargo fmt --verbose --manifest-path ${example}/Cargo.toml -- --check;
done
......@@ -163,7 +163,7 @@ examples-clippy-std:
stage: examples
<<: *docker-env
script:
- for example in examples/lang2/*; do
- for example in examples/*/; do
cargo clippy --verbose --manifest-path ${example}/Cargo.toml -- -D warnings;
done
......@@ -171,7 +171,7 @@ examples-clippy-wasm:
stage: examples
<<: *docker-env
script:
- for example in examples/lang2/*; do
- for example in examples/*/; do
cargo clippy --verbose --manifest-path ${example}/Cargo.toml --no-default-features --target wasm32-unknown-unknown -- -D warnings;
done
......@@ -180,7 +180,7 @@ examples-contract-build:
<<: *docker-env
script:
- *update-cargo-contract
- for example in examples/lang2/*; do
- for example in examples/*/; do
pushd $example &&
cargo contract build &&
popd;
......@@ -191,7 +191,7 @@ examples-generate-metadata:
<<: *docker-env
script:
- *update-cargo-contract
- for example in examples/lang2/*; do
- for example in examples/*/; do
pushd $example &&
cargo contract generate-metadata &&
popd;
......
......@@ -34,7 +34,7 @@ Following these will ensure that your pull request is going to be accepted.
1. Run `rustfmt` automatically.
1. Run `clippy` on your changes.
1. Run tests in `debug` and `release` mode using `--features test-env` for off-chain testing.
1. Run tests via `cargo test --release` for off-chain testing.
1. For critical parts perform some manual on-chain tests.
1. Build the code and run tests also for the `wasm32` target.
1. Try to run some examples and see if they are still working correctly.
......
......@@ -4,10 +4,8 @@ members = [
"abi",
"core",
"lang",
"lang2",
"model",
"prelude",
"utils",
"primitives",
]
exclude = [
"examples/",
......
// Copyright 2018-2019 Parity Technologies (UK) Ltd.
// Copyright {20\d{2}}-{20\d{2}} Parity Technologies (UK) Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
......
......@@ -14,8 +14,6 @@
[e2]: https://github.com/Aaronepower/tokei#badges
[f1]: https://img.shields.io/badge/docs-core-blue.svg
[f2]: https://paritytech.github.io/ink/ink_core
[g1]: https://img.shields.io/badge/docs-model-blue.svg
[g2]: https://paritytech.github.io/ink/ink_model
[h1]: https://img.shields.io/badge/docs-abi-blue.svg
[h2]: https://paritytech.github.io/ink/ink_abi
......@@ -27,9 +25,9 @@ For more information please visit [the ink! tutorial](https://substrate.dev/subs
## Developer Documentation
| `ink_abi` | `ink_core` | `ink_model` |
| ------------- | ------------- | ------------- |
| [![][h1]][h2] | [![][f1]][f2] | [![][g1]][g2] |
| `ink_abi` | `ink_core` |
| ------------- | ------------- |
| [![][h1]][h2] | [![][f1]][f2] |
### Interaction with Substrate
......@@ -81,14 +79,15 @@ To create your own version of the flipper contract, you first need to initialize
cargo contract new flipper
```
Below you can see the code using the `ink_lang2` version of ink!.
Below you can see the code using the `ink_lang` version of ink!.
```rust
use ink_core::storage;
use ink_lang2 as ink;
use ink_lang as ink;
#[ink::contract(version = "0.1.0")]
mod flipper {
use ink_core::storage;
/// The storage of the flipper contract.
#[ink(storage)]
struct Flipper {
......
......@@ -64,7 +64,7 @@ contract! {
<td>
```rust
use ink_lang2 as ink;
use ink_lang as ink;
#[ink::contract(version = "0.1.0")]
mod erc20 {
......@@ -78,7 +78,7 @@ mod erc20 {
> Note: we now require a mandatory ink! version in the header. You're welcome.
See the [ERC20 example](https://github.com/paritytech/ink/blob/master/examples/lang2/erc20/src/lib.rs).
See the [ERC20 example](https://github.com/paritytech/ink/blob/master/examples/erc20/src/lib.rs).
## ink! Contract Tag
......@@ -146,7 +146,7 @@ struct Erc20 {
</tr>
</table>
See the [ERC20 example](https://github.com/paritytech/ink/blob/master/examples/lang2/erc20/src/lib.rs).
See the [ERC20 example](https://github.com/paritytech/ink/blob/master/examples/erc20/src/lib.rs).
## Declaring Events
......@@ -193,7 +193,7 @@ struct Transfer {
</tr>
</table>
See the [ERC20 example](https://github.com/paritytech/ink/blob/master/examples/lang2/erc20/src/lib.rs).
See the [ERC20 example](https://github.com/paritytech/ink/blob/master/examples/erc20/src/lib.rs).
## Environment Handler
......@@ -275,7 +275,7 @@ fn total_supply(&self) -> Balance {
</tr>
</table>
See the [ERC20 example](https://github.com/paritytech/ink/blob/master/examples/lang2/erc20/src/lib.rs).
See the [ERC20 example](https://github.com/paritytech/ink/blob/master/examples/erc20/src/lib.rs).
## Defining a Constructor
......@@ -335,7 +335,7 @@ impl Erc20 {
</tr>
</table>
See the [ERC20 example](https://github.com/paritytech/ink/blob/master/examples/lang2/erc20/src/lib.rs).
See the [ERC20 example](https://github.com/paritytech/ink/blob/master/examples/erc20/src/lib.rs).
## Cross Contract Calls
......@@ -355,7 +355,7 @@ struct Delegator {
let result = self.adder.inc(by);
```
See the [delegator example](https://github.com/paritytech/ink/blob/master/examples/lang2/delegator/lib.rs).
See the [delegator example](https://github.com/paritytech/ink/blob/master/examples/delegator/lib.rs).
## Factory Contracts
......@@ -406,7 +406,7 @@ let accumulator = Accumulator::new(init_value)
</tr>
</table>
See the [delegator example](https://github.com/paritytech/ink/blob/master/examples/lang2/delegator/lib.rs).
See the [delegator example](https://github.com/paritytech/ink/blob/master/examples/delegator/lib.rs).
## Contract Tests
......@@ -432,7 +432,7 @@ let contract = MyContract::my_constructor(a, b);
Messages can simply be called on the returned instance as if `MyContract::my_constructor` returns a
`Self` instance.
See the [flipper example](https://github.com/paritytech/ink/blob/master/examples/lang2/flipper/src/lib.rs).
See the [flipper example](https://github.com/paritytech/ink/blob/master/examples/flipper/src/lib.rs).
**The off-chain test environment has lost a bit of power compared to the old ink! language.**
......
......@@ -19,6 +19,7 @@ serde = { version = "1.0", default-features = false, features = ["derive", "allo
derive_more = { version = "0.99.2", default-features = false, features = ["from"] }
ink_abi_derive = { path = "derive", default-features = false, optional = true }
ink_prelude = { path = "../prelude/", default-features = false }
ink_primitives = { path = "../primitives/", default-features = false }
type-metadata = { git = "https://github.com/type-metadata/type-metadata.git", default-features = false, features = ["derive"] }
[dev-dependencies]
......
......@@ -60,7 +60,7 @@ pub fn generate_impl(input: TokenStream2) -> Result<TokenStream2> {
}
};
Ok(wrap(ident, "HAS_LAYOUT", has_layout_impl))
Ok(wrap(has_layout_impl))
}
fn generate_fields_layout<'a>(
......@@ -97,8 +97,7 @@ fn generate_struct_layout(data_struct: &DataStruct) -> TokenStream2 {
Fields::Unnamed(ref fs) => generate_struct_fields_layout(&fs.unnamed),
Fields::Unit => {
quote! {
use type_metadata::Metadata as _;
_ink_abi::LayoutStruct::new(Self::meta_type(), __core::vec![])
_ink_abi::LayoutStruct::new(<Self as type_metadata::Metadata>::meta_type(), Vec::new())
}
}
}
......
......@@ -12,34 +12,13 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#[cfg(not(feature = "std"))]
use alloc::{
format,
string::{
String,
ToString,
},
};
use proc_macro2::{
Span,
TokenStream as TokenStream2,
};
use proc_macro2::TokenStream as TokenStream2;
use quote::quote;
use syn::Ident;
pub fn wrap(
ident: &Ident,
trait_name: &'static str,
impl_quote: TokenStream2,
) -> TokenStream2 {
let mut renamed = format!("_IMPL_{}_FOR_", trait_name);
renamed.push_str(ident.to_string().trim_start_matches("r#"));
let dummy_const = Ident::new(&renamed, Span::call_site());
pub fn wrap(impl_quote: TokenStream2) -> TokenStream2 {
quote! {
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications)]
const #dummy_const: () = {
const _: () = {
#[allow(unknown_lints)]
#[cfg_attr(feature = "cargo-clippy", allow(useless_attribute))]
#[allow(rust_2018_idioms)]
......
......@@ -41,6 +41,19 @@ pub trait HasLayout {
fn layout(&self) -> StorageLayout;
}
impl From<ink_primitives::Key> for LayoutKey {
fn from(key: ink_primitives::Key) -> Self {
LayoutKey(key.0)
}
}
impl HasLayout for ink_primitives::Key {
fn layout(&self) -> StorageLayout {
LayoutRange::cell(*self, <[u8; 32] as type_metadata::Metadata>::meta_type())
.into()
}
}
/// Either a concrete layout bound or another layout sub-struct.
#[derive(Debug, PartialEq, Eq, Serialize, From)]
#[serde(bound = "F::TypeId: Serialize")]
......@@ -73,7 +86,7 @@ impl IntoCompact for StorageLayout {
#[derive(Debug, PartialEq, Eq, From, Serialize)]
#[serde(transparent)]
pub struct LayoutKey(
/// Internals must be compatible with `ink_core::storage::Key`.
/// Internals must be compatible with `ink_primitives::Key`.
pub [u8; 32],
);
......
......@@ -17,27 +17,35 @@ include = ["Cargo.toml", "src/**/*.rs", "README.md", "LICENSE"]
[dependencies]
ink_abi = { path = "../abi/", default-features = false, features = ["derive"], optional = true }
ink_alloc = { path = "../alloc/", default-features = false }
ink_utils = { path = "../utils/" }
ink_primitives = { path = "../primitives/", default-features = false }
ink_core_derive = { path = "derive", default-features = false }
ink_prelude = { path = "../prelude/", default-features = false }
scale = { package = "parity-scale-codec", version = "1.1", default-features = false, features = ["derive", "full"] }
type-metadata = { git = "https://github.com/type-metadata/type-metadata.git", default-features = false, features = ["derive"], optional = true }
derive_more = { version = "0.99.2", default-features = false, features = ["from"] }
derive_more = { version = "0.99.2", default-features = false, features = ["from", "display"] }
smallvec = { version = "1.0", default-features = false, features = ["union"] }
cfg-if = "0.1"
num-traits = { version = "0.2.1", default-features = false, features = ["i128"] }
# Only used in the off-chain environment.
#
# Sadly couldn't be marked as dev-dependency.
# Never use this crate outside of the off-chain environment!
rand = { version = "0.7", default-features = false, features = ["alloc"], optional = true }
[features]
default = ["test-env"]
test-env = [
"std",
]
default = ["std"]
std = [
"ink_abi/std",
"ink_alloc/std",
"ink_prelude/std",
"ink_primitives/std",
"scale/std",
"type-metadata/std",
"rand",
"rand/std",
"num-traits/std",
]
ink-generate-abi = [
"ink_abi",
......
......@@ -16,7 +16,7 @@ mod utils;
use utils::*;
use ink_core::storage::Key;
use ink_primitives::Key;
use ink_core_derive::AllocateUsing;
#[derive(Default)]
......
This diff is collapsed.
// Copyright 2019-2020 Parity Technologies (UK) Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use crate::env::{
call::{
CallData,
CallParams,
InstantiateParams,
ReturnType,
},
EnvTypes,
Result,
Topics,
};
use ink_primitives::Key;
/// Environmental contract functionality that does not require `EnvTypes`.
pub trait Env {
/// Writes the value to the contract storage under the given key.
fn set_contract_storage<V>(&mut self, key: Key, value: &V)
where
V: scale::Encode;
/// Returns the value stored under the given key in the contract's storage if any.
///
/// # Errors
///
/// - If the decoding of the typed value failed
fn get_contract_storage<R>(&mut self, key: Key) -> Option<Result<R>>
where
R: scale::Decode;
/// Clears the contract's storage key entry.
fn clear_contract_storage(&mut self, key: Key);
/// Returns the value from the *runtime* storage at the position of the key if any.
///
/// # Errors
///
/// - If the decoding of the typed value failed
fn get_runtime_storage<R>(&mut self, runtime_key: &[u8]) -> Option<Result<R>>
where
R: scale::Decode;
/// Returns the input to the executed contract.
///
/// # Note
///
/// - The input is the 4-bytes selector followed by the arguments
/// of the called function in their SCALE encoded representation.
/// - This property must be received as the first action an executed
/// contract to its environment and can only be queried once.
/// The environment access asserts this guarantee.
fn input(&mut self) -> Result<CallData>;
/// Returns the value back to the caller of the executed contract.
///
/// # Note
///
/// The setting of this property must be the last interaction between
/// the executed contract and its environment.
/// The environment access asserts this guarantee.
fn output<R>(&mut self, return_value: &R)
where
R: scale::Encode;
/// Prints the given contents to the console log.
fn println(&mut self, content: &str);
}
/// Environmental contract functionality.
pub trait TypedEnv: Env {
/// Returns the address of the caller of the executed contract.
///
/// # Note
///
/// For more details visit: [`ink_core::env::caller`]
fn caller<T: EnvTypes>(&mut self) -> Result<T::AccountId>;
/// Returns the transferred balance for the contract execution.
///
/// # Note
///
/// For more details visit: [`ink_core::env::transferred_balance`]
fn transferred_balance<T: EnvTypes>(&mut self) -> Result<T::Balance>;
/// Returns the current price for gas.
///
/// # Note
///
/// For more details visit: [`ink_core::env::gas_price`]
fn gas_price<T: EnvTypes>(&mut self) -> Result<T::Balance>;
/// Returns the amount of gas left for the contract execution.
///
/// # Note
///
/// For more details visit: [`ink_core::env::gas_left`]
fn gas_left<T: EnvTypes>(&mut self) -> Result<T::Balance>;
/// Returns the timestamp of the current block.
///
/// # Note
///
/// For more details visit: [`ink_core::env::block_timestamp`]
fn block_timestamp<T: EnvTypes>(&mut self) -> Result<T::Timestamp>;
/// Returns the address of the executed contract.
///
/// # Note
///
/// For more details visit: [`ink_core::env::account_id`]
fn account_id<T: EnvTypes>(&mut self) -> Result<T::AccountId>;
/// Returns the balance of the executed contract.
///
/// # Note
///
/// For more details visit: [`ink_core::env::balance`]
fn balance<T: EnvTypes>(&mut self) -> Result<T::Balance>;
/// Returns the current rent allowance for the executed contract.
///
/// # Note
///
/// For more details visit: [`ink_core::env::rent_allowance`]
fn rent_allowance<T: EnvTypes>(&mut self) -> Result<T::Balance>;
/// Returns the current block number.
///
/// # Note
///
/// For more details visit: [`ink_core::env::block_number`]
fn block_number<T: EnvTypes>(&mut self) -> Result<T::BlockNumber>;
/// Returns the minimum balance of the contracts chain.
///
/// # Note
///
/// For more details visit: [`ink_core::env::minimum_balance`]
fn minimum_balance<T: EnvTypes>(&mut self) -> Result<T::Balance>;
/// Returns the tombstone deposit of the contract chain.
///
/// # Note
///
/// For more details visit: [`ink_core::env::tombstone_deposit`]
fn tombstone_deposit<T: EnvTypes>(&mut self) -> Result<T::Balance>;
/// Emits an event with the given event data.
///
/// # Note
///
/// For more details visit: [`ink_core::env::emit_event`]
fn emit_event<T, Event>(&mut self, event: Event)
where
T: EnvTypes,
Event: Topics<T> + scale::Encode;
/// Sets the rent allowance of the executed contract to the new value.
///
/// # Note
///
/// For more details visit: [`ink_core::env::set_rent_allowance`]
fn set_rent_allowance<T>(&mut self, new_value: T::Balance)
where
T: EnvTypes;
/// Invokes a call of the runtime.
///
/// # Note
///
/// For more details visit: [`ink_core::env::invoke_runtime`]
fn invoke_runtime<T>(&mut self, call: &T::Call) -> Result<()>
where
T: EnvTypes;
/// Invokes a contract message.
///
/// # Note
///
/// For more details visit: [`ink_core::env::invoke_contract`]
fn invoke_contract<T>(&mut self, call_data: &CallParams<T, ()>) -> Result<()>
where
T: EnvTypes;
/// Evaluates a contract message and returns its result.
///
/// # Note
///
/// For more details visit: [`ink_core::env::eval_contract`]
fn eval_contract<T, R>(
&mut self,
call_data: &CallParams<T, ReturnType<R>>,
) -> Result<R>
where
T: EnvTypes,
R: scale::Decode;
/// Instantiates another contract.
///
/// # Note
///
/// For more details visit: [`ink_core::env::instantiate_contract`]
fn instantiate_contract<T, C>(
&mut self,
params: &InstantiateParams<T, C>,
) -> Result<T::AccountId>
where
T: EnvTypes;
/// Restores a smart contract tombstone.
///
/// # Note
///