Skip to content

Commit 1f1b731

Browse files
feat: mr suggestions, combining, renaming methods, specifying type in docs (#198)
Signed-off-by: Mariusz Jasuwienas <mariusz.jasuwienas@arianelabs.com>
1 parent 4b2d7e4 commit 1f1b731

File tree

7 files changed

+35
-36
lines changed

7 files changed

+35
-36
lines changed

contracts/HtsSystemContract.sol

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ contract HtsSystemContract is IHederaTokenService {
1515
/**
1616
* The slot's value contains the next token ID to use when a token is being created.
1717
*
18-
* This slot is used in the `0x167` address.
18+
* This slot is used in the `0x167` address.
1919
* It cannot be used as a state variable directly.
2020
* This is because JS' `getHtsStorageAt` implementation assumes all state variables
2121
* declared here are part of the token address space.
@@ -28,7 +28,7 @@ contract HtsSystemContract is IHederaTokenService {
2828
// See `__redirectForToken` for more details.
2929
//
3030
// Moreover, these variables must match the slots defined in `SetTokenInfo`.
31-
string internal tokenType;
31+
string internal tokenType;
3232
uint8 internal decimals;
3333
TokenInfo internal _tokenInfo;
3434

@@ -412,18 +412,10 @@ contract HtsSystemContract is IHederaTokenService {
412412
function getNonFungibleTokenInfo(address token, int64 serialNumber)
413413
htsCall external
414414
returns (int64, NonFungibleTokenInfo memory) {
415-
(int64 responseCode, TokenInfo memory tokenInfo) = getTokenInfo(token);
416-
require(responseCode == HederaResponseCodes.SUCCESS, "getNonFungibleTokenInfo: failed to get token data");
417-
(, NonFungibleTokenInfo memory nonFungibleTokenInfo) = IHederaTokenService(token).getNonFungibleTokenInfo(
415+
return IHederaTokenService(token).getNonFungibleTokenInfo(
418416
token,
419417
serialNumber
420418
);
421-
nonFungibleTokenInfo.tokenInfo = tokenInfo;
422-
nonFungibleTokenInfo.serialNumber = serialNumber;
423-
nonFungibleTokenInfo.spenderId = IERC721(token).getApproved(uint256(uint64(serialNumber)));
424-
nonFungibleTokenInfo.ownerId = IERC721(token).ownerOf(uint256(uint64(serialNumber)));
425-
426-
return (responseCode, nonFungibleTokenInfo);
427419
}
428420

429421
function isToken(address token) htsCall external returns (int64, bool) {
@@ -595,11 +587,16 @@ contract HtsSystemContract is IHederaTokenService {
595587
if (selector == this.getNonFungibleTokenInfo.selector) {
596588
require(msg.data.length >= 92, "getNonFungibleTokenInfo: Not enough calldata");
597589
uint256 serialId = uint256(bytes32(msg.data[60:92]));
598-
NonFungibleTokenInfo memory info;
590+
NonFungibleTokenInfo memory nonFungibleTokenInfo;
599591
(int64 creationTime, bytes memory metadata) = __nftInfo(serialId);
600-
info.creationTime = creationTime;
601-
info.metadata = metadata;
602-
return abi.encode(HederaResponseCodes.SUCCESS, info);
592+
nonFungibleTokenInfo.tokenInfo = _tokenInfo;
593+
nonFungibleTokenInfo.serialNumber = int64(int256(serialId));
594+
nonFungibleTokenInfo.ownerId = __ownerOf(serialId);
595+
nonFungibleTokenInfo.creationTime = creationTime;
596+
nonFungibleTokenInfo.metadata = metadata;
597+
nonFungibleTokenInfo.spenderId = __getApproved(serialId);
598+
599+
return abi.encode(HederaResponseCodes.SUCCESS, nonFungibleTokenInfo);
603600
}
604601
if (selector == this._update.selector) {
605602
require(msg.data.length >= 124, "update: Not enough calldata");

contracts/HtsSystemContractJson.sol

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -456,20 +456,24 @@ contract HtsSystemContractJson is HtsSystemContract {
456456
function _tokenUriSlot(uint32 serialId) internal override virtual returns (bytes32) {
457457
bytes32 slot = super._tokenUriSlot(serialId);
458458
if (_shouldFetch(slot)) {
459-
string memory metadata = mirrorNode().getNftMetadata(address(this), serialId);
459+
(string memory metadata, ) = mirrorNode().getNftMetadataAndCreatedTimestamp(address(this), serialId);
460460
string memory uri = string(decode(metadata));
461461
storeString(address(this), uint256(slot), uri);
462+
vm.store(_scratchAddr(), slot, bytes32(uint(1)));
462463
}
463464
return slot;
464465
}
465466

466467
function __nftInfoSlot(uint32 serialId) internal override virtual returns (bytes32) {
467468
bytes32 slot = super.__nftInfoSlot(serialId);
468469
if (_shouldFetch(slot)) {
469-
string memory metadata = mirrorNode().getNftMetadata(address(this), serialId);
470-
string memory createdTimestamp = mirrorNode().getNftCreatedTimestamp(address(this), serialId);
470+
(string memory metadata, string memory createdTimestamp) = mirrorNode().getNftMetadataAndCreatedTimestamp(
471+
address(this),
472+
serialId
473+
);
471474
int64 creationTime = int64(vm.parseInt(vm.split(createdTimestamp, ".")[0]));
472475
storeBytes(address(this), uint256(slot), abi.encode(creationTime, bytes(metadata)));
476+
vm.store(_scratchAddr(), slot, bytes32(uint(1)));
473477
}
474478
return slot;
475479
}

contracts/MirrorNode.sol

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,26 +30,24 @@ abstract contract MirrorNode {
3030

3131
function fetchTokenRelationshipOfAccount(string memory account, address token) external virtual returns (string memory json);
3232

33-
function fetchNonFungibleToken(address token, uint32 serial) external virtual returns (string memory json);
33+
function fetchNonFungibleTokenSerial(address token, uint32 serial) external virtual returns (string memory json);
3434

35-
function getNftMetadata(address token, uint32 serial) external returns (string memory) {
36-
string memory json = this.fetchNonFungibleToken(token, serial);
35+
function getNftMetadataAndCreatedTimestamp(address token, uint32 serial) external returns (string memory metadata, string memory createdTimestamp) {
36+
string memory json = this.fetchNonFungibleTokenSerial(token, serial);
3737
if (vm.keyExistsJson(json, ".metadata")) {
38-
return vm.parseJsonString(json, ".metadata");
38+
metadata = vm.parseJsonString(json, ".metadata");
39+
} else {
40+
metadata = "";
3941
}
40-
return "";
41-
}
42-
43-
function getNftCreatedTimestamp(address token, uint32 serial) external returns (string memory) {
44-
string memory json = this.fetchNonFungibleToken(token, serial);
4542
if (vm.keyExistsJson(json, ".created_timestamp")) {
46-
return vm.parseJsonString(json, ".created_timestamp");
43+
createdTimestamp = vm.parseJsonString(json, ".created_timestamp");
44+
} else {
45+
createdTimestamp = "";
4746
}
48-
return "";
4947
}
5048

5149
function getNftOwner(address token, uint32 serial) external returns (address) {
52-
string memory json = this.fetchNonFungibleToken(token, serial);
50+
string memory json = this.fetchNonFungibleTokenSerial(token, serial);
5351
if (vm.keyExistsJson(json, ".account_id")) {
5452
string memory owner = vm.parseJsonString(json, ".account_id");
5553
return getAccountAddress(owner);
@@ -58,7 +56,7 @@ abstract contract MirrorNode {
5856
}
5957

6058
function getNftSpender(address token, uint32 serial) external returns (address) {
61-
string memory json = this.fetchNonFungibleToken(token, serial);
59+
string memory json = this.fetchNonFungibleTokenSerial(token, serial);
6260
if (vm.keyExistsJson(json, ".spender")) {
6361
string memory spender = vm.parseJsonString(json, ".spender");
6462
return getAccountAddress(spender);

contracts/MirrorNodeFFI.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ contract MirrorNodeFFI is MirrorNode {
8080
));
8181
}
8282

83-
function fetchNonFungibleToken(address token, uint32 serial) isValid(token) external override returns (string memory) {
83+
function fetchNonFungibleTokenSerial(address token, uint32 serial) isValid(token) external override returns (string memory) {
8484
return _get(string.concat(
8585
"tokens/0.0.",
8686
vm.toString(uint160(token)),

src/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ async function getHtsStorageAt(address, requestedSlot, blockNumber, mirrorNodeCl
248248
tokenId,
249249
blockNumber,
250250
nrequestedSlot,
251-
atob(metadata),
251+
Buffer.from(metadata, 'base64').toString(),
252252
't_string_storage'
253253
);
254254
}
@@ -273,7 +273,7 @@ async function getHtsStorageAt(address, requestedSlot, blockNumber, mirrorNodeCl
273273
`Failed to get the metadata of the NFT ${tokenId}#${serialId}`
274274
);
275275
const timestamp = Number(created_timestamp.split('.')[0]).toString(16).padStart(64, '0');
276-
const metadataEncoded = Buffer.from(metadata).toString('hex');
276+
const metadataEncoded = Buffer.from(metadata, 'utf-8').toString('hex');
277277
const metadataLength = metadata.length.toString(16).padStart(64, '0');
278278
const stringTypeIndicator = '40'.padStart(64, '0');
279279
const bytes = `${timestamp}${stringTypeIndicator}${metadataLength}${metadataEncoded}`;

src/slotmap.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ class PersistentStorageMap {
316316
* @param {number} blockNumber
317317
* @param {bigint} slot
318318
* @param {Value} value
319-
* @param {string} type
319+
* @param {'t_string_storage' | 't_bytes_storage'} type
320320
*/
321321
store(tokenId, blockNumber, slot, value, type) {
322322
visit(

test/lib/MirrorNodeMock.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ contract MirrorNodeMock is MirrorNode {
5858
return vm.readFile(path);
5959
}
6060

61-
function fetchNonFungibleToken(address token, uint32 serial) external override view returns (string memory) {
61+
function fetchNonFungibleTokenSerial(address token, uint32 serial) external override view returns (string memory) {
6262
string memory symbol = _symbolOf[token];
6363
string memory serialId = vm.toString(serial);
6464
string memory path = string.concat("./test/data/", symbol, "/getNonFungibleToken_", serialId, ".json");

0 commit comments

Comments
 (0)