#trading #orderbook #framework #protocols #requests #on-chain

bin+lib aori

用于与奥里基于WebSocket API交互的奥里Rust SDK

5个版本

0.1.5 2023年12月8日
0.1.4 2023年12月1日
0.1.3 2023年11月9日
0.1.2 2023年10月24日
0.1.0 2023年10月24日

WebSocket 中排名第 56

Download history 6/week @ 2024-06-30 57/week @ 2024-07-28

每月下载量 63

MIT 许可证

86KB
1.5K SLoC

奥里Rust SDK

H

奥里是一种高性能的订单簿协议,适用于链上高频交易和场外交易结算。此存储库提供Rust SDK,用于与奥里基于WebSocket的API交互,以帮助开发者尽可能容易地集成和构建在协议之上。

此SDK在MIT 许可证下发布。


如果您有任何其他问题,请参阅技术文档。或者,请通过DiscordTwitter联系我们。

目录

安装

要安装SDK,请在Cargo.toml中添加以下内容

[dependencies]
aori = { git = "https://github.com/aori-io/aori-sdk-rs/", branch = "main"}

初始化

将SDK导入您的项目后,您可以按以下方式访问SDK(以下为例如何访问AoriProvider)

use aori::requests::aori_provider::AoriProvider;

let mut provider = AoriProvider::new_from_env().await.expect("Failed to create API provider.");

client.subscribe_orderbook().await.expect("Failed to subscribe orderbook.");

要创建简单订单:(/examples/make_order.rs)

use aori::requests::aori_provider::AoriProvider;

let mut provider = AoriProvider::new_from_env().await.expect("Failed to create API provider.");

let wallet = &provider.wallet_addr;
let sell_token = "0xD3664B5e72B46eaba722aB6f43c22dBF40181954";
let buy_token = "0x2715Ccea428F8c7694f7e78B2C89cb454c5F7294";
let sell_amount = "100000000"; // 100 usdc (6 decimals)
let buy_amount = "750000000000000000"; // 0.75 eth (18 decimals)

let order_params = OrderParameters::limit_order(wallet, sell_token, sell_amount, buy_token, buy_amount).to_order_components();


provider.make_order(order_params).await.expect("Failed to send make_order");

请参阅./examples文件夹中的工作示例和文档。

奥里WebSocket API

由于奥里API是基于WebSocket的API,请求和响应可能以异步方式返回。AoriProvider使用WebSocket crate,并利用WebSocketReadHalf和WebSocketWriteHalf的分割。这些分别处理读取和写入操作。

奥里WebSocket API使用两个主要端点

  • "wss://beta.feed.aori.io" 用于订单簿更新(aori 'tape')
  • "wss://api.beta.order.aori.io" 用于其他一切。

这些在constants.rs中命名为MARKET_URL和REQUEST_URL。

在AoriProvider中,这些分别初始化为feed_conn和request_conn。

SDK主要概念

奥里提供者

SDK可以执行许多关键功能,其中之一可能是AoriProvider的初始化。

AoriProvider 需要设置环境变量:NODE_URL(WebSocket)、WALLET_ADDRESS 和 PRIVATE_KEY。

它可以按照以下方式初始化和调用

use aori::requests::aori_provider::AoriProvider;

let mut provider = AoriProvider::new_from_env().await.expect("Failed to create API provider.");

provider.subscribe_orderbook().await.expect("Failed to subscribe orderbook.");

奥里事件

SDK 的开发考虑到多种类型的用户。因此,除了 AoriProvider 之外,它还包括 requests.rs 文件,其中包含用于生成有效载荷的函数,以及 types.rs 描述各种类型和 AoriEvents。例如,如果您想反序列化或仅使用 OrderCreated 事件,可以按以下方式操作

use aori::types::events::OrderCreatedData;

这导入了以下形式的 OrderCreatedData 结构体

#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
pub struct OrderCreatedData {
    pub order: OrderCreationData,
    #[serde(rename = "orderHash")]
    pub order_hash: String,
    #[serde(rename = "inputToken")]
    pub input_token: String,
    #[serde(rename = "outputToken")]
    pub ouptut_token: String,
    #[serde(rename = "inputAmount")]
    pub input_amount: u64,
    #[serde(rename = "outputAmount")]
    pub output_amount: u64,
    pub rate: Option<f64>,
    #[serde(rename = "chainId")]
    pub chain_id: i64,
    pub active: bool,
    #[serde(rename = "createdAt")]
    pub created_at: u64,
    #[serde(rename = "lastUpdatedAt")]
    pub last_updated_at: u64,
    #[serde(rename = "isPublic")]
    pub is_public: bool,
}

您可以非常容易地根据特征访问或过滤事件,例如根据输入/输出代币或 chain_id 过滤。

反序列化奥里事件

您可以使用 AoriEvents 反序列化从 subscribe orderbook 接收的事件。有关如何操作的示例,请查看 artemis 示例中的 process_payload 函数:(./examples/artemis-simple/main.rs)

async fn process_payload(payload: String, tx: &UnboundedSender<AoriEvent>) -> Result<()> {
    if payload.contains("Subscribed to orderbook updates") {
        tx.send(AoriEvent::Subscribed("[AORI.IO] Subscribed to orderbook updates".to_string()))
            .expect("Error sending subscription confirmation");
    } else {
        match serde_json::from_str::<AoriResponse>(&payload) {
            Ok(response) => {
                tx.send(response.result).expect("Error sending response event");
            }
            Err(e) => {
                eprintln!("Failed to deserialize the message: {}", e);
            }
        }
    }
    Ok(())
}

示例

示例部分应反映该库的双重特性。

一些示例主要针对希望将链上交易提升到下一个级别的交易者,而另一些则更侧重于搜索者,展示如何使用 Aori 与 artemis 框架结合使用,为交易者可能填补和提供交易。

大量示例的哲学

我们坚信每个方法都应该有一个可运行的示例,只需按下 "cargo run" - 不希望你们花费时间在弄清楚如何使用 Aori 上,而是想你们花时间在更有用的事情上(比如运行哪些策略以及如何优化它们)。

我亲自被许多代码库搞糊涂了,如果你认为有什么缺失,要么创建一个新的分支并发送拉取请求,要么直接发布问题!Aori 也是为从未编写过代码的人准备的,因此示例部分应希望反映这一点。

Rust 已经足够复杂,以至于你们可能会对代码库更加困惑。

-> 如果有任何东西(可以是任何方法、功能或任何东西)没有示例,而你又想有一个,发布给我们一个问题,我们将添加它!

如何运行这些示例

导航到示例文件夹,然后执行以下操作

export WALLET_ADDRESS=0x_your_wallet_address
export PRIVATE_KEY=your_private_key (without the 0x prefix)
export NODE_URL=(wss node url) // can use 'wss://ethereum-goerli.publicnode.com' for example //
cargo run -- bin EXAMPLE_NAME

例如

cargo run --bin account_orders

探索 - 调整示例以适应您的需求,尝试新事物,尝试破坏事物。

请求示例

这些示例应该涵盖所有与访问 API 相关的方法,以及多种访问端点的方式 - 使用 Aori Provider 和预构建的方法,手动构建查询或使用 requests.rs 然后使用 AoriProvider.send() 发送。

如果您想要同步多个数据流,可以使用 artemis 文件夹中的类似 aori 收集器,但对于基本的机器人来说,这应该足够了。

Artemis 示例

Artemis 是用于编写 MEV 机器人的 Rust 框架。

目前,这部分正在开发中,但很快将有一个简单的 Aori Artemis 机器人实现。

目前有一个符合 artemis 标准的收集器,通过输出流,您应该能够将其连接到任何 artemis 策略。

我们将很快提供 AoriExecutor 以及示例策略。

依赖关系

~31–47MB
~882K SLoC