# インターフェイス

## モジュールアセット

アセットとは、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のアカウントに転送する。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://zenlink-wiki-jp.gitbook.io/zenlink/zenlink-dex-protcol/interface.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
