@lukso/lsp8-contracts 0.16.7 → 0.17.3

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.
Files changed (88) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +54 -4
  3. package/artifacts/IAccessControlExtended.json +285 -0
  4. package/artifacts/ILSP8CappedBalance.json +27 -0
  5. package/artifacts/ILSP8CappedSupply.json +27 -0
  6. package/artifacts/ILSP8IdentifiableDigitalAsset.json +6 -3
  7. package/artifacts/ILSP8Mintable.json +62 -0
  8. package/artifacts/ILSP8NonTransferable.json +110 -0
  9. package/artifacts/ILSP8Revokable.json +75 -0
  10. package/artifacts/LSP8Burnable.json +7 -4
  11. package/artifacts/LSP8BurnableInitAbstract.json +7 -4
  12. package/artifacts/LSP8CappedBalanceAbstract.json +1285 -0
  13. package/artifacts/LSP8CappedBalanceInitAbstract.json +1293 -0
  14. package/artifacts/{LSP8CappedSupply.json → LSP8CappedSupplyAbstract.json} +8 -15
  15. package/artifacts/LSP8CappedSupplyInitAbstract.json +7 -14
  16. package/artifacts/LSP8CustomizableToken.json +1738 -0
  17. package/artifacts/LSP8CustomizableTokenInit.json +1733 -0
  18. package/artifacts/LSP8Enumerable.json +7 -4
  19. package/artifacts/LSP8EnumerableInitAbstract.json +7 -4
  20. package/artifacts/LSP8IdentifiableDigitalAsset.json +6 -3
  21. package/artifacts/LSP8IdentifiableDigitalAssetInitAbstract.json +6 -3
  22. package/artifacts/LSP8Mintable.json +369 -5
  23. package/artifacts/LSP8MintableAbstract.json +1328 -0
  24. package/artifacts/LSP8MintableInit.json +369 -5
  25. package/artifacts/LSP8MintableInitAbstract.json +1336 -0
  26. package/artifacts/LSP8NonTransferableAbstract.json +1367 -0
  27. package/artifacts/LSP8NonTransferableInitAbstract.json +1375 -0
  28. package/artifacts/LSP8RevokableAbstract.json +1317 -0
  29. package/artifacts/LSP8RevokableInitAbstract.json +1325 -0
  30. package/artifacts/LSP8Votes.json +7 -4
  31. package/artifacts/LSP8VotesInitAbstract.json +7 -4
  32. package/contracts/ILSP8IdentifiableDigitalAsset.sol +1 -1
  33. package/contracts/LSP8Constants.sol +1 -1
  34. package/contracts/LSP8Errors.sol +1 -1
  35. package/contracts/LSP8IdentifiableDigitalAsset.sol +73 -114
  36. package/contracts/LSP8IdentifiableDigitalAssetInitAbstract.sol +69 -116
  37. package/contracts/extensions/AccessControlExtended/AccessControlExtendedAbstract.sol +378 -0
  38. package/contracts/extensions/AccessControlExtended/AccessControlExtendedConstants.sol +13 -0
  39. package/contracts/extensions/AccessControlExtended/AccessControlExtendedErrors.sol +23 -0
  40. package/contracts/extensions/AccessControlExtended/AccessControlExtendedInitAbstract.sol +390 -0
  41. package/contracts/extensions/AccessControlExtended/IAccessControlExtended.sol +51 -0
  42. package/contracts/extensions/{LSP8Burnable.sol → LSP8Burnable/LSP8Burnable.sol} +7 -6
  43. package/contracts/extensions/{LSP8BurnableInitAbstract.sol → LSP8Burnable/LSP8BurnableInitAbstract.sol} +7 -6
  44. package/contracts/extensions/LSP8CappedBalance/ILSP8CappedBalance.sol +11 -0
  45. package/contracts/extensions/LSP8CappedBalance/LSP8CappedBalanceAbstract.sol +124 -0
  46. package/contracts/extensions/LSP8CappedBalance/LSP8CappedBalanceErrors.sol +9 -0
  47. package/contracts/extensions/LSP8CappedBalance/LSP8CappedBalanceInitAbstract.sol +174 -0
  48. package/contracts/extensions/LSP8CappedSupply/ILSP8CappedSupply.sol +11 -0
  49. package/contracts/extensions/LSP8CappedSupply/LSP8CappedSupplyAbstract.sol +59 -0
  50. package/contracts/extensions/LSP8CappedSupply/LSP8CappedSupplyErrors.sol +6 -0
  51. package/contracts/extensions/LSP8CappedSupply/LSP8CappedSupplyInitAbstract.sol +97 -0
  52. package/contracts/extensions/{LSP8Enumerable.sol → LSP8Enumerable/LSP8Enumerable.sol} +2 -2
  53. package/contracts/extensions/{LSP8EnumerableInitAbstract.sol → LSP8Enumerable/LSP8EnumerableInitAbstract.sol} +2 -2
  54. package/contracts/extensions/LSP8Mintable/ILSP8Mintable.sol +27 -0
  55. package/contracts/extensions/LSP8Mintable/LSP8MintableAbstract.sol +105 -0
  56. package/contracts/extensions/LSP8Mintable/LSP8MintableErrors.sol +5 -0
  57. package/contracts/extensions/LSP8Mintable/LSP8MintableInitAbstract.sol +155 -0
  58. package/contracts/extensions/LSP8NonTransferable/ILSP8NonTransferable.sol +48 -0
  59. package/contracts/extensions/LSP8NonTransferable/LSP8NonTransferableAbstract.sol +190 -0
  60. package/contracts/extensions/LSP8NonTransferable/LSP8NonTransferableErrors.sol +14 -0
  61. package/contracts/extensions/LSP8NonTransferable/LSP8NonTransferableInitAbstract.sol +246 -0
  62. package/contracts/extensions/LSP8Revokable/ILSP8Revokable.sol +28 -0
  63. package/contracts/extensions/LSP8Revokable/LSP8RevokableAbstract.sol +132 -0
  64. package/contracts/extensions/LSP8Revokable/LSP8RevokableErrors.sol +4 -0
  65. package/contracts/extensions/LSP8Revokable/LSP8RevokableInitAbstract.sol +178 -0
  66. package/contracts/extensions/{LSP8Votes.sol → LSP8Votes/LSP8Votes.sol} +3 -4
  67. package/contracts/extensions/{LSP8VotesConstants.sol → LSP8Votes/LSP8VotesConstants.sol} +1 -1
  68. package/contracts/extensions/{LSP8VotesInitAbstract.sol → LSP8Votes/LSP8VotesInitAbstract.sol} +3 -3
  69. package/contracts/presets/LSP8CustomizableToken.sol +277 -0
  70. package/contracts/presets/LSP8CustomizableTokenConstants.sol +32 -0
  71. package/contracts/presets/LSP8CustomizableTokenInit.sol +318 -0
  72. package/contracts/presets/LSP8Mintable.sol +13 -28
  73. package/contracts/presets/LSP8MintableInit.sol +13 -6
  74. package/dist/abi.cjs +8233 -158
  75. package/dist/abi.d.cts +12004 -323
  76. package/dist/abi.d.mts +12004 -323
  77. package/dist/abi.d.ts +12004 -323
  78. package/dist/abi.mjs +8217 -158
  79. package/dist/constants.cjs +21 -0
  80. package/dist/constants.d.cts +12 -1
  81. package/dist/constants.d.mts +12 -1
  82. package/dist/constants.d.ts +12 -1
  83. package/dist/constants.mjs +16 -1
  84. package/package.json +32 -9
  85. package/contracts/extensions/LSP8CappedSupply.sol +0 -85
  86. package/contracts/extensions/LSP8CappedSupplyInitAbstract.sol +0 -88
  87. package/contracts/presets/ILSP8Mintable.sol +0 -33
  88. package/contracts/presets/LSP8MintableInitAbstract.sol +0 -62
@@ -1,13 +1,9 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
- pragma solidity ^0.8.12;
2
+ pragma solidity ^0.8.27;
3
3
 
4
4
  // interfaces
5
- import {
6
- ILSP1UniversalReceiver as ILSP1
7
- } from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiver.sol";
8
- import {
9
- ILSP8IdentifiableDigitalAsset
10
- } from "./ILSP8IdentifiableDigitalAsset.sol";
5
+ import {ILSP1UniversalReceiver as ILSP1} from "@lukso/lsp1-contracts/contracts/ILSP1UniversalReceiver.sol";
6
+ import {ILSP8IdentifiableDigitalAsset} from "./ILSP8IdentifiableDigitalAsset.sol";
11
7
 
12
8
  // modules
13
9
  import {
@@ -15,27 +11,17 @@ import {
15
11
  ERC725YInitAbstract
16
12
  } from "@lukso/lsp4-contracts/contracts/LSP4DigitalAssetMetadataInitAbstract.sol";
17
13
 
18
- import {
19
- LSP17ExtendableInitAbstract
20
- } from "@lukso/lsp17contractextension-contracts/contracts/LSP17ExtendableInitAbstract.sol";
14
+ import {LSP17ExtendableInitAbstract} from "@lukso/lsp17contractextension-contracts/contracts/LSP17ExtendableInitAbstract.sol";
21
15
 
22
16
  // libraries
23
- import {
24
- EnumerableSet
25
- } from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
26
- import {
27
- ERC165Checker
28
- } from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";
17
+ import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
18
+ import {ERC165Checker} from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";
29
19
  import {LSP1Utils} from "@lukso/lsp1-contracts/contracts/LSP1Utils.sol";
30
20
  import {LSP2Utils} from "@lukso/lsp2-contracts/contracts/LSP2Utils.sol";
31
21
 
32
22
  // constants
33
- import {
34
- _INTERFACEID_LSP1
35
- } from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol";
36
- import {
37
- _LSP17_EXTENSION_PREFIX
38
- } from "@lukso/lsp17contractextension-contracts/contracts/LSP17Constants.sol";
23
+ import {_INTERFACEID_LSP1} from "@lukso/lsp1-contracts/contracts/LSP1Constants.sol";
24
+ import {_LSP17_EXTENSION_PREFIX} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Constants.sol";
39
25
  import {
40
26
  _INTERFACEID_LSP8,
41
27
  _LSP8_TOKENID_FORMAT_KEY,
@@ -45,11 +31,6 @@ import {
45
31
  } from "./LSP8Constants.sol";
46
32
 
47
33
  // errors
48
- import {
49
- NoExtensionFoundForFunctionSelector,
50
- InvalidFunctionSelector,
51
- InvalidExtensionAddress
52
- } from "@lukso/lsp17contractextension-contracts/contracts/LSP17Errors.sol";
53
34
  import {
54
35
  LSP8TokenContractCannotHoldValue,
55
36
  LSP8TokenIdFormatNotEditable,
@@ -167,9 +148,7 @@ abstract contract LSP8IdentifiableDigitalAssetInitAbstract is
167
148
  fallback(
168
149
  bytes calldata callData
169
150
  ) external payable virtual returns (bytes memory) {
170
- if (msg.data.length < 4) {
171
- revert InvalidFunctionSelector(callData);
172
- }
151
+ require(msg.data.length >= 4, InvalidFunctionSelector(callData));
173
152
  return _fallbackLSP17Extendable(callData);
174
153
  }
175
154
 
@@ -210,8 +189,10 @@ abstract contract LSP8IdentifiableDigitalAssetInitAbstract is
210
189
  (address extension, ) = _getExtensionAndForwardValue(msg.sig);
211
190
 
212
191
  // if no extension was found, revert
213
- if (extension == address(0))
214
- revert NoExtensionFoundForFunctionSelector(msg.sig);
192
+ require(
193
+ extension != address(0),
194
+ NoExtensionFoundForFunctionSelector(msg.sig)
195
+ );
215
196
 
216
197
  (bool success, bytes memory result) = extension.call{value: msg.value}(
217
198
  abi.encodePacked(callData, msg.sender, msg.value)
@@ -247,8 +228,10 @@ abstract contract LSP8IdentifiableDigitalAssetInitAbstract is
247
228
 
248
229
  // Check if there is an extension stored under the generated data key
249
230
  bytes memory extensionAddress = _getData(mappedExtensionDataKey);
250
- if (extensionAddress.length != 20 && extensionAddress.length != 0)
251
- revert InvalidExtensionAddress(extensionAddress);
231
+ require(
232
+ extensionAddress.length == 20 || extensionAddress.length == 0,
233
+ InvalidExtensionAddress(extensionAddress)
234
+ );
252
235
 
253
236
  return (address(bytes20(extensionAddress)), true);
254
237
  }
@@ -315,10 +298,7 @@ abstract contract LSP8IdentifiableDigitalAssetInitAbstract is
315
298
  bytes32 tokenId
316
299
  ) public view virtual override returns (address) {
317
300
  address tokenOwner = _tokenOwners[tokenId];
318
-
319
- if (tokenOwner == address(0)) {
320
- revert LSP8NonExistentTokenId(tokenId);
321
- }
301
+ require(tokenOwner != address(0), LSP8NonExistentTokenId(tokenId));
322
302
 
323
303
  return tokenOwner;
324
304
  }
@@ -351,9 +331,10 @@ abstract contract LSP8IdentifiableDigitalAssetInitAbstract is
351
331
  bytes32[] memory tokenIds,
352
332
  bytes32[] memory dataKeys
353
333
  ) public view virtual override returns (bytes[] memory dataValues) {
354
- if (tokenIds.length != dataKeys.length) {
355
- revert LSP8TokenIdsDataLengthMismatch();
356
- }
334
+ require(
335
+ tokenIds.length == dataKeys.length,
336
+ LSP8TokenIdsDataLengthMismatch()
337
+ );
357
338
 
358
339
  dataValues = new bytes[](tokenIds.length);
359
340
 
@@ -388,16 +369,13 @@ abstract contract LSP8IdentifiableDigitalAssetInitAbstract is
388
369
  bytes32[] memory dataKeys,
389
370
  bytes[] memory dataValues
390
371
  ) public virtual override onlyOwner {
391
- if (
392
- tokenIds.length != dataKeys.length ||
393
- dataKeys.length != dataValues.length
394
- ) {
395
- revert LSP8TokenIdsDataLengthMismatch();
396
- }
372
+ require(
373
+ tokenIds.length == dataKeys.length &&
374
+ dataKeys.length == dataValues.length,
375
+ LSP8TokenIdsDataLengthMismatch()
376
+ );
397
377
 
398
- if (tokenIds.length == 0) {
399
- revert LSP8TokenIdsDataEmptyArray();
400
- }
378
+ require(tokenIds.length != 0, LSP8TokenIdsDataEmptyArray());
401
379
 
402
380
  for (uint256 i; i < tokenIds.length; ) {
403
381
  _setDataForTokenId(tokenIds[i], dataKeys[i], dataValues[i]);
@@ -460,20 +438,15 @@ abstract contract LSP8IdentifiableDigitalAssetInitAbstract is
460
438
  ) public virtual override {
461
439
  address tokenOwner = tokenOwnerOf(tokenId);
462
440
 
463
- if (tokenOwner != msg.sender) {
464
- revert LSP8NotTokenOwner(tokenOwner, tokenId, msg.sender);
465
- }
466
-
467
- if (operator == address(0)) {
468
- revert LSP8CannotUseAddressZeroAsOperator();
469
- }
470
-
471
- if (tokenOwner == operator) {
472
- revert LSP8TokenOwnerCannotBeOperator();
473
- }
441
+ require(
442
+ msg.sender == tokenOwner,
443
+ LSP8NotTokenOwner(tokenOwner, tokenId, msg.sender)
444
+ );
445
+ require(operator != address(0), LSP8CannotUseAddressZeroAsOperator());
446
+ require(operator != tokenOwner, LSP8TokenOwnerCannotBeOperator());
474
447
 
475
448
  bool isAdded = _operators[tokenId].add(operator);
476
- if (!isAdded) revert LSP8OperatorAlreadyAuthorized(operator, tokenId);
449
+ require(isAdded, LSP8OperatorAlreadyAuthorized(operator, tokenId));
477
450
 
478
451
  emit OperatorAuthorizationChanged(
479
452
  operator,
@@ -504,22 +477,14 @@ abstract contract LSP8IdentifiableDigitalAssetInitAbstract is
504
477
  address tokenOwner = tokenOwnerOf(tokenId);
505
478
 
506
479
  if (msg.sender != tokenOwner) {
507
- if (operator != msg.sender) {
508
- revert LSP8RevokeOperatorNotAuthorized(
509
- msg.sender,
510
- tokenOwner,
511
- tokenId
512
- );
513
- }
514
- }
515
-
516
- if (operator == address(0)) {
517
- revert LSP8CannotUseAddressZeroAsOperator();
480
+ require(
481
+ msg.sender == operator,
482
+ LSP8RevokeOperatorNotAuthorized(msg.sender, tokenOwner, tokenId)
483
+ );
518
484
  }
519
485
 
520
- if (tokenOwner == operator) {
521
- revert LSP8TokenOwnerCannotBeOperator();
522
- }
486
+ require(operator != address(0), LSP8CannotUseAddressZeroAsOperator());
487
+ require(operator != tokenOwner, LSP8TokenOwnerCannotBeOperator());
523
488
 
524
489
  _revokeOperator(
525
490
  operator,
@@ -586,9 +551,10 @@ abstract contract LSP8IdentifiableDigitalAssetInitAbstract is
586
551
  bool force,
587
552
  bytes memory data
588
553
  ) public virtual override {
589
- if (!_isOperatorOrOwner(msg.sender, tokenId)) {
590
- revert LSP8NotTokenOperator(tokenId, msg.sender);
591
- }
554
+ require(
555
+ _isOperatorOrOwner(msg.sender, tokenId),
556
+ LSP8NotTokenOperator(tokenId, msg.sender)
557
+ );
592
558
 
593
559
  _transfer(from, to, tokenId, force, data);
594
560
  }
@@ -604,14 +570,13 @@ abstract contract LSP8IdentifiableDigitalAssetInitAbstract is
604
570
  bytes[] memory data
605
571
  ) public virtual override {
606
572
  uint256 fromLength = from.length;
607
- if (
608
- fromLength != to.length ||
609
- fromLength != tokenId.length ||
610
- fromLength != force.length ||
611
- fromLength != data.length
612
- ) {
613
- revert LSP8InvalidTransferBatch();
614
- }
573
+ require(
574
+ fromLength == to.length &&
575
+ fromLength == tokenId.length &&
576
+ fromLength == force.length &&
577
+ fromLength == data.length,
578
+ LSP8InvalidTransferBatch()
579
+ );
615
580
 
616
581
  for (uint256 i; i < fromLength; ) {
617
582
  transfer(from[i], to[i], tokenId[i], force[i], data[i]);
@@ -633,7 +598,7 @@ abstract contract LSP8IdentifiableDigitalAssetInitAbstract is
633
598
  bytes memory operatorNotificationData
634
599
  ) internal virtual {
635
600
  bool isRemoved = _operators[tokenId].remove(operator);
636
- if (!isRemoved) revert LSP8NonExistingOperator(operator, tokenId);
601
+ require(isRemoved, LSP8NonExistingOperator(operator, tokenId));
637
602
 
638
603
  emit OperatorRevoked(
639
604
  operator,
@@ -690,9 +655,7 @@ abstract contract LSP8IdentifiableDigitalAssetInitAbstract is
690
655
  * @dev When `tokenId` does not exist then revert with an error.
691
656
  */
692
657
  function _existsOrError(bytes32 tokenId) internal view virtual {
693
- if (!_exists(tokenId)) {
694
- revert LSP8NonExistentTokenId(tokenId);
695
- }
658
+ require(_exists(tokenId), LSP8NonExistentTokenId(tokenId));
696
659
  }
697
660
 
698
661
  /**
@@ -710,7 +673,7 @@ abstract contract LSP8IdentifiableDigitalAssetInitAbstract is
710
673
  * @custom:requirements
711
674
  * - `tokenId` must not exist and not have been already minted.
712
675
  * - `to` cannot be the zero address.
713
-
676
+ *
714
677
  * @custom:events {Transfer} event with `address(0)` as `from` address.
715
678
  */
716
679
  function _mint(
@@ -719,21 +682,15 @@ abstract contract LSP8IdentifiableDigitalAssetInitAbstract is
719
682
  bool force,
720
683
  bytes memory data
721
684
  ) internal virtual {
722
- if (to == address(0)) {
723
- revert LSP8CannotSendToAddressZero();
724
- }
685
+ require(to != address(0), LSP8CannotSendToAddressZero());
725
686
 
726
687
  // Check that `tokenId` is not already minted
727
- if (_exists(tokenId)) {
728
- revert LSP8TokenIdAlreadyMinted(tokenId);
729
- }
688
+ require(!_exists(tokenId), LSP8TokenIdAlreadyMinted(tokenId));
730
689
 
731
690
  _beforeTokenTransfer(address(0), to, tokenId, force, data);
732
691
 
733
692
  // Check that `tokenId` was not minted inside the `_beforeTokenTransfer` hook
734
- if (_exists(tokenId)) {
735
- revert LSP8TokenIdAlreadyMinted(tokenId);
736
- }
693
+ require(!_exists(tokenId), LSP8TokenIdAlreadyMinted(tokenId));
737
694
 
738
695
  // token being minted
739
696
  ++_existingTokens;
@@ -844,25 +801,21 @@ abstract contract LSP8IdentifiableDigitalAssetInitAbstract is
844
801
  bytes memory data
845
802
  ) internal virtual {
846
803
  address tokenOwner = tokenOwnerOf(tokenId);
847
- if (tokenOwner != from) {
848
- revert LSP8NotTokenOwner(tokenOwner, tokenId, from);
849
- }
804
+ require(
805
+ from == tokenOwner,
806
+ LSP8NotTokenOwner(tokenOwner, tokenId, from)
807
+ );
850
808
 
851
- if (to == address(0)) {
852
- revert LSP8CannotSendToAddressZero();
853
- }
809
+ require(to != address(0), LSP8CannotSendToAddressZero());
854
810
 
855
811
  _beforeTokenTransfer(from, to, tokenId, force, data);
856
812
 
857
813
  // Check that `tokenId`'s owner was not changed inside the `_beforeTokenTransfer` hook
858
814
  address currentTokenOwner = tokenOwnerOf(tokenId);
859
- if (tokenOwner != currentTokenOwner) {
860
- revert LSP8TokenOwnerChanged(
861
- tokenId,
862
- tokenOwner,
863
- currentTokenOwner
864
- );
865
- }
815
+ require(
816
+ currentTokenOwner == tokenOwner,
817
+ LSP8TokenOwnerChanged(tokenId, tokenOwner, currentTokenOwner)
818
+ );
866
819
 
867
820
  _clearOperators(from, tokenId);
868
821
 
@@ -951,7 +904,7 @@ abstract contract LSP8IdentifiableDigitalAssetInitAbstract is
951
904
  * @dev Attempt to notify the operator `operator` about the `tokenId` being authorized.
952
905
  * This is done by calling its {universalReceiver} function with the `_TYPEID_LSP8_TOKENOPERATOR` as typeId, if `operator` is a contract that supports the LSP1 interface.
953
906
  * If `operator` is an EOA or a contract that does not support the LSP1 interface, nothing will happen and no notification will be sent.
954
-
907
+ *
955
908
  * @param operator The address to call the {universalReceiver} function on.
956
909
  * @param lsp1Data the data to be sent to the `operator` address in the `universalReceiver` call.
957
910
  */
@@ -970,7 +923,7 @@ abstract contract LSP8IdentifiableDigitalAssetInitAbstract is
970
923
  * @dev Attempt to notify the token sender `from` about the `tokenId` being transferred.
971
924
  * This is done by calling its {universalReceiver} function with the `_TYPEID_LSP8_TOKENSSENDER` as typeId, if `from` is a contract that supports the LSP1 interface.
972
925
  * If `from` is an EOA or a contract that does not support the LSP1 interface, nothing will happen and no notification will be sent.
973
-
926
+ *
974
927
  * @param from The address to call the {universalReceiver} function on.
975
928
  * @param lsp1Data the data to be sent to the `from` address in the `universalReceiver` call.
976
929
  */