diff --git a/contracts/chip1155/BEChip1155.sol b/contracts/chip1155/BEChip1155.sol index d362e26..d58b776 100644 --- a/contracts/chip1155/BEChip1155.sol +++ b/contracts/chip1155/BEChip1155.sol @@ -172,6 +172,16 @@ contract BEChip1155 is ERC1155, AccessControl { return lockedTokens[id]; } + function isLockedBatch(uint256[] memory ids) external view + returns (bool[] memory) { + uint256 len = ids.length; + bool[] memory results = new bool[](len); + for (uint256 i = 0; i < len; ++i) { + results[i] = lockedTokens[ids[i]]; + } + return results; + } + /** * @dev See {ERC1155-_beforeTokenTransfer}. */ @@ -185,6 +195,9 @@ contract BEChip1155 is ERC1155, AccessControl { ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 len = ids.length; + for (uint256 i = 0; i < len; ++i) { + require(!lockedTokens[ids[i]], "Can not transfer locked token"); + } if (from == address(0)) { // mint nft for (uint256 i = 0; i < len; ++i) { @@ -246,12 +259,18 @@ contract BEChip1155 is ERC1155, AccessControl { uint256 page ) external view returns (TokenStruct[] memory) { uint256 size = _ownedTokens[user].length; - TokenStruct[] memory results = new TokenStruct[](page); + uint256 max = size; + uint256 pageSize = 0; if (start < size) { - uint256 max = size; - if (start + page < size) { - max = start + page; - } + if (start + page < size) { + pageSize = page; + max = start + page; + } else { + pageSize = size - start; + } + } + TokenStruct[] memory results = new TokenStruct[](pageSize); + if (pageSize > 0) { for (uint256 i = start; i < max; ++i) { TokenStruct memory dataObj; uint256 tokenId = _ownedTokens[user][i];