0x57ab1ec28d129707052df4df418d58a2d46d5f51

deployer: unknown relevance score: 0 status: partially_identified bytecode: 4160 bytes

DECOMPILED SOLIDITY (Heimdall)

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

/// @title            Decompiled Contract
/// @author           Jonathan Becker <jonathan@jbecker.dev>
/// @custom:version   heimdall-rs v0.9.2
///
/// @notice           This contract was decompiled using the heimdall-rs decompiler.
///                     It was generated directly by tracing the EVM opcodes from this contract.
///                     As a result, it may not compile or even be valid solidity code.
///                     Despite this, it should be obvious what each function does. Overall
///                     logic should have been preserved throughout decompiling.
///
/// @custom:github    You can find the open-source decompiler here:
///                       https://heimdall.rs

contract DecompiledContract {
    address public nominatedOwner;
    address public target;
    address public owner;
    
    event OwnerChanged(address, address);
    event TargetUpdated(address);
    event Event_00000000();
    event OwnerNominated(address);
    
    /// @custom:selector    0x095ea7b3
    /// @custom:signature   approve(address arg0, uint256 arg1) public returns (bool)
    /// @param              arg0 ["address", "uint160", "bytes20", "int160"]
    /// @param              arg1 ["uint256", "bytes32", "int256"]
    function approve(address arg0, uint256 arg1) public returns (bool) {
        address var_b = msg.sender;
        require(address(target).code.length);
        (bool success, bytes memory ret0) = address(target).{ value: 0 ether }Unresolved_bc67f832(var_b); // call
        var_b = address(arg0);
        require(address(target).code.length);
        (bool success, bytes memory ret0) = address(target).{ value: 0 ether }Unresolved_095ea7b3(var_b); // call
        require(!ret0.length < 0x20);
        return 0x01;
    }
    
    /// @custom:selector    0x18160ddd
    /// @custom:signature   totalSupply() public returns (uint256)
    function totalSupply() public returns (uint256) {
        require(address(target).code.length);
        (bool success, bytes memory ret0) = address(target).{ value: 0 ether }totalSupply(); // call
        require(!ret0.length < 0x20);
        return var_b.length;
    }
    
    /// @custom:selector    0x313ce567
    /// @custom:signature   decimals() public returns (bool)
    function decimals() public returns (bool) {
        require(address(target).code.length);
        (bool success, bytes memory ret0) = address(target).{ value: 0 ether }decimals(); // call
        require(!ret0.length < 0x20);
        return bytes1(var_b.length);
    }
    
    /// @custom:selector    0x79ba5097
    /// @custom:signature   acceptOwnership() public
    function acceptOwnership() public {
        require(msg.sender == (address(nominatedOwner)), "You must be nominated before you can accept ownership");
        emit OwnerChanged(address(owner), address(nominatedOwner));
        owner = (address(nominatedOwner)) | (uint96(owner));
        nominatedOwner = uint96(nominatedOwner);
    }
    
    /// @custom:selector    0x23b872dd
    /// @custom:signature   transferFrom(address arg0, address arg1, uint256 arg2) public returns (bool)
    /// @param              arg0 ["address", "uint160", "bytes20", "int160"]
    /// @param              arg1 ["address", "uint160", "bytes20", "int160"]
    /// @param              arg2 ["uint256", "bytes32", "int256"]
    function transferFrom(address arg0, address arg1, uint256 arg2) public returns (bool) {
        address var_b = msg.sender;
        require(address(target).code.length);
        (bool success, bytes memory ret0) = address(target).{ value: 0 ether }Unresolved_bc67f832(var_b); // call
        var_b = address(arg0);
        require(address(target).code.length);
        (bool success, bytes memory ret0) = address(target).{ value: 0 ether }Unresolved_23b872dd(var_b); // call
        require(!ret0.length < 0x20);
        return 0x01;
    }
    
    /// @custom:selector    0xa9059cbb
    /// @custom:signature   transfer(address arg0, uint256 arg1) public returns (bool)
    /// @param              arg0 ["address", "uint160", "bytes20", "int160"]
    /// @param              arg1 ["uint256", "bytes32", "int256"]
    function transfer(address arg0, uint256 arg1) public returns (bool) {
        address var_b = msg.sender;
        require(address(target).code.length);
        (bool success, bytes memory ret0) = address(target).{ value: 0 ether }Unresolved_bc67f832(var_b); // call
        var_b = address(arg0);
        require(address(target).code.length);
        (bool success, bytes memory ret0) = address(target).{ value: 0 ether }Unresolved_a9059cbb(var_b); // call
        require(!ret0.length < 0x20);
        return 0x01;
    }
    
    /// @custom:selector    0x70a08231
    /// @custom:signature   balanceOf(address arg0) public returns (uint256)
    /// @param              arg0 ["address", "uint160", "bytes20", "int160"]
    function balanceOf(address arg0) public returns (uint256) {
        address var_b = address(arg0);
        require(address(target).code.length);
        (bool success, bytes memory ret0) = address(target).{ value: 0 ether }Unresolved_70a08231(var_b); // call
        require(!ret0.length < 0x20);
        return var_c.length;
    }
    
    /// @custom:selector    0x1627540c
    /// @custom:signature   nominateNewOwner(address arg0) public
    /// @param              arg0 ["address", "uint160", "bytes20", "int160"]
    function nominateNewOwner(address arg0) public {
        require(msg.sender == (address(owner)), "Only the contract owner may perform this action");
        nominatedOwner = (address(arg0)) | (uint96(nominatedOwner));
        emit OwnerNominated(address(arg0));
    }
    
    /// @custom:selector    0x907dff97
    /// @custom:signature   Unresolved_907dff97(uint256 arg0, uint256 arg1, uint256 arg2, uint256 arg3, uint256 arg4, uint256 arg5) public view
    /// @param              arg0 ["uint256", "bytes32", "int256"]
    /// @param              arg1 ["uint256", "bytes32", "int256"]
    /// @param              arg2 ["uint256", "bytes32", "int256"]
    /// @param              arg3 ["uint256", "bytes32", "int256"]
    /// @param              arg4 ["uint256", "bytes32", "int256"]
    /// @param              arg5 ["uint256", "bytes32", "int256"]
    function Unresolved_907dff97(uint256 arg0, uint256 arg1, uint256 arg2, uint256 arg3, uint256 arg4, uint256 arg5) public view {
        require(msg.sender == (address(target)), "Must be proxy target");
        var_b = 0x20;
        if (arg1 == 0) {
            if (arg1 == 0x01) {
                emit Event_00000000(); // anonymous event
                if (arg1 == 0x02) {
                    emit Event_00000000(arg3); // anonymous event
                    if (arg1 == 0x03) {
                        emit Event_00000000(arg3, arg4); // anonymous event
                        if (arg1 == 0x04) {
                            emit Event_00000000(arg3, arg4, arg5); // anonymous event
                            emit Event_00000000(); // anonymous event
                        }
                    }
                }
            }
        }
    }
    
    /// @custom:selector    0xbefff6af
    /// @custom:signature   Unresolved_befff6af(uint256 arg0) public
    /// @param              arg0 ["uint256", "bytes32", "int256"]
    function Unresolved_befff6af(uint256 arg0) public {
        require(msg.sender == (address(owner)), "Only the contract owner may perform this action");
        target = (uint248(target)) | (0x010000000000000000000000000000000000000000 * arg0);
    }
    
    /// @custom:selector    0x776d1a01
    /// @custom:signature   setTarget(address arg0) public
    /// @param              arg0 ["address", "uint160", "bytes20", "int160"]
    function setTarget(address arg0) public {
        require(msg.sender == (address(owner)), "Only the contract owner may perform this action");
        target = (address(arg0)) | (uint96(target));
        emit TargetUpdated(address(arg0));
    }
    
    /// @custom:selector    0xdd62ed3e
    /// @custom:signature   allowance(address arg0, address arg1) public returns (uint256)
    /// @param              arg0 ["address", "uint160", "bytes20", "int160"]
    /// @param              arg1 ["address", "uint160", "bytes20", "int160"]
    function allowance(address arg0, address arg1) public returns (uint256) {
        address var_b = address(arg0);
        require(address(target).code.length);
        (bool success, bytes memory ret0) = address(target).{ value: 0 ether }Unresolved_dd62ed3e(var_b); // call
        require(!ret0.length < 0x20);
        return var_d.length;
    }
    
    /// @custom:selector    0x06fdde03
    /// @custom:signature   name() public returns (string memory)
    function name() public returns (string memory) {
        require(address(target).code.length);
        (bool success, bytes memory ret0) = address(target).{ value: 0 ether }name(); // call
        uint256 var_b = var_b + (uint248(ret0.length + 0x1f));
        require(!ret0.length < 0x20);
        require(!var_b.length > 0x0100000000);
        require(!((var_b + var_b.length) + 0x20) > (var_b + ret0.length));
        require(!((var_b + ret0.length) < (var_c + ((var_b + var_b.length) + 0x20))) | (var_c > 0x0100000000));
        require(!0 < (var_f));
        require(!bytes1(var_f));
        return abi.encodePacked(0x20, var_f, (~((0x0100 ** (0x20 - (bytes1(var_f)))) - 0x01)) & (var_h));
        return abi.encodePacked(0x20, var_f);
    }
    
    /// @custom:selector    0x95d89b41
    /// @custom:signature   symbol() public returns (string memory)
    function symbol() public returns (string memory) {
        require(address(target).code.length);
        (bool success, bytes memory ret0) = address(target).{ value: 0 ether }symbol(); // call
        uint256 var_b = var_b + (uint248(ret0.length + 0x1f));
        require(!ret0.length < 0x20);
        require(!var_b.length > 0x0100000000);
        require(!((var_b + var_b.length) + 0x20) > (var_b + ret0.length));
        require(!((var_b + ret0.length) < (var_c + ((var_b + var_b.length) + 0x20))) | (var_c > 0x0100000000));
        require(!0 < (var_f));
        require(!bytes1(var_f));
        return abi.encodePacked(0x20, var_f, (~((0x0100 ** (0x20 - (bytes1(var_f)))) - 0x01)) & (var_h));
        return abi.encodePacked(0x20, var_f);
    }
}

ABI

[
  {
    "type": "function",
    "name": "Unresolved_907dff97",
    "inputs": [
      {
        "name": "arg0",
        "type": "uint256"
      },
      {
        "name": "arg1",
        "type": "uint256"
      },
      {
        "name": "arg2",
        "type": "uint256"
      },
      {
        "name": "arg3",
        "type": "uint256"
      },
      {
        "name": "arg4",
        "type": "uint256"
      },
      {
        "name": "arg5",
        "type": "uint256"
      }
    ],
    "outputs": [],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "Unresolved_befff6af",
    "inputs": [
      {
        "name": "arg0",
        "type": "uint256"
      }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "acceptOwnership",
    "inputs": [],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "allowance",
    "inputs": [
      {
        "name": "arg0",
        "type": "address"
      },
      {
        "name": "arg1",
        "type": "address"
      }
    ],
    "outputs": [
      {
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "approve",
    "inputs": [
      {
        "name": "arg0",
        "type": "address"
      },
      {
        "name": "arg1",
        "type": "uint256"
      }
    ],
    "outputs": [
      {
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "balanceOf",
    "inputs": [
      {
        "name": "arg0",
        "type": "address"
      }
    ],
    "outputs": [
      {
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "decimals",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "name",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "nominateNewOwner",
    "inputs": [
      {
        "name": "arg0",
        "type": "address"
      }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "nominatedOwner",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "owner",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "setTarget",
    "inputs": [
      {
        "name": "arg0",
        "type": "address"
      }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "symbol",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "target",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "totalSupply",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "transfer",
    "inputs": [
      {
        "name": "arg0",
        "type": "address"
      },
      {
        "name": "arg1",
        "type": "uint256"
      }
    ],
    "outputs": [
      {
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "transferFrom",
    "inputs": [
      {
        "name": "arg0",
        "type": "address"
      },
      {
        "name": "arg1",
        "type": "address"
      },
      {
        "name": "arg2",
        "type": "uint256"
      }
    ],
    "outputs": [
      {
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "useDELEGATECALL",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "event",
    "name": "Event_0000000000000000000000000000000000000000000000000000000000000000",
    "inputs": [],
    "anonymous": true
  },
  {
    "type": "event",
    "name": "OwnerChanged",
    "inputs": [
      {
        "name": "arg0",
        "type": "address",
        "indexed": false
      },
      {
        "name": "arg1",
        "type": "address",
        "indexed": false
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "OwnerNominated",
    "inputs": [
      {
        "name": "arg0",
        "type": "address",
        "indexed": false
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "TargetUpdated",
    "inputs": [
      {
        "name": "arg0",
        "type": "address",
        "indexed": false
      }
    ],
    "anonymous": false
  }
]

UNKNOWN SELECTORS (2)

0xe7dbce40unknown
0x5e33fc19unknown
These selectors are not yet in the research database — they are being investigated and will be added as known functions once identified. They are also marked in red in the decompiled Solidity above.

KNOWN CLUSTER ADDRESSES IN THIS BYTECODE (0)

(none)