<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>MaxFlowO₂ 终端浪人</title>
        <link>https://paragraph.com/@maxflowo2</link>
        <description>War veteran, Software developer, and one crazy cat on the blockchain...</description>
        <lastBuildDate>Mon, 06 Apr 2026 01:41:02 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>MaxFlowO₂ 终端浪人</title>
            <url>https://storage.googleapis.com/papyrus_images/ef17adfb702d30d2afb087ddb593b148b7db491efdcd9075882bdd4056edad6a.png</url>
            <link>https://paragraph.com/@maxflowo2</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[MFO₂: Week[2] CSS 3 init()]]></title>
            <link>https://paragraph.com/@maxflowo2/mfo-week-2-css-3-init</link>
            <guid>FLJKTvDtShKRo1tu2Kk2</guid>
            <pubDate>Sun, 01 Jan 2023 21:28:25 GMT</pubDate>
            <description><![CDATA[So, let’s finally build from post to post… remember this one, aka last week?&#x3C;!DOCTYPE html> &#x3C;html lang="en"> &#x3C;head> &#x3C;meta charset="UTF-8" /> &#x3C;title>MaxFlowO&#x26;#x2082's Hello World&#x3C;/title> &#x3C;meta name="author" content="MaxFlowO&#x26;#x2082"> &#x3C;meta name="viewport" content="width=device-width, initial-scale=1"> &#x3C;/head> &#x3C;body> &#x3C;div> &#x3C;h1>Tell Chow I said, "Hallo"&#x3C;/h1> &#x3C;/div> &#x3C;/body> &#x3C;/html> Kind of bland if you ask m...]]></description>
            <content:encoded><![CDATA[<p>So, let’s finally build from post to post… remember this <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/maxflowo2.eth/qwqE9zR6yjAMQkk5Ol7rzsF-OhUOpKlZOPhEdQXbrF0">one</a>, aka last week?</p><pre data-type="codeBlock" text="&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot; /&gt;
    &lt;title&gt;MaxFlowO&amp;#x2082&apos;s Hello World&lt;/title&gt;
    &lt;meta name=&quot;author&quot; content=&quot;MaxFlowO&amp;#x2082&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div&gt;
      &lt;h1&gt;Tell Chow I said, &quot;Hallo&quot;&lt;/h1&gt;
    &lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;
"><code><span class="xml"><span class="hljs-meta">&#x3C;!DOCTYPE <span class="hljs-keyword">html</span>></span>
<span class="hljs-tag">&#x3C;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>></span>
  <span class="hljs-tag">&#x3C;<span class="hljs-name">head</span>></span>
    <span class="hljs-tag">&#x3C;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span> /></span>
    <span class="hljs-tag">&#x3C;<span class="hljs-name">title</span>></span>MaxFlowO&#x26;#x2082's Hello World<span class="hljs-tag">&#x3C;/<span class="hljs-name">title</span>></span>
    <span class="hljs-tag">&#x3C;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"author"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"MaxFlowO&#x26;#x2082"</span>></span>
    <span class="hljs-tag">&#x3C;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1"</span>></span>
  <span class="hljs-tag">&#x3C;/<span class="hljs-name">head</span>></span>
  <span class="hljs-tag">&#x3C;<span class="hljs-name">body</span>></span>
    <span class="hljs-tag">&#x3C;<span class="hljs-name">div</span>></span>
      <span class="hljs-tag">&#x3C;<span class="hljs-name">h1</span>></span>Tell Chow I said, "Hallo"<span class="hljs-tag">&#x3C;/<span class="hljs-name">h1</span>></span>
    <span class="hljs-tag">&#x3C;/<span class="hljs-name">div</span>></span>
  <span class="hljs-tag">&#x3C;/<span class="hljs-name">body</span>></span>
<span class="hljs-tag">&#x3C;/<span class="hljs-name">html</span>></span>
</span></code></pre><p>Kind of bland if you ask me… here’s it <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://maxflowo2.com/mirror.xyz/week1.html">hosted</a>. Noticing something… this might be one of those things you can <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://maxflowo2.com/mirror.xyz/week2.html">pick up on and see this week’s hosting</a>. First thing first let’s make this more XML-ish by closing tags and what not. Now it’s this…</p><pre data-type="codeBlock" text="&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot; /&gt;
    &lt;title&gt;MaxFlowO&amp;#x2082&apos;s Hello World&lt;/title&gt;
    &lt;meta name=&quot;author&quot; content=&quot;MaxFlowO&amp;#x2082&quot; /&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot; /&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div&gt;
      &lt;h1&gt;Tell Chow I said, &quot;Hallo&quot;&lt;/h1&gt;
    &lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;
"><code><span class="xml"><span class="hljs-meta">&#x3C;!DOCTYPE <span class="hljs-keyword">html</span>></span>
<span class="hljs-tag">&#x3C;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>></span>
  <span class="hljs-tag">&#x3C;<span class="hljs-name">head</span>></span>
    <span class="hljs-tag">&#x3C;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span> /></span>
    <span class="hljs-tag">&#x3C;<span class="hljs-name">title</span>></span>MaxFlowO&#x26;#x2082's Hello World<span class="hljs-tag">&#x3C;/<span class="hljs-name">title</span>></span>
    <span class="hljs-tag">&#x3C;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"author"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"MaxFlowO&#x26;#x2082"</span> /></span>
    <span class="hljs-tag">&#x3C;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1"</span> /></span>
  <span class="hljs-tag">&#x3C;/<span class="hljs-name">head</span>></span>
  <span class="hljs-tag">&#x3C;<span class="hljs-name">body</span>></span>
    <span class="hljs-tag">&#x3C;<span class="hljs-name">div</span>></span>
      <span class="hljs-tag">&#x3C;<span class="hljs-name">h1</span>></span>Tell Chow I said, "Hallo"<span class="hljs-tag">&#x3C;/<span class="hljs-name">h1</span>></span>
    <span class="hljs-tag">&#x3C;/<span class="hljs-name">div</span>></span>
  <span class="hljs-tag">&#x3C;/<span class="hljs-name">body</span>></span>
<span class="hljs-tag">&#x3C;/<span class="hljs-name">html</span>></span>
</span></code></pre><p>Also, we got to add CSS 3 the, “style sheets.” So, I made a directory called css, kinda blaring obvious here, and a file called week2.css. So since there’s three tags in there we are going to cover only three css elements, more to be added later.</p><pre data-type="codeBlock" text="body {}
div {}
h1 {}
"><code><span class="hljs-selector-tag">body</span> {}
<span class="hljs-selector-tag">div</span> {}
<span class="hljs-selector-tag">h1</span> {}
</code></pre><p>So, how to style the body?</p><ul><li><p>background-color: (value)</p><ul><li><p>valid color name</p></li><li><p>hex values</p></li><li><p>RGB values</p></li></ul></li><li><p>background-image: url(URI);</p></li><li><p>background--repeat: (value)</p><ul><li><p>repeat - x (horizontal repeat)</p></li><li><p>repeat - y (vertical repeat)</p></li><li><p>no-repeat</p></li></ul></li><li><p>background-position (location)</p></li><li><p>background-attachment: fixed</p></li><li><p>background: (color) (image) (repeat) (attachment) (position)</p></li><li><p>other global variables</p><ul><li><p>padding</p></li><li><p>margin</p></li><li><p>color</p></li><li><p>border</p></li><li><p>border-radius</p></li><li><p>font-family</p></li><li><p>font-size (px/em)</p></li><li><p>height (percentage/px)</p></li><li><p>width (percentage/px)</p></li><li><p>text-align</p></li><li><p>text-shadow</p></li><li><p>box-shadow (inset) (x-offset) (y-offset) (blur radius) (color)</p></li></ul></li></ul><p>List goes on and on, but below is a neat way to center an image that’s reactive to any and all backgrounds</p><pre data-type="codeBlock" text="body:before {
  content: &quot;&quot;;
  display: block;
  position: fixed;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  z-index: -10;
  background: url(../images/BG.png) no-repeat center center;
  -webkit-background-size: cover;
  -moz-background-size: cover;
  -o-background-size: cover;
  background-size: cover;
}
"><code><span class="hljs-selector-tag">body</span><span class="hljs-selector-pseudo">:before</span> {
  <span class="hljs-attribute">content</span>: <span class="hljs-string">""</span>;
  <span class="hljs-attribute">display</span>: block;
  <span class="hljs-attribute">position</span>: fixed;
  <span class="hljs-attribute">left</span>: <span class="hljs-number">0</span>;
  <span class="hljs-attribute">top</span>: <span class="hljs-number">0</span>;
  <span class="hljs-attribute">width</span>: <span class="hljs-number">100%</span>;
  <span class="hljs-attribute">height</span>: <span class="hljs-number">100%</span>;
  <span class="hljs-attribute">z-index</span>: -<span class="hljs-number">10</span>;
  <span class="hljs-attribute">background</span>: <span class="hljs-built_in">url</span>(<span class="hljs-string">../images/BG.png</span>) no-repeat center center;
  -webkit-<span class="hljs-attribute">background-size</span>: cover;
  -moz-<span class="hljs-attribute">background-size</span>: cover;
  -o-<span class="hljs-attribute">background-size</span>: cover;
  <span class="hljs-attribute">background-size</span>: cover;
}
</code></pre><p>So what are we going to do? Well, let’s go black or #000000 for a background, and worry about the rest when we have to, since we don’t want a global for everything…</p><pre data-type="codeBlock" text="body {
  background: #000000;
}
"><code><span class="hljs-selector-tag">body</span> {
  <span class="hljs-attribute">background</span>: <span class="hljs-number">#000000</span>;
}
</code></pre><p>The next item would be the div, so let’s style this and make sure we got some margins/padding, curved edges, and a nice hard line with box shadows…</p><pre data-type="codeBlock" text="div {
  background: #ffffff;
  border: #505050;
  border-radius: 10px 10px 10px 10px;
  padding: 2em;
  margin: 2em;
  box-shadow: 5px 5px 10px violet;
}
"><code><span class="hljs-selector-tag">div</span> {
  <span class="hljs-attribute">background</span>: <span class="hljs-number">#ffffff</span>;
  <span class="hljs-attribute">border</span>: <span class="hljs-number">#505050</span>;
  <span class="hljs-attribute">border-radius</span>: <span class="hljs-number">10px</span> <span class="hljs-number">10px</span> <span class="hljs-number">10px</span> <span class="hljs-number">10px</span>;
  <span class="hljs-attribute">padding</span>: <span class="hljs-number">2em</span>;
  <span class="hljs-attribute">margin</span>: <span class="hljs-number">2em</span>;
  <span class="hljs-attribute">box-shadow</span>: <span class="hljs-number">5px</span> <span class="hljs-number">5px</span> <span class="hljs-number">10px</span> violet;
}
</code></pre><p>Now how abut the font?</p><pre data-type="codeBlock" text="h1 {
  font-size: 2.5em;
  padding: 2em;
  margin: 2em;
  text-shadow: 1px 1px 2px #505050;
}
"><code><span class="hljs-selector-tag">h1</span> {
  <span class="hljs-attribute">font-size</span>: <span class="hljs-number">2.5em</span>;
  <span class="hljs-attribute">padding</span>: <span class="hljs-number">2em</span>;
  <span class="hljs-attribute">margin</span>: <span class="hljs-number">2em</span>;
  <span class="hljs-attribute">text-shadow</span>: <span class="hljs-number">1px</span> <span class="hljs-number">1px</span> <span class="hljs-number">2px</span> <span class="hljs-number">#505050</span>;
}
</code></pre><p>As you can see <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://maxflowo2.com/mirror.xyz/week2.html">here</a> versus <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://maxflowo2.com/mirror.xyz/week1.html">here</a> CSS makes the difference. This week was some basics… Did not want to get into reusable classes (week 3 writeup?). Probably some images for background, and get you really learning how to format data to be properly appeasing…</p><p>Thank you for the time,</p><p>Max Flow O₂</p>]]></content:encoded>
            <author>maxflowo2@newsletter.paragraph.com (MaxFlowO₂ 终端浪人)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/0e2c52e7bba7af76d00d78eee24e82b1e46410f449873f8db592320861978c88.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[MFO₂: Week[1] HTML5 init()]]></title>
            <link>https://paragraph.com/@maxflowo2/mfo-week-1-html5-init</link>
            <guid>RI3qGqTJUM2LaVI8O9xZ</guid>
            <pubDate>Sun, 25 Dec 2022 21:33:53 GMT</pubDate>
            <description><![CDATA[So we started this path of web3 development and I started at HTML5? Why? Roots… or foundations, plus since 99% of you are not developing on iOS or Android… you need to understand how to implement web3 on top of web2. Where I’d start? How about a link… But how do I start? Of course one of the 99+ hello world scrips, but you will be starting with my syntax a bit…&#x3C;!DOCTYPE html> &#x3C;html> &#x3C;head> &#x3C;title>Hello World!&#x3C;/title> &#x3C;/head> &#x3C;body> Hello World! &#x3C;/body> ...]]></description>
            <content:encoded><![CDATA[<p>So we started this path of web3 development and I started at HTML5? Why? Roots… or foundations, plus since 99% of you are not developing on iOS or Android… you need to understand how to implement web3 on top of web2.</p><p>Where I’d start? How about a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://developer.mozilla.org/en-US/docs/Learn/HTML">link</a>…</p><p>But how do I start? Of course one of the 99+ hello world scrips, but you will be starting with my syntax a bit…</p><pre data-type="codeBlock" text="&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
     &lt;title&gt;Hello World!&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    Hello World!
  &lt;/body&gt;
&lt;/html&gt;
"><code><span class="hljs-operator">&#x3C;</span><span class="hljs-operator">!</span>DOCTYPE html<span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span>html<span class="hljs-operator">></span>
  <span class="hljs-operator">&#x3C;</span>head<span class="hljs-operator">></span>
     <span class="hljs-operator">&#x3C;</span>title<span class="hljs-operator">></span>Hello World<span class="hljs-operator">!</span><span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>title<span class="hljs-operator">></span>
  <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>head<span class="hljs-operator">></span>
  <span class="hljs-operator">&#x3C;</span>body<span class="hljs-operator">></span>
    Hello World<span class="hljs-operator">!</span>
  <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>body<span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>html<span class="hljs-operator">></span>
</code></pre><p>Now syntax is everything, and this is beyond simplistic… but you are a rookie remember (if you aren’t you’ll lol a bit reading this)? So what is that? Any thing written in ‘words’ is called a tag, ‘/words’ would close that tag. Some need to be closed whereas others don’t but it’s easier to close everything when in doubt.</p><p>The HTML tag</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/html">Examples</a></p></li><li><p>html <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://datatracker.ietf.org/doc/html/rfc5646">lang tag</a></p></li></ul><p>The HEAD tag</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/head">Examples</a></p></li><li><p>Meta tags I’d include</p><ul><li><p>meta charset=&quot;UTF-8&quot;</p></li><li><p>meta name=&quot;viewport&quot; content=&quot;width=device-width&quot;</p></li><li><p>This is basically the webpage’s metadata…</p></li></ul></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/title">TITLE Tag</a></p></li><li><p>Some JS for</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link">LINK Tag</a></p><ul><li><p>For CSS</p><ul><li><p>link href=”” rel=”stylesheet”</p></li></ul></li><li><p>For favicon</p><ul><li><p>link rel=”icon” href=””</p></li></ul></li></ul></li></ul></li><li><p>The BODY tag</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/body">Examples</a></p></li><li><p>Some tags i’d read up on cause you’ll use them a lot</p><ul><li><p>div</p></li><li><p>button</p></li><li><p>h1-h6</p></li><li><p>hr</p></li><li><p>br</p></li><li><p>p</p></li><li><p>code</p></li><li><p>script</p></li></ul></li></ul><p>Seems like a lot for a simple Hello World right? Let’s look at a bit more advanced “Hello World” then</p><pre data-type="codeBlock" text="&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot; /&gt;
    &lt;title&gt;MaxFlowO&amp;#x2082&apos;s Hello World&lt;/title&gt;
    &lt;meta name=&quot;author&quot; content=&quot;MaxFlowO&amp;#x2082&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div&gt;
      &lt;h1&gt;Tell Chow I said, &quot;Hallo&quot;&lt;/h1&gt;
    &lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;
"><code><span class="xml"><span class="hljs-meta">&#x3C;!DOCTYPE <span class="hljs-keyword">html</span>></span>
<span class="hljs-tag">&#x3C;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>></span>
  <span class="hljs-tag">&#x3C;<span class="hljs-name">head</span>></span>
    <span class="hljs-tag">&#x3C;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span> /></span>
    <span class="hljs-tag">&#x3C;<span class="hljs-name">title</span>></span>MaxFlowO&#x26;#x2082's Hello World<span class="hljs-tag">&#x3C;/<span class="hljs-name">title</span>></span>
    <span class="hljs-tag">&#x3C;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"author"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"MaxFlowO&#x26;#x2082"</span>></span>
    <span class="hljs-tag">&#x3C;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1"</span>></span>
  <span class="hljs-tag">&#x3C;/<span class="hljs-name">head</span>></span>
  <span class="hljs-tag">&#x3C;<span class="hljs-name">body</span>></span>
    <span class="hljs-tag">&#x3C;<span class="hljs-name">div</span>></span>
      <span class="hljs-tag">&#x3C;<span class="hljs-name">h1</span>></span>Tell Chow I said, "Hallo"<span class="hljs-tag">&#x3C;/<span class="hljs-name">h1</span>></span>
    <span class="hljs-tag">&#x3C;/<span class="hljs-name">div</span>></span>
  <span class="hljs-tag">&#x3C;/<span class="hljs-name">body</span>></span>
<span class="hljs-tag">&#x3C;/<span class="hljs-name">html</span>></span>
</span></code></pre><p>As you can see, there’s a bit more fun stuff but with UTF-8 you can insert things, even emojis. Keep cranking out code and play with Hello World… Next installment is CSS 3 so you can start adding to this Hello World and link things together… like custom html tags, classes, and how-to, “format a page.”</p><p>Thanks for the time,</p><p>Max Flow O₂</p><p>P.S. I know this was ultra basic but week[2] and week[3] will build off this.</p></li></ul>]]></content:encoded>
            <author>maxflowo2@newsletter.paragraph.com (MaxFlowO₂ 终端浪人)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/57dc7cd15ad508ec3ac741a604829bfe3bea7345aafd14b889c92203d9d66f87.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[WaveDaemons: The rollup]]></title>
            <link>https://paragraph.com/@maxflowo2/wavedaemons-the-rollup</link>
            <guid>FtsWROkG0fDFNF2d8Nbv</guid>
            <pubDate>Sat, 17 Dec 2022 10:39:50 GMT</pubDate>
            <description><![CDATA[Four score, and seven epochs ago, I had a dream that not all smart contracts were created equal, and 0xdEaD is not the way to burn NFT’s… yes it’s a quib to a friend, but still valiant effort old friend. So let’s begin this great ballad of the next DaemonDAO perfection shall we? This is episode 4, aka “The return of the Waves.” You might remember the developer from Episode 1 (DaemonDAO, aka “The Daemons Awaken”) and 3 (TinyDaemons aka “Attack of the Tinies”). Well I’m back with one simple que...]]></description>
            <content:encoded><![CDATA[<p>Four score, and seven epochs ago, I had a dream that not all smart contracts were created equal, and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ftmscan.com/address/0x000000000000000000000000000000000000dead">0xdEaD</a> is not the way to burn NFT’s… yes it’s a quib to a friend, but still valiant effort old friend.</p><p>So let’s begin this great ballad of the next DaemonDAO perfection shall we? This is episode 4, aka “The return of the Waves.” You might remember the developer from Episode 1 (DaemonDAO, aka “The Daemons Awaken”) and 3 (TinyDaemons aka “Attack of the Tinies”). Well I’m back with one simple quest… Make some Tiny’s disappear. I will eventually publish those rollups as well, or I won’t since the only one that matters in this scenario is the TinyDaemon project.</p><p>Project’s premise is simple, PFP + Music = new ERC721. Well hold the phone let me drop the requirements from Lucky himself…</p><ul><li><p>publicMint(uint256 quant) @ 60 FTM</p></li><li><p>burnToMint(uint256[] ids) - burn 5 Tinies for 1 Wave</p></li><li><p>teamMint(uint256 quant) - 400 Team mints for holders et al</p></li><li><p>name()/symbol() - WaveDaemons/WAVEDMN</p></li><li><p>1k supply</p></li><li><p>IPFS/API mint</p><ul><li><p>Images/metadata provided</p></li><li><p>Use that python magic for names/images/random</p></li><li><p>Provenance for Metadata/Images (Pseudorandom engine)</p></li><li><p>EIP 2981 - Tie to TinyDaemon contract</p></li><li><p>TimeCop settings</p><ul><li><p>1671314400 (17 Dec 2022 @ 10p GMT) - Start</p></li><li><p><em>***NO PRESALES***</em></p></li></ul></li></ul></li><li><p>Tie to UI Provided</p><ul><li><p>WaveDameons HTML/JS</p></li></ul></li></ul><p>Actually not difficult to write, only difficult to implement, for a few factors mainly setApprovalForAll v approve, and writing an interface just to reach the burn function for TinyDameons. So let’s kick off with round 1, and remember this is a 12 round fight. Here’s the summary of round 1.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://testnet.ftmscan.com/address/0x35628b61395946ed69c7938120d9e08579d479ce#code">https://testnet.ftmscan.com/address/0x35628b61395946ed69c7938120d9e08579d479ce#code</a></p><p>Let’s see how astute you are for these two code blocks…</p><pre data-type="codeBlock" text="  function burnToMint(
    uint256[] memory ids
  ) external
    notPaused()
    onlySale()
    nonReentrant() {
    // now to get the five per
    uint256 quant = ids.length / 5;
    if (quant == 0) {
      revert MaxSplaining({
        reason: &quot;Main:B1&quot;
      });
    } else {
      for (uint x = 0; x &lt; quant;) {
        _safeMint(msg.sender, _nextUp());
        _oneRegularMint();
        unchecked { ++x; }
      }
      // must call Approve for all first
      for (uint y = 0; y &lt; quant * 5;) {
        ERC721Burnable(Tinys).burn(ids[y]);
      }
    }
  }
"><code>  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">burnToMint</span>(<span class="hljs-params">
    <span class="hljs-keyword">uint256</span>[] <span class="hljs-keyword">memory</span> ids
  </span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span>
    <span class="hljs-title">notPaused</span>(<span class="hljs-params"></span>)
    <span class="hljs-title">onlySale</span>(<span class="hljs-params"></span>)
    <span class="hljs-title">nonReentrant</span>(<span class="hljs-params"></span>) </span>{
    <span class="hljs-comment">// now to get the five per</span>
    <span class="hljs-keyword">uint256</span> quant <span class="hljs-operator">=</span> ids.<span class="hljs-built_in">length</span> <span class="hljs-operator">/</span> <span class="hljs-number">5</span>;
    <span class="hljs-keyword">if</span> (quant <span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-number">0</span>) {
      <span class="hljs-keyword">revert</span> MaxSplaining({
        reason: <span class="hljs-string">"Main:B1"</span>
      });
    } <span class="hljs-keyword">else</span> {
      <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint</span> x <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; x <span class="hljs-operator">&#x3C;</span> quant;) {
        _safeMint(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>, _nextUp());
        _oneRegularMint();
        <span class="hljs-keyword">unchecked</span> { <span class="hljs-operator">+</span><span class="hljs-operator">+</span>x; }
      }
      <span class="hljs-comment">// must call Approve for all first</span>
      <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint</span> y <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; y <span class="hljs-operator">&#x3C;</span> quant <span class="hljs-operator">*</span> <span class="hljs-number">5</span>;) {
        ERC721Burnable(Tinys).burn(ids[y]);
      }
    }
  }
</code></pre><pre data-type="codeBlock" text="  function teamMint(
    uint256 quant
  ) external
    onlyOwner() {
    if (this.minterMinted() + quant &gt; this.minterCapacity() &amp;&amp; 
        this.minterTeamMintsMinted() + quant &gt; this.minterTeamMintsCapacity()) {
      revert MaxSplaining ({
        reason: &quot;Main:TM1&quot;
      });
    }
    for (uint x = 0; x &lt; quant;) {
      // mint it
      _mint(this.owner(), _nextUp());
      _oneTeamMint();
      unchecked { ++x; }
    }
  }
"><code>  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">teamMint</span>(<span class="hljs-params">
    <span class="hljs-keyword">uint256</span> quant
  </span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span>
    <span class="hljs-title">onlyOwner</span>(<span class="hljs-params"></span>) </span>{
    <span class="hljs-keyword">if</span> (<span class="hljs-built_in">this</span>.minterMinted() <span class="hljs-operator">+</span> quant <span class="hljs-operator">></span> <span class="hljs-built_in">this</span>.minterCapacity() <span class="hljs-operator">&#x26;</span><span class="hljs-operator">&#x26;</span> 
        <span class="hljs-built_in">this</span>.minterTeamMintsMinted() <span class="hljs-operator">+</span> quant <span class="hljs-operator">></span> <span class="hljs-built_in">this</span>.minterTeamMintsCapacity()) {
      <span class="hljs-keyword">revert</span> MaxSplaining ({
        reason: <span class="hljs-string">"Main:TM1"</span>
      });
    }
    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint</span> x <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; x <span class="hljs-operator">&#x3C;</span> quant;) {
      <span class="hljs-comment">// mint it</span>
      _mint(<span class="hljs-built_in">this</span>.owner(), _nextUp());
      _oneTeamMint();
      <span class="hljs-keyword">unchecked</span> { <span class="hljs-operator">+</span><span class="hljs-operator">+</span>x; }
    }
  }
</code></pre><p>Now let’s scope the errors shall we?</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://testnet.ftmscan.com/tx/0xd2dab8856959d9be358c55a4aef7bcb8b77dc6b3a2edd12929a3d45482d16902">Error 1</a> (burn to mint)</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://testnet.ftmscan.com/tx/0x6915f82497deb95b2d7a7b1f5f36e507ecd804a609767c9ab7eced8b0ee265ce">Error 2</a> (team mint)</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://testnet.ftmscan.com/tx/0x28ea16d8362d31b9e087ab5e931cf3209ab85be43db33247ccc9ac44d1d46266">Error 2 again</a> (team mint)</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://testnet.ftmscan.com/address/0x35628b61395946ed69c7938120d9e08579d479ce#readContract#F16">States</a></p></li></ul><p>So what went wrong? Let’s break it down… for starters dropped the ERC721Burnable(Tinys).burn(ids[y]); for IERC721Burnable(Tinys).burn(ids[y]); but there’s a glaring issue there in the for loop. There’s no ++y. Add a dash of unchecked { ++y; } and that remedied this Error. Also, forgot an “overflow” and fixed that as well. So now we got this…</p><pre data-type="codeBlock" text="  function burnToMint(
    uint256[] memory ids
  ) external
    notPaused()
    onlySale()
    nonReentrant() {
    // now to get the five per
    uint256 quant = ids.length / 5;
    if (quant == 0) {
      revert MaxSplaining({
        reason: &quot;Main:B1&quot;
      });
    } else if (this.minterMinted() + quant &gt; this.minterCapacity()) {
      revert MaxSplaining ({
        reason: &quot;Main:B2&quot;
      });
    } else {
      for (uint x = 0; x &lt; quant;) {
        _safeMint(msg.sender, _nextUp());
        _oneRegularMint();
        unchecked { ++x; }
      }
      // must call Approve for all first
      for (uint y = 0; y &lt; quant * 5;) {
        IERC721Burnable(Tinys).burn(ids[y]);
        unchecked { ++y; }
      }
    }
  }
"><code>  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">burnToMint</span>(<span class="hljs-params">
    <span class="hljs-keyword">uint256</span>[] <span class="hljs-keyword">memory</span> ids
  </span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span>
    <span class="hljs-title">notPaused</span>(<span class="hljs-params"></span>)
    <span class="hljs-title">onlySale</span>(<span class="hljs-params"></span>)
    <span class="hljs-title">nonReentrant</span>(<span class="hljs-params"></span>) </span>{
    <span class="hljs-comment">// now to get the five per</span>
    <span class="hljs-keyword">uint256</span> quant <span class="hljs-operator">=</span> ids.<span class="hljs-built_in">length</span> <span class="hljs-operator">/</span> <span class="hljs-number">5</span>;
    <span class="hljs-keyword">if</span> (quant <span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-number">0</span>) {
      <span class="hljs-keyword">revert</span> MaxSplaining({
        reason: <span class="hljs-string">"Main:B1"</span>
      });
    } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-built_in">this</span>.minterMinted() <span class="hljs-operator">+</span> quant <span class="hljs-operator">></span> <span class="hljs-built_in">this</span>.minterCapacity()) {
      <span class="hljs-keyword">revert</span> MaxSplaining ({
        reason: <span class="hljs-string">"Main:B2"</span>
      });
    } <span class="hljs-keyword">else</span> {
      <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint</span> x <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; x <span class="hljs-operator">&#x3C;</span> quant;) {
        _safeMint(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>, _nextUp());
        _oneRegularMint();
        <span class="hljs-keyword">unchecked</span> { <span class="hljs-operator">+</span><span class="hljs-operator">+</span>x; }
      }
      <span class="hljs-comment">// must call Approve for all first</span>
      <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint</span> y <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; y <span class="hljs-operator">&#x3C;</span> quant <span class="hljs-operator">*</span> <span class="hljs-number">5</span>;) {
        IERC721Burnable(Tinys).burn(ids[y]);
        <span class="hljs-keyword">unchecked</span> { <span class="hljs-operator">+</span><span class="hljs-operator">+</span>y; }
      }
    }
  }
</code></pre><p>What about the second error? It all lies with this… (this.minterMinted() + quant &gt; this.minterCapacity() &amp;&amp; this.minterTeamMintsMinted() + quant &gt; this.minterTeamMintsCapacity()). If you use &amp;&amp; then both have to fire true to toss the revert. Simple hot fix, swap || for &amp;&amp; and then either or can short circuit the if statement. Now we got this…</p><pre data-type="codeBlock" text="  function teamMint(
    uint256 quant
  ) external
    onlyOwner() {
    if (this.minterMinted() + quant &gt; this.minterCapacity() || 
        this.minterTeamMintsMinted() + quant &gt; this.minterTeamMintsCapacity()) {
      revert MaxSplaining ({
        reason: &quot;Main:TM1&quot;
      });
    }
    for (uint x = 0; x &lt; quant;) {
      // mint it
      _mint(this.owner(), _nextUp());
      _oneTeamMint();
      unchecked { ++x; }
    }
  }
"><code>  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">teamMint</span>(<span class="hljs-params">
    <span class="hljs-keyword">uint256</span> quant
  </span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span>
    <span class="hljs-title">onlyOwner</span>(<span class="hljs-params"></span>) </span>{
    <span class="hljs-keyword">if</span> (<span class="hljs-built_in">this</span>.minterMinted() <span class="hljs-operator">+</span> quant <span class="hljs-operator">></span> <span class="hljs-built_in">this</span>.minterCapacity() <span class="hljs-operator">|</span><span class="hljs-operator">|</span> 
        <span class="hljs-built_in">this</span>.minterTeamMintsMinted() <span class="hljs-operator">+</span> quant <span class="hljs-operator">></span> <span class="hljs-built_in">this</span>.minterTeamMintsCapacity()) {
      <span class="hljs-keyword">revert</span> MaxSplaining ({
        reason: <span class="hljs-string">"Main:TM1"</span>
      });
    }
    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint</span> x <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; x <span class="hljs-operator">&#x3C;</span> quant;) {
      <span class="hljs-comment">// mint it</span>
      _mint(<span class="hljs-built_in">this</span>.owner(), _nextUp());
      _oneTeamMint();
      <span class="hljs-keyword">unchecked</span> { <span class="hljs-operator">+</span><span class="hljs-operator">+</span>x; }
    }
  }
</code></pre><p>So after passing my unit tests like normal, here we go</p><ul><li><p>ERC 721 - passed</p></li><li><p>EIP 1412 - passed (safeBatchTransferFrom())</p></li><li><p>EIP 2981 - passed</p></li><li><p>MaxAccess - passed (EIP 173-esque control with bytes4 roles)</p></li><li><p>PaymentSplitterV2 - passed</p></li><li><p>PsuedoRandom.Engine - passed</p></li><li><p>TimeCop - passed</p></li></ul><p>Next comes the metadata, and you know how I usually get this… a massive dump file or I generate those pesky images and jsons (Hash-Lips). Well this is Lucky, so I at least don’t have to do that but… There’s this magic where I randomize the images (again), generate provenances, and IPFS pin those hashes. So, we break for forty minutes and upload it all, this time he didn’t kill me with gigabytes of data. Oh and don’t forget I go pull the current <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.opensea.io/docs/metadata-standards">NFT Metadata Standards</a> from a big source. Here’s a before and after screenshot.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/8f398a916609fcadbc412be43f7eaba97681daa1e458fcad9c8223a27b56a356.png" alt="Left: Lucky&apos;s file drop, Right: MaxFlowO₂&apos;s finished product" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Left: Lucky&apos;s file drop, Right: MaxFlowO₂&apos;s finished product</figcaption></figure><p>Key takeaways:</p><ul><li><p>Frequency added to Attributes</p><ul><li><p>used in a few marketplaces like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://paintswap.finance/">PaintSwap</a></p></li><li><p>provides on chain rarity</p></li></ul></li><li><p>Count added to Attributes</p><ul><li><p>provides on chain rarity</p></li></ul></li><li><p>IPFS links</p><ul><li><p>avoid directories you pin these</p></li><li><p>link to files</p></li></ul></li><li><p>Image and Animation URL</p><ul><li><p>This is a combo, PFP and Music</p></li><li><p>Moved from directory hash/file to file hash</p></li></ul></li></ul><p>Now we can talk about API vs. IPFS since this is a chainID 250 (Fantom main net) deployment, we can easily go API for free using the RPC of <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://rpc.fantom.tools">https://rpc.fantom.tools</a> and some quick and hot JavaScript for this back end. Guess what the back end count is at now… two. A simple REST API via Express.JS is more than sufficient if you just need to know. On my weekly series I’ll cover this during, “NFT Weeks.” Once minted out, or we end the mint, this has happened before see the DaemonDAO mint. I’ll swap this from API to IPFS and shut down the queries to my server.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/df5e16c8fb7e0c9da59193e6876fe6f4ed7ec05169f35418128dd74266c2d1d6.png" alt="A screen cap of the Rest API that 99% of users don&apos;t care about..." blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">A screen cap of the Rest API that 99% of users don&apos;t care about...</figcaption></figure><p>Now some of the final things to do… tie a front end to a smart contract. Knowing Lucky, and at this point of over 15 months of working together, he’s probably done a front end and didn’t close all the HTML5 tags. Do not worry, I got you, and already did the two space tabs and closed tags first… Once you know me two spaces are the key, because I split screen almost everything. I also mirror all front ends before pushing to the repositories on GitHub.com. Why? Because it’s easier to destroy it on my server and fix it, than to constantly wait for a host to upload it.</p><p>So, let’s deploy this thing…</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/6cf42a6e86376454b7827c3accbf5871dc06020bd4601cb68d3b4b482b42020d.png" alt="$ truffle migrate --network FTM... WTF it&apos;s a truffle deployment?!?!" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">$ truffle migrate --network FTM... WTF it&apos;s a truffle deployment?!?!</figcaption></figure><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/ce20150f0e9b84ef6e1e11619aaba89fc88f780528dc360a93db66064428b604.png" alt="and a double git push for good measure" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">and a double git push for good measure</figcaption></figure><p>So where are we at now… yeah about to write some web3.js for a front end in HTML5 or something. So post HTML5 cleanup and importing all the right npm’s, we can use web3.js pretty effectively. Here’s some screen caps of me chopping away at some of the forked code (from tinydaemons.js) we don’t need anymore…</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/dd871541e71075f4dead1ac79c548dc5d9c2cc99c469f4fc995a1d53c4a93e53.png" alt="Left: web3.js, Right: HTML5, basically 24/7 CLI of what I do..." blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Left: web3.js, Right: HTML5, basically 24/7 CLI of what I do...</figcaption></figure><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/fb5931bcf780d61bda4aefe2d57d627bd140a0b337313eaa5f3722023a40ff5b.png" alt="How the browser sees it via console.log and HTML5" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">How the browser sees it via console.log and HTML5</figcaption></figure><p>This is why you are verbose in console.log and web3. You must know what your program is doing and why it’s tossing errors left and right during the, “burn it to the ground,” phase of building. like look at this sexy combo of, “how we do this…”</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/3acbd9046535542204b8a42112aae93ba45d342dda27d8784ab1f72e643029c2.png" alt="Left: web3.JS source Right: Console.log of &quot;localhost&quot;" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Left: web3.JS source Right: Console.log of &quot;localhost&quot;</figcaption></figure><p>So after tying up some loose ends and getting all the HTML5 and web3.JS to agree then you must push it. So there was a huge change log to this but I’ll skim over the absolute details in a bit. You probably won’t get everything as a green light the first time unless you got some skills. Good news? I got some skills. So from starting this only 24h ago we got this massive checklist done…</p><ul><li><p>Smart Contracts tested and deployed to testnet</p></li><li><p>NFT Metadata “reshuffled” and enhanced</p></li><li><p>IPFS Pinning of all Images/JSONs/Music</p></li><li><p>Web2 tied into Web3</p></li><li><p>Smart Contract Deployed to main net</p></li><li><p>States loaded</p></li><li><p>Approval sent to PaintSwap</p></li></ul><p>So what was the main take away of this? For starters the Max-721/2022 is a well developed streamlined program that is highly modular that needs maybe one more reduction of externals to jam the full breadth in there. I’m talking about ERC-20 and “ETH” payments. I’m talking about having EIP 2981 and ContractURI in the same mix with the Psuedorandom engine and Allow Lists and basic ERC-721. Soon I’ll roll parts of the Max-721/2023 that’s UUPS into the 2022 edition to optimize it some more. 24kb is 24kb, that’s the part that sucks the worst. Stay tuned… there’s always going to be more.</p><p>Thanks for the time,</p><p>Max Flow O₂</p><p>P.S. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/DaemonDAO/DaemonDAO.github.io">Web Repo</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="">Contracts Repo</a></p>]]></content:encoded>
            <author>maxflowo2@newsletter.paragraph.com (MaxFlowO₂ 终端浪人)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/2a3807c555fbb5aae2197bea2c4677d1c0ab3aebda394569b170ecf567f78936.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[fBOMB: The rollup]]></title>
            <link>https://paragraph.com/@maxflowo2/fbomb-the-rollup</link>
            <guid>1AyEooMhTNJusN7AM2Na</guid>
            <pubDate>Sat, 17 Dec 2022 06:25:50 GMT</pubDate>
            <description><![CDATA[Post every project I will be writing an apologue or two about the development process and mythology that stems from it. This would be the inaugural one, so let’s dive in to the saga of fBOMB. Obviously being a developer I must start with a requirements and some sort of npm/yarn install right?{ "devDependencies": { "@TL/CR": "^0.0.1", "@requirements": "^1.0.0", "@MaxFlowO2": "latest" } } So this saga comes with me as the 3rd gen developer of the first meme coin on Fantom. Yes, we are talking a...]]></description>
            <content:encoded><![CDATA[<p>     Post every project I will be writing an apologue or two about the development process and mythology that stems from it. This would be the inaugural one, so let’s dive in to the saga of fBOMB. Obviously being a developer I must start with a requirements and some sort of npm/yarn install right?</p><pre data-type="codeBlock" text="{
  &quot;devDependencies&quot;: {
    &quot;@TL/CR&quot;: &quot;^0.0.1&quot;,
    &quot;@requirements&quot;: &quot;^1.0.0&quot;,
    &quot;@MaxFlowO2&quot;: &quot;latest&quot;
  }
} 
"><code>{
  <span class="hljs-string">"devDependencies"</span>: {
    <span class="hljs-string">"@TL/CR"</span>: <span class="hljs-string">"^0.0.1"</span>,
    <span class="hljs-string">"@requirements"</span>: <span class="hljs-string">"^1.0.0"</span>,
    <span class="hljs-string">"@MaxFlowO2"</span>: <span class="hljs-string">"latest"</span>
  }
} 
</code></pre><p>     So this saga comes with me as the 3rd gen developer of the first meme coin on Fantom. Yes, we are talking about $BOMB on chainID 250. Obviously there was a needed wrapper so wBOMB came from a developer named lookee. He also did a great UI. But the man, the myth, the legend also named Fiery Dev, aka @Dev_Enjoys on bird app came to me while doing updates with wBOMB. The challenge get BOMB to all the chains. The answer, omnichain. Why me? Answer, TinyDaemons…</p><p>     First thing is first you must get the original contracts so you can build localhost and or testnet editions for testing. So copied the verified source from FTMScan found here <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://ftmscan.com/token/0x8503eb4a136bdbeb323e37aa6e0fa0c772228378#code">BOMBv3</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://ftmscan.com/token/0xc09a82ad5075b3067d80f54f05e1e22229699cc1#code">wBOMB</a>. Next challenge was 1822 UUPS ERC20. I didn’t like OZ’s so rolled my own called Lib20 with a struct named Token, aka Lib20.Token. Tied that to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://eips.ethereum.org/EIPS/eip-20">EIP-20</a>, and off to the races. Added the Non Blocking Receiver from LZ and made the payload uint256 amount, kind of obvious there.</p><p>Now here were the requirements:</p><ul><li><p>One way deposit BOMB/wBOMB → fBOMB</p><ul><li><p>Smart contract handles 100% of burning it all</p><ul><li><p>wBOMB can not burn</p></li><li><p>BOMB can burn</p></li></ul></li></ul></li><li><p>Bridgable</p><ul><li><p>LZ enabled via traverseChains(uint256 amount)</p></li></ul></li><li><p>Taxation</p><ul><li><p>1% on all intra-chain transactions</p><ul><li><p>Same as wBOMB on Fantom</p></li><li><p>Same as BOMB on Fantom</p></li></ul></li><li><p>1% tax to treasury for bridging</p></li><li><p>Exemption for certain v2 AMM’s and Balancers</p></li></ul></li><li><p>Upgradable</p><ul><li><p>EIP 1822 UUPS</p></li></ul></li><li><p>Tied to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://fbomb.finance">fbomb.finance</a></p></li></ul><p>     We can fast forward to currently and stop the technical jargon and you can see the deployed contract source <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ftmscan.com/token/0x74ccbe53f77b08632ce0cb91d3a545bf6b8e0979#code">here</a>. It is currently on Optimism and Fantom blockchains and will be migrated to five others very soon. Why take my word for it, look <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://blockscan.com/address/0x74ccbe53f77b08632ce0cb91d3a545bf6b8e0979">here</a>.</p><p>     So I’ll post another update this when the UI is done, for for now I must say, “Bon voyage.” This was the birth of the Max-20/2023 UUPS LZ. I will be forever grateful for it. Heard a rumor about some MCLB token or something…</p><p>Thank you for the time,</p><p>Max Flow O₂</p>]]></content:encoded>
            <author>maxflowo2@newsletter.paragraph.com (MaxFlowO₂ 终端浪人)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/7775262089bbe103719720536ce934386633913fc4a73c0203c0b77054a31ffa.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[MFO₂:  Week[0] So you wanna be a developer?]]></title>
            <link>https://paragraph.com/@maxflowo2/mfo-week-0-so-you-wanna-be-a-developer</link>
            <guid>y09ZG8uwstZkz7pCJMOt</guid>
            <pubDate>Thu, 15 Dec 2022 22:53:25 GMT</pubDate>
            <description><![CDATA[To understand the realm of what you are about to enter understand that, “Hacker School,” might sound cool, but it isn’t. It’s far from cool. This will cost you friends, your old ways, and seriously isolate you if you go freelance… TL:CR (Too long, can’t read)Learn OOJS/TSPythonHTML/CSSC/C++/C#Go/RustWrite stuff I get this question a lot more than I’d like to admit, “How did you become a web3 dev?” Answer is simple, be born in 1982, and become a hacker in the 90’s. If that’s not you, then I’d ...]]></description>
            <content:encoded><![CDATA[<p>     To understand the realm of what you are about to enter understand that, “Hacker School,” might sound cool, but it isn’t. It’s far from cool. This will cost you friends, your old ways, and seriously isolate you if you go freelance…</p><p>     TL:CR (Too long, can’t read)</p><ul><li><p>Learn OO</p><ul><li><p>JS/TS</p></li><li><p>Python</p></li><li><p>HTML/CSS</p></li><li><p>C/C++/C#</p></li><li><p>Go/Rust</p></li></ul></li><li><p>Write stuff</p></li></ul><p>     I get this question a lot more than I’d like to admit, “How did you become a web3 dev?” Answer is simple, be born in 1982, and become a hacker in the 90’s. If that’s not you, then I’d recommend knowing a few things. I would say off the top of my head knowing web2 and how it’s progressed, and adding web3 when it’s applicable.</p><p>     So for starters, let’s dive into what is exactly web2? Well if you look at the canonical definition of it, as you should because code does not care about your feelings ever, it is Hypertext with JavaScript for rich user front ends. Trust me web, “back in my day,” was nothing but static and a server query with a magical thing called SQL. So the JavaScript actually gives you this, “experience,” if you will. Want this on a tablet, iPhone, desktop? JavaScript can deduce the sizes and resize everything. Welcome to front end 101, an article I will post later in a weekly series here starting on Fridays next week (23 Dec 2022). OG web, would of had a mobile.domain or m.domain for other devices. Now we have frameworks like Bootstrap, React, Next, and whatever else is out there in JavaScript. Welcome to a post Y2K world right?</p><p>     So for web2, you’ll need to know a few things before even the framework. You will have to understand HTML5, and I recommend <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://developer.mozilla.org/en-US/docs/Glossary/HTML5">developer.mozilla.org/en-US/docs/Glossary/HTML5</a>. There are always new and fun things to be added, but the problem is this is very clunky. Next thing to browse, CSS, and I recommend <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://developer.mozilla.org/en-US/docs/Web/CSS">developer.mozilla.org/en-US/docs/Web/CSS</a>. This will add the effects of the HTML tags, and is very extensive. The last bit would be JavaScript, and low and behold go here for the docs <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://developer.mozilla.org/en-US/docs/Web/JavaScript">developer.mozilla.org/en-US/docs/Web/JavaScript</a>. Now realize this… you just took a step to being a web developer. LMAO, made you look.</p><p>     So where’s the web3, I WAS PROMISED WEB3!!!? Ok, so let’s honestly look at what web3 is, and that’s storage. Mappings are, you guessed it SQL, funny when a key and value are stored in a mapping and you call it otherwise. So what is a smart contract honestly? Storage. Plain and simple. Yes there’s tons of, “use cases,” of storage, fungible tokens, non fungible tokens, semi-fungible tokens, swapping of tokens, wrapping of tokens, transferring data from chain to chain, generating passwords and proving them (zk’s), and my new favorite cryptological signatures. Know what else is in a smart contract? 24kb of pain, and 50 memory slots. Guess what every external function = more byte code. Got to admire limits.</p><p>     Well you learned the first dirty secret, web3 is just a database. A public one. Now to tie that to a front end, use some JavaScript. Web3.JS <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://web3js.readthedocs.io/en/v1.8.1/">web3js.readthedocs.io/en/v1.8.1/</a> or Ethers.JS <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://docs.ethers.org/v5/">docs.ethers.org/v5/</a> should suffice. Honestly I’d read up on QRModal over MetaMask, but that’s on you for an intermediate.</p><p>     Eventually I’ll talk about the, “smart contracts,” that aren’t really smart but they are a contract and the ways to make mutable and immutable code from them. To include the languages. This topic definitely covered the JS/TS, HTML + CSS, and will expand it to how to serve these files and the pros/cons of them all. Now go out and be lonely, reading and googling everything within eyesight. Soon we will cover the fun shit in web3.</p><p>Thank you,</p><p>MaxFlowO₂</p>]]></content:encoded>
            <author>maxflowo2@newsletter.paragraph.com (MaxFlowO₂ 终端浪人)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/8642c91014e5b82f93dfa833db56d37c37e52145856e487de14efa07e9aa6682.png" length="0" type="image/png"/>
        </item>
    </channel>
</rss>