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

更新於 2024/12/04閱讀時間約 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
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
阿揪西放送的老朋友們應該知道,今年我剛結束了一段大齡留學生活。這段時間偶爾有網友私訊詢問學校申請、開銷和準備流程等問題,我也樂於分享各種細節。其中常提到的建議之一就是:開通一個便捷的網銀帳戶。
Thumbnail
本章節介紹了HTML中的表格和表單元素。表格部分詳細說明了table、tr、td等標籤的用途,以及如何構建結構化數據。表單部分則涵蓋了form、input、button等標籤,解釋了如何創建用戶交互界面以收集和提交數據。章節通過實例代碼展示了這些元素的實際應用。
Thumbnail
本章節介紹了HTML中常用的文本和列表標籤。文本標籤包括段落、換行、水平線、預格式化、引用、粗體和斜體等。列表標籤則包括無序列表和有序列表,以及列表項。這些標籤用於結構化和格式化HTML文檔,使內容更具可讀性和組織性。章節還提供了各種標籤的使用示例,包括嵌套列表的展示。
Thumbnail
本章介紹如何使用Visual Studio Code來建立HTML開發環境,包括安裝及配置編輯器、建立HTML文件,以及使用Live Server進行本地預覽。通過這些步驟,讀者能夠快速上手HTML開發,並在瀏覽器中即時查看修改效果。
在當今這個數位化的時代,網頁無處不在,我們每天都在使用互聯網瀏覽網頁,查找資訊、分享內容、購物等等。然而,網頁的背後是什麼?為什麼網頁能夠呈現出如此多元化的內容?
HTML(超文字標記語言)作為網頁設計的基礎語言,不僅影響了網頁的美學設計,同時也對網頁的功能性和互動性產生了重要影響。本文將探討HTML如何在網頁設計中影響美學與功能性,並進一步探討其如何與其他技術相結合,共同提升網頁設計的品質和效果。 首先,HTML在網頁設計中對美學方面的影響主要體現在網頁的
Thumbnail
上次完成到基本的CRUD及權限控制,後面花了點時間把排序、分頁、圖表總覽的部分做完,其他細節是佈署上線,一般在公司內有專屬的部門處理,僅了解一下流程。
Thumbnail
在過年期間,利用集中時間跟完Mosh Hamedani的Next.js課程,掌握了前端至後端的技術應用。本文分享了學習過程中的收穫與成果,以及對於未來應用的展望。
Thumbnail
5 分鐘用 Nestjs 接上 MySql。要實現這個需求,你需要先安裝 Node.js 和 Nest.js 框架,並確保你已經安裝了 MySQL 數據庫。
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
阿揪西放送的老朋友們應該知道,今年我剛結束了一段大齡留學生活。這段時間偶爾有網友私訊詢問學校申請、開銷和準備流程等問題,我也樂於分享各種細節。其中常提到的建議之一就是:開通一個便捷的網銀帳戶。
Thumbnail
本章節介紹了HTML中的表格和表單元素。表格部分詳細說明了table、tr、td等標籤的用途,以及如何構建結構化數據。表單部分則涵蓋了form、input、button等標籤,解釋了如何創建用戶交互界面以收集和提交數據。章節通過實例代碼展示了這些元素的實際應用。
Thumbnail
本章節介紹了HTML中常用的文本和列表標籤。文本標籤包括段落、換行、水平線、預格式化、引用、粗體和斜體等。列表標籤則包括無序列表和有序列表,以及列表項。這些標籤用於結構化和格式化HTML文檔,使內容更具可讀性和組織性。章節還提供了各種標籤的使用示例,包括嵌套列表的展示。
Thumbnail
本章介紹如何使用Visual Studio Code來建立HTML開發環境,包括安裝及配置編輯器、建立HTML文件,以及使用Live Server進行本地預覽。通過這些步驟,讀者能夠快速上手HTML開發,並在瀏覽器中即時查看修改效果。
在當今這個數位化的時代,網頁無處不在,我們每天都在使用互聯網瀏覽網頁,查找資訊、分享內容、購物等等。然而,網頁的背後是什麼?為什麼網頁能夠呈現出如此多元化的內容?
HTML(超文字標記語言)作為網頁設計的基礎語言,不僅影響了網頁的美學設計,同時也對網頁的功能性和互動性產生了重要影響。本文將探討HTML如何在網頁設計中影響美學與功能性,並進一步探討其如何與其他技術相結合,共同提升網頁設計的品質和效果。 首先,HTML在網頁設計中對美學方面的影響主要體現在網頁的
Thumbnail
上次完成到基本的CRUD及權限控制,後面花了點時間把排序、分頁、圖表總覽的部分做完,其他細節是佈署上線,一般在公司內有專屬的部門處理,僅了解一下流程。
Thumbnail
在過年期間,利用集中時間跟完Mosh Hamedani的Next.js課程,掌握了前端至後端的技術應用。本文分享了學習過程中的收穫與成果,以及對於未來應用的展望。
Thumbnail
5 分鐘用 Nestjs 接上 MySql。要實現這個需求,你需要先安裝 Node.js 和 Nest.js 框架,並確保你已經安裝了 MySQL 數據庫。