Contract : 0xc0d3ad5c54efa287021cd1f31eefc78fb98260df
Featured: Register HENS (.etc) Domain Name Click to register
Balance:
0 ETC ( $0 )
Token:
0 TOKEN
More Info
Contract name:
tmwstw_paint_products
Optimization enabled :
true
Compiler version:
v0.8.11+commit.d7f03943
EVM Version:
berlin
Contract source code
// 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){}
}
Contract ABI
[{"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"}]