mirror of
https://github.com/pezkuwichain/revive.git
synced 2026-06-14 19:11:04 +00:00
Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4cce4a729e | |||
| 9267a2af02 | |||
| 173ace72cb | |||
| 37ab2b6782 | |||
| 43d2ef3ce9 | |||
| 68564f9866 | |||
| 36d9317831 | |||
| 5b3b90db83 | |||
| a4043ecde7 |
@@ -0,0 +1,28 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## Unreleased
|
||||||
|
|
||||||
|
## v0.1.0-dev.5
|
||||||
|
|
||||||
|
This is development pre-release.
|
||||||
|
|
||||||
|
# Added
|
||||||
|
- Implement the `CODESIZE` and `EXTCODESIZE` opcodes.
|
||||||
|
|
||||||
|
# Changed
|
||||||
|
- Include the full revive version in the contract metadata.
|
||||||
|
|
||||||
|
# Fixed
|
||||||
|
|
||||||
|
## v0.1.0-dev-4
|
||||||
|
|
||||||
|
This is development pre-release.
|
||||||
|
|
||||||
|
# Added
|
||||||
|
- Support the `ORIGIN` opcode.
|
||||||
|
|
||||||
|
# Changed
|
||||||
|
- Update polkavm to `v0.14.0`.
|
||||||
|
- Enable the `a`, `fast-unaligned-access` and `xtheadcondmov` LLVM target features, decreasing the code size for some contracts.
|
||||||
|
|
||||||
|
# Fixed
|
||||||
Generated
+446
-427
File diff suppressed because it is too large
Load Diff
+18
-18
@@ -3,7 +3,7 @@ resolver = "2"
|
|||||||
members = ["crates/*"]
|
members = ["crates/*"]
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
version = "0.1.0"
|
version = "0.1.0-dev.5"
|
||||||
authors = [
|
authors = [
|
||||||
"Cyrill Leutwiler <cyrill@parity.io>",
|
"Cyrill Leutwiler <cyrill@parity.io>",
|
||||||
"Parity Technologies <admin@parity.io>",
|
"Parity Technologies <admin@parity.io>",
|
||||||
@@ -14,18 +14,18 @@ repository = "https://github.com/paritytech/revive"
|
|||||||
rust-version = "1.80.0"
|
rust-version = "1.80.0"
|
||||||
|
|
||||||
[workspace.dependencies]
|
[workspace.dependencies]
|
||||||
revive-benchmarks = { version = "0.1.0", path = "crates/benchmarks" }
|
revive-benchmarks = { version = "0.1.0-dev.5", path = "crates/benchmarks" }
|
||||||
revive-builtins = { version = "0.1.0", path = "crates/builtins" }
|
revive-builtins = { version = "0.1.0-dev.5", path = "crates/builtins" }
|
||||||
revive-common = { version = "0.1.0", path = "crates/common" }
|
revive-common = { version = "0.1.0-dev.5", path = "crates/common" }
|
||||||
revive-differential = { version = "0.1.0", path = "crates/differential" }
|
revive-differential = { version = "0.1.0-dev.5", path = "crates/differential" }
|
||||||
revive-integration = { version = "0.1.0", path = "crates/integration" }
|
revive-integration = { version = "0.1.0-dev.5", path = "crates/integration" }
|
||||||
revive-linker = { version = "0.1.0", path = "crates/linker" }
|
revive-linker = { version = "0.1.0-dev.5", path = "crates/linker" }
|
||||||
lld-sys = { version = "0.1.0", path = "crates/lld-sys" }
|
lld-sys = { version = "0.1.0-dev.5", path = "crates/lld-sys" }
|
||||||
revive-llvm-context = { version = "0.1.0", path = "crates/llvm-context" }
|
revive-llvm-context = { version = "0.1.0-dev.5", path = "crates/llvm-context" }
|
||||||
revive-runtime-api = { version = "0.1.0", path = "crates/runtime-api" }
|
revive-runtime-api = { version = "0.1.0-dev.5", path = "crates/runtime-api" }
|
||||||
revive-runner = { version = "0.1.0", path = "crates/runner" }
|
revive-runner = { version = "0.1.0-dev.5", path = "crates/runner" }
|
||||||
revive-solidity = { version = "0.1.0", path = "crates/solidity" }
|
revive-solidity = { version = "0.1.0-dev.5", path = "crates/solidity" }
|
||||||
revive-stdlib = { version = "0.1.0", path = "crates/stdlib" }
|
revive-stdlib = { version = "0.1.0-dev.5", path = "crates/stdlib" }
|
||||||
|
|
||||||
hex = "0.4"
|
hex = "0.4"
|
||||||
petgraph = "0.6"
|
petgraph = "0.6"
|
||||||
@@ -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.13"
|
polkavm-common = "0.14"
|
||||||
polkavm-linker = "0.13"
|
polkavm-linker = "0.14"
|
||||||
polkavm-disassembler = "0.13"
|
polkavm-disassembler = "0.14"
|
||||||
polkavm = "0.13"
|
polkavm = "0.14"
|
||||||
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,7 +67,7 @@ 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 = "35535efb3d9f4d3b3be63c3c2bcf963883ab6af1" }
|
polkadot-sdk = { git = "https://github.com/paritytech/polkadot-sdk", rev = "2b6b69641ccff4d7aa9c32051bbb2f1e775ef8cc" }
|
||||||
|
|
||||||
# llvm
|
# llvm
|
||||||
[workspace.dependencies.inkwell]
|
[workspace.dependencies.inkwell]
|
||||||
|
|||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
# Release checklist
|
||||||
|
|
||||||
|
Prior to the first stable release we neither have formal release processes nor do we follow a fixed release schedule.
|
||||||
|
|
||||||
|
To create a new pre-release:
|
||||||
|
|
||||||
|
1. Merge a release PR which updates the `-dev.X` versions in the workspace `Cargo.toml` and updates the `CHANGELOG.md` accordingly
|
||||||
|
2. Push a release tag to `main`
|
||||||
|
3. Manually trigger the `Build revive-debian` action
|
||||||
|
4. Create a __pre-release__ from the tag and manually upload the build artifact generated by the action
|
||||||
|
5. Update the [contract-docs](https://github.com/paritytech/contract-docs/) accordingly
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"Baseline": 989,
|
"Baseline": 967,
|
||||||
"Computation": 4153,
|
"Computation": 4022,
|
||||||
"DivisionArithmetics": 40614,
|
"DivisionArithmetics": 31787,
|
||||||
"ERC20": 47348,
|
"ERC20": 44233,
|
||||||
"Events": 1781,
|
"Events": 1743,
|
||||||
"FibonacciIterative": 3035,
|
"FibonacciIterative": 2927,
|
||||||
"Flipper": 3448,
|
"Flipper": 3408,
|
||||||
"SHA1": 33553
|
"SHA1": 26009
|
||||||
}
|
}
|
||||||
@@ -105,9 +105,7 @@ contract ERC20Tester {
|
|||||||
ERC20 token = new ERC20();
|
ERC20 token = new ERC20();
|
||||||
assert(token.decimals() == 18);
|
assert(token.decimals() == 18);
|
||||||
|
|
||||||
// use call directly when code_size is implemented on pallet-revive
|
token.mint(300);
|
||||||
|
|
||||||
address(token).call(abi.encodeWithSignature("mint(uint256)", 300));
|
|
||||||
assert(token.balanceOf(address(this)) == 300);
|
assert(token.balanceOf(address(this)) == 300);
|
||||||
token.transfer(BOB, 100);
|
token.transfer(BOB, 100);
|
||||||
assert(token.balanceOf(address(this)) == 200);
|
assert(token.balanceOf(address(this)) == 200);
|
||||||
@@ -119,7 +117,7 @@ contract ERC20Tester {
|
|||||||
assert(token.balanceOf(BOB) == 200);
|
assert(token.balanceOf(BOB) == 200);
|
||||||
assert(token.balanceOf(address(this)) == 100);
|
assert(token.balanceOf(address(this)) == 100);
|
||||||
|
|
||||||
address(token).call(abi.encodeWithSignature("burn(uint256)", 100));
|
token.burn(100);
|
||||||
assert(token.balanceOf(address(this)) == 0);
|
assert(token.balanceOf(address(this)) == 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
// 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
+109
-24
@@ -43,6 +43,7 @@ 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 {
|
||||||
@@ -320,6 +321,114 @@ fn ext_code_hash() {
|
|||||||
.run();
|
.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn ext_code_size() {
|
||||||
|
let alice = Address::from(ALICE.0);
|
||||||
|
let own_address = alice.create(0);
|
||||||
|
let baseline_address = alice.create2([0u8; 32], keccak256(Contract::baseline().pvm_runtime));
|
||||||
|
|
||||||
|
let own_code_size = U256::from(
|
||||||
|
Contract::ext_code_size(Default::default())
|
||||||
|
.pvm_runtime
|
||||||
|
.len(),
|
||||||
|
);
|
||||||
|
let baseline_code_size = U256::from(Contract::baseline().pvm_runtime.len());
|
||||||
|
|
||||||
|
Specs {
|
||||||
|
actions: vec![
|
||||||
|
// Instantiate the test contract
|
||||||
|
instantiate("contracts/ExtCode.sol", "ExtCode").remove(0),
|
||||||
|
// Instantiate the baseline contract
|
||||||
|
Instantiate {
|
||||||
|
origin: TestAddress::Alice,
|
||||||
|
value: 0,
|
||||||
|
gas_limit: Some(GAS_LIMIT),
|
||||||
|
storage_deposit_limit: None,
|
||||||
|
code: Code::Solidity {
|
||||||
|
path: Some("contracts/Baseline.sol".into()),
|
||||||
|
contract: "Baseline".to_string(),
|
||||||
|
solc_optimizer: None,
|
||||||
|
pipeline: None,
|
||||||
|
},
|
||||||
|
data: vec![],
|
||||||
|
salt: OptionalHex::from([0; 32]),
|
||||||
|
},
|
||||||
|
// Alice is not a contract and returns a code size of 0
|
||||||
|
Call {
|
||||||
|
origin: TestAddress::Alice,
|
||||||
|
dest: TestAddress::Instantiated(0),
|
||||||
|
value: 0,
|
||||||
|
gas_limit: None,
|
||||||
|
storage_deposit_limit: None,
|
||||||
|
data: Contract::ext_code_size(alice).calldata,
|
||||||
|
},
|
||||||
|
VerifyCall(VerifyCallExpectation {
|
||||||
|
success: true,
|
||||||
|
output: OptionalHex::from([0u8; 32].to_vec()),
|
||||||
|
gas_consumed: None,
|
||||||
|
}),
|
||||||
|
// Unknown address returns a code size of 0
|
||||||
|
Call {
|
||||||
|
origin: TestAddress::Alice,
|
||||||
|
dest: TestAddress::Instantiated(0),
|
||||||
|
value: 0,
|
||||||
|
gas_limit: None,
|
||||||
|
storage_deposit_limit: None,
|
||||||
|
data: Contract::ext_code_size(Address::from([0xff; 20])).calldata,
|
||||||
|
},
|
||||||
|
VerifyCall(VerifyCallExpectation {
|
||||||
|
success: true,
|
||||||
|
output: OptionalHex::from([0u8; 32].to_vec()),
|
||||||
|
gas_consumed: None,
|
||||||
|
}),
|
||||||
|
// Own address via extcodesize returns own code size
|
||||||
|
Call {
|
||||||
|
origin: TestAddress::Alice,
|
||||||
|
dest: TestAddress::Instantiated(0),
|
||||||
|
value: 0,
|
||||||
|
gas_limit: None,
|
||||||
|
storage_deposit_limit: None,
|
||||||
|
data: Contract::ext_code_size(own_address).calldata,
|
||||||
|
},
|
||||||
|
VerifyCall(VerifyCallExpectation {
|
||||||
|
success: true,
|
||||||
|
output: OptionalHex::from(own_code_size.to_be_bytes::<32>().to_vec()),
|
||||||
|
gas_consumed: None,
|
||||||
|
}),
|
||||||
|
// Own address via codesize returns own code size
|
||||||
|
Call {
|
||||||
|
origin: TestAddress::Alice,
|
||||||
|
dest: TestAddress::Instantiated(0),
|
||||||
|
value: 0,
|
||||||
|
gas_limit: None,
|
||||||
|
storage_deposit_limit: None,
|
||||||
|
data: Contract::code_size().calldata,
|
||||||
|
},
|
||||||
|
VerifyCall(VerifyCallExpectation {
|
||||||
|
success: true,
|
||||||
|
output: OptionalHex::from(own_code_size.to_be_bytes::<32>().to_vec()),
|
||||||
|
gas_consumed: None,
|
||||||
|
}),
|
||||||
|
// Baseline address returns the baseline code size
|
||||||
|
Call {
|
||||||
|
origin: TestAddress::Alice,
|
||||||
|
dest: TestAddress::Instantiated(0),
|
||||||
|
value: 0,
|
||||||
|
gas_limit: None,
|
||||||
|
storage_deposit_limit: None,
|
||||||
|
data: Contract::ext_code_size(baseline_address).calldata,
|
||||||
|
},
|
||||||
|
VerifyCall(VerifyCallExpectation {
|
||||||
|
success: true,
|
||||||
|
output: OptionalHex::from(baseline_code_size.to_be_bytes::<32>().to_vec()),
|
||||||
|
gas_consumed: None,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
..Default::default()
|
||||||
|
}
|
||||||
|
.run();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// These test were implement for the mock-runtime and need to be ported yet.
|
// These test were implement for the mock-runtime and need to be ported yet.
|
||||||
|
|
||||||
@@ -348,28 +457,4 @@ fn create2_failure() {
|
|||||||
|
|
||||||
assert_eq!(output.flags, ReturnFlags::Revert);
|
assert_eq!(output.flags, ReturnFlags::Revert);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn ext_code_size() {
|
|
||||||
let contract = Contract::ext_code_size(Transaction::default_address());
|
|
||||||
let (_, output) = assert_success(&contract, false);
|
|
||||||
let received = U256::from_be_slice(&output.data);
|
|
||||||
let expected = U256::from(contract.pvm_runtime.len());
|
|
||||||
assert_eq!(received, expected);
|
|
||||||
|
|
||||||
let contract = Contract::ext_code_size(Default::default());
|
|
||||||
let (_, output) = assert_success(&contract, false);
|
|
||||||
let received = U256::from_be_slice(&output.data);
|
|
||||||
let expected = U256::ZERO;
|
|
||||||
assert_eq!(received, expected);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn code_size() {
|
|
||||||
let contract = Contract::code_size();
|
|
||||||
let (_, output) = assert_success(&contract, false);
|
|
||||||
let expected = U256::from(contract.pvm_runtime.len());
|
|
||||||
let received = U256::from_be_slice(&output.data);
|
|
||||||
assert_eq!(expected, received);
|
|
||||||
}
|
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -27,18 +27,6 @@ impl Entry {
|
|||||||
where
|
where
|
||||||
D: Dependency + Clone,
|
D: Dependency + Clone,
|
||||||
{
|
{
|
||||||
context.declare_global(
|
|
||||||
revive_runtime_api::immutable_data::GLOBAL_IMMUTABLE_DATA_POINTER,
|
|
||||||
context.word_type().array_type(0),
|
|
||||||
AddressSpace::Stack,
|
|
||||||
);
|
|
||||||
|
|
||||||
context.declare_global(
|
|
||||||
revive_runtime_api::immutable_data::GLOBAL_IMMUTABLE_DATA_SIZE,
|
|
||||||
context.xlen_type(),
|
|
||||||
AddressSpace::Stack,
|
|
||||||
);
|
|
||||||
|
|
||||||
let calldata_type = context.array_type(context.byte_type(), Self::MAX_CALLDATA_SIZE);
|
let calldata_type = context.array_type(context.byte_type(), Self::MAX_CALLDATA_SIZE);
|
||||||
context.set_global(
|
context.set_global(
|
||||||
crate::polkavm::GLOBAL_CALLDATA_POINTER,
|
crate::polkavm::GLOBAL_CALLDATA_POINTER,
|
||||||
@@ -195,6 +183,18 @@ where
|
|||||||
Some(inkwell::module::Linkage::External),
|
Some(inkwell::module::Linkage::External),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
|
context.declare_global(
|
||||||
|
revive_runtime_api::immutable_data::GLOBAL_IMMUTABLE_DATA_POINTER,
|
||||||
|
context.word_type().array_type(0),
|
||||||
|
AddressSpace::Stack,
|
||||||
|
);
|
||||||
|
|
||||||
|
context.declare_global(
|
||||||
|
revive_runtime_api::immutable_data::GLOBAL_IMMUTABLE_DATA_SIZE,
|
||||||
|
context.xlen_type(),
|
||||||
|
AddressSpace::Stack,
|
||||||
|
);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,12 +27,19 @@ 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,
|
||||||
{
|
{
|
||||||
todo!()
|
let address_type = context.integer_type(revive_common::BIT_LENGTH_ETH_ADDRESS);
|
||||||
|
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,7 +1,5 @@
|
|||||||
//! Translates the external code operations.
|
//! Translates the external code operations.
|
||||||
|
|
||||||
use inkwell::values::BasicValue;
|
|
||||||
|
|
||||||
use crate::polkavm::context::Context;
|
use crate::polkavm::context::Context;
|
||||||
use crate::polkavm::Dependency;
|
use crate::polkavm::Dependency;
|
||||||
|
|
||||||
@@ -14,37 +12,23 @@ pub fn size<'ctx, D>(
|
|||||||
where
|
where
|
||||||
D: Dependency + Clone,
|
D: Dependency + Clone,
|
||||||
{
|
{
|
||||||
let address_pointer = match address {
|
let address = match address {
|
||||||
Some(address) => {
|
Some(address) => address,
|
||||||
let address_pointer = context.build_alloca(context.word_type(), "value");
|
None => super::context::address(context)?.into_int_value(),
|
||||||
context.build_store(address_pointer, address)?;
|
|
||||||
address_pointer
|
|
||||||
}
|
|
||||||
None => context.sentinel_pointer(),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let address_pointer_casted = context.builder().build_ptr_to_int(
|
let address_pointer = context.build_address_argument_store(address)?;
|
||||||
address_pointer.value,
|
let output_pointer = context.build_alloca_at_entry(context.word_type(), "output_pointer");
|
||||||
context.xlen_type(),
|
|
||||||
"address_pointer",
|
|
||||||
)?;
|
|
||||||
let value = context
|
|
||||||
.build_runtime_call(
|
|
||||||
revive_runtime_api::polkavm_imports::CODE_SIZE,
|
|
||||||
&[address_pointer_casted.into()],
|
|
||||||
)
|
|
||||||
.unwrap_or_else(|| {
|
|
||||||
panic!(
|
|
||||||
"{} should return a value",
|
|
||||||
revive_runtime_api::polkavm_imports::CODE_SIZE
|
|
||||||
)
|
|
||||||
})
|
|
||||||
.into_int_value();
|
|
||||||
|
|
||||||
Ok(context
|
context.build_runtime_call(
|
||||||
.builder()
|
revive_runtime_api::polkavm_imports::CODE_SIZE,
|
||||||
.build_int_z_extend(value, context.word_type(), "extcodesize")?
|
&[
|
||||||
.as_basic_value_enum())
|
address_pointer.to_int(context).into(),
|
||||||
|
output_pointer.to_int(context).into(),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
context.build_load(output_pointer, "code_size")
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Translates the `extcodehash` instruction.
|
/// Translates the `extcodehash` instruction.
|
||||||
|
|||||||
@@ -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,+e,+m,+c";
|
pub const VM_FEATURES: &'static str = "+zbb,+a,+e,+m,+c,+fast-unaligned-access,+xtheadcondmov";
|
||||||
#[cfg(not(feature = "riscv-zbb"))]
|
#[cfg(not(feature = "riscv-zbb"))]
|
||||||
pub const VM_FEATURES: &'static str = "+e,+m,+c";
|
pub const VM_FEATURES: &'static str = "+a,+e,+m,+c,+fast-unaligned-access,+xtheadcondmov";
|
||||||
|
|
||||||
/// A shortcut constructor.
|
/// A shortcut constructor.
|
||||||
/// A separate instance for every optimization level is created.
|
/// A separate instance for every optimization level is created.
|
||||||
|
|||||||
@@ -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(Hash),
|
Hash(crate::runtime::Hash),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Code {
|
impl Default for Code {
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ POLKAVM_IMPORT(void, caller, uint32_t)
|
|||||||
|
|
||||||
POLKAVM_IMPORT(void, chain_id, uint32_t)
|
POLKAVM_IMPORT(void, chain_id, uint32_t)
|
||||||
|
|
||||||
POLKAVM_IMPORT(uint32_t, code_size, uint32_t)
|
POLKAVM_IMPORT(uint32_t, code_size, uint32_t, uint32_t)
|
||||||
|
|
||||||
POLKAVM_IMPORT(void, code_hash, uint32_t, uint32_t)
|
POLKAVM_IMPORT(void, code_hash, uint32_t, uint32_t)
|
||||||
|
|
||||||
@@ -96,6 +96,8 @@ 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,6 +46,8 @@ 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";
|
||||||
@@ -60,7 +62,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; 24] = [
|
pub static IMPORTS: [&str; 25] = [
|
||||||
SBRK,
|
SBRK,
|
||||||
MEMORY_SIZE,
|
MEMORY_SIZE,
|
||||||
ADDRESS,
|
ADDRESS,
|
||||||
@@ -79,6 +81,7 @@ pub static IMPORTS: [&str; 24] = [
|
|||||||
INPUT,
|
INPUT,
|
||||||
INSTANTIATE,
|
INSTANTIATE,
|
||||||
NOW,
|
NOW,
|
||||||
|
ORIGIN,
|
||||||
RETURN,
|
RETURN,
|
||||||
RETURNDATACOPY,
|
RETURNDATACOPY,
|
||||||
RETURNDATASIZE,
|
RETURNDATASIZE,
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
fn main() {
|
||||||
|
let git_rev = std::process::Command::new("git")
|
||||||
|
.args(["rev-parse", "--short", "HEAD"])
|
||||||
|
.output()
|
||||||
|
.map(|out| String::from_utf8(out.stdout).unwrap_or_default())
|
||||||
|
.unwrap_or("unknown".to_owned());
|
||||||
|
|
||||||
|
println!("cargo:rustc-env=GIT_COMMIT_HASH={}", git_rev.trim());
|
||||||
|
}
|
||||||
@@ -8,6 +8,7 @@ use std::path::Path;
|
|||||||
use crate::solc::combined_json::CombinedJson;
|
use crate::solc::combined_json::CombinedJson;
|
||||||
use crate::solc::standard_json::output::Output as StandardJsonOutput;
|
use crate::solc::standard_json::output::Output as StandardJsonOutput;
|
||||||
use crate::solc::version::Version as SolcVersion;
|
use crate::solc::version::Version as SolcVersion;
|
||||||
|
use crate::ResolcVersion;
|
||||||
|
|
||||||
use self::contract::Contract;
|
use self::contract::Contract;
|
||||||
|
|
||||||
@@ -40,11 +41,7 @@ impl Build {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Writes all contracts assembly and bytecode to the combined JSON.
|
/// Writes all contracts assembly and bytecode to the combined JSON.
|
||||||
pub fn write_to_combined_json(
|
pub fn write_to_combined_json(self, combined_json: &mut CombinedJson) -> anyhow::Result<()> {
|
||||||
self,
|
|
||||||
combined_json: &mut CombinedJson,
|
|
||||||
resolc_version: &semver::Version,
|
|
||||||
) -> anyhow::Result<()> {
|
|
||||||
for (path, contract) in self.contracts.into_iter() {
|
for (path, contract) in self.contracts.into_iter() {
|
||||||
let combined_json_contract = combined_json
|
let combined_json_contract = combined_json
|
||||||
.contracts
|
.contracts
|
||||||
@@ -61,7 +58,7 @@ impl Build {
|
|||||||
contract.write_to_combined_json(combined_json_contract)?;
|
contract.write_to_combined_json(combined_json_contract)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
combined_json.zk_version = Some(resolc_version.to_string());
|
combined_json.revive_version = Some(ResolcVersion::default().long);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@@ -71,7 +68,6 @@ impl Build {
|
|||||||
mut self,
|
mut self,
|
||||||
standard_json: &mut StandardJsonOutput,
|
standard_json: &mut StandardJsonOutput,
|
||||||
solc_version: &SolcVersion,
|
solc_version: &SolcVersion,
|
||||||
resolc_version: &semver::Version,
|
|
||||||
) -> anyhow::Result<()> {
|
) -> anyhow::Result<()> {
|
||||||
let contracts = match standard_json.contracts.as_mut() {
|
let contracts = match standard_json.contracts.as_mut() {
|
||||||
Some(contracts) => contracts,
|
Some(contracts) => contracts,
|
||||||
@@ -90,7 +86,7 @@ impl Build {
|
|||||||
|
|
||||||
standard_json.version = Some(solc_version.default.to_string());
|
standard_json.version = Some(solc_version.default.to_string());
|
||||||
standard_json.long_version = Some(solc_version.long.to_owned());
|
standard_json.long_version = Some(solc_version.long.to_owned());
|
||||||
standard_json.zk_version = Some(resolc_version.to_string());
|
standard_json.revive_version = Some(ResolcVersion::default().long);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ pub(crate) mod missing_libraries;
|
|||||||
pub(crate) mod process;
|
pub(crate) mod process;
|
||||||
pub(crate) mod project;
|
pub(crate) mod project;
|
||||||
pub(crate) mod solc;
|
pub(crate) mod solc;
|
||||||
|
pub(crate) mod version;
|
||||||
pub(crate) mod warning;
|
pub(crate) mod warning;
|
||||||
pub(crate) mod yul;
|
pub(crate) mod yul;
|
||||||
|
|
||||||
@@ -38,6 +39,7 @@ pub use self::solc::standard_json::output::contract::Contract as SolcStandardJso
|
|||||||
pub use self::solc::standard_json::output::Output as SolcStandardJsonOutput;
|
pub use self::solc::standard_json::output::Output as SolcStandardJsonOutput;
|
||||||
pub use self::solc::version::Version as SolcVersion;
|
pub use self::solc::version::Version as SolcVersion;
|
||||||
pub use self::solc::Compiler as SolcCompiler;
|
pub use self::solc::Compiler as SolcCompiler;
|
||||||
|
pub use self::version::Version as ResolcVersion;
|
||||||
pub use self::warning::Warning;
|
pub use self::warning::Warning;
|
||||||
|
|
||||||
pub mod test_utils;
|
pub mod test_utils;
|
||||||
@@ -197,7 +199,6 @@ pub fn standard_json(
|
|||||||
) -> anyhow::Result<()> {
|
) -> anyhow::Result<()> {
|
||||||
let solc_version = solc.version()?;
|
let solc_version = solc.version()?;
|
||||||
let solc_pipeline = SolcPipeline::new(&solc_version, force_evmla);
|
let solc_pipeline = SolcPipeline::new(&solc_version, force_evmla);
|
||||||
let resolc_version = semver::Version::parse(env!("CARGO_PKG_VERSION")).expect("Always valid");
|
|
||||||
|
|
||||||
let solc_input = SolcStandardJsonInput::try_from_stdin(solc_pipeline)?;
|
let solc_input = SolcStandardJsonInput::try_from_stdin(solc_pipeline)?;
|
||||||
let source_code_files = solc_input
|
let source_code_files = solc_input
|
||||||
@@ -244,14 +245,10 @@ pub fn standard_json(
|
|||||||
|
|
||||||
if detect_missing_libraries {
|
if detect_missing_libraries {
|
||||||
let missing_libraries = project.get_missing_libraries();
|
let missing_libraries = project.get_missing_libraries();
|
||||||
missing_libraries.write_to_standard_json(
|
missing_libraries.write_to_standard_json(&mut solc_output, &solc_version)?;
|
||||||
&mut solc_output,
|
|
||||||
&solc_version,
|
|
||||||
&resolc_version,
|
|
||||||
)?;
|
|
||||||
} else {
|
} else {
|
||||||
let build = project.compile(optimizer_settings, include_metadata_hash, debug_config)?;
|
let build = project.compile(optimizer_settings, include_metadata_hash, debug_config)?;
|
||||||
build.write_to_standard_json(&mut solc_output, &solc_version, &resolc_version)?;
|
build.write_to_standard_json(&mut solc_output, &solc_version)?;
|
||||||
}
|
}
|
||||||
serde_json::to_writer(std::io::stdout(), &solc_output)?;
|
serde_json::to_writer(std::io::stdout(), &solc_output)?;
|
||||||
std::process::exit(0);
|
std::process::exit(0);
|
||||||
@@ -278,8 +275,6 @@ pub fn combined_json(
|
|||||||
output_directory: Option<PathBuf>,
|
output_directory: Option<PathBuf>,
|
||||||
overwrite: bool,
|
overwrite: bool,
|
||||||
) -> anyhow::Result<()> {
|
) -> anyhow::Result<()> {
|
||||||
let resolc_version = semver::Version::parse(env!("CARGO_PKG_VERSION")).expect("Always valid");
|
|
||||||
|
|
||||||
let build = standard_output(
|
let build = standard_output(
|
||||||
input_files,
|
input_files,
|
||||||
libraries,
|
libraries,
|
||||||
@@ -298,7 +293,7 @@ pub fn combined_json(
|
|||||||
)?;
|
)?;
|
||||||
|
|
||||||
let mut combined_json = solc.combined_json(input_files, format.as_str())?;
|
let mut combined_json = solc.combined_json(input_files, format.as_str())?;
|
||||||
build.write_to_combined_json(&mut combined_json, &resolc_version)?;
|
build.write_to_combined_json(&mut combined_json)?;
|
||||||
|
|
||||||
match output_directory {
|
match output_directory {
|
||||||
Some(output_directory) => {
|
Some(output_directory) => {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ use std::collections::HashSet;
|
|||||||
|
|
||||||
use crate::solc::standard_json::output::Output as StandardJsonOutput;
|
use crate::solc::standard_json::output::Output as StandardJsonOutput;
|
||||||
use crate::solc::version::Version as SolcVersion;
|
use crate::solc::version::Version as SolcVersion;
|
||||||
|
use crate::ResolcVersion;
|
||||||
|
|
||||||
/// The missing Solidity libraries.
|
/// The missing Solidity libraries.
|
||||||
pub struct MissingLibraries {
|
pub struct MissingLibraries {
|
||||||
@@ -23,7 +24,6 @@ impl MissingLibraries {
|
|||||||
mut self,
|
mut self,
|
||||||
standard_json: &mut StandardJsonOutput,
|
standard_json: &mut StandardJsonOutput,
|
||||||
solc_version: &SolcVersion,
|
solc_version: &SolcVersion,
|
||||||
resolc_version: &semver::Version,
|
|
||||||
) -> anyhow::Result<()> {
|
) -> anyhow::Result<()> {
|
||||||
let contracts = match standard_json.contracts.as_mut() {
|
let contracts = match standard_json.contracts.as_mut() {
|
||||||
Some(contracts) => contracts,
|
Some(contracts) => contracts,
|
||||||
@@ -43,7 +43,7 @@ impl MissingLibraries {
|
|||||||
|
|
||||||
standard_json.version = Some(solc_version.default.to_string());
|
standard_json.version = Some(solc_version.default.to_string());
|
||||||
standard_json.long_version = Some(solc_version.long.to_owned());
|
standard_json.long_version = Some(solc_version.long.to_owned());
|
||||||
standard_json.zk_version = Some(resolc_version.to_string());
|
standard_json.revive_version = Some(ResolcVersion::default().long);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
|
||||||
|
use crate::ResolcVersion;
|
||||||
|
|
||||||
/// The Solidity contract metadata.
|
/// The Solidity contract metadata.
|
||||||
/// Is used to append the metadata hash to the contract bytecode.
|
/// Is used to append the metadata hash to the contract bytecode.
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize)]
|
||||||
@@ -9,11 +11,11 @@ pub struct Metadata {
|
|||||||
/// The `solc` metadata.
|
/// The `solc` metadata.
|
||||||
pub solc_metadata: serde_json::Value,
|
pub solc_metadata: serde_json::Value,
|
||||||
/// The `solc` version.
|
/// The `solc` version.
|
||||||
pub solc_version: semver::Version,
|
pub solc_version: String,
|
||||||
/// The zkVM `solc` edition.
|
/// The pallet revive edition.
|
||||||
pub solc_zkvm_edition: Option<semver::Version>,
|
pub revive_pallet_version: Option<semver::Version>,
|
||||||
/// The PolkaVM compiler version.
|
/// The PolkaVM compiler version.
|
||||||
pub zk_version: semver::Version,
|
pub revive_version: String,
|
||||||
/// The PolkaVM compiler optimizer settings.
|
/// The PolkaVM compiler optimizer settings.
|
||||||
pub optimizer_settings: revive_llvm_context::OptimizerSettings,
|
pub optimizer_settings: revive_llvm_context::OptimizerSettings,
|
||||||
}
|
}
|
||||||
@@ -22,16 +24,15 @@ impl Metadata {
|
|||||||
/// A shortcut constructor.
|
/// A shortcut constructor.
|
||||||
pub fn new(
|
pub fn new(
|
||||||
solc_metadata: serde_json::Value,
|
solc_metadata: serde_json::Value,
|
||||||
solc_version: semver::Version,
|
solc_version: String,
|
||||||
solc_zkvm_edition: Option<semver::Version>,
|
revive_pallet_version: Option<semver::Version>,
|
||||||
zk_version: semver::Version,
|
|
||||||
optimizer_settings: revive_llvm_context::OptimizerSettings,
|
optimizer_settings: revive_llvm_context::OptimizerSettings,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
solc_metadata,
|
solc_metadata,
|
||||||
solc_version,
|
solc_version,
|
||||||
solc_zkvm_edition,
|
revive_pallet_version,
|
||||||
zk_version,
|
revive_version: ResolcVersion::default().long,
|
||||||
optimizer_settings,
|
optimizer_settings,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,9 +89,8 @@ impl Contract {
|
|||||||
|
|
||||||
let metadata = Metadata::new(
|
let metadata = Metadata::new(
|
||||||
self.metadata_json.take(),
|
self.metadata_json.take(),
|
||||||
version.default.clone(),
|
version.long.clone(),
|
||||||
version.l2_revision.clone(),
|
version.l2_revision.clone(),
|
||||||
semver::Version::parse(env!("CARGO_PKG_VERSION")).expect("Always valid"),
|
|
||||||
optimizer.settings().to_owned(),
|
optimizer.settings().to_owned(),
|
||||||
);
|
);
|
||||||
let metadata_json = serde_json::to_value(&metadata).expect("Always valid");
|
let metadata_json = serde_json::to_value(&metadata).expect("Always valid");
|
||||||
|
|||||||
@@ -31,10 +31,9 @@ fn main_inner() -> anyhow::Result<()> {
|
|||||||
|
|
||||||
if arguments.version {
|
if arguments.version {
|
||||||
println!(
|
println!(
|
||||||
"{} v{} (LLVM build {:?})",
|
"{} version {}",
|
||||||
env!("CARGO_PKG_DESCRIPTION"),
|
env!("CARGO_PKG_DESCRIPTION"),
|
||||||
env!("CARGO_PKG_VERSION"),
|
revive_solidity::ResolcVersion::default().long
|
||||||
inkwell::support::get_llvm_version()
|
|
||||||
);
|
);
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ pub struct CombinedJson {
|
|||||||
pub version: String,
|
pub version: String,
|
||||||
/// The `resolc` compiler version.
|
/// The `resolc` compiler version.
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub zk_version: Option<String>,
|
pub revive_version: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CombinedJson {
|
impl CombinedJson {
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ pub struct Output {
|
|||||||
pub long_version: Option<String>,
|
pub long_version: Option<String>,
|
||||||
/// The `resolc` compiler version.
|
/// The `resolc` compiler version.
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub zk_version: Option<String>,
|
pub revive_version: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Output {
|
impl Output {
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ use std::collections::BTreeMap;
|
|||||||
use std::collections::BTreeSet;
|
use std::collections::BTreeSet;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::str::FromStr;
|
|
||||||
use std::sync::Mutex;
|
use std::sync::Mutex;
|
||||||
|
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
@@ -106,11 +105,7 @@ pub fn build_solidity_with_options(
|
|||||||
let project = output.try_to_project(sources, libraries, pipeline, &solc_version, None)?;
|
let project = output.try_to_project(sources, libraries, pipeline, &solc_version, None)?;
|
||||||
|
|
||||||
let build: crate::Build = project.compile(optimizer_settings, false, None)?;
|
let build: crate::Build = project.compile(optimizer_settings, false, None)?;
|
||||||
build.write_to_standard_json(
|
build.write_to_standard_json(&mut output, &solc_version)?;
|
||||||
&mut output,
|
|
||||||
&solc_version,
|
|
||||||
&semver::Version::from_str(env!("CARGO_PKG_VERSION"))?,
|
|
||||||
)?;
|
|
||||||
|
|
||||||
Ok(output)
|
Ok(output)
|
||||||
}
|
}
|
||||||
@@ -202,11 +197,7 @@ pub fn build_solidity_and_detect_missing_libraries(
|
|||||||
let project = output.try_to_project(sources, libraries, pipeline, &solc_version, None)?;
|
let project = output.try_to_project(sources, libraries, pipeline, &solc_version, None)?;
|
||||||
|
|
||||||
let missing_libraries = project.get_missing_libraries();
|
let missing_libraries = project.get_missing_libraries();
|
||||||
missing_libraries.write_to_standard_json(
|
missing_libraries.write_to_standard_json(&mut output, &solc.version()?)?;
|
||||||
&mut output,
|
|
||||||
&solc.version()?,
|
|
||||||
&semver::Version::from_str(env!("CARGO_PKG_VERSION"))?,
|
|
||||||
)?;
|
|
||||||
|
|
||||||
Ok(output)
|
Ok(output)
|
||||||
}
|
}
|
||||||
@@ -232,14 +223,14 @@ pub fn check_solidity_warning(
|
|||||||
warning_substring: &str,
|
warning_substring: &str,
|
||||||
libraries: BTreeMap<String, BTreeMap<String, String>>,
|
libraries: BTreeMap<String, BTreeMap<String, String>>,
|
||||||
pipeline: SolcPipeline,
|
pipeline: SolcPipeline,
|
||||||
skip_for_zkvm_edition: bool,
|
skip_for_revive_edition: bool,
|
||||||
suppressed_warnings: Option<Vec<Warning>>,
|
suppressed_warnings: Option<Vec<Warning>>,
|
||||||
) -> anyhow::Result<bool> {
|
) -> anyhow::Result<bool> {
|
||||||
check_dependencies();
|
check_dependencies();
|
||||||
|
|
||||||
let mut solc = SolcCompiler::new(SolcCompiler::DEFAULT_EXECUTABLE_NAME.to_owned())?;
|
let mut solc = SolcCompiler::new(SolcCompiler::DEFAULT_EXECUTABLE_NAME.to_owned())?;
|
||||||
let solc_version = solc.version()?;
|
let solc_version = solc.version()?;
|
||||||
if skip_for_zkvm_edition && solc_version.l2_revision.is_some() {
|
if skip_for_revive_edition && solc_version.l2_revision.is_some() {
|
||||||
return Ok(true);
|
return Ok(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
//! The resolc compiler version.
|
||||||
|
|
||||||
|
use serde::Deserialize;
|
||||||
|
use serde::Serialize;
|
||||||
|
|
||||||
|
/// The resolc compiler version.
|
||||||
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
|
pub struct Version {
|
||||||
|
/// The long version string.
|
||||||
|
pub long: String,
|
||||||
|
/// The short `semver`.
|
||||||
|
pub default: semver::Version,
|
||||||
|
/// The LLVM version string.
|
||||||
|
pub llvm: semver::Version,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for Version {
|
||||||
|
fn default() -> Self {
|
||||||
|
let default = semver::Version::parse(env!("CARGO_PKG_VERSION")).expect("Always valid");
|
||||||
|
let commit = env!("GIT_COMMIT_HASH");
|
||||||
|
let (llvm_major, llvm_minor, llvm_patch) = inkwell::support::get_llvm_version();
|
||||||
|
let llvm = semver::Version::new(llvm_major as u64, llvm_minor as u64, llvm_patch as u64);
|
||||||
|
|
||||||
|
Self {
|
||||||
|
long: format!("{default}+commit.{commit}.llvm-{llvm}"),
|
||||||
|
default,
|
||||||
|
llvm,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user