mirror of
https://github.com/pezkuwichain/revive.git
synced 2026-06-11 23:01:02 +00:00
Merge branch 'main' into as-release-json
This commit is contained in:
@@ -13,6 +13,7 @@ Supported `polkadot-sdk` rev:`c29e72a8628835e34deb6aa7db9a78a2e4eabcee`
|
|||||||
- Support for passing LLVM command line options via the prcoess input or providing one or more `--llvm-arg='..'` resolc CLI flag. This allows more fine-grained control over the LLVM backend configuration.
|
- Support for passing LLVM command line options via the prcoess input or providing one or more `--llvm-arg='..'` resolc CLI flag. This allows more fine-grained control over the LLVM backend configuration.
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
- Storage keys and values are big endian. This was a pre-mature optimization because for the contract itself it this is a no-op and thus not observable. However we should consider the storage layout as part of the contract ABI. The endianness of transient storage values are still kept as-is.
|
||||||
- Runner `resolc` using webkit is no longer supported.
|
- Runner `resolc` using webkit is no longer supported.
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|||||||
Generated
+4
-4
@@ -4965,9 +4965,9 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "openssl"
|
name = "openssl"
|
||||||
version = "0.10.71"
|
version = "0.10.72"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd"
|
checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.8.0",
|
"bitflags 2.8.0",
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
@@ -4997,9 +4997,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "openssl-sys"
|
name = "openssl-sys"
|
||||||
version = "0.9.106"
|
version = "0.9.107"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd"
|
checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc",
|
"cc",
|
||||||
"libc",
|
"libc",
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
"Baseline": 1443,
|
"Baseline": 1443,
|
||||||
"Computation": 2788,
|
"Computation": 2788,
|
||||||
"DivisionArithmetics": 9748,
|
"DivisionArithmetics": 9748,
|
||||||
"ERC20": 19200,
|
"ERC20": 19150,
|
||||||
"Events": 2201,
|
"Events": 2201,
|
||||||
"FibonacciIterative": 2041,
|
"FibonacciIterative": 2041,
|
||||||
"Flipper": 2632,
|
"Flipper": 2691,
|
||||||
"SHA1": 8958
|
"SHA1": 8997
|
||||||
}
|
}
|
||||||
@@ -15,7 +15,7 @@ pragma solidity ^0.8;
|
|||||||
"Instantiated": 0
|
"Instantiated": 0
|
||||||
},
|
},
|
||||||
"key": "0000000000000000000000000000000000000000000000000000000000000000",
|
"key": "0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
"expected": "0100000000000000000000000000000000000000000000000000000000000000"
|
"expected": "0000000000000000000000000000000000000000000000000000000000000001"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -36,7 +36,9 @@ pub use self::polkavm::context::function::Function as PolkaVMFunction;
|
|||||||
pub use self::polkavm::context::global::Global as PolkaVMGlobal;
|
pub use self::polkavm::context::global::Global as PolkaVMGlobal;
|
||||||
pub use self::polkavm::context::pointer::heap::LoadWord as PolkaVMLoadHeapWordFunction;
|
pub use self::polkavm::context::pointer::heap::LoadWord as PolkaVMLoadHeapWordFunction;
|
||||||
pub use self::polkavm::context::pointer::heap::StoreWord as PolkaVMStoreHeapWordFunction;
|
pub use self::polkavm::context::pointer::heap::StoreWord as PolkaVMStoreHeapWordFunction;
|
||||||
|
pub use self::polkavm::context::pointer::storage::LoadTransientWord as PolkaVMLoadTransientStorageWordFunction;
|
||||||
pub use self::polkavm::context::pointer::storage::LoadWord as PolkaVMLoadStorageWordFunction;
|
pub use self::polkavm::context::pointer::storage::LoadWord as PolkaVMLoadStorageWordFunction;
|
||||||
|
pub use self::polkavm::context::pointer::storage::StoreTransientWord as PolkaVMStoreTransientStorageWordFunction;
|
||||||
pub use self::polkavm::context::pointer::storage::StoreWord as PolkaVMStoreStorageWordFunction;
|
pub use self::polkavm::context::pointer::storage::StoreWord as PolkaVMStoreStorageWordFunction;
|
||||||
pub use self::polkavm::context::pointer::Pointer as PolkaVMPointer;
|
pub use self::polkavm::context::pointer::Pointer as PolkaVMPointer;
|
||||||
pub use self::polkavm::context::r#loop::Loop as PolkaVMLoop;
|
pub use self::polkavm::context::r#loop::Loop as PolkaVMLoop;
|
||||||
|
|||||||
@@ -17,47 +17,20 @@ where
|
|||||||
const NAME: &'static str = "__revive_load_storage_word";
|
const NAME: &'static str = "__revive_load_storage_word";
|
||||||
|
|
||||||
fn r#type<'ctx>(context: &Context<'ctx, D>) -> inkwell::types::FunctionType<'ctx> {
|
fn r#type<'ctx>(context: &Context<'ctx, D>) -> inkwell::types::FunctionType<'ctx> {
|
||||||
context.word_type().fn_type(
|
context
|
||||||
&[context.xlen_type().into(), context.word_type().into()],
|
.word_type()
|
||||||
false,
|
.fn_type(&[context.word_type().into()], false)
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_body<'ctx>(
|
fn emit_body<'ctx>(
|
||||||
&self,
|
&self,
|
||||||
context: &mut Context<'ctx, D>,
|
context: &mut Context<'ctx, D>,
|
||||||
) -> anyhow::Result<Option<BasicValueEnum<'ctx>>> {
|
) -> anyhow::Result<Option<BasicValueEnum<'ctx>>> {
|
||||||
let is_transient = Self::paramater(context, 0);
|
Ok(Some(emit_load(
|
||||||
let key_value = Self::paramater(context, 1);
|
context,
|
||||||
|
Self::paramater(context, 0),
|
||||||
let key_pointer = context.build_alloca_at_entry(context.word_type(), "key_pointer");
|
false,
|
||||||
let value_pointer = context.build_alloca_at_entry(context.word_type(), "value_pointer");
|
)?))
|
||||||
let length_pointer = context.build_alloca_at_entry(context.xlen_type(), "length_pointer");
|
|
||||||
|
|
||||||
context
|
|
||||||
.builder()
|
|
||||||
.build_store(key_pointer.value, key_value)?;
|
|
||||||
context.build_store(value_pointer, context.word_const(0))?;
|
|
||||||
context.build_store(
|
|
||||||
length_pointer,
|
|
||||||
context
|
|
||||||
.xlen_type()
|
|
||||||
.const_int(revive_common::BYTE_LENGTH_WORD as u64, false),
|
|
||||||
)?;
|
|
||||||
|
|
||||||
let arguments = [
|
|
||||||
is_transient,
|
|
||||||
key_pointer.to_int(context).into(),
|
|
||||||
context.xlen_type().const_all_ones().into(),
|
|
||||||
value_pointer.to_int(context).into(),
|
|
||||||
length_pointer.to_int(context).into(),
|
|
||||||
];
|
|
||||||
context.build_runtime_call(revive_runtime_api::polkavm_imports::GET_STORAGE, &arguments);
|
|
||||||
|
|
||||||
// We do not to check the return value: Solidity assumes infallible loads.
|
|
||||||
// If a key doesn't exist the "zero" value is returned (ensured by above write).
|
|
||||||
|
|
||||||
Ok(Some(context.build_load(value_pointer, "storage_value")?))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,6 +47,42 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Load a word size value from a transient storage pointer.
|
||||||
|
pub struct LoadTransientWord;
|
||||||
|
|
||||||
|
impl<D> RuntimeFunction<D> for LoadTransientWord
|
||||||
|
where
|
||||||
|
D: Dependency + Clone,
|
||||||
|
{
|
||||||
|
const NAME: &'static str = "__revive_load_transient_storage_word";
|
||||||
|
|
||||||
|
fn r#type<'ctx>(context: &Context<'ctx, D>) -> inkwell::types::FunctionType<'ctx> {
|
||||||
|
context
|
||||||
|
.word_type()
|
||||||
|
.fn_type(&[context.word_type().into()], false)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn emit_body<'ctx>(
|
||||||
|
&self,
|
||||||
|
context: &mut Context<'ctx, D>,
|
||||||
|
) -> anyhow::Result<Option<BasicValueEnum<'ctx>>> {
|
||||||
|
Ok(Some(emit_load(context, Self::paramater(context, 0), true)?))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<D> WriteLLVM<D> for LoadTransientWord
|
||||||
|
where
|
||||||
|
D: Dependency + Clone,
|
||||||
|
{
|
||||||
|
fn declare(&mut self, context: &mut Context<D>) -> anyhow::Result<()> {
|
||||||
|
<Self as RuntimeFunction<_>>::declare(self, context)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn into_llvm(self, context: &mut Context<D>) -> anyhow::Result<()> {
|
||||||
|
<Self as RuntimeFunction<_>>::emit(&self, context)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Store a word size value through a storage pointer.
|
/// Store a word size value through a storage pointer.
|
||||||
pub struct StoreWord;
|
pub struct StoreWord;
|
||||||
|
|
||||||
@@ -85,11 +94,7 @@ where
|
|||||||
|
|
||||||
fn r#type<'ctx>(context: &Context<'ctx, D>) -> inkwell::types::FunctionType<'ctx> {
|
fn r#type<'ctx>(context: &Context<'ctx, D>) -> inkwell::types::FunctionType<'ctx> {
|
||||||
context.void_type().fn_type(
|
context.void_type().fn_type(
|
||||||
&[
|
&[context.word_type().into(), context.word_type().into()],
|
||||||
context.xlen_type().into(),
|
|
||||||
context.word_type().into(),
|
|
||||||
context.word_type().into(),
|
|
||||||
],
|
|
||||||
false,
|
false,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -98,24 +103,12 @@ where
|
|||||||
&self,
|
&self,
|
||||||
context: &mut Context<'ctx, D>,
|
context: &mut Context<'ctx, D>,
|
||||||
) -> anyhow::Result<Option<BasicValueEnum<'ctx>>> {
|
) -> anyhow::Result<Option<BasicValueEnum<'ctx>>> {
|
||||||
let is_transient = Self::paramater(context, 0);
|
emit_store(
|
||||||
let key = Self::paramater(context, 1);
|
context,
|
||||||
let value = Self::paramater(context, 2);
|
Self::paramater(context, 0),
|
||||||
|
Self::paramater(context, 1),
|
||||||
let key_pointer = context.build_alloca_at_entry(context.word_type(), "key_pointer");
|
false,
|
||||||
let value_pointer = context.build_alloca_at_entry(context.word_type(), "value_pointer");
|
)?;
|
||||||
|
|
||||||
context.build_store(key_pointer, key)?;
|
|
||||||
context.build_store(value_pointer, value)?;
|
|
||||||
|
|
||||||
let arguments = [
|
|
||||||
is_transient,
|
|
||||||
key_pointer.to_int(context).into(),
|
|
||||||
context.xlen_type().const_all_ones().into(),
|
|
||||||
value_pointer.to_int(context).into(),
|
|
||||||
context.integer_const(crate::polkavm::XLEN, 32).into(),
|
|
||||||
];
|
|
||||||
context.build_runtime_call(revive_runtime_api::polkavm_imports::SET_STORAGE, &arguments);
|
|
||||||
|
|
||||||
Ok(None)
|
Ok(None)
|
||||||
}
|
}
|
||||||
@@ -133,3 +126,122 @@ where
|
|||||||
<Self as RuntimeFunction<_>>::emit(&self, context)
|
<Self as RuntimeFunction<_>>::emit(&self, context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Store a word size value through a transient storage pointer.
|
||||||
|
pub struct StoreTransientWord;
|
||||||
|
|
||||||
|
impl<D> RuntimeFunction<D> for StoreTransientWord
|
||||||
|
where
|
||||||
|
D: Dependency + Clone,
|
||||||
|
{
|
||||||
|
const NAME: &'static str = "__revive_store_transient_storage_word";
|
||||||
|
|
||||||
|
fn r#type<'ctx>(context: &Context<'ctx, D>) -> inkwell::types::FunctionType<'ctx> {
|
||||||
|
context.void_type().fn_type(
|
||||||
|
&[context.word_type().into(), context.word_type().into()],
|
||||||
|
false,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn emit_body<'ctx>(
|
||||||
|
&self,
|
||||||
|
context: &mut Context<'ctx, D>,
|
||||||
|
) -> anyhow::Result<Option<BasicValueEnum<'ctx>>> {
|
||||||
|
emit_store(
|
||||||
|
context,
|
||||||
|
Self::paramater(context, 0),
|
||||||
|
Self::paramater(context, 1),
|
||||||
|
true,
|
||||||
|
)?;
|
||||||
|
|
||||||
|
Ok(None)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<D> WriteLLVM<D> for StoreTransientWord
|
||||||
|
where
|
||||||
|
D: Dependency + Clone,
|
||||||
|
{
|
||||||
|
fn declare(&mut self, context: &mut Context<D>) -> anyhow::Result<()> {
|
||||||
|
<Self as RuntimeFunction<_>>::declare(self, context)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn into_llvm(self, context: &mut Context<D>) -> anyhow::Result<()> {
|
||||||
|
<Self as RuntimeFunction<_>>::emit(&self, context)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn emit_load<'ctx, D: Dependency + Clone>(
|
||||||
|
context: &mut Context<'ctx, D>,
|
||||||
|
mut key: BasicValueEnum<'ctx>,
|
||||||
|
transient: bool,
|
||||||
|
) -> anyhow::Result<BasicValueEnum<'ctx>> {
|
||||||
|
if !transient {
|
||||||
|
key = context.build_byte_swap(key)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
let key_pointer = context.build_alloca_at_entry(context.word_type(), "key_pointer");
|
||||||
|
let value_pointer = context.build_alloca_at_entry(context.word_type(), "value_pointer");
|
||||||
|
let length_pointer = context.build_alloca_at_entry(context.xlen_type(), "length_pointer");
|
||||||
|
|
||||||
|
context.builder().build_store(key_pointer.value, key)?;
|
||||||
|
context.build_store(value_pointer, context.word_const(0))?;
|
||||||
|
context.build_store(
|
||||||
|
length_pointer,
|
||||||
|
context
|
||||||
|
.xlen_type()
|
||||||
|
.const_int(revive_common::BYTE_LENGTH_WORD as u64, false),
|
||||||
|
)?;
|
||||||
|
|
||||||
|
let is_transient = context.xlen_type().const_int(transient as u64, false);
|
||||||
|
|
||||||
|
let arguments = [
|
||||||
|
is_transient.into(),
|
||||||
|
key_pointer.to_int(context).into(),
|
||||||
|
context.xlen_type().const_all_ones().into(),
|
||||||
|
value_pointer.to_int(context).into(),
|
||||||
|
length_pointer.to_int(context).into(),
|
||||||
|
];
|
||||||
|
context.build_runtime_call(revive_runtime_api::polkavm_imports::GET_STORAGE, &arguments);
|
||||||
|
|
||||||
|
// We do not to check the return value: Solidity assumes infallible loads.
|
||||||
|
// If a key doesn't exist the "zero" value is returned (ensured by above write).
|
||||||
|
|
||||||
|
let value = context.build_load(value_pointer, "storage_value")?;
|
||||||
|
Ok(if transient {
|
||||||
|
value
|
||||||
|
} else {
|
||||||
|
context.build_byte_swap(value)?
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn emit_store<'ctx, D: Dependency + Clone>(
|
||||||
|
context: &mut Context<'ctx, D>,
|
||||||
|
mut key: BasicValueEnum<'ctx>,
|
||||||
|
mut value: BasicValueEnum<'ctx>,
|
||||||
|
transient: bool,
|
||||||
|
) -> anyhow::Result<()> {
|
||||||
|
if !transient {
|
||||||
|
key = context.build_byte_swap(key)?;
|
||||||
|
value = context.build_byte_swap(value)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
let key_pointer = context.build_alloca_at_entry(context.word_type(), "key_pointer");
|
||||||
|
let value_pointer = context.build_alloca_at_entry(context.word_type(), "value_pointer");
|
||||||
|
|
||||||
|
context.build_store(key_pointer, key)?;
|
||||||
|
context.build_store(value_pointer, value)?;
|
||||||
|
|
||||||
|
let is_transient = context.xlen_type().const_int(transient as u64, false);
|
||||||
|
|
||||||
|
let arguments = [
|
||||||
|
is_transient.into(),
|
||||||
|
key_pointer.to_int(context).into(),
|
||||||
|
context.xlen_type().const_all_ones().into(),
|
||||||
|
value_pointer.to_int(context).into(),
|
||||||
|
context.integer_const(crate::polkavm::XLEN, 32).into(),
|
||||||
|
];
|
||||||
|
context.build_runtime_call(revive_runtime_api::polkavm_imports::SET_STORAGE, &arguments);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,7 +4,9 @@ use crate::polkavm::context::runtime::RuntimeFunction;
|
|||||||
use crate::polkavm::context::Context;
|
use crate::polkavm::context::Context;
|
||||||
use crate::polkavm::Dependency;
|
use crate::polkavm::Dependency;
|
||||||
use crate::PolkaVMLoadStorageWordFunction;
|
use crate::PolkaVMLoadStorageWordFunction;
|
||||||
|
use crate::PolkaVMLoadTransientStorageWordFunction;
|
||||||
use crate::PolkaVMStoreStorageWordFunction;
|
use crate::PolkaVMStoreStorageWordFunction;
|
||||||
|
use crate::PolkaVMStoreTransientStorageWordFunction;
|
||||||
|
|
||||||
/// Translates the storage load.
|
/// Translates the storage load.
|
||||||
pub fn load<'ctx, D>(
|
pub fn load<'ctx, D>(
|
||||||
@@ -16,7 +18,7 @@ where
|
|||||||
{
|
{
|
||||||
let name = <PolkaVMLoadStorageWordFunction as RuntimeFunction<D>>::NAME;
|
let name = <PolkaVMLoadStorageWordFunction as RuntimeFunction<D>>::NAME;
|
||||||
let declaration = <PolkaVMLoadStorageWordFunction as RuntimeFunction<D>>::declaration(context);
|
let declaration = <PolkaVMLoadStorageWordFunction as RuntimeFunction<D>>::declaration(context);
|
||||||
let arguments = [context.xlen_type().const_zero().into(), position.into()];
|
let arguments = [position.into()];
|
||||||
Ok(context
|
Ok(context
|
||||||
.build_call(declaration, &arguments, "storage_load")
|
.build_call(declaration, &arguments, "storage_load")
|
||||||
.unwrap_or_else(|| panic!("runtime function {name} should return a value")))
|
.unwrap_or_else(|| panic!("runtime function {name} should return a value")))
|
||||||
@@ -32,11 +34,7 @@ where
|
|||||||
D: Dependency + Clone,
|
D: Dependency + Clone,
|
||||||
{
|
{
|
||||||
let declaration = <PolkaVMStoreStorageWordFunction as RuntimeFunction<D>>::declaration(context);
|
let declaration = <PolkaVMStoreStorageWordFunction as RuntimeFunction<D>>::declaration(context);
|
||||||
let arguments = [
|
let arguments = [position.into(), value.into()];
|
||||||
context.xlen_type().const_zero().into(),
|
|
||||||
position.into(),
|
|
||||||
value.into(),
|
|
||||||
];
|
|
||||||
context.build_call(declaration, &arguments, "storage_store");
|
context.build_call(declaration, &arguments, "storage_store");
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@@ -49,14 +47,12 @@ pub fn transient_load<'ctx, D>(
|
|||||||
where
|
where
|
||||||
D: Dependency + Clone,
|
D: Dependency + Clone,
|
||||||
{
|
{
|
||||||
let name = <PolkaVMLoadStorageWordFunction as RuntimeFunction<D>>::NAME;
|
let name = <PolkaVMLoadTransientStorageWordFunction as RuntimeFunction<D>>::NAME;
|
||||||
let declaration = <PolkaVMLoadStorageWordFunction as RuntimeFunction<D>>::declaration(context);
|
let arguments = [position.into()];
|
||||||
let arguments = [
|
let declaration =
|
||||||
context.xlen_type().const_int(1, false).into(),
|
<PolkaVMLoadTransientStorageWordFunction as RuntimeFunction<D>>::declaration(context);
|
||||||
position.into(),
|
|
||||||
];
|
|
||||||
Ok(context
|
Ok(context
|
||||||
.build_call(declaration, &arguments, "storage_load")
|
.build_call(declaration, &arguments, "transient_storage_load")
|
||||||
.unwrap_or_else(|| panic!("runtime function {name} should return a value")))
|
.unwrap_or_else(|| panic!("runtime function {name} should return a value")))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,12 +65,9 @@ pub fn transient_store<'ctx, D>(
|
|||||||
where
|
where
|
||||||
D: Dependency + Clone,
|
D: Dependency + Clone,
|
||||||
{
|
{
|
||||||
let declaration = <PolkaVMStoreStorageWordFunction as RuntimeFunction<D>>::declaration(context);
|
let declaration =
|
||||||
let arguments = [
|
<PolkaVMStoreTransientStorageWordFunction as RuntimeFunction<D>>::declaration(context);
|
||||||
context.xlen_type().const_int(1, false).into(),
|
let arguments = [position.into(), value.into()];
|
||||||
position.into(),
|
context.build_call(declaration, &arguments, "transient_storage_store");
|
||||||
value.into(),
|
|
||||||
];
|
|
||||||
context.build_call(declaration, &arguments, "storage_store");
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,14 +106,10 @@ impl SpecsAction {
|
|||||||
};
|
};
|
||||||
|
|
||||||
for (key, expected) in storage {
|
for (key, expected) in storage {
|
||||||
let mut key = **key;
|
|
||||||
let mut expected = **expected;
|
|
||||||
key.reverse();
|
|
||||||
expected.reverse();
|
|
||||||
actions.push(Self::VerifyStorage {
|
actions.push(Self::VerifyStorage {
|
||||||
contract: account_pvm.clone(),
|
contract: account_pvm.clone(),
|
||||||
key,
|
key: **key,
|
||||||
expected,
|
expected: **expected,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -192,6 +192,8 @@ where
|
|||||||
revive_llvm_context::PolkaVMStoreHeapWordFunction.declare(context)?;
|
revive_llvm_context::PolkaVMStoreHeapWordFunction.declare(context)?;
|
||||||
revive_llvm_context::PolkaVMLoadStorageWordFunction.declare(context)?;
|
revive_llvm_context::PolkaVMLoadStorageWordFunction.declare(context)?;
|
||||||
revive_llvm_context::PolkaVMStoreStorageWordFunction.declare(context)?;
|
revive_llvm_context::PolkaVMStoreStorageWordFunction.declare(context)?;
|
||||||
|
revive_llvm_context::PolkaVMLoadTransientStorageWordFunction.declare(context)?;
|
||||||
|
revive_llvm_context::PolkaVMStoreTransientStorageWordFunction.declare(context)?;
|
||||||
|
|
||||||
revive_llvm_context::PolkaVMWordToPointerFunction.declare(context)?;
|
revive_llvm_context::PolkaVMWordToPointerFunction.declare(context)?;
|
||||||
revive_llvm_context::PolkaVMExitFunction.declare(context)?;
|
revive_llvm_context::PolkaVMExitFunction.declare(context)?;
|
||||||
@@ -242,6 +244,8 @@ where
|
|||||||
revive_llvm_context::PolkaVMStoreHeapWordFunction.into_llvm(context)?;
|
revive_llvm_context::PolkaVMStoreHeapWordFunction.into_llvm(context)?;
|
||||||
revive_llvm_context::PolkaVMLoadStorageWordFunction.into_llvm(context)?;
|
revive_llvm_context::PolkaVMLoadStorageWordFunction.into_llvm(context)?;
|
||||||
revive_llvm_context::PolkaVMStoreStorageWordFunction.into_llvm(context)?;
|
revive_llvm_context::PolkaVMStoreStorageWordFunction.into_llvm(context)?;
|
||||||
|
revive_llvm_context::PolkaVMLoadTransientStorageWordFunction.into_llvm(context)?;
|
||||||
|
revive_llvm_context::PolkaVMStoreTransientStorageWordFunction.into_llvm(context)?;
|
||||||
|
|
||||||
revive_llvm_context::PolkaVMWordToPointerFunction.into_llvm(context)?;
|
revive_llvm_context::PolkaVMWordToPointerFunction.into_llvm(context)?;
|
||||||
revive_llvm_context::PolkaVMExitFunction.into_llvm(context)?;
|
revive_llvm_context::PolkaVMExitFunction.into_llvm(context)?;
|
||||||
|
|||||||
Reference in New Issue
Block a user