Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(forge): readCallers cheatcode #4884

Merged
merged 22 commits into from
Jun 6, 2023
Merged
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
8a730c1
feat(forge): started working on the readPrank cheat code
xeno097 May 5, 2023
dc3c231
test(forge): started implementing tests for readPrank cheat code
xeno097 May 5, 2023
47b38d7
refactor(forge): refactored read_prank func
xeno097 May 5, 2023
907ee5c
test(forge): improved tests for readPrank cheat code
xeno097 May 5, 2023
d88b688
Merge branch 'master' of github.com:foundry-rs/foundry into read-pran…
xeno097 May 5, 2023
d90c98e
fix(forge): fixed readPrank solidity test formatting
xeno097 May 5, 2023
7e5ae8c
chore(forge): forge fmt
xeno097 May 5, 2023
b685ce5
feat(forge): replaced 0 address with default msg.sender when no prank…
xeno097 May 7, 2023
2a11ead
Merge branch 'master' of github.com:foundry-rs/foundry into read-pran…
xeno097 May 7, 2023
2a58047
Merge branch 'master' of github.com:foundry-rs/foundry into read-pran…
xeno097 May 8, 2023
5a6d6f2
Merge branch 'master' of github.com:foundry-rs/foundry into read-pran…
xeno097 May 13, 2023
db2455a
feat(forge): renamed readPrank to readCallers and started working on …
xeno097 May 18, 2023
49592fa
refactor(forge): renamed ReadPrank.t.sol -> ReadCallers.t.sol
xeno097 May 18, 2023
bf8170d
refactor(forge): updated the read_callers cheat code returndata
xeno097 May 18, 2023
b8a8e24
test(forge): added tests for broadcasting case for readCallers cheat …
xeno097 May 18, 2023
4834ead
refactor(forge): added the CallerMode enum to remove hardcoded number…
xeno097 May 18, 2023
9bc8bd3
Merge branch 'master' of github.com:foundry-rs/foundry into read-pran…
xeno097 May 18, 2023
5916fa9
Merge branch 'master' of github.com:foundry-rs/foundry into read-pran…
xeno097 May 28, 2023
375b19e
Merge branch 'master' of github.com:foundry-rs/foundry into read-pran…
xeno097 May 28, 2023
6b191a8
chore(forge): hevm.rs
xeno097 May 28, 2023
cb05f40
Merge branch 'master' of github.com:foundry-rs/foundry into read-pran…
xeno097 Jun 3, 2023
b1dc89a
docs(forge): added doc comments to read_callers func and CallerMode enum
xeno097 Jun 3, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions abi/abi/HEVM.sol
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ rememberKey(uint256)(address)

prank(address)
prank(address,address)
readCallers()(uint256,address,address)
startPrank(address)
startPrank(address,address)
stopPrank()
Expand Down
60 changes: 59 additions & 1 deletion abi/src/bindings/hevm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ pub use hevm::*;
)]
pub mod hevm {
#[rustfmt::skip]
const __ABI: &str = "[\nstruct Log { bytes32[] topics; bytes data; }\nstruct Rpc { string name; string url; }\nstruct DirEntry { string errorMessage; string path; uint64 depth; bool isDir; bool isSymlink; }\nstruct FsMetadata { bool isDir; bool isSymlink; uint256 length; bool readOnly; uint256 modified; uint256 accessed; uint256 created; }\n\nallowCheatcodes(address)\n\nffi(string[])(bytes)\n\nbreakpoint(string)\nbreakpoint(string,bool)\n\nroll(uint256)\nwarp(uint256)\ndifficulty(uint256)\nprevrandao(bytes32)\nfee(uint256)\ncoinbase(address)\nstore(address,bytes32,bytes32)\nload(address,bytes32)(bytes32)\n\nsetEnv(string,string)\nenvBool(string)(bool)\nenvUint(string)(uint256)\nenvInt(string)(int256)\nenvAddress(string)(address)\nenvBytes32(string)(bytes32)\nenvString(string)(string)\nenvBytes(string)(bytes)\nenvBool(string,string)(bool[])\nenvUint(string,string)(uint256[])\nenvInt(string,string)(int256[])\nenvAddress(string,string)(address[])\nenvBytes32(string,string)(bytes32[])\nenvString(string,string)(string[])\nenvBytes(string,string)(bytes[])\nenvOr(string,bool)(bool)\nenvOr(string,uint256)(uint256)\nenvOr(string,int256)(int256)\nenvOr(string,address)(address)\nenvOr(string,bytes32)(bytes32)\nenvOr(string,string)(string)\nenvOr(string,bytes)(bytes)\nenvOr(string,string,bool[])(bool[])\nenvOr(string,string,uint256[])(uint256[])\nenvOr(string,string,int256[])(int256[])\nenvOr(string,string,address[])(address[])\nenvOr(string,string,bytes32[])(bytes32[])\nenvOr(string,string,string[])(string[])\nenvOr(string,string,bytes[])(bytes[])\n\naddr(uint256)(address)\nsign(uint256,bytes32)(uint8,bytes32,bytes32)\nderiveKey(string,uint32)(uint256)\nderiveKey(string,string,uint32)(uint256)\nrememberKey(uint256)(address)\n\nprank(address)\nprank(address,address)\nstartPrank(address)\nstartPrank(address,address)\nstopPrank()\n\ndeal(address,uint256)\netch(address,bytes)\nexpectRevert()\nexpectRevert(bytes)\nexpectRevert(bytes4)\nrecord()\naccesses(address)(bytes32[],bytes32[])\n\nrecordLogs()\ngetRecordedLogs()(Log[])\n\nexpectEmit()\nexpectEmit(address)\nexpectEmit(bool,bool,bool,bool)\nexpectEmit(bool,bool,bool,bool,address)\n\nmockCall(address,bytes,bytes)\nmockCall(address,uint256,bytes,bytes)\nmockCallRevert(address,bytes,bytes)\nmockCallRevert(address,uint256,bytes,bytes)\nclearMockedCalls()\n\nexpectCall(address,bytes)\nexpectCall(address,bytes,uint64)\nexpectCall(address,uint256,bytes)\nexpectCall(address,uint256,bytes,uint64)\nexpectCall(address,uint256,uint64,bytes)\nexpectCall(address,uint256,uint64,bytes,uint64)\nexpectCallMinGas(address,uint256,uint64,bytes)\nexpectCallMinGas(address,uint256,uint64,bytes,uint64)\nexpectSafeMemory(uint64,uint64)\nexpectSafeMemoryCall(uint64,uint64)\n\ngetCode(string)\ngetDeployedCode(string)\nlabel(address,string)\ngetLabel(address)(string)\nassume(bool)\nsetNonce(address,uint64)\ngetNonce(address)\nresetNonce(address)\nsetNonceUnsafe(address,uint64)\nchainId(uint256)\ntxGasPrice(uint256)\n\nbroadcast()\nbroadcast(address)\nbroadcast(uint256)\nstartBroadcast()\nstartBroadcast(address)\nstartBroadcast(uint256)\nstopBroadcast()\n\nprojectRoot()(string)\nreadFile(string)(string)\nreadFileBinary(string)(bytes)\nwriteFile(string,string)\nwriteFileBinary(string,bytes)\nopenFile(string)\nreadLine(string)(string)\nwriteLine(string,string)\ncloseFile(string)\nremoveFile(string)\ncreateDir(string, bool)\nremoveDir(string, bool)\nreadDir(string)(DirEntry[])\nreadDir(string, uint64)(DirEntry[])\nreadDir(string, uint64, bool)(DirEntry[])\nreadLink(string)(string)\nfsMetadata(string)(FsMetadata)\n\ntoString(bytes)\ntoString(address)\ntoString(uint256)\ntoString(int256)\ntoString(bytes32)\ntoString(bool)\nparseBytes(string)(bytes)\nparseAddress(string)(address)\nparseUint(string)(uint256)\nparseInt(string)(int256)\nparseBytes32(string)(bytes32)\nparseBool(string)(bool)\n\nsnapshot()(uint256)\nrevertTo(uint256)(bool)\ncreateFork(string,uint256)(uint256)\ncreateFork(string,bytes32)(uint256)\ncreateFork(string)(uint256)\ncreateSelectFork(string,uint256)(uint256)\ncreateSelectFork(string,bytes32)(uint256)\ncreateSelectFork(string)(uint256)\nselectFork(uint256)\nactiveFork()(uint256)\ntransact(bytes32)\ntransact(uint256,bytes32)\nmakePersistent(address)\nmakePersistent(address,address)\nmakePersistent(address,address,address)\nmakePersistent(address[])\nrevokePersistent(address)\nrevokePersistent(address[])\nisPersistent(address)(bool)\nrollFork(uint256)\nrollFork(bytes32)\nrollFork(uint256,uint256)\nrollFork(uint256,bytes32)\nrpcUrl(string)(string)\nrpcUrls()(string[2][])\nrpcUrlStructs()(Rpc[])\n\nwriteJson(string, string)\nwriteJson(string, string, string)\nparseJson(string)(bytes)\nparseJson(string, string)(bytes)\nparseJsonUint(string, string)(uint256)\nparseJsonUintArray(string, string)(uint256[])\nparseJsonInt(string, string)(int256)\nparseJsonIntArray(string, string)(int256[])\nparseJsonString(string, string)(string)\nparseJsonStringArray(string, string)(string[])\nparseJsonAddress(string, string)(address)\nparseJsonAddressArray(string, string)(address[])\nparseJsonBool(string, string)(bool)\nparseJsonBoolArray(string, string)(bool[])\nparseJsonBytes(string, string)(bytes)\nparseJsonBytesArray(string, string)(bytes[])\nparseJsonBytes32(string, string)(bytes32)\nparseJsonBytes32Array(string, string)(bytes32[])\nserializeBool(string,string,bool)(string)\nserializeBool(string,string,bool[])(string)\nserializeUint(string,string,uint256)(string)\nserializeUint(string,string,uint256[])(string)\nserializeInt(string,string,int256)(string)\nserializeInt(string,string,int256[])(string)\nserializeAddress(string,string,address)(string)\nserializeAddress(string,string,address[])(string)\nserializeBytes32(string,string,bytes32)(string)\nserializeBytes32(string,string,bytes32[])(string)\nserializeString(string,string,string)(string)\nserializeString(string,string,string[])(string)\nserializeBytes(string,string,bytes)(string)\nserializeBytes(string,string,bytes[])(string)\n\npauseGasMetering()\nresumeGasMetering()\n\n]";
const __ABI: &str = "[\nstruct Log { bytes32[] topics; bytes data; }\nstruct Rpc { string name; string url; }\nstruct DirEntry { string errorMessage; string path; uint64 depth; bool isDir; bool isSymlink; }\nstruct FsMetadata { bool isDir; bool isSymlink; uint256 length; bool readOnly; uint256 modified; uint256 accessed; uint256 created; }\n\nallowCheatcodes(address)\n\nffi(string[])(bytes)\n\nbreakpoint(string)\nbreakpoint(string,bool)\n\nroll(uint256)\nwarp(uint256)\ndifficulty(uint256)\nprevrandao(bytes32)\nfee(uint256)\ncoinbase(address)\nstore(address,bytes32,bytes32)\nload(address,bytes32)(bytes32)\n\nsetEnv(string,string)\nenvBool(string)(bool)\nenvUint(string)(uint256)\nenvInt(string)(int256)\nenvAddress(string)(address)\nenvBytes32(string)(bytes32)\nenvString(string)(string)\nenvBytes(string)(bytes)\nenvBool(string,string)(bool[])\nenvUint(string,string)(uint256[])\nenvInt(string,string)(int256[])\nenvAddress(string,string)(address[])\nenvBytes32(string,string)(bytes32[])\nenvString(string,string)(string[])\nenvBytes(string,string)(bytes[])\nenvOr(string,bool)(bool)\nenvOr(string,uint256)(uint256)\nenvOr(string,int256)(int256)\nenvOr(string,address)(address)\nenvOr(string,bytes32)(bytes32)\nenvOr(string,string)(string)\nenvOr(string,bytes)(bytes)\nenvOr(string,string,bool[])(bool[])\nenvOr(string,string,uint256[])(uint256[])\nenvOr(string,string,int256[])(int256[])\nenvOr(string,string,address[])(address[])\nenvOr(string,string,bytes32[])(bytes32[])\nenvOr(string,string,string[])(string[])\nenvOr(string,string,bytes[])(bytes[])\n\naddr(uint256)(address)\nsign(uint256,bytes32)(uint8,bytes32,bytes32)\nderiveKey(string,uint32)(uint256)\nderiveKey(string,string,uint32)(uint256)\nrememberKey(uint256)(address)\n\nprank(address)\nprank(address,address)\nreadCallers()(uint256,address,address)\nstartPrank(address)\nstartPrank(address,address)\nstopPrank()\n\ndeal(address,uint256)\netch(address,bytes)\nexpectRevert()\nexpectRevert(bytes)\nexpectRevert(bytes4)\nrecord()\naccesses(address)(bytes32[],bytes32[])\n\nrecordLogs()\ngetRecordedLogs()(Log[])\n\nexpectEmit()\nexpectEmit(address)\nexpectEmit(bool,bool,bool,bool)\nexpectEmit(bool,bool,bool,bool,address)\n\nmockCall(address,bytes,bytes)\nmockCall(address,uint256,bytes,bytes)\nmockCallRevert(address,bytes,bytes)\nmockCallRevert(address,uint256,bytes,bytes)\nclearMockedCalls()\n\nexpectCall(address,bytes)\nexpectCall(address,bytes,uint64)\nexpectCall(address,uint256,bytes)\nexpectCall(address,uint256,bytes,uint64)\nexpectCall(address,uint256,uint64,bytes)\nexpectCall(address,uint256,uint64,bytes,uint64)\nexpectCallMinGas(address,uint256,uint64,bytes)\nexpectCallMinGas(address,uint256,uint64,bytes,uint64)\nexpectSafeMemory(uint64,uint64)\nexpectSafeMemoryCall(uint64,uint64)\n\ngetCode(string)\ngetDeployedCode(string)\nlabel(address,string)\ngetLabel(address)(string)\nassume(bool)\nsetNonce(address,uint64)\ngetNonce(address)\nresetNonce(address)\nsetNonceUnsafe(address,uint64)\nchainId(uint256)\ntxGasPrice(uint256)\n\nbroadcast()\nbroadcast(address)\nbroadcast(uint256)\nstartBroadcast()\nstartBroadcast(address)\nstartBroadcast(uint256)\nstopBroadcast()\n\nprojectRoot()(string)\nreadFile(string)(string)\nreadFileBinary(string)(bytes)\nwriteFile(string,string)\nwriteFileBinary(string,bytes)\nopenFile(string)\nreadLine(string)(string)\nwriteLine(string,string)\ncloseFile(string)\nremoveFile(string)\ncreateDir(string, bool)\nremoveDir(string, bool)\nreadDir(string)(DirEntry[])\nreadDir(string, uint64)(DirEntry[])\nreadDir(string, uint64, bool)(DirEntry[])\nreadLink(string)(string)\nfsMetadata(string)(FsMetadata)\n\ntoString(bytes)\ntoString(address)\ntoString(uint256)\ntoString(int256)\ntoString(bytes32)\ntoString(bool)\nparseBytes(string)(bytes)\nparseAddress(string)(address)\nparseUint(string)(uint256)\nparseInt(string)(int256)\nparseBytes32(string)(bytes32)\nparseBool(string)(bool)\n\nsnapshot()(uint256)\nrevertTo(uint256)(bool)\ncreateFork(string,uint256)(uint256)\ncreateFork(string,bytes32)(uint256)\ncreateFork(string)(uint256)\ncreateSelectFork(string,uint256)(uint256)\ncreateSelectFork(string,bytes32)(uint256)\ncreateSelectFork(string)(uint256)\nselectFork(uint256)\nactiveFork()(uint256)\ntransact(bytes32)\ntransact(uint256,bytes32)\nmakePersistent(address)\nmakePersistent(address,address)\nmakePersistent(address,address,address)\nmakePersistent(address[])\nrevokePersistent(address)\nrevokePersistent(address[])\nisPersistent(address)(bool)\nrollFork(uint256)\nrollFork(bytes32)\nrollFork(uint256,uint256)\nrollFork(uint256,bytes32)\nrpcUrl(string)(string)\nrpcUrls()(string[2][])\nrpcUrlStructs()(Rpc[])\n\nwriteJson(string, string)\nwriteJson(string, string, string)\nparseJson(string)(bytes)\nparseJson(string, string)(bytes)\nparseJsonUint(string, string)(uint256)\nparseJsonUintArray(string, string)(uint256[])\nparseJsonInt(string, string)(int256)\nparseJsonIntArray(string, string)(int256[])\nparseJsonString(string, string)(string)\nparseJsonStringArray(string, string)(string[])\nparseJsonAddress(string, string)(address)\nparseJsonAddressArray(string, string)(address[])\nparseJsonBool(string, string)(bool)\nparseJsonBoolArray(string, string)(bool[])\nparseJsonBytes(string, string)(bytes)\nparseJsonBytesArray(string, string)(bytes[])\nparseJsonBytes32(string, string)(bytes32)\nparseJsonBytes32Array(string, string)(bytes32[])\nserializeBool(string,string,bool)(string)\nserializeBool(string,string,bool[])(string)\nserializeUint(string,string,uint256)(string)\nserializeUint(string,string,uint256[])(string)\nserializeInt(string,string,int256)(string)\nserializeInt(string,string,int256[])(string)\nserializeAddress(string,string,address)(string)\nserializeAddress(string,string,address[])(string)\nserializeBytes32(string,string,bytes32)(string)\nserializeBytes32(string,string,bytes32[])(string)\nserializeString(string,string,string)(string)\nserializeString(string,string,string[])(string)\nserializeBytes(string,string,bytes)(string)\nserializeBytes(string,string,bytes[])(string)\n\npauseGasMetering()\nresumeGasMetering()\n\n]";
///The parsed human-readable ABI of the contract.
pub static HEVM_ABI: ::ethers_contract::Lazy<::ethers_core::abi::Abi> = ::ethers_contract::Lazy::new(||
::ethers_core::abi::parse_abi_str(__ABI).expect("ABI is always valid"));
Expand Down Expand Up @@ -1280,6 +1280,21 @@ pub mod hevm {
.method_hash([217, 48, 160, 230], ())
.expect("method not found (this should never happen)")
}
///Calls the contract's `readCallers` (0x4ad0bac9) function
pub fn read_callers(
&self,
) -> ::ethers_contract::builders::ContractCall<
M,
(
::ethers_core::types::U256,
::ethers_core::types::Address,
::ethers_core::types::Address,
),
> {
self.0
.method_hash([74, 208, 186, 201], ())
.expect("method not found (this should never happen)")
}
///Calls the contract's `readDir` (0xc4bc59e0) function
pub fn read_dir_0(
&self,
Expand Down Expand Up @@ -3657,6 +3672,19 @@ pub mod hevm {
)]
#[ethcall(name = "projectRoot", abi = "projectRoot()")]
pub struct ProjectRootCall;
///Container type for all input parameters for the `readCallers` function with signature `readCallers()` and selector `0x4ad0bac9`
#[derive(
Clone,
::ethers_contract::EthCall,
::ethers_contract::EthDisplay,
Default,
Debug,
PartialEq,
Eq,
Hash
)]
#[ethcall(name = "readCallers", abi = "readCallers()")]
pub struct ReadCallersCall;
///Container type for all input parameters for the `readDir` function with signature `readDir(string)` and selector `0xc4bc59e0`
#[derive(
Clone,
Expand Down Expand Up @@ -4743,6 +4771,7 @@ pub mod hevm {
Prank1(Prank1Call),
Prevrandao(PrevrandaoCall),
ProjectRoot(ProjectRootCall),
ReadCallers(ReadCallersCall),
ReadDir0(ReadDir0Call),
ReadDir1(ReadDir1Call),
ReadDir2(ReadDir2Call),
Expand Down Expand Up @@ -5315,6 +5344,10 @@ pub mod hevm {
= <ProjectRootCall as ::ethers_core::abi::AbiDecode>::decode(data) {
return Ok(Self::ProjectRoot(decoded));
}
if let Ok(decoded)
= <ReadCallersCall as ::ethers_core::abi::AbiDecode>::decode(data) {
return Ok(Self::ReadCallers(decoded));
}
if let Ok(decoded)
= <ReadDir0Call as ::ethers_core::abi::AbiDecode>::decode(data) {
return Ok(Self::ReadDir0(decoded));
Expand Down Expand Up @@ -5885,6 +5918,9 @@ pub mod hevm {
Self::ProjectRoot(element) => {
::ethers_core::abi::AbiEncode::encode(element)
}
Self::ReadCallers(element) => {
::ethers_core::abi::AbiEncode::encode(element)
}
Self::ReadDir0(element) => ::ethers_core::abi::AbiEncode::encode(element),
Self::ReadDir1(element) => ::ethers_core::abi::AbiEncode::encode(element),
Self::ReadDir2(element) => ::ethers_core::abi::AbiEncode::encode(element),
Expand Down Expand Up @@ -6193,6 +6229,7 @@ pub mod hevm {
Self::Prank1(element) => ::core::fmt::Display::fmt(element, f),
Self::Prevrandao(element) => ::core::fmt::Display::fmt(element, f),
Self::ProjectRoot(element) => ::core::fmt::Display::fmt(element, f),
Self::ReadCallers(element) => ::core::fmt::Display::fmt(element, f),
Self::ReadDir0(element) => ::core::fmt::Display::fmt(element, f),
Self::ReadDir1(element) => ::core::fmt::Display::fmt(element, f),
Self::ReadDir2(element) => ::core::fmt::Display::fmt(element, f),
Expand Down Expand Up @@ -6854,6 +6891,11 @@ pub mod hevm {
Self::ProjectRoot(value)
}
}
impl ::core::convert::From<ReadCallersCall> for HEVMCalls {
fn from(value: ReadCallersCall) -> Self {
Self::ReadCallers(value)
}
}
impl ::core::convert::From<ReadDir0Call> for HEVMCalls {
fn from(value: ReadDir0Call) -> Self {
Self::ReadDir0(value)
Expand Down Expand Up @@ -8029,6 +8071,22 @@ pub mod hevm {
Hash
)]
pub struct ProjectRootReturn(pub ::std::string::String);
///Container type for all return fields from the `readCallers` function with signature `readCallers()` and selector `0x4ad0bac9`
#[derive(
Clone,
::ethers_contract::EthAbiType,
::ethers_contract::EthAbiCodec,
Default,
Debug,
PartialEq,
Eq,
Hash
)]
pub struct ReadCallersReturn(
pub ::ethers_core::types::U256,
pub ::ethers_core::types::Address,
pub ::ethers_core::types::Address,
);
///Container type for all return fields from the `readDir` function with signature `readDir(string)` and selector `0xc4bc59e0`
#[derive(
Clone,
Expand Down
50 changes: 50 additions & 0 deletions evm/src/executor/inspector/cheatcodes/env.rs
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,20 @@ impl Prank {
}
}

enum CallerMode {
None,
Broadcast,
RecurrentBroadcast,
Prank,
RecurrentPrank,
}

impl From<CallerMode> for U256 {
fn from(value: CallerMode) -> Self {
(value as i8).into()
}
}

/// Sets up broadcasting from a script using `origin` as the sender
fn broadcast(
state: &mut Cheatcodes,
Expand Down Expand Up @@ -150,6 +164,41 @@ fn prank(
Ok(Bytes::new())
}

fn read_callers(state: &Cheatcodes, default_sender: Address) -> Bytes {
let Cheatcodes { prank, broadcast, .. } = &state;

let data = if let Some(prank) = prank {
let caller_mode =
if prank.single_call { CallerMode::Prank } else { CallerMode::RecurrentPrank };

[
Token::Uint(caller_mode.into()),
Token::Address(prank.new_caller),
Token::Address(prank.new_origin.unwrap_or(default_sender)),
]
} else if let Some(broadcast) = broadcast {
let caller_mode = if broadcast.single_call {
CallerMode::Broadcast
} else {
CallerMode::RecurrentBroadcast
};

[
Token::Uint(caller_mode.into()),
Token::Address(broadcast.new_origin),
Token::Address(broadcast.new_origin),
]
} else {
[
Token::Uint(CallerMode::None.into()),
Token::Address(default_sender),
Token::Address(default_sender),
]
};

abi::encode(&data).into()
}

#[derive(Clone, Debug, Default)]
pub struct RecordAccess {
pub reads: BTreeMap<Address, Vec<U256>>,
Expand Down Expand Up @@ -367,6 +416,7 @@ pub fn apply<DB: DatabaseExt>(
state.prank = None;
Bytes::new()
}
HEVMCalls::ReadCallers(_) => read_callers(state, b160_to_h160(data.env.tx.caller)),
HEVMCalls::Record(_) => {
start_record(state);
Bytes::new()
Expand Down
Loading