diff --git a/build/index.html b/build/index.html index d979268..e93e95d 100644 --- a/build/index.html +++ b/build/index.html @@ -4,13 +4,12 @@ Web4 Profile - +
- Profile Picture

@@ -21,10 +20,69 @@

- - +

Extra Long Content

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec at ullamcorper massa, vel dapibus purus. Curabitur iaculis venenatis faucibus. Curabitur est arcu, tincidunt ac tellus nec, auctor luctus diam. Ut accumsan, velit vitae maximus dictum, erat velit lobortis libero, eu porttitor diam nisl at lacus. Vivamus viverra venenatis lobortis. Fusce pulvinar lorem a sem laoreet, eu interdum ipsum efficitur. Pellentesque lobortis fermentum orci ac tincidunt. Morbi ultricies pellentesque nibh, ut sagittis magna consequat eget. Curabitur sodales felis augue, at placerat justo ornare et. Duis faucibus imperdiet pharetra. Sed id sapien eget ipsum scelerisque gravida sed in purus. Vestibulum leo neque, rutrum sed vehicula vel, euismod et nulla. Morbi eget molestie ante, ac rhoncus sem. Suspendisse potenti. Aenean cursus sem a turpis varius viverra vitae ut nisl. + + Aenean fringilla luctus condimentum. Ut porttitor metus nec leo mollis, a hendrerit urna suscipit. Donec placerat eget quam consectetur elementum. Donec venenatis ornare metus, at tristique purus malesuada a. Sed faucibus ex a mollis ultricies. Duis congue fringilla libero, nec lobortis elit ullamcorper vel. Donec eget velit in tellus ultrices viverra. Sed accumsan, est sed dictum lacinia, mi odio suscipit metus, vitae posuere turpis metus ac ipsum. Morbi quam elit, placerat vel faucibus eu, bibendum id nunc. Cras sed porttitor nulla. Phasellus eget tristique ligula. + + Curabitur lacinia congue augue facilisis consectetur. Nulla ut faucibus tortor, a posuere nisl. Fusce bibendum porta accumsan. Praesent vel dignissim quam. Morbi molestie velit at neque mollis suscipit. Aenean luctus ac turpis id pellentesque. Donec et rutrum risus, cursus varius leo. Aliquam suscipit hendrerit maximus. Maecenas ac imperdiet risus. Integer sit amet fermentum sem. Curabitur at tortor vitae purus convallis lacinia sit amet ut mi. Donec feugiat, magna eu sodales lobortis, dolor ante varius enim, eget vulputate ipsum purus quis sem. Nulla convallis arcu id erat blandit, sit amet dignissim sem pharetra. In non rutrum orci. + + Duis turpis nisi, aliquet nec mauris et, iaculis commodo est. Proin finibus risus sit amet hendrerit rhoncus. Nunc dapibus elementum elit, pulvinar ultrices eros. Fusce venenatis nulla sit amet eros varius mattis. Ut ac est dolor. Etiam nec felis vel tellus posuere facilisis at et quam. Vestibulum ornare ante risus, ac lobortis tortor ultricies vel. Maecenas ultricies, ante sed commodo congue, felis tellus bibendum quam, sed suscipit arcu lacus sit amet nibh. Donec ultrices et lectus a varius. + + Donec lobortis vestibulum magna a tincidunt. Integer ultricies lacus eget neque mollis, ut viverra enim varius. Fusce eget leo in justo sodales laoreet. Sed gravida elementum turpis et bibendum. Curabitur fringilla, velit ut suscipit ullamcorper, leo nibh tincidunt urna, eu suscipit lorem purus a metus. Nulla dolor est, luctus nec pellentesque in, pulvinar eget sapien. Nulla efficitur finibus urna, vel hendrerit ipsum iaculis at. Nullam sodales lobortis vehicula. Praesent molestie lacus ut velit fringilla, quis sodales mauris ultrices. Donec non eros lectus. Sed efficitur turpis at orci posuere congue. In sit amet nulla diam. Praesent nisi risus, lacinia eu ornare et, sollicitudin quis orci. + + Sed vitae odio mauris. Nam aliquet posuere dolor sit amet sagittis. Vivamus suscipit vestibulum dignissim. Quisque viverra sed diam ut interdum. Pellentesque convallis rutrum quam eget facilisis. Curabitur sodales vehicula mi, eu volutpat nibh vulputate semper. Proin pretium tempor tincidunt. Maecenas posuere felis sodales, varius lacus ac, euismod dui. Nulla gravida porta neque, rutrum euismod tortor feugiat sed. Praesent feugiat ligula vitae lobortis tincidunt. Morbi diam ipsum, condimentum nec malesuada tincidunt, laoreet quis risus. Nunc id sollicitudin tellus. Nunc non blandit nulla, in eleifend lacus. + + Etiam vitae ante consequat, dictum enim non, mattis nunc. Praesent vel justo quis nisi porta laoreet. Donec justo lorem, accumsan ac faucibus sit amet, consectetur nec massa. Pellentesque nec finibus justo. Proin rutrum lobortis lorem id dignissim. Morbi at neque sodales, dictum ex a, cursus nisi. Mauris venenatis sem ut erat viverra eleifend in non tortor. + + Donec imperdiet neque ligula, ut vulputate lectus sodales eu. Praesent tristique orci urna, vel elementum sapien auctor a. Pellentesque nec aliquet nisi. Proin vel cursus massa. In neque libero, tempor nec sagittis eget, ultrices at ligula. Aenean pharetra, erat vitae ornare tincidunt, nisl leo vulputate libero, eu hendrerit ipsum neque pharetra magna. Vivamus augue turpis, dictum eu leo et, luctus fermentum tortor. Praesent cursus vulputate est. Pellentesque eget quam pretium, iaculis justo sed, bibendum massa. In fermentum risus est, gravida volutpat tellus elementum a. Nam eu porta nisl. Quisque auctor nunc nec dapibus sodales. Donec dictum malesuada ligula quis placerat. Praesent eget ipsum quis arcu hendrerit mattis vel ut erat. Sed vitae quam molestie, vestibulum purus eget, elementum sapien. + + Nunc eu felis accumsan, venenatis lacus ut, facilisis dolor. Aliquam volutpat, nulla ut rutrum imperdiet, enim orci varius arcu, et faucibus metus nisl ut velit. Nunc tellus libero, interdum sit amet elit sed, mattis suscipit sapien. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin sem turpis, convallis non blandit a, dictum et nulla. Mauris vestibulum libero mauris, non auctor tellus sodales imperdiet. Donec pretium sed risus eget commodo. Nullam laoreet elementum urna, a cursus lacus ullamcorper a. Curabitur interdum lacinia lorem, sed congue turpis volutpat et. Proin ac mauris eros. Duis imperdiet luctus ante, tempus finibus augue mollis dignissim. + + Etiam laoreet nisi magna, quis dapibus quam venenatis ac. Interdum et malesuada fames ac ante ipsum primis in faucibus. Curabitur pretium suscipit nulla, at sollicitudin sapien. Nulla ultrices, justo id tincidunt elementum, odio tellus dignissim dolor, ut viverra nunc purus sed justo. Donec vestibulum lorem ac sapien egestas pretium vitae id enim. Sed in purus felis. Nullam quis ullamcorper lectus. Suspendisse cursus lorem vitae orci congue, vitae ornare risus sodales. Nunc dui leo, lacinia sed dignissim euismod, ultricies a lectus. Praesent molestie feugiat dapibus. Suspendisse potenti. Aenean at faucibus mauris. Fusce in suscipit metus. + + Integer congue enim at ante blandit, vitae consectetur risus auctor. Morbi efficitur convallis sem id aliquet. Aliquam aliquam rhoncus nisi quis laoreet. Ut tincidunt dolor turpis, eu gravida erat porttitor vel. Morbi vitae nisi est. Quisque luctus vel dui efficitur molestie. Morbi dictum purus id libero tristique, vitae egestas augue sollicitudin. Nullam bibendum sem urna, sed blandit orci tempor vel. Suspendisse potenti. + + Integer varius lacus non placerat ultricies. Donec ut accumsan lorem, ullamcorper varius lectus. Pellentesque luctus feugiat suscipit. Donec laoreet mi eu libero viverra viverra. Nam quis commodo nisl. Pellentesque rutrum eros porttitor, dictum est at, condimentum purus. Curabitur tempor dignissim ipsum, vitae ullamcorper orci consectetur eu. Fusce pulvinar hendrerit nisl quis commodo. + + Fusce nec urna in justo ornare congue. In dapibus arcu id justo cursus pulvinar. Maecenas pellentesque nec dui vitae porta. Cras posuere tempus purus id elementum. Sed sed turpis ac enim porttitor interdum ut ac ex. Morbi congue magna et porttitor aliquam. Nulla elementum, libero at tincidunt convallis, diam metus posuere metus, id tempus sem turpis eu sapien. Integer ornare lorem bibendum, luctus risus sed, elementum elit. In tempor ullamcorper metus, in cursus sem iaculis et. + + Fusce aliquam sem nec commodo malesuada. In laoreet luctus nisi at elementum. Phasellus maximus nunc nisi, eu maximus risus sollicitudin a. Phasellus non nisi augue. Praesent nisi nisl, bibendum lobortis dignissim at, mattis in ipsum. Cras lorem nibh, lobortis vitae orci vestibulum, bibendum sollicitudin nisi. Nam ut malesuada justo. Nullam convallis nulla scelerisque arcu feugiat, id viverra ante commodo. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam odio erat, luctus scelerisque consequat nec, commodo nec nibh. Vivamus ultricies ex ipsum, sed consequat nisl commodo sit amet. + + Ut dictum augue eu pretium semper. Ut ac metus ac arcu dapibus finibus. Vivamus sit amet urna bibendum diam ullamcorper finibus. Cras ut ligula mollis, ornare quam nec, porta diam. Sed sit amet sem dolor. Morbi et quam a sem placerat dapibus in eu diam. Vivamus nisl eros, condimentum vitae tincidunt at, venenatis sit amet augue. Donec ex nisi, semper a tortor a, ultricies pharetra nisl. Curabitur sit amet nibh eu nisi auctor dignissim non at odio. Praesent suscipit imperdiet lacus ut scelerisque. Suspendisse potenti. Praesent fringilla feugiat augue a rhoncus. Maecenas sit amet est nisl. Ut malesuada, lacus vitae ornare dictum, diam mauris porttitor metus, mattis dictum dolor sapien eget justo. Nulla luctus libero nisi.

+ +

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec at ullamcorper massa, vel dapibus purus. Curabitur iaculis venenatis faucibus. Curabitur est arcu, tincidunt ac tellus nec, auctor luctus diam. Ut accumsan, velit vitae maximus dictum, erat velit lobortis libero, eu porttitor diam nisl at lacus. Vivamus viverra venenatis lobortis. Fusce pulvinar lorem a sem laoreet, eu interdum ipsum efficitur. Pellentesque lobortis fermentum orci ac tincidunt. Morbi ultricies pellentesque nibh, ut sagittis magna consequat eget. Curabitur sodales felis augue, at placerat justo ornare et. Duis faucibus imperdiet pharetra. Sed id sapien eget ipsum scelerisque gravida sed in purus. Vestibulum leo neque, rutrum sed vehicula vel, euismod et nulla. Morbi eget molestie ante, ac rhoncus sem. Suspendisse potenti. Aenean cursus sem a turpis varius viverra vitae ut nisl. + + Aenean fringilla luctus condimentum. Ut porttitor metus nec leo mollis, a hendrerit urna suscipit. Donec placerat eget quam consectetur elementum. Donec venenatis ornare metus, at tristique purus malesuada a. Sed faucibus ex a mollis ultricies. Duis congue fringilla libero, nec lobortis elit ullamcorper vel. Donec eget velit in tellus ultrices viverra. Sed accumsan, est sed dictum lacinia, mi odio suscipit metus, vitae posuere turpis metus ac ipsum. Morbi quam elit, placerat vel faucibus eu, bibendum id nunc. Cras sed porttitor nulla. Phasellus eget tristique ligula. + + Curabitur lacinia congue augue facilisis consectetur. Nulla ut faucibus tortor, a posuere nisl. Fusce bibendum porta accumsan. Praesent vel dignissim quam. Morbi molestie velit at neque mollis suscipit. Aenean luctus ac turpis id pellentesque. Donec et rutrum risus, cursus varius leo. Aliquam suscipit hendrerit maximus. Maecenas ac imperdiet risus. Integer sit amet fermentum sem. Curabitur at tortor vitae purus convallis lacinia sit amet ut mi. Donec feugiat, magna eu sodales lobortis, dolor ante varius enim, eget vulputate ipsum purus quis sem. Nulla convallis arcu id erat blandit, sit amet dignissim sem pharetra. In non rutrum orci. + + Duis turpis nisi, aliquet nec mauris et, iaculis commodo est. Proin finibus risus sit amet hendrerit rhoncus. Nunc dapibus elementum elit, pulvinar ultrices eros. Fusce venenatis nulla sit amet eros varius mattis. Ut ac est dolor. Etiam nec felis vel tellus posuere facilisis at et quam. Vestibulum ornare ante risus, ac lobortis tortor ultricies vel. Maecenas ultricies, ante sed commodo congue, felis tellus bibendum quam, sed suscipit arcu lacus sit amet nibh. Donec ultrices et lectus a varius. + + Donec lobortis vestibulum magna a tincidunt. Integer ultricies lacus eget neque mollis, ut viverra enim varius. Fusce eget leo in justo sodales laoreet. Sed gravida elementum turpis et bibendum. Curabitur fringilla, velit ut suscipit ullamcorper, leo nibh tincidunt urna, eu suscipit lorem purus a metus. Nulla dolor est, luctus nec pellentesque in, pulvinar eget sapien. Nulla efficitur finibus urna, vel hendrerit ipsum iaculis at. Nullam sodales lobortis vehicula. Praesent molestie lacus ut velit fringilla, quis sodales mauris ultrices. Donec non eros lectus. Sed efficitur turpis at orci posuere congue. In sit amet nulla diam. Praesent nisi risus, lacinia eu ornare et, sollicitudin quis orci. + + Sed vitae odio mauris. Nam aliquet posuere dolor sit amet sagittis. Vivamus suscipit vestibulum dignissim. Quisque viverra sed diam ut interdum. Pellentesque convallis rutrum quam eget facilisis. Curabitur sodales vehicula mi, eu volutpat nibh vulputate semper. Proin pretium tempor tincidunt. Maecenas posuere felis sodales, varius lacus ac, euismod dui. Nulla gravida porta neque, rutrum euismod tortor feugiat sed. Praesent feugiat ligula vitae lobortis tincidunt. Morbi diam ipsum, condimentum nec malesuada tincidunt, laoreet quis risus. Nunc id sollicitudin tellus. Nunc non blandit nulla, in eleifend lacus. + + Etiam vitae ante consequat, dictum enim non, mattis nunc. Praesent vel justo quis nisi porta laoreet. Donec justo lorem, accumsan ac faucibus sit amet, consectetur nec massa. Pellentesque nec finibus justo. Proin rutrum lobortis lorem id dignissim. Morbi at neque sodales, dictum ex a, cursus nisi. Mauris venenatis sem ut erat viverra eleifend in non tortor. + + Donec imperdiet neque ligula, ut vulputate lectus sodales eu. Praesent tristique orci urna, vel elementum sapien auctor a. Pellentesque nec aliquet nisi. Proin vel cursus massa. In neque libero, tempor nec sagittis eget, ultrices at ligula. Aenean pharetra, erat vitae ornare tincidunt, nisl leo vulputate libero, eu hendrerit ipsum neque pharetra magna. Vivamus augue turpis, dictum eu leo et, luctus fermentum tortor. Praesent cursus vulputate est. Pellentesque eget quam pretium, iaculis justo sed, bibendum massa. In fermentum risus est, gravida volutpat tellus elementum a. Nam eu porta nisl. Quisque auctor nunc nec dapibus sodales. Donec dictum malesuada ligula quis placerat. Praesent eget ipsum quis arcu hendrerit mattis vel ut erat. Sed vitae quam molestie, vestibulum purus eget, elementum sapien. + + Nunc eu felis accumsan, venenatis lacus ut, facilisis dolor. Aliquam volutpat, nulla ut rutrum imperdiet, enim orci varius arcu, et faucibus metus nisl ut velit. Nunc tellus libero, interdum sit amet elit sed, mattis suscipit sapien. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin sem turpis, convallis non blandit a, dictum et nulla. Mauris vestibulum libero mauris, non auctor tellus sodales imperdiet. Donec pretium sed risus eget commodo. Nullam laoreet elementum urna, a cursus lacus ullamcorper a. Curabitur interdum lacinia lorem, sed congue turpis volutpat et. Proin ac mauris eros. Duis imperdiet luctus ante, tempus finibus augue mollis dignissim. + + Etiam laoreet nisi magna, quis dapibus quam venenatis ac. Interdum et malesuada fames ac ante ipsum primis in faucibus. Curabitur pretium suscipit nulla, at sollicitudin sapien. Nulla ultrices, justo id tincidunt elementum, odio tellus dignissim dolor, ut viverra nunc purus sed justo. Donec vestibulum lorem ac sapien egestas pretium vitae id enim. Sed in purus felis. Nullam quis ullamcorper lectus. Suspendisse cursus lorem vitae orci congue, vitae ornare risus sodales. Nunc dui leo, lacinia sed dignissim euismod, ultricies a lectus. Praesent molestie feugiat dapibus. Suspendisse potenti. Aenean at faucibus mauris. Fusce in suscipit metus. + + Integer congue enim at ante blandit, vitae consectetur risus auctor. Morbi efficitur convallis sem id aliquet. Aliquam aliquam rhoncus nisi quis laoreet. Ut tincidunt dolor turpis, eu gravida erat porttitor vel. Morbi vitae nisi est. Quisque luctus vel dui efficitur molestie. Morbi dictum purus id libero tristique, vitae egestas augue sollicitudin. Nullam bibendum sem urna, sed blandit orci tempor vel. Suspendisse potenti. + + Integer varius lacus non placerat ultricies. Donec ut accumsan lorem, ullamcorper varius lectus. Pellentesque luctus feugiat suscipit. Donec laoreet mi eu libero viverra viverra. Nam quis commodo nisl. Pellentesque rutrum eros porttitor, dictum est at, condimentum purus. Curabitur tempor dignissim ipsum, vitae ullamcorper orci consectetur eu. Fusce pulvinar hendrerit nisl quis commodo. + + Fusce nec urna in justo ornare congue. In dapibus arcu id justo cursus pulvinar. Maecenas pellentesque nec dui vitae porta. Cras posuere tempus purus id elementum. Sed sed turpis ac enim porttitor interdum ut ac ex. Morbi congue magna et porttitor aliquam. Nulla elementum, libero at tincidunt convallis, diam metus posuere metus, id tempus sem turpis eu sapien. Integer ornare lorem bibendum, luctus risus sed, elementum elit. In tempor ullamcorper metus, in cursus sem iaculis et. + + Fusce aliquam sem nec commodo malesuada. In laoreet luctus nisi at elementum. Phasellus maximus nunc nisi, eu maximus risus sollicitudin a. Phasellus non nisi augue. Praesent nisi nisl, bibendum lobortis dignissim at, mattis in ipsum. Cras lorem nibh, lobortis vitae orci vestibulum, bibendum sollicitudin nisi. Nam ut malesuada justo. Nullam convallis nulla scelerisque arcu feugiat, id viverra ante commodo. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam odio erat, luctus scelerisque consequat nec, commodo nec nibh. Vivamus ultricies ex ipsum, sed consequat nisl commodo sit amet. + + Ut dictum augue eu pretium semper. Ut ac metus ac arcu dapibus finibus. Vivamus sit amet urna bibendum diam ullamcorper finibus. Cras ut ligula mollis, ornare quam nec, porta diam. Sed sit amet sem dolor. Morbi et quam a sem placerat dapibus in eu diam. Vivamus nisl eros, condimentum vitae tincidunt at, venenatis sit amet augue. Donec ex nisi, semper a tortor a, ultricies pharetra nisl. Curabitur sit amet nibh eu nisi auctor dignissim non at odio. Praesent suscipit imperdiet lacus ut scelerisque. Suspendisse potenti. Praesent fringilla feugiat augue a rhoncus. Maecenas sit amet est nisl. Ut malesuada, lacus vitae ornare dictum, diam mauris porttitor metus, mattis dictum dolor sapien eget justo. Nulla luctus libero nisi.

+

end

+ + \ No newline at end of file diff --git a/contracts/WebContract.sol b/contracts/WebContract.sol index 8473630..1eecac1 100644 --- a/contracts/WebContract.sol +++ b/contracts/WebContract.sol @@ -145,7 +145,7 @@ abstract contract WebContract is TokenManager { /// @notice Represents a resource file with content chunks and content type struct ResourceFile { - bytes[] content; + bytes content; string contentType; uint8 redirectCode; } @@ -156,66 +156,43 @@ abstract contract WebContract is TokenManager { /// @param _path Path of the resource /// @param _content Content of the chunk /// @param _contentType Content type of the resource - /// @param _chunkIndex Index of the chunk - /// @dev Can only be called by an admin when the contract is not locked - function setResourceChunk( + /// @param _replace Replace or concat the resource + function setResource( string calldata _path, bytes calldata _content, string calldata _contentType, - uint256 _chunkIndex, + bool _replace, uint8 _redirectCode ) public virtual onlyAdmin notLocked { ResourceFile storage file = resourceFiles[_path]; - bytes[] storage chunks = file.content; require(bytes(_contentType).length > 0, "Content type is required"); - if (bytes(file.contentType).length == 0) { - // If the contentType is not set, this is a new file + if ( + keccak256(abi.encode(_contentType)) != + keccak256(abi.encode(file.contentType)) + ) { file.contentType = _contentType; - chunks.push(_content); + } + if (_redirectCode != file.redirectCode) { file.redirectCode = _redirectCode; + } + if (_replace) { + // If the contentType is not set, this is a new file + file.content = _content; } else { - require( - keccak256(abi.encodePacked(file.contentType)) == keccak256(abi.encodePacked(_contentType)), - "Content type mismatch" - ); - - require(_chunkIndex <= chunks.length, "Chunk index out of bounds"); - - if (keccak256(_content) != keccak256(chunks[_chunkIndex])) { - chunks[_chunkIndex] = _content; - } - - if (_redirectCode != file.redirectCode) { - file.redirectCode = _redirectCode; - } + file.content = abi.encodePacked(file.content, _content); } - - emit ResourceChunkSet(_path, _chunkIndex); } /// @notice Retrieves a chunk of a resource file /// @param path Path of the resource - /// @param index Index of the chunk /// @return bytes memory, string memory The content chunk and content type - function getResourceChunk( - string memory path, - uint256 index - ) public view virtual returns (bytes memory, string memory) { - ResourceFile memory file = resourceFiles[path]; - require(index < file.content.length, "Chunk index out of bounds"); - return (file.content[index], file.contentType); - } - function getResource( string memory path - ) public view virtual returns (uint256, string memory, uint8) { - return ( - resourceFiles[path].content.length, - resourceFiles[path].contentType, - resourceFiles[path].redirectCode - ); + ) public view virtual returns (bytes memory, string memory) { + ResourceFile memory file = resourceFiles[path]; + return (file.content, file.contentType); } /// @notice Removes a resource @@ -228,9 +205,12 @@ abstract contract WebContract is TokenManager { emit ResourceRemoved(path); } - /// @dev Emitted when the redirect information is set - event RedirectSet(string redirectValue, string redirectType, uint8 redirectCode); + event RedirectSet( + string redirectValue, + string redirectType, + uint8 redirectCode + ); /// @dev Emitted when the contract is locked event ContractLocked(); @@ -252,5 +232,4 @@ abstract contract WebContract is TokenManager { /// @dev Emitted when a resource is removed event ResourceRemoved(string path); - } diff --git a/deploy/manifest.json b/deploy/manifest.json index 86b8db5..62204d4 100644 --- a/deploy/manifest.json +++ b/deploy/manifest.json @@ -1,16 +1,20 @@ { - "ipfsFiles": { - "styles.css": "QmZtSFFdtZCq6XpMAjNYPe6BTMZaMtbELEE1sDdiK2dBeZ" - }, + "ipfsFiles": {}, "contractFiles": { - "0xc7a7de7c1cf222f9055e488583096cc5b42d722b0a460e1c0510a71433f30556": "index.html", - "0xa30e23c499619e61b0d39dc6e740b2b0867efa9be78c756c50c49655e00ff86f": "index.html", - "0x1dbb756089e9167f3d0d3a0cdc77e434e8e85b66469feadb8ab8795c4342a1d7": "styles.css", - "0x27c5f6520884877b1f4c6b4ce878f2b34d567435afc8a7873ac5f711dbc762b5": "image.png", - "0x68cf56fd48b5670fe2cceb4afbfdc650ba4922380171facad6c02eadabff6f84": "index.html", - "0x5aebc0ce5b7f1881d844d535366da3830c4193dc4d3352a00740bbcd2dfda205": "profile.json", - "0x7c2ef04b46051d3b3d7583fd1aa1278e315f29758c547601d1089053671adc7c": "script.js", - "0xbc7e2d71b3897ad9ded8d4d4a9f092919635d1ae42e8459016a8bd10847e6773": "style.css", - "0x6601e55d28414ca803c25547bde623b5f2893b44964c80ca45f9a6154d6694e5": "index.html" + "0x69c7d2268c63d686d89e0d7a3a7d36913945156ce82218a5f84d580c98347b94": "index.html", + "0xb9f650b2f5204dc8af1c6fc6ad61b541ddecb7e8e025745c785b37cf7d95481e": "index.html", + "0x3c03864d02fe5d40f31cda99c08ab57d8ed92c4ecaab13767d758ad5ce1c8a28": "index.html", + "0x166e6a18b30a070b3f13590c06d27cf18f3da5488ea465ad5d77ca5a69a0f828": "index.html", + "0x2f2ea201fc69cc791d2b93fc0649e96780b4675aae25471d8a73c41232b280a0": "index.html", + "0xec02719a754390ff95cfb312e1388c2da018c7b7467224630babd31813dd6a47": "index.html", + "0x9feb3f7766e86b52319027dc744e3f39ca19ea3b93c3c6dcc88e410e356f751c": "index.html", + "0xb35245ebf87f8e2967f6ab1c4765f956c2f24e31f0b494b13ee0c1586af4dd98": "index.html", + "0x1e3d7b9bfb4def8b51b4288af9a913b73b680c037cf9f3d6ed7af78c463de569": "index.html", + "0x57d7a2aa0b6c7108c88424a85bb01018478f495ad3b5ee384345f3a7027b1da4": "index.html", + "0x794490d530d4d488d617ee1c35095b81e695b312a25e11078376fadb59b85a8f": "index.html", + "0xa5eb5dd5308ce6843988644f5c9c43af0d0b1143ede5746bf8b5bafd44a4e602": "index.html", + "0x3ed3ee767e214776f4f3ab60ff7191dcbdaf5102b8e84fb7c2025fac393c4022": "index.html", + "0x3e99699a41860b2953f73ff68dc82d7bb7802c5cc0ac25f6413d37f54d585efb": "index.html", + "0x5f330300dfa06db510f70868096db93a6dc81fd9ec1449a8f2bbcb9ba76ad447": "index.html" } } \ No newline at end of file diff --git a/hardhat.config.ts b/hardhat.config.ts index d110117..598793b 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -19,6 +19,16 @@ const config: HardhatUserConfig = { url: process.env.RPC_URL_137 || "", accounts: [process.env.PRIVATE_KEY || ""], } + }, + etherscan: { + // Your API key for Etherscan + // Obtain one at https://etherscan.io/ + apiKey: process.env.ETHERSCAN_API_KEY || "", + }, + sourcify: { + // Disabled by default + // Doesn't need an API key + enabled: true } }; diff --git a/package-lock.json b/package-lock.json index 3391ba2..befdf28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "web-contract", - "version": "0.0.4", + "version": "0.0.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "web-contract", - "version": "0.0.4", + "version": "0.0.7", "license": "AGPL-3.0", "dependencies": { "@ensdomains/ens-contracts": "^1.2.2", @@ -18,7 +18,9 @@ }, "devDependencies": { "@nomicfoundation/hardhat-toolbox": "^5.0.0", - "hardhat": "^2.22.10" + "@nomicfoundation/hardhat-verify": "^2.0.11", + "hardhat": "^2.22.10", + "typechain": "^8.3.2" } }, "node_modules/@adraffy/ens-normalize": { @@ -1998,12 +2000,10 @@ } }, "node_modules/@nomicfoundation/hardhat-verify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.10.tgz", - "integrity": "sha512-3zoTZGQhpeOm6piJDdsGb6euzZAd7N5Tk0zPQvGnfKQ0+AoxKz/7i4if12goi8IDTuUGElAUuZyQB8PMQoXA5g==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.11.tgz", + "integrity": "sha512-lGIo4dNjVQFdsiEgZp3KP6ntLiF7xJEJsbNHfSyIiFCyI0Yv0518ElsFtMC5uCuHEChiBBMrib9jWQvHHT+X3Q==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/abi": "^5.1.2", "@ethersproject/address": "^5.0.2", @@ -2727,8 +2727,7 @@ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/qs": { "version": "6.9.16", @@ -2835,7 +2834,6 @@ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -2967,7 +2965,6 @@ "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -3019,7 +3016,6 @@ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -3428,7 +3424,6 @@ "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "nofilter": "^3.1.0" }, @@ -3743,7 +3738,6 @@ "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "array-back": "^3.1.0", "find-replace": "^3.0.0", @@ -3760,7 +3754,6 @@ "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "array-back": "^4.0.2", "chalk": "^2.4.2", @@ -3777,7 +3770,6 @@ "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -3788,7 +3780,6 @@ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -3995,7 +3986,6 @@ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4.0.0" } @@ -4669,8 +4659,7 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/fast-fifo": { "version": "1.3.2", @@ -4709,8 +4698,7 @@ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/fastq": { "version": "1.17.1", @@ -4742,7 +4730,6 @@ "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "array-back": "^3.0.1" }, @@ -6056,8 +6043,7 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", @@ -6167,16 +6153,14 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.isequal": { "version": "4.5.0", @@ -6191,8 +6175,7 @@ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", @@ -6940,7 +6923,6 @@ "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12.19" } @@ -7312,7 +7294,6 @@ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin-prettier.js" }, @@ -7556,7 +7537,6 @@ "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -7605,7 +7585,6 @@ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -8016,7 +7995,6 @@ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -8035,7 +8013,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8052,7 +8029,6 @@ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -8065,8 +8041,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/solc": { "version": "0.8.26", @@ -8269,8 +8244,7 @@ "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", "dev": true, - "license": "WTFPL OR MIT", - "peer": true + "license": "WTFPL OR MIT" }, "node_modules/string-width": { "version": "4.2.3", @@ -8373,7 +8347,6 @@ "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -8391,7 +8364,6 @@ "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "array-back": "^4.0.1", "deep-extend": "~0.6.0", @@ -8408,7 +8380,6 @@ "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -8419,7 +8390,6 @@ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -8540,7 +8510,6 @@ "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "chalk": "^4.1.0", "command-line-args": "^5.1.1", @@ -8557,7 +8526,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8574,7 +8542,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8592,7 +8559,6 @@ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -8605,8 +8571,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ts-command-line-args/node_modules/has-flag": { "version": "4.0.0", @@ -8614,7 +8579,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -8625,7 +8589,6 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8639,7 +8602,6 @@ "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "typescript": ">=3.7.0" } @@ -8771,8 +8733,6 @@ "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { "@types/prettier": "^2.1.1", "debug": "^4.3.1", @@ -8799,7 +8759,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -8821,7 +8780,6 @@ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, "license": "MIT", - "peer": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -8858,7 +8816,6 @@ "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -9199,7 +9156,6 @@ "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "reduce-flatten": "^2.0.0", "typical": "^5.2.0" @@ -9214,7 +9170,6 @@ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } diff --git a/package.json b/package.json index 094e7f7..23a3414 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,9 @@ "homepage": "https://github.com/TechnicallyWeb3/web-contract#readme", "devDependencies": { "@nomicfoundation/hardhat-toolbox": "^5.0.0", - "hardhat": "^2.22.10" + "@nomicfoundation/hardhat-verify": "^2.0.11", + "hardhat": "^2.22.10", + "typechain": "^8.3.2" }, "dependencies": { "@ensdomains/ens-contracts": "^1.2.2", @@ -36,5 +38,5 @@ "dotenv": "^16.4.5", "ipfs-http-client": "^60.0.1" }, - "contract": "0x238c9a45528ff059BCC9f50E65d45bc7FcD9c22E" + "contract": "0x55a93773b9EcECEDbF114ad9b3D37cAC7e6A0726" } \ No newline at end of file diff --git a/tasks/readFromContract.ts b/tasks/readFromContract.ts index fa1b4fb..c8dd45f 100644 --- a/tasks/readFromContract.ts +++ b/tasks/readFromContract.ts @@ -14,33 +14,24 @@ task("read-from-contract", "Read files from the smart contract") try { console.log("Contract address:", websiteContract.target); - + let decodedContent = ''; const resourceInfo = await websiteContract.getResource(fileName); - const totalChunks = resourceInfo[0]; - console.log(`Total chunks for ${fileName}: ${totalChunks}`); + const content = resourceInfo[0]; + const contentType = resourceInfo[1]; + //console.log(`content: ${content}`); - if (Number(totalChunks) === 0) { - console.log(`File ${fileName} is empty or does not exist.`); + // Check if the content is empty + if (content.length === 0) { + console.log("No content found for this file."); return; - } - - let fullContent = ""; - let contentType = ""; + } else { + // console.log('content.slice(2):', remove0x); + decodedContent = Buffer.from(content.substring(2), 'hex').toString('utf8'); + console.log(`decodedContent: ${decodedContent}`); + console.log(`Content Type: ${contentType}`); - for (let i = 0; i < Number(totalChunks); i++) { - const response = await websiteContract.getResourceChunk(fileName, i); - const chunkContent = response[0]; - const chunkContentType = response[1]; - fullContent += chunkContent; - if (i === 0) contentType = chunkContentType; // Assume all chunks have the same content type } - - // Convert hex string to readable text - const decodedContent = Buffer.from(fullContent.slice(2), 'hex').toString('utf8'); - - console.log(decodedContent); - console.log(`File ${fileName} content:`); - console.log(`Content Type: ${contentType}`); + } catch (error: any) { console.error("Error reading file:", error.message); diff --git a/tasks/writeToContract.ts b/tasks/writeToContract.ts index 892c6b0..2d80c13 100644 --- a/tasks/writeToContract.ts +++ b/tasks/writeToContract.ts @@ -4,8 +4,8 @@ import path from 'path'; import { WebsiteContract } from "../typechain-types"; task("write-to-contract", "Write files to the smart contract") - .addOptionalPositionalParam("filePath", "Relative path of the file to upload (from build folder)", "", types.string) - .addOptionalPositionalParam("key", "Key to write the file to in the contract", "", types.string) + .addOptionalParam("filePath", "Relative path of the file to upload (from build folder)", "", types.string) + .addOptionalParam("key", "Key to write the file to in the contract", "", types.string) .setAction(async ({ filePath, key }, hre) => { const config = require('../webcontract.config').default; const buildFolder = path.resolve(config.buildFolder); @@ -81,48 +81,55 @@ task("write-to-contract", "Write files to the smart contract") console.log(`Chunk size: ${chunkSize} bytes`); let transactionHash: string = ''; let contentChanged = false; + let _existingContent = ''; + const contentHex = `0x${content.toString('hex')}`; + const numberOfChunks = Math.ceil(content.length / chunkSize); + //console.log(`Content (hex): ${contentHex}`); + console.log(`Number of chunks: ${numberOfChunks}`); + + try { + const [existingContent, existingContentType] = await websiteContract.getResource(targetKey); + _existingContent = existingContent; + } catch (error) { + console.log(`Content doesn't exist yet. Creating new chunk.`); + } + console.log(`Comparing new chunk with existing chunk...`); + if (_existingContent !== contentHex) { - console.log(`Total content length: ${content.length}`); - console.log(`Number of chunks: ${Math.ceil(content.length / chunkSize)}`); - - for (let i = 0; i < content.length; i += chunkSize) { - console.log(`Processing chunk ${Math.floor(i / chunkSize) + 1}`); - const chunk = content.subarray(i, i + chunkSize); - console.log(`Read chunk: ${i / chunkSize} @ ${relativePath}`); - let existingChunk: [Buffer, string] = [Buffer.alloc(0), '']; - try { - const [existingContent, existingContentType] = await websiteContract.getResourceChunk(targetKey, i / chunkSize); - existingChunk = [Buffer.from(existingContent), existingContentType]; - } catch (error) { - console.log(`Chunk ${Math.floor(i / chunkSize) + 1} doesn't exist yet. Creating new chunk.`); - } - console.log(`Existing chunk length: ${existingChunk[0].length}`); - console.log(`New chunk length: ${chunk.length}`); - - console.log(`Comparing new chunk with existing chunk...`); - const newChunkHex = `0x${chunk.toString('hex')}`; - const existingChunkUtf8 = existingChunk[0].toString('utf8'); - if (newChunkHex !== existingChunkUtf8) { - console.log(`Chunks are different. Logging first 50 bytes of each:`); - // console.log(`New chunk (hex): ${newChunkHex.slice(0, 50)}...`); - // console.log(`Existing chunk (utf8): ${existingChunkUtf8.slice(0, 50)}...`); - // console.log(`Content matches: ${newChunkHex === existingChunkUtf8}`) - - const tx = await websiteContract.setResourceChunk( + for (let i = 0; i < numberOfChunks; i++) { + const feeData = await hre.ethers.provider.getFeeData(); + const replace = (i === 0) ? true : false; + + console.log('replace is: ', replace); + + const writtenBytes = i * chunkSize; + + const chunk = content.subarray(writtenBytes, writtenBytes + chunkSize); + console.log(`Processing chunk index: ${i} @ ${relativePath}`); + //console.log(`Chunk content: ${chunk}`); + console.log(`New chunk length: ${chunk.length}`); + + const newChunkHex = `0x${chunk.toString('hex')}`; + + //console.log(`Logging first 50 bytes of each chunk: ${newChunkHex.slice(0, 50)}...`); + + const tx = await websiteContract.setResource( targetKey, // Use targetKey instead of relativePath - chunk, // _content + newChunkHex, // _content contentType, // _contentType - i / chunkSize, // _chunkIndex - 0 // _redirectCode, assuming 0 since writing to contract + replace, // _replace + 0, + {gasPrice:feeData.gasPrice} // _redirectCode, assuming 0 since writing to contract ); await tx.wait(); transactionHash = tx.hash; contentChanged = true; - console.log(`Chunk ${Math.floor(i / chunkSize) + 1} of ${Math.ceil(content.length / chunkSize)} updated for ${relativePath}`); - } else { - console.log(`Chunks are identical.`); + console.log(`Chunk index ${i} of ${numberOfChunks} updated for ${relativePath}`); } + } else { + console.log(`Chunks are identical.`); } + return { transactionHash, contentChanged }; } @@ -157,7 +164,7 @@ task("write-to-contract", "Write files to the smart contract") await fs.access(fullPath); await processFile(fullPath, key); } catch (error) { - console.error(`Error: File not found - ${fullPath}`); + console.error(`Error: File not found - ${error}`); } }