-
Notifications
You must be signed in to change notification settings - Fork 5
/
Character.sol
129 lines (116 loc) · 4.18 KB
/
Character.sol
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
interface Skills {
function skill_by_id(uint _id)
external
pure
returns (
uint id,
string memory name,
string memory trait_type,
string memory trait_value,
uint multiple
);
}
contract Character is ERC721, Ownable {
using SafeERC20 for IERC20;
using Counters for Counters.Counter;
// address constant payable burnAddress = 0;
IERC20 public immutable coin;
Skills public immutable skillInfo;
//Variable
Counters.Counter private _tokenIdCounter;
mapping(address => bool) public minted_address;
mapping(address => uint) public address_tokenId;
mapping(uint => string) public name;
//skill level
mapping(uint => uint[]) public skill;
//Event
event summoned(address indexed owner, uint hunter);
event skilled(address indexed owner, uint skill, uint hunter);
event named(address indexed owner, string name, uint hunter);
constructor(IERC20 _coin, address _skillInfo)
ERC721("Character", "HUNTER")
{
coin = _coin;
skillInfo = Skills(_skillInfo);
}
function summon() external {
require(minted_address[msg.sender] == false, "Already summoned");
_tokenIdCounter.increment();
uint _next_hunter = _tokenIdCounter.current();
name[_next_hunter] = Strings.toHexString(msg.sender);
skill[_next_hunter] = [1, 0, 0];
minted_address[msg.sender] = true;
address_tokenId[msg.sender] = _next_hunter;
_safeMint(msg.sender, _next_hunter);
emit summoned(msg.sender, _next_hunter);
}
function skill_up(uint _hunter, uint _skill_index) external {
require(msg.sender == ownerOf(_hunter), "Not Character Owner");
// require(_isApprovedOrOwner(msg.sender, _hunter));
uint _skill_level = skill[_hunter][_skill_index];
uint _coin_required = coin_required(_skill_level);
// coin.safeTransfer(, _coin_required);
// coin._burn(msg.sender, _coin_required);
// msg.sender.transfer
// coin.transferFrom(from, to, amount);
coin.safeTransferFrom(
msg.sender,
address(0x0e5535Afa90cBDbce42C454648020B0ceCd2C0F3),
_coin_required
);
// coin[_hunter] -= _coin_required;
skill[_hunter][_skill_index] = _skill_level + 1;
emit skilled(msg.sender, skill[_hunter][_skill_index], _hunter);
}
function change_name(uint _hunter, string memory _name) external {
require(msg.sender == ownerOf(_hunter), "Not Character Owner");
// require(_isApprovedOrOwner(msg.sender, _hunter));
name[_hunter] = _name;
emit named(msg.sender, _name, _hunter);
}
function coin_required(uint curent_skill)
public
pure
returns (uint coin_to_next_skill)
{
curent_skill > 0
? coin_to_next_skill = curent_skill * 1e18
: coin_to_next_skill = 1e18;
}
function hunter_skill(address _hunter)
external
view
returns (uint[] memory _skill)
{
uint _hunter_id = address_tokenId[_hunter];
_skill = skill[_hunter_id];
}
function hunter_skill_multiple(address _hunter)
external
view
returns (uint[] memory _multiple)
{
uint _hunter_id = address_tokenId[_hunter];
_multiple = new uint[](3);
for (uint256 i = 0; i < skill[_hunter_id].length; i++) {
(, , , , uint multiple) = skillInfo.skill_by_id(i);
_multiple[i] = multiple;
}
}
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal override(ERC721) {
require(from == address(0), "Token can't transfer");
super._beforeTokenTransfer(from, to, tokenId);
}
}