[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`

```
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

## api.js
- 主要處理rest api指令
#### 需要新增的程式碼:
- 先定義加密幣的網路,和幣別代碼

用途於在接收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節點是什麼,然後設定進去即可
- 如下圖:

這樣既完成Polygon的主幣Matic的擴充
### 擴充Polygon鏈上其他ERC20幣 (MANA幣)
- 建立class extends Polygon
- 要上網查MANA幣的Contract Address,然後設定進去即可
- 如下圖:

這樣既完成Polygon的Contract幣Mana的擴充
<br/><hr/><br/>