简体   繁体   中英

How to deploy a smart contract with on-chain NFTs and complex/long svgs?

I want to deploy a smart contract that creates NFTs on-chain, it means that the data of the image/svg, in my case, lives on the blockchain and it will be drawable thanks to Base64 encryption. I studied the topic, but I don't know how to make the smart contract deployable if the svg is bigger enough to cause the "Contract code size exceeds 24576 bytes" error.

In my specific case I need a font to use in my SVG and the only way to import it is this:

@font-face {
  font-family: "Titan One";
  src: url(data:application/octet-stream;base64,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);
}

I already reduce the font chars by taking just the ones I need, but only this line cause the error mentioned before.

Does anyone know how to handle this problem? Some reference to follow? Anything!

I know it's possible because of this on-chain NFTs project Edwom that mints SVGs logger than mine (even with the same long line font). They use some kind of byte16 sequence assembly that I don't understand it and I don't know if it is the best way to do it. Thanks for the help.

If the problem is the contract size, one option is to deploy the contract without the SVG part, then you just need a function to store that SVG after the contract is deployed , for example:

contract MyContract {
  // ...

  string public svg; // could be a map or whatever depending on ur needs

  function setSvg(string calldata svg_) external {
      // Make sure only you can call this function...
      svg = _svg;
  }
}

Then u can use the svg variable to render the tokenURI

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM