Transaction Hash:
Block:
14992075 at Jun-19-2022 05:58:40 PM +UTC
Transaction Fee:
0.00100071100671063 ETH
$1.91
Gas Used:
51,330 Gas / 19.495636211 Gwei
Emitted Events:
69 |
Gala.TransferSingle( _operator=[Sender] 0x041e86c0d3a7eed7552938467bdd6ecf7f3d889c, _from=[Sender] 0x041e86c0d3a7eed7552938467bdd6ecf7f3d889c, _to=0x1e791A49...50f3B40d0, _id=281753799810537047747674174953504079085568, _value=1 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x041e86c0...F7F3d889C |
0.110240685855569796 Eth
Nonce: 59
|
0.109239974848859166 Eth
Nonce: 60
| 0.00100071100671063 | ||
0x433022C4...cA782174D
Miner
| (K1POOL.COM) | 112.279137710198732929 Eth | 112.279266035198732929 Eth | 0.000128325 | |
0xc36cF0cF...3F6Cf9F5c |
Execution Trace
Gala.safeTransferFrom( _from=0x041e86c0d3a7eeD7552938467bDd6ecF7F3d889C, _to=0x1e791A49bD3a9ecC89c187e0083bef850f3B40d0, _id=281753799810537047747674174953504079085568, _value=1, _data=0x )
{"Address.sol":{"content":"pragma solidity ^0.5.0;\n\n\nlibrary Address {\n function isContract(address account) internal view returns (bool) {\n uint256 size;\n assembly {\n size := extcodesize(account)\n }\n return size \u003e 0;\n }\n}\n"},"Common.sol":{"content":"pragma solidity ^0.5.0;\n\n\ncontract CommonConstants {\n bytes4 internal constant ERC1155_ACCEPTED = 0xf23a6e61;\n bytes4 internal constant ERC1155_BATCH_ACCEPTED = 0xbc197c81;\n}\n"},"ERC165.sol":{"content":"pragma solidity ^0.5.0;\n\n\ninterface ERC165 {\n function supportsInterface(bytes4 _interfaceId) external view returns (bool);\n}\n"},"Gala.sol":{"content":"import \"./SafeMath.sol\";\nimport \"./Address.sol\";\nimport \"./Common.sol\";\nimport \"./IERC1155TokenReceiver.sol\";\nimport \"./IERC1155.sol\";\n\npragma solidity ^0.5.0;\n\n\ncontract Gala is IERC1155, ERC165, CommonConstants {\n using SafeMath for uint256;\n using Address for address;\n\n uint256 constant TYPE_MASK = uint256(uint128(~0)) \u003c\u003c 128;\n uint256 constant NF_INDEX_MASK = uint128(~0);\n uint256 constant TYPE_NF_BIT = 1 \u003c\u003c 255;\n uint256 nonce;\n\n address public owner;\n\n mapping(uint256 =\u003e mapping(address =\u003e uint256)) internal balances; // id =\u003e (owner =\u003e balance)\n mapping(address =\u003e mapping(address =\u003e bool)) internal operatorApproval; // owner =\u003e (operator =\u003e approved)\n mapping(uint256 =\u003e address) nfOwners;\n mapping(uint256 =\u003e uint256) public maxIndex;\n mapping(address =\u003e mapping(address =\u003e mapping(uint256 =\u003e uint256))) allowances;\n mapping(uint256 =\u003e uint256) public tokenSupply;\n mapping(uint256 =\u003e uint256) public tokenSupplyLimit;\n mapping(address =\u003e bool) internal creators;\n\n event Approval(\n address indexed _owner,\n address indexed _spender,\n uint256 indexed _id,\n uint256 _oldValue,\n uint256 _value\n );\n event SupplyLimit(uint256 indexed _id, uint256 _supplyLimit);\n\n event TransferSingle(\n address indexed _operator,\n address indexed _from,\n address indexed _to,\n uint256 _id,\n uint256 _value\n );\n event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);\n event URI(string _value, uint256 indexed _id);\n event TransferBatch(\n address indexed _operator,\n address indexed _from,\n address indexed _to,\n uint256[] _ids,\n uint256[] _values\n );\n\n event Creator(address _creator);\n\n constructor() public {\n owner = msg.sender;\n creators[msg.sender] = true;\n }\n\n modifier creatorOnly() {\n require(creators[msg.sender], \"Creator permission required\");\n _;\n }\n\n modifier ownerOnly() {\n require(msg.sender == owner);\n _;\n }\n\n function create(string calldata _uri, bool _isNF) external creatorOnly returns (uint256 _type) {\n _type = (++nonce \u003c\u003c 128);\n\n if (_isNF) _type = _type | TYPE_NF_BIT;\n\n emit TransferSingle(msg.sender, address(0x0), address(0x0), _type, 0);\n\n if (bytes(_uri).length \u003e 0) emit URI(_uri, _type);\n return _type;\n }\n\n function mintNonFungible(\n uint256 _type,\n address[] calldata _to,\n bytes calldata _data\n ) external creatorOnly {\n require(isNonFungible(_type));\n uint256 index = maxIndex[_type] + 1;\n maxIndex[_type] = _to.length.add(maxIndex[_type]);\n for (uint256 i = 0; i \u003c _to.length; ++i) {\n address distributeTo = _to[i];\n uint256 id = _type | (index + i);\n require(\n tokenSupplyLimit[_type] == 0 ||\n tokenSupply[_type].add(1) \u003c= tokenSupplyLimit[_type],\n \"Token supply limit exceeded\"\n );\n nfOwners[id] = distributeTo;\n tokenSupply[_type] = tokenSupply[_type].add(1);\n balances[_type][distributeTo] = balances[_type][distributeTo].add(1);\n\n emit TransferSingle(msg.sender, address(0x0), distributeTo, id, 1);\n\n if (distributeTo.isContract()) {\n _doSafeTransferAcceptanceCheck(msg.sender, msg.sender, distributeTo, id, 1, _data);\n }\n }\n }\n\n function mintFungible(\n uint256 _id,\n address[] calldata _to,\n uint256[] calldata _quantities,\n bytes calldata _data\n ) external creatorOnly {\n require(isFungible(_id), \"ID must be a non-fungible ID\");\n for (uint256 i = 0; i \u003c _to.length; ++i) {\n require(\n tokenSupplyLimit[_id] == 0 ||\n tokenSupply[_id].add(_quantities[i]) \u003c= tokenSupplyLimit[_id],\n \"Token supply limit exceeded\"\n );\n balances[_id][_to[i]] = _quantities[i].add(balances[_id][_to[i]]);\n tokenSupply[_id] = tokenSupply[_id].add(_quantities[i]);\n\n emit TransferSingle(msg.sender, address(0x0), _to[i], _id, _quantities[i]);\n\n if (_to[i].isContract()) {\n _doSafeTransferAcceptanceCheck(\n msg.sender,\n msg.sender,\n _to[i],\n _id,\n _quantities[i],\n _data\n );\n }\n }\n }\n\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _id,\n uint256 _value,\n bytes calldata _data\n ) external {\n require(_to != address(0x0), \"cannot send to zero address\");\n require(\n _from == msg.sender || operatorApproval[_from][msg.sender] == true,\n \"Need operator approval for 3rd party transfers.\"\n );\n\n if (isNonFungible(_id)) {\n require(nfOwners[_id] == _from);\n nfOwners[_id] = _to;\n // You could keep balance of NF type in base type id like so:\n uint256 baseType = getNonFungibleBaseType(_id);\n balances[baseType][_from] = balances[baseType][_from].sub(_value);\n balances[baseType][_to] = balances[baseType][_to].add(_value);\n } else {\n balances[_id][_from] = balances[_id][_from].sub(_value);\n balances[_id][_to] = balances[_id][_to].add(_value);\n }\n\n emit TransferSingle(msg.sender, _from, _to, _id, _value);\n\n if (_to.isContract()) {\n _doSafeTransferAcceptanceCheck(msg.sender, _from, _to, _id, _value, _data);\n }\n }\n\n function safeBatchTransferFrom(\n address _from,\n address _to,\n uint256[] calldata _ids,\n uint256[] calldata _values,\n bytes calldata _data\n ) external {\n require(_to != address(0x0), \"cannot send to zero address\");\n require(_ids.length == _values.length, \"Array length must match\");\n require(\n _from == msg.sender || operatorApproval[_from][msg.sender] == true,\n \"Need operator approval for 3rd party transfers.\"\n );\n\n for (uint256 i = 0; i \u003c _ids.length; ++i) {\n if (isNonFungible(_ids[i])) {\n require(nfOwners[_ids[i]] == _from);\n nfOwners[_ids[i]] = _to;\n balances[getNonFungibleBaseType(_ids[i])][_from] = balances[getNonFungibleBaseType(\n _ids[i]\n )][_from]\n .sub(_values[i]);\n balances[getNonFungibleBaseType(_ids[i])][_to] = balances[getNonFungibleBaseType(\n _ids[i]\n )][_to]\n .add(_values[i]);\n } else {\n balances[_ids[i]][_from] = balances[_ids[i]][_from].sub(_values[i]);\n balances[_ids[i]][_to] = _values[i].add(balances[_ids[i]][_to]);\n }\n }\n\n emit TransferBatch(msg.sender, _from, _to, _ids, _values);\n\n if (_to.isContract()) {\n _doSafeBatchTransferAcceptanceCheck(msg.sender, _from, _to, _ids, _values, _data);\n }\n }\n\n function balanceOf(address _owner, uint256 _id) external view returns (uint256) {\n if (isNonFungibleItem(_id)) return nfOwners[_id] == _owner ? 1 : 0;\n return balances[_id][_owner];\n }\n\n function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids)\n external\n view\n returns (uint256[] memory)\n {\n require(_owners.length == _ids.length);\n uint256[] memory balances_ = new uint256[](_owners.length);\n for (uint256 i = 0; i \u003c _owners.length; ++i) {\n uint256 id = _ids[i];\n if (isNonFungibleItem(id)) {\n balances_[i] = nfOwners[id] == _owners[i] ? 1 : 0;\n } else {\n balances_[i] = balances[id][_owners[i]];\n }\n }\n\n return balances_;\n }\n\n function setApprovalForAll(address _operator, bool _approved) external {\n operatorApproval[msg.sender][_operator] = _approved;\n emit ApprovalForAll(msg.sender, _operator, _approved);\n }\n\n function isApprovedForAll(address _owner, address _operator) external view returns (bool) {\n return operatorApproval[_owner][_operator];\n }\n\n function setSupplyLimit(uint256 _typeOrId, uint256 _supplyLimit) external creatorOnly {\n require(_supplyLimit \u003e 0);\n if (isNonFungibleItem(_typeOrId)) {\n uint256 typeId = getNonFungibleBaseType(_typeOrId);\n require(tokenSupplyLimit[typeId] == 0);\n tokenSupplyLimit[typeId] = _supplyLimit;\n emit SupplyLimit(typeId, _supplyLimit);\n } else {\n require(tokenSupplyLimit[_typeOrId] == 0);\n tokenSupplyLimit[_typeOrId] = _supplyLimit;\n emit SupplyLimit(_typeOrId, _supplyLimit);\n }\n }\n\n function approveBatch(\n address _spender,\n uint256[] calldata _ids,\n uint256[] calldata _currentValues,\n uint256[] calldata _values\n ) external {\n require(_ids.length == _currentValues.length, \"Arrays must be same length\");\n require(_currentValues.length == _values.length, \"Arrays must be same length\");\n for (uint256 i = 0; i \u003c _values.length; i++) {\n uint256 id = _ids[i];\n uint256 currentValue = _currentValues[i];\n uint256 value = _values[i];\n require(allowances[msg.sender][_spender][id] == currentValue);\n allowances[msg.sender][_spender][id] = value;\n emit Approval(msg.sender, _spender, id, currentValue, value);\n }\n }\n\n function isNonFungible(uint256 _id) public pure returns (bool) {\n return _id \u0026 TYPE_NF_BIT == TYPE_NF_BIT;\n }\n\n function isFungible(uint256 _id) public pure returns (bool) {\n return _id \u0026 TYPE_NF_BIT == 0;\n }\n\n function getNonFungibleIndex(uint256 _id) public pure returns (uint256) {\n return _id \u0026 NF_INDEX_MASK;\n }\n\n function getNonFungibleBaseType(uint256 _id) public pure returns (uint256) {\n return _id \u0026 TYPE_MASK;\n }\n\n function isNonFungibleBaseType(uint256 _id) public pure returns (bool) {\n // A base type has the NF bit but does not have an index.\n return (_id \u0026 TYPE_NF_BIT == TYPE_NF_BIT) \u0026\u0026 (_id \u0026 NF_INDEX_MASK == 0);\n }\n\n function isNonFungibleItem(uint256 _id) public pure returns (bool) {\n // A base type has the NF bit but does has an index.\n return (_id \u0026 TYPE_NF_BIT == TYPE_NF_BIT) \u0026\u0026 (_id \u0026 NF_INDEX_MASK != 0);\n }\n\n function ownerOf(uint256 _id) public view returns (address) {\n return nfOwners[_id];\n }\n\n /////////////////////////////////////////// ERC165 //////////////////////////////////////////////\n\n bytes4 private constant INTERFACE_SIGNATURE_ERC165 = 0x01ffc9a7;\n bytes4 private constant INTERFACE_SIGNATURE_ERC1155 = 0xd9b67a26;\n\n function supportsInterface(bytes4 _interfaceId) public view returns (bool) {\n if (\n _interfaceId == INTERFACE_SIGNATURE_ERC165 ||\n _interfaceId == INTERFACE_SIGNATURE_ERC1155\n ) {\n return true;\n }\n\n return false;\n }\n\n /////////////////////////////////////////// Internal //////////////////////////////////////////////\n\n function _doSafeTransferAcceptanceCheck(\n address _operator,\n address _from,\n address _to,\n uint256 _id,\n uint256 _value,\n bytes memory _data\n ) internal {\n require(\n ERC1155TokenReceiver(_to).onERC1155Received(_operator, _from, _id, _value, _data) ==\n ERC1155_ACCEPTED,\n \"contract returned an unknown value from onERC1155Received\"\n );\n }\n\n function _doSafeBatchTransferAcceptanceCheck(\n address _operator,\n address _from,\n address _to,\n uint256[] memory _ids,\n uint256[] memory _values,\n bytes memory _data\n ) internal {\n require(\n ERC1155TokenReceiver(_to).onERC1155BatchReceived(\n _operator,\n _from,\n _ids,\n _values,\n _data\n ) == ERC1155_BATCH_ACCEPTED,\n \"contract returned an unknown value from onERC1155BatchReceived\"\n );\n }\n\n /////////////////////////////////////////// ERC1155 //////////////////////////////////////////////\n\n function batchAuthorizeCreators(address[] calldata _addresses) external ownerOnly {\n for (uint256 i = 0; i \u003c _addresses.length; ++i) {\n emit Creator(_addresses[i]);\n creators[_addresses[i]] = true;\n }\n }\n\n function batchDeauthorizeCreators(address[] calldata _addresses) external ownerOnly {\n for (uint256 i = 0; i \u003c _addresses.length; ++i) {\n delete creators[_addresses[i]];\n }\n }\n\n function allowance(\n address _owner,\n address _spender,\n uint256 _id\n ) external view returns (uint256) {\n return allowances[_owner][_spender][_id];\n }\n\n function burn(\n address _from,\n uint256[] calldata _ids,\n uint256[] calldata _values\n ) external {\n require(\n _from == msg.sender || operatorApproval[_from][msg.sender] == true,\n \"Need operator approval for 3rd party burn.\"\n );\n require(_ids.length \u003e 0 \u0026\u0026 _ids.length == _values.length);\n for (uint256 i = 0; i \u003c _ids.length; i++) {\n if (isFungible(_ids[i])) {\n require(balances[_ids[i]][_from] \u003e= _values[i]);\n balances[_ids[i]][_from] = balances[_ids[i]][_from].sub(_values[i]);\n } else {\n require(isNonFungible(_ids[i]));\n require(_values[i] == 1);\n uint256 baseType = getNonFungibleBaseType(_ids[i]);\n // --totalSupply?\n balances[baseType][_from] = balances[baseType][_from].sub(1);\n delete nfOwners[_ids[i]];\n }\n emit TransferSingle(msg.sender, _from, address(0x0), _ids[i], _values[i]);\n }\n }\n\n function setNewUri(string calldata _uri, uint256 _id) external creatorOnly {\n require(bytes(_uri).length \u003e 0);\n emit URI(_uri, _id);\n }\n}\n"},"IERC1155.sol":{"content":"pragma solidity ^0.5.0;\n\nimport \"./ERC165.sol\";\n\n\n/* is ERC165 */\ninterface IERC1155 {\n event TransferSingle(\n address indexed _operator,\n address indexed _from,\n address indexed _to,\n uint256 _id,\n uint256 _value\n );\n event TransferBatch(\n address indexed _operator,\n address indexed _from,\n address indexed _to,\n uint256[] _ids,\n uint256[] _values\n );\n event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);\n event URI(string _value, uint256 indexed _id);\n\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _id,\n uint256 _value,\n bytes calldata _data\n ) external;\n\n function safeBatchTransferFrom(\n address _from,\n address _to,\n uint256[] calldata _ids,\n uint256[] calldata _values,\n bytes calldata _data\n ) external;\n\n function balanceOf(address _owner, uint256 _id) external view returns (uint256);\n\n function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids)\n external\n view\n returns (uint256[] memory);\n\n function setApprovalForAll(address _operator, bool _approved) external;\n\n function isApprovedForAll(address _owner, address _operator) external view returns (bool);\n}\n"},"IERC1155TokenReceiver.sol":{"content":"pragma solidity ^0.5.0;\n\n\ninterface ERC1155TokenReceiver {\n function onERC1155Received(\n address _operator,\n address _from,\n uint256 _id,\n uint256 _value,\n bytes calldata _data\n ) external returns (bytes4);\n\n function onERC1155BatchReceived(\n address _operator,\n address _from,\n uint256[] calldata _ids,\n uint256[] calldata _values,\n bytes calldata _data\n ) external returns (bytes4);\n}\n"},"Migrations.sol":{"content":"pragma solidity \u003e=0.4.21 \u003c0.7.0;\n\n\ncontract Migrations {\n address public owner;\n uint256 public last_completed_migration;\n\n constructor() public {\n owner = msg.sender;\n }\n\n modifier restricted() {\n if (msg.sender == owner) _;\n }\n\n function setCompleted(uint256 completed) public restricted {\n last_completed_migration = completed;\n }\n}\n"},"SafeMath.sol":{"content":"pragma solidity ^0.5.0;\n\n\nlibrary SafeMath {\n function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\n if (a == 0) {\n return 0;\n }\n c = a * b;\n assert(c / a == b);\n return c;\n }\n\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n return a / b;\n }\n\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n assert(b \u003c= a);\n return a - b;\n }\n\n function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\n c = a + b;\n assert(c \u003e= a);\n return c;\n }\n}\n"},"SignatureVerifier.sol":{"content":"pragma solidity ^0.5.0;\n\n\ncontract SignatureVerifier {\n function validateNodeSignature(\n string memory nodeHardwareLicenseId,\n uint256 sigNonce,\n bytes memory signature\n ) internal view returns (address signer) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n (v, r, s) = splitSignature(signature);\n bytes32 hash = keccak256(abi.encodePacked(nodeHardwareLicenseId, sigNonce, this));\n bytes32 hashWithHeader = keccak256(\n abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash)\n );\n\n return ecrecover(hashWithHeader, v, r, s);\n }\n\n function splitSignature(bytes memory signature)\n internal\n pure\n returns (\n uint8,\n bytes32,\n bytes32\n )\n {\n require(signature.length == 65);\n\n bytes32 r;\n bytes32 s;\n uint8 v;\n\n assembly {\n // first 32 bytes, after the length prefix\n r := mload(add(signature, 32))\n // second 32 bytes\n s := mload(add(signature, 64))\n // final byte (first byte of the next 32 bytes)\n v := byte(0, mload(add(signature, 96)))\n }\n\n return (v, r, s);\n }\n}\n"}}