18.23
($3.18%)
| 1 Gwei
// SPDX-License-Identifier: GLWTPL pragma solidity ^0.8.11; contract tmwstw_paint_products{ string private token_name = "TMWSTW Paint Products"; string private token_symbol = "TMWSTW_PP"; address private contract_creator; string private base_uri = ""; address public resource_contract; address public PR_address; address public inventory_address; address public buildings_address; uint public ASSET_PRICE = 50; uint private last_token_id = 0; //AT START constructor(){ contract_creator = msg.sender; base_uri = "https://meta.tmwstw.io/meta_paints_"; resource_contract = 0x19b4343d272DA48779aB7A9a7436F95F63249871; PR_address = 0xA9f7CfcA37bF53cD7F33bC4408990Ff90915960c; inventory_address = 0x9AaF1be2a532738A501E4934C4Bb6c2F06eB4085; buildings_address = 0x6B3dd9CA4700fc5c1695690DB910ed98d2392822; } //MAPS mapping(uint => address) private token_ownership;// Mapping from token ID to owner address mapping(address => uint256) private balance_per_owner;// Mapping owner address to token count mapping(uint => address) private approval_per_token;// Mapping from token ID to approved address mapping(address => mapping(address => bool)) private operator_approvals;// Mapping from owner to operator approvals //.............................CONTRACTS function register_RESOURCE(address thi_address)public CREATOR_ONLY{ resource_contract = thi_address; } function register_P_ROUTERS(address thi_address)public CREATOR_ONLY{ PR_address = thi_address; } function register_INVENTORY(address thi_address)public CREATOR_ONLY{ inventory_address = thi_address; } function register_BUILDINGS(address thi_address)public CREATOR_ONLY{ buildings_address = thi_address; } //...................................CRAFT functions //CRAFT DATA MAPS -- always use this order struct asset_data{ //248/256 uint8 asset_type; //1 = add , 2 = remove/bleach uint8 package; //1 = spray , 2 = bucket uint8 product; //{n:"Base layer paint bucket",id:1}{n:"Bleach spray",id:2}{n:"Color spray",id:3}{n:"Base layer bleach bucket",id:4}{n:"Graffiti layer bleach bucket",id:5} uint8 weight; //1 to 5 uint8 roughness; // 0-10 uint8 metallic; // 0-10 uint8 reliability; //1-10 uint8 r;//0-255 color uint8 g;//0-255 color uint8 b;//0-255 color bool illuminated; bool bumpy; uint32 capacity;//10k to 500k uint16 plot_id; // TOKYO = 1 uint8 world_location_mode;// 1 = inventory/ 2 = locker/3 = post_box/ 4 = world int32 pos_x; //100,000x position int32 pos_y; //100,000x position int32 pos_z; //100,000x position } mapping(uint => asset_data) private data_per_asset; //..................................CRAFT function craft( address new_owner, uint16 plot_id, uint32 capacity, uint8[] calldata all_uints8, //10 uint8s bool[] calldata all_bools, //2 bools - illuminated and bumpy int32[] calldata pos_array )public{ require(PR(PR_address).is_personal_router(msg.sender,new_owner),"Bad personal router"); RESOURCE(resource_contract).transferFrom(new_owner,resource_contract,ASSET_PRICE); uint this_token_id = last_token_id + 1; require(new_owner != address(0),"cant be minted to null"); require(token_ownership[this_token_id] == address(0),"token already exists"); balance_per_owner[new_owner] += 1; token_ownership[this_token_id] = new_owner; //store onchain data data_per_asset[this_token_id].asset_type = all_uints8[0]; data_per_asset[this_token_id].package = all_uints8[1]; data_per_asset[this_token_id].product = all_uints8[2]; data_per_asset[this_token_id].weight = all_uints8[3]; data_per_asset[this_token_id].roughness = all_uints8[4]; data_per_asset[this_token_id].metallic = all_uints8[5]; data_per_asset[this_token_id].reliability = all_uints8[6]; data_per_asset[this_token_id].r = all_uints8[7]; data_per_asset[this_token_id].g = all_uints8[8]; data_per_asset[this_token_id].b = all_uints8[9]; data_per_asset[this_token_id].illuminated = all_bools[0]; data_per_asset[this_token_id].bumpy = all_bools[1]; data_per_asset[this_token_id].capacity = capacity; change_xyz(this_token_id,pos_array[0],pos_array[1],pos_array[2],plot_id,4); INVENTORY(inventory_address).move_asset_at_craft(new_owner,address(this),this_token_id); last_token_id = this_token_id; // update last id emit Transfer(address(0), new_owner, this_token_id); } //ALL COMBINED DATA function retrieve_data(uint this_token_id)public view returns( uint8[13] memory, //all uint8s int32[3] memory, //pos uint32, //capacity uint16, //plot_id address //owner ){ require(token_exists(this_token_id), "Token doesn't exist"); return ( [ data_per_asset[this_token_id].asset_type, data_per_asset[this_token_id].package, data_per_asset[this_token_id].product, data_per_asset[this_token_id].weight, data_per_asset[this_token_id].roughness, data_per_asset[this_token_id].metallic, data_per_asset[this_token_id].reliability, data_per_asset[this_token_id].r, data_per_asset[this_token_id].g, data_per_asset[this_token_id].b, bool_to_uint8(data_per_asset[this_token_id].illuminated), bool_to_uint8(data_per_asset[this_token_id].bumpy), data_per_asset[this_token_id].world_location_mode ], [ data_per_asset[this_token_id].pos_x, data_per_asset[this_token_id].pos_y, data_per_asset[this_token_id].pos_z ], data_per_asset[this_token_id].capacity, data_per_asset[this_token_id].plot_id, token_ownership[this_token_id] ); } ///...............................BUILD PAINT struct build_color_data{ //64/256 uint8 r; //0 to 255 uint8 g; //0 to 255 uint8 b; //0 to 255 uint8 roughness; // 0-10 uint8 metallic; // 0-10 bool illuminated;//possible bool bumpy;//possible bool colored; //true/false if bleached } mapping(uint => build_color_data) private color_data_per_building; //on build painting/bleaching function paint_building(uint this_token_id, uint building_token_id)public{ require(token_exists(this_token_id), "Token doesn't exist"); require(is_owner(this_token_id,msg.sender), "Wrong owner"); require(data_per_asset[this_token_id].package == 2, "Wrong assett type");//only buckets require(is_in_locker(this_token_id), "Cant be used outside of Locker"); require(BUILDS(buildings_address).token_exists(building_token_id), "Building doesn't exist"); address build_owner = BUILDS(buildings_address).ownerOf(building_token_id); require(build_owner == msg.sender, "Wrong building owner"); if(data_per_asset[this_token_id].product == 1 || data_per_asset[this_token_id].product == 4){ //BASE affecting products if(data_per_asset[this_token_id].asset_type == 1){ //ADD color_data_per_building[building_token_id].r = data_per_asset[this_token_id].r; color_data_per_building[building_token_id].g = data_per_asset[this_token_id].g; color_data_per_building[building_token_id].b = data_per_asset[this_token_id].b; color_data_per_building[building_token_id].roughness = data_per_asset[this_token_id].roughness; color_data_per_building[building_token_id].metallic = data_per_asset[this_token_id].metallic; color_data_per_building[building_token_id].illuminated = data_per_asset[this_token_id].illuminated; color_data_per_building[building_token_id].bumpy = data_per_asset[this_token_id].bumpy; color_data_per_building[building_token_id].colored = true; } else{ //remove color_data_per_building[building_token_id].colored = false; } } move_INVENTORY_asset_in_steps(msg.sender,this_token_id); internal_burn(msg.sender,this_token_id); emit Build_paint_change(building_token_id,data_per_asset[this_token_id].product); } event Build_paint_change(uint build_token_id, uint paint_product); //Get build color data function retrieve_painted_building_data(uint b_token_id)public view returns(uint8[8] memory){ return ([ color_data_per_building[b_token_id].r, color_data_per_building[b_token_id].g, color_data_per_building[b_token_id].b, color_data_per_building[b_token_id].roughness, color_data_per_building[b_token_id].metallic, bool_to_uint8(color_data_per_building[b_token_id].illuminated), bool_to_uint8(color_data_per_building[b_token_id].bumpy), bool_to_uint8(color_data_per_building[b_token_id].colored) ]); } //....................................BURN //burn asset in ownership by owner only in market state function burn_token(uint this_token_id)public{ require(token_exists(this_token_id), "Token doesn't exist"); require(is_owner(this_token_id,msg.sender), "Wrong owner"); require(is_in_postbox(this_token_id), "Cant be burned outside of postbox"); internal_burn(msg.sender,this_token_id); } //do prechecks in public function function internal_burn(address owner,uint this_token_id)internal{ balance_per_owner[owner] -= 1; token_ownership[this_token_id] = address(0); emit Transfer(owner, address(0), this_token_id); } //change Capacity function change_capacity(uint this_token_id, uint32 pixels_used)public{ require(token_exists(this_token_id), "Token doesn't exist"); require(data_per_asset[this_token_id].package == 1, "Wrong asset package"); address this_owner = token_ownership[this_token_id]; require(PR(PR_address).is_personal_router(msg.sender,this_owner),"Bad personal router"); if(data_per_asset[this_token_id].capacity > pixels_used){ data_per_asset[this_token_id].capacity -= pixels_used; } else{ move_INVENTORY_asset_in_steps(this_owner,this_token_id); internal_burn(this_owner,this_token_id); } } //// 1 = inventory/ 2 = locker/3 = post_box/ 4 = world function move_INVENTORY_asset_in_steps(address this_owner,uint this_token_id) internal{ uint8 cur_location = data_per_asset[this_token_id].world_location_mode; uint8 weight = data_per_asset[this_token_id].weight; if(cur_location == 1){//in inventory -- move streight to world INVENTORY(inventory_address).move_asset(4,this_owner,address(this),this_token_id,weight); } else if(cur_location == 2 || cur_location == 3){ //locker or postbox -- move to inventory first, then to world INVENTORY(inventory_address).move_asset(1,this_owner,address(this),this_token_id,weight); INVENTORY(inventory_address).move_asset(4,this_owner,address(this),this_token_id,weight); } } //..............................EXPLODE //explodes at chance based on reliability function asset_explode(uint this_token_id)public{ require(token_exists(this_token_id), "Token doesn't exist"); require(data_per_asset[this_token_id].package == 1, "Asset cant explode"); require(data_per_asset[this_token_id].reliability < 10, "Asset is too reliable"); require(is_in_inventory(this_token_id), "Cant explode outside of inventory"); address this_owner = token_ownership[this_token_id]; require(PR(PR_address).is_personal_router(msg.sender,this_owner),"Bad personal router"); move_INVENTORY_asset_in_steps(this_owner,this_token_id); internal_burn(this_owner,this_token_id); emit Asset_exploded(this_token_id); } event Asset_exploded(uint token_id); //// 1 = inventory/ 2 = locker/3 = post_box/ 4 = world ///.............................WORLD MODE/STATES function change_world_location_mode(address requester,uint this_token_id,uint8 new_mode,int32 pos_x,int32 pos_y,int32 pos_z,uint16 plot_id)public{ require(token_exists(this_token_id), "Token doesn't exist"); require(PR(PR_address).is_personal_router(msg.sender,requester),"Bad personal router"); //if not an owner, transfer ownership if asset in world if(token_ownership[this_token_id] != requester){ steal_asset_if_in_world(this_token_id,new_mode,requester); } require(token_ownership[this_token_id] == requester,"Not allowed outside of ownership"); uint8 weight = data_per_asset[this_token_id].weight; INVENTORY(inventory_address).move_asset(new_mode,requester,address(this),this_token_id,weight); if(new_mode == 4){ //world change_xyz(this_token_id,pos_x,pos_y,pos_z,plot_id,new_mode); } else{ //locker / inventory /post box change_xyz(this_token_id,0,0,0,0,new_mode); } emit world_location_mode_changed(this_token_id,new_mode); } event world_location_mode_changed(uint token_id,uint8 moved_to); function change_xyz(uint this_token_id,int32 pos_x,int32 pos_y,int32 pos_z,uint16 plot_id,uint8 world_mode)internal{ data_per_asset[this_token_id].pos_x = pos_x; data_per_asset[this_token_id].pos_y = pos_y; data_per_asset[this_token_id].pos_z = pos_z; data_per_asset[this_token_id].plot_id = plot_id; data_per_asset[this_token_id].world_location_mode = world_mode; } //// 1 = inventory/ 2 = locker/3 = post_box/ 4 = world function steal_asset_if_in_world(uint this_token_id,uint8 new_mode,address requester)internal{ if(data_per_asset[this_token_id].world_location_mode == 4){ //from world if(new_mode == 1){ //to inventory address cur_owner = token_ownership[this_token_id]; transfer_token(cur_owner, requester, this_token_id); } } } //uint8 world_location_mode;// 1 = inventory/ 2 = locker/3 = post_box/ 4 = world //opens up market functionality function is_in_postbox(uint this_token_id)internal view returns(bool){ if(data_per_asset[this_token_id].world_location_mode == 3){ return true; } return false; } function is_in_inventory(uint this_token_id)internal view returns(bool){ if(data_per_asset[this_token_id].world_location_mode == 1){ return true; } return false; } function is_in_locker(uint this_token_id)internal view returns(bool){ if(data_per_asset[this_token_id].world_location_mode == 2){ return true; } return false; } function change_asset_price(uint new_price)public CREATOR_ONLY{ require(new_price > 0,"Bad price"); ASSET_PRICE = new_price; } //.............................MODIFIERS modifier CREATOR_ONLY { require(msg.sender == contract_creator,"must be creator"); _; } //...............................kinda ERC721 classics function name() external view returns (string memory){ return token_name; } function symbol() external view returns (string memory){ return token_symbol; } function tokenURI(uint this_token_id) external view returns (string memory){ require(token_exists(this_token_id),"Token doesn't exist"); string memory baseURI = base_uri; if(bytes(baseURI).length > 0){ string memory string_token = toString(this_token_id); return string(abi.encodePacked(baseURI, string_token)); } else{ return ""; } } function set_base_uri(string calldata this_base_uri)public CREATOR_ONLY{ base_uri = this_base_uri; } //good function balanceOf(address this_owner) external view returns (uint256){ require(this_owner != address(0), "Zero address has nothing in ownership"); return balance_per_owner[this_owner]; } //good function ownerOf(uint this_token_id) public view returns (address){ address this_owner = token_ownership[this_token_id]; require(this_owner != address(0), "Token doesn't exist"); return this_owner; } //ERC721 pack of transfers function safeTransferFrom(address from, address to, uint this_token_id) public{ safeTransferFrom(from, to, this_token_id, ""); } function safeTransferFrom(address from, address to, uint this_token_id, bytes memory ) public{ require(is_in_postbox(this_token_id), "Cant be transfered outside of postbox"); require(is_owner_or_approved(msg.sender, this_token_id),"not owner or approved"); transfer_token(from, to, this_token_id); } function transferFrom( address from,address to,uint this_token_id) public { require(is_in_postbox(this_token_id), "Cant be transfered outside of postbox"); require(is_owner_or_approved(msg.sender, this_token_id),"not owner or approved"); transfer_token(from, to, this_token_id); } //MAIN TRANSFER function transfer_token(address from,address to,uint this_token_id) internal { require(ownerOf(this_token_id) == from, "bad owner"); require(to != address(0), "no zero transfers"); inner_approve(address(0), this_token_id); // Clear approvals from the previous owner balance_per_owner[from] -= 1; balance_per_owner[to] += 1; token_ownership[this_token_id] = to; emit Transfer(from, to, this_token_id); } event Transfer(address indexed from, address indexed to, uint256 indexed token_id); //APPROVALS function approve(address to, uint this_token_id) public { address owner = ownerOf(this_token_id); require(to != owner, "cant approve to owner"); require(msg.sender == owner || isApprovedForAll(owner,msg.sender), "sender is not owner nor approved for all"); inner_approve(to, this_token_id); } function inner_approve(address to, uint this_token_id) internal { if(approval_per_token[this_token_id] != to){ approval_per_token[this_token_id] = to; emit Approval(ownerOf(this_token_id), to, this_token_id); } } event Approval(address indexed owner, address indexed is_approved, uint256 indexed token_id); function setApprovalForAll(address operator, bool approved) public { require(msg.sender != operator, "cant approve to itself"); operator_approvals[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } event ApprovalForAll(address indexed owner, address indexed operator, bool is_approved); //Verify STF function is_owner_or_approved(address msg_sender, uint this_token_id) internal view returns (bool) { address this_owner = ownerOf(this_token_id); return (msg_sender == this_owner || isApprovedForAll(this_owner, msg_sender) || getApproved(this_token_id) == msg_sender); } function is_owner(uint this_token_id, address requester)internal view returns (bool){ address this_owner = ownerOf(this_token_id); if(this_owner == requester){ return true; } return false; } function isApprovedForAll(address this_owner, address operator) public view returns (bool) { return operator_approvals[this_owner][operator]; } function getApproved(uint this_token_id) public view returns (address) { require(token_exists(this_token_id), "Token doesn't exist"); return approval_per_token[this_token_id]; } function token_exists(uint this_token_id) public view returns (bool) { return token_ownership[this_token_id] != address(0); } //...................................INTERFACES function supportsInterface(bytes4 interface_id) external pure returns (bool){ return interface_id == 0x80ac58cd; } function onERC721Received(address ,address ,uint256 ,bytes calldata ) external pure returns (bytes4){ return 0; } //..........................................UTILS function toString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } function bool_to_uint8(bool this_bool)internal pure returns(uint8){ if(this_bool == true){ return 1; } else{ return 0; } } } //.................. external contracts contract RESOURCE{ function transferFrom(address _from, address _to, uint256 _value) public {} } contract PR{ function is_personal_router(address p_router,address router_owner)public returns(bool){} } contract INVENTORY{ function move_asset_at_craft(address owner,address asset_address,uint token_id) public {} function move_asset(uint8 new_mode,address owner,address asset_address,uint token_id,uint8 weight) public {} } contract BUILDS{ function ownerOf(uint token_id)public returns(address){} function token_exists(uint token_id)public returns (bool){} }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"is_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"token_id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"is_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"token_id","type":"uint256"}],"name":"Asset_exploded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"build_token_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paint_product","type":"uint256"}],"name":"Build_paint_change","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"token_id","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"token_id","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"moved_to","type":"uint8"}],"name":"world_location_mode_changed","type":"event"},{"inputs":[],"name":"ASSET_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PR_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"this_token_id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"this_token_id","type":"uint256"}],"name":"asset_explode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"this_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buildings_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"this_token_id","type":"uint256"}],"name":"burn_token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"new_price","type":"uint256"}],"name":"change_asset_price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"this_token_id","type":"uint256"},{"internalType":"uint32","name":"pixels_used","type":"uint32"}],"name":"change_capacity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"requester","type":"address"},{"internalType":"uint256","name":"this_token_id","type":"uint256"},{"internalType":"uint8","name":"new_mode","type":"uint8"},{"internalType":"int32","name":"pos_x","type":"int32"},{"internalType":"int32","name":"pos_y","type":"int32"},{"internalType":"int32","name":"pos_z","type":"int32"},{"internalType":"uint16","name":"plot_id","type":"uint16"}],"name":"change_world_location_mode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"new_owner","type":"address"},{"internalType":"uint16","name":"plot_id","type":"uint16"},{"internalType":"uint32","name":"capacity","type":"uint32"},{"internalType":"uint8[]","name":"all_uints8","type":"uint8[]"},{"internalType":"bool[]","name":"all_bools","type":"bool[]"},{"internalType":"int32[]","name":"pos_array","type":"int32[]"}],"name":"craft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"this_token_id","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inventory_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"this_owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"this_token_id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"this_token_id","type":"uint256"},{"internalType":"uint256","name":"building_token_id","type":"uint256"}],"name":"paint_building","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"thi_address","type":"address"}],"name":"register_BUILDINGS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"thi_address","type":"address"}],"name":"register_INVENTORY","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"thi_address","type":"address"}],"name":"register_P_ROUTERS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"thi_address","type":"address"}],"name":"register_RESOURCE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resource_contract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"this_token_id","type":"uint256"}],"name":"retrieve_data","outputs":[{"internalType":"uint8[13]","name":"","type":"uint8[13]"},{"internalType":"int32[3]","name":"","type":"int32[3]"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"b_token_id","type":"uint256"}],"name":"retrieve_painted_building_data","outputs":[{"internalType":"uint8[8]","name":"","type":"uint8[8]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"this_token_id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"this_token_id","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"this_base_uri","type":"string"}],"name":"set_base_uri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interface_id","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"this_token_id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"this_token_id","type":"uint256"}],"name":"token_exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"this_token_id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]