-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathResourcesERC1155.sol
More file actions
100 lines (80 loc) · 2.93 KB
/
Copy pathResourcesERC1155.sol
File metadata and controls
100 lines (80 loc) · 2.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/AccessControlEnumerable.sol";
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "../mixins/ERC1155TradableMixin.sol";
contract ResourcesERC1155 is ERC1155TradableMixin {
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE");
bytes32 public constant CREATOR_ROLE = keccak256("CREATOR_ROLE");
struct Metadata {
string name;
uint8 typeId;
uint8 subtypeId;
}
struct Attributes {
uint8 attr1;
int8 value1;
uint8 attr2;
int8 value2;
uint8 attr3;
int8 value3;
uint8 attr4;
int8 value4;
uint8 attr5;
int8 value5;
// uint8 attr6;
// int8 value6;
}
event MetadataUpdated(uint256 indexed _id, Metadata _metadata);
event AttributesUpdated(uint256 indexed _id, Attributes _attributes);
mapping(uint256 => Metadata) public metadata;
mapping(uint256 => Attributes) public attributes;
mapping(uint256 => bool) private _registered;
string private __contractURI;
constructor(string memory _uri, string memory _initContractURI) ERC1155TradableMixin(_uri) {
__contractURI = _initContractURI;
}
function mint(
address to,
uint256 id,
uint256 amount
) public onlyRole(MINTER_ROLE) {
require(_registered[id], "resource is not registered.");
_mint(to, id, amount, "");
}
function burn(
address account,
uint256 id,
uint256 value
) public onlyRole(BURNER_ROLE) {
_burn(account, id, value);
}
function registerItem(uint256 _id, Metadata calldata _metadata) public onlyRole(CREATOR_ROLE) {
require(!_registered[_id], "resource already registered.");
_registered[_id] = true;
metadata[_id] = _metadata;
_mint(_msgSender(), _id, 0, "");
emit MetadataUpdated(_id, _metadata);
}
function updateMetadata(uint256 _id, Metadata calldata _metadata) public onlyRole(CREATOR_ROLE) {
require(_registered[_id], "resource is not registered.");
metadata[_id] = _metadata;
emit MetadataUpdated(_id, _metadata);
}
function updateAttributes(uint256 _id, Attributes calldata _attributes) public onlyRole(CREATOR_ROLE) {
require(_registered[_id], "resource is not registered.");
attributes[_id] = _attributes;
emit AttributesUpdated(_id, _attributes);
}
function registered(uint256 _id) public view returns (bool) {
return _registered[_id];
}
function contractURI() public view returns (string memory) {
return __contractURI;
}
function setContractURI(string memory _uri) public onlyRole(DEFAULT_ADMIN_ROLE) {
__contractURI = _uri;
}
}