Skip to content

Commit

Permalink
implement self balance
Browse files Browse the repository at this point in the history
Signed-off-by: Cyrill Leutwiler <[email protected]>
  • Loading branch information
xermicus committed Sep 9, 2024
1 parent d77ee1e commit 2955f77
Show file tree
Hide file tree
Showing 10 changed files with 396 additions and 358 deletions.
696 changes: 349 additions & 347 deletions Cargo.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ log = { version = "0.4" }
# polkadot-sdk and friends
codec = { version = "3.6.12", default-features = false, package = "parity-scale-codec" }
scale-info = { version = "2.11.1", default-features = false }
polkadot-sdk = { git = "https://github.com/paritytech/polkadot-sdk", rev = "d7b575338b2c647e04fc48bfbe00ea8f492fb580" }
polkadot-sdk = { git = "https://github.com/paritytech/polkadot-sdk", rev = "868a36bd186f3ef9535ebf7deceac1b2fab19fcb" }

# llvm
[workspace.dependencies.inkwell]
Expand Down
15 changes: 15 additions & 0 deletions crates/integration/contracts/Value.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ pragma solidity ^0.8;
"actions": [
{
"Instantiate": {
"value": 1024,
"code": {
"Solidity": {
"contract": "Value"
Expand All @@ -22,16 +23,30 @@ pragma solidity ^0.8;
"value": 123,
"data": "3fa4f245"
}
},
{
"Call": {
"dest": {
"Instantiated": 0
},
"data": "52da5fa0"
}
}
]
}
*/

contract Value {
constructor() payable {}

function value() public payable returns (uint ret) {
ret = msg.value;
}

function balance_self() public view returns (uint ret) {
ret = address(this).balance;
}

function balance_of(address _address) public view returns (uint ret) {
ret = _address.balance;
}
Expand Down
2 changes: 2 additions & 0 deletions crates/integration/src/cases.rs
Original file line number Diff line number Diff line change
Expand Up @@ -209,9 +209,11 @@ case!("Call.sol", "Call", vec![], call_constructor);
sol!(
contract Value {
function balance_of(address _address) public view returns (uint ret);
function balance_self() public view returns (uint ret);
}
);
case!("Value.sol", Value, balance_ofCall, value_balance_of, address: Address);
case!("Value.sol", Value, balance_selfCall, value_balance_self,);

sol!(
contract Bitwise {
Expand Down
2 changes: 1 addition & 1 deletion crates/integration/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@ test_spec!(hash_keccak_256, "TestSha3", "Crypto.sol");
test_spec!(erc20, "ERC20", "ERC20.sol");
test_spec!(computation, "Computation", "Computation.sol");
test_spec!(msize, "MSize", "MSize.sol");
test_spec!(transferred_value, "Value", "Value.sol");
test_spec!(sha1, "SHA1", "SHA1.sol");
test_spec!(block, "Block", "Block.sol");
test_spec!(mcopy, "MCopy", "MCopy.sol");
test_spec!(events, "Events", "Events.sol");
test_spec!(storage, "Storage", "Storage.sol");
test_spec!(mstore8, "MStore8", "MStore8.sol");
test_spec!(address, "Context", "Context.sol");
test_spec!(balance, "Value", "Value.sol");

fn instantiate(path: &str, contract: &str) -> Vec<SpecsAction> {
vec![Instantiate {
Expand Down
26 changes: 21 additions & 5 deletions crates/llvm-context/src/polkavm/evm/ether_gas.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,16 +56,32 @@ where
context.xlen_type(),
"balance",
)?;
let address = context.builder().build_ptr_to_int(
let _address = context.builder().build_ptr_to_int(
address_pointer.value,
context.xlen_type(),
"address",
)?;

context.build_runtime_call(
runtime_api::imports::BALANCE,
&[address.into(), balance.into()],
);
context.build_runtime_call(runtime_api::imports::BALANCE, &[balance.into()]);

context.build_load(balance_pointer, "balance")
}

/// Translates the `selfbalance` instructions.
pub fn self_balance<'ctx, D>(
context: &mut Context<'ctx, D>,
) -> anyhow::Result<inkwell::values::BasicValueEnum<'ctx>>
where
D: Dependency + Clone,
{
let balance_pointer = context.build_alloca(context.word_type(), "balance_pointer");
let balance = context.builder().build_ptr_to_int(
balance_pointer.value,
context.xlen_type(),
"balance",
)?;

context.build_runtime_call(runtime_api::imports::BALANCE, &[balance.into()]);

context.build_load(balance_pointer, "balance")
}
1 change: 0 additions & 1 deletion crates/runner/src/runtime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,6 @@ impl pallet_revive::Config for Runtime {
type UnsafeUnstableInterface = UnstableInterface;
type UploadOrigin = EnsureSigned<AccountId32>;
type InstantiateOrigin = EnsureSigned<AccountId32>;
type Migrations = ();
type CodeHashLockupDepositPercent = CodeHashLockupDepositPercent;
type Debug = ();
}
2 changes: 1 addition & 1 deletion crates/runtime-api/src/polkavm_imports.c
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ POLKAVM_IMPORT(void, weight_to_fee, uint64_t, uint32_t, uint32_t)

POLKAVM_IMPORT(void, gas_left, uint32_t, uint32_t)

POLKAVM_IMPORT(void, balance, uint32_t, uint32_t)
POLKAVM_IMPORT(void, balance, uint32_t)

POLKAVM_IMPORT(void, now, uint32_t, uint32_t)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1159,7 +1159,9 @@ where
let address = arguments[0].into_int_value();
revive_llvm_context::polkavm_evm_ether_gas::balance(context, address).map(Some)
}
InstructionName::SELFBALANCE => todo!(),
InstructionName::SELFBALANCE => {
revive_llvm_context::polkavm_evm_ether_gas::self_balance(context).map(Some)
}

InstructionName::GASLIMIT => {
revive_llvm_context::polkavm_evm_contract_context::gas_limit(context).map(Some)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -912,7 +912,9 @@ impl FunctionCall {
let address = arguments[0].into_int_value();
revive_llvm_context::polkavm_evm_ether_gas::balance(context, address).map(Some)
}
Name::SelfBalance => todo!(),
Name::SelfBalance => {
revive_llvm_context::polkavm_evm_ether_gas::self_balance(context).map(Some)
}

Name::GasLimit => {
revive_llvm_context::polkavm_evm_contract_context::gas_limit(context).map(Some)
Expand Down

0 comments on commit 2955f77

Please sign in to comment.