// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.23; import { Test, console2 } from "forge-std/Test.sol"; import { DappIndexer } from "src/DappIndexer.sol"; contract DappIndexerTest is Test { DappIndexer public dappIdxr; string[] public dappsURI; function setUp() public { dappIdxr = new DappIndexer(address(this), address(this)); dappsURI = vm.envString("dapps", ' '); } function testAddDapp() public { bytes32 CID1; bytes32 CID2; //(CID1, CID2) = stringToBytes32Pair(dappsURI[0]); string memory dapp= "bafkreibc6p3y36yjmeqqnttqfrpb2yttxa6aonoywxwdxl7nqym4jj3jwa"; (CID1, CID2) = stringToBytes32Pair(dapp); // Add Dapp console2.log("Bytes32 first:"); console2.logBytes32(CID1); console2.log("Bytes32 second:"); console2.logBytes32(CID2); console2.log(Bytes32PairToString(CID1, CID2)); dappIdxr.addDapp(bytes32("Dapp01"), DappIndexer.PackedCID(CID1, CID2)); // retrive Dapp DappIndexer.PackedCID memory dapp1 = dappIdxr.getCID(bytes32("Dapp01")); assertEq(CID1, dapp1.CID1); assertEq(CID2, dapp1.CID2); assertEq(dappsURI[0], Bytes32PairToString(dapp1.CID1, dapp1.CID2)); } function Bytes32PairToString(bytes32 part1, bytes32 part2) public pure returns (string memory) { // Concatenate the two bytes32 variables bytes memory concatenatedBytes = abi.encodePacked(part1, part2); // Convert the concatenated bytes to a string string memory str = string(concatenatedBytes); return str; } function stringToBytes32Pair(string memory source) public pure returns (bytes32 part1, bytes32 part2) { bytes memory sourceBytes = bytes(source); require(sourceBytes.length == 59, "Source string must be 59 bytes"); assembly { // Load the first 32 bytes of the string data part1 := mload(add(sourceBytes, 32)) // Load the next 32 bytes of the string data, then shift right by 3 bytes (24 bits) to remove unwanted bytes part2 := mload(add(sourceBytes, 64)) part2 := shl(24, part2) // Shift left to remove the last 5 bytes part2 := shr(24, part2) // Shift right to align back to the least significant bits } } //function stringToBytes32Pair(string memory source) public pure returns (bytes32 part1, bytes32 part2) { // bytes memory sourceBytes = bytes(source); // require(sourceBytes.length == 59, "URI string must equal to 59 bytes"); // assembly { // // Load the first 32 bytes of the string data // part1 := mload(add(sourceBytes, 32)) // // Load the second 32 bytes of the string data // part2 := mload(add(sourceBytes, 58)) // } //} } // function stringToBytes32Pair(string calldata str) external pure returns(bytes32 part1, bytes32 part2) { // bytes memory sourceBytes = bytes(str); // require(sourceBytes.length == 59, "Source string must be 59 bytes"); // part1 = bytes(str[0:32]); // part2 = bytes(str[32:59]); // // return (part1, part2); // }