NextJS & HTML 實作 ERC20 交易網站【開發筆記】

閱讀時間約 13 分鐘
2022/06/10 發佈於 Medium
說是開發過程的筆記,應該是撞牆心血錄,因為各式各樣的原因,所以為前後端串接困擾了很久⋯⋯在這邊想特別感謝 Pecu老師的指點,如果沒有老師給的新思路,我可能會撞牆撞到天荒地老 QQ


前置作業

  • NodeJS 環境(建議先安裝 yarn,沒有也沒關係, yarn 與 npm 的轉換可上網搜尋)
  • Metamask 擴充套件下載
  • 完工的 HTML 靜態網站(不是 HTML 也OK,跳過轉檔段落即可)
備註:接下來的程式碼中,實作的 ERC20 合約為 CafeChainCoin,文章則會用 YourToken 代稱,若要使用,把相關設定替換成自己的即可。


發行 ERC20 貨幣合約

OpenZeppelin Contracts Wizard 創建自己的 ERC20 合約,輸入合約名稱 Name、代稱 Symbol、初發行數量 Premint 就基本完成,還可以額外對合約增加設定, 細節可以參考網站內的說明。
實作程式碼(記錄用,建議至 OpenZeppelin Contracts Wizard 創建):

產出合約後,在 Remix 開新 Workspace,創建 YourToken.sol,貼上剛剛完成的程式碼。
到 SOLIDITY COMPILER 的 COMPILER 選擇合約使用的版本,合約版本通常會在程式碼上方,前綴 pragma solidity ^,像我用的是 0.8.4。
接著點擊 Compile YourToken.sol,完成編譯後,到 DEPLOY & RUN TRANSACTIONS,ENVIRONMENT 選擇 Injected Web3,這時會跳出 Metamask 連結彈窗,請務必確認好要發行的鏈與帳號。
CONTRACT 選擇以 Token 命名的那個(像我的是 CafeChainCoin),點擊 Deploy,接著等幾分鐘,成功的話 Deployed Contracts 區就會出現內容。


發行 ERC20 貨幣交易合約

Workspace 開一個 YourTokenVendor.sol,貼上實作程式碼:

tokensPerEther 記得改成自訂 Token 對 Ether 的匯率~
Remix 上發行的步驟都與貨幣合約相同,就只差在最後 Deploy 時,要輸入 Token 的合約地址。完成後,先不要關掉視窗,之後還會回來。


NextJS 環境建置

實際操作畫面可參考大神影片<NextJS & Ethers>段落前段。

在 VS Code 打開要建 NextJS APP 資料夾的路徑,於 Terminal 輸入
yarn create next-app .
這邊要注意的是,建立 next-app 需要特定 node 版本,如果在這部分有報錯的話,最快的解決方式是直接更到最新版本。
完成建立後,pages 資料夾裡的 car.js 檔可以刪掉。成功的話,這時候跑
yarn dev
Terminal 會跳一個 ready url,複製貼到瀏覽器就可以進到 NextJS 的初始畫面。


把 HTML 嵌進 NextJS APP

轉換方式參考大神影片。

將 HTML 網站的 css、js、images 資料夾複製貼到 public 目錄下。
NextJS Docs 複製 Custom Document 第一段程式碼,進行簡單修改,並直接替換掉 index.js 的程式碼:
import { Head } from 'next/head';
import { Script } from 'next/script';export default function Home() {
return (
<>
<Head>
<Head/>
</>
)
}
將 HTML 檔中被<head>包起來的 非 script 部分,貼到 index.js 的<Head>區段中,並將沒被前後夾擊的單行程式碼 > 替換成 />,大概會長這樣:
<Head>
<title> ... </title>
<meta ... />
<link ... />
<Head/>
接著將 script 貼到<Head>區段後面(前面也可以),把 script 改成 Script。
<>
<Head>
...
<Head/> <Script src="..."></Script>
</>
接著瀏覽器開啟 Transform,左欄選擇 HTML to JSX,把 .html 檔其餘<body>部分貼到 HTML 區,轉碼後複製右邊 JSX 的程式碼,貼到<Head>後面,再來因為轉譯器似乎不是很全面,所以需要短短的 debug 時間。
<>
<Head>
...
<Head/> ... JSX ...

<Script src="..."></Script>
</>
要注意的是,轉碼後的<Input type=”submit”>不相近於<button>,無法觸發 click事件,如果網站有使用,請記得更換。
還有,onclick=要換成onClick=⋯⋯天知道我因為這個卡了多久。

套件安裝

接下來的所有內容參考自:
打開 Terminal,用以下程式碼安裝套件:
yarn add @web3-react/core
yarn add @web3-react/injected-connector
yarn add react
yarn add ethers
yarn add @ethersproject/providers
建議分開執行,這樣有 bug 時比較好 de (?)


把合約資料丟進來

在 NextJS APP 主目錄新增 constants 資料夾,底下開一個 contracts.js,輸入
module.exports = {
tokenAddress = '你的 ERC20 合約地址',
vendorAddress = '你的交易合約地址' tokenABI =
vendorABI =
}
tokenABI 與 vendorABI 可點擊 Remix SOLIDITY COMPILER 下方的 ABI 鍵複製。
  • tokenABI:CONTRACT 選擇 YourToken(YourToken.sol)
  • vendorABI:CONTRACT 選擇 Vendor(YourTokenVendor.sol)
複製後,直接貼到程式碼等號後面。


寫程式吧!_app.js

打開 _app.js,改!
詳細說明可到 大神影片<NextJS & Web3-React>段落找一下,只能說 React 永遠的神。


寫程式吧!index.js

點擊 GIF連結 看看呈現的感覺,接下來說明會比較好理解。
流程大概是這樣:
  1. 點擊錢包登入 Metamask
  2. 顯示當前連結帳戶地址
  3. 在「購買」,輸入要購買的 CCO 數量,點擊<確認購買>就會開始交易
  4. 在「賣出」,輸入要賣出的 CCO 數量,點擊<確認購買>就會開始交易
那就開始吧!
打開 index.js,在之前轉好 HTML 時完成的部分外,再新增億點點程式碼。return 網頁只有放與 function 相關的部分。
這邊我偷懶把 function跟網站頁面寫在一起,導致程式碼看起來不是那麼俐落,有興趣的話,可以研究一下如何改成 import module的形式。

【學習筆記】
  1. 看不懂就找 大神影片大神文章
  2. useWeb3React() 是紀錄連結 Web3 資訊的強大工具,account 帳戶地址可以直接叫出來!
  3. useState() 函式是用狀態+改變狀態的函式命的,這樣說或許有些饒口,簡單舉例一下,設 const [ apple, setApple ] = useState(0),原本apple=0,想讓蘋果變 1 顆,用 setApple(1) ,就會讓apple=1。
  4. useState() 補充,「改變狀態的函式」可以用各式各樣的方式觸發,像這次就有結合 useEffect()、onChange 事件等,使用邏輯可以參考程式碼。
  5. useEffect() 是另一個新學的函式,顧名思義就是產生影響,詳細介紹可到網路搜尋。
  6. return 中 {variable} 可以在 return 前設定要輸入什麼值,像這裡拿來顯示地址跟存 Input。
這邊的 ETH 轉換是之前撞牆時,寫在前端 JS的(放在 public js 資料夾),有需要可以參考下方程式碼。但當初是因為懶才沒有改到 index.js,轉換還是建議參考 大神文章 ,這樣在做購買時,Token 變數就不用再乘以匯率。
const ccoBuy = document.getElementById('ccoBuy');
const etherBuy = document.getElementById('etherBuy');
const ccoSell = document.getElementById('ccoSell');
const etherSell = document.getElementById('etherSell');ccoBuy.addEventListener('input', (res) => {
etherBuy.innerHTML = (res.target.value) * 0.01;
});ccoSell.addEventListener('input', (res) => {
etherSell.innerHTML = (res.target.value) * 0.01;

【開發心血錄】
  1. function buyTokens() 與 sellTokens() 都有擋錯誤 Input 格式的設定,還另外偷偷加了單次交易數額的 Limit,程式是設成數量超過 100 就擋。
  2. Token 系列 function 中有一個我調整了很久的地方,就是 try{} 發送 method 請求部分,當初參考 大神文章 一直報錯,後來改 .send 跟 method 內變數的發送格式才成功,或許是實作方式不同?求了解 QQ
  3. .buyTokens() 中 ccoBuy*0.01,是因為 Input 單位限定為 Ether⋯⋯但 .sellTokens() 單位是 CCO。
  4. ether.utils.parseEther() 會報錯,因爲 utils 是直接從 ethers import⋯⋯當時一直找不到這個 bug 的我,對它愛了很久。
  5. sellTokens() 比 buyTokens() 多了向 Token 合約請求 Approve 的函式,這邊因為 sellTokens() 底下兩個函式都用 await,所以如果 Approve 等太久,會無法揮手送 Vendor 離開。
    最後為了解決這個問題,用了 Promise.all。
  6. 這裡 onClick() 跟 onChange() 的內容物不一樣,是因為 onClick 觸發的是無參數函式,可以簡寫,onChange 則需要傳資料出去。
打完程式看可愛貓貓治癒一下
小菜雞寫的程式碼還有許多不足,有誤或想補充的話,歡迎留言一起學習!
以上引用若侵權,經通知會立刻刪除
即將進入廣告,捲動後可繼續閱讀
為什麼會看到廣告
avatar-img
4會員
5內容數
愛好旅遊的程式人兼設計人,興趣有點廣泛,未來打算分享各種學習筆記或日常。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
LIEN 的其他內容
NFT 項目前景看好,萬事順遂,只缺人投資?相信「拉投資」一事困擾了許多項目方,該怎麼讓手裡有資源的人,注意到自己的項目,一直是個經營事業的難題。
是否遇過每個人都說好,實際買進 NFT 又被當韭菜的經驗呢? 投資客選擇 NFT 項目的理由,可能有些是看到媒體介紹,或借鑑大神的投資模式,或閱讀相關書籍等等——但這些,真的是評判能否砸錢給一個 NFT 項目的好理由嗎?也許有些關鍵沒被注意到,而這就是所謂的「有限注意力偏差」。
NFT 項目前景看好,萬事順遂,只缺人投資?相信「拉投資」一事困擾了許多項目方,該怎麼讓手裡有資源的人,注意到自己的項目,一直是個經營事業的難題。
是否遇過每個人都說好,實際買進 NFT 又被當韭菜的經驗呢? 投資客選擇 NFT 項目的理由,可能有些是看到媒體介紹,或借鑑大神的投資模式,或閱讀相關書籍等等——但這些,真的是評判能否砸錢給一個 NFT 項目的好理由嗎?也許有些關鍵沒被注意到,而這就是所謂的「有限注意力偏差」。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
在當今這個數位化的時代,網頁無處不在,我們每天都在使用互聯網瀏覽網頁,查找資訊、分享內容、購物等等。然而,網頁的背後是什麼?為什麼網頁能夠呈現出如此多元化的內容?
HTML(超文字標記語言)作為網頁設計的基礎語言,不僅影響了網頁的美學設計,同時也對網頁的功能性和互動性產生了重要影響。本文將探討HTML如何在網頁設計中影響美學與功能性,並進一步探討其如何與其他技術相結合,共同提升網頁設計的品質和效果。 首先,HTML在網頁設計中對美學方面的影響主要體現在網頁的
Thumbnail
上次完成到基本的CRUD及權限控制,後面花了點時間把排序、分頁、圖表總覽的部分做完,其他細節是佈署上線,一般在公司內有專屬的部門處理,僅了解一下流程。
Thumbnail
在過年期間,利用集中時間跟完Mosh Hamedani的Next.js課程,掌握了前端至後端的技術應用。本文分享了學習過程中的收穫與成果,以及對於未來應用的展望。
Thumbnail
5 分鐘用 Nestjs 接上 MySql。要實現這個需求,你需要先安裝 Node.js 和 Nest.js 框架,並確保你已經安裝了 MySQL 數據庫。
Thumbnail
雖然知道可以透過 HTML 的 red, white, black 等顏色單字而非色票 (color code) 來使用顏色,一直以來開發上都是在找好適合的顏色後,使用 Sass 將色票紀錄到變數再做使用,不過最近接觸到 w3schools 的 HTML Color Names 才知道有將近...
網頁輸入欄位動態改變範例 Html Dynamic DropDown Example
Thumbnail
一個網頁只會有一個h1 標籤(h1.p.img)裡面可以放多個屬性(src.background.color) 建立 HTML 環境 告訴大家這是html5的語法 關於整個專案的資訊放這裡面 頁籤標題 寫給別人看的要放這裡面 Emmet 預設安裝 /*語意使用英文*/ /*使
Thumbnail
在HTML程式語言中,有一種能讓HTML元素與其他程式語言(CSS、JavaScript)運作的更加順利的語法,它叫做「HTML屬性(HTML Attribute)」。 那HTML屬性是怎麼運作的呢?
Thumbnail
01-圖片size寫法 background-size: 12px ; 當給一個數值的時候,另一個設定為auto 參考:https://developer.mozilla.org/zh-CN/docs/Web/CSS/background-size 02-圖片切換-方法1: css: .a1
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
在當今這個數位化的時代,網頁無處不在,我們每天都在使用互聯網瀏覽網頁,查找資訊、分享內容、購物等等。然而,網頁的背後是什麼?為什麼網頁能夠呈現出如此多元化的內容?
HTML(超文字標記語言)作為網頁設計的基礎語言,不僅影響了網頁的美學設計,同時也對網頁的功能性和互動性產生了重要影響。本文將探討HTML如何在網頁設計中影響美學與功能性,並進一步探討其如何與其他技術相結合,共同提升網頁設計的品質和效果。 首先,HTML在網頁設計中對美學方面的影響主要體現在網頁的
Thumbnail
上次完成到基本的CRUD及權限控制,後面花了點時間把排序、分頁、圖表總覽的部分做完,其他細節是佈署上線,一般在公司內有專屬的部門處理,僅了解一下流程。
Thumbnail
在過年期間,利用集中時間跟完Mosh Hamedani的Next.js課程,掌握了前端至後端的技術應用。本文分享了學習過程中的收穫與成果,以及對於未來應用的展望。
Thumbnail
5 分鐘用 Nestjs 接上 MySql。要實現這個需求,你需要先安裝 Node.js 和 Nest.js 框架,並確保你已經安裝了 MySQL 數據庫。
Thumbnail
雖然知道可以透過 HTML 的 red, white, black 等顏色單字而非色票 (color code) 來使用顏色,一直以來開發上都是在找好適合的顏色後,使用 Sass 將色票紀錄到變數再做使用,不過最近接觸到 w3schools 的 HTML Color Names 才知道有將近...
網頁輸入欄位動態改變範例 Html Dynamic DropDown Example
Thumbnail
一個網頁只會有一個h1 標籤(h1.p.img)裡面可以放多個屬性(src.background.color) 建立 HTML 環境 告訴大家這是html5的語法 關於整個專案的資訊放這裡面 頁籤標題 寫給別人看的要放這裡面 Emmet 預設安裝 /*語意使用英文*/ /*使
Thumbnail
在HTML程式語言中,有一種能讓HTML元素與其他程式語言(CSS、JavaScript)運作的更加順利的語法,它叫做「HTML屬性(HTML Attribute)」。 那HTML屬性是怎麼運作的呢?
Thumbnail
01-圖片size寫法 background-size: 12px ; 當給一個數值的時候,另一個設定為auto 參考:https://developer.mozilla.org/zh-CN/docs/Web/CSS/background-size 02-圖片切換-方法1: css: .a1