Пост
Поделитесь своими знаниями.

Создайте DEX на Sui с помощью DeepBook: практическое руководство для разработчиков Move
Добро пожаловать на новый уровень разработки Sui Move. В этом практическом руководстве мы подробно рассмотрим DeepBook — мощный движок CLOB (Central Limit Order Book) в экосистеме Sui и покажем вам, как создать DEX с нуля. Независимо от того, создаете ли вы прототипы приложений DeFi или изучаете механику токенов, в этом руководстве вы узнаете, как создавать смарт-контракты, взаимодействовать и тестировать их с использованием новейших модулей DeepBook.
Введение: почему DeepBook так важен
Если вы знакомы с протоколами DeFi, такими как Uniswap или dYdX, вы знаете, насколько важна эффективная онлайн-книга заказов. DeepBook предоставляет эту возможность в Sui благодаря встроенной компоновке конструкции. Он позволяет использовать лимитные ордера, рыночные ордера, пулы ликвидности и депозитарные счета — и все это в модулях Move.
Эта статья является продолжением нашего предыдущего введения в DeepBook и полностью посвящена практическим вопросам: мы покажем вам, как выпускать токены, создавать пулы ликвидности, пополнять и выводить активы, а также исполнять лимитные и рыночные ордера.
Настройка проекта
Начните с создания нового проекта Move:
$ sui move new howtosui_deepbook
Мы создадим два модуля:
*usdt
: токен актива с пользовательскими котировками
*deepbook
: наша логика взаимодействия с модулями DeepBook
Модуль токенов USDT
module howtosui::usdt {
use sui::coin::{Coin, TreasuryCap, Self};
public struct USDT has drop {}
fun init(witness: USDT, ctx: &mut TxContext) {
let (treasury, metadata) = coin::create_currency(witness, 6, b"USDT", b"", b"", option::none(), ctx);
transfer::public_freeze_object(metadata);
transfer::public_transfer(treasury, tx_context::sender(ctx))
}
public entry fun mint(treasury_cap: &mut TreasuryCap<USDT>, amount: u64, recipient: address, ctx: &mut TxContext) {
treasury_cap.mint_and_transfer(amount, recipient, ctx)
}
public entry fun burn(treasury_cap: &mut TreasuryCap<USDT>, coin: Coin<USDT>) {
treasury_cap.burn(coin);
}
}
Интеграция модуля DeepBook
module howtosui::deepbook {
use deepbook::clob_v2 as deepbook;
use deepbook::custodian_v2 as custodian;
use sui::coin::{Coin, Self};
use sui::clock::Clock;
const FLOAT_SCALING: u64 = 1_000_000_000;
public fun new_pool<Base, Quote>(payment: &mut Coin<SUI>, ctx: &mut TxContext) {
let fee = coin::balance_mut(payment).split(100 * FLOAT_SCALING);
let coin = coin::from_balance(fee, ctx);
deepbook::create_pool<Base, Quote>(1 * FLOAT_SCALING, 1, coin, ctx);
}
public fun new_custodian_account(ctx: &mut TxContext) {
transfer::public_transfer(deepbook::create_account(ctx), tx_context::sender(ctx));
}
public fun make_base_deposit<Base, Quote>(pool: &mut deepbook::Pool<Base, Quote>, coin: Coin<Base>, account_cap: &custodian::AccountCap) {
deepbook::deposit_base(pool, coin, account_cap);
}
public fun make_quote_deposit<Base, Quote>(pool: &mut deepbook::Pool<Base, Quote>, coin: Coin<Quote>, account_cap: &custodian::AccountCap) {
deepbook::deposit_quote(pool, coin, account_cap);
}
public fun withdraw_base<Base, Quote>(pool: &mut deepbook::Pool<Base, Quote>, quantity: u64, account_cap: &custodian::AccountCap, ctx: &mut TxContext) {
let base = deepbook::withdraw_base(pool, quantity, account_cap, ctx);
transfer::public_transfer(base, tx_context::sender(ctx));
}
public fun place_limit_order<Base, Quote>(
pool: &mut deepbook::Pool<Base, Quote>,
client_order_id: u64,
price: u64,
quantity: u64,
self_matching_prevention: u8,
is_bid: bool,
expire_timestamp: u64,
restriction: u8,
clock: &Clock,
account_cap: &custodian::AccountCap,
ctx: &mut TxContext
): (u64, u64, bool, u64) {
deepbook::place_limit_order(pool, client_order_id, price, quantity, self_matching_prevention, is_bid, expire_timestamp, restriction, clock, account_cap, ctx)
}
public fun place_base_market_order<Base, Quote>(
pool: &mut deepbook::Pool<Base, Quote>,
account_cap: &custodian::AccountCap,
base_coin: Coin<Base>,
client_order_id: u64,
is_bid: bool,
clock: &Clock,
ctx: &mut TxContext
) {
let quote_coin = coin::zero<Quote>(ctx);
let quantity = coin::value(&base_coin);
place_market_order(pool, account_cap, client_order_id, quantity, is_bid, base_coin, quote_coin, clock, ctx);
}
fun place_market_order<Base, Quote>(
pool: &mut deepbook::Pool<Base, Quote>,
account_cap: &custodian::AccountCap,
client_order_id: u64,
quantity: u64,
is_bid: bool,
base_coin: Coin<Base>,
quote_coin: Coin<Quote>,
clock: &Clock,
ctx: &mut TxContext
) {
let (base, quote) = deepbook::place_market_order(pool, account_cap, client_order_id, quantity, is_bid, base_coin, quote_coin, clock, ctx);
transfer::public_transfer(base, tx_context::sender(ctx));
transfer::public_transfer(quote, tx_context::sender(ctx));
}
}
Настройка среды: тестирование Localnet
Запустите валидатор локально:
$ sui client switch --env localnet
Создайте две учетные записи:
$ sui client new-address ed25519 yasmine
$ sui client new-address ed25519 yoyo
Финансируйте и то, и другое через местный кран.
Развертывайте и взаимодействуйте
4.1 Публикация модулей
$ sui client publish --gas-budget 100000000
Экспортируйте ключевые объекты, такие как PACKAGE_ID, TREASURY_CAP_ID, POOL_ID и т. д.
4.2 Токен монетной котировки (USDT)
$ sui client call --function mint ... 1000000000 <address>
4.3 Создать пул
$ sui client call --function new_pool --args <payment_coin_id>
4.4 Создайте учетную запись хранителя
$ sui client call --function new_custodian_account
4.5 Депозитные активы
$ sui client call --function make_base_deposit
$ sui client call --function make_quote_deposit
4.6 Размещение лимитных ордеров
$ sui client call --function place_limit_order --args <price> <quantity> <expire>
4.7 Выполнение рыночных ордеров
$ sui client call --function place_base_market_order
- Подведение итогов
Благодаря DeepBook компания Sui предлагает полностью интегрированный в цепочку, компонуемый и эффективный движок книги заказов, подходящий для высокопроизводительных протоколов DeFi. Каждый компонент, начиная с выпуска токенов и заканчивая исполнением ордеров, можно программировать и тестировать с помощью Move. В этом руководстве вы найдете основы для создания собственных торговых платформ, стратегий ликвидности и даже сложных экосистем DeFi под управлением DAO на платформе Sui.
Следите за новостями в третьей части, где мы рассмотрим анализ событий, отслеживание истории заказов и интеграцию с интерфейсом с помощью Sui SDK. Давайте продолжим разработку
- Sui
- SDKs and Developer Tools
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Заработай свою долю из 1000 Sui
Зарабатывай очки репутации и получай награды за помощь в развитии сообщества Sui.