Sui.

帖子

分享您的知识。

article banner.
harry phan.
Apr 30, 2025
文章

使用 DeepBook 在 Sui 上构建 DEX:Move 开发人员实用指南

欢迎来到 Sui Move 开发的下一阶段. 在这份实践指南中,我们将深入探讨DeepBook——Sui生态系统中强大的CLOB(中央限价订单簿)引擎,旨在向你展示如何从头开始构建去中心化交易所. 无论你是在设计DeFi应用程序原型还是探索代币机制,本教程都将引导你使用DeepBook的最新模块完成智能合约的创建、交互和测试.

简介:为什么 DeepBook 很重要

如果你熟悉 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进行编程和测试. 本指南为您在 Sui 上构建自己的交易平台、流动性策略甚至复杂的 DAO 管理的 DeFi 生态系统提供了基准.

请继续关注第 3 部分,我们将深入探讨事件解析、订单历史记录跟踪以及使用 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 确保您在我们的网站上获得最佳体验。
更多信息