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