2021年4月2日星期五

How to store IPFS hash on Ethereum blockchain using smart contracts?

I'm working on a react + IPFS DAPP and making a simple Pet shop app. for now I have just create smart contract on remix and trying it's functions to work properly but I'm facing a problem.

transact to PetShop.generatePet errored: Error encoding arguments: Error: invalid arrayify value (argument="value", value="QmWmyoMoctfbAaiEs2G46gpeUmhqFRDW6KWo64y5r581Vz", code=INVALID_ARGUMENT, version=bytes/5.0.5)

whenever I'm calling generatePet function and passing IPFS hash it returns above mentioned error.

contract petshop

pragma solidity ^0.6.6;    import "https://github.com/MuhammadSajid404/ERC721-Token/blob/master/ERC721.sol";    contract PetShop is ERC721 {              uint256 public tokenId;        uint256 public prevOwnerTokenID;                mapping(uint256 => uint256) public priceMapping;        mapping(uint256 => bytes32) tokenIdToOffchainContentHash;                event PetGenerated(address, uint256, uint256, bytes32);        event BuyPet(uint256, address, address);        event SuccessfulEtherWithdrawal(uint256, address, bool);                 constructor() public          ERC721("ShanBuilders", "SBRS")          {}                function generatePet(uint256 _petPrice, bytes32 contentHash) public returns(bool) {                      require(msg.sender != address(0), "Please! Check back! Registeration should not be from zero address");           require(msg.sender == ownerA, "Only contract owner can generate more pets");                      tokenId++;           require(tokenId <= 16, "More than 16 pets is not allowed");                      priceMapping[tokenId] = _petPrice;           tokenIdToOffchainContentHash[tokenId] = contentHash;           _mint(ownerA, tokenId);           emit PetGenerated(ownerA, tokenId, _petPrice, contentHash);           return true;         }                  function checkPrice(uint256 _tokenId) public view returns(uint256) {             return priceMapping[_tokenId];         }                  function checkHashForAToken(uint256 _tokenId) public view returns(bytes32) {             return tokenIdToOffchainContentHash[_tokenId];         }                  function buyPet(uint256 _tokenId) public payable returns(bool, string memory) {                          prevOwnerTokenID = _tokenId;             address buyer = msg.sender;             address _owner = ownerOf(prevOwnerTokenID);                          require(buyer != address(0), "Should not be zero address");             require(_exists(prevOwnerTokenID), "Invalid property Id, not registered");             require(msg.value == checkPrice(prevOwnerTokenID), "Please Send The Required Value");                          withDraw(msg.value);              _transfer(_owner, buyer, prevOwnerTokenID);             emit BuyPet(_tokenId, _owner, buyer);             return (true, "Succesful");         }                  function withDraw(uint256 _amount) public returns(bool) {                   address _owner = ownerOf(prevOwnerTokenID);          require(_amount > 0, "Amount must be valid");                    payable(_owner).transfer(_amount);          emit SuccessfulEtherWithdrawal(_amount, _owner, true);          return true;      }         }  

Note: I would prefer using bytes over string because they consume less gas than strings.. how to solve this problem, I have seen a lot of answers on stackoverflow but actually i'm not getting understand any of them.

https://stackoverflow.com/questions/66927626/how-to-store-ipfs-hash-on-ethereum-blockchain-using-smart-contracts April 03, 2021 at 12:08PM

没有评论:

发表评论