ScriptyBuilder
supports injecting dynamically created scripts between statically stored scripts.
If the scriptContent
field of requests is not empty, then ScriptyBuilder
will use scriptContent
instead of fetching the script from a contract.
Inline Script Request
Copy InlineScriptRequest[] memory requests = new InlineScriptRequest[](2);
requests[0].name = "three.js";
requests[0].contractAddress = scriptyStorageContractAddress;
requests[1].scriptContent = 'console.log("hello world!")';
Wrapped Script Request
Copy WrappedScriptRequest[] memory requests = new WrappedScriptRequest[](2);
requests[0].name = "three.js";
requests[0].contractAddress = scriptyStorageContractAddress;
requests[1].wrapType = 0;
requests[1].scriptContent = 'console.log("hello world!")';
You can set different wrapping options for dynamically created scripts. For more about wrapping options please check here .
Example
Here we are requesting three.js
and some generative art named cubes
that depends on three.js
. By itself, cubes script does nothing. A controller script is created with on-chain values and it initiates cubes
script.
Copy InlineScriptRequest[] memory requests = new InlineScriptRequest[](3);
requests[0].name = "three.js";
requests[1].name = "cubes";
// Calculate this off-chain:
uint256 bufferSizeForStoredScripts = 100000;
bytes memory controllerScript = abi.encodePacked(
'let cubes = new Cubes("',
LibString.toString(block.timestamp),
'");'
);
requests[2].scriptContent = controllerScript;
// New buffer size to cover dynamically
// created script
uint256 bufferSize = bufferSizeForStoredScripts + controllerScript.length;
bytes memory htmlFile = IScriptyBuilder(
scriptyBuilderAddress
).getHTMLInline(
requests,
controllerScript,
bufferSize
);
When it's controllerScript
becomes something like this:
Copy let cubes = new Cubes("1671835245");
Final output looks like this:
Copy <html>
<body style='margin:0;'>
<script>
[three.js]
[cubes]
let cubes = new Cubes("1671835245");
</script>
</body>
</html>
You can check this example(contract , deployment script ) which uses dynamic script to generate HTML files.