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));
    }
}

Налаштування середовища: Тестування локальної мережі

Запустіть свій валідатор локально:

$ 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.

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

  • 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, щоб гарантувати вам найкращий досвід на нашому сайті.
Детальніше