<?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>Beans</title>
        <link>https://paragraph.com/@beans</link>
        <description>Builder</description>
        <lastBuildDate>Tue, 08 Sep 2026 06:34:16 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>Beans</title>
            <url>https://storage.googleapis.com/papyrus_images/cdf5bd6db5f7992f4476aaa52ee46bed9aba27b1f0f15cd7504e94e501df5182.png</url>
            <link>https://paragraph.com/@beans</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Chain Runners on-chained]]></title>
            <link>https://paragraph.com/@beans/chain-runners-on-chained</link>
            <guid>WWvFC9jq3Hoi9mqLzA7O</guid>
            <pubDate>Sun, 13 Mar 2022 12:32:34 GMT</pubDate>
            <description><![CDATA[Chain Runner’s has been one of my favorite communities I’ve had the pleasure of becoming a part of. The community is full of builders and genuine people that truly care about the space (not just people that solely care about “number go up” tech). Teams like the Chain Runners team and Anonymice team are trail blazers in this space. They go above and beyond what’s “normal and necessary” to ensure they create the best products that push the space forward. I wanted to write this article to showca...]]></description>
            <content:encoded><![CDATA[<p>Chain Runner’s has been one of my favorite communities I’ve had the pleasure of becoming a part of. The community is full of builders and genuine people that truly care about the space (not just people that solely care about “number go up” tech).</p><p>Teams like the Chain Runners team and Anonymice team are trail blazers in this space. They go above and beyond what’s “normal and necessary” to ensure they create the best products that push the space forward.</p><p>I wanted to write this article to showcase the on-chain tech that composes each Chain Runner because I don’t think a lot of people fully appreciate/understand it, but it’s honestly super fucking cool. I hope this can help people understand the sheer big brain thinking that went into this project and encourage those same people to support real builders.</p><p>This article is going to be fairly technical, so I am just going to assume you understand the basics of on-chain vs off-chain NFTs and a high level understanding of solidity/programming. Here is a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://medium.com/etherscan-blog/souls-of-immortal-nfts-de212a840de5">cool article</a> shows the differences of on-chain vs off-chain.</p><p><em>Disclaimer, some of the traits I mention here are just for example purposes to make everything easier to understand, so they might not correlate exactly to what you see on OS or Etherscan.</em></p><h2 id="h-preface" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Preface</h2><p>First and foremost, shout out Anonymice (and every other on-chain project) that are just continuing to build. The trait weighting logic was inspired by you guys and it’s awesome to see your community continue to build as well.</p><h2 id="h-mint" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Mint</h2><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/1525022e6676ebae444990e22492c8bd49ae83698143cdbc8b3cf276df563aa4.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>This is the core mint function that constructs your runner. Every runner has a <code>dna</code> that determines what traits that runner has (more on this later). The <code>dna</code> is created by generating a pseudo-random number on-chain by hashing various block values and txn values, and then converting that into a <code>uint256</code>. This essentially takes a whole bunch of pseudo-random bytes and turns it into a large number.</p><p>Although this isn’t perfectly random, it’s completely fine in this case since it was just for mint and realistically, it would’ve been impossible to game this since the runners minted out so fast.</p><h2 id="h-dna-metadata-svgs" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">DNA → Metadata + SVGs</h2><p>This is where all the magic happens, so buckle in and let me learn you a thing or two.</p><p><em>Small disclaimer, recently the Chain Runner switched tokenURIs point to off-chain URLs to let people verify their pfp on Twitter (Twitter blue doesn’t support fully on chain SVGs… $26B company can’t figure out how to decode SVGs… smh). However, before this change, the tokenURI pointed to an on-chain image renderer - this is what we will be going over.</em></p><h3 id="h-trait-rarity" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Trait Rarity</h3><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/0a34b639edfd43cc638ea6e25c8b71b444dca82174a029c6c0c3493d0f8ec4b7.png" alt="Every trait is mapped to an integer which determines it&apos;s probability" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Every trait is mapped to an integer which determines it&apos;s probability</figcaption></figure><p>Look… I know what you’re probably thinking… <em>what the fuck do those numbers mean?</em> Well at least, that was my first impression, but don’t worry, it looks complex but it’s actually beautifully simple.</p><p><code>WEIGHTS</code> is a 3D array, the first index represents the race of the runner (human, skull, bot, etc), the second index represents the individual traits for each race, and the third index represents the probability for each trait. We’ll focus on the first 2 indexes of <code>WEIGHTS</code> for now. While this isn’t proper Solidity syntax, let’s represent the array as <code>WEIGHTS[Race][Trait]</code>.</p><p>Let’s make this easier to understand by changing up some of the syntax in the above code snippet.</p><p>In <code>WEIGHTS</code> , index 0 represents the race (in this case human), second index 0 represents the trait (in this case Background):</p><p><code>WEIGHTS[0][0] == WEIGHTS[Human][Background]</code></p><p>Let’s do the rest:</p><p><code>WEIGHTS[0][1] == WEIGHTS[Human][Face]</code></p><p><code>WEIGHTS[0][2] == WEIGHTS[Human][Mouth]</code></p><p><code>WEIGHTS[0][3] == WEIGHTS[Human][Nose]</code></p><p>. . .</p><p><code>WEIGHTS[0][12] == WEIGHTS[Human][Mouth Accessory]</code></p><p>Every single race has the <em>possibility</em> to have all 13 traits, but that is determined by the actual array of numbers for each trait (the 3rd index in <code>WEIGHTS</code>).</p><p>If we look at: <code>WEIGHTS[0][3] = [645, 0, 1290, 322, 645, 645, 645, 967, 322, 967, 645, 967, 967, 973]; // in our syntax this is WEIGHTS[Human][Nose]</code></p><p>The long array of numbers represents the probability of each trait, in this case, the probability of each nose trait. Essentially, the bigger the number, the higher probability a runner will have that trait. The array sums up to 10,000 and the probability of a trait is essentially the array_value / 10,000.</p><p>Lets add comments to the array so it’s easier to see what’s going on:</p><p><code>WEIGHTS[0][3] = [</code></p><p><code>645, //probability of noseTrait1 is 645/10000</code></p><p><code>0, //probability of noseTrait2 is 0/10000</code></p><p><code>1290, //probability of noseTrait3 is 1290/10000</code></p><p><code>… etc</code></p><p><code>]</code></p><p>You may have noticed the <code>0</code>. That just means, for the human race, that specific nose trait is not selectable (for instance, it may be the bot nose which only the bot race can have).</p><h3 id="h-mapping-dna-to-traits" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Mapping DNA to traits</h3><p>Now that we understand what <code>WEIGHTS</code> represents, and that the long array of numbers is actually just the traits are mapped to probabilities, let’s see how a runners <code>dna</code> actually determines its traits.</p><p>A runner’s <code>dna</code> is an <code>uint256</code> which will look something like this: <code>29961126176421124262784123274363413448521573139494556849866782425143528472800</code>. We then take our <code>dna</code> and feed it to this function:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/c6615805648ebd6015c0aad0fa1548c52370b74342b9f6a757a4005f5aded125.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>This function takes our <code>dna</code> and returns 13 different numbers in an array (<code>NUM_LAYERS == 13</code> which is how many traits we have). Each number in the array is created by modding the <code>dna</code> with 10000 (which will return the last 4 digits of the <code>dna</code>), and then we bit shift <code>dna</code> to the left by 14. We shift by 14 because it’s the lowest power of 2 that is &gt; 10000. If we shifted by any less bits, the previous number would have a 1 bit correlation with the next number. We keep doing that in a loop until we get 13 numbers, 1 for each trait. These numbers determine which trait we get.</p><p>Imagine that the function returns the array <code>[1234, 5432, 4443, 1111, etc]</code> for our <code>dna</code>. So how do we take these numbers and actually see which trait we got? That happens in this function:</p><p><em>Caveat: our</em> <code>dna</code> <em>also determines our runners race but let’s just say our runner is a human for all examples.</em></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/e117ee0a6b8661d30c59e48c1e9c1aeee7255b7f588214a3c24e5d70b44615b3.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>I’ll show you what this function is doing with an example.</p><p>This is the array returned for our <code>dna</code> was <code>[1234, 5432, 4443, 1111, etc]</code>. The index of each array elements maps directly to the index of the trait in <code>WEIGHTS</code>.</p><p>So if <code>1111</code> in our array is at index 3, this maps to <code>WEIGHTS[Human][index 3]</code> which is <code>WEIGHTS[Human][Nose]</code>.</p><p>Recalling the trait probability array for the nose trait for the human race (from way above): <code>WEIGHTS[Human][Nose] = [645, 0, 1290, 322, 645, 645, 645, 967, 322, 967, 645, 967, 967, 973]; // nose trait probability array</code></p><p>How does <code>1111</code> determine which nose trait we get? We loop through the nose trait probability array and sum up all the numbers until we reach a sum that bounds <code>6785</code>. So essentially, we loop through the array:</p><p>1: sum = 645 <code>// WEIGHTS[Human][Nose][0]</code></p><p>is <code>1111</code> within [0,645]? If not, keep going.</p><p>2: sum = 645 + 0 = 645 <code>// previous sum + WEIGHTS[Human][Nose][1]</code></p><p>is <code>1111</code> within [0,645]? If not, keep going.</p><p>3: sum = 645 + 1290 = 1935 <code>// previous sum + WEIGHTS[Human][Nose][2]</code></p><p>is <code>1111</code> within [645, 1290]? If yes, this is the nose trait your runner gets.</p><p>Because the nose trait probability at index 2 bounds <code>1111</code>, our runner’s nose trait is whatever nose trait is at index 2. This is defined by the Chain Runner’s team (maybe it’s the septum piercing nose trait or maybe it’s something else).</p><p>We do this for every single trait by looping the array <code>[1234, 5432, 4443, 1111, etc]</code>, this will determine all 13 traits for the runner.</p><p><em>Caveat, sometimes the probability you get from your</em> <code>dna</code> <em>is greater than the sum of the traits array, that simply means, your runner will not have that trait at all. This is some runners have different number of traits.</em></p><p>This is essentially the crux of how a runner’s trait is determined.</p><p><em>Boy o boy that was a lot of information. Take a quick breather :) We’re almost done!</em></p><h3 id="h-formatting-traits-into-proper-encoded-json" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Formatting traits into proper encoded JSON</h3><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/3745bc92b0e4298c1200301ed99557c3a18923a20cd221a46e26ebb8d7775abf.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>This function takes in a runners <code>dna</code> and creates all the probabilities for the traits and sees which traits our runner has (line 252 calls the exact function we described above <code>getLayerIndex()</code>). Let’s break down this function in steps:</p><ol><li><p>Line 243: Use the <code>dna</code> to get the array that determines which traits we have (<code>[1234, 5432, 4443, 1111, etc]</code>from our above example).</p></li><li><p>Line 244: Get the race of our runner (assume human).</p></li><li><p>Line 246-250: Some traits are optional, so we check to see if the runner has these traits such as face accessory or mask.</p></li><li><p>Line 251-268: Essentially loop through all 13 traits and see what traits our runner has using the array from splitting our <code>dna</code> (<code>[1234, 5432, 4443, 1111, etc]</code>). Line 260 is just doing some layering formatting depending on the traits of the running (ie don’t add conflicting traits to the runner).</p></li><li><p>If the runner has a specific trait, add it to <code>TraitTypes</code> which is just another array that concretely defines what traits our runner has (ie <code>TraitTypes = [Background, Face, Nose, etc]</code>.</p><p>On line 264, you can see they’re not adding the string <code>Background</code> or <code>Face</code> to <code>TraitTypes</code> but rather some random characters. Those characters are actually base64 encoded versions of the traits. This allows for 1 less computation since we have to return a base64 encoded version of traits at the very end.</p><p>For example, <code>QmFja2dyb3VuZCAg</code> is <code>Background</code> in base64 encoding.</p></li><li><p>Line 269: Return all the necessary info for this runner relating to the traits it has.</p></li></ol><h3 id="h-formatting-the-image-and-returning-the-tokenuri" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Formatting the image and returning the tokenURI</h3><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/15f4039e3037c3af659f0a15b011d2085244c89a2272d68b683e05f8e7171d35.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>We’re almost there! This is the last section.</p><p>This is the tokenURI function that formats all the JSON metadata and constructs the onchain SVGs.</p><p>Line 211 (which is cut off):</p><pre data-type="codeBlock" text="(Layer [NUM_LAYERS] memory tokenLayers, Color [NUM_COLORS][NUM_LAYERS] memory tokenPalettes, uint8 numTokenLayers, string[NUM_LAYERS] memory traitTypes) = getTokenData(runnerData.dna);
"><code>(Layer [NUM_LAYERS] <span class="hljs-keyword">memory</span> tokenLayers, Color [NUM_COLORS][NUM_LAYERS] <span class="hljs-keyword">memory</span> tokenPalettes, <span class="hljs-keyword">uint8</span> numTokenLayers, <span class="hljs-keyword">string</span>[NUM_LAYERS] <span class="hljs-keyword">memory</span> traitTypes) <span class="hljs-operator">=</span> getTokenData(runnerData.dna);
</code></pre><p>This gets all the trait data for our runner, everything mentioned in this article thus far. This line calls the exact function I explained above. <code>numTokenLayers</code> is the number of layers for the runner (number of traits), <code>tokenLayers</code> are the actual trait names for the runner (background 1, nose 2, face 1, etc) , <code>traitTypes</code> as mentioned before are the actual base64 encoded trait categories (Background, Face, etc), and the rest is for the SVG creation.</p><p>Line 213 - 218 Loops through all the layers our runner has and constructs the JSON string. These are already based 64 encoded to save computation again. Here are the decoded versions:</p><p><code>eyAg</code> == <code>{</code></p><p><code>LCB7</code> == <code>{,</code></p><p><code>InRyYWl0X3R5cGUiOiAi</code> == <code>&quot;trait_type&quot;: &quot;</code></p><p><code>IiwidmFsdWUiOiAi</code> == <code>&quot;,&quot;value&quot;: &quot;</code></p><p><code>IiB9</code> = <code>“}</code></p><p>So essentially the loop is creating the runners JSON metadata like <code>{“trait_type”: “Background”, “value”: “background 1”} , {“trait_type”: “Face”, “value”: “face 1”}, etc</code>. Pretty nifty huh?</p><p>Once we have this JSON, we call <code>tokenSVGBuffer</code> on line 219 which takes our runners layers and actually constructs the SVGs! I won’t go over the creation of SVGs since that isn’t unique to Chain Runners. It’s essentially creating SVGs using HTML SVG classes and there are a ton of resources online.</p><p>Now finally, we have our JSON metadata and SVG image constructed, so now all we have to do is format these in a proper data URI that the browser can render which is line 220-228. Of course, it’s all already base64 encoded. Won’t go over data URIs since there’s a bunch of resources online about them and they’re not Chain Runner specific</p><p>Voila! That is how your runners are created!</p><h2 id="h-final-thoughts" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Final Thoughts</h2><p>If you made it to the end, you are a trooper! I hope you can see why I am so enthusiastic about this project and hope you can see how fucking cool this all is!</p><p>If you enjoyed this, maybe drop me a follow :) I post a lot about solidity and shit post from time to time :)</p><p>Hope to see ya in the Chain Runner’s discord!</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/0x_Beans">https://twitter.com/0x_Beans</a></p>]]></content:encoded>
            <author>beans@newsletter.paragraph.com (Beans)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/638fd1a7a99c23322deda016ed984045ce7694b6ab92144362d1f988493db1de.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Wrapped Kevins]]></title>
            <link>https://paragraph.com/@beans/wrapped-kevins-2</link>
            <guid>6huXMJZ8pgllx1MJcL5S</guid>
            <pubDate>Thu, 03 Mar 2022 00:30:10 GMT</pubDate>
            <description><![CDATA[I created this wrapped collection to set Kevin free. As Kevin rose to stardom, it was a shame that the Pixelmon team (who already siphoned 70M from the market) was still reaping benefits from royalties. I created this collection so people could freely trade their Kevin with 0% royalties going to the team. When you wrap your Kevin, you are essentially staking your token into the wrapped smart contract and receiving a Wrapped Kevin in return. From there, you can freely trade your Kevin on a wra...]]></description>
            <content:encoded><![CDATA[<p>I created this wrapped collection to set Kevin <strong>free</strong>. As Kevin rose to stardom, it was a shame that the Pixelmon team (who already siphoned 70M from the market) was still reaping benefits from royalties. I created this collection so people could freely trade their Kevin with 0% royalties going to the team.</p><p>When you wrap your Kevin, you are essentially staking your token into the wrapped smart contract and receiving a Wrapped Kevin in return. From there, you can freely trade your Kevin on a wrapped collection on OS with 0% royalties to the team. At any point, if you wish to unwrap your Kevin, you will get your original Pixelmon Kevin back.</p><p>After speaking with Kevin holders, it was of utmost importance to retain the way Kevin looked (he’s beautiful ain’t he?). The Pixelmon team was considering changing his appearance which is unacceptable. Since the most important things were the image + matching token ID, we decided to host Kevin’s image on Arweave (permanent decentralized file storage) and host the metadata <strong>on chain.</strong> Kevin will live on <strong>forever</strong>, completely decoupled from Pixelmon. Long live Kevin.</p><p><em>Please note: Selling your wrapped Kevin is the same thing as selling your real Kevin. You will not be able to unwrap your Kevin to its original Pixelmon token if you sold your Wrapped Kevin. If you bought a Wrapped Kevin, you can unwrap into the original Pixelmon Kevin if you wish.</em></p><p>Shoutout: @Rhymeten and @punk_2070 for the help!</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/rhymeten">https://twitter.com/rhymeten</a></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/Punk_2070">https://twitter.com/Punk_2070</a></p><h2 id="h-how-to-wrap-your-kevin" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">How to wrap your Kevin</h2><p>There currently is no frontend for wrapping, so you must use the smart contract directly. If you’ve never done this before, it’ll be a good learning opportunity. <em>Also if anyone wants to write a frontend, please be my guest.</em></p><h3 id="h-first-you-need-to-approve-the-wrapped-kevin-contract-in-the-pixelmon-contract" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">First you need to approve the Wrapped Kevin contract in the Pixelmon contract</h3><p>This is the exact same permission you give to OS, and essentially lets the Wrapped contract to receive your Pixelmon Kevin and mint you an equivalent wrapped Kevin.</p><p><strong>Step 1:</strong> Head over to the Pixelmon contract <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/address/0x32973908faee0bf825a343000fe412ebe56f802a#code">here</a>. (contract address: 0x32973908FaeE0Bf825A343000fE412ebE56F802A).</p><p><strong>Step 2:</strong> Set approval for the wrapped kevin contract by:</p><p>Clicking the “Write contract” tab and connecting your wallet (the wallet holding your Kevin).</p><p>Once connected (you’ll see a green dot to show you’re connected), scroll down to the function <code>setApprovalForAll.</code>This is where you will approve the Wrapped Kevin contract. Open up the function tab and you’ll see 2 inputs.</p><p>In the first input (operator address), copy and paste the Wrapped Kevin contract address (which is 0xCeaCaf70a0E721C57CD3f7FD8cD55C9895713517) and in the second input, type <code>true</code>. Click <code>Write</code> and approve the transaction in metamask!</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/7e2ff11741f492ceb3212b2f2882882bdeb51bc3f8ad1604c0ef5af7a94e0941.png" alt="The red dot will turn green when you&apos;re connected. Please make sure you&apos;re on mainnet" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">The red dot will turn green when you&apos;re connected. Please make sure you&apos;re on mainnet</figcaption></figure><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/85cbd375883e4b33d1179182f566f7f3a4aaaa6c5f7639c620c190cfe6d272a8.png" alt="The operator is the address for the Wrapped Kevin contract: 0xCeaCaf70a0E721C57CD3f7FD8cD55C9895713517" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">The operator is the address for the Wrapped Kevin contract: 0xCeaCaf70a0E721C57CD3f7FD8cD55C9895713517</figcaption></figure><h3 id="h-second-head-over-to-the-wrapped-kevin-contract-and-wrap-your-kevin" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Second, head over to the Wrapped Kevin contract and wrap your Kevin.</h3><p><strong>Step 1:</strong> Head over to the wrapped Kevin contract <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/address/0xCeaCaf70a0E721C57CD3f7FD8cD55C9895713517#writeContract">here</a>. The address for the contract is 0xCeaCaf70a0E721C57CD3f7FD8cD55C9895713517.</p><p><strong>Step 2:</strong> Do the same thing as above and connect your wallet in the <code>Write contract</code>tab.</p><p><strong>Step 3:</strong> Scroll down to the <code>Wrap</code> function and input your Kevin tokenID. This contract will only let you wrap Kevin tokens, so make sure you’re inputting the correct tokenID (If your Kevin is <code>Pixelmon # 69</code> then your token ID is 69). Click <code>Write</code> and approve the transaction in Metamask! You now have your wrapped Kevin Token in your wallet (check on OS)! Your wrapped Kevin will be the exact same token ID as your original Kevin.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/73e004f3d6d705b0d665879bbf38af1a3c0304cc61e470ba3c2fca118305f427.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4702fd870788e963400b424c7a533212d616fe605af5445fd9efa11da39960c6.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Now trade freely on the Wrapped Kevins collection :)</p><h2 id="h-how-to-unwrap-your-kevin" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">How to unwrap your Kevin</h2><p>Just like wrapping your Kevin above, go to the Wrapped Kevin contract and connect your wallet. Scroll down to find the function <code>unwrap</code>. Input your Wrapped Kevin token ID and click <code>Write</code>. Approve your transaction in Metamask and your wrapped Kevin will be burned and your original Kevin will be sitting in your wallet :)</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/418cd99438bf36283f69e0afdf03bbf59772a79691576b328e4c3bef035076ac.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p><em>Please wrap at your own risk. This contract has been reviewed by I am not legally liable for any losses.</em></p>]]></content:encoded>
            <author>beans@newsletter.paragraph.com (Beans)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/999041b024bf7ecb8622c7e335eb78ee1d7ec75f7b91392766290a7471b866c3.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Wrapped Kevins]]></title>
            <link>https://paragraph.com/@beans/wrapped-kevins</link>
            <guid>iGL5lVjysyriCYRt1N2D</guid>
            <pubDate>Thu, 03 Mar 2022 00:27:29 GMT</pubDate>
            <description><![CDATA[I created this wrapped collection to set Kevin free. As Kevin rose to stardom, it was a shame that the Pixelmon team (who already siphoned 70M from the market) was still reaping benefits from royalties. I created this collection so people could freely trade their Kevin with 0% royalties going to the team. When you wrap your Kevin, you are essentially staking your token into the wrapped smart contract and receiving a Wrapped Kevin in return. From there, you can freely trade your Kevin on a wra...]]></description>
            <content:encoded><![CDATA[<p>I created this wrapped collection to set Kevin <strong>free</strong>. As Kevin rose to stardom, it was a shame that the Pixelmon team (who already siphoned 70M from the market) was still reaping benefits from royalties. I created this collection so people could freely trade their Kevin with 0% royalties going to the team.</p><p>When you wrap your Kevin, you are essentially staking your token into the wrapped smart contract and receiving a Wrapped Kevin in return. From there, you can freely trade your Kevin on a wrapped collection on OS with 0% royalties to the team. At any point, if you wish to unwrap your Kevin, you will get your original Pixelmon Kevin back.</p><p>After speaking with Kevin holders, it was of utmost importance to retain the way Kevin looked (he’s beautiful ain’t he?). The Pixelmon team was considering changing his appearance which is unacceptable. Since the most important things were the image + matching token ID, we decided to host Kevin’s image on Arweave (permanent decentralized file storage) and host the metadata <strong>on chain.</strong> Kevin will live on <strong>forever</strong>, completely decoupled from Pixelmon. Long live Kevin.</p><p><em>Please note: Selling your wrapped Kevin is the same thing as selling your real Kevin. You will not be able to unwrap your Kevin to its original Pixelmon token if you sold your Wrapped Kevin. If you bought a Wrapped Kevin, you can unwrap into the original Pixelmon Kevin if you wish.</em></p><h2 id="h-how-to-wrap-your-kevin" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">How to wrap your Kevin</h2><p>There currently is no frontend for wrapping, so you must use the smart contract directly. If you’ve never done this before, it’ll be a good learning opportunity. <em>Also if anyone wants to write a frontend, please be my guest.</em></p><h3 id="h-first-you-need-to-approve-the-wrapped-kevin-contract-in-the-pixelmon-contract" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">First you need to approve the Wrapped Kevin contract in the Pixelmon contract</h3><p>This essentially lets the Wrapped contract to receive your Pixelmon Kevin and mint you an equivalent wrapped Kevin.</p><p><strong>Step 1:</strong> Head over to the Pixelmon contract <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/address/0x32973908faee0bf825a343000fe412ebe56f802a#code">here</a>. (contract address: 0x32973908FaeE0Bf825A343000fE412ebE56F802A).</p><p><strong>Step 2:</strong> Set approval for the wrapped kevin contract by:</p><p>Clicking the “Write contract” tab and connecting your wallet (the wallet holding your Kevin).</p><p>Once connected (you’ll see a green dot to show you’re connected), scroll down to the function <code>setApprovalForAll.</code>This is where you will approve the Wrapped Kevin contract. Open up the function tab and you’ll see 2 inputs.</p><p>In the first input (operator address), copy and paste the Wrapped Kevin contract address (which is 0x5724005a129e37c35fA5277D85b8E7826CB66FD4) and in the second input, type <code>true</code>. Click <code>Write</code> and approve the transaction in metamask!</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/7e2ff11741f492ceb3212b2f2882882bdeb51bc3f8ad1604c0ef5af7a94e0941.png" alt="The red dot will turn green when you&apos;re connected. Please make sure you&apos;re on mainnet" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">The red dot will turn green when you&apos;re connected. Please make sure you&apos;re on mainnet</figcaption></figure><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/85cbd375883e4b33d1179182f566f7f3a4aaaa6c5f7639c620c190cfe6d272a8.png" alt="The operator is the address for the Wrapped Kevin contract: 0x5724005a129e37c35fA5277D85b8E7826CB66FD4" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">The operator is the address for the Wrapped Kevin contract: 0x5724005a129e37c35fA5277D85b8E7826CB66FD4</figcaption></figure><h3 id="h-second-head-over-to-the-wrapped-kevin-contract-and-wrap-your-kevin" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Second, head over to the Wrapped Kevin contract and wrap your Kevin.</h3><p><strong>Step 1:</strong> Head over to the wrapped Kevin contract <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/address/0x5724005a129e37c35fA5277D85b8E7826CB66FD4#writeContract">here</a>. The address for the contract is 0x5724005a129e37c35fA5277D85b8E7826CB66FD4.</p><p><strong>Step 2:</strong> Do the same thing as above and connect your wallet in the <code>Write contract</code>tab.</p><p><strong>Step 3:</strong> Scroll down to the <code>Wrap</code> function and input your Kevin tokenID. This contract will only let you wrap Kevin tokens, so make sure you’re inputting the correct tokenID (If your Kevin is <code>Pixelmon # 69</code> then your token ID is 69). Click <code>Write</code> and approve the transaction in Metamask! You now have your wrapped Kevin Token in your wallet (check on OS)! Your wrapped Kevin will be the exact same token ID as your original Kevin.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/73e004f3d6d705b0d665879bbf38af1a3c0304cc61e470ba3c2fca118305f427.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4702fd870788e963400b424c7a533212d616fe605af5445fd9efa11da39960c6.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Now trade freely on the Wrapped Kevins collection :)</p><h2 id="h-how-to-unwrap-your-kevin" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">How to unwrap your Kevin</h2><p>Just like wrapping your Kevin above, go to the Wrapped Kevin contract and connect your wallet. Scroll down to find the function <code>unwrap</code>. Input your Wrapped Kevin token ID and click <code>Write</code>. Approve your transaction in Metamask and your wrapped Kevin will be burned and your original Kevin will be sitting in your wallet :)</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/418cd99438bf36283f69e0afdf03bbf59772a79691576b328e4c3bef035076ac.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p><em>Please wrap at your own risk. This contract has been reviewed by I am not legally liable for any losses.</em></p>]]></content:encoded>
            <author>beans@newsletter.paragraph.com (Beans)</author>
        </item>
    </channel>
</rss>