<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Developers Forum for XinFin XDC Network: Daniel Liu</title>
    <description>The latest articles on Developers Forum for XinFin XDC Network by Daniel Liu (@gzliudan).</description>
    <link>https://www.xdc.dev/gzliudan</link>
    <image>
      <url>https://www.xdc.dev/images/FwpUevNIte5pzhOaq_-GMc42gRcCEjTCZr3D0kH6LVQ/rs:fill:90:90/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL3VzZXIvcHJv/ZmlsZV9pbWFnZS8y/MjEvMTExZWM1NWMt/MTEzNS00ODhmLTg1/MWMtMWJmOGNjMWY1/YTAyLnBuZw</url>
      <title>Developers Forum for XinFin XDC Network: Daniel Liu</title>
      <link>https://www.xdc.dev/gzliudan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://www.xdc.dev/feed/gzliudan"/>
    <language>en</language>
    <item>
      <title>EIP-7702 is available on devnet now</title>
      <dc:creator>Daniel Liu</dc:creator>
      <pubDate>Tue, 24 Feb 2026 03:36:49 +0000</pubDate>
      <link>https://www.xdc.dev/gzliudan/eip-7702-is-available-on-devnet-now-38hp</link>
      <guid>https://www.xdc.dev/gzliudan/eip-7702-is-available-on-devnet-now-38hp</guid>
      <description>&lt;p&gt;EIP-7702 is available on XDC devnet now. It was activated together with EIP-2935 and EIP-7623 at block number 3000600. We sincerely invite you to test it on devnet.&lt;/p&gt;

</description>
      <category>xdc</category>
      <category>eip7702</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Why roll back testnet</title>
      <dc:creator>Daniel Liu</dc:creator>
      <pubDate>Fri, 11 Apr 2025 04:11:48 +0000</pubDate>
      <link>https://www.xdc.dev/gzliudan/why-roll-back-testnet-2npf</link>
      <guid>https://www.xdc.dev/gzliudan/why-roll-back-testnet-2npf</guid>
      <description>&lt;h1&gt;
  
  
  Why roll back the testnet
&lt;/h1&gt;

&lt;p&gt;The function &lt;code&gt;DeriveSha&lt;/code&gt; computes the &lt;code&gt;transactionsRoot&lt;/code&gt; and &lt;code&gt;receiptsRoot&lt;/code&gt; fields in each block. And it calls the function &lt;code&gt;EncodeIndex&lt;/code&gt; for each item in the transactions list or receipts list during execution.&lt;/p&gt;

&lt;p&gt;Our current code is as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;Transactions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;EncodeIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;tx&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;LegacyTxType&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;rlp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;rlp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt; &lt;span class="n"&gt;Receipts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;EncodeIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;LegacyTxType&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;receiptRLP&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;statusEncoding&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CumulativeGasUsed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Bloom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Logs&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;rlp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;rlp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the corresponding code in geth is as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;Transactions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;EncodeIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;tx&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;LegacyTxType&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;rlp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encodeTyped&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tx&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Transaction&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;encodeTyped&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteByte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;rlp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt; &lt;span class="n"&gt;Receipts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;EncodeIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;receiptRLP&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;statusEncoding&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CumulativeGasUsed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Bloom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Logs&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;LegacyTxType&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;rlp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;AccessListTxType&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteByte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AccessListTxType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;rlp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;DynamicFeeTxType&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteByte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DynamicFeeTxType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;rlp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above different codes will result in different root hashes. To avoid future accidents, we should use geth code to produce the same value. But the EIP-1559 feature has been actived on testnet from block number 71550000. That is to say, the &lt;code&gt;transactionsRoot&lt;/code&gt; and &lt;code&gt;receiptsRoot&lt;/code&gt; are inconsistent with geth algorithm from block number 71550000. Although we can introduce a block number parameter to identify old and new blocks, such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;Transactions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;EncodeIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;big&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;tx&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;LegacyTxType&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;rlp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;common&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Eip1559TxHashBlock&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Cmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;common&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Eip1559TxHashBlock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;rlp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encodeTyped&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We need to modify &lt;a href="https://github.com/XinFinOrg/XDPoSChain/pull/933/commits/b62663eb9e72d23ccc61d11be4a46db0c4b6e89e"&gt;21 files&lt;/a&gt; to complete similar modifications. The complex code can increase the risk of bugs. Additionally, since EIP-1559 has not been activated on the mainnet, these code changes are not actually required on the mainnet. So we suggest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;release a new version:

&lt;ul&gt;
&lt;li&gt;change cancunBlock from 73425600 to 71550000 for testnet&lt;/li&gt;
&lt;li&gt;pick some commits about hash from &lt;a href="https://github.com/XinFinOrg/XDPoSChain/pull/933"&gt;PR #933&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;test new version on devnet&lt;/li&gt;
&lt;li&gt;roll back the testnet to 71550000 or less&lt;/li&gt;
&lt;li&gt;recreate snapshot for testnet after roll back&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Test solidity v0.8.28 on testnet and devnet</title>
      <dc:creator>Daniel Liu</dc:creator>
      <pubDate>Thu, 03 Apr 2025 06:00:55 +0000</pubDate>
      <link>https://www.xdc.dev/gzliudan/test-solidity-v0828-on-testnet-and-devnet-21a6</link>
      <guid>https://www.xdc.dev/gzliudan/test-solidity-v0828-on-testnet-and-devnet-21a6</guid>
      <description>&lt;p&gt;We have already enabled solidity v0.8.28 on testnet and devnet now. Here is a test project example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# install node and yarn first&lt;/span&gt;

git clone https://github.com/gzliudan/hardhat-project
&lt;span class="nb"&gt;cd &lt;/span&gt;hardhat-project
yarn

&lt;span class="nb"&gt;cp &lt;/span&gt;sample.env .env
&lt;span class="c"&gt;# set DEPLOYER_PRIVATE_KEY in .env&lt;/span&gt;
&lt;span class="c"&gt;# ensure your test account has some XDC token on devnet and testnet&lt;/span&gt;
vi .env

&lt;span class="c"&gt;# test on XDC devnet&lt;/span&gt;
yarn &lt;span class="nb"&gt;test&lt;/span&gt;:xdcdev

&lt;span class="c"&gt;# test on XDC testnet&lt;/span&gt;
yarn &lt;span class="nb"&gt;test&lt;/span&gt;:apothem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is my test result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn run v1.22.22
$ hardhat test --network apothem test/v0.8.23/*.js test/v0.8.28/*.js


  BaseFee contract
Deploy contract BaseFee ...
Deploy contract BaseFee OK, times=1, address: 0xc7758e0E48873cBCC3254924c539750E046013e0
Running on XDC network, chainId=51
    All networks
      Test getChainId
        ✔ should return correct chain ID (299ms)
      Test getBaseFee
        ✔ should return current block number and base fee (652ms)
    XDC network
      ✔ should return expected base fee for XDC networks (754ms)

  Prevrandao contract
Deploy contract Prevrandao ...
Deploy contract Prevrandao OK, times=1, address: 0x66Bbb3fc27Bd8A20247D984a575f069B6A711BfA
    Test getPrevrandao
      ✔ should return current block number and contract value (695ms)

  Push0 contract
Deploy contract Push0 ...
Deploy contract Push0 OK, times=1, address: 0x4F700AD73a59F4Fa02B212Dbf77bB3780C4fA56D
    Test setNum
      ✔ should initialize to 0 (349ms)
      ✔ should set the number correctly (5127ms)
      ✔ should update the number multiple times (18103ms)
      ✔ should handle large numbers (5727ms)

  TestCoin contract
Deploy contract TestCoin ...
Deploy contract TestCoin OK, times=1, address: 0xD5eF8F2A930De17D51a84520808DDd73D4A3E5a8
    Test name
      ✔ should return correct name (257ms)
    Test symbol
      ✔ should return correct symbol (352ms)
    Test total supply
      ✔ should return correct total supply (349ms)
    Test transfer
      ✔ should transfer tokens between accounts (7307ms)
    Test mint
      ✔ should mint new tokens (7359ms)
    Test burn
      ✔ should mint and burn tokens (13139ms)
    Test permit
      ✔ should permit token transfer (7267ms)

  BlobBaseFee contract
Deploy contract BlobBaseFee ...
Deploy contract BlobBaseFee OK, times=1, address: 0x421e05263ac014bE686cAc8C0b7bB860d0e40D49
Running on XDC network, chainId=51
    All Networks
      Test getChainId
        ✔ should return correct chain ID (253ms)
      Test getBlobBaseFee
        ✔ Should return valid blob base fee (345ms)
      Test getBlobHashByIndex
        ✔ Should return valid blob hash for index 0 (365ms)
        ✔ Should return valid blob hash for random index (260ms)
        ✔ Should return valid blob hash for max index (462ms)
      Test getMultipleBlobHashes
        ✔ Should return valid multiple blob hashes starting from index 0 (363ms)
        ✔ Should return valid multiple blob hashes starting from non-zero index (357ms)
        ✔ Should handle zero count in getMultipleBlobHashes (358ms)
    XDC Network
      Test getBlobBaseFee
        ✔ Should return 0 for blob base fee (371ms)
      Test getBlobHashByIndex
        ✔ Should return 0 for blob hash with index 0 (326ms)
        ✔ Should return 0 for blob hash with random index (365ms)
        ✔ Should return 0 for blob hash with max index (341ms)
      Test getMultipleBlobHashes
        ✔ Should return array of zeros starting from index 0 (359ms)
        ✔ Should return array of zeros starting from non-zero index (492ms)

  CustomError contract
Deploy contract CustomError ...
Deploy contract CustomError OK, times=1, address: 0xDa79e4a4e15fcA7BBAb527F4e9cfFE92BC6e8987
    Test withdraw
      ✔ Should pass when amount is valid (401ms)
      ✔ Should revert with InvalidAmount error when amount is 0 (363ms)
      ✔ Should revert with InsufficientBalance error when amount exceeds balance (365ms)
    Test setOwner
      ✔ Should pass when new owner is valid (465ms)
      ✔ Should revert with InvalidAddress error when new owner is zero address (482ms)
      ✔ Should revert with InvalidAddress error when new owner is current owner (482ms)
    Test updateNumbers
      ✔ Should pass when array length matches (476ms)
      ✔ Should revert with ArrayLengthMismatch error when array length does not match (352ms)
    Test complexOperation
      ✔ Should pass when all parameters are valid (463ms)
      ✔ Should revert with InvalidAmount error when amount is 0 (349ms)
      ✔ Should revert with InsufficientBalance error when amount exceeds balance (375ms)
      ✔ Should revert with InvalidAddress error when target is zero address (355ms)

  MCopy contract
Deploy contract MCopy ...
Deploy contract MCopy OK, times=1, address: 0x77Fd93A888c8aF77f0c2A3B65244ee4100d873bd
    Test copyWord
      ✔ Should copy a word correctly (292ms)
      ✔ Should copy zero word correctly (349ms)
      ✔ Should copy max word correctly (357ms)
    Test copyByteArray
      ✔ Should copy a byte array correctly (368ms)
      ✔ Should copy empty array correctly (360ms)
      ✔ Should copy long byte array correctly (364ms)
    Test copyMultipleWord
      ✔ Should copy multiple words correctly (385ms)
      ✔ Should copy zero words correctly (445ms)
      ✔ Should copy multiple zero words correctly (384ms)
    Test copyWithOffset
      ✔ Should copy with offset correctly (488ms)
      ✔ Should copy from start correctly (360ms)
      ✔ Should copy to end correctly (486ms)
      ✔ Should revert when offset + length exceeds source length (387ms)

  TransientStorage contract
Deploy contract TransientStorage ...
Deploy contract TransientStorage OK, times=1, address: 0x8D3eA52bB46921Caee7B003ec548dD95Bcbd90ff
    Test readAndWrite
      ✔ should write and read value from transient storage (418ms)
    Test swapSlots
      ✔ should swap values between slots (363ms)
    Test addSlots
      ✔ should add values and store the result (357ms)


  57 passing (3m)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Test EIP-1559</title>
      <dc:creator>Daniel Liu</dc:creator>
      <pubDate>Thu, 06 Feb 2025 07:30:35 +0000</pubDate>
      <link>https://www.xdc.dev/gzliudan/test-eip-1559-477d</link>
      <guid>https://www.xdc.dev/gzliudan/test-eip-1559-477d</guid>
      <description>&lt;h1&gt;
  
  
  Test EIP-1559 on testnet and devnet
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. RPC
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.1 Devnet
&lt;/h3&gt;

&lt;p&gt;RPC="&lt;a href="https://devnetstats.hashlabs.apothem.network/devnet"&gt;https://devnetstats.hashlabs.apothem.network/devnet&lt;/a&gt;"&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2 Testnet(Apothem network)
&lt;/h3&gt;

&lt;p&gt;RPC="&lt;a href="https://erpc.apothem.network/"&gt;https://erpc.apothem.network/&lt;/a&gt;"&lt;br&gt;
RPC="&lt;a href="https://earpc.apothem.network/"&gt;https://earpc.apothem.network/&lt;/a&gt;"&lt;/p&gt;
&lt;h3&gt;
  
  
  1.3 Mainnet(Xinfin network)
&lt;/h3&gt;

&lt;p&gt;The EIP-1559 feature is not available on the mainnet now. Please wait for 1-2 months.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Install foundry
&lt;/h2&gt;

&lt;p&gt;We will use foundry to do some tests. Please install it according to &lt;a href="https://book.getfoundry.sh/getting-started/installation"&gt;the document&lt;/a&gt;, such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; https://foundry.paradigm.xyz | bash
&lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/.bashrc
foundryup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then create a sample project for test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/counter/
forge init counter
&lt;span class="nb"&gt;cd &lt;/span&gt;counter
&lt;span class="c"&gt;# our testnet and devnet support solidity v0.8.28 now&lt;/span&gt;
forge build &lt;span class="nt"&gt;--use&lt;/span&gt; solc:0.8.28
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. EIP-1559 block
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;devnet: 0&lt;/li&gt;
&lt;li&gt;testnet(Apothem): 71550000 (14th Feb 2025)&lt;/li&gt;
&lt;li&gt;mainet(Xinfin): TBD&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Test cases
&lt;/h2&gt;

&lt;p&gt;The following cases should be tested before and after EIP-1559 block.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1 api eth_getBlockByNumber
&lt;/h3&gt;

&lt;p&gt;Request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RPC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "jsonrpc": "2.0",
  "id": 1001,
  "method": "eth_getBlockByNumber",
  "params": [
    "latest",
    false
  ]
}'&lt;/span&gt; | jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify &lt;code&gt;baseFeePerGas&lt;/code&gt; field in response:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;before EIP-1559 block: this field should not exist&lt;/li&gt;
&lt;li&gt;after EIP-1559 block: the value should be &lt;code&gt;0x2e90edd00&lt;/code&gt; (12500000000)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.2 api eth_maxPriorityFeePerGas
&lt;/h3&gt;

&lt;p&gt;Request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RPC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "jsonrpc": "2.0",
  "id": 1002,
  "method": "eth_maxPriorityFeePerGas",
  "params": []
}'&lt;/span&gt; | jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the value of &lt;code&gt;result&lt;/code&gt; field in response is reasonable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;before EIP-1559 block: should be the current gas price&lt;/li&gt;
&lt;li&gt;after EIP-1559 block: should be non negative, such as &lt;code&gt;0x0&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.3 api eth_gasPrice
&lt;/h3&gt;

&lt;p&gt;Request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RPC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "jsonrpc": "2.0",
  "id": 1003,
  "method": "eth_gasPrice",
  "params": []
}'&lt;/span&gt; | jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the value of &lt;code&gt;result&lt;/code&gt; field in response is right:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;before EIP-1559 block: should equal to &lt;code&gt;eth_maxPriorityFeePerGas&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;after EIP-1559 block: should equal to &lt;code&gt;baseFeePerGas&lt;/code&gt; + &lt;code&gt;eth_maxPriorityFeePerGas&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.4 api eth_feeHistory
&lt;/h3&gt;

&lt;p&gt;Usage: &lt;a href="https://docs.infura.io/api/networks/ethereum/json-rpc-methods/eth_feehistory#parameters"&gt;https://docs.infura.io/api/networks/ethereum/json-rpc-methods/eth_feehistory#parameters&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RPC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "jsonrpc": "2.0",
  "id": 1004,
  "method": "eth_feeHistory",
  "params": [
    "0x3",
    "latest",
    [20,50]
  ]
}'&lt;/span&gt; | jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the value of &lt;code&gt;baseFeePerGas&lt;/code&gt; field in response:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;before EIP-1559 block: the value should equal to 0&lt;/li&gt;
&lt;li&gt;after EIP-1559 block: the value should be &lt;code&gt;0x2e90edd00&lt;/code&gt; (12500000000)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.5 eth_getTransactionByHash
&lt;/h3&gt;

&lt;p&gt;Submit 3 transactions to network and record their transaction id:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PRIVATE_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;YOUR_PRIVATE_KEY&amp;gt;

&lt;span class="c"&gt;# tx1: legacy tx, should fail&lt;/span&gt;
forge create &lt;span class="nt"&gt;--broadcast&lt;/span&gt; &lt;span class="nt"&gt;--use&lt;/span&gt; solc:0.8.28 &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RPC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;--private-key&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PRIVATE_KEY&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;--gas-price&lt;/span&gt; 12499999999 &lt;span class="nt"&gt;--legacy&lt;/span&gt; src/Counter.sol:Counter

&lt;span class="c"&gt;# tx2: legacy tx, should success&lt;/span&gt;
forge create &lt;span class="nt"&gt;--broadcast&lt;/span&gt; &lt;span class="nt"&gt;--use&lt;/span&gt; solc:0.8.28 &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RPC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;--private-key&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PRIVATE_KEY&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;--gas-price&lt;/span&gt; 12500000000 &lt;span class="nt"&gt;--legacy&lt;/span&gt; src/Counter.sol:Counter

&lt;span class="c"&gt;# tx3: EIP-1559 tx with parameter maxFeePerGas, should fail&lt;/span&gt;
forge create &lt;span class="nt"&gt;--broadcast&lt;/span&gt; &lt;span class="nt"&gt;--use&lt;/span&gt; solc:0.8.28 &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RPC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;--private-key&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PRIVATE_KEY&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;--gas-price&lt;/span&gt; 12499999999 src/Counter.sol:Counter

&lt;span class="c"&gt;# tx3: EIP-1559 tx with parameter maxFeePerGas, should success&lt;/span&gt;
forge create &lt;span class="nt"&gt;--broadcast&lt;/span&gt; &lt;span class="nt"&gt;--use&lt;/span&gt; solc:0.8.28 &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RPC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;--private-key&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PRIVATE_KEY&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;--gas-price&lt;/span&gt; 12500000000 src/Counter.sol:Counter

&lt;span class="c"&gt;# tx3: EIP-1559 tx with maxPriorityFeePerGas, should success&lt;/span&gt;
forge create &lt;span class="nt"&gt;--broadcast&lt;/span&gt; &lt;span class="nt"&gt;--use&lt;/span&gt; solc:0.8.28 &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RPC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;--private-key&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PRIVATE_KEY&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;--priority-gas-price&lt;/span&gt; 0 src/Counter.sol:Counter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;tx1: should be successful before and after EIP-1559 block&lt;/li&gt;
&lt;li&gt;tx2: should be successful only after EIP-1559 block&lt;/li&gt;
&lt;li&gt;tx3: should be successful only after EIP-1559 block
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# eg: hash="0xc64985e6faccc11c96a8baef1d989888022b75c958095e69d5e30938142a0375"&lt;/span&gt;
&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;TX_HASH_ID&amp;gt;

curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RPC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "jsonrpc": "2.0",
  "id": 1005,
  "method": "eth_getTransactionByHash",
  "params": [
    "'&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;hash&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s1"&gt;'"
    ]
}'&lt;/span&gt; | jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the following fields in the response:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;type: should be 0 in tx1, be 2 in tx2 and tx3&lt;/li&gt;
&lt;li&gt;gasPrice: exist in all transactions&lt;/li&gt;
&lt;li&gt;maxFeePerGas: only exist in tx2 and tx3, the value in tx2 should be 12501000000&lt;/li&gt;
&lt;li&gt;maxPriorityFeePerGas: only exist in tx2 and tx3, the value in tx3 should be 1000&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.6 eth_getTransactionReceipt
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RPC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "jsonrpc": "2.0",
  "id": 1006,
  "method": "eth_getTransactionReceipt",
  "params": [
    "'&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;hash&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s1"&gt;'"
  ]
}'&lt;/span&gt; | jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify tx's type and effectiveGasPrice in the response.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.7 eth_getBlockReceipts
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# eg: NUMBER="0x8"&lt;/span&gt;
&lt;span class="nv"&gt;NUMBER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;NUMBER&amp;gt;

curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RPC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "jsonrpc": "2.0",
  "id": 1007,
  "method": "eth_getBlockReceipts",
  "params": [
    "'&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NUMBER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s1"&gt;'"
    ]
}'&lt;/span&gt; | jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify tx's type and effectiveGasPrice in the response.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.8 eth_getLogs
&lt;/h3&gt;

&lt;p&gt;Request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;FROM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;FROM_BLOCK_NUMBER&amp;gt;
&lt;span class="nv"&gt;TO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;TO_BLOCK_NUMBER&amp;gt;

curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RPC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "jsonrpc":"2.0",
  "id": 1008,
  "method":"eth_getLogs",
  "params":[
    {
      "fromBlock":  "'&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FROM&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s1"&gt;'",
      "toBlock":  "'&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TO&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s1"&gt;'"
    }
  ]
}'&lt;/span&gt; | jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the result is right.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.9 Test synchronization
&lt;/h3&gt;

&lt;p&gt;Setup a node and sync with network.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.10
&lt;/h3&gt;

&lt;p&gt;Test with other tools, such as: MetaMask, Remix.&lt;/p&gt;

</description>
      <category>xdc</category>
      <category>test</category>
      <category>eip1559</category>
    </item>
    <item>
      <title>Deploy StableCoin on XDC by EIP-1559</title>
      <dc:creator>Daniel Liu</dc:creator>
      <pubDate>Mon, 16 Dec 2024 03:21:26 +0000</pubDate>
      <link>https://www.xdc.dev/gzliudan/deploy-stablecoin-on-xdc-by-eip-1559-50pa</link>
      <guid>https://www.xdc.dev/gzliudan/deploy-stablecoin-on-xdc-by-eip-1559-50pa</guid>
      <description>&lt;p&gt;The devnet of XDC supports EIP-1559 now. This article demonstrates how to setup stablecoin on devnet by EIP-1559.&lt;/p&gt;

&lt;h2&gt;
  
  
  install nvm
&lt;/h2&gt;

&lt;p&gt;Please install &lt;a href="https://github.com/nvm-sh/nvm"&gt;nvm&lt;/a&gt; first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-o-&lt;/span&gt; https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then close your current terminal simply, open a new terminal to make nvm take effect.&lt;/p&gt;

&lt;h2&gt;
  
  
  install node and yarn
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/circlefin/stablecoin-evm"&gt;The stablecoin-evm project&lt;/a&gt; requires node v20.9.0 and yarn v1.22.19:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/circlefin/stablecoin-evm/blob/master/package.json#L100-L101:"&gt;https://github.com/circlefin/stablecoin-evm/blob/master/package.json#L100-L101:&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"engines"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"20.9.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"yarn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.22.19"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So we install node and yarn with the following commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm &lt;span class="nb"&gt;install &lt;/span&gt;v20.9.0
nvm use v20.9.0
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; yarn@1.22.19
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  install stablecoin-evm
&lt;/h2&gt;

&lt;p&gt;Install stablecoin-evm step by step according to &lt;a href="https://github.com/circlefin/stablecoin-evm/blob/master/README.md"&gt;the README&lt;/a&gt;. But we have to update the Foundry's version in &lt;a href="https://github.com/circlefin/stablecoin-evm/blob/master/setup.sh"&gt;the file setup.sh&lt;/a&gt; since &lt;code&gt;nightly-f625d0fa7c51e65b4bf1e8f7931cd1c6e2e285e9&lt;/code&gt; has problem to support EIP-1559.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/circlefin/stablecoin-evm
&lt;span class="nb"&gt;cd &lt;/span&gt;stablecoin-evm

&lt;span class="c"&gt;# Use nightly-206dab285437bd6889463ab006b6a5fb984079d8 which is latest at 2024-12-16&lt;/span&gt;
&lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"nightly-206dab285437bd6889463ab006b6a5fb984079d8"&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"s/^FOUNDRY_VERSION=nightly.*/FOUNDRY_VERSION=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/"&lt;/span&gt; setup.sh

yarn
yarn compile
yarn hardhat typechain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  configure stablecoin-evm
&lt;/h2&gt;

&lt;p&gt;Prepare 1 private key for deploy and 2 addresses for administration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[]"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; blacklist.remote.json
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
vi .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is my .env file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DEPLOYER_PRIVATE_KEY="0x1234......"
TOKEN_NAME=USDC
TOKEN_SYMBOL=USDC
TOKEN_CURRENCY=USD
TOKEN_DECIMALS=6
PROXY_ADMIN_ADDRESS="0x85f33E1242d87a875301312BD4EbaEe8876517BA"
OWNER_ADDRESS="0xD4CE02705041F04135f1949Bc835c1Fe0885513c"
MASTER_MINTER_OWNER_ADDRESS="0xD4CE02705041F04135f1949Bc835c1Fe0885513c"
GAS_MULTIPLIER=110
BLACKLIST_FILE_NAME=blacklist.remote.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Notice:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PROXY_ADMIN_ADDRESS must be different with OWNER_ADDRESS&lt;/li&gt;
&lt;li&gt;PAUSER_ADDRESS is optional, will be OWNER_ADDRESS if not set&lt;/li&gt;
&lt;li&gt;BLACKLISTER_ADDRESS is optional, will be OWNER_ADDRESS if not set&lt;/li&gt;
&lt;li&gt;LOST_AND_FOUND_ADDRESS is optional, will be OWNER_ADDRESS if not set&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  deploy on devnet
&lt;/h2&gt;

&lt;p&gt;We can remove the &lt;code&gt;--legacy&lt;/code&gt; flag in command line since the devnet supports EIP-1559 now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;forge script &lt;span class="nt"&gt;-vv&lt;/span&gt; &lt;span class="nt"&gt;--broadcast&lt;/span&gt; scripts/deploy/deploy-fiat-token.s.sol &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; https://devnetstats.hashlabs.apothem.network/devnet/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[⠢] Compiling...
No files changed, compilation skipped
Script ran successfully.

== Return ==
0: contract FiatTokenV2_2 0xcFBFDe74F1C71a49EEC3050ca3a0CB0A5de92F8E
1: contract MasterMinter 0x7bdb6EaB59864eE77C256cA3ca76533d28e8D143
2: contract FiatTokenProxy 0x1e1fEAa7c2C1Be60f3F4b864A4389Cd99f00a9dd

== Logs ==
  TOKEN_NAME: 'USDC'
  TOKEN_SYMBOL: 'USDC'
  TOKEN_CURRENCY: 'USD'
  TOKEN_DECIMALS: '6'
  FIAT_TOKEN_IMPLEMENTATION_ADDRESS: '0x0000000000000000000000000000000000000000'
  PROXY_ADMIN_ADDRESS: '0x85f33E1242d87a875301312BD4EbaEe8876517BA'
  MASTER_MINTER_OWNER_ADDRESS: '0xD4CE02705041F04135f1949Bc835c1Fe0885513c'
  OWNER_ADDRESS: '0xD4CE02705041F04135f1949Bc835c1Fe0885513c'
  PAUSER_ADDRESS: '0xD4CE02705041F04135f1949Bc835c1Fe0885513c'
  BLACKLISTER_ADDRESS: '0xD4CE02705041F04135f1949Bc835c1Fe0885513c'

## Setting up 1 EVM.

==========================

Chain 551

Estimated gas price: 25.000000001 gwei

Estimated total gas used for script: 10475541

Estimated amount required: 0.261888525010475541 ETH

==========================

##### 551
✅  [Success] Hash: 0x4c455802ca637ef7df21f6d3de372c1c07f5f2d88c52a1857db1657570000034
Contract Address: 0x1e1fEAa7c2C1Be60f3F4b864A4389Cd99f00a9dd
Block: 24076108
Paid: 0.007444637500595571 ETH (595571 gas * 12.500000001 gwei)


##### 551
✅  [Success] Hash: 0x5b82f47197bf00198e2fc9d7f7f7ce916d57bbffc152199d334719e26d09c059
Block: 24076108
Paid: 0.000439737500035179 ETH (35179 gas * 12.500000001 gwei)


##### 551
✅  [Success] Hash: 0xd47ba4c5addee62973ec8a28e481acfeefc559418aac3569db585ced683d5b34
Contract Address: 0xf44117366AE0D8F43260E0262527FB9EB2003cad
Block: 24076108
Paid: 0.006345687500507655 ETH (507655 gas * 12.500000001 gwei)


##### 551
✅  [Success] Hash: 0x6b1999f459fc08fa33a41a2f28d8b9203010cd1b9e963b6212ee5ff4f8f31999
Contract Address: 0xcFBFDe74F1C71a49EEC3050ca3a0CB0A5de92F8E
Block: 24076108
Paid: 0.076860275006148822 ETH (6148822 gas * 12.500000001 gwei)


##### 551
✅  [Success] Hash: 0x571c359953870602fa6ca148c95f68a160bb6a98e5aaa95f0f175b8ee52356fe
Block: 24076108
Paid: 0.000618362500049469 ETH (49469 gas * 12.500000001 gwei)


##### 551
✅  [Success] Hash: 0x533aa609224a486a027320e29b1c71368b048efe346ec4055718c0d8b43bb52e
Block: 24076108
Paid: 0.001147850000091828 ETH (91828 gas * 12.500000001 gwei)


##### 551
✅  [Success] Hash: 0x45adfb2fe8e3e6cf46f43127fc496a693526f4e01562bfb7582e8e14f38eee81
Block: 24076108
Paid: 0.001410037500112803 ETH (112803 gas * 12.500000001 gwei)


##### 551
✅  [Success] Hash: 0xf4f2981de76a559d7746775e9442e81fa0fba7999bb96bff83a3cb9894d20d37
Contract Address: 0x7bdb6EaB59864eE77C256cA3ca76533d28e8D143
Block: 24076108
Paid: 0.018582650001486612 ETH (1486612 gas * 12.500000001 gwei)


##### 551
✅  [Success] Hash: 0x3d060ff7dda50f202a952ed7a2dd07a31eed5addfd0a9a82229b8a9eb24dbbdd
Block: 24076108
Paid: 0.000334912500026793 ETH (26793 gas * 12.500000001 gwei)


##### 551
✅  [Success] Hash: 0x19fac97efe0f5b406735d1789a12bbc833e9455e5996c187a8ae410d7343ae66
Block: 24076108
Paid: 0.000560837500044867 ETH (44867 gas * 12.500000001 gwei)


##### 551
✅  [Success] Hash: 0x4ce999526026546ac62a60882aefda4ebbd006d405ef93585d4243f696ecffe6
Block: 24076108
Paid: 0.001019800000081584 ETH (81584 gas * 12.500000001 gwei)


##### 551
✅  [Success] Hash: 0x88741cf2dfb0da5dd5b7c6e7d5a3a2c6fea1094f253d35e647cc79bccadf0350
Block: 24076108
Paid: 0.000723087500057847 ETH (57847 gas * 12.500000001 gwei)


##### 551
✅  [Success] Hash: 0x5f7be603ffdb556bd506e14ef00c8c42c19f821c0dc8b3a59ac5b25fef99526f
Block: 24076108
Paid: 0.0003687500000295 ETH (29500 gas * 12.500000001 gwei)


##### 551
✅  [Success] Hash: 0x3c821e83e681fc67255d556c207935249377d46159a79d2c040bf44c8485d268
Block: 24076108
Paid: 0.002705475000216438 ETH (216438 gas * 12.500000001 gwei)

✅ Sequence #1 on 551 | Total Paid: 0.118562100009484968 ETH (9484968 gas * avg 12.500000001 gwei)


==========================

ONCHAIN EXECUTION COMPLETE &amp;amp; SUCCESSFUL.

Transactions saved to: /home/me/stablecoin-evm/broadcast/deploy-fiat-token.s.sol/551/run-latest.json

Sensitive values saved to: /home/me/stablecoin-evm/cache/foundry/deploy-fiat-token.s.sol/551/run-latest.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Verify
&lt;/h2&gt;

&lt;p&gt;TODO: The devnet does not support etherscan now. We will test the following command on testnet later.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn forge:verify scripts/deploy/deploy-fiat-token.s.sol &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; &amp;lt;RPC&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>xdc</category>
      <category>deploy</category>
      <category>stablecoin</category>
      <category>eip1559</category>
    </item>
    <item>
      <title>The metrics of XDC chain</title>
      <dc:creator>Daniel Liu</dc:creator>
      <pubDate>Wed, 11 Dec 2024 06:35:05 +0000</pubDate>
      <link>https://www.xdc.dev/gzliudan/the-metrics-of-xdc-chain-ghd</link>
      <guid>https://www.xdc.dev/gzliudan/the-metrics-of-xdc-chain-ghd</guid>
      <description>&lt;p&gt;The metrics has been improved in &lt;a href="https://github.com/XinFinOrg/XDPoSChain/pull/758"&gt;the PR #758&lt;/a&gt; greatly.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Metrics flags
&lt;/h2&gt;

&lt;p&gt;XDC includes a variety of optional metrics that can be reported to the user. However, metrics are disabled by default to save on the computational overhead for the average user.&lt;/p&gt;

&lt;p&gt;The following flags exist in &lt;a href="https://github.com/XinFinOrg/XDPoSChain/pull/758"&gt;the PR #758&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;--metrics                       (default=false):
    Enable metrics collection and reporting
--metrics-addr                  (default="127.0.0.1"):
    Enable stand-alone metrics HTTP server listening interface
--metrics-port                  (default=6060):
    Metrics HTTP server listening port
--metrics-influxdb              (default=false):
    Enable metrics export/push to an external InfluxDB database
--metrics-influxdb.endpoint     (default="&amp;lt;http://localhost:8086&amp;gt;"):
    InfluxDB API endpoint to report metrics to
--metrics-influxdb.database     (default="xdc"):
    InfluxDB database name to push reported metrics to
--metrics-influxdb.username     (default="test"):
    Username to authorize access to the database
--metrics-influxdb.password     (default="test"):
    Password to authorize access to the database
--metrics-influxdb.tags         (default="host=localhost"):
    Comma-separated InfluxDB tags (key/values) attached to all measurements
--metrics-influxdbv2            (default=false):
    Enable metrics export/push to an external InfluxDB v2 database
--metrics-influxdb.token        (default="test"):
    Token to authorize access to the database (v2 only)
--metrics-influxdb.bucket       (default=xdc"):
    InfluxDB bucket name to push reported metrics to (v2 only)
--metrics-influxdb.organization (default="xdc"):
    InfluxDB organization name (v2 only)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Metric types
&lt;/h2&gt;

&lt;p&gt;XDC's metrics can be classified into four types: meters, timers, counters and gauges.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 Meters
&lt;/h3&gt;

&lt;p&gt;Analogous to physical meters (electricity, water, etc), XDC's meters are capable of measuring the amount of "things" that pass through and at the rate at which they do. A meter doesn't have a specific unit of measure (byte, block, malloc, etc), it just counts arbitrary events. At any point in time a meter can report:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total number of events that passed through the meter&lt;/li&gt;
&lt;li&gt;Mean throughput rate of the meter since startup (events / second)&lt;/li&gt;
&lt;li&gt;Weighted throughput rate in the last 1, 5 and 15 minutes (events / second) ("weighted" means that recent seconds count more that in older ones*)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2.2 Timers
&lt;/h3&gt;

&lt;p&gt;Timers are extensions of meters, the duration of an event is collected alongside a log of its occurrence. Similarly to meters, a timer can also measure arbitrary events but each requires a duration to be assigned individually. In addition generating all of the meter report types, a timer also reports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Percentiles (5, 20, 50, 80, 95), reporting that some percentage of the events took less than the reported time to execute (e.g. Percentile 20 = 1.5s would mean that 20% of the measured events took less time than 1.5 seconds to execute; inherently 80%(=100%-20%) took more that 1.5s)&lt;/li&gt;
&lt;li&gt;Percentile 5: minimum durations (this is as fast as it gets)&lt;/li&gt;
&lt;li&gt;Percentile 50: well behaved samples (boring, just to give an idea)&lt;/li&gt;
&lt;li&gt;Percentile 80: general performance (these should be optimised)&lt;/li&gt;
&lt;li&gt;Percentile 95: worst case outliers (rare, just handle gracefully)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2.3 Counters
&lt;/h3&gt;

&lt;p&gt;A counter is a single int64 value that can be incremented and decremented. The current value of the counter can be queried.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.4 Gauges
&lt;/h3&gt;

&lt;p&gt;A gauge is a single int64 value. Its value can increment and decrement - as with a counter - but can also be set arbitrarily.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Querying metrics
&lt;/h2&gt;

&lt;p&gt;XDC collects metrics if the &lt;code&gt;--metrics&lt;/code&gt; flag is provided at startup. Those metrics are available via an HTTP server if the &lt;code&gt;--metrics-addr&lt;/code&gt; flag is also provided. By default the metrics are served at &lt;code&gt;127.0.0.1:6060/debug/metrics&lt;/code&gt; but a custom IP address can be provided. A custom port can also be provided to the &lt;code&gt;--metrics-port&lt;/code&gt; flag. For example, to serve all metrics at the default address and port:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;XDC &amp;lt;other commands&amp;gt; &lt;span class="nt"&gt;--metrics&lt;/span&gt; &lt;span class="nt"&gt;--metrics-addr&lt;/span&gt; 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Navigating the browser to the given metrics address displays all the available metrics in the form of JSON data that looks similar to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"chain/account/commits.50-percentile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1763&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"chain/account/commits.75-percentile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1763&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"chain/account/commits.95-percentile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1763&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"chain/account/commits.99-percentile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1763&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"chain/account/commits.count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"chain/account/commits.mean"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1763&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"chain/account/hashes.50-percentile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;962&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"chain/account/hashes.75-percentile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;962&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"chain/account/hashes.95-percentile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;962&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"chain/account/hashes.99-percentile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;962&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"chain/account/hashes.count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"chain/account/hashes.mean"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;962&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;XDC also supports dumping metrics directly into an influx database. In order to activate this, the &lt;code&gt;--metrics-influxdb&lt;/code&gt; flag must be provided at startup. The API endpoint, username, password and other influxdb tags can also be provided.&lt;/p&gt;

&lt;p&gt;We also provide Prometheus-formatted metrics data, which can be obtained through the &lt;code&gt;http://127.0.0.1:6060/debug/metrics/prometheus&lt;/code&gt; URL, eg:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# TYPE chain_account_commits_count counter
chain_account_commits_count 1

# TYPE chain_account_commits summary
chain_account_commits {quantile="0.5"} 2305
chain_account_commits {quantile="0.75"} 2305
chain_account_commits {quantile="0.95"} 2305
chain_account_commits {quantile="0.99"} 2305
chain_account_commits {quantile="0.999"} 2305
chain_account_commits {quantile="0.9999"} 2305

# TYPE chain_account_hashes_count counter
chain_account_hashes_count 1

# TYPE chain_account_hashes summary
chain_account_hashes {quantile="0.5"} 1283
chain_account_hashes {quantile="0.75"} 1283
chain_account_hashes {quantile="0.95"} 1283
chain_account_hashes {quantile="0.99"} 1283
chain_account_hashes {quantile="0.999"} 1283
chain_account_hashes {quantile="0.9999"} 1283

...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Summary
&lt;/h2&gt;

&lt;p&gt;XDC can be configured to report metrics to an HTTP server or database. These functions are disabled by default but can be configured by passing the appropriate commands on startup.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>EIP1559 call for early users</title>
      <dc:creator>Daniel Liu</dc:creator>
      <pubDate>Wed, 26 Jun 2024 07:48:36 +0000</pubDate>
      <link>https://www.xdc.dev/gzliudan/eip1559-call-for-early-users-d28</link>
      <guid>https://www.xdc.dev/gzliudan/eip1559-call-for-early-users-d28</guid>
      <description>&lt;h1&gt;
  
  
  EIP1559 call for early users
&lt;/h1&gt;

&lt;p&gt;The develpment of EIP1559 is completed by &lt;a href="https://github.com/XinFinOrg/XDPoSChain/pull/527"&gt;https://github.com/XinFinOrg/XDPoSChain/pull/527&lt;/a&gt; now.&lt;/p&gt;

&lt;p&gt;Our parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;InitialBaseFee: 12.5 GWei&lt;/li&gt;
&lt;li&gt;BaseFee: fixed value 12.5 GWei&lt;/li&gt;
&lt;li&gt;GasLimit of block: not changed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Get source code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/XinFinOrg/XDPoSChain.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Test private network
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Create genesis
&lt;/h3&gt;

&lt;p&gt;If genesis file is not exist, it can be created according to the below guides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/xinfin/how-to-set-up-a-private-blockchain-network-with-xdc-network-codebase-b2ee82368e83"&gt;https://medium.com/xinfin/how-to-set-up-a-private-blockchain-network-with-xdc-network-codebase-b2ee82368e83&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gzliudan/Local_DPoS_Setup/blob/private-network/setup-guide.md"&gt;https://github.com/gzliudan/Local_DPoS_Setup/blob/private-network/setup-guide.md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then add parameter &lt;code&gt;eip1559Block&lt;/code&gt; to your genesis file, such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"config"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"eip1559Block"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here I use block number 0 as the EIP1559 block because I will start a new private network. You can use any block number you like. If an existing private network is used, then it must be greater than the current block number.&lt;/p&gt;

&lt;p&gt;Notice: we can also set the variable &lt;code&gt;Eip1559Block&lt;/code&gt; in the file &lt;code&gt;common/constants.go&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 Start private network
&lt;/h3&gt;

&lt;p&gt;Then you can build and start your private network according to guides.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. How to use
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 foundry
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;legacy transaction: &lt;code&gt;--legacy&lt;/code&gt; or &lt;code&gt;--legacy --gas-price &amp;lt;price&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;EIP1559 transaction with max fee per gas : &lt;code&gt;--with-gas-price &amp;lt;price&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;EIP1559 transaction with priority fee per gas: &lt;code&gt;--priority-gas-price &amp;lt;PriorityFee&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.2 MetaMask
&lt;/h3&gt;

&lt;p&gt;You can edit &lt;code&gt;Max base fee&lt;/code&gt; and &lt;code&gt;Priority Fee&lt;/code&gt; manually before confirm transaction.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3 HardHat
&lt;/h3&gt;

&lt;p&gt;It seems that &lt;code&gt;hardhat.config.js&lt;/code&gt; has no parameters for EIP1559. But we can define parameters in the individual transaction code. Please refer to &lt;a href="https://medium.com/klaytn/using-ethereum-tools-in-klaytn-dc068d48de04"&gt;https://medium.com/klaytn/using-ethereum-tools-in-klaytn-dc068d48de04&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.4 Truffle
&lt;/h3&gt;

&lt;h3&gt;
  
  
  3.5 viem
&lt;/h3&gt;

&lt;h2&gt;
  
  
  4. Releated API
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;RPC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8545/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.1 eth_getBlockByNumber
&lt;/h3&gt;

&lt;p&gt;Request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RPC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "jsonrpc": "2.0",
  "id": 1001,
  "method": "eth_getBlockByNumber",
  "params": [
    "latest",
    false
  ]
}'&lt;/span&gt; | jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"baseFeePerGas"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x2e90edd00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify: baseFeePerGas = 12500000000.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2 eth_maxPriorityFeePerGas
&lt;/h3&gt;

&lt;p&gt;Request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RPC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "jsonrpc": "2.0",
  "id": 1002,
  "method": "eth_maxPriorityFeePerGas",
  "params": []
}'&lt;/span&gt; | jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x1"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify: result is reasonable.&lt;/p&gt;

&lt;h4&gt;
  
  
  4.3 eth_gasPrice
&lt;/h4&gt;

&lt;p&gt;Request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RPC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "jsonrpc": "2.0",
  "id": 1003,
  "method": "eth_gasPrice",
  "params": []
}'&lt;/span&gt; | jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x2e90edd01"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify: result = baseFeePerGas + eth_maxPriorityFeePerGas.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.4 eth_feeHistory
&lt;/h3&gt;

&lt;p&gt;Usage: &lt;a href="https://docs.infura.io/api/networks/ethereum/json-rpc-methods/eth_feehistory#parameters"&gt;https://docs.infura.io/api/networks/ethereum/json-rpc-methods/eth_feehistory#parameters&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RPC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "jsonrpc": "2.0",
  "id": 1004,
  "method": "eth_feeHistory",
  "params": [
    "0x3",
    "latest",
    [20,50]
  ]
}'&lt;/span&gt; | jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.5 eth_getTransactionByHash
&lt;/h3&gt;

&lt;p&gt;Send 3 transactions to the private network, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;legacy tx: &lt;code&gt;forge script -vv --broadcast --legacy scripts/deploy/deploy-fiat-token.s.sol --rpc-url ${RPC}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;EIP1559 tx with parameter maxFeePerGas: &lt;code&gt;forge script -vv --broadcast scripts/deploy/deploy-fiat-token.s.sol --rpc-url ${RPC} --with-gas-price 12501000000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;EIP1559 tx with maxPriorityFeePerGas: &lt;code&gt;forge script -vv --broadcast scripts/deploy/deploy-fiat-token.s.sol --rpc-url ${RPC} --priority-gas-price 1000&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and record their transaction id.&lt;/p&gt;

&lt;p&gt;Request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# eg: HASH="0xc64985e6faccc11c96a8baef1d989888022b75c958095e69d5e30938142a0375"&lt;/span&gt;
&lt;span class="nv"&gt;HASH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;HASH&amp;gt;

curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RPC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "jsonrpc": "2.0",
  "id": 1005,
  "method": "eth_getTransactionByHash",
  "params": [
    "'&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HASH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s1"&gt;'"
    ]
}'&lt;/span&gt; | jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then verify tx's type, gasPrice, maxFeePerGas, maxPriorityFeePerGas in the response.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.6 eth_getBlockReceipts
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# eg: NUMBER="0x8"&lt;/span&gt;
&lt;span class="nv"&gt;NUMBER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;NUMBER&amp;gt;

curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RPC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "jsonrpc": "2.0",
  "id": 1006,
  "method": "eth_getBlockReceipts",
  "params": [
    "'&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NUMBER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s1"&gt;'"
    ]
}'&lt;/span&gt; | jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify tx's type and effectiveGasPrice in the response.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.7 eth_getTransactionReceipt
&lt;/h3&gt;

&lt;p&gt;Request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RPC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "jsonrpc": "2.0",
  "id": 5002,
  "method": "eth_getTransactionReceipt",
  "params": [
    "'&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HASH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s1"&gt;'"
  ]
}'&lt;/span&gt; | jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify tx's type and effectiveGasPrice in the response.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Test synchronization
&lt;/h2&gt;

&lt;p&gt;Although out network does not support EIP1559 now, the new codes can synchronize with any network normally and act as RPC without EIP1559 functions. You can use below scripts to sync:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;devnet: &lt;a href="https://github.com/gzliudan/Local_DPoS_Setup/blob/sync/sync_devnet.sh"&gt;sync_devnet.sh&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;testnet: &lt;a href="https://github.com/gzliudan/Local_DPoS_Setup/blob/sync/sync-apothem.sh"&gt;sync-apothem.sh&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;mainnet: &lt;a href="https://github.com/gzliudan/Local_DPoS_Setup/blob/sync/sync-xinfin.sh"&gt;sync-xinfin.sh&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>eip1559</category>
      <category>test</category>
      <category>early</category>
      <category>user</category>
    </item>
    <item>
      <title>[Informative]Release graph node v0.32.0 for xdc chain</title>
      <dc:creator>Daniel Liu</dc:creator>
      <pubDate>Tue, 29 Aug 2023 04:04:22 +0000</pubDate>
      <link>https://www.xdc.dev/gzliudan/release-graph-node-v0320-for-xdc-chain-g0i</link>
      <guid>https://www.xdc.dev/gzliudan/release-graph-node-v0320-for-xdc-chain-g0i</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/XinFinOrg/XDC-Graph-Node"&gt;https://github.com/XinFinOrg/XDC-Graph-Node&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support xdc prefix&lt;/li&gt;
&lt;li&gt;Bypass the &lt;code&gt;eth_getLogs&lt;/code&gt; bug of xdc chain&lt;/li&gt;
&lt;li&gt;Add flag &lt;code&gt;no_eip1898&lt;/code&gt; for xdc chain&lt;/li&gt;
&lt;li&gt;Provide new docker image&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>xdc</category>
      <category>graph</category>
      <category>graphnode</category>
    </item>
    <item>
      <title>[Infomative]graph-node v0.31.0 for xdc</title>
      <dc:creator>Daniel Liu</dc:creator>
      <pubDate>Thu, 03 Aug 2023 07:39:48 +0000</pubDate>
      <link>https://www.xdc.dev/gzliudan/graph-node-v0310-for-xdc-285e</link>
      <guid>https://www.xdc.dev/gzliudan/graph-node-v0310-for-xdc-285e</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/Carry-So/graph-node/blob/xdc-release-0.31.0/README.md"&gt;https://github.com/Carry-So/graph-node/blob/xdc-release-0.31.0/README.md&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Sign in with XDCPay 2.0</title>
      <dc:creator>Daniel Liu</dc:creator>
      <pubDate>Mon, 17 Apr 2023 09:18:27 +0000</pubDate>
      <link>https://www.xdc.dev/gzliudan/sign-in-with-xdcpay-20-5038</link>
      <guid>https://www.xdc.dev/gzliudan/sign-in-with-xdcpay-20-5038</guid>
      <description>&lt;p&gt;This article introduces how to authenticate user by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/spruceid/siwe"&gt;siwe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/xdcpay-20/iidmfamdbddcbjmemafekkohbnfiblhp"&gt;XDCPay 2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.xinfin.org/"&gt;XinFin blockchain&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Introduction
&lt;/h2&gt;

&lt;h2&gt;
  
  
  1.1 About ERC-4361
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://eips.ethereum.org/EIPS/eip-4361"&gt;Sign in with Ethereum&lt;/a&gt; is a new form of authentication that enables users to control their digital identity with their Ethereum account and ENS profile instead of relying on a traditional intermediary.&lt;/p&gt;

&lt;p&gt;Today’s login experiences rely on accounts controlled by centralized identity providers, for-profit behemoths like Google, Facebook, and Apple. Identity providers often have sole discretion over the existence and use of users’ digital identities across the web, fundamentally at odds with the best interest of users.&lt;/p&gt;

&lt;p&gt;The Ethereum Foundation and Ethereum Name Service (ENS) put forward a Request for Proposal for Sign-in with Ethereum in 2021, which would enable users to use their Ethereum accounts to access web services instead of accounts owned by large corporations.&lt;/p&gt;

&lt;p&gt;Sign-In with Ethereum describes how Ethereum accounts authenticate with off-chain services by signing a standard message format parameterized by scope, session details, and security mechanisms (e.g., a nonce).&lt;/p&gt;

&lt;p&gt;Already, many services support workflows to authenticate Ethereum accounts using message signing, such as establishing a cookie-based web session which can manage privileged metadata about the authenticating address.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;Web2&lt;/strong&gt;, this is an opportunity to give users control over their identifiers and slowly introduce their dedicated user bases to Web3. By providing a strict specification that can be followed along with any necessary tooling to ease any integration concerns, Sign-In with Ethereum has a chance at truly transforming the way in which individuals interact with apps and services.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;Web3&lt;/strong&gt;, this is an opportunity to standardize the sign-in workflow and improve interoperability across existing services, while also providing wallet vendors a reliable method to identify signing requests as Sign-In with Ethereum requests for improved UX.&lt;/p&gt;

&lt;h2&gt;
  
  
  1.2 About XDCPay 2.0
&lt;/h2&gt;

&lt;p&gt;The XDCPay is an extension for accessing XDC's XDPoS enabled distributed applications, or "Dapps" in your browser!&lt;br&gt;&lt;br&gt;
The extension injects the XDC's XDPoS web3 API into every website's javascript context, so that dapps can read from the blockchain.&lt;br&gt;&lt;br&gt;
The XDCPay extension also lets the user create and manage their own identities (via private keys, local client wallet), so when a Dapp wants to perform a transaction and write to the blockchain.&lt;/p&gt;
&lt;h2&gt;
  
  
  1.3 About XinFin
&lt;/h2&gt;

&lt;p&gt;XinFin is an enterprise-ready hybrid Blockchain technology company optimized for international trade and finance. The XinFin network is powered by the native coin XDC and uses XinFin Delegated Proof of Stake (XDPoS) consensus architecture to support smart contracts, 2000TPS, 2-second transaction time, near-zero GAS fees, and KYC to Masternodes (Validator Nodes). XDC also creates an opportunity to useXinFin’s real-world use-cases such as TradeFinex.org, which helps small and medium businesses or institutions originate their own financial requirements in a digital, fully structured manner so that they can distribute it to the bank or non-bank funders themselves using a common distribution standard. It also allows access to Mycontract.co, a middleware that connects any two centralized systems using decentralized APIs running on XDC blockchain Network.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Run the demo
&lt;/h2&gt;
&lt;h3&gt;
  
  
  2.1 Download source code
&lt;/h3&gt;

&lt;p&gt;Execute the following commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
git clone https://github.com/gzliudan/sign-in-with-xdcpay.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.2 Start the backend
&lt;/h3&gt;

&lt;p&gt;Execute the following commands, remember to change &lt;code&gt;&amp;lt;BACKEND_IP&amp;gt;&lt;/code&gt; to your real IP address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# set BACKEND_IP according to your environment&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;BACKEND_IP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;BACKEND_IP&amp;gt;

&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/sign-in-with-xdcpay/backend
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;eg:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/WcKO8CuLENgyFkRyZh7vCDx7ezZliqYHiTwgomv8mFE/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2t0YW9qZ3FueHhq/YmVxbWpoa2lrLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/WcKO8CuLENgyFkRyZh7vCDx7ezZliqYHiTwgomv8mFE/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2t0YW9qZ3FueHhq/YmVxbWpoa2lrLnBu/Zw" alt="Image description" width="516" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 Start the frontend
&lt;/h3&gt;

&lt;p&gt;Open a new terminal window, execute the following commands, remember to change &lt;code&gt;&amp;lt;BACKEND_IP&amp;gt;&lt;/code&gt; to your real IP address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# set BACKEND_IP according to your environment&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;BACKEND_IP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;BACKEND_IP&amp;gt;

&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/sign-in-with-xdcpay/frontend
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;eg:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/u7VlwyRICsSC3qPbXdxYxEiG8Ub8bOWhxlPxrhnbNBM/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/LzZweDN6M20xaTJ2/OXdleHhrYW04LnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/u7VlwyRICsSC3qPbXdxYxEiG8Ub8bOWhxlPxrhnbNBM/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/LzZweDN6M20xaTJ2/OXdleHhrYW04LnBu/Zw" alt="Image description" width="880" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Test the demo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 Open web page
&lt;/h3&gt;

&lt;p&gt;Open the url which is after &lt;code&gt;On Your Network (IPv4):&lt;/code&gt; in the above screenshoot, such as &lt;code&gt;http://10.146.1.124:8080/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/MnZFInfNNWi_karJG5p__bywJ-tANbDMaF7HvAwSh40/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2N5MXg5bHhmdGJo/NXpuZWdyeHRrLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/MnZFInfNNWi_karJG5p__bywJ-tANbDMaF7HvAwSh40/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2N5MXg5bHhmdGJo/NXpuZWdyeHRrLnBu/Zw" alt="Image description" width="468" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 Connect the wallet
&lt;/h3&gt;

&lt;p&gt;Click &lt;code&gt;Connect wallet&lt;/code&gt; button:&lt;/p&gt;

&lt;h4&gt;
  
  
  3.2.1 Switch to XinFin network
&lt;/h4&gt;

&lt;p&gt;If your XDCPay's current network is not XinFin network, please swith to XinFin network in XDCPay manually:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/-Ltpx_rTWebtR3TAHhAX2nLIqS_RPICxNm4K7oE6lRw/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/LzR2czlybnEzc25r/dXJtNG1kNHBlLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/-Ltpx_rTWebtR3TAHhAX2nLIqS_RPICxNm4K7oE6lRw/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/LzR2czlybnEzc25r/dXJtNG1kNHBlLnBu/Zw" alt="Image description" width="392" height="629"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3.2.2 Connect XDCPay account
&lt;/h4&gt;

&lt;p&gt;If there is no account connected to the XDCPay, the web page will request &lt;code&gt;Connect With XDCPay&lt;/code&gt;:&lt;/p&gt;

&lt;h4&gt;
  
  
  3.2.2.1 Choose an account
&lt;/h4&gt;

&lt;p&gt;Select the account(s) if your XDCPay contains multiple accounts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/ASoLmcSN6bnvv7eGmbP-koIMA3zQ3PXaZbgRlG0O_JY/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2ZwbjVnY2IxbW04/ang1ODdqNDdmLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/ASoLmcSN6bnvv7eGmbP-koIMA3zQ3PXaZbgRlG0O_JY/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2ZwbjVnY2IxbW04/ang1ODdqNDdmLnBu/Zw" alt="Image description" width="387" height="654"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  3.2.2.2 Connect to account
&lt;/h5&gt;

&lt;p&gt;Then click &lt;code&gt;Next&lt;/code&gt; button:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/NywKRmONMx9hreLKLimyV0xWehRbcBYyTy1Yts7dRJ4/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2M1bGk1Z3IwcXR4/YjBoajA4bjI3LnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/NywKRmONMx9hreLKLimyV0xWehRbcBYyTy1Yts7dRJ4/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2M1bGk1Z3IwcXR4/YjBoajA4bjI3LnBu/Zw" alt="Image description" width="405" height="674"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At last click &lt;code&gt;Connect&lt;/code&gt; button on the XDCPay's second popup window.&lt;/p&gt;

&lt;h4&gt;
  
  
  3.2.3 Show connect status
&lt;/h4&gt;

&lt;p&gt;If it's connected, the web page will popup a window:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/iXEI0F0iCbifnBtBNd2CxBLplyjkTOxD7e8Lm8S7yu0/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2M5Ym80NmJtZTRk/bnZlcWo0cTg0LnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/iXEI0F0iCbifnBtBNd2CxBLplyjkTOxD7e8Lm8S7yu0/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2M5Ym80NmJtZTRk/bnZlcWo0cTg0LnBu/Zw" alt="Image description" width="880" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It shows &lt;code&gt;Connect XDCPay OK&lt;/code&gt;, click &lt;code&gt;OK&lt;/code&gt; button to close it.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3 Get information before sign in
&lt;/h3&gt;

&lt;p&gt;Click &lt;code&gt;Get session info&lt;/code&gt; button, the web page will popup a window:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/nATLfkK8-okYZ2WN3_UTi-WK4E7yBzNIIQNHiyyvO0k/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/LzV2cjN1djQyb28w/Z3h3eHYwb3BnLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/nATLfkK8-okYZ2WN3_UTi-WK4E7yBzNIIQNHiyyvO0k/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/LzV2cjN1djQyb28w/Z3h3eHYwb3BnLnBu/Zw" alt="Image description" width="880" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It shows &lt;code&gt;You are not sign in&lt;/code&gt;, click &lt;code&gt;OK&lt;/code&gt; button to close it.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.4 Sign in with XDCPay
&lt;/h3&gt;

&lt;p&gt;Click &lt;code&gt;Sign in with XDCPay 2.0&lt;/code&gt; button, the XDCPay will prompt you to sign the below message:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/fFjdC0IkQ6FqG3Ox8rjMP9xRPDdks7qzN2irIHpUCE8/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/LzkxeWgxYzRrdTh5/d2xqN250aW1vLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/fFjdC0IkQ6FqG3Ox8rjMP9xRPDdks7qzN2irIHpUCE8/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/LzkxeWgxYzRrdTh5/d2xqN250aW1vLnBu/Zw" alt="Image description" width="443" height="807"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then click &lt;code&gt;Sign&lt;/code&gt; button on the XDCPay's popup window. At last the web page will popup a window:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/ICmXO9ZP6eafRi8rdJVzzfP7ak-91fzX_YYuadeZfMk/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3Fha3RyN2NxMGg0/aGRpMHVic2d4LnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/ICmXO9ZP6eafRi8rdJVzzfP7ak-91fzX_YYuadeZfMk/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3Fha3RyN2NxMGg0/aGRpMHVic2d4LnBu/Zw" alt="Image description" width="880" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It shows &lt;code&gt;sign in Ok with XDCPay account: 0XD4CE02705041F04135F1949Bc835c1Fe0885513C&lt;/code&gt;, click &lt;code&gt;OK&lt;/code&gt; button to close it.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.5 Get information after sign in
&lt;/h3&gt;

&lt;p&gt;Click &lt;code&gt;Get session info&lt;/code&gt; button, the web page will popup a window:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/oC9rqgh26FL7Hz1m1GUpTkR52xusuN9zX5SgF1tS6kM/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2RnaXRxYTRsdjds/MjE0ZTdkazM2LnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/oC9rqgh26FL7Hz1m1GUpTkR52xusuN9zX5SgF1tS6kM/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2RnaXRxYTRsdjds/MjE0ZTdkazM2LnBu/Zw" alt="Image description" width="880" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It shows &lt;code&gt;You are authenticated with XDCPay account: 0xD4CE02705041F04135F1949Bc835c1Fe0885513C&lt;/code&gt;, click &lt;code&gt;OK&lt;/code&gt; button to close it.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Some source codes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 The backend
&lt;/h3&gt;

&lt;p&gt;The backend server handle the user's submission using &lt;code&gt;Express.js&lt;/code&gt;, it&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gives the frontend a nonce to include in the SIWE message&lt;/li&gt;
&lt;li&gt;verifies the submission&lt;/li&gt;
&lt;li&gt;returns the authenticating state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As such, this basic example only provides three endpoints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/nonce&lt;/code&gt;: generate the nonce for the interaction via GET request&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/verify&lt;/code&gt;: verify the submitted SIWE message and signature via POST request&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/info&lt;/code&gt;: retrieve the information from the session in place via GET request&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  4.1.1 endpoint nonce
&lt;/h4&gt;

&lt;p&gt;This endpoint returns a different nonce for each request.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/nonce&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nonce&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;generateNonce&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text/plain&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open a new terminal window, run below command to test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s1"&gt;'http://localhost:3000/nonce'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4.1.2 endpoint verify
&lt;/h4&gt;

&lt;h5&gt;
  
  
  4.1.2.1 validate SiweMessage object
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;SiweMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We validate the received SIWE message by parsing it back into a SiweMessage object (the constructor handles this), assigning the received signature to it and calling the validate method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;message.validate(req.body.signature)&lt;/code&gt; in the above snippet makes sure that the given signature is correct for the message, ensuring that the XinFin blockchain address within the message produced the matching signature. In other applications, you may wish to do further validation on other fields in the&lt;br&gt;
message, for example asserting that the authority matches the expected domain, or checking that the named address has the authority to access the named URI.&lt;/p&gt;
&lt;h5&gt;
  
  
  4.1.2.2 req.session
&lt;/h5&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;siwe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;expires&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;expirationTime&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The session (req.session) stores the nonce for the initial validation of the message, and once that's done, more can be added. For example here we store the message's fields, so we can always reference the address of the user.&lt;/p&gt;
&lt;h4&gt;
  
  
  4.1.3 endpoint info
&lt;/h4&gt;

&lt;p&gt;This endpoint is used to retrieve the information from the session in place, without having to send the message and signature every time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/info&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;siwe&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You are not sign in&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text/plain&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;`You are authenticated with XinFin blockchain account: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;siwe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.2 The frontend
&lt;/h3&gt;

&lt;h4&gt;
  
  
  4.2.1 ethers.js
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://docs.ethers.org/v5/"&gt;ethers.js&lt;/a&gt; is a library that provides functionality for interacting with the Ethereum blockchain. We use it here for connecting the webpage to extension wallets.&lt;/p&gt;

&lt;h4&gt;
  
  
  4.2.2 XDCPay
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;ethers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Web3Provider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ethereum&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;signer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getSigner&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The XDCPay extension injects the &lt;code&gt;window.ethereum&lt;/code&gt; object into every web page, and the ethers library provides a convenient provider class to wrap it. We then use this provider to connect to the wallet, and access signing capabilities.&lt;/p&gt;

&lt;h4&gt;
  
  
  4.2.3 eth_requestAccounts
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eth_requestAccounts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
  &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`Connect XinFin blockchain OK`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`Fail to request account: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;eth_requestAccounts&lt;/code&gt; function will send a request to the XDCPay extension to ask permission to view information about the XinFin accounts that it controls. XDCPay will then show a window to the user asking them to authorize our application to do so. If they authorize the request then we've connected their account.&lt;/p&gt;

&lt;h4&gt;
  
  
  4.2.4 signMessage
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;signer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sign message with the above code.&lt;/p&gt;

&lt;h4&gt;
  
  
  4.2.5 SiweMessage
&lt;/h4&gt;

&lt;p&gt;Creating SIWE messages in JavaScript is straightforward when using the siwe library:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;SiweMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;statement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;chainId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;50&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// chain id of XinFin blockchain&lt;/span&gt;
  &lt;span class="na"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The SiweMessage's fields we are most interested in are &lt;code&gt;address&lt;/code&gt; and &lt;code&gt;statement&lt;/code&gt;. The &lt;code&gt;address&lt;/code&gt; is the XinFin blockchain address which the user is signing in with, and the &lt;code&gt;statement&lt;/code&gt; as this will describe to the user what action we wish to perform on their behalf.&lt;/p&gt;

</description>
      <category>sign</category>
      <category>xdcpay</category>
      <category>erc4361</category>
      <category>siwe</category>
    </item>
    <item>
      <title>Hummingbot supports xdc blockchain and xsswap exchage now</title>
      <dc:creator>Daniel Liu</dc:creator>
      <pubDate>Tue, 11 Apr 2023 04:37:12 +0000</pubDate>
      <link>https://www.xdc.dev/gzliudan/hummingbot-supports-xdc-blockchain-and-xsswap-exchage-now-5e5b</link>
      <guid>https://www.xdc.dev/gzliudan/hummingbot-supports-xdc-blockchain-and-xsswap-exchage-now-5e5b</guid>
      <description>&lt;p&gt;&lt;a href="https://hummingbot.org/"&gt;Hummingbot&lt;/a&gt; released out &lt;a href="https://docs.hummingbot.org/release-notes/1.14.0/"&gt;v1.14.0&lt;/a&gt; on March 30, 2023. It supports &lt;a href="https://www.xinfin.org/"&gt;xdc blockchain&lt;/a&gt; and &lt;a href="https://xspswap.finance/"&gt;xsswap exchange&lt;/a&gt; from this version. &lt;/p&gt;

</description>
      <category>hummingbot</category>
      <category>xsswap</category>
      <category>exchange</category>
      <category>xdc</category>
    </item>
    <item>
      <title>Deploy and call smart contract on XinFin blockchain from thirdweb dashboard</title>
      <dc:creator>Daniel Liu</dc:creator>
      <pubDate>Thu, 06 Apr 2023 08:17:50 +0000</pubDate>
      <link>https://www.xdc.dev/gzliudan/deploy-and-call-smart-contract-on-xinfin-blockchain-with-thirdweb-dashboard-356o</link>
      <guid>https://www.xdc.dev/gzliudan/deploy-and-call-smart-contract-on-xinfin-blockchain-with-thirdweb-dashboard-356o</guid>
      <description>&lt;h2&gt;
  
  
  1. About thirdweb
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://thirdweb.com/"&gt;Thirdweb&lt;/a&gt; is a complete web3 development framework that provides everything you need to connect your apps and games to decentralized networks. It provides workflows to speed up your development, including:&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Prebuilt contracts
&lt;/h2&gt;

&lt;p&gt;Deploying smart contracts is the first step of building any web3 application. You can deploy one of &lt;a href="https://portal.thirdweb.com/pre-built-contracts"&gt;prebuilt contracts&lt;/a&gt; for more common use cases (NFTs, tokens, marketplaces), or you can build your own smart contract with &lt;a href="https://portal.thirdweb.com/solidity"&gt;Solidity SDK&lt;/a&gt; and ship it with &lt;a href="https://portal.thirdweb.com/deploy"&gt;Deploy&lt;/a&gt;. The prebuilt contracts are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fully open-source on GitHub&lt;/li&gt;
&lt;li&gt;Consistently audited by trusted firms&lt;/li&gt;
&lt;li&gt;10x cheaper to deploy than ordinary smart contracts&lt;/li&gt;
&lt;li&gt;Completely owned by you&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Deploy steps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 Connect wallet
&lt;/h3&gt;

&lt;p&gt;Open &lt;a href="https://thirdweb.com/dashboard"&gt;dashboard&lt;/a&gt; in web browser:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/DlldW54M4nVtnEGqiSy8JuhldA2eD3IuhM24fzaoHto/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2hrd2plYWc5aW54/azM4OXI3bXl1LnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/DlldW54M4nVtnEGqiSy8JuhldA2eD3IuhM24fzaoHto/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2hrd2plYWc5aW54/azM4OXI3bXl1LnBu/Zw" alt="Image description" width="880" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;code&gt;Connect Wallet&lt;/code&gt; button:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/KB1r_eP4J07pUc88C85MCYJtY18swJqH0XrnJbW-bVE/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3p3MXFieHg2cTFu/ODl4Y3lndGZnLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/KB1r_eP4J07pUc88C85MCYJtY18swJqH0XrnJbW-bVE/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3p3MXFieHg2cTFu/ODl4Y3lndGZnLnBu/Zw" alt="Image description" width="880" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose your wallet according to actual situation, here I choose MetaMask:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/-4522a_U98WkldTAHB-VyMvpjq2BNkz3rSnYeV8ZMrM/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3ZlMnZqZ2N0djRj/bzh1eXVrenhnLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/-4522a_U98WkldTAHB-VyMvpjq2BNkz3rSnYeV8ZMrM/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3ZlMnZqZ2N0djRj/bzh1eXVrenhnLnBu/Zw" alt="Image description" width="880" height="584"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 Configure networks
&lt;/h3&gt;

&lt;p&gt;If you have not configured networks, or want to modify the network configuration, then you must perform this operation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/w1bCr6vFXFo8p54_-nAZJdlOWX9wfhofROam4jF2AuM/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L21tYnZxaWozb2g0/YzQwbWsza3o0LnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/w1bCr6vFXFo8p54_-nAZJdlOWX9wfhofROam4jF2AuM/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L21tYnZxaWozb2g0/YzQwbWsza3o0LnBu/Zw" alt="Image description" width="880" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;code&gt;Configrue Networks&lt;/code&gt; icon in top navigation bar:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/-3dewr2XWpdbqboGoGOXCuObn3uWdJZes1Sgf_tUrg4/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/LzdjMm9mMmN5MHJ2/dHh0c2tydzQ4LnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/-3dewr2XWpdbqboGoGOXCuObn3uWdJZes1Sgf_tUrg4/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/LzdjMm9mMmN5MHJ2/dHh0c2tydzQ4LnBu/Zw" alt="Image description" width="880" height="631"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Type &lt;code&gt;xdc&lt;/code&gt; in &lt;code&gt;Network name&lt;/code&gt; input box to search by name:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/mRdV6ytfDlOQxLRsbvz1kcKvUFhXKRQrpuQH_Z5c_Cw/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3Vzcmc3dGJpZnVj/dHVmMzduaHAzLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/mRdV6ytfDlOQxLRsbvz1kcKvUFhXKRQrpuQH_Z5c_Cw/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3Vzcmc3dGJpZnVj/dHVmMzduaHAzLnBu/Zw" alt="Image description" width="880" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2.1 Add XinFin mainnet
&lt;/h3&gt;

&lt;p&gt;Choose &lt;code&gt;XinFin XDC Network&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/MUKMRi1bmUioL7aZn7322lsJBpW3xebDt7H8lcVezwY/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2pqanV6c29obm8w/bWhtaXM3ejluLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/MUKMRi1bmUioL7aZn7322lsJBpW3xebDt7H8lcVezwY/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2pqanV6c29obm8w/bWhtaXM3ejluLnBu/Zw" alt="Image description" width="880" height="634"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then change &lt;code&gt;RPC URL&lt;/code&gt; to &lt;code&gt;https://erpc.xinfin.network&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/uMdvgqLf4BrZqiryWOCkEDP6jybLGWI90JMYuqLMtDc/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L21pY283Y2swanow/ajlkbm53bzZpLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/uMdvgqLf4BrZqiryWOCkEDP6jybLGWI90JMYuqLMtDc/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L21pY283Y2swanow/ajlkbm53bzZpLnBu/Zw" alt="Image description" width="880" height="629"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At last click &lt;code&gt;Add Network&lt;/code&gt; button:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/RTAkpXh3ht5As0ZVNo-hpAeunEhOLAUxFKxGCh-A5pI/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3drM2R4eHRnaDdo/c2RxZDRzc3RoLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/RTAkpXh3ht5As0ZVNo-hpAeunEhOLAUxFKxGCh-A5pI/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3drM2R4eHRnaDdo/c2RxZDRzc3RoLnBu/Zw" alt="Image description" width="880" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2.2 Add Apothem testnet
&lt;/h3&gt;

&lt;p&gt;Type &lt;code&gt;xdc&lt;/code&gt; in &lt;code&gt;Network name&lt;/code&gt; input box again, and choose &lt;code&gt;XDC Apothem Network&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/pa7FPsM_grwUdG1-oIrQ_x7QPMtm372CV2j97Z3KFzM/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/LzV1djgwaGw0cGdk/bWZhdjB3dmE4LnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/pa7FPsM_grwUdG1-oIrQ_x7QPMtm372CV2j97Z3KFzM/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/LzV1djgwaGw0cGdk/bWZhdjB3dmE4LnBu/Zw" alt="Image description" width="880" height="615"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then change &lt;code&gt;Network type&lt;/code&gt; to &lt;code&gt;Testnet&lt;/code&gt;, and &lt;code&gt;RPC URL&lt;/code&gt; to &lt;code&gt;https://erpc.apothem.network/&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/qD8OFyy2KUhMyrnDO4ZM6Cs8jm88DPOm4n5czUc4_kI/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2I1ZWk0cmJ6OXhj/Y2hpYmZhc3UxLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/qD8OFyy2KUhMyrnDO4ZM6Cs8jm88DPOm4n5czUc4_kI/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2I1ZWk0cmJ6OXhj/Y2hpYmZhc3UxLnBu/Zw" alt="Image description" width="880" height="612"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At last click &lt;code&gt;Add Network&lt;/code&gt; button:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/3km-J9koE9QdjsXfzwC1yoL78KxQtkFxwIVVxvWjPrE/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3l0c2d6Y2g0eGEx/ZnIydHhrc3QzLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/3km-J9koE9QdjsXfzwC1yoL78KxQtkFxwIVVxvWjPrE/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3l0c2d6Y2g0eGEx/ZnIydHhrc3QzLnBu/Zw" alt="Image description" width="880" height="634"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3 Choose contract
&lt;/h3&gt;

&lt;p&gt;Chick &lt;code&gt;Browse contracts&lt;/code&gt; card under &lt;code&gt;Get started quickly&lt;/code&gt; subject, or click &lt;a href="https://thirdweb.com/explore"&gt;explorer&lt;/a&gt; link to visit explorer page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/IywwTu047V_ae-wVtRlskMwAEkVxqSI29IYT4le40Mo/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3BlNTA0MnBmNXU0/dm9jMDBheW1kLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/IywwTu047V_ae-wVtRlskMwAEkVxqSI29IYT4le40Mo/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3BlNTA0MnBmNXU0/dm9jMDBheW1kLnBu/Zw" alt="Image description" width="880" height="647"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here I click &lt;code&gt;Token&lt;/code&gt; card to choose &lt;a href="https://thirdweb.com/thirdweb.eth/TokenERC20"&gt;ERC20&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/Rz0V-MPkt-Ilro-dZfd6l5rScsbkxqQmiowQ6vnswtE/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/LzAwaGd4bG94eTMy/ZWVtNGtkOXBsLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/Rz0V-MPkt-Ilro-dZfd6l5rScsbkxqQmiowQ6vnswtE/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/LzAwaGd4bG94eTMy/ZWVtNGtkOXBsLnBu/Zw" alt="Image description" width="880" height="884"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.4 Deploy contract
&lt;/h3&gt;

&lt;p&gt;Click &lt;code&gt;Deploy now&lt;/code&gt; button:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/bakKNfpbegQSRygZPCxOtgx6oZaHUzhgJnB4SdlFZJc/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2ZqZnA4Z2llbXAy/czk4aGc5MHU3LnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/bakKNfpbegQSRygZPCxOtgx6oZaHUzhgJnB4SdlFZJc/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2ZqZnA4Z2llbXAy/czk4aGc5MHU3LnBu/Zw" alt="Image description" width="880" height="620"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then input:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name: &lt;code&gt;My Demo Token&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Symbol: &lt;code&gt;MDT&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Description: &lt;code&gt;A demo ERC20 token&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And choose network, here I choose &lt;code&gt;XDC Apothem Network(TXDC)&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/X6N8Z5XYcCMFiOuoCmevYrKGC4awj8IE_Wpc-v-iPy4/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2NidWQwMWI0bzFj/MnBxOHRtZjU0LnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/X6N8Z5XYcCMFiOuoCmevYrKGC4awj8IE_Wpc-v-iPy4/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2NidWQwMWI0bzFj/MnBxOHRtZjU0LnBu/Zw" alt="Image description" width="880" height="568"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next click &lt;code&gt;Deploy Now&lt;/code&gt; button:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/XvhJPDU7XexAf1GstOfSnlYKetGO4CXZtwcAro7Iakc/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/LzBoeHQ4a3RydzYz/eWFxMWRrcm03LnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/XvhJPDU7XexAf1GstOfSnlYKetGO4CXZtwcAro7Iakc/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/LzBoeHQ4a3RydzYz/eWFxMWRrcm03LnBu/Zw" alt="Image description" width="880" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Confirm transaction one or more times:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/wYhHG_JXX5knjsFDcP4pcet-dF4o1mqChi0OA9-1qAU/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3ZuNzRkcjYydjJ0/YzRucDlnZHVrLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/wYhHG_JXX5knjsFDcP4pcet-dF4o1mqChi0OA9-1qAU/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3ZuNzRkcjYydjJ0/YzRucDlnZHVrLnBu/Zw" alt="Image description" width="880" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And sign the message to add contract to dashboard:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/La1QsJHyAAoVvTHDJiqEzfeADHLJVbqiAP5sPXCkz7w/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/LzZmZjd1Z29lazA3/cGduOGt0NmtoLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/La1QsJHyAAoVvTHDJiqEzfeADHLJVbqiAP5sPXCkz7w/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/LzZmZjd1Z29lazA3/cGduOGt0NmtoLnBu/Zw" alt="Image description" width="880" height="508"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/-SYT7RjGK_CbmgDnwo3BIEKKPsNDgDgHsNL0mw3HuyQ/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2dmZm1nZGlsY3F2/NG95dnhubXFmLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/-SYT7RjGK_CbmgDnwo3BIEKKPsNDgDgHsNL0mw3HuyQ/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2dmZm1nZGlsY3F2/NG95dnhubXFmLnBu/Zw" alt="Image description" width="880" height="508"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At last it appears in dashboard:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/1mmYb0EkHRd3W8C8zSc2n_wmMXtoaINPJnQWQHpeviI/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3pmdHJhcmc4cnpu/NHZxMDhzMXdoLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/1mmYb0EkHRd3W8C8zSc2n_wmMXtoaINPJnQWQHpeviI/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3pmdHJhcmc4cnpu/NHZxMDhzMXdoLnBu/Zw" alt="Image description" width="880" height="807"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Interact with contract
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 Mint tokens
&lt;/h3&gt;

&lt;p&gt;Let's mint some tokens to self:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/ryITrSqVtdfHMVCLYRddq4RfcN8LVUPl1j5O5c6fENc/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3B5dHg2d3h2OXJz/eHRlZHU1NGVyLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/ryITrSqVtdfHMVCLYRddq4RfcN8LVUPl1j5O5c6fENc/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3B5dHg2d3h2OXJz/eHRlZHU1NGVyLnBu/Zw" alt="Image description" width="880" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;code&gt;Tokens&lt;/code&gt; tab under &lt;code&gt;Extensions&lt;/code&gt; in left menu bar:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/a6v3r48vJiDv3-4PDntLOHgsiWDD9R92vqS4saS2CPg/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/LzZmNW1vcmZscGZm/ZHR6dzg3bjN3LnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/a6v3r48vJiDv3-4PDntLOHgsiWDD9R92vqS4saS2CPg/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/LzZmNW1vcmZscGZm/ZHR6dzg3bjN3LnBu/Zw" alt="Image description" width="880" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then click &lt;code&gt;Mint&lt;/code&gt; button:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/rH8KtMvpCERWD8UrRVJIsxE58q2DiLd7cUFcQWkfIuo/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3c0cXZiNncxa2Ez/cm5meTF5d2h3LnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/rH8KtMvpCERWD8UrRVJIsxE58q2DiLd7cUFcQWkfIuo/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3c0cXZiNncxa2Ez/cm5meTF5d2h3LnBu/Zw" alt="Image description" width="880" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And type &lt;code&gt;1000000000000000000000&lt;/code&gt; as amount in &lt;code&gt;Additional Supply&lt;/code&gt; input box:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/744cihwRx_YS0ZrEc0JC7L2wDcJF-dUi37EdwEfHJEY/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2NtcjQ0N290cmVp/aTVpcnJvY2kxLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/744cihwRx_YS0ZrEc0JC7L2wDcJF-dUi37EdwEfHJEY/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2NtcjQ0N290cmVp/aTVpcnJvY2kxLnBu/Zw" alt="Image description" width="880" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At last click &lt;code&gt;Mint Tokens&lt;/code&gt; button:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/P60p_VX7VZ0QSMzLadwPD5yDKs9QbUrp534WKPTlu7M/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L240ZGpuOTJrY2Mz/ZGR2eGE1MmhlLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/P60p_VX7VZ0QSMzLadwPD5yDKs9QbUrp534WKPTlu7M/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L240ZGpuOTJrY2Mz/ZGR2eGE1MmhlLnBu/Zw" alt="Image description" width="880" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And comfirm this transaction in MetaMask:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/vOVUH4y3Ggb5vZOwkFg_Z2gOpdUcA9t9_5LRNIzXCYs/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2RhNWtkaWFpd3oy/cXA2MXR3Yno1LnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/vOVUH4y3Ggb5vZOwkFg_Z2gOpdUcA9t9_5LRNIzXCYs/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2RhNWtkaWFpd3oy/cXA2MXR3Yno1LnBu/Zw" alt="Image description" width="880" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can see 1000000000000000000000 MDT are mint to my address. &lt;/p&gt;

&lt;h3&gt;
  
  
  4.2 Use explorer of thirdweb
&lt;/h3&gt;

&lt;p&gt;Click &lt;code&gt;Explorer&lt;/code&gt; tab under &lt;code&gt;My Demo Token&lt;/code&gt; in left menu bar:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/fYFLB-vSZQ3HKywlGHBzqmZCo4XvofaEkq5evJHtXsM/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3gyM2Q4bGwyOWlu/N3M0dmY0bm82LnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/fYFLB-vSZQ3HKywlGHBzqmZCo4XvofaEkq5evJHtXsM/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3gyM2Q4bGwyOWlu/N3M0dmY0bm82LnBu/Zw" alt="Image description" width="880" height="719"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  4.2.1 Call write function
&lt;/h4&gt;

&lt;p&gt;Let's choose &lt;code&gt;Transfer&lt;/code&gt; function as example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/N82YKNGFAPjItQ3qBsq6BwImYhUv_w9Ir06R19a4Tg4/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/LzY1ZHBoYzNxMHQw/Z3FuZXg4aHVuLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/N82YKNGFAPjItQ3qBsq6BwImYhUv_w9Ir06R19a4Tg4/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/LzY1ZHBoYzNxMHQw/Z3FuZXg4aHVuLnBu/Zw" alt="Image description" width="880" height="732"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Input the value of parameters, such as &lt;code&gt;To&lt;/code&gt; and &lt;code&gt;Amount&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/bPKgeCSqngnX3LD_cnROHLMj3mz19sU43b2E8Jfn-gA/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3IwNjNvdmdveTR0/Z3FudXE0MjQxLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/bPKgeCSqngnX3LD_cnROHLMj3mz19sU43b2E8Jfn-gA/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L3IwNjNvdmdveTR0/Z3FudXE0MjQxLnBu/Zw" alt="Image description" width="880" height="733"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;code&gt;Execute&lt;/code&gt; button:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/4B_lXIZ2ZZVDwDqblaW6jMenws4c5ABFuGSou5FRVag/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2FldWd4d2RtbnFq/MmdpNnVjdmRhLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/4B_lXIZ2ZZVDwDqblaW6jMenws4c5ABFuGSou5FRVag/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2FldWd4d2RtbnFq/MmdpNnVjdmRhLnBu/Zw" alt="Image description" width="880" height="722"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Afer confirm this transaction in MetaMask:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/-Si4KQpmp8CPMVHVWfNxmnSVeUOnDbsNIEbFSxN1DTU/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2xtbGtpNXFiMmN5/OHR5ZHFua3JwLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/-Si4KQpmp8CPMVHVWfNxmnSVeUOnDbsNIEbFSxN1DTU/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2xtbGtpNXFiMmN5/OHR5ZHFua3JwLnBu/Zw" alt="Image description" width="880" height="908"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  4.2.2 Call read function
&lt;/h4&gt;

&lt;p&gt;Click &lt;code&gt;Read&lt;/code&gt; tab in right, and choose a function such as &lt;code&gt;balanceOf&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/GK-4z5DdkVquvRoQhVsBxiGfABvHY_rKiHSomwrRQQk/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2phZThldDQzcXp4/cTJrNW0xcWUyLnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/GK-4z5DdkVquvRoQhVsBxiGfABvHY_rKiHSomwrRQQk/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2phZThldDQzcXp4/cTJrNW0xcWUyLnBu/Zw" alt="Image description" width="880" height="860"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then input the value of parameter account:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/B6ooKrfe702DHteaUyoiiGJrNIoAWolbOAa0Z2KALzo/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2NidDBkanJmOHFn/NzlpbmpsdnQ2LnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/B6ooKrfe702DHteaUyoiiGJrNIoAWolbOAa0Z2KALzo/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2NidDBkanJmOHFn/NzlpbmpsdnQ2LnBu/Zw" alt="Image description" width="880" height="876"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At last click &lt;code&gt;Run&lt;/code&gt; button, get the result:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.xdc.dev/images/23r6rxbqNcftTWZIzbdGZMF3xi5dYfzypdKGq0jIYzo/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2N2eDgxZnk1Nzc1/djhlaDZoejh5LnBu/Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://www.xdc.dev/images/23r6rxbqNcftTWZIzbdGZMF3xi5dYfzypdKGq0jIYzo/w:880/mb:500000/ar:1/aHR0cHM6Ly93d3cu/eGRjLmRldi91cGxv/YWRzL2FydGljbGVz/L2N2eDgxZnk1Nzc1/djhlaDZoejh5LnBu/Zw" alt="Image description" width="880" height="854"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>thirdweb</category>
      <category>deploy</category>
      <category>xinfin</category>
      <category>dashboard</category>
    </item>
  </channel>
</rss>
