ETH Price: $2,533.66 (+0.78%)

Transaction Decoder

Block:
21147634 at Nov-09-2024 04:13:47 AM +UTC
Transaction Fee:
0.0002076492 ETH $0.53
Gas Used:
31,462 Gas / 6.6 Gwei

Emitted Events:

295 TransparentUpgradeableProxy.0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31( 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31, 0x000000000000000000000000a7b66856b34bc50b0d52944dd1697fe0f5702f64, 0x0000000000000000000000001e0049783f008a0085193e00003d00cd54003c71, 0000000000000000000000000000000000000000000000000000000000000000 )

Account State Difference:

  Address   Before After State Difference Code
0x0f926Df0...Fb47E490E
(beaverbuild)
10.511568209547571125 Eth10.511593931790343235 Eth0.00002572224277211
0xA7B66856...0F5702F64
0.083662373376251494 Eth
Nonce: 821
0.083454724176251494 Eth
Nonce: 822
0.0002076492

Execution Trace

TransparentUpgradeableProxy.a22cb465( )
  • GASEVO_20241029_1.setApprovalForAll( operator_=0x1E0049783F008A0085193E00003D00cd54003c71, approved_=False )
    setApprovalForAll[ERC721GSM (ln:146)]
    File 1 of 2: TransparentUpgradeableProxy
    /**
     *Submitted for verification at Etherscan.io on 2022-09-07
    */
    
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    abstract contract Proxy {
        function _delegate(address implementation) internal virtual {
            assembly {
                calldatacopy(0, 0, calldatasize())
    
                let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
    
                returndatacopy(0, 0, returndatasize())
    
                switch result
    
                case 0 {
                    revert(0, returndatasize())
                }
                default {
                    return(0, returndatasize())
                }
            }
        }
    
        function _implementation() internal view virtual returns (address);
    
        function _fallback() internal virtual {
            _beforeFallback();
            _delegate(_implementation());
        }
    
        fallback() external payable virtual {
            _fallback();
        }
    
        receive() external payable virtual {
            _fallback();
        }
    
        function _beforeFallback() internal virtual {}
    }
    
    interface IBeacon {
        function implementation() external view returns (address);
    }
    interface IERC1822Proxiable {
        function proxiableUUID() external view returns (bytes32);
    }
    library Address {
        function isContract(address account) internal view returns (bool) {
            return account.code.length > 0;
        }
    
        function sendValue(address payable recipient, uint256 amount) internal {
            require(address(this).balance >= amount, "Address: insufficient balance");
    
            (bool success, ) = recipient.call{value: amount}("");
            require(success, "Address: unable to send value, recipient may have reverted");
        }
    
        function functionCall(address target, bytes memory data) internal returns (bytes memory) {
            return functionCallWithValue(target, data, 0, "Address: low-level call failed");
        }
    
        function functionCall(
            address target,
            bytes memory data,
            string memory errorMessage
        ) internal returns (bytes memory) {
            return functionCallWithValue(target, data, 0, errorMessage);
        }
    
        function functionCallWithValue(
            address target,
            bytes memory data,
            uint256 value
        ) internal returns (bytes memory) {
            return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
        }
    
        function functionCallWithValue(
            address target,
            bytes memory data,
            uint256 value,
            string memory errorMessage
        ) internal returns (bytes memory) {
            require(address(this).balance >= value, "Address: insufficient balance for call");
            (bool success, bytes memory returndata) = target.call{value: value}(data);
            return verifyCallResultFromTarget(target, success, returndata, errorMessage);
        }
    
        function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
            return functionStaticCall(target, data, "Address: low-level static call failed");
        }
    
        function functionStaticCall(
            address target,
            bytes memory data,
            string memory errorMessage
        ) internal view returns (bytes memory) {
            (bool success, bytes memory returndata) = target.staticcall(data);
            return verifyCallResultFromTarget(target, success, returndata, errorMessage);
        }
    
        function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
            return functionDelegateCall(target, data, "Address: low-level delegate call failed");
        }
    
        function functionDelegateCall(
            address target,
            bytes memory data,
            string memory errorMessage
        ) internal returns (bytes memory) {
            (bool success, bytes memory returndata) = target.delegatecall(data);
            return verifyCallResultFromTarget(target, success, returndata, errorMessage);
        }
    
        function verifyCallResultFromTarget(
            address target,
            bool success,
            bytes memory returndata,
            string memory errorMessage
        ) internal view returns (bytes memory) {
            if (success) {
                if (returndata.length == 0) {
                    require(isContract(target), "Address: call to non-contract");
                }
                return returndata;
            } else {
                _revert(returndata, errorMessage);
            }
        }
    
        function verifyCallResult(
            bool success,
            bytes memory returndata,
            string memory errorMessage
        ) internal pure returns (bytes memory) {
            if (success) {
                return returndata;
            } else {
                _revert(returndata, errorMessage);
            }
        }
    
        function _revert(bytes memory returndata, string memory errorMessage) private pure {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
    library StorageSlot {
        struct AddressSlot {
            address value;
        }
    
        struct BooleanSlot {
            bool value;
        }
    
        struct Bytes32Slot {
            bytes32 value;
        }
    
        struct Uint256Slot {
            uint256 value;
        }
    
        function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
            assembly {
                r.slot := slot
            }
        }
    
        function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
            assembly {
                r.slot := slot
            }
        }
    
        function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
            assembly {
                r.slot := slot
            }
        }
    
        function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
            assembly {
                r.slot := slot
            }
        }
    }
    
    abstract contract ERC1967Upgrade {
        bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;
    
        bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
    
        event Upgraded(address indexed implementation);
    
        function _getImplementation() internal view returns (address) {
            return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
        }
    
        function _setImplementation(address newImplementation) private {
            require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
            StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
        }
    
        function _upgradeTo(address newImplementation) internal {
            _setImplementation(newImplementation);
            emit Upgraded(newImplementation);
        }
    
        function _upgradeToAndCall(
            address newImplementation,
            bytes memory data,
            bool forceCall
        ) internal {
            _upgradeTo(newImplementation);
            if (data.length > 0 || forceCall) {
                Address.functionDelegateCall(newImplementation, data);
            }
        }
    
        function _upgradeToAndCallUUPS(
            address newImplementation,
            bytes memory data,
            bool forceCall
        ) internal {
            if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {
                _setImplementation(newImplementation);
            } else {
                try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {
                    require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID");
                } catch {
                    revert("ERC1967Upgrade: new implementation is not UUPS");
                }
                _upgradeToAndCall(newImplementation, data, forceCall);
            }
        }
    
        bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
    
        event AdminChanged(address previousAdmin, address newAdmin);
    
        function _getAdmin() internal view returns (address) {
            return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;
        }
    
        function _setAdmin(address newAdmin) private {
            require(newAdmin != address(0), "ERC1967: new admin is the zero address");
            StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;
        }
    
        function _changeAdmin(address newAdmin) internal {
            emit AdminChanged(_getAdmin(), newAdmin);
            _setAdmin(newAdmin);
        }
    
        bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
    
        event BeaconUpgraded(address indexed beacon);
    
        function _getBeacon() internal view returns (address) {
            return StorageSlot.getAddressSlot(_BEACON_SLOT).value;
        }
    
        function _setBeacon(address newBeacon) private {
            require(Address.isContract(newBeacon), "ERC1967: new beacon is not a contract");
            require(
                Address.isContract(IBeacon(newBeacon).implementation()),
                "ERC1967: beacon implementation is not a contract"
            );
            StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;
        }
    
        function _upgradeBeaconToAndCall(
            address newBeacon,
            bytes memory data,
            bool forceCall
        ) internal {
            _setBeacon(newBeacon);
            emit BeaconUpgraded(newBeacon);
            if (data.length > 0 || forceCall) {
                Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);
            }
        }
    }
    
    contract ERC1967Proxy is Proxy, ERC1967Upgrade {
        constructor(address _logic, bytes memory _data) payable {
            _upgradeToAndCall(_logic, _data, false);
        }
        function _implementation() internal view virtual override returns (address impl) {
            return ERC1967Upgrade._getImplementation();
        }
    }
    
    contract TransparentUpgradeableProxy is ERC1967Proxy {
        constructor(
            address _logic,
            address admin_,
            bytes memory _data
        ) payable ERC1967Proxy(_logic, _data) {
            _changeAdmin(admin_);
        }
    
        modifier ifAdmin() {
            if (msg.sender == _getAdmin()) {
                _;
            } else {
                _fallback();
            }
        }
    
        function admin() external ifAdmin returns (address admin_) {
            admin_ = _getAdmin();
        }
    
        function implementation() external ifAdmin returns (address implementation_) {
            implementation_ = _implementation();
        }
    
        function changeAdmin(address newAdmin) external virtual ifAdmin {
            _changeAdmin(newAdmin);
        }
    
        function upgradeTo(address newImplementation) external ifAdmin {
            _upgradeToAndCall(newImplementation, bytes(""), false);
        }
    
        function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {
            _upgradeToAndCall(newImplementation, data, true);
        }
    
        function _admin() internal view virtual returns (address) {
            return _getAdmin();
        }
    
        function _beforeFallback() internal virtual override {
            require(msg.sender != _getAdmin(), "TransparentUpgradeableProxy: admin cannot fallback to proxy target");
            super._beforeFallback();
        }
    }

    File 2 of 2: GASEVO_20241029_1
    // SPDX-License-Identifier: MIT
    // Latest update: 2024-01-22
    pragma solidity ^0.8.0;
    
    abstract contract Ownable {
        event OwnershipTransferred(address indexed oldOwner, address indexed newOwner);
        address public owner; 
        constructor() { owner = msg.sender; }
        modifier onlyOwner { require(owner == msg.sender, "Not Owner!"); _; }
        function transferOwnership(address new_) external { 
            address _oldOwner = owner;
            require(_oldOwner == msg.sender, "Not Owner!");
            owner = new_; 
            emit OwnershipTransferred(_oldOwner, new_);
        }
    
        // Proxy Padding
        bytes32[50] private proxyPadding;
    }
    abstract contract Minterable is Ownable {
        event MinterableSet(address indexed operator, address indexed minter, bool isMinter);
        mapping(address => bool) public minters;
        modifier onlyMinter { require(minters[msg.sender], "Not Minter!"); _; }
        function setMinter(address address_, bool bool_) external onlyOwner {
            minters[address_] = bool_;
            emit MinterableSet(msg.sender, address_, bool_);
        }
    
        // Proxy Padding
        bytes32[50] private proxyPadding;
    }
    
    // The GSM version of G
    contract ERC721GSM {
    
        // ERC721-Standard Events
        event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
        event Approval(address indexed owner, address indexed approved, 
            uint256 indexed tokenId);
        event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    
        // ERC721-Standard Token Info
        string public name;
        string public symbol;
    
        // ERC721-Standard Constructor
        constructor(string memory name_, string memory symbol_) { 
            name = name_;
            symbol = symbol_;
        }
    
        // ERC721G Data Structures
        struct OwnerStruct { 
            address owner;
            uint32 lastTransfer;
            uint32 stakeTimestamp;
            uint32 totalTimeStaked;
        }
        struct BalanceStruct { 
            uint32 balance;
            uint32 mintedAmount;
            // Free Bytes
        }
    
        // ERC721G Data Mappings
        mapping(uint256 => OwnerStruct) public _tokenData;
        mapping(address => BalanceStruct) public _balanceData;
    
        // ERC721-Standard Approval Mappings
        mapping(uint256 => address) public getApproved;
        mapping(address => mapping(address => bool)) public isApprovedForAll;
    
        // Time Tools by 0xInuarashi
        function _getBlockTimestampCompressed() internal view returns (uint32) {
            return uint32(block.timestamp / 10);
        }
    
        // ERC721-Compliant Standard Reads
        function ownerOf(uint256 tokenId_) public virtual view returns (address) {
            return _tokenData[tokenId_].owner;
        }
        function balanceOf(address address_) public view returns (uint256) {
            return _balanceData[address_].balance;
        }
    
        // ERC721-Style Internal Functions
        function _mint(address to_, uint256 tokenId_) internal virtual {
            require(to_ != address(0), "_mint: target == 0x0");
            require(_tokenData[tokenId_].owner == address(0), "_mint: token exists");
    
            uint32 _currentTime = _getBlockTimestampCompressed();
            _tokenData[tokenId_] = OwnerStruct(to_, _currentTime, 0, 0);
    
            unchecked {
                _balanceData[to_].balance++;
                _balanceData[to_].mintedAmount++;
    
                // Increment Total Supply
                totalSupply++;
            }
    
            emit Transfer(address(0), to_, tokenId_);
        }
        function _transfer(address from_, address to_, uint256 tokenId_) internal virtual {
            require(from_ == ownerOf(tokenId_), "_transfer from_ != ownerOf");
            require(to_ != address(0), "_transfer to_ == 0x0");
            
            delete getApproved[tokenId_];
    
            _tokenData[tokenId_].owner = to_;
            _tokenData[tokenId_].lastTransfer = _getBlockTimestampCompressed();
    
            unchecked {
                _balanceData[from_].balance--;
                _balanceData[to_].balance++;
            }
    
            emit Transfer(from_, to_, tokenId_);
        }
    
        // ERC721-Standard Non-Modified Functions
        function _isApprovedOrOwner(address spender_, uint256 tokenId_) internal 
        view virtual returns (bool) {
            address _owner = ownerOf(tokenId_);
            return (_owner == spender_
                    || getApproved[tokenId_] == spender_
                    || isApprovedForAll[_owner][spender_]);
        }
        function _approve(address to_, uint256 tokenId_) internal virtual {
            getApproved[tokenId_] = to_;
            emit Approval(ownerOf(tokenId_), to_, tokenId_);
        }
        function approve(address to_, uint256 tokenId_) public virtual {
            address _owner = ownerOf(tokenId_);
            require(_owner == msg.sender 
                    || isApprovedForAll[_owner][msg.sender],
                    "ERC721G: approve not authorized");
            _approve(to_, tokenId_);
        }
        
        function _setApprovalForAll(address owner_, address operator_, bool approved_) 
        internal virtual {
            isApprovedForAll[owner_][operator_] = approved_;
            emit ApprovalForAll(owner_, operator_, approved_);
        }
        function setApprovalForAll(address operator_, bool approved_) public virtual {
            _setApprovalForAll(msg.sender, operator_, approved_);
        }
        
        function _exists(uint256 tokenId_) internal virtual view returns (bool) {
            return ownerOf(tokenId_) != address(0);
        }
        
        function transferFrom(address from_, address to_, uint256 tokenId_) public virtual {
            require(_isApprovedOrOwner(msg.sender, tokenId_),
                "ERC721G: transferFrom unauthorized");
            _transfer(from_, to_, tokenId_);
        }
        function safeTransferFrom(address from_, address to_, uint256 tokenId_,
        bytes memory data_) public virtual {
            transferFrom(from_, to_, tokenId_);
            if (to_.code.length != 0) {
                (, bytes memory _returned) = to_.call(abi.encodeWithSelector(
                    0x150b7a02, msg.sender, from_, tokenId_, data_));
                bytes4 _selector = abi.decode(_returned, (bytes4));
                require(_selector == 0x150b7a02, 
                    "ERC721G: safeTransferFrom to_ non-ERC721Receivable!");
            }
        }
        function safeTransferFrom(address from_, address to_, uint256 tokenId_) 
        public virtual {
            safeTransferFrom(from_, to_, tokenId_, "");
        }
        
        function supportsInterface(bytes4 iid_) public virtual view returns (bool) {
            return  iid_ == 0x01ffc9a7 || 
                    iid_ == 0x80ac58cd || 
                    iid_ == 0x5b5e139f || 
                    iid_ == 0x7f5828d0; 
        }
    
        function _toString(uint256 value_) internal pure returns (string memory) {
            if (value_ == 0) { return "0"; }
            uint256 _iterate = value_; uint256 _digits;
            while (_iterate != 0) { _digits++; _iterate /= 10; }
            bytes memory _buffer = new bytes(_digits);
            while (value_ != 0) { _digits--; _buffer[_digits] = bytes1(uint8(
                48 + uint256(value_ % 10 ))); value_ /= 10; }
            return string(_buffer); 
        }
    
        function tokenURI(uint256 tokenId_) public virtual view returns (string memory) {
            return string(abi.encodePacked(
                "https://gangsterallstar.nonfungiblecdn.com/gangsterallstar/metadata/",
                _toString(tokenId_)
            ));
        }
    
        // ERC721-Additional NFT Info
        uint256 public totalSupply;
    
        // Proxy Padding
        bytes32[49] private proxyPadding;
    }
    
    contract ERC721GSMStake is ERC721GSM {
        // First, we do constructor-compliant to ERC721GSM
        constructor(string memory name_, string memory symbol_) ERC721GSM(name_, symbol_) {} 
    
        // Then, we create some additional helper functions for staking
        function stakingAddress() public view returns (address) {
            return address(this);
        }
        function _compressTimestamp(uint256 timestamp_) internal pure returns (uint32) {
            return uint32(timestamp_ / 10);
        }
        function _expandTimestamp(uint32 timestamp_) internal pure returns (uint256) {
            return uint256(timestamp_ * 10);
        }
        function _getTokenDataOf(uint256 tokenId_) internal view 
        returns (OwnerStruct memory) {
            return _tokenData[tokenId_];
        }
        function _trueOwnerOf(uint256 tokenId_) internal view returns (address) {
            return _getTokenDataOf(tokenId_).owner;
        }
    
        // Next, we override the required functions for Staking functionality
        function ownerOf(uint256 tokenId_) public view override returns (address) {
            OwnerStruct memory _OwnerStruct = _getTokenDataOf(tokenId_);
            return _OwnerStruct.stakeTimestamp == 0 ? _OwnerStruct.owner : stakingAddress();
        }
    
        // Finally, we add additional functions to enable staking
        function _mintAndStake(address to_, uint256 tokenId_) internal {
            require(to_ != address(0), "_mint: target == 0x0");
            require(_tokenData[tokenId_].owner == address(0), "_mint: token exists");
    
            uint32 _currentTime = _getBlockTimestampCompressed();
            _tokenData[tokenId_] = OwnerStruct(to_, _currentTime, _currentTime, 0);
            
            unchecked {
                _balanceData[stakingAddress()].balance++;
                _balanceData[to_].mintedAmount++;
    
                // Increment Total Supply
                totalSupply++;
            }
    
            emit Transfer(address(0), to_, tokenId_);
            emit Transfer(to_, stakingAddress(), tokenId_);
        }
        function _setStakeTimestamp(uint256 tokenId_, uint256 timestamp_) internal 
        returns (address) {
            OwnerStruct memory _OwnerStruct = _getTokenDataOf(tokenId_);
            address _owner = _OwnerStruct.owner;
            uint32 _stakeTimestamp = _OwnerStruct.stakeTimestamp;
    
            require(_owner != address(0), "_setStakeTimestamp: token does not exist");
    
            if (timestamp_ > 0) {
                require(_stakeTimestamp == 0, "_setStakeTimestamp: already staked");
                unchecked { 
                    // Rebalance the balances of owner and stakingAddress
                    _balanceData[_owner].balance--;
                    _balanceData[stakingAddress()].balance++;
                }
                emit Transfer(_owner, stakingAddress(), tokenId_);
            }
    
            else { 
                require(_stakeTimestamp != 0, "_setStakeTimestamp: already unstaked");
                uint32 _timeStaked = _getBlockTimestampCompressed() - _stakeTimestamp;
                _tokenData[tokenId_].totalTimeStaked += _timeStaked;
                unchecked { 
                    _balanceData[stakingAddress()].balance--;
                    _balanceData[_owner].balance++;
                }
                emit Transfer(stakingAddress(), _owner, tokenId_);
            }
    
            _tokenData[tokenId_].stakeTimestamp = _compressTimestamp(timestamp_);
    
            return _owner;
        }
    
        function _stake(uint256 tokenId_) internal virtual returns (address) {
            return _setStakeTimestamp(tokenId_, block.timestamp);
        }
        function _unstake(uint256 tokenId_) internal virtual returns (address) {
            return _setStakeTimestamp(tokenId_, 0);
        }
    
        // Proxy Padding
        bytes32[50] private proxyPadding;
    }
    
    contract GASEVO_20241029_1 is ERC721GSMStake, Minterable {
        constructor() ERC721GSMStake("Gangster All Star: Gangsters Evolution", "GAS:GANG") {
            proxyInitialize(msg.sender);
        }
    
        // Proxy Initializer Logic
        bool proxyIsInitialized;
        function proxyInitialize(address newOwner) public {
            require(!proxyIsInitialized);
            proxyIsInitialized = true;
            
            // Hardcode
            owner = newOwner;
            name = "Gangster All Star: Gangsters Evolution";
            symbol = "GAS:GANG";
        }
    
        function setTotalSupply(uint256 totalSupply_) external onlyOwner {
            totalSupply = totalSupply_;
        }
    
        function mintAsController(address to_, uint256 tokenId_) external onlyMinter {
            _mint(to_, tokenId_);
        }
    
        // Admin Functions (added at 2024-01-22)
        function adminTransferFrom(address from_, address to_, uint256[] calldata tokenIds_) external onlyOwner {
            for (uint256 i; i < tokenIds_.length;) {
                _transfer(from_, to_, tokenIds_[i]);
                unchecked { ++i; }
            }
        }
    
        // Here, we need to jam transfers and turn the token into SBT
        function _transfer(address, address, uint256) internal virtual override(ERC721GSM) {
            revert("Soulbound");
        }
    
        // Proxy Padding
        bytes32[50] private proxyPadding;
    }