Transaction Hash:
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 | ||
---|---|---|---|---|---|
0x0f926Df0...Fb47E490E | |||||
0x95222290...5CC4BAfe5
Miner
| (beaverbuild) | 10.511568209547571125 Eth | 10.511593931790343235 Eth | 0.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)]
_setApprovalForAll[ERC721GSM (ln:147)]
ApprovalForAll[ERC721GSM (ln:144)]
File 1 of 2: TransparentUpgradeableProxy
File 2 of 2: GASEVO_20241029_1
/** *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; }