@evvm/testnet-contracts 2.2.2 → 2.3.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/LICENSE +145 -118
- package/README.md +135 -42
- package/contracts/evvm/Evvm.sol +154 -181
- package/contracts/evvm/lib/ErrorsLib.sol +119 -6
- package/contracts/evvm/lib/EvvmStorage.sol +164 -9
- package/contracts/evvm/lib/EvvmStructs.sol +124 -6
- package/contracts/evvm/lib/SignatureUtils.sol +103 -61
- package/contracts/nameService/NameService.sol +165 -155
- package/contracts/nameService/lib/ErrorsLib.sol +142 -8
- package/contracts/nameService/lib/IdentityValidation.sol +21 -0
- package/contracts/nameService/lib/NameServiceStructs.sol +75 -19
- package/contracts/nameService/lib/SignatureUtils.sol +235 -60
- package/contracts/p2pSwap/P2PSwap.sol +205 -164
- package/contracts/staking/Estimator.sol +131 -24
- package/contracts/staking/Staking.sol +98 -113
- package/contracts/staking/lib/ErrorsLib.sol +79 -3
- package/contracts/staking/lib/SignatureUtils.sol +82 -16
- package/contracts/staking/lib/StakingStructs.sol +12 -0
- package/contracts/treasury/Treasury.sol +30 -12
- package/contracts/treasury/lib/ErrorsLib.sol +30 -0
- package/contracts/treasuryTwoChains/TreasuryHostChainStation.sol +3 -3
- package/interfaces/IEvvm.sol +9 -4
- package/interfaces/INameService.sol +12 -3
- package/interfaces/IStaking.sol +2 -1
- package/library/Erc191TestBuilder.sol +188 -0
- package/library/EvvmService.sol +55 -0
- package/library/primitives/SignatureRecover.sol +33 -0
- package/library/utils/AdvancedStrings.sol +61 -0
- package/library/utils/SignatureUtil.sol +34 -0
- package/library/utils/nonces/AsyncNonce.sol +42 -0
- package/library/utils/nonces/SyncNonce.sol +44 -0
- package/library/utils/service/EvvmPayments.sol +68 -1
- package/library/utils/service/StakingServiceUtils.sol +44 -0
- package/package.json +2 -1
|
@@ -56,7 +56,7 @@ pragma solidity ^0.8.0;
|
|
|
56
56
|
* - Marketplace takes 0.5% fee on username sales
|
|
57
57
|
*/
|
|
58
58
|
|
|
59
|
-
import {
|
|
59
|
+
import {Evvm} from "@evvm/testnet-contracts/contracts/evvm/Evvm.sol";
|
|
60
60
|
import {
|
|
61
61
|
AsyncNonce
|
|
62
62
|
} from "@evvm/testnet-contracts/library/utils/nonces/AsyncNonce.sol";
|
|
@@ -80,10 +80,6 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
80
80
|
/// @dev Time delay constant for accepting proposals
|
|
81
81
|
uint256 constant TIME_TO_ACCEPT_PROPOSAL = 1 days;
|
|
82
82
|
|
|
83
|
-
/// @dev Constant address representing the Principal Token in the EVVM ecosystem
|
|
84
|
-
address private constant PRINCIPAL_TOKEN_ADDRESS =
|
|
85
|
-
0x0000000000000000000000000000000000000001;
|
|
86
|
-
|
|
87
83
|
/// @dev Amount of Principal Tokens locked in pending marketplace offers
|
|
88
84
|
uint256 private principalTokenTokenLockedForWithdrawOffers;
|
|
89
85
|
|
|
@@ -108,7 +104,8 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
108
104
|
mapping(string username => IdentityBaseMetadata basicMetadata)
|
|
109
105
|
private identityDetails;
|
|
110
106
|
|
|
111
|
-
|
|
107
|
+
/// @dev Instance of the EVVM core contract for payment processing and token operations
|
|
108
|
+
Evvm private evvm;
|
|
112
109
|
|
|
113
110
|
/// @dev Restricts function access to the current admin address only
|
|
114
111
|
modifier onlyAdmin() {
|
|
@@ -117,14 +114,6 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
117
114
|
_;
|
|
118
115
|
}
|
|
119
116
|
|
|
120
|
-
/// @dev Verifies that the caller owns the specified identity/username
|
|
121
|
-
modifier onlyOwnerOfIdentity(address _user, string memory _identity) {
|
|
122
|
-
if (identityDetails[_identity].owner != _user)
|
|
123
|
-
revert ErrorsLib.UserIsNotOwnerOfIdentity();
|
|
124
|
-
|
|
125
|
-
_;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
117
|
/**
|
|
129
118
|
* @notice Initializes the NameService contract
|
|
130
119
|
* @dev Sets up the EVVM integration and initial admin
|
|
@@ -134,7 +123,7 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
134
123
|
constructor(address _evvmAddress, address _initialOwner) {
|
|
135
124
|
evvmAddress.current = _evvmAddress;
|
|
136
125
|
admin.current = _initialOwner;
|
|
137
|
-
evvm =
|
|
126
|
+
evvm = Evvm(_evvmAddress);
|
|
138
127
|
}
|
|
139
128
|
|
|
140
129
|
/**
|
|
@@ -161,7 +150,7 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
161
150
|
) external {
|
|
162
151
|
if (
|
|
163
152
|
!SignatureUtils.verifyMessageSignedForPreRegistrationUsername(
|
|
164
|
-
|
|
153
|
+
evvm.getEvvmID(),
|
|
165
154
|
user,
|
|
166
155
|
hashPreRegisteredUsername,
|
|
167
156
|
nonce,
|
|
@@ -171,8 +160,8 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
171
160
|
|
|
172
161
|
verifyAsyncNonce(user, nonce);
|
|
173
162
|
|
|
174
|
-
if (priorityFee_EVVM > 0)
|
|
175
|
-
|
|
163
|
+
if (priorityFee_EVVM > 0)
|
|
164
|
+
requestPay(
|
|
176
165
|
user,
|
|
177
166
|
0,
|
|
178
167
|
priorityFee_EVVM,
|
|
@@ -180,14 +169,13 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
180
169
|
priorityFlag_EVVM,
|
|
181
170
|
signature_EVVM
|
|
182
171
|
);
|
|
183
|
-
}
|
|
184
172
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
173
|
+
identityDetails[
|
|
174
|
+
string.concat(
|
|
175
|
+
"@",
|
|
176
|
+
AdvancedStrings.bytes32ToString(hashPreRegisteredUsername)
|
|
177
|
+
)
|
|
178
|
+
] = IdentityBaseMetadata({
|
|
191
179
|
owner: user,
|
|
192
180
|
expireDate: block.timestamp + 30 minutes,
|
|
193
181
|
customMetadataMaxSlots: 0,
|
|
@@ -197,12 +185,8 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
197
185
|
|
|
198
186
|
markAsyncNonceAsUsed(user, nonce);
|
|
199
187
|
|
|
200
|
-
if (
|
|
201
|
-
makeCaPay(
|
|
202
|
-
msg.sender,
|
|
203
|
-
IEvvm(evvmAddress.current).getRewardAmount() + priorityFee_EVVM
|
|
204
|
-
);
|
|
205
|
-
}
|
|
188
|
+
if (evvm.isAddressStaker(msg.sender))
|
|
189
|
+
makeCaPay(msg.sender, evvm.getRewardAmount() + priorityFee_EVVM);
|
|
206
190
|
}
|
|
207
191
|
|
|
208
192
|
/**
|
|
@@ -229,17 +213,9 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
229
213
|
bool priorityFlag_EVVM,
|
|
230
214
|
bytes memory signature_EVVM
|
|
231
215
|
) external {
|
|
232
|
-
if (
|
|
233
|
-
admin.current != user &&
|
|
234
|
-
!IdentityValidation.isValidUsername(username)
|
|
235
|
-
) revert ErrorsLib.InvalidUsername();
|
|
236
|
-
|
|
237
|
-
if (!isUsernameAvailable(username))
|
|
238
|
-
revert ErrorsLib.UsernameAlreadyRegistered();
|
|
239
|
-
|
|
240
216
|
if (
|
|
241
217
|
!SignatureUtils.verifyMessageSignedForRegistrationUsername(
|
|
242
|
-
|
|
218
|
+
evvm.getEvvmID(),
|
|
243
219
|
user,
|
|
244
220
|
username,
|
|
245
221
|
clowNumber,
|
|
@@ -248,9 +224,17 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
248
224
|
)
|
|
249
225
|
) revert ErrorsLib.InvalidSignatureOnNameService();
|
|
250
226
|
|
|
227
|
+
if (
|
|
228
|
+
admin.current != user &&
|
|
229
|
+
!IdentityValidation.isValidUsername(username)
|
|
230
|
+
) revert ErrorsLib.InvalidUsername();
|
|
231
|
+
|
|
232
|
+
if (!isUsernameAvailable(username))
|
|
233
|
+
revert ErrorsLib.UsernameAlreadyRegistered();
|
|
234
|
+
|
|
251
235
|
verifyAsyncNonce(user, nonce);
|
|
252
236
|
|
|
253
|
-
|
|
237
|
+
requestPay(
|
|
254
238
|
user,
|
|
255
239
|
getPriceOfRegistration(username),
|
|
256
240
|
priorityFee_EVVM,
|
|
@@ -279,13 +263,11 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
279
263
|
|
|
280
264
|
markAsyncNonceAsUsed(user, nonce);
|
|
281
265
|
|
|
282
|
-
if (
|
|
266
|
+
if (evvm.isAddressStaker(msg.sender))
|
|
283
267
|
makeCaPay(
|
|
284
268
|
msg.sender,
|
|
285
|
-
(50 *
|
|
286
|
-
priorityFee_EVVM
|
|
269
|
+
(50 * evvm.getRewardAmount()) + priorityFee_EVVM
|
|
287
270
|
);
|
|
288
|
-
}
|
|
289
271
|
|
|
290
272
|
delete identityDetails[_key];
|
|
291
273
|
}
|
|
@@ -317,16 +299,9 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
317
299
|
bool priorityFlag_EVVM,
|
|
318
300
|
bytes memory signature_EVVM
|
|
319
301
|
) external returns (uint256 offerID) {
|
|
320
|
-
if (
|
|
321
|
-
identityDetails[username].flagNotAUsername == 0x01 ||
|
|
322
|
-
!verifyIfIdentityExists(username) ||
|
|
323
|
-
amount == 0 ||
|
|
324
|
-
expireDate <= block.timestamp
|
|
325
|
-
) revert ErrorsLib.PreRegistrationNotValid();
|
|
326
|
-
|
|
327
302
|
if (
|
|
328
303
|
!SignatureUtils.verifyMessageSignedForMakeOffer(
|
|
329
|
-
|
|
304
|
+
evvm.getEvvmID(),
|
|
330
305
|
user,
|
|
331
306
|
username,
|
|
332
307
|
expireDate,
|
|
@@ -336,9 +311,19 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
336
311
|
)
|
|
337
312
|
) revert ErrorsLib.InvalidSignatureOnNameService();
|
|
338
313
|
|
|
314
|
+
if (
|
|
315
|
+
identityDetails[username].flagNotAUsername == 0x01 ||
|
|
316
|
+
!verifyIfIdentityExists(username)
|
|
317
|
+
) revert ErrorsLib.InvalidUsername();
|
|
318
|
+
|
|
319
|
+
if (expireDate <= block.timestamp)
|
|
320
|
+
revert ErrorsLib.CannotBeBeforeCurrentTime();
|
|
321
|
+
|
|
322
|
+
if (amount == 0) revert ErrorsLib.AmountMustBeGreaterThanZero();
|
|
323
|
+
|
|
339
324
|
verifyAsyncNonce(user, nonce);
|
|
340
325
|
|
|
341
|
-
|
|
326
|
+
requestPay(
|
|
342
327
|
user,
|
|
343
328
|
amount,
|
|
344
329
|
priorityFee_EVVM,
|
|
@@ -347,24 +332,26 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
347
332
|
signature_EVVM
|
|
348
333
|
);
|
|
349
334
|
|
|
350
|
-
while (usernameOffers[username][offerID].offerer != address(0))
|
|
335
|
+
while (usernameOffers[username][offerID].offerer != address(0))
|
|
351
336
|
offerID++;
|
|
352
|
-
|
|
337
|
+
|
|
338
|
+
uint256 amountToOffer = ((amount * 995) / 1000);
|
|
353
339
|
|
|
354
340
|
usernameOffers[username][offerID] = OfferMetadata({
|
|
355
341
|
offerer: user,
|
|
356
342
|
expireDate: expireDate,
|
|
357
|
-
amount:
|
|
343
|
+
amount: amountToOffer
|
|
358
344
|
});
|
|
359
345
|
|
|
360
346
|
makeCaPay(
|
|
361
347
|
msg.sender,
|
|
362
|
-
|
|
348
|
+
evvm.getRewardAmount() +
|
|
363
349
|
((amount * 125) / 100_000) +
|
|
364
350
|
priorityFee_EVVM
|
|
365
351
|
);
|
|
352
|
+
|
|
366
353
|
principalTokenTokenLockedForWithdrawOffers +=
|
|
367
|
-
|
|
354
|
+
amountToOffer +
|
|
368
355
|
(amount / 800);
|
|
369
356
|
|
|
370
357
|
if (offerID > identityDetails[username].offerMaxSlots) {
|
|
@@ -400,12 +387,9 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
400
387
|
bool priorityFlag_EVVM,
|
|
401
388
|
bytes memory signature_EVVM
|
|
402
389
|
) external {
|
|
403
|
-
if (usernameOffers[username][offerID].offerer != user)
|
|
404
|
-
revert ErrorsLib.UserIsNotOwnerOfOffer();
|
|
405
|
-
|
|
406
390
|
if (
|
|
407
391
|
!SignatureUtils.verifyMessageSignedForWithdrawOffer(
|
|
408
|
-
|
|
392
|
+
evvm.getEvvmID(),
|
|
409
393
|
user,
|
|
410
394
|
username,
|
|
411
395
|
offerID,
|
|
@@ -414,10 +398,13 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
414
398
|
)
|
|
415
399
|
) revert ErrorsLib.InvalidSignatureOnNameService();
|
|
416
400
|
|
|
401
|
+
if (usernameOffers[username][offerID].offerer != user)
|
|
402
|
+
revert ErrorsLib.UserIsNotOwnerOfOffer();
|
|
403
|
+
|
|
417
404
|
verifyAsyncNonce(user, nonce);
|
|
418
405
|
|
|
419
|
-
if (priorityFee_EVVM > 0)
|
|
420
|
-
|
|
406
|
+
if (priorityFee_EVVM > 0)
|
|
407
|
+
requestPay(
|
|
421
408
|
user,
|
|
422
409
|
0,
|
|
423
410
|
priorityFee_EVVM,
|
|
@@ -425,7 +412,6 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
425
412
|
priorityFlag_EVVM,
|
|
426
413
|
signature_EVVM
|
|
427
414
|
);
|
|
428
|
-
}
|
|
429
415
|
|
|
430
416
|
makeCaPay(user, usernameOffers[username][offerID].amount);
|
|
431
417
|
|
|
@@ -433,7 +419,7 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
433
419
|
|
|
434
420
|
makeCaPay(
|
|
435
421
|
msg.sender,
|
|
436
|
-
|
|
422
|
+
evvm.getRewardAmount() +
|
|
437
423
|
((usernameOffers[username][offerID].amount * 1) / 796) +
|
|
438
424
|
priorityFee_EVVM
|
|
439
425
|
);
|
|
@@ -468,15 +454,10 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
468
454
|
uint256 nonce_EVVM,
|
|
469
455
|
bool priorityFlag_EVVM,
|
|
470
456
|
bytes memory signature_EVVM
|
|
471
|
-
) external
|
|
472
|
-
if (
|
|
473
|
-
usernameOffers[username][offerID].offerer == address(0) ||
|
|
474
|
-
usernameOffers[username][offerID].expireDate < block.timestamp
|
|
475
|
-
) revert ErrorsLib.AcceptOfferVerificationFailed();
|
|
476
|
-
|
|
457
|
+
) external {
|
|
477
458
|
if (
|
|
478
459
|
!SignatureUtils.verifyMessageSignedForAcceptOffer(
|
|
479
|
-
|
|
460
|
+
evvm.getEvvmID(),
|
|
480
461
|
user,
|
|
481
462
|
username,
|
|
482
463
|
offerID,
|
|
@@ -485,10 +466,18 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
485
466
|
)
|
|
486
467
|
) revert ErrorsLib.InvalidSignatureOnNameService();
|
|
487
468
|
|
|
469
|
+
if (identityDetails[username].owner != user)
|
|
470
|
+
revert ErrorsLib.UserIsNotOwnerOfIdentity();
|
|
471
|
+
|
|
472
|
+
if (
|
|
473
|
+
usernameOffers[username][offerID].offerer == address(0) ||
|
|
474
|
+
usernameOffers[username][offerID].expireDate < block.timestamp
|
|
475
|
+
) revert ErrorsLib.OfferInactive();
|
|
476
|
+
|
|
488
477
|
verifyAsyncNonce(user, nonce);
|
|
489
478
|
|
|
490
479
|
if (priorityFee_EVVM > 0) {
|
|
491
|
-
|
|
480
|
+
requestPay(
|
|
492
481
|
user,
|
|
493
482
|
0,
|
|
494
483
|
priorityFee_EVVM,
|
|
@@ -505,10 +494,10 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
505
494
|
|
|
506
495
|
usernameOffers[username][offerID].offerer = address(0);
|
|
507
496
|
|
|
508
|
-
if (
|
|
497
|
+
if (evvm.isAddressStaker(msg.sender)) {
|
|
509
498
|
makeCaPay(
|
|
510
499
|
msg.sender,
|
|
511
|
-
(
|
|
500
|
+
(evvm.getRewardAmount()) +
|
|
512
501
|
(((usernameOffers[username][offerID].amount * 1) / 199) /
|
|
513
502
|
4) +
|
|
514
503
|
priorityFee_EVVM
|
|
@@ -550,15 +539,10 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
550
539
|
uint256 nonce_EVVM,
|
|
551
540
|
bool priorityFlag_EVVM,
|
|
552
541
|
bytes memory signature_EVVM
|
|
553
|
-
) external
|
|
554
|
-
if (
|
|
555
|
-
identityDetails[username].flagNotAUsername == 0x01 ||
|
|
556
|
-
identityDetails[username].expireDate > block.timestamp + 36500 days
|
|
557
|
-
) revert ErrorsLib.RenewUsernameVerificationFailed();
|
|
558
|
-
|
|
542
|
+
) external {
|
|
559
543
|
if (
|
|
560
544
|
!SignatureUtils.verifyMessageSignedForRenewUsername(
|
|
561
|
-
|
|
545
|
+
evvm.getEvvmID(),
|
|
562
546
|
user,
|
|
563
547
|
username,
|
|
564
548
|
nonce,
|
|
@@ -566,11 +550,20 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
566
550
|
)
|
|
567
551
|
) revert ErrorsLib.InvalidSignatureOnNameService();
|
|
568
552
|
|
|
553
|
+
if (identityDetails[username].owner != user)
|
|
554
|
+
revert ErrorsLib.UserIsNotOwnerOfIdentity();
|
|
555
|
+
|
|
556
|
+
if (identityDetails[username].flagNotAUsername == 0x01)
|
|
557
|
+
revert ErrorsLib.IdentityIsNotAUsername();
|
|
558
|
+
|
|
559
|
+
if (identityDetails[username].expireDate > block.timestamp + 36500 days)
|
|
560
|
+
revert ErrorsLib.RenewalTimeLimitExceeded();
|
|
561
|
+
|
|
569
562
|
verifyAsyncNonce(user, nonce);
|
|
570
563
|
|
|
571
564
|
uint256 priceOfRenew = seePriceToRenew(username);
|
|
572
565
|
|
|
573
|
-
|
|
566
|
+
requestPay(
|
|
574
567
|
user,
|
|
575
568
|
priceOfRenew,
|
|
576
569
|
priorityFee_EVVM,
|
|
@@ -579,10 +572,10 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
579
572
|
signature_EVVM
|
|
580
573
|
);
|
|
581
574
|
|
|
582
|
-
if (
|
|
575
|
+
if (evvm.isAddressStaker(msg.sender)) {
|
|
583
576
|
makeCaPay(
|
|
584
577
|
msg.sender,
|
|
585
|
-
|
|
578
|
+
evvm.getRewardAmount() +
|
|
586
579
|
((priceOfRenew * 50) / 100) +
|
|
587
580
|
priorityFee_EVVM
|
|
588
581
|
);
|
|
@@ -629,12 +622,10 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
629
622
|
uint256 nonce_EVVM,
|
|
630
623
|
bool priorityFlag_EVVM,
|
|
631
624
|
bytes memory signature_EVVM
|
|
632
|
-
) external
|
|
633
|
-
if (bytes(value).length == 0) revert ErrorsLib.EmptyCustomMetadata();
|
|
634
|
-
|
|
625
|
+
) external {
|
|
635
626
|
if (
|
|
636
627
|
!SignatureUtils.verifyMessageSignedForAddCustomMetadata(
|
|
637
|
-
|
|
628
|
+
evvm.getEvvmID(),
|
|
638
629
|
user,
|
|
639
630
|
identity,
|
|
640
631
|
value,
|
|
@@ -643,9 +634,14 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
643
634
|
)
|
|
644
635
|
) revert ErrorsLib.InvalidSignatureOnNameService();
|
|
645
636
|
|
|
637
|
+
if (identityDetails[identity].owner != user)
|
|
638
|
+
revert ErrorsLib.UserIsNotOwnerOfIdentity();
|
|
639
|
+
|
|
640
|
+
if (bytes(value).length == 0) revert ErrorsLib.EmptyCustomMetadata();
|
|
641
|
+
|
|
646
642
|
verifyAsyncNonce(user, nonce);
|
|
647
643
|
|
|
648
|
-
|
|
644
|
+
requestPay(
|
|
649
645
|
user,
|
|
650
646
|
getPriceToAddCustomMetadata(),
|
|
651
647
|
priorityFee_EVVM,
|
|
@@ -654,10 +650,10 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
654
650
|
signature_EVVM
|
|
655
651
|
);
|
|
656
652
|
|
|
657
|
-
if (
|
|
653
|
+
if (evvm.isAddressStaker(msg.sender)) {
|
|
658
654
|
makeCaPay(
|
|
659
655
|
msg.sender,
|
|
660
|
-
(5 *
|
|
656
|
+
(5 * evvm.getRewardAmount()) +
|
|
661
657
|
((getPriceToAddCustomMetadata() * 50) / 100) +
|
|
662
658
|
priorityFee_EVVM
|
|
663
659
|
);
|
|
@@ -694,10 +690,10 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
694
690
|
uint256 nonce_EVVM,
|
|
695
691
|
bool priorityFlag_EVVM,
|
|
696
692
|
bytes memory signature_EVVM
|
|
697
|
-
) external
|
|
693
|
+
) external {
|
|
698
694
|
if (
|
|
699
695
|
!SignatureUtils.verifyMessageSignedForRemoveCustomMetadata(
|
|
700
|
-
|
|
696
|
+
evvm.getEvvmID(),
|
|
701
697
|
user,
|
|
702
698
|
identity,
|
|
703
699
|
key,
|
|
@@ -706,12 +702,15 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
706
702
|
)
|
|
707
703
|
) revert ErrorsLib.InvalidSignatureOnNameService();
|
|
708
704
|
|
|
709
|
-
|
|
705
|
+
if (identityDetails[identity].owner != user)
|
|
706
|
+
revert ErrorsLib.UserIsNotOwnerOfIdentity();
|
|
710
707
|
|
|
711
708
|
if (identityDetails[identity].customMetadataMaxSlots <= key)
|
|
712
709
|
revert ErrorsLib.InvalidKey();
|
|
713
710
|
|
|
714
|
-
|
|
711
|
+
verifyAsyncNonce(user, nonce);
|
|
712
|
+
|
|
713
|
+
requestPay(
|
|
715
714
|
user,
|
|
716
715
|
getPriceToRemoveCustomMetadata(),
|
|
717
716
|
priorityFee_EVVM,
|
|
@@ -736,15 +735,16 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
736
735
|
identityDetails[identity].customMetadataMaxSlots
|
|
737
736
|
];
|
|
738
737
|
}
|
|
738
|
+
|
|
739
739
|
identityDetails[identity].customMetadataMaxSlots--;
|
|
740
|
+
|
|
740
741
|
markAsyncNonceAsUsed(user, nonce);
|
|
741
|
-
|
|
742
|
+
|
|
743
|
+
if (evvm.isAddressStaker(msg.sender))
|
|
742
744
|
makeCaPay(
|
|
743
745
|
msg.sender,
|
|
744
|
-
(5 *
|
|
745
|
-
priorityFee_EVVM
|
|
746
|
+
(5 * evvm.getRewardAmount()) + priorityFee_EVVM
|
|
746
747
|
);
|
|
747
|
-
}
|
|
748
748
|
}
|
|
749
749
|
|
|
750
750
|
/**
|
|
@@ -768,10 +768,10 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
768
768
|
uint256 nonce_EVVM,
|
|
769
769
|
bool priorityFlag_EVVM,
|
|
770
770
|
bytes memory signature_EVVM
|
|
771
|
-
) external
|
|
771
|
+
) external {
|
|
772
772
|
if (
|
|
773
773
|
!SignatureUtils.verifyMessageSignedForFlushCustomMetadata(
|
|
774
|
-
|
|
774
|
+
evvm.getEvvmID(),
|
|
775
775
|
user,
|
|
776
776
|
identity,
|
|
777
777
|
nonce,
|
|
@@ -779,12 +779,15 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
779
779
|
)
|
|
780
780
|
) revert ErrorsLib.InvalidSignatureOnNameService();
|
|
781
781
|
|
|
782
|
-
|
|
782
|
+
if (identityDetails[identity].owner != user)
|
|
783
|
+
revert ErrorsLib.UserIsNotOwnerOfIdentity();
|
|
783
784
|
|
|
784
785
|
if (identityDetails[identity].customMetadataMaxSlots == 0)
|
|
785
786
|
revert ErrorsLib.EmptyCustomMetadata();
|
|
786
787
|
|
|
787
|
-
|
|
788
|
+
verifyAsyncNonce(user, nonce);
|
|
789
|
+
|
|
790
|
+
requestPay(
|
|
788
791
|
user,
|
|
789
792
|
getPriceToFlushCustomMetadata(identity),
|
|
790
793
|
priorityFee_EVVM,
|
|
@@ -801,10 +804,10 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
801
804
|
delete identityCustomMetadata[identity][i];
|
|
802
805
|
}
|
|
803
806
|
|
|
804
|
-
if (
|
|
807
|
+
if (evvm.isAddressStaker(msg.sender)) {
|
|
805
808
|
makeCaPay(
|
|
806
809
|
msg.sender,
|
|
807
|
-
((5 *
|
|
810
|
+
((5 * evvm.getRewardAmount()) *
|
|
808
811
|
identityDetails[identity].customMetadataMaxSlots) +
|
|
809
812
|
priorityFee_EVVM
|
|
810
813
|
);
|
|
@@ -835,15 +838,10 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
835
838
|
uint256 nonce_EVVM,
|
|
836
839
|
bool priorityFlag_EVVM,
|
|
837
840
|
bytes memory signature_EVVM
|
|
838
|
-
) external
|
|
839
|
-
if (
|
|
840
|
-
block.timestamp >= identityDetails[username].expireDate ||
|
|
841
|
-
identityDetails[username].flagNotAUsername == 0x01
|
|
842
|
-
) revert ErrorsLib.FlushUsernameVerificationFailed();
|
|
843
|
-
|
|
841
|
+
) external {
|
|
844
842
|
if (
|
|
845
843
|
!SignatureUtils.verifyMessageSignedForFlushUsername(
|
|
846
|
-
|
|
844
|
+
evvm.getEvvmID(),
|
|
847
845
|
user,
|
|
848
846
|
username,
|
|
849
847
|
nonce,
|
|
@@ -851,9 +849,18 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
851
849
|
)
|
|
852
850
|
) revert ErrorsLib.InvalidSignatureOnNameService();
|
|
853
851
|
|
|
852
|
+
if (identityDetails[username].owner != user)
|
|
853
|
+
revert ErrorsLib.UserIsNotOwnerOfIdentity();
|
|
854
|
+
|
|
855
|
+
if (block.timestamp >= identityDetails[username].expireDate)
|
|
856
|
+
revert ErrorsLib.OwnershipExpired();
|
|
857
|
+
|
|
858
|
+
if (identityDetails[username].flagNotAUsername == 0x01)
|
|
859
|
+
revert ErrorsLib.IdentityIsNotAUsername();
|
|
860
|
+
|
|
854
861
|
verifyAsyncNonce(user, nonce);
|
|
855
862
|
|
|
856
|
-
|
|
863
|
+
requestPay(
|
|
857
864
|
user,
|
|
858
865
|
getPriceToFlushUsername(username),
|
|
859
866
|
priorityFee_EVVM,
|
|
@@ -872,7 +879,7 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
872
879
|
|
|
873
880
|
makeCaPay(
|
|
874
881
|
msg.sender,
|
|
875
|
-
((5 *
|
|
882
|
+
((5 * evvm.getRewardAmount()) *
|
|
876
883
|
identityDetails[username].customMetadataMaxSlots) +
|
|
877
884
|
priorityFee_EVVM
|
|
878
885
|
);
|
|
@@ -895,9 +902,8 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
895
902
|
* @param _adminToPropose Address of the proposed new admin
|
|
896
903
|
*/
|
|
897
904
|
function proposeAdmin(address _adminToPropose) public onlyAdmin {
|
|
898
|
-
if (_adminToPropose == address(0) || _adminToPropose == admin.current)
|
|
899
|
-
revert();
|
|
900
|
-
}
|
|
905
|
+
if (_adminToPropose == address(0) || _adminToPropose == admin.current)
|
|
906
|
+
revert ErrorsLib.InvalidAdminProposal();
|
|
901
907
|
|
|
902
908
|
admin.proposal = _adminToPropose;
|
|
903
909
|
admin.timeToAccept = block.timestamp + TIME_TO_ACCEPT_PROPOSAL;
|
|
@@ -917,12 +923,11 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
917
923
|
* @dev Can only be called by the proposed admin after the time delay has passed
|
|
918
924
|
*/
|
|
919
925
|
function acceptProposeAdmin() public {
|
|
920
|
-
if (admin.proposal != msg.sender)
|
|
921
|
-
revert();
|
|
922
|
-
|
|
923
|
-
if (block.timestamp < admin.timeToAccept)
|
|
924
|
-
revert();
|
|
925
|
-
}
|
|
926
|
+
if (admin.proposal != msg.sender)
|
|
927
|
+
revert ErrorsLib.SenderIsNotProposedAdmin();
|
|
928
|
+
|
|
929
|
+
if (block.timestamp < admin.timeToAccept)
|
|
930
|
+
revert ErrorsLib.LockTimeNotExpired();
|
|
926
931
|
|
|
927
932
|
admin = AddressTypeProposal({
|
|
928
933
|
current: admin.proposal,
|
|
@@ -938,17 +943,14 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
938
943
|
*/
|
|
939
944
|
function proposeWithdrawPrincipalTokens(uint256 _amount) public onlyAdmin {
|
|
940
945
|
if (
|
|
941
|
-
|
|
942
|
-
address(this),
|
|
943
|
-
PRINCIPAL_TOKEN_ADDRESS
|
|
944
|
-
) -
|
|
946
|
+
evvm.getBalance(address(this), evvm.getPrincipalTokenAddress()) -
|
|
945
947
|
(5083 +
|
|
946
|
-
|
|
948
|
+
evvm.getRewardAmount() +
|
|
947
949
|
principalTokenTokenLockedForWithdrawOffers) <
|
|
948
950
|
_amount ||
|
|
949
951
|
_amount == 0
|
|
950
952
|
) {
|
|
951
|
-
revert();
|
|
953
|
+
revert ErrorsLib.InvalidWithdrawAmount();
|
|
952
954
|
}
|
|
953
955
|
|
|
954
956
|
amountToWithdrawTokens.proposal = _amount;
|
|
@@ -971,9 +973,8 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
971
973
|
* @dev Can only be called after the time delay has passed
|
|
972
974
|
*/
|
|
973
975
|
function claimWithdrawPrincipalTokens() public onlyAdmin {
|
|
974
|
-
if (block.timestamp < amountToWithdrawTokens.timeToAccept)
|
|
975
|
-
revert();
|
|
976
|
-
}
|
|
976
|
+
if (block.timestamp < amountToWithdrawTokens.timeToAccept)
|
|
977
|
+
revert ErrorsLib.LockTimeNotExpired();
|
|
977
978
|
|
|
978
979
|
makeCaPay(admin.current, amountToWithdrawTokens.proposal);
|
|
979
980
|
|
|
@@ -989,9 +990,9 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
989
990
|
function proposeChangeEvvmAddress(
|
|
990
991
|
address _newEvvmAddress
|
|
991
992
|
) public onlyAdmin {
|
|
992
|
-
if (_newEvvmAddress == address(0))
|
|
993
|
-
revert();
|
|
994
|
-
|
|
993
|
+
if (_newEvvmAddress == address(0))
|
|
994
|
+
revert ErrorsLib.InvalidEvvmAddress();
|
|
995
|
+
|
|
995
996
|
evvmAddress.proposal = _newEvvmAddress;
|
|
996
997
|
evvmAddress.timeToAccept = block.timestamp + TIME_TO_ACCEPT_PROPOSAL;
|
|
997
998
|
}
|
|
@@ -1010,16 +1011,16 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
1010
1011
|
* @dev Can only be called after the time delay has passed
|
|
1011
1012
|
*/
|
|
1012
1013
|
function acceptChangeEvvmAddress() public onlyAdmin {
|
|
1013
|
-
if (block.timestamp < evvmAddress.timeToAccept)
|
|
1014
|
-
revert();
|
|
1015
|
-
|
|
1014
|
+
if (block.timestamp < evvmAddress.timeToAccept)
|
|
1015
|
+
revert ErrorsLib.LockTimeNotExpired();
|
|
1016
|
+
|
|
1016
1017
|
evvmAddress = AddressTypeProposal({
|
|
1017
1018
|
current: evvmAddress.proposal,
|
|
1018
1019
|
proposal: address(0),
|
|
1019
1020
|
timeToAccept: 0
|
|
1020
1021
|
});
|
|
1021
1022
|
|
|
1022
|
-
evvm =
|
|
1023
|
+
evvm = Evvm(evvmAddress.current);
|
|
1023
1024
|
}
|
|
1024
1025
|
|
|
1025
1026
|
//█ Utility Functions ████████████████████████████████████████████████████████████████████████
|
|
@@ -1036,7 +1037,7 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
1036
1037
|
* @param priorityFlag True for async payment, false for sync payment
|
|
1037
1038
|
* @param signature Signature authorizing the payment
|
|
1038
1039
|
*/
|
|
1039
|
-
function
|
|
1040
|
+
function requestPay(
|
|
1040
1041
|
address user,
|
|
1041
1042
|
uint256 amount,
|
|
1042
1043
|
uint256 priorityFee,
|
|
@@ -1044,11 +1045,11 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
1044
1045
|
bool priorityFlag,
|
|
1045
1046
|
bytes memory signature
|
|
1046
1047
|
) internal {
|
|
1047
|
-
|
|
1048
|
+
evvm.pay(
|
|
1048
1049
|
user,
|
|
1049
1050
|
address(this),
|
|
1050
1051
|
"",
|
|
1051
|
-
|
|
1052
|
+
evvm.getPrincipalTokenAddress(),
|
|
1052
1053
|
amount,
|
|
1053
1054
|
priorityFee,
|
|
1054
1055
|
nonce,
|
|
@@ -1065,7 +1066,7 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
1065
1066
|
* @param amount Amount of Principal Tokens to distribute
|
|
1066
1067
|
*/
|
|
1067
1068
|
function makeCaPay(address user, uint256 amount) internal {
|
|
1068
|
-
|
|
1069
|
+
evvm.caPay(user, evvm.getPrincipalTokenAddress(), amount);
|
|
1069
1070
|
}
|
|
1070
1071
|
|
|
1071
1072
|
//█ Username Hashing Functions ███████████████████████████████████████████████████████████████████
|
|
@@ -1201,14 +1202,14 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
1201
1202
|
if (price == 0) {
|
|
1202
1203
|
price = 500 * 10 ** 18;
|
|
1203
1204
|
} else {
|
|
1204
|
-
uint256 principalTokenReward =
|
|
1205
|
-
|
|
1205
|
+
uint256 principalTokenReward = evvm.getRewardAmount();
|
|
1206
|
+
|
|
1206
1207
|
price = ((price * 5) / 1000) > (500000 * principalTokenReward)
|
|
1207
1208
|
? (500000 * principalTokenReward)
|
|
1208
1209
|
: ((price * 5) / 1000);
|
|
1209
1210
|
}
|
|
1210
1211
|
} else {
|
|
1211
|
-
price = 500_000 *
|
|
1212
|
+
price = 500_000 * evvm.getRewardAmount();
|
|
1212
1213
|
}
|
|
1213
1214
|
}
|
|
1214
1215
|
|
|
@@ -1218,7 +1219,7 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
1218
1219
|
* @return price Cost in Principal Tokens (10x current reward amount)
|
|
1219
1220
|
*/
|
|
1220
1221
|
function getPriceToAddCustomMetadata() public view returns (uint256 price) {
|
|
1221
|
-
price = 10 *
|
|
1222
|
+
price = 10 * evvm.getRewardAmount();
|
|
1222
1223
|
}
|
|
1223
1224
|
|
|
1224
1225
|
/**
|
|
@@ -1231,7 +1232,7 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
1231
1232
|
view
|
|
1232
1233
|
returns (uint256 price)
|
|
1233
1234
|
{
|
|
1234
|
-
price = 10 *
|
|
1235
|
+
price = 10 * evvm.getRewardAmount();
|
|
1235
1236
|
}
|
|
1236
1237
|
|
|
1237
1238
|
/**
|
|
@@ -1244,7 +1245,7 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
1244
1245
|
string memory _identity
|
|
1245
1246
|
) public view returns (uint256 price) {
|
|
1246
1247
|
price =
|
|
1247
|
-
(10 *
|
|
1248
|
+
(10 * evvm.getRewardAmount()) *
|
|
1248
1249
|
identityDetails[_identity].customMetadataMaxSlots;
|
|
1249
1250
|
}
|
|
1250
1251
|
|
|
@@ -1258,9 +1259,9 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
1258
1259
|
string memory _identity
|
|
1259
1260
|
) public view returns (uint256 price) {
|
|
1260
1261
|
price =
|
|
1261
|
-
((10 *
|
|
1262
|
+
((10 * evvm.getRewardAmount()) *
|
|
1262
1263
|
identityDetails[_identity].customMetadataMaxSlots) +
|
|
1263
|
-
|
|
1264
|
+
evvm.getRewardAmount();
|
|
1264
1265
|
}
|
|
1265
1266
|
|
|
1266
1267
|
//█ Identity Availability Functions ██████████████████████████████████████████████████████████████
|
|
@@ -1430,7 +1431,7 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
1430
1431
|
return
|
|
1431
1432
|
identityDetails[username].offerMaxSlots > 0
|
|
1432
1433
|
? seePriceToRenew(username)
|
|
1433
|
-
:
|
|
1434
|
+
: evvm.getRewardAmount() * 100;
|
|
1434
1435
|
}
|
|
1435
1436
|
|
|
1436
1437
|
//█ Administrative Getters ███████████████████████████████████████████████████████████████████████
|
|
@@ -1483,6 +1484,15 @@ contract NameService is AsyncNonce, NameServiceStructs {
|
|
|
1483
1484
|
);
|
|
1484
1485
|
}
|
|
1485
1486
|
|
|
1487
|
+
/**
|
|
1488
|
+
* @notice Gets the unique identifier string for this EVVM instance
|
|
1489
|
+
* @dev Returns the EvvmID used for distinguishing different EVVM deployments
|
|
1490
|
+
* @return Unique EvvmID string
|
|
1491
|
+
*/
|
|
1492
|
+
function getEvvmID() external view returns (uint256) {
|
|
1493
|
+
return evvm.getEvvmID();
|
|
1494
|
+
}
|
|
1495
|
+
|
|
1486
1496
|
/**
|
|
1487
1497
|
* @notice Gets the current EVVM contract address
|
|
1488
1498
|
* @dev Returns the address of the EVVM contract used for payment processing
|