> For the complete documentation index, see [llms.txt](https://zenlink-wiki-jp.gitbook.io/zenlink/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://zenlink-wiki-jp.gitbook.io/zenlink/zenlink-dex-protcol/interface.md).

# インターフェイス

## モジュールアセット

アセットとは、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\`: 許容量&#x20;

### **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)があります。&#x20;

例外事項：

* 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: アセット量

解説：

* このインターフェースは、マッピングされた/ネイティブなアセットを他のパラチェーンのアカウントに転送することができます。&#x20;
* 例えば、Parachain300のABC'やXYZをParachain200のアカウントに転送する。
