2 个版本

0.0.2 2023 年 6 月 29 日
0.0.1 2023 年 6 月 21 日

#849 in 文本处理

Apache-2.0

15KB
154

Spark Rust SDK

此存储库包含基于谓词的订单簿在 Fuel 网络上的实现,以及测试和 Spark Rust SDK 代码。

组件

谓词 + 代理

此系统使用谓词来表示任何人都可以执行的订单。为了创建订单,制作人将硬币发送到谓词根,可以通过满足订单条件的任何交易来解锁。这些条件,如将特定数量的资产转移到接收者,被编码到谓词字节码中,使它们特定于该特定订单。

订单所有者可以通过在满足订单条件的交易中花费谓词硬币来执行订单。所有者使用谓词硬币的方式具有灵活性,只要交易输出满足订单条件,并且是集合中的第一个输出。

要取消订单,制作人可以在包含由接收者签名的单个硬币输入的交易中花费谓词硬币。交易包括两个输入:签名的硬币和谓词硬币。

Alice 提供了此谓词中的价格和代币信息。此外,Alice 可以向同一谓词根发送额外的钱来增加更改金额。

Spark Rust SDK

专为使用 Rust 编程语言与 CLOB Spark 无缝集成而设计,Spark Rust SDK 提供以下功能

获取谓词实例

要创建谓词,您需要提供以下可配置项

configurable {
    ASSET0: b256 = ZERO_B256, // Asset that provides the maker (Alice)
    ASSET1: b256 = ZERO_B256, // Asset that provides the taker (Bob)
    MAKER: b256 = ZERO_B256, // Order owner
    PRICE: u64 = 0, // asset1_amount / asset0_amount
    ASSET0_DECIMALS: u8 = 1,
    ASSET1_DECIMALS: u8 = 1,
    PRICE_DECIMALS: u8 = 9, // optional
    MIN_FULFILL_AMOUNT0: u64 = 1, // optional
}

示例

let usdc_decimals = 6;
let uni_decimals = 9;
let amount0 = 1000_000_000_u64; // 1000 USDC
let amount1 = 300_000_000_000_u64; // 200 UNI
let price_decimals = 9;

let exp = (price_decimals + usdc_decimals - uni_decimals).into();
let price = amount1 * 10u64.pow(exp) / amount0;
println!("Order price: {:?} UNI/USDC", price);

let configurables = LimitOrderPredicateConfigurables::new()
    .set_ASSET0(Bits256::from_hex_str(&usdc_asset_id.to_string()).unwrap())
    .set_ASSET1(Bits256::from_hex_str(&uni_asset_id.to_string()).unwrap())
    .set_ASSET0_DECIMALS(usdc_decimals)
    .set_ASSET1_DECIMALS(uni_decimals)
    .set_MAKER(Bits256::from_hex_str(&alice.address().hash().to_string()).unwrap())
    .set_PRICE(price)
    .set_PRICE_DECIMALS(price_decimals)
    .set_MIN_FULFILL_AMOUNT0(0);

let predicate: Predicate = Predicate::load_from(PREDICATE_BIN_PATH)
    .unwrap()
    .with_configurables(configurables);

订单创建

async fn create_order(
    wallet: &WalletUnlocked, // Order owner
    proxy_address: &str, // Proxy contract address as a string


    params: ProxySendFundsToPredicateParams, 
    amount: u64, // amount0
) -> Result<FuelCallResponse<()>, fuels::prelude::Error>;

示例

let params = ProxySendFundsToPredicateParams {
    predicate_root: predicate.address().into(),
    asset_0: usdc.contract_id().into(),
    asset_1: uni.contract_id().into(),
    maker: alice.address().into(),
    min_fulfill_amount_0: 1,
    price,
    asset_0_decimals: 6,
    asset_1_decimals: 9,
    price_decimals: 9,
};

create_order(&alice, PROXY_ADDRESS, params, amount0)
    .await
    .unwrap();

订单取消

pub async fn cancel_order(
    wallet: &WalletUnlocked, // Order owner
    predicate: &Predicate, // Predicate instance
    asset0: AssetId,
    amount0: u64,
) -> Result<FuelCallResponse<()>, fuels::prelude::Error>;

示例

cancel_order(&alice, &predicate, usdc_asset_id, usdc_mint_amount)
    .await
    .unwrap();

订单履行

async fn fulfill_order(
    wallet: &WalletUnlocked, // Taker
    predicate: &Predicate, // Predicate instance
    owner_address: &Bech32Address, 
    asset0: AssetId,
    amount0: u64,
    asset1: AssetId,
    amount1: u64,
) -> Result<FuelCallResponse<()>, fuels::prelude::Error>;

示例

fulfill_order(
    &bob,
    &predicate,
    alice.address(),
    usdc_asset_id,
    usdc_mint_amount, // amount0
    uni_asset_id,
    uni_mint_amount, // amount0
)
.await
.unwrap();

依赖项

~48–64MB
~1M SLoC