Search code examples
blockchainethereumsoliditysmartcontractsnft

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.


Solution

  • 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