---
# System prepended metadata

title: 擴充加密幣 - ERC20標準

---

[TOC]

<hr/>

本文件筆記下 如果要擴鏈時，每個專案應該新增程式碼的部分。

:::info
**參考文獻，先前版本的擴幣攻略：**
https://hackmd.io/VeFL_VsJQPCXB10u9MDQlg
:::

:::warning
**基本知識:**

- 網路：
又可稱為Chain/鏈。例如BSC(Binance Smart Chain)、Ethereum、TRON等等都是網路。可以把它想成是銀行的概念；例如有中國信託、兆豐、玉山銀行等等。你可以在每個網路上存款，也可以在不同網路上做跨鏈轉賬。

- 轉賬需要手續費，在加密幣術語中稱為gas fee
:::


# 加密幣金流和一般金流的差異
一般金流的流程是，程式建立訂單後，User付費完成，網頁或Server會執行Callback來告知我方說user已經付費完成。

在加密幣上，沒有匯款完成後的Callback機制，所以變成我方程式碼必須不斷的去加密幣幣鏈上查詢 是否有匯款成功的記錄。

在加密幣鏈上，我們可以查到任何一筆交易，以及任何錢包地址裡面有多少額度。例如透過 Bsc Scan來查詢: 
https://bscscan.com/address/0xf5d27e319c0e428dd418a72bfb4924fe33254924

<br/>
<hr/>
<br/>

# NewGalaxy Java專案

### 新增幣別類型
#### 在EnumPool.java新增對應的Channel enum
`\newgalaxy\common\src\main\java\com\punch\galaxy\vars\EnumPool.java`
![](https://hackmd.io/_uploads/BJeDBD73h.png)
```
public enum Channel {
    ...
    MATIC("MATIC", "MATIC", "Polygon", "MATIC", "MATIC", "0.0000315"),
    MANA("MANA", "MANA", "Polygon", "MANA", "MATIC", "0.000053");
```


#### ChainBalance.java新增對應的幣別
`\newgalaxy\common\src\main\java\com\punch\galaxy\chain\typed\ChainBalance.java`

```
public class ChainBalance implements Serializable {
    ...
    String bnb;
    ..
    public BigDecimal getBnb() {
        return null != bnb ? new BigDecimal(bnb) : null;
    }

    public BigDecimal getBalance(String symbol) {
        ...
        else if (symbol.equalsIgnoreCase(EnumPool.Channel.BNB.getSymbol())) {
            return null != bnb ? new BigDecimal(bnb) : null;
        }
        return BigDecimal.ZERO;
    }
}
```

CronJob部分到此就可以了



<br/>
<hr/>
<br/>


# galaxy-core
- 此專案是一個NodeJs server服務
- 接收NewGalaxy專案服務器傳來的rest api指令 
- 加密幣區塊鏈主要溝通的渠道；實際上，生產存款地址、查賬、轉賬等行為都在這處理。
#### 先在 application.yml 做好設定資料，例如Api Key和Contract Address
![](https://hackmd.io/_uploads/rysEhU7h3.png)


## api.js 
- 主要處理rest api指令
#### 需要新增的程式碼：
- 先定義加密幣的網路，和幣別代碼
    ![](https://hackmd.io/_uploads/H1KagE_u2.png)
    用途於在接收rest api指令時，需確認參數裡的chain和symbol是我們認可的。

#### 需要擴充的rest api指令：
##### /account
- 創建存款地址
- 針對每個user，都會為它創一個存款地址。存在tk_tokenwallet資料表裡。
- 參數：網路; Eth, Bsc, Tron

#### /balance
- 查詢某個地址的額度
- 參數：網路, 地址

#### /transactions
- 查詢某地址的交易記錄列表
- 參數：網路, 地址, 幣別

#### /transfer
- 轉賬
- 參數：網路, 來源地址, 來源地址的private key, 幣別, 目標地址, 額度

#### /transactionInfo
- 查詢交易記錄細節
- ChainCron如果發現有未處理完成的transaction時，會呼叫此api來驗證transaction是否是成功的。如果驗證

#### /validAddress
- 一個string validation，驗證字串是合法地址的格式


#### 新增一個專處理此幣別的lib檔案
`範例路徑： \galaxy-core\api\chain\polygon.js`

確認如果此幣是ERC-20標準的話，可直接 extends Erc20Token:

以Polygon鏈來為範例
- 建立一個class extends Erc20Token
- 上網搜尋它的api url節點是什麼，然後設定進去即可
- 如下圖：

![](https://hackmd.io/_uploads/SyXIpIQ23.png)
這樣既完成Polygon的主幣Matic的擴充

### 擴充Polygon鏈上其他ERC20幣 (MANA幣)
- 建立class extends Polygon
- 要上網查MANA幣的Contract Address，然後設定進去即可
- 如下圖：
![](https://hackmd.io/_uploads/ByXaRIQ23.png)

這樣既完成Polygon的Contract幣Mana的擴充


<br/><hr/><br/>