lesson-1_オーダーを作成する機能を実装しよう
📖 オーダーを作成する機能を実装しよう
このレッスンでは、ユーザーが取引のために作成するオーダー(売り注文)を扱う機能を実装していきます。この機能はExchange
メソッドとして定義します。
Exchange
メソッドは、以下の機能を持ちます。
- ユーザーが出したオーダー(売り注文)を保存する
- オーダーをキャンセル(データから削除)する
また、オーダーを保存する際に、既に保存されているオーダーの中で取引が成立するものがあれば、取引を実行するようにしたいと思います。
それでは実装していきましょう。
まずは、src/icp_basic_dex_backend
ディレクトリにあるtypes.mo
ファイルを編集します。
以下のように、Exchange
メソッドで使用するデータ型を追加してください。ここでは、public type Balance = {...};
の直下に追加しています。
[types.mo]
module {
// 省略
// ====== DEPOSIT / WITHDRAW =====
public type DepositReceipt = {
#Ok : Nat;
#Err : {
#BalanceLow;
#TransferFailure;
};
};
public type WithdrawReceipt = {
#Ok : Nat;
#Err : {
#BalanceLow;
#TransferFailure;
#DeleteOrderFailure;
};
};
public type Balance = {
owner : Principal;
token : Principal;
amount : Nat;
};
+ // ====== ORDER =====
+ public type OrderId = Nat32;
+
+ public type Order = {
+ id : OrderId;
+ owner : Principal;
+ from : Token;
+ fromAmount : Nat;
+ to : Token;
+ toAmount : Nat;
+ };
};
次に、`Exchange`メソッドを定義す る`exchange.mo`ファイルを作成します。
touch ./src/icp_basic_dex_backend/exchange.mo
作成された`exchange.mo`ファイルに、以下のコードを記述しましょう。
[exchange.mo]
```js
import Buffer "mo:base/Buffer";
import HashMap "mo:base/HashMap";
import BalanceBook "balance_book";
import T "types";
module {
public class Exchange(balance_book : BalanceBook.BalanceBook) {
// 売り注文のIDと注文内容をマッピング
var orders = HashMap.HashMap<T.OrderId, T.Order>(
0,
func(order_id_x, order_id_y) { return (order_id_x == order_id_y) },
func(order_id_x) { return (order_id_x) },
);
};
};
最初にインポート文を定義しました。ポイントはBalanceBook
モジュールをインポートしている点です。レッスンの最初に、「取引が成立するものがあれば、取引を実行する」と説明しましたが、取引を実行する際にDEX
内のトークンデータを書き換える必要があります。そのためには、BalanceBook
モジュール内の関数をコールしたいのでインポートをしています。
import BalanceBook "balance_book";