インターフェイス

ZenLink DEX プロトコルでは、DEX資産を含むいくつかのモジュールが定義されています。ここでは、Rust で記述された Module 版を例に、基本的な機能の説明をします。

モジュールアセット

アセットとは、Zenlink DEX プロトコルの基本モジュールである。ERC20のような外観です。 ユーザーはこれを使って流動性やトークンを管理することができます。

Issue(発行)

ERC20トークンの新規発行

fn issue(origin, #[compact] total: T::TokenBalance, asset_info: AssetInfo)

パラメーター:

  • 'total': 初期の総供給量

  • 'asset_info':アセット情報には'name' , 'symbol' , 'decimals' が含まれます。

Transfer(転送)

トークンをオーナーから受け取り側に転送します。

fn transfer(origin, #[compact] id: T::AssetId, receiver: <T::Lookup as
StaticLookup>::Source, #[compact] amount: T::TokenBalance)

パラメーター:

  • `target`: アセットの受取手

  • `amount`: 転送するアセットの量

Approve(承認)

トークンIDを持つ呼び出し元のトークンに対するspenderの許容amountを金額として設定します。操作が成功したかどうかを示す真偽値を返します。

fn approve(origin, #[compact] id: T::AssetId, spender: <T::Lookup as
StaticLookup>::Source,  #[compact] amount: T::TokenBalance)

パラメーター:

  • `spender`: 支払い者のアカウント

  • `amount`: 許容量

Transfer From(転送元)

トークンを送信者から受信者に許容機構を使用して移動します。操作に成功したかどうかを示す真偽値を返します。

fn transfer_from(origin, #[compact] id: T::AssetId, from: <T::Lookup as StaticLookup>::Source, target: <T::Lookup as StaticLookup>::Source, # [compact] amount: T::TokenBalance)

パラメーター:

  • `id`: アセットID

  • `from`: アセット送信者

  • `target`: アセット受信者

  • `amount`: 転送するアセット量

DEXモジュール

DEXはZenLink DEX プロトコルのコアモジュールです。以下の機能を実装しています。

ペア作成

取引ペアの初期化。

pub fn create_pair(
    origin,
    token_0: AssetId,
    token_1: AssetId,
)-> DispatchResult  

パラメーター:

  • origin: トレードアカウント

  • token_0: アセットID

  • token_1: アセットID

解説:

  • Token_0とToken_1は、取引ペアを構成する2つのアセット(流動性プールとも呼ばれる)を表します。

  • (token_0, token_1) と (token_1, token_0) 同じ取引ペアです

流動性追加

pub fn add_liquidity(
   origin,
   token_0: AssetId,
   token_1: AssetId,
   amount_0_desired : T::TokenBalance,
   amount_1_desired : T::TokenBalance,
   amount_0_min : T::TokenBalance,
   amount_1_min : T::TokenBalance,
   target_parachain: ParaId,
   deadline: T::BlockNumber,
)->DispatchResult

パラメーター:

  • origin: トレードアカウント

  • token_0: 取引ペアを構成するアセットID

  • token_1: 取引ペアを構成するアセットID

  • amount_0_desired: 流動性プールに預けたい token 0 の量

  • amount_1_desired: 流動性プールに預けたい token 1 の量

  • amount_0_min: 流動性プールに預ける token 0 の最低量

  • amount_1_min: 流動性プールに預ける token 1 の最低量

  • target_parachain: 流動性プールのパラチェーンID

  • deadline: このトランザクションの締切ブロック

解説:

次のシナリオで考えてみましょう:

  • アリスはABC(Parachain200のネイティブアセット)とXYZ(Parachain300のネイティブアセット)を持っています。

  • アリスはABC/XYZ流動性プールに流動性を預けたいです。

  • ABCはParachain300でABC'と表記されています。

  • Parachain300に流動性プール(取引ペア ABC'/XYZ)があります。

例外事項:

  • Parachain200で流動性追加取引を行う場合、Parachain300 のアセット(XYZ)を十分に確保してください。そうでない場合、取引は失敗し、Parachain200のアセット(ABC)はABC'という形でParachain300に存在することになります。

  • Parachain300で流動性追加取引を行う場合、Parachain300(ABC')にParachain200の資産を十分に確保する必要があります。ABC'がない場合、Parachain200に十分なABCがあったとしても、取引は失敗となります。

流動性の削除

pub fn remove_liquidity(
   origin,
   token_0: AssetId,
   token_1: AssetId,
   liquidity: T::TokenBalance,
   amount_token_0_min : T::TokenBalance,
   amount_token_1_min : T::TokenBalance,
   to: <T::Lookup as StaticLookup>::Source,
   deadline: T::BlockNumber,
)->DispatchResult

パラメーター:

  • origin: トレードアカウントTrading account.

  • token_0: 取引ペアを構成するアセットID

  • token_1: 取引ペアを構成するアセットID

  • liquidity: 耐えられる流動性の高さ

  • amount_token_0_min: 流動性削除後に得られると予想される token_0 の最低量。

  • amount_token_1_min: 流動性削除後に得られると予想されるtoken_1の最低額。

  • to: 受信するアカウント(Recipient account)

  • deadline: このトランザクションの締切ブロック

token_0をtoken_1とスワップする

pub fn swap_exact_tokens_for_tokens(
   origin,
   amount_in: T::TokenBalance,
   amount_out_min: T::TokenBalance,
   path: Vec<AssetId>,
   to: <T::Lookup as StaticLookup>::Source,
   target_parachain: ParaId,
   deadline: T::BlockNumber,
)->DispatchResult

パラメーター:

  • origin: トレードアカウント

  • amount_in: 送信したい正確な token 0 の量

  • amount_out_min: あなたが期待する token 1 の最低量

  • path: トランザクションパス

  • to: 受け取りアドレス(Recipient address)

  • target_parachain: 流動性プールのパラチェーンID

  • deadline: このトランザクションの締切ブロック

解説:

  • pathはアセットIDの配列として表現されます。

  • 最初の要素は送信中のアセットを表し、最後の要素はターゲットアセットを表します。

  • [A, B]:A/Bの流動性プールでAとBをスワップします。

  • [B, A]:A/Bの流動性プールでBとAをスワップします。

  • [A, B, C]:A/Bの流動性プールでAとBをスワップし、B/Cの流動性プールでBとCをスワップします。

さらに、

  • pathの長さ制限はありません。

  • APIサーバーからpathを取得します。現在プールは1つしかないため、パスの長さは2で固定されています。

token_0とtoken_1をスワップする

pub fn swap_exact_tokens_for_tokens(
   origin,
   amount_in: T::TokenBalance,
   amount_out_min: T::TokenBalance,
   path: Vec<AssetId>,
   to: <T::Lookup as StaticLookup>::Source,
   target_parachain: ParaId,
   deadline: T::BlockNumber,
)->DispatchResult

パラメーター:

  • origin: トレードアカウント

  • amount_out: 取得したい正確な token 1 の量

  • amount_in_min: 送信する token 0 の最低量

  • path: トランザクションパス

  • to: 受け取りアドレス(Recipient address)

  • target_parachain: 流動性プールのパラチェーンID

  • deadline: このトランザクションの締切ブロック

解説:

  • pathはアセットIDの配列として表現されます。

  • 最初の要素は送信中のアセットを表し、最後の要素はターゲットアセットを表します。

  • [A, B]:A/Bの流動性プールでAとBをスワップします。

  • [B, A]:A/Bの流動性プールでBとAをスワップします。

  • [A, B, C]:A/Bの流動性プールでAとBをスワップし、B/Cの流動性プールでBとCをスワップします。

さらに、

  • pathの長さ制限はありません。

  • APIサーバーからpathを取得します。現在プールは1つしかないため、パスの長さは2で固定されています。

パラチェーンにマッピングされたネイティブアセットを転送する

pub fn transfer(
    origin,
    asset_id: AssetId,
    target: <T::Lookup as StaticLookup>::Source,
    amount: T::TokenBalance
)->DispatchResult

パラメーター:

  • origin: トレードアカウント

  • asset_id: アセットID

  • target: 受け取りアドレス(Recipient address)

  • amount: アセット量

解説:

  • このインターフェースは他のパラチェーンによってマッピングされたアセットをチェーン内のアカウントにのみ転送することができます。

  • 例えば、Parachain300のABC'をParachain200のアカウントではなく、Parachain300のアカウントに転送するなど。

マッピングされたネイティブアセットを他のパラチェーンに転送する

pub fn transfer_to_parachain(
   origin,
   asset_id: AssetId,
   para_id: ParaId,
   account: T::AccountId,
   amount: T::TokenBalance
) -> DispatchResult

パラメーター:

  • origin: トレードアカウント

  • asset_id: アセットID

  • para_id: 対象のパラチェーンID

  • account: 受け取りアドレス(Recipient address)

  • amount: アセット量

解説:

  • このインターフェースは、マッピングされた/ネイティブなアセットを他のパラチェーンのアカウントに転送することができます。

  • 例えば、Parachain300のABC'やXYZをParachain200のアカウントに転送する。

Last updated