2 个版本
0.0.2 | 2023 年 6 月 29 日 |
---|---|
0.0.1 | 2023 年 6 月 21 日 |
#849 in 文本处理
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