@kub-chain/contracts 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +88 -0
- package/contracts/access/AccessController.sol +96 -0
- package/contracts/access/AccessControllerKAP.sol +116 -0
- package/contracts/access/Authorization.sol +36 -0
- package/contracts/access/AuthorizationKAP.sol +60 -0
- package/contracts/access/Committee.sol +26 -0
- package/contracts/access/Ownable.sol +39 -0
- package/contracts/interfaces/IAdminProjectRouter.sol +9 -0
- package/contracts/interfaces/IKYCBitkubChain.sol +8 -0
- package/contracts/kyc/KYCHandler.sol +24 -0
- package/contracts/libs/Address.sol +16 -0
- package/contracts/libs/EnumerableSetAddress.sol +70 -0
- package/contracts/libs/EnumerableSetUint.sol +74 -0
- package/contracts/libs/EnumerateMap.sol +136 -0
- package/contracts/libs/String.sol +26 -0
- package/contracts/token/KAP-1155/KAP1155.sol +493 -0
- package/contracts/token/KAP-1155/interfaces/IKAP1155.sol +69 -0
- package/contracts/token/KAP-1155/interfaces/IKAP1155Enumerable.sol +7 -0
- package/contracts/token/KAP-1155/interfaces/IKAP1155Metadata.sol +12 -0
- package/contracts/token/KAP-1155/interfaces/IKAP1155Receiver.sol +20 -0
- package/contracts/token/KAP-20/KAP20.sol +276 -0
- package/contracts/token/KAP-20/interfaces/IKAP20.sol +43 -0
- package/contracts/token/KAP-20/interfaces/IKToken.sol +17 -0
- package/contracts/token/KAP-22/KAP22.sol +358 -0
- package/contracts/token/KAP-22/interfaces/IKAP22.sol +23 -0
- package/contracts/token/KAP-22/utils/TransferRouter.sol +29 -0
- package/contracts/token/KAP-22/utils/WhitelistAddress.sol +35 -0
- package/contracts/token/KAP-721/KAP721.sol +416 -0
- package/contracts/token/KAP-721/interfaces/IKAP721.sol +60 -0
- package/contracts/token/KAP-721/interfaces/IKAP721Enumerable.sol +10 -0
- package/contracts/token/KAP-721/interfaces/IKAP721Metadata.sol +10 -0
- package/contracts/token/KAP-721/interfaces/IKAP721Receiver.sol +11 -0
- package/contracts/token/KAP-721/interfaces/IKAP721V2.sol +20 -0
- package/contracts/utils/Context.sol +13 -0
- package/contracts/utils/Pausable.sol +34 -0
- package/contracts/utils/introspections/IKAP165.sol +6 -0
- package/contracts/utils/introspections/KAP165.sol +12 -0
- package/package.json +26 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
//SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
pragma solidity >=0.6.0 <0.9.0;
|
|
4
|
+
|
|
5
|
+
import {IKAP165} from "../../../utils/introspections/IKAP165.sol";
|
|
6
|
+
|
|
7
|
+
interface IKAP1155 is IKAP165 {
|
|
8
|
+
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
|
|
9
|
+
|
|
10
|
+
event TransferBatch(
|
|
11
|
+
address indexed operator,
|
|
12
|
+
address indexed from,
|
|
13
|
+
address indexed to,
|
|
14
|
+
uint256[] ids,
|
|
15
|
+
uint256[] values
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
|
|
19
|
+
|
|
20
|
+
event URI(string value, uint256 indexed id);
|
|
21
|
+
|
|
22
|
+
function balanceOf(address account, uint256 id) external view returns (uint256);
|
|
23
|
+
|
|
24
|
+
function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
|
|
25
|
+
external
|
|
26
|
+
view
|
|
27
|
+
returns (uint256[] memory);
|
|
28
|
+
|
|
29
|
+
function setApprovalForAll(address operator, bool approved) external;
|
|
30
|
+
|
|
31
|
+
function isApprovedForAll(address account, address operator) external view returns (bool);
|
|
32
|
+
|
|
33
|
+
function adminTransfer(
|
|
34
|
+
address sender,
|
|
35
|
+
address recipient,
|
|
36
|
+
uint256 id,
|
|
37
|
+
uint256 amount
|
|
38
|
+
) external;
|
|
39
|
+
|
|
40
|
+
function internalTransfer(
|
|
41
|
+
address sender,
|
|
42
|
+
address recipient,
|
|
43
|
+
uint256 id,
|
|
44
|
+
uint256 amount
|
|
45
|
+
) external returns (bool);
|
|
46
|
+
|
|
47
|
+
function externalTransfer(
|
|
48
|
+
address sender,
|
|
49
|
+
address recipient,
|
|
50
|
+
uint256 id,
|
|
51
|
+
uint256 amount
|
|
52
|
+
) external returns (bool);
|
|
53
|
+
|
|
54
|
+
function safeTransferFrom(
|
|
55
|
+
address from,
|
|
56
|
+
address to,
|
|
57
|
+
uint256 id,
|
|
58
|
+
uint256 amount,
|
|
59
|
+
bytes calldata data
|
|
60
|
+
) external;
|
|
61
|
+
|
|
62
|
+
function safeBatchTransferFrom(
|
|
63
|
+
address from,
|
|
64
|
+
address to,
|
|
65
|
+
uint256[] calldata ids,
|
|
66
|
+
uint256[] calldata amounts,
|
|
67
|
+
bytes calldata data
|
|
68
|
+
) external;
|
|
69
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.0;
|
|
3
|
+
|
|
4
|
+
interface IKAP1155Metadata {
|
|
5
|
+
function name() external view returns (string memory);
|
|
6
|
+
|
|
7
|
+
function symbol() external view returns (string memory);
|
|
8
|
+
|
|
9
|
+
function uri(uint256 tokenId) external view returns (string memory);
|
|
10
|
+
|
|
11
|
+
function kapURI(uint256 tokenId) external view returns (string memory);
|
|
12
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.0;
|
|
3
|
+
|
|
4
|
+
interface IKAP1155Receiver {
|
|
5
|
+
function onKAP1155Received(
|
|
6
|
+
address operator,
|
|
7
|
+
address from,
|
|
8
|
+
uint256 id,
|
|
9
|
+
uint256 value,
|
|
10
|
+
bytes calldata data
|
|
11
|
+
) external returns (bytes4);
|
|
12
|
+
|
|
13
|
+
function onKAP1155BatchReceived(
|
|
14
|
+
address operator,
|
|
15
|
+
address from,
|
|
16
|
+
uint256[] calldata ids,
|
|
17
|
+
uint256[] calldata values,
|
|
18
|
+
bytes calldata data
|
|
19
|
+
) external returns (bytes4);
|
|
20
|
+
}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
//SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
pragma solidity ^0.8.0;
|
|
4
|
+
|
|
5
|
+
import {IKAP20} from "./interfaces/IKAP20.sol";
|
|
6
|
+
import {IKToken} from "./interfaces/IKToken.sol";
|
|
7
|
+
import {Pausable} from "../../utils/Pausable.sol";
|
|
8
|
+
import {AccessController} from "../../access/AccessController.sol";
|
|
9
|
+
import {IKYCBitkubChain} from "../../interfaces/IKYCBitkubChain.sol";
|
|
10
|
+
import {IAdminProjectRouter} from "../../interfaces/IAdminProjectRouter.sol";
|
|
11
|
+
|
|
12
|
+
abstract contract KAP20 is IKAP20, IKToken, Pausable, AccessController {
|
|
13
|
+
mapping(address => uint256) _balances;
|
|
14
|
+
|
|
15
|
+
mapping(address => mapping(address => uint256)) internal _allowances;
|
|
16
|
+
|
|
17
|
+
uint256 public override totalSupply;
|
|
18
|
+
string public override name;
|
|
19
|
+
string public override symbol;
|
|
20
|
+
uint8 public override decimals;
|
|
21
|
+
|
|
22
|
+
constructor(
|
|
23
|
+
string memory _name,
|
|
24
|
+
string memory _symbol,
|
|
25
|
+
string memory _projectName,
|
|
26
|
+
uint8 _decimals,
|
|
27
|
+
address _kyc,
|
|
28
|
+
address _adminProjectRouter,
|
|
29
|
+
address _committee,
|
|
30
|
+
address _transferRouter,
|
|
31
|
+
uint256 _acceptedKYCLevel
|
|
32
|
+
) {
|
|
33
|
+
name = _name;
|
|
34
|
+
symbol = _symbol;
|
|
35
|
+
PROJECT = _projectName;
|
|
36
|
+
decimals = _decimals;
|
|
37
|
+
kyc = IKYCBitkubChain(_kyc);
|
|
38
|
+
adminProjectRouter = IAdminProjectRouter(_adminProjectRouter);
|
|
39
|
+
committee = _committee;
|
|
40
|
+
transferRouter = _transferRouter;
|
|
41
|
+
acceptedKYCLevel = _acceptedKYCLevel;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function balanceOf(address account)
|
|
45
|
+
public
|
|
46
|
+
view
|
|
47
|
+
virtual
|
|
48
|
+
override
|
|
49
|
+
returns (uint256)
|
|
50
|
+
{
|
|
51
|
+
return _balances[account];
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function transfer(address recipient, uint256 amount)
|
|
55
|
+
public
|
|
56
|
+
virtual
|
|
57
|
+
override
|
|
58
|
+
whenNotPaused
|
|
59
|
+
returns (bool)
|
|
60
|
+
{
|
|
61
|
+
_transfer(msg.sender, recipient, amount);
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function allowance(address owner, address spender)
|
|
66
|
+
public
|
|
67
|
+
view
|
|
68
|
+
virtual
|
|
69
|
+
override
|
|
70
|
+
returns (uint256)
|
|
71
|
+
{
|
|
72
|
+
return _allowances[owner][spender];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function approve(address spender, uint256 amount)
|
|
76
|
+
public
|
|
77
|
+
virtual
|
|
78
|
+
override
|
|
79
|
+
returns (bool)
|
|
80
|
+
{
|
|
81
|
+
_approve(msg.sender, spender, amount);
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function adminApprove(
|
|
86
|
+
address owner,
|
|
87
|
+
address spender,
|
|
88
|
+
uint256 amount
|
|
89
|
+
)
|
|
90
|
+
public
|
|
91
|
+
virtual
|
|
92
|
+
override
|
|
93
|
+
whenNotPaused
|
|
94
|
+
onlySuperAdminOrAdmin
|
|
95
|
+
returns (bool)
|
|
96
|
+
{
|
|
97
|
+
require(
|
|
98
|
+
kyc.kycsLevel(owner) >= acceptedKYCLevel &&
|
|
99
|
+
kyc.kycsLevel(spender) >= acceptedKYCLevel,
|
|
100
|
+
"KAP20: owner or spender address is not a KYC user"
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
_approve(owner, spender, amount);
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function transferFrom(
|
|
108
|
+
address sender,
|
|
109
|
+
address recipient,
|
|
110
|
+
uint256 amount
|
|
111
|
+
) public virtual override whenNotPaused returns (bool) {
|
|
112
|
+
_transfer(sender, recipient, amount);
|
|
113
|
+
|
|
114
|
+
uint256 currentAllowance = _allowances[sender][msg.sender];
|
|
115
|
+
require(
|
|
116
|
+
currentAllowance >= amount,
|
|
117
|
+
"KAP20: transfer amount exceeds allowance"
|
|
118
|
+
);
|
|
119
|
+
unchecked {
|
|
120
|
+
_approve(sender, msg.sender, currentAllowance - amount);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function increaseAllowance(address spender, uint256 addedValue)
|
|
127
|
+
public
|
|
128
|
+
virtual
|
|
129
|
+
returns (bool)
|
|
130
|
+
{
|
|
131
|
+
_approve(
|
|
132
|
+
msg.sender,
|
|
133
|
+
spender,
|
|
134
|
+
_allowances[msg.sender][spender] + addedValue
|
|
135
|
+
);
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function decreaseAllowance(address spender, uint256 subtractedValue)
|
|
140
|
+
public
|
|
141
|
+
virtual
|
|
142
|
+
returns (bool)
|
|
143
|
+
{
|
|
144
|
+
uint256 currentAllowance = _allowances[msg.sender][spender];
|
|
145
|
+
require(
|
|
146
|
+
currentAllowance >= subtractedValue,
|
|
147
|
+
"KAP20: decreased allowance below zero"
|
|
148
|
+
);
|
|
149
|
+
unchecked {
|
|
150
|
+
_approve(msg.sender, spender, currentAllowance - subtractedValue);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function _transfer(
|
|
157
|
+
address sender,
|
|
158
|
+
address recipient,
|
|
159
|
+
uint256 amount
|
|
160
|
+
) internal virtual {
|
|
161
|
+
require(sender != address(0), "KAP20: transfer from the zero address");
|
|
162
|
+
require(recipient != address(0), "KAP20: transfer to the zero address");
|
|
163
|
+
|
|
164
|
+
uint256 senderBalance = _balances[sender];
|
|
165
|
+
require(
|
|
166
|
+
senderBalance >= amount,
|
|
167
|
+
"KAP20: transfer amount exceeds balance"
|
|
168
|
+
);
|
|
169
|
+
unchecked {
|
|
170
|
+
_balances[sender] = senderBalance - amount;
|
|
171
|
+
}
|
|
172
|
+
_balances[recipient] += amount;
|
|
173
|
+
|
|
174
|
+
emit Transfer(sender, recipient, amount);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function _mint(address account, uint256 amount) internal virtual {
|
|
178
|
+
require(account != address(0), "KAP20: mint to the zero address");
|
|
179
|
+
|
|
180
|
+
totalSupply += amount;
|
|
181
|
+
_balances[account] += amount;
|
|
182
|
+
emit Transfer(address(0), account, amount);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function _burn(address account, uint256 amount) internal virtual {
|
|
186
|
+
require(account != address(0), "KAP20: burn from the zero address");
|
|
187
|
+
|
|
188
|
+
uint256 accountBalance = _balances[account];
|
|
189
|
+
require(accountBalance >= amount, "KAP20: burn amount exceeds balance");
|
|
190
|
+
unchecked {
|
|
191
|
+
_balances[account] = accountBalance - amount;
|
|
192
|
+
}
|
|
193
|
+
totalSupply -= amount;
|
|
194
|
+
|
|
195
|
+
emit Transfer(account, address(0), amount);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function _approve(
|
|
199
|
+
address owner,
|
|
200
|
+
address spender,
|
|
201
|
+
uint256 amount
|
|
202
|
+
) internal virtual {
|
|
203
|
+
require(owner != address(0), "KAP20: approve from the zero address");
|
|
204
|
+
require(spender != address(0), "KAP20: approve to the zero address");
|
|
205
|
+
|
|
206
|
+
_allowances[owner][spender] = amount;
|
|
207
|
+
emit Approval(owner, spender, amount);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function adminTransfer(
|
|
211
|
+
address sender,
|
|
212
|
+
address recipient,
|
|
213
|
+
uint256 amount
|
|
214
|
+
) public virtual override onlyCommittee returns (bool) {
|
|
215
|
+
if (isActivatedOnlyKYCAddress) {
|
|
216
|
+
require(
|
|
217
|
+
kyc.kycsLevel(sender) > 0 && kyc.kycsLevel(recipient) > 0,
|
|
218
|
+
"KAP20: only internal purpose"
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
uint256 senderBalance = _balances[sender];
|
|
222
|
+
require(
|
|
223
|
+
senderBalance >= amount,
|
|
224
|
+
"KAP20: transfer amount exceeds balance"
|
|
225
|
+
);
|
|
226
|
+
unchecked {
|
|
227
|
+
_balances[sender] = senderBalance - amount;
|
|
228
|
+
}
|
|
229
|
+
_balances[recipient] += amount;
|
|
230
|
+
|
|
231
|
+
emit Transfer(sender, recipient, amount);
|
|
232
|
+
|
|
233
|
+
return true;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function internalTransfer(
|
|
237
|
+
address sender,
|
|
238
|
+
address recipient,
|
|
239
|
+
uint256 amount
|
|
240
|
+
)
|
|
241
|
+
external
|
|
242
|
+
override
|
|
243
|
+
whenNotPaused
|
|
244
|
+
onlySuperAdminOrTransferRouter
|
|
245
|
+
returns (bool)
|
|
246
|
+
{
|
|
247
|
+
require(
|
|
248
|
+
kyc.kycsLevel(sender) >= acceptedKYCLevel &&
|
|
249
|
+
kyc.kycsLevel(recipient) >= acceptedKYCLevel,
|
|
250
|
+
"KAP20: only internal purpose"
|
|
251
|
+
);
|
|
252
|
+
|
|
253
|
+
_transfer(sender, recipient, amount);
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
function externalTransfer(
|
|
258
|
+
address sender,
|
|
259
|
+
address recipient,
|
|
260
|
+
uint256 amount
|
|
261
|
+
)
|
|
262
|
+
external
|
|
263
|
+
override
|
|
264
|
+
whenNotPaused
|
|
265
|
+
onlySuperAdminOrTransferRouter
|
|
266
|
+
returns (bool)
|
|
267
|
+
{
|
|
268
|
+
require(
|
|
269
|
+
kyc.kycsLevel(sender) >= acceptedKYCLevel,
|
|
270
|
+
"KAP20: only internal purpose"
|
|
271
|
+
);
|
|
272
|
+
|
|
273
|
+
_transfer(sender, recipient, amount);
|
|
274
|
+
return true;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
//SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
pragma solidity >=0.6.0 <0.9.0;
|
|
4
|
+
|
|
5
|
+
interface IKAP20 {
|
|
6
|
+
function totalSupply() external view returns (uint256);
|
|
7
|
+
|
|
8
|
+
function decimals() external view returns (uint8);
|
|
9
|
+
|
|
10
|
+
function symbol() external view returns (string memory);
|
|
11
|
+
|
|
12
|
+
function name() external view returns (string memory);
|
|
13
|
+
|
|
14
|
+
function balanceOf(address account) external view returns (uint256);
|
|
15
|
+
|
|
16
|
+
function transfer(address recipient, uint256 amount) external returns (bool);
|
|
17
|
+
|
|
18
|
+
function allowance(address owner, address spender) external view returns (uint256);
|
|
19
|
+
|
|
20
|
+
function approve(address spender, uint256 amount) external returns (bool);
|
|
21
|
+
|
|
22
|
+
function adminApprove(
|
|
23
|
+
address owner,
|
|
24
|
+
address spender,
|
|
25
|
+
uint256 amount
|
|
26
|
+
) external returns (bool);
|
|
27
|
+
|
|
28
|
+
function transferFrom(
|
|
29
|
+
address sender,
|
|
30
|
+
address recipient,
|
|
31
|
+
uint256 amount
|
|
32
|
+
) external returns (bool);
|
|
33
|
+
|
|
34
|
+
function adminTransfer(
|
|
35
|
+
address sender,
|
|
36
|
+
address recipient,
|
|
37
|
+
uint256 amount
|
|
38
|
+
) external returns (bool);
|
|
39
|
+
|
|
40
|
+
event Transfer(address indexed from, address indexed to, uint256 value);
|
|
41
|
+
|
|
42
|
+
event Approval(address indexed owner, address indexed spender, uint256 value);
|
|
43
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
pragma solidity >=0.6.0 <0.9.0;
|
|
4
|
+
|
|
5
|
+
interface IKToken {
|
|
6
|
+
function internalTransfer(
|
|
7
|
+
address sender,
|
|
8
|
+
address recipient,
|
|
9
|
+
uint256 amount
|
|
10
|
+
) external returns (bool);
|
|
11
|
+
|
|
12
|
+
function externalTransfer(
|
|
13
|
+
address sender,
|
|
14
|
+
address recipient,
|
|
15
|
+
uint256 amount
|
|
16
|
+
) external returns (bool);
|
|
17
|
+
}
|