diff --git a/initialize-scripts/initialize.js b/initialize-scripts/initialize.js
index 506e0aa..ffacc5b 100644
--- a/initialize-scripts/initialize.js
+++ b/initialize-scripts/initialize.js
@@ -15,7 +15,7 @@ async function main() {
// read base64 encoded font
const file = await fs.readFileSync(
- __dirname + '/slkscreen.txt'
+ __dirname + '/silkscreen-op2.txt'
);
const content = file.toString();
diff --git a/initialize-scripts/silkscreen-op.txt b/initialize-scripts/silkscreen-op.txt
new file mode 100644
index 0000000..7011e29
--- /dev/null
+++ b/initialize-scripts/silkscreen-op.txt
@@ -0,0 +1 @@
+data:font/truetype;charset=utf-8;base64,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+n36ff6JfQH0ff4MfX0ABAB9AAACcQJxAAUACQANABEAADM1MxUhFQMzFSM1ITUhBzMVI319AXd9fX3+iQF3+vr6+n19AfR9fX36fQAFAH0AAAJxAnEAAwAHAAsADwATAAABMxUjNSE1IQczFSMzMxUjFSE1IQH0fX3+iQF3+vr6+n19/okBdwH0fX19+n19fX0AAQB9AAACcQJxAA0AABMRMxUzNTM1IxEjESMRffp9fX19fQJx/gx9fX0Bd/6JAXcAAwB9AAACcQJxAAcACwAPAAATESE1IzUhNQMzFSMVITUhfQF3+gF3fX19/okBdwJx/ol9fX3+iX19fQAABAB9AAACcQJxAAMABwALABMAABMzFSMXMxUjIzMVIwMRMzUzNSM1+vr6+n19+vr6fX36+gJxffp9fQH0/ol9fX0AAwB9AAACcQJxAAUACQANAAABFSM1ITUXMxUjFSM1MwJxff6J+n19fX0Ccfp9ffp9+voAAAcAfQAAAnECcQADAAcACwAPABMAFwAbAAABMxUjNSM1MwczFSMzMxUjFSM1MwEzFSMVMxUjAfR9ffr6+vr6+n19+vr+iX19fX0B9H19ffp9fX19AXd9fX0AAAQAfQAAAnECcQADAAcACwATAAAhIzUzJyM1MzMjNTMTESMVIxUzFQH0+vr6fX36+vp9ffr6ffp9ff4MAXd9fX0AAAIAAAB9AH0B9AADAAcAADUzFSMRMxUjfX19ffp9AXd9AAADAAAAAAD6AfQAAwAHAAsAADczFSMRMxUjBzMVI319fX19fX19+n0Bd336fQAABQB9AAAB9AJxAAMABwALAA8AEwAAJTMVIyczFSMnMxUjNzMVIzczFSMBd319fX19fX19fX19fX19fX36ffp9+n36fQACAH0AfQH0AfQAAwAHAAAlITUhNSE1IQH0/okBd/6JAXd9fX19AAUAfQAAAfQCcQADAAcACwAPABMAADczFSM3MxUjNzMVIyczFSMnMxUjfX19fX19fX19fX19fX19fX36ffp9+n36fQAABAB9AAACcQJxAAMABwALAA8AAAEzFSM1ITUhBzMVIxUzFSMB9H19/okBd/r6+n19AfR9fX36fX19AAUAfQAAAu4CcQADAAcACAASABYAADcjETMBITUhBREVMxUzNSM1MzUVMxUj+n19AXf+iQF3/ol9+n19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
\ No newline at end of file
diff --git a/initialize-scripts/silkscreen-op2.txt b/initialize-scripts/silkscreen-op2.txt
new file mode 100644
index 0000000..b3b8a08
--- /dev/null
+++ b/initialize-scripts/silkscreen-op2.txt
@@ -0,0 +1 @@
+data:font/truetype;charset=utf-8;base64,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+n36ff6JfQH0ff4MfX0ABAB9AAACcQJxAAUACQANABEAADM1MxUhFQMzFSM1ITUhBzMVI319AXd9fX3+iQF3+vr6+n19AfR9fX36fQAFAH0AAAJxAnEAAwAHAAsADwATAAABMxUjNSE1IQczFSMzMxUjFSE1IQH0fX3+iQF3+vr6+n19/okBdwH0fX19+n19fX0AAQB9AAACcQJxAA0AABMRMxUzNTM1IxEjESMRffp9fX19fQJx/gx9fX0Bd/6JAXcAAwB9AAACcQJxAAcACwAPAAATESE1IzUhNQMzFSMVITUhfQF3+gF3fX19/okBdwJx/ol9fX3+iX19fQAABAB9AAACcQJxAAMABwALABMAABMzFSMXMxUjIzMVIwMRMzUzNSM1+vr6+n19+vr6fX36+gJxffp9fQH0/ol9fX0AAwB9AAACcQJxAAUACQANAAABFSM1ITUXMxUjFSM1MwJxff6J+n19fX0Ccfp9ffp9+voAAAcAfQAAAnECcQADAAcACwAPABMAFwAbAAABMxUjNSM1MwczFSMzMxUjFSM1MwEzFSMVMxUjAfR9ffr6+vr6+n19+vr+iX19fX0B9H19ffp9fX19AXd9fX0AAAQAfQAAAnECcQADAAcACwATAAAhIzUzJyM1MzMjNTMTESMVIxUzFQH0+vr6fX36+vp9ffr6ffp9ff4MAXd9fX0AAAIAAAB9AH0B9AADAAcAADUzFSMRMxUjfX19ffp9AXd9AAADAAAAAAD6AfQAAwAHAAsAADczFSMRMxUjBzMVI319fX19fX19+n0Bd336fQAABQB9AAAB9AJxAAMABwALAA8AEwAAJTMVIyczFSMnMxUjNzMVIzczFSMBd319fX19fX19fX19fX19fX36ffp9+n36fQACAH0AfQH0AfQAAwAHAAAlITUhNSE1IQH0/okBd/6JAXd9fX19AAUAfQAAAfQCcQADAAcACwAPABMAADczFSM3MxUjNzMVIyczFSMnMxUjfX19fX19fX19fX19fX19fX36ffp9+n36fQAABAB9AAACcQJxAAMABwALAA8AAAEzFSM1ITUhBzMVIxUzFSMB9H19/okBd/r6+n19AfR9fX36fX19AAUAfQAAAu4CcQADAAcACAASABYAADcjETMBITUhBREVMxUzNSM1MzUVMxUj+n19AXf+iQF3/ol9+n19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
\ No newline at end of file
diff --git a/src/MirakaiScrollsRenderer.sol b/src/MirakaiScrollsRenderer.sol
index 25f9d47..8c82b13 100644
--- a/src/MirakaiScrollsRenderer.sol
+++ b/src/MirakaiScrollsRenderer.sol
@@ -94,15 +94,13 @@ contract MirakaiScrollsRenderer is Ownable {
Base64.encode(
abi.encodePacked(
"{"
- '"name": "Scroll ',
- toString(tokenId),
- '",'
- '"description": "description x",'
- '"image": "data:image/svg+xml;base64,',
- render(tokenId, dna),
- '",'
- '"attributes":',
- formatTraits(traitIndexes),
+ '"name": "Scroll ', toString(tokenId), '",'
+ '"description": "description x",'
+ '"image": "data:image/svg+xml;base64,',
+ render(tokenId, dna),
+ '",'
+ '"attributes":',
+ formatTraits(traitIndexes),
"}"
)
)
@@ -139,42 +137,42 @@ contract MirakaiScrollsRenderer is Ownable {
string(
abi.encodePacked(
""
"",
string(
abi.encodePacked(
""
""
)
)
@@ -219,10 +217,9 @@ contract MirakaiScrollsRenderer is Ownable {
attributes,
"{"
'"trait_type":"',
- IMirakaiDnaParser(mirakaDnaParser).getCategory(uint8(i)),
+ IMirakaiDnaParser(mirakaDnaParser).getCategory(uint8(i)),
'",'
- '"value":"',
- traitNames[i],
+ '"value":"', traitNames[i],
'"}'
)
);
@@ -326,15 +323,15 @@ contract MirakaiScrollsRenderer is Ownable {
abi.encodePacked(
svgItemsScroll,
"",
- traitNames[i],
+ traitNames[i],
""
)
);
@@ -403,8 +400,8 @@ contract MirakaiScrollsRenderer is Ownable {
abi.encodePacked(
svgString,
""
- "SCROLL #",
- toString(tokenId),
+ "scroll #",
+ toString(tokenId),
""
)
);
@@ -414,35 +411,35 @@ contract MirakaiScrollsRenderer is Ownable {
if (rareItems > 1) {
extraStyle = "@keyframes floating{"
- "from{"
- "transform: translate(6.5px,3.5px);"
- "filter: drop-shadow(0px 0px 1.25px rgba(120, 120, 180, .85));"
- "}"
- "50%{"
- "transform: translate(6.5px,5px);"
- "filter: drop-shadow(0px 0px 2.5px rgba(120, 120, 190, 1));"
- "}"
- "to{"
- "transform: translate(6.5px,3.5px);"
- "filter: drop-shadow(0px 0px 1.25px rgba(120, 120, 180,.85));"
- "}"
+ "from{"
+ "transform: translate(6.5px,3.5px);"
+ "filter: drop-shadow(0px 0px 1.25px rgba(120, 120, 180, .85));"
+ "}"
+ "50%{"
+ "transform: translate(6.5px,5px);"
+ "filter: drop-shadow(0px 0px 2.5px rgba(120, 120, 190, 1));"
+ "}"
+ "to{"
+ "transform: translate(6.5px,3.5px);"
+ "filter: drop-shadow(0px 0px 1.25px rgba(120, 120, 180,.85));"
+ "}"
"}";
}
if (rareItems > 2) {
extraStyle = "@keyframes floating{"
- "from{"
- "transform: translate(6.5px,3.5px);"
- "filter: drop-shadow(0px 0px 1.75px rgba(135,232,252,0.8));"
- "}"
- "50%{"
- "transform: translate(6.5px,5px);"
- "filter: drop-shadow(0px 0px 3.5px rgba(135,232,252,1));"
- "}"
- "to{"
- "transform: translate(6.5px,3.5px);"
- "filter: drop-shadow(0px 0px 1.75px rgba(135,232,252,0.8));"
- "}"
+ "from{"
+ "transform: translate(6.5px,3.5px);"
+ "filter: drop-shadow(0px 0px 1.75px rgba(135,232,252,0.8));"
+ "}"
+ "50%{"
+ "transform: translate(6.5px,5px);"
+ "filter: drop-shadow(0px 0px 3.5px rgba(135,232,252,1));"
+ "}"
+ "to{"
+ "transform: translate(6.5px,3.5px);"
+ "filter: drop-shadow(0px 0px 1.75px rgba(135,232,252,0.8));"
+ "}"
"}";
}
@@ -452,80 +449,89 @@ contract MirakaiScrollsRenderer is Ownable {
""
)
);
diff --git a/test/MirakaiSaveFile.t.sol b/test/MirakaiSaveFile.t.sol
new file mode 100644
index 0000000..36fcda0
--- /dev/null
+++ b/test/MirakaiSaveFile.t.sol
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: UNLICENSED
+pragma solidity ^0.8.0;
+
+import "ds-test/test.sol";
+import {console} from "forge-std/console.sol";
+import {MirakaiScrollsRenderer} from "../src/MirakaiScrollsRenderer.sol";
+import {MirakaiDnaParser} from "../src/MirakaiDnaParser.sol";
+import {TestVm} from "./TestVm.sol";
+
+contract MirakaiSaveFileTest is DSTest, TestVm {
+ MirakaiScrollsRenderer private mirakaiScrollsRenderer;
+ MirakaiDnaParser private mirakaiDnaParser;
+
+ function setUp() public {
+ mirakaiScrollsRenderer = new MirakaiScrollsRenderer();
+ mirakaiDnaParser = new MirakaiDnaParser();
+
+ mirakaiScrollsRenderer.setmirakaiDnaParser(address(mirakaiDnaParser));
+ }
+
+ function testSaveFileOriginalFont() public {
+ uint256 gasBefore = gasleft();
+ string memory path = "initialize-scripts/slkscreen.txt";
+ string memory fontData = vm.readFile(path);
+
+ mirakaiScrollsRenderer.saveFile(0, fontData);
+
+ console.log(gasBefore - gasleft());
+ }
+
+ function testSaveFileOptimizedFont() public {
+ uint256 gasBefore = gasleft();
+ string memory path = "initialize-scripts/silkscreen-op.txt";
+ string memory fontData = vm.readFile(path);
+
+ mirakaiScrollsRenderer.saveFile(0, fontData);
+
+ console.log(gasBefore - gasleft());
+ }
+
+ function testSaveFileOptimized2Font() public {
+ uint256 gasBefore = gasleft();
+ string memory path = "initialize-scripts/silkscreen-op2.txt";
+ string memory fontData = vm.readFile(path);
+
+ mirakaiScrollsRenderer.saveFile(0, fontData);
+
+ console.log(gasBefore - gasleft());
+ }
+}
diff --git a/test/MirakaiScrollsRenderer.t.sol b/test/MirakaiScrollsRenderer.t.sol
index c95d88d..e76e80e 100644
--- a/test/MirakaiScrollsRenderer.t.sol
+++ b/test/MirakaiScrollsRenderer.t.sol
@@ -17,12 +17,10 @@ contract MirakaiScrollsRendererTest is DSTest, TestVm {
mirakaiScrollsRenderer.setmirakaiDnaParser(address(mirakaiDnaParser));
- string[] memory inputs = new string[](2);
- inputs[0] = "cat";
- inputs[1] = "../initialize-scripts/slkscreen.txt";
- bytes memory fontData = vm.ffi(inputs);
+ string memory path = "initialize-scripts/silkscreen-op2.txt";
+ string memory fontData = vm.readFile(path);
- mirakaiScrollsRenderer.saveFile(0, string(fontData));
+ mirakaiScrollsRenderer.saveFile(0, fontData);
setDnaParserTraitsAndWeights();
}
diff --git a/test/TestVm.sol b/test/TestVm.sol
index 908d1cb..d2798b0 100644
--- a/test/TestVm.sol
+++ b/test/TestVm.sol
@@ -159,6 +159,9 @@ interface Vm {
// Stops collecting onchain transactions
function stopBroadcast() external;
+
+ // Reads the entire content of file to string, (path) => (data)
+ function readFile(string calldata) external returns (string memory);
}
contract TestVm {