Sui.

Пост

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

article banner.
harry phan.
Apr 30, 2025
Статья

Создайте 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
  1. Подведение итогов

Благодаря DeepBook компания Sui предлагает полностью интегрированный в цепочку, компонуемый и эффективный движок книги заказов, подходящий для высокопроизводительных протоколов DeFi. Каждый компонент, начиная с выпуска токенов и заканчивая исполнением ордеров, можно программировать и тестировать с помощью Move. В этом руководстве вы найдете основы для создания собственных торговых платформ, стратегий ликвидности и даже сложных экосистем DeFi под управлением DAO на платформе Sui.

Следите за новостями в третьей части, где мы рассмотрим анализ событий, отслеживание истории заказов и интеграцию с интерфейсом с помощью Sui SDK. Давайте продолжим разработку

  • Sui
  • SDKs and Developer Tools
2
Поделиться
Комментарии
.

Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.

291Посты418Ответы
Sui.X.Peera.

Заработай свою долю из 1000 Sui

Зарабатывай очки репутации и получай награды за помощь в развитии сообщества Sui.

Кампания вознагражденийМай
Мы используем файлы cookie, чтобы гарантировать вам лучший опыт на нашем сайте.
Подробнее