如何使用API進行超導兌換的交易與理財?

超導兌換是mov協議下的三大核心產品之一,超導兌換有別於之前推出的磁力兌換和閃電兌換,超導屬於一種是一個基於cfmm機制的自動化交易市場,有著非常強大的流動性和做市機制。

超導做市架構和原理

mov server只是提供訂單與交易之間的相互轉化,實際上所有的訂單都是由使用者簽名後提交, 並最終與超導流動性池交易。 mov server提供了與中心化交易所接近一致的api介面,其交易時的api使用體驗,基本與中心化交易所一致,但依然有一些不同,例如訂單簽名的過程。在本文中,會詳細的展示如何透過api介面使用超導兌換的各項功能並會附上基於python實現的demo原始碼。

工具準備

python

mov-mmdk是基於mov server的restful api開發的python sdk,使用前請確保在你有 python3 開發環境。本教程所有過程使用的版本為 python 3.9.0

mov-mmdk安裝

mov market maker develo pment kit,基於mov server的restful api開發的python sdk。雖然本教程demo演示的過程中採用requests包中的方法呼叫api,但仍然需要mmdk的部分方法完成本地簽名。

git clone https://github.com/bytom/mov-mmdk
cd mov-mmdk/
pip3 install -r requirements.txt
python3 setup.py install

溫馨提示:推薦在macoslinux環境下使用,windows環境下安裝依賴的過程比較繁瑣。

詳細演示

詳細的教程我們透過demo來演示如何使用api進行超導兌換的交易與理財。每一個api都會對應一個函式。

完整的demo原始碼詳見:supertxdemo

方法所用api文件詳見:超導兌換api

超導兌換

1.全域性宣告mov-mmdk的movapi物件並利用助記詞初始化,後面簽名的步驟需要用到movapi的方法。

api = movapi(secret_key="")
config = api.init_from_mnemonic("此處填入助記詞,以空格分隔")

2.獲取市場上所有交易對資訊

請求介面:get /v1/symbols

獲取超導上各個交易對的資料,請求方法使用python的第三方庫requests,透過requests.get方法可以簡單使用api。

def get_symbols():
url = baseurl + "/v1/symbols"
res = requests.get(url)
print(res.json())

main中執行get_symbols()傳送請求,輸出資料為json格式

3.獲取指定交易對和方向的兌換匯率

請求介面:get /v1/exchange-rate

請求方法依然為requests.get 建立兌換請求的時候需要使用這個介面來獲取最新的兌換匯率,匯率不正確無法構建訂單。

def get_exchange_rate(symbol, amount, side):
url = baseurl + "/v1/exchange-rate?symbol={}&amount={}&side={}".format(symbol, amount, side)
res = requests.get(url)
res = res.json()
print(res)
return res["data"]["exchange_rate"]

執行示例:

# 獲取指定交易對和方向的兌換匯率
symbol = "sup/btm"
amount = "12"
side = "buy"
get_exchange_rate(symbol, amount, side)

4.建立兌換請求

請求介面:post /v1/build-exchange-request

與傳統中心化交易所的api不同,在超導兌換中發起一筆兌換需要先構建訂單build,然後對build的資料本地簽名,然後透過submit介面把簽名後的資料提交。本方法完成build的過程:

# 建立兌換請求
def bulid_exchange_request(address, symbol, amount, side):
param = {
"symbol": symbol,
"amount": amount,
"side": side,
"exchange_rate": get_exchange_rate(symbol, amount, side)
}


url = baseurl + "/v1/build-exchange-request?address={}".format(address)
encoded_data = json.dumps(param).encode('utf-8')
res = requests.post(url, encoded_data)
res = res.json()
print(res)


return res["data"]

建立兌換請求的過程中會呼叫步驟3的函式獲取兌換比例,由於是utxo模型,返回的data資料可能是多組需要簽名的raw_transaction。

 

5.提交兌換請求,將步驟4返回的資料本地簽名並提交

請求介面:post /v1/submit-exchange-request

將步驟4的資料本地簽名,簽名的方法呼叫自mov-mmdk

def submit_exchange_request(address, data):
res = []
url = baseurl + "/v1/submit-exchange-request?address={}".format(address)


for info in data:
params = api.mov_sign(info)
encoded_data = json.dumps(params).encode('utf-8')
resp = requests.post(url, encoded_data)
print(resp.json())
res.append(resp)


return res

submit中對data的每個資料簽名並提交。示例同時包含build和submit過程,請確保資產足夠兌換,否則程式會報錯:

# 建立並提交兌換訂單
symbol = "sup/btm"
amount = "12"
side = "buy"
data = bulid_exchange_request(api.vapor_address, symbol, amount, side)
submit_exchange_request(api.vapor_address, data)

6.查詢歷史兌換記錄

請求介面:get /v1/exchange-order-history

def exchange_order_history(address, start="0", limit="20"):
url = baseurl + "/v1/exchange-order-history?address={}&start={}&limit={}".format(address, start, limit)
res = requests.get(url)
print(res.json())

引數start預設為0,limit預設為20,可以根據需求重寫

# 查詢歷史兌換記錄
exchange_order_history(api.vapor_address, start="0", limit="1")

超導理財

1.查詢流動性儲存池資訊

呼叫介面:get /v1/pool-info

返回的資料為各個超導池的資金量、地址等資訊

def pool_info():
url = baseurl + "/v1/pool-info"
res = requests.get(url)
print(res.json())


2.獲取指定流動性池的資產比例

呼叫介面:get /v1/asset-proportion

獲取指定流動性池的比例,在轉入資產的時候需要此資料,如果轉入的比例不正確,理財資金將會無法轉入

# 獲取流動性池的資產比例
def asset_proportion(symbol):
url = baseurl + "/v1/asset-proportion?symbol={}".format(symbol)
res = requests.get(url)
res = res.json()
print(res)
return res["data"]

3.構建雙資產轉入,構建完成後需要使用步驟5的方法提交

呼叫介面:post /v1/build-multi-asset-deposit

資產轉入與建立兌換請求的原理類似,都需要先build訂單,然後透過submit提交。

def build_multi_asset_deposit(address, symbol, quantity_proportion, amount):
url = baseurl + "/v1/build-multi-asset-deposit?address={}".format(address)
param = {
"symbol": symbol,
"quantity_proportion": quantity_proportion,
"amount": amount
}
encoded_data = json.dumps(param).encode('utf-8')
res = requests.post(url, encoded_data)
res = res.json()
print(res)


return res["data"]

4.構建單資產轉入,構建完成後需要使用步驟5的方法提交

呼叫介面:post /v1/build-single-asset-deposit

原理步驟3,本介面可以單資產轉入理財。需要注意的時候單資產理財目前只支援穩定幣轉入,返回的資料需要使用步驟5 submit提交

def build_single_asset_deposit(address, symbol, amount, currency):
url = baseurl + "/v1/build-single-asset-deposit?address={}".format(address)
param = {
"symbol": symbol,
"amount": amount,
"currency": currency
}
encoded_data = json.dumps(param).encode('utf-8')
res = requests.post(url, encoded_data)
res = res.json()
print(res)


return res["data"]

5.提交轉入

呼叫介面:post /v1/submit-deposit

用途是將步驟3,4中build的訂單在本地簽名和提交。雙資產和單資產的轉入訂單建立後,都使用本方法提交。

def submit_deposit(address, data):
res = []
url = baseurl + "/v1/submit-deposit?address={}".format(address)


for info in data:
params = api.mov_sign(info)
encoded_data = json.dumps(params).encode('utf-8')
resp = requests.post(url, encoded_data)
print(resp.json())
res.append(resp)


return res

步驟2,3,5具有關聯性,放在此處一起演示。以下程式碼演示了雙資產轉入流動性池的完整過程:

# 雙資產轉入流動性池
symbol = "sup/btm"
amount = "0.003"
proportion = asset_proportion(symbol)
data = build_multi_asset_deposit(api.vapor_address, symbol, proportion, amount)
submit_deposit(api.vapor_address, data)

以下展示步驟4和5:

# 單資產轉入流動性池
symbol = "usdc/usdt"
amount = "0.15"
currency = "usdt"
data = build_single_asset_deposit(api.vapor_address, symbol, amount, currency)
submit_deposit(api.vapor_address, data)


6.雙資產移除流動性

呼叫介面:post /v1/submit-multi-asset-withdrawal

本方法可以將儲存在超導池中的雙資產取出

def submit_multi_asset_withdrawal(address, symbol, amount):
params = {
"pubkey": get_xpub(api.secret_key),
"symbol": symbol,
"quantity_proportion": asset_proportion(symbol),
"amount": amount,
"time_stamp": api.generate_timestamp()
}
data = json.dumps(params).replace(' ', '').encode('utf-8')
signature_data = xprv_my_sign(api.secret_key, data)
url = baseurl + "/v1/submit-multi-asset-withdrawal?signature={}&address={}".format(signature_data, address)
encoded_data = json.dumps(params).encode('utf-8')


res = requests.post(url, encoded_data)
print(res.json())

移除流動性的請求不需要構建訂單,省去了build的過程,可以直接submit,但簽名的方式與超導兌換中提交訂單不同。超導兌換步驟5和理財步驟5都是對build介面返回的raw_transaction和signing_instructions簽名,而移除流動性是對請求的body進行簽名。

請求示例:

# 雙資產移除流動性
symbol = "sup/btm"
amount = "0.003"
submit_multi_asset_withdrawal(api.vapor_address, symbol, amount)


7.單資產移除流動性

呼叫介面:post /v1/submit-single-asset-withdrawal

類似步驟7,但單資產移除流動性只支援穩定幣如:usdt、usdc、dai

def submit_single_asset_withdrawal(address, symbol, amount, currency):
params = {
"pubkey": get_xpub(api.secret_key),
"symbol": symbol,
"amount": amount,
"time_stamp": api.generate_timestamp(),
"currency": currency,
}
data = json.dumps(params).replace(' ', '').encode('utf-8')
signature_data = xprv_my_sign(api.secret_key, data)
print(params)
print(signature_data)
url = baseurl + "/v1/submit-single-asset-withdrawal?signature={}&address={}".format(signature_data, address)
encoded_data = json.dumps(params).encode('utf-8')
res = requests.post(url, encoded_data)
print(res.json())

單資產移除流動性簽名的原理同步驟6,只不過是請求body引數有所變動。

請求示例:

# 單資產移除流動性
symbol = "usdc/usdt"
amount = "0.1"
currency = "usdt"
submit_single_asset_withdrawal(api.vapor_address, symbol, amount, currency)


8.獲取使用者收益

呼叫介面:get /v1/user-earning

本方法可以獲取指定地址的超導理財收益

def user_earning(address):
url = baseurl + "/v1/user-earning?address={}".format(address)
res = requests.get(url)
print(res.json())

透過地址獲取指定使用者的理財收益,示例:

# 檢視收益
user_earning(api.vapor_address)

9.獲取各個流動性池的年化收益率

呼叫介面:get /v1/user-earning

可以獲取每個超導池理財的年化收益率,方便使用者選擇理財

def annual_rate():
url = baseurl + "/v1/annual-rate"
res = requests.get(url)
print(res.json())

請求示例:

# 獲取年化收益率
annual_rate()

10.獲取多資產可用資訊

呼叫介面:get /v1/multi-asset-available

獲取使用者在各個理財池中儲存的雙資產資訊,在錢包中的資產不會在本方法中顯示。

def multi_asset_available(address):
url = baseurl + "/v1/multi-asset-available?address={}".format(address)
res = requests.get(url)
print(res.json())

請求示例:

# 獲取多資產可用資訊
multi_asset_available(api.vapor_address)

11.獲取單資產可用資訊

呼叫介面:get /v1/single-asset-available

方法和步驟10類似,查詢超導池中穩定幣單資產的資訊。方法10和11是為了讓使用者知道自己在超導池中存了多少資產。

def single_asset_available(address):
url = baseurl + "/v1/single-asset-available?address={}".format(address)
res = requests.get(url)
print(res.json())

請求示例:

# 獲取單資產可用資訊
single_asset_available(api.vapor_address)

12.獲取狀態同步資訊

呼叫介面:get /v1/chain-status

該方法用於查詢當前的區塊高度

def chain_status():
url = baseurl + "/v1/chain-status"
res = requests.get(url)
print(res.json())

請求示例:


以上就是對超導api各介面的使用演示,詳細demo原始碼請點選:supertxdemo 使用demo的時候,請保證賬戶裡資產數量和狀態的正確性,確保有足夠的資產發起請求,否者demo會因為部分介面呼叫失敗而報錯。demo僅僅是演示一個請求的過程,實際生產環境中使用還需要諸多改進,例如增加請求返回狀態的確認等等。

























免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读