Sitelet https://github.com/r55-eth/r55/commit/587a4850e293dea4c5ebf5710cf73618eba1509f
Skip to content

Commit 587a485

Browse files
authored
Merge pull request #2 from 0xRampey/feat/msg-sender
Add support for calling `msg.sender`
2 parents 55172f3 + 971f651 commit 587a485

5 files changed

Lines changed: 39 additions & 8 deletions

File tree

‎contract-derive/src/lib.rs‎

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,7 @@ pub fn contract(_attr: TokenStream, item: TokenStream) -> TokenStream {
2525
// Iterate over the items in the impl block to find pub methods
2626
for item in input.items.iter() {
2727
if let ImplItem::Method(method) = item {
28-
if method.vis
29-
== syn::Visibility::Public(syn::VisPublic {
30-
pub_token: syn::token::Pub::default(),
31-
})
32-
{
28+
if let syn::Visibility::Public(_) = method.vis {
3329
public_methods.push(method.clone());
3430
}
3531
}
@@ -80,7 +76,7 @@ pub fn contract(_attr: TokenStream, item: TokenStream) -> TokenStream {
8076
// Generate the call method implementation
8177
let call_method = quote! {
8278
use alloy_sol_types::SolValue;
83-
use eth_riscv_runtime::{revert, return_riscv, slice_from_raw_parts, Contract};
79+
use eth_riscv_runtime::{revert, msg_sender, return_riscv, slice_from_raw_parts, Contract};
8480

8581
impl Contract for #struct_name {
8682
fn call(&self) {

‎erc20/src/lib.rs‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use core::default::Default;
66
use contract_derive::contract;
77
use eth_riscv_runtime::types::Mapping;
88

9-
use alloy_core::primitives::Address;
9+
use alloy_core::primitives::{Address, address};
1010

1111
#[derive(Default)]
1212
pub struct ERC20 {
@@ -32,6 +32,11 @@ impl ERC20 {
3232
}
3333

3434
pub fn mint(&self, to: Address, value: u64) {
35+
let owner = msg_sender();
36+
if owner != address!("0000000000000000000000000000000000000007") {
37+
revert();
38+
}
39+
3540
let to_balance = self.balance.read(to);
3641
self.balance.write(to, to_balance + value);
3742
}

‎eth-riscv-runtime/src/lib.rs‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use core::arch::asm;
66
use core::panic::PanicInfo;
77
use core::slice;
88
pub use riscv_rt::entry;
9+
use alloy_core::primitives::Address;
910

1011
mod alloc;
1112
pub mod types;
@@ -72,6 +73,20 @@ pub fn revert() -> ! {
7273
unreachable!()
7374
}
7475

76+
pub fn msg_sender() -> Address {
77+
let first: u64;
78+
let second: u64;
79+
let third: u64;
80+
unsafe {
81+
asm!("ecall", lateout("a0") first, lateout("a1") second, lateout("a2") third, in("t0") u32::from(Syscall::Caller));
82+
}
83+
let mut bytes = [0u8; 20];
84+
bytes[0..8].copy_from_slice(&first.to_be_bytes());
85+
bytes[8..16].copy_from_slice(&second.to_be_bytes());
86+
bytes[16..20].copy_from_slice(&third.to_be_bytes()[..4]);
87+
Address::from_slice(&bytes)
88+
}
89+
7590
#[allow(non_snake_case)]
7691
#[no_mangle]
7792
fn DefaultHandler() {

‎eth-riscv-syscalls/src/lib.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,5 @@ syscalls!(
5656
(2, SStore, "sstore"),
5757
(3, Call, "call"),
5858
(4, Revert, "revert"),
59+
(5, Caller, "caller"),
5960
);

‎r55/src/exec.rs‎

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ pub fn run_tx(db: &mut InMemoryDB, addr: &Address, calldata: Vec<u8>) {
4242
let mut evm = Evm::builder()
4343
.with_db(db)
4444
.modify_tx_env(|tx| {
45-
tx.caller = address!("0000000000000000000000000000000000000001");
45+
tx.caller = address!("0000000000000000000000000000000000000007");
4646
tx.transact_to = TransactTo::Call(*addr);
4747
tx.data = calldata.into();
4848
tx.value = U256::from(0);
@@ -242,6 +242,20 @@ fn execute_riscv(
242242
},
243243
};
244244
}
245+
5 => {
246+
// Syscall::Caller
247+
let caller = interpreter.contract.caller;
248+
// Break address into 3 u64s and write to registers
249+
let caller_bytes = caller.as_slice();
250+
let first_u64 = u64::from_be_bytes(caller_bytes[0..8].try_into().unwrap());
251+
emu.cpu.xregs.write(10, first_u64);
252+
let second_u64 = u64::from_be_bytes(caller_bytes[8..16].try_into().unwrap());
253+
emu.cpu.xregs.write(11, second_u64);
254+
let mut padded_bytes = [0u8; 8];
255+
padded_bytes[..4].copy_from_slice(&caller_bytes[16..20]);
256+
let third_u64 = u64::from_be_bytes(padded_bytes);
257+
emu.cpu.xregs.write(12, third_u64);
258+
}
245259
_ => {
246260
println!("Unhandled syscall: {:?}", t0);
247261
return return_revert(interpreter);

0 commit comments

Comments
 (0)