mirror of
https://github.com/pezkuwichain/revive.git
synced 2026-06-21 19:41:01 +00:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 199b6145f2 | |||
| 36f9345c22 | |||
| 33d589ea7f | |||
| fdc44db1be | |||
| 76f815f33b | |||
| a293264028 | |||
| 7bf9d49166 | |||
| d5b9c489ea |
@@ -0,0 +1,6 @@
|
|||||||
|
FROM revive-llvm
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
RUN RUSTFLAGS='-L /app/llvm18.0/lib/unknown -L /usr/lib -L /app/llvm18.0/lib' REVIVE_INSTALL_DIR='/app/release/revive/' make install-revive
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
FROM alpine:3.20.3
|
||||||
|
|
||||||
|
ARG RUST_VERSION=stable
|
||||||
|
|
||||||
|
RUN apk add bash git cmake make ninja python3 ncurses-static curl
|
||||||
|
RUN ninja --version
|
||||||
|
|
||||||
|
COPY build-llvm.sh .
|
||||||
|
|
||||||
|
RUN bash -c ./build-llvm.sh
|
||||||
|
|
||||||
|
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain ${RUST_VERSION}
|
||||||
|
ENV PATH=/root/.cargo/bin:/llvm18.0/bin:${PATH}
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
RUN REVIVE_INSTALL_DIR=$(pwd)/target/release
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
name: Release
|
||||||
|
run-name: Release ${{ github.ref_name }}
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "[0-9]+.[0-9]+.[0-9]+"
|
||||||
|
- "[0-9]+.[0-9]+.[0-9]+-[a-zA-Z0-9]+"
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
CreateRelease:
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- name: Release
|
||||||
|
uses: softprops/action-gh-release@v2
|
||||||
|
with:
|
||||||
|
draft: true
|
||||||
|
make_latest: true
|
||||||
|
|
||||||
|
Release:
|
||||||
|
needs: [CreateRelease]
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
steps:
|
||||||
|
- name: build llvm
|
||||||
|
run: docker build -t revive-llvm:latest --progress=plain -f --build-arg RUST_VERSION=1.80 .github/Dockerfile-llvm
|
||||||
|
|
||||||
|
- name: build revive
|
||||||
|
run: docker build -t revive:latest --progress=plain -f .github/Dockerfile
|
||||||
|
|
||||||
|
- name: get binary
|
||||||
|
run: docker run --rm revive:latest -v output:/app/output cp /app/release/revive/resolc /app/output
|
||||||
|
|
||||||
|
# docker push revive:latest
|
||||||
|
|
||||||
|
- run: gh release upload ${{ github.ref_name }} output/resolc --clobber
|
||||||
@@ -3,8 +3,6 @@ name: Build
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: ["main"]
|
branches: ["main"]
|
||||||
pull_request:
|
|
||||||
branches: ["main"]
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
name: Test
|
||||||
|
run-name: Test ${{ github.ref_name }}
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, synchronize, reopened, ready_for_review]
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
Release:
|
||||||
|
# runs-on: ubuntu-20.04
|
||||||
|
runs-on: parity-large
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: build llvm
|
||||||
|
run: docker build -t revive-llvm:latest --progress=plain --build-arg RUST_VERSION=1.80 -f .github/Dockerfile-llvm .
|
||||||
|
|
||||||
|
- name: build revive
|
||||||
|
run: docker build -t revive:latest --progress=plain -f .github/Dockerfile
|
||||||
|
|
||||||
|
- name: get binary
|
||||||
|
run: docker run --rm revive:latest -v output:/app/output cp /app/release/revive/resolc /app/output .
|
||||||
|
|
||||||
|
# docker push revive:latest
|
||||||
|
|
||||||
|
- run: gh release upload ${{ github.ref_name }} output/resolc
|
||||||
Generated
+570
-589
File diff suppressed because it is too large
Load Diff
+6
-7
@@ -51,10 +51,10 @@ path-slash = "0.2"
|
|||||||
rayon = "1.8"
|
rayon = "1.8"
|
||||||
clap = { version = "4", default-features = false, features = ["derive"] }
|
clap = { version = "4", default-features = false, features = ["derive"] }
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
polkavm-common = "0.14"
|
polkavm-common = "0.13"
|
||||||
polkavm-linker = "0.14"
|
polkavm-linker = "0.13"
|
||||||
polkavm-disassembler = "0.14"
|
polkavm-disassembler = "0.13"
|
||||||
polkavm = "0.14"
|
polkavm = "0.13"
|
||||||
alloy-primitives = { version = "0.8", features = ["serde"] }
|
alloy-primitives = { version = "0.8", features = ["serde"] }
|
||||||
alloy-sol-types = "0.8"
|
alloy-sol-types = "0.8"
|
||||||
alloy-genesis = "0.3"
|
alloy-genesis = "0.3"
|
||||||
@@ -67,12 +67,11 @@ log = { version = "0.4" }
|
|||||||
# polkadot-sdk and friends
|
# polkadot-sdk and friends
|
||||||
codec = { version = "3.6.12", default-features = false, package = "parity-scale-codec" }
|
codec = { version = "3.6.12", default-features = false, package = "parity-scale-codec" }
|
||||||
scale-info = { version = "2.11.1", default-features = false }
|
scale-info = { version = "2.11.1", default-features = false }
|
||||||
polkadot-sdk = { git = "https://github.com/paritytech/polkadot-sdk", rev = "db40a66db71e8e7fe943dda5cd0e28078efa2a19" }
|
polkadot-sdk = { git = "https://github.com/paritytech/polkadot-sdk", rev = "aeebf2f383390f2f86527d70212162d5dbea8b93" }
|
||||||
|
|
||||||
# llvm
|
# llvm
|
||||||
[workspace.dependencies.inkwell]
|
[workspace.dependencies.inkwell]
|
||||||
git = "https://github.com/TheDan64/inkwell.git"
|
version = "0.5"
|
||||||
rev = "7b410298b6a93450adaa90b1841d5805a3038f12"
|
|
||||||
default-features = false
|
default-features = false
|
||||||
features = ["serde", "llvm18-0", "no-libffi-linking", "target-riscv"]
|
features = ["serde", "llvm18-0", "no-libffi-linking", "target-riscv"]
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"Baseline": 967,
|
"Baseline": 989,
|
||||||
"Computation": 4022,
|
"Computation": 4153,
|
||||||
"DivisionArithmetics": 31787,
|
"DivisionArithmetics": 40614,
|
||||||
"ERC20": 44233,
|
"ERC20": 47343,
|
||||||
"Events": 1743,
|
"Events": 1781,
|
||||||
"FibonacciIterative": 2927,
|
"FibonacciIterative": 3035,
|
||||||
"Flipper": 3408,
|
"Flipper": 3393,
|
||||||
"SHA1": 26009
|
"SHA1": 33553
|
||||||
}
|
}
|
||||||
@@ -4,27 +4,11 @@ pragma solidity ^0.8;
|
|||||||
|
|
||||||
/* runner.json
|
/* runner.json
|
||||||
{
|
{
|
||||||
"differential": true,
|
|
||||||
"actions": [
|
"actions": [
|
||||||
{
|
{
|
||||||
"Upload": {
|
"Instantiate": {}
|
||||||
"code": {
|
}
|
||||||
"Solidity": {
|
]
|
||||||
"contract": "ERC20"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Instantiate": {
|
|
||||||
"code": {
|
|
||||||
"Solidity": {
|
|
||||||
"contract": "ERC20Tester"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -98,28 +82,3 @@ contract ERC20 is IERC20 {
|
|||||||
emit Transfer(msg.sender, address(0), amount);
|
emit Transfer(msg.sender, address(0), amount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
contract ERC20Tester {
|
|
||||||
constructor() {
|
|
||||||
address BOB = address(0xffffffffffffffffffffffffffffffffffffff);
|
|
||||||
ERC20 token = new ERC20();
|
|
||||||
assert(token.decimals() == 18);
|
|
||||||
|
|
||||||
// use call directly when code_size is implemented on pallet-revive
|
|
||||||
|
|
||||||
address(token).call(abi.encodeWithSignature("mint(uint256)", 300));
|
|
||||||
assert(token.balanceOf(address(this)) == 300);
|
|
||||||
token.transfer(BOB, 100);
|
|
||||||
assert(token.balanceOf(address(this)) == 200);
|
|
||||||
assert(token.balanceOf(BOB) == 100);
|
|
||||||
|
|
||||||
token.approve(address(this), 100);
|
|
||||||
|
|
||||||
token.transferFrom(address(this), BOB, 100);
|
|
||||||
assert(token.balanceOf(BOB) == 200);
|
|
||||||
assert(token.balanceOf(address(this)) == 100);
|
|
||||||
|
|
||||||
address(token).call(abi.encodeWithSignature("burn(uint256)", 100));
|
|
||||||
assert(token.balanceOf(address(this)) == 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -22,14 +22,6 @@ pragma solidity ^0.8;
|
|||||||
},
|
},
|
||||||
"data": "fabc9efaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
|
"data": "fabc9efaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
"Call": {
|
|
||||||
"dest": {
|
|
||||||
"Instantiated": 0
|
|
||||||
},
|
|
||||||
"data": "558b9f9bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -38,18 +30,10 @@ pragma solidity ^0.8;
|
|||||||
contract Storage {
|
contract Storage {
|
||||||
function transient(uint value) public returns (uint ret) {
|
function transient(uint value) public returns (uint ret) {
|
||||||
assembly {
|
assembly {
|
||||||
let slot := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
|
let slot := 123
|
||||||
tstore(slot, value)
|
tstore(slot, value)
|
||||||
let success := call(0, 0, 0, 0, 0, 0, 0)
|
let success := call(0, 0, 0, 0, 0, 0, 0)
|
||||||
ret := tload(slot)
|
ret := tload(slot)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function persistent(uint value) public returns (uint ret) {
|
|
||||||
assembly {
|
|
||||||
let slot := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
|
|
||||||
sstore(slot, value)
|
|
||||||
ret := sload(slot)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,54 +0,0 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
|
||||||
pragma solidity ^0.8.0;
|
|
||||||
|
|
||||||
/* runner.json
|
|
||||||
{
|
|
||||||
"differential": true,
|
|
||||||
"actions": [
|
|
||||||
{
|
|
||||||
"Upload": {
|
|
||||||
"code": {
|
|
||||||
"Solidity": {
|
|
||||||
"contract": "TransactionOrigin"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Instantiate": {
|
|
||||||
"code": {
|
|
||||||
"Solidity": {
|
|
||||||
"contract": "TransactionTester"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Call": {
|
|
||||||
"dest": {
|
|
||||||
"Instantiated": 0
|
|
||||||
},
|
|
||||||
"data": "f8a8fd6d"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
contract TransactionTester {
|
|
||||||
constructor() payable {
|
|
||||||
assert(tx.origin == new TransactionOrigin().test());
|
|
||||||
}
|
|
||||||
|
|
||||||
function test() public payable returns (address ret) {
|
|
||||||
ret = tx.origin;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
contract TransactionOrigin {
|
|
||||||
function test() public payable returns (address ret) {
|
|
||||||
assert(msg.sender != tx.origin);
|
|
||||||
|
|
||||||
ret = tx.origin;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -43,7 +43,6 @@ test_spec!(call, "Caller", "Call.sol");
|
|||||||
test_spec!(transfer, "Transfer", "Transfer.sol");
|
test_spec!(transfer, "Transfer", "Transfer.sol");
|
||||||
test_spec!(return_data_oob, "ReturnDataOob", "ReturnDataOob.sol");
|
test_spec!(return_data_oob, "ReturnDataOob", "ReturnDataOob.sol");
|
||||||
test_spec!(immutables, "Immutables", "Immutables.sol");
|
test_spec!(immutables, "Immutables", "Immutables.sol");
|
||||||
test_spec!(transaction, "Transaction", "Transaction.sol");
|
|
||||||
|
|
||||||
fn instantiate(path: &str, contract: &str) -> Vec<SpecsAction> {
|
fn instantiate(path: &str, contract: &str) -> Vec<SpecsAction> {
|
||||||
vec![Instantiate {
|
vec![Instantiate {
|
||||||
|
|||||||
@@ -669,10 +669,22 @@ where
|
|||||||
self.build_byte_swap(value)
|
self.build_byte_swap(value)
|
||||||
}
|
}
|
||||||
AddressSpace::Storage | AddressSpace::TransientStorage => {
|
AddressSpace::Storage | AddressSpace::TransientStorage => {
|
||||||
|
let storage_key_value = self.builder().build_ptr_to_int(
|
||||||
|
pointer.value,
|
||||||
|
self.word_type(),
|
||||||
|
"storage_ptr_to_int",
|
||||||
|
)?;
|
||||||
|
let storage_key_pointer = self.build_alloca(self.word_type(), "storage_key");
|
||||||
|
let storage_key_pointer_casted = self.builder().build_ptr_to_int(
|
||||||
|
storage_key_pointer.value,
|
||||||
|
self.xlen_type(),
|
||||||
|
"storage_key_pointer_casted",
|
||||||
|
)?;
|
||||||
|
self.builder()
|
||||||
|
.build_store(storage_key_pointer.value, storage_key_value)?;
|
||||||
|
|
||||||
let storage_value_pointer =
|
let storage_value_pointer =
|
||||||
self.build_alloca(self.word_type(), "storage_value_pointer");
|
self.build_alloca(self.word_type(), "storage_value_pointer");
|
||||||
self.build_store(storage_value_pointer, self.word_const(0))?;
|
|
||||||
|
|
||||||
let storage_value_length_pointer =
|
let storage_value_length_pointer =
|
||||||
self.build_alloca(self.xlen_type(), "storage_value_length_pointer");
|
self.build_alloca(self.xlen_type(), "storage_value_length_pointer");
|
||||||
self.build_store(
|
self.build_store(
|
||||||
@@ -686,7 +698,7 @@ where
|
|||||||
revive_runtime_api::polkavm_imports::GET_STORAGE,
|
revive_runtime_api::polkavm_imports::GET_STORAGE,
|
||||||
&[
|
&[
|
||||||
self.xlen_type().const_int(transient as u64, false).into(),
|
self.xlen_type().const_int(transient as u64, false).into(),
|
||||||
pointer.to_int(self).into(),
|
storage_key_pointer_casted.into(),
|
||||||
self.xlen_type().const_all_ones().into(),
|
self.xlen_type().const_all_ones().into(),
|
||||||
storage_value_pointer.to_int(self).into(),
|
storage_value_pointer.to_int(self).into(),
|
||||||
storage_value_length_pointer.to_int(self).into(),
|
storage_value_length_pointer.to_int(self).into(),
|
||||||
@@ -755,6 +767,18 @@ where
|
|||||||
self.word_type().as_basic_type_enum()
|
self.word_type().as_basic_type_enum()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let storage_key_value = self.builder().build_ptr_to_int(
|
||||||
|
pointer.value,
|
||||||
|
self.word_type(),
|
||||||
|
"storage_ptr_to_int",
|
||||||
|
)?;
|
||||||
|
let storage_key_pointer = self.build_alloca(self.word_type(), "storage_key");
|
||||||
|
let storage_key_pointer_casted = self.builder().build_ptr_to_int(
|
||||||
|
storage_key_pointer.value,
|
||||||
|
self.xlen_type(),
|
||||||
|
"storage_key_pointer_casted",
|
||||||
|
)?;
|
||||||
|
|
||||||
let storage_value_pointer = self.build_alloca(self.word_type(), "storage_value");
|
let storage_value_pointer = self.build_alloca(self.word_type(), "storage_value");
|
||||||
let storage_value_pointer_casted = self.builder().build_ptr_to_int(
|
let storage_value_pointer_casted = self.builder().build_ptr_to_int(
|
||||||
storage_value_pointer.value,
|
storage_value_pointer.value,
|
||||||
@@ -762,6 +786,8 @@ where
|
|||||||
"storage_value_pointer_casted",
|
"storage_value_pointer_casted",
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
|
self.builder()
|
||||||
|
.build_store(storage_key_pointer.value, storage_key_value)?;
|
||||||
self.builder()
|
self.builder()
|
||||||
.build_store(storage_value_pointer.value, value)?;
|
.build_store(storage_value_pointer.value, value)?;
|
||||||
|
|
||||||
@@ -771,7 +797,7 @@ where
|
|||||||
revive_runtime_api::polkavm_imports::SET_STORAGE,
|
revive_runtime_api::polkavm_imports::SET_STORAGE,
|
||||||
&[
|
&[
|
||||||
self.xlen_type().const_int(transient as u64, false).into(),
|
self.xlen_type().const_int(transient as u64, false).into(),
|
||||||
pointer.to_int(self).into(),
|
storage_key_pointer_casted.into(),
|
||||||
self.xlen_type().const_all_ones().into(),
|
self.xlen_type().const_all_ones().into(),
|
||||||
storage_value_pointer_casted.into(),
|
storage_value_pointer_casted.into(),
|
||||||
self.integer_const(crate::polkavm::XLEN, 32).into(),
|
self.integer_const(crate::polkavm::XLEN, 32).into(),
|
||||||
|
|||||||
@@ -27,19 +27,12 @@ where
|
|||||||
|
|
||||||
/// Translates the `tx.origin` instruction.
|
/// Translates the `tx.origin` instruction.
|
||||||
pub fn origin<'ctx, D>(
|
pub fn origin<'ctx, D>(
|
||||||
context: &mut Context<'ctx, D>,
|
_context: &mut Context<'ctx, D>,
|
||||||
) -> anyhow::Result<inkwell::values::BasicValueEnum<'ctx>>
|
) -> anyhow::Result<inkwell::values::BasicValueEnum<'ctx>>
|
||||||
where
|
where
|
||||||
D: Dependency + Clone,
|
D: Dependency + Clone,
|
||||||
{
|
{
|
||||||
let address_type = context.integer_type(revive_common::BIT_LENGTH_ETH_ADDRESS);
|
todo!()
|
||||||
let address_pointer = context.build_alloca_at_entry(address_type, "origin_address");
|
|
||||||
context.build_store(address_pointer, address_type.const_zero())?;
|
|
||||||
context.build_runtime_call(
|
|
||||||
revive_runtime_api::polkavm_imports::ORIGIN,
|
|
||||||
&[address_pointer.to_int(context).into()],
|
|
||||||
);
|
|
||||||
context.build_load_address(address_pointer)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Translates the `chain_id` instruction.
|
/// Translates the `chain_id` instruction.
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
//! Translates the storage operations.
|
//! Translates the storage operations.
|
||||||
|
|
||||||
use crate::polkavm::context::address_space::AddressSpace;
|
use crate::polkavm::context::address_space::AddressSpace;
|
||||||
|
use crate::polkavm::context::pointer::Pointer;
|
||||||
use crate::polkavm::context::Context;
|
use crate::polkavm::context::Context;
|
||||||
use crate::polkavm::Dependency;
|
use crate::polkavm::Dependency;
|
||||||
|
|
||||||
@@ -12,10 +13,14 @@ pub fn load<'ctx, D>(
|
|||||||
where
|
where
|
||||||
D: Dependency + Clone,
|
D: Dependency + Clone,
|
||||||
{
|
{
|
||||||
let mut slot_ptr = context.build_alloca_at_entry(context.word_type(), "slot_pointer");
|
let position_pointer = Pointer::new_with_offset(
|
||||||
slot_ptr.address_space = AddressSpace::Storage;
|
context,
|
||||||
context.builder().build_store(slot_ptr.value, position)?;
|
AddressSpace::Storage,
|
||||||
context.build_load(slot_ptr, "storage_load_value")
|
context.word_type(),
|
||||||
|
position,
|
||||||
|
"storage_load_position_pointer",
|
||||||
|
);
|
||||||
|
context.build_load(position_pointer, "storage_load_value")
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Translates the storage store.
|
/// Translates the storage store.
|
||||||
@@ -27,10 +32,14 @@ pub fn store<'ctx, D>(
|
|||||||
where
|
where
|
||||||
D: Dependency + Clone,
|
D: Dependency + Clone,
|
||||||
{
|
{
|
||||||
let mut slot_ptr = context.build_alloca_at_entry(context.word_type(), "slot_pointer");
|
let position_pointer = Pointer::new_with_offset(
|
||||||
slot_ptr.address_space = AddressSpace::Storage;
|
context,
|
||||||
context.builder().build_store(slot_ptr.value, position)?;
|
AddressSpace::Storage,
|
||||||
context.build_store(slot_ptr, value)?;
|
context.word_type(),
|
||||||
|
position,
|
||||||
|
"storage_store_position_pointer",
|
||||||
|
);
|
||||||
|
context.build_store(position_pointer, value)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,10 +51,14 @@ pub fn transient_load<'ctx, D>(
|
|||||||
where
|
where
|
||||||
D: Dependency + Clone,
|
D: Dependency + Clone,
|
||||||
{
|
{
|
||||||
let mut slot_ptr = context.build_alloca_at_entry(context.word_type(), "slot_pointer");
|
let position_pointer = Pointer::new_with_offset(
|
||||||
slot_ptr.address_space = AddressSpace::TransientStorage;
|
context,
|
||||||
context.builder().build_store(slot_ptr.value, position)?;
|
AddressSpace::TransientStorage,
|
||||||
context.build_load(slot_ptr, "transient_storage_load_value")
|
context.word_type(),
|
||||||
|
position,
|
||||||
|
"transient_storage_load_position_pointer",
|
||||||
|
);
|
||||||
|
context.build_load(position_pointer, "transient_storage_load_value")
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Translates the transient storage store.
|
/// Translates the transient storage store.
|
||||||
@@ -57,9 +70,13 @@ pub fn transient_store<'ctx, D>(
|
|||||||
where
|
where
|
||||||
D: Dependency + Clone,
|
D: Dependency + Clone,
|
||||||
{
|
{
|
||||||
let mut slot_ptr = context.build_alloca_at_entry(context.word_type(), "slot_pointer");
|
let position_pointer = Pointer::new_with_offset(
|
||||||
slot_ptr.address_space = AddressSpace::TransientStorage;
|
context,
|
||||||
context.builder().build_store(slot_ptr.value, position)?;
|
AddressSpace::TransientStorage,
|
||||||
context.build_store(slot_ptr, value)?;
|
context.word_type(),
|
||||||
|
position,
|
||||||
|
"transient_storage_store_position_pointer",
|
||||||
|
);
|
||||||
|
context.build_store(position_pointer, value)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,9 +39,9 @@ impl TargetMachine {
|
|||||||
|
|
||||||
/// LLVM target features.
|
/// LLVM target features.
|
||||||
#[cfg(feature = "riscv-zbb")]
|
#[cfg(feature = "riscv-zbb")]
|
||||||
pub const VM_FEATURES: &'static str = "+zbb,+a,+e,+m,+c,+fast-unaligned-access,+xtheadcondmov";
|
pub const VM_FEATURES: &'static str = "+zbb,+e,+m,+c";
|
||||||
#[cfg(not(feature = "riscv-zbb"))]
|
#[cfg(not(feature = "riscv-zbb"))]
|
||||||
pub const VM_FEATURES: &'static str = "+a,+e,+m,+c,+fast-unaligned-access,+xtheadcondmov";
|
pub const VM_FEATURES: &'static str = "+e,+m,+c";
|
||||||
|
|
||||||
/// A shortcut constructor.
|
/// A shortcut constructor.
|
||||||
/// A separate instance for every optimization level is created.
|
/// A separate instance for every optimization level is created.
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ impl ExtBuilder {
|
|||||||
Self {
|
Self {
|
||||||
balance_genesis_config: value
|
balance_genesis_config: value
|
||||||
.iter()
|
.iter()
|
||||||
.map(|(address, balance)| (AccountId::to_fallback_account_id(address), *balance))
|
.map(|(address, balance)| (AccountId::to_account_id(address), *balance))
|
||||||
.collect(),
|
.collect(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -246,7 +246,7 @@ pub enum Code {
|
|||||||
/// A contract blob
|
/// A contract blob
|
||||||
Bytes(Vec<u8>),
|
Bytes(Vec<u8>),
|
||||||
/// Pre-existing contract hash
|
/// Pre-existing contract hash
|
||||||
Hash(crate::runtime::Hash),
|
Hash(Hash),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Code {
|
impl Default for Code {
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
use frame_support::runtime;
|
use frame_support::runtime;
|
||||||
|
|
||||||
use pallet_revive::AccountId32Mapper;
|
|
||||||
use polkadot_sdk::*;
|
use polkadot_sdk::*;
|
||||||
use polkadot_sdk::{
|
use polkadot_sdk::{
|
||||||
polkadot_sdk_frame::{log, runtime::prelude::*},
|
polkadot_sdk_frame::{log, runtime::prelude::*},
|
||||||
@@ -8,7 +7,7 @@ use polkadot_sdk::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
pub type Balance = u128;
|
pub type Balance = u128;
|
||||||
pub type AccountId = pallet_revive::AccountId32Mapper<Runtime>;
|
pub type AccountId = pallet_revive::DefaultAddressMapper;
|
||||||
pub type Block = frame_system::mocking::MockBlock<Runtime>;
|
pub type Block = frame_system::mocking::MockBlock<Runtime>;
|
||||||
pub type Hash = <Runtime as frame_system::Config>::Hash;
|
pub type Hash = <Runtime as frame_system::Config>::Hash;
|
||||||
pub type EventRecord =
|
pub type EventRecord =
|
||||||
@@ -75,7 +74,7 @@ impl pallet_revive::Config for Runtime {
|
|||||||
type ChainExtension = ();
|
type ChainExtension = ();
|
||||||
type DepositPerByte = DepositPerByte;
|
type DepositPerByte = DepositPerByte;
|
||||||
type DepositPerItem = DepositPerItem;
|
type DepositPerItem = DepositPerItem;
|
||||||
type AddressMapper = AccountId32Mapper<Self>;
|
type AddressMapper = AccountId;
|
||||||
type RuntimeMemory = ConstU32<{ 512 * 1024 * 1024 }>;
|
type RuntimeMemory = ConstU32<{ 512 * 1024 * 1024 }>;
|
||||||
type PVFMemory = ConstU32<{ 1024 * 1024 * 1024 }>;
|
type PVFMemory = ConstU32<{ 1024 * 1024 * 1024 }>;
|
||||||
type UnsafeUnstableInterface = UnstableInterface;
|
type UnsafeUnstableInterface = UnstableInterface;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
use std::time::Instant;
|
use std::time::Instant;
|
||||||
|
|
||||||
|
use pallet_revive::AddressMapper;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::*;
|
use crate::*;
|
||||||
|
|||||||
@@ -96,8 +96,6 @@ POLKAVM_IMPORT(uint32_t, instantiate, uint32_t)
|
|||||||
|
|
||||||
POLKAVM_IMPORT(void, now, uint32_t)
|
POLKAVM_IMPORT(void, now, uint32_t)
|
||||||
|
|
||||||
POLKAVM_IMPORT(void, origin, uint32_t)
|
|
||||||
|
|
||||||
POLKAVM_IMPORT(void, seal_return, uint32_t, uint32_t, uint32_t)
|
POLKAVM_IMPORT(void, seal_return, uint32_t, uint32_t, uint32_t)
|
||||||
|
|
||||||
POLKAVM_IMPORT(uint32_t, set_storage, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t)
|
POLKAVM_IMPORT(uint32_t, set_storage, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t)
|
||||||
|
|||||||
@@ -46,8 +46,6 @@ pub static INSTANTIATE: &str = "instantiate";
|
|||||||
|
|
||||||
pub static NOW: &str = "now";
|
pub static NOW: &str = "now";
|
||||||
|
|
||||||
pub static ORIGIN: &str = "origin";
|
|
||||||
|
|
||||||
pub static RETURN: &str = "seal_return";
|
pub static RETURN: &str = "seal_return";
|
||||||
|
|
||||||
pub static SET_STORAGE: &str = "set_storage";
|
pub static SET_STORAGE: &str = "set_storage";
|
||||||
@@ -62,7 +60,7 @@ pub static VALUE_TRANSFERRED: &str = "value_transferred";
|
|||||||
|
|
||||||
/// All imported runtime API symbols.
|
/// All imported runtime API symbols.
|
||||||
/// Useful for configuring common attributes and linkage.
|
/// Useful for configuring common attributes and linkage.
|
||||||
pub static IMPORTS: [&str; 25] = [
|
pub static IMPORTS: [&str; 24] = [
|
||||||
SBRK,
|
SBRK,
|
||||||
MEMORY_SIZE,
|
MEMORY_SIZE,
|
||||||
ADDRESS,
|
ADDRESS,
|
||||||
@@ -81,7 +79,6 @@ pub static IMPORTS: [&str; 25] = [
|
|||||||
INPUT,
|
INPUT,
|
||||||
INSTANTIATE,
|
INSTANTIATE,
|
||||||
NOW,
|
NOW,
|
||||||
ORIGIN,
|
|
||||||
RETURN,
|
RETURN,
|
||||||
RETURNDATACOPY,
|
RETURNDATACOPY,
|
||||||
RETURNDATASIZE,
|
RETURNDATASIZE,
|
||||||
|
|||||||
Reference in New Issue
Block a user