@lukso/lsp8-contracts 0.16.7 → 0.18.1
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 +201 -0
- package/README.md +99 -4
- package/artifacts/IAccessControlExtended.json +285 -0
- package/artifacts/ILSP8CappedBalance.json +27 -0
- package/artifacts/ILSP8CappedSupply.json +27 -0
- package/artifacts/ILSP8IdentifiableDigitalAsset.json +6 -3
- package/artifacts/ILSP8Mintable.json +62 -0
- package/artifacts/ILSP8NonTransferable.json +116 -0
- package/artifacts/ILSP8Revokable.json +112 -0
- package/artifacts/LSP8Burnable.json +7 -4
- package/artifacts/LSP8BurnableInitAbstract.json +7 -4
- package/artifacts/LSP8CappedBalanceAbstract.json +1285 -0
- package/artifacts/LSP8CappedBalanceInitAbstract.json +1293 -0
- package/artifacts/{LSP8CappedSupply.json → LSP8CappedSupplyAbstract.json} +8 -15
- package/artifacts/LSP8CappedSupplyInitAbstract.json +7 -14
- package/artifacts/LSP8CustomizableToken.json +1781 -0
- package/artifacts/LSP8CustomizableTokenInit.json +1776 -0
- package/artifacts/LSP8Enumerable.json +7 -4
- package/artifacts/LSP8EnumerableInitAbstract.json +7 -4
- package/artifacts/LSP8IdentifiableDigitalAsset.json +6 -3
- package/artifacts/LSP8IdentifiableDigitalAssetInitAbstract.json +6 -3
- package/artifacts/LSP8Mintable.json +369 -5
- package/artifacts/LSP8MintableAbstract.json +1328 -0
- package/artifacts/LSP8MintableInit.json +369 -5
- package/artifacts/LSP8MintableInitAbstract.json +1336 -0
- package/artifacts/LSP8NonTransferableAbstract.json +1373 -0
- package/artifacts/LSP8NonTransferableInitAbstract.json +1381 -0
- package/artifacts/LSP8RevokableAbstract.json +1354 -0
- package/artifacts/LSP8RevokableInitAbstract.json +1362 -0
- package/artifacts/LSP8Votes.json +7 -4
- package/artifacts/LSP8VotesInitAbstract.json +7 -4
- package/contracts/ILSP8IdentifiableDigitalAsset.sol +1 -1
- package/contracts/LSP8Constants.sol +1 -1
- package/contracts/LSP8Errors.sol +1 -1
- package/contracts/LSP8IdentifiableDigitalAsset.sol +73 -114
- package/contracts/LSP8IdentifiableDigitalAssetInitAbstract.sol +69 -116
- package/contracts/extensions/AccessControlExtended/AccessControlExtendedAbstract.sol +378 -0
- package/contracts/extensions/AccessControlExtended/AccessControlExtendedConstants.sol +13 -0
- package/contracts/extensions/AccessControlExtended/AccessControlExtendedErrors.sol +23 -0
- package/contracts/extensions/AccessControlExtended/AccessControlExtendedInitAbstract.sol +390 -0
- package/contracts/extensions/AccessControlExtended/IAccessControlExtended.sol +51 -0
- package/contracts/extensions/{LSP8Burnable.sol → LSP8Burnable/LSP8Burnable.sol} +7 -6
- package/contracts/extensions/{LSP8BurnableInitAbstract.sol → LSP8Burnable/LSP8BurnableInitAbstract.sol} +7 -6
- package/contracts/extensions/LSP8CappedBalance/ILSP8CappedBalance.sol +11 -0
- package/contracts/extensions/LSP8CappedBalance/LSP8CappedBalanceAbstract.sol +124 -0
- package/contracts/extensions/LSP8CappedBalance/LSP8CappedBalanceErrors.sol +9 -0
- package/contracts/extensions/LSP8CappedBalance/LSP8CappedBalanceInitAbstract.sol +174 -0
- package/contracts/extensions/LSP8CappedSupply/ILSP8CappedSupply.sol +11 -0
- package/contracts/extensions/LSP8CappedSupply/LSP8CappedSupplyAbstract.sol +59 -0
- package/contracts/extensions/LSP8CappedSupply/LSP8CappedSupplyErrors.sol +6 -0
- package/contracts/extensions/LSP8CappedSupply/LSP8CappedSupplyInitAbstract.sol +97 -0
- package/contracts/extensions/{LSP8Enumerable.sol → LSP8Enumerable/LSP8Enumerable.sol} +2 -2
- package/contracts/extensions/{LSP8EnumerableInitAbstract.sol → LSP8Enumerable/LSP8EnumerableInitAbstract.sol} +2 -2
- package/contracts/extensions/LSP8Mintable/ILSP8Mintable.sol +27 -0
- package/contracts/extensions/LSP8Mintable/LSP8MintableAbstract.sol +105 -0
- package/contracts/extensions/LSP8Mintable/LSP8MintableErrors.sol +5 -0
- package/contracts/extensions/LSP8Mintable/LSP8MintableInitAbstract.sol +155 -0
- package/contracts/extensions/LSP8NonTransferable/ILSP8NonTransferable.sol +54 -0
- package/contracts/extensions/LSP8NonTransferable/LSP8NonTransferableAbstract.sol +199 -0
- package/contracts/extensions/LSP8NonTransferable/LSP8NonTransferableErrors.sol +14 -0
- package/contracts/extensions/LSP8NonTransferable/LSP8NonTransferableInitAbstract.sol +255 -0
- package/contracts/extensions/LSP8Revokable/ILSP8Revokable.sol +37 -0
- package/contracts/extensions/LSP8Revokable/LSP8RevokableAbstract.sol +140 -0
- package/contracts/extensions/LSP8Revokable/LSP8RevokableErrors.sol +4 -0
- package/contracts/extensions/LSP8Revokable/LSP8RevokableInitAbstract.sol +192 -0
- package/contracts/extensions/{LSP8Votes.sol → LSP8Votes/LSP8Votes.sol} +3 -4
- package/contracts/extensions/{LSP8VotesConstants.sol → LSP8Votes/LSP8VotesConstants.sol} +1 -1
- package/contracts/extensions/{LSP8VotesInitAbstract.sol → LSP8Votes/LSP8VotesInitAbstract.sol} +3 -3
- package/contracts/presets/LSP8CustomizableToken.sol +277 -0
- package/contracts/presets/LSP8CustomizableTokenConstants.sol +32 -0
- package/contracts/presets/LSP8CustomizableTokenInit.sol +318 -0
- package/contracts/presets/LSP8Mintable.sol +13 -28
- package/contracts/presets/LSP8MintableInit.sol +13 -6
- package/dist/abi.cjs +8351 -136
- package/dist/abi.d.cts +12122 -266
- package/dist/abi.d.mts +12122 -266
- package/dist/abi.d.ts +12122 -266
- package/dist/abi.mjs +8335 -136
- package/dist/constants.cjs +21 -0
- package/dist/constants.d.cts +12 -1
- package/dist/constants.d.mts +12 -1
- package/dist/constants.d.ts +12 -1
- package/dist/constants.mjs +16 -1
- package/package.json +32 -9
- package/contracts/extensions/LSP8CappedSupply.sol +0 -85
- package/contracts/extensions/LSP8CappedSupplyInitAbstract.sol +0 -88
- package/contracts/presets/ILSP8Mintable.sol +0 -33
- package/contracts/presets/LSP8MintableInitAbstract.sol +0 -62
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
-
pragma solidity ^0.8.
|
|
2
|
+
pragma solidity ^0.8.27;
|
|
3
3
|
|
|
4
4
|
// interfaces
|
|
5
|
-
import {
|
|
6
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
214
|
-
|
|
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
|
-
|
|
251
|
-
|
|
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
|
-
|
|
355
|
-
|
|
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
|
-
|
|
392
|
-
tokenIds.length
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
}
|
|
372
|
+
require(
|
|
373
|
+
tokenIds.length == dataKeys.length &&
|
|
374
|
+
dataKeys.length == dataValues.length,
|
|
375
|
+
LSP8TokenIdsDataLengthMismatch()
|
|
376
|
+
);
|
|
397
377
|
|
|
398
|
-
|
|
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
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
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
|
-
|
|
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
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
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
|
-
|
|
521
|
-
|
|
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
|
-
|
|
590
|
-
|
|
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
|
-
|
|
608
|
-
fromLength
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
723
|
-
revert LSP8CannotSendToAddressZero();
|
|
724
|
-
}
|
|
685
|
+
require(to != address(0), LSP8CannotSendToAddressZero());
|
|
725
686
|
|
|
726
687
|
// Check that `tokenId` is not already minted
|
|
727
|
-
|
|
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
|
-
|
|
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
|
-
|
|
848
|
-
|
|
849
|
-
|
|
804
|
+
require(
|
|
805
|
+
from == tokenOwner,
|
|
806
|
+
LSP8NotTokenOwner(tokenOwner, tokenId, from)
|
|
807
|
+
);
|
|
850
808
|
|
|
851
|
-
|
|
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
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
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
|
*/
|