1 个不稳定版本

0.1.0 2023年3月23日

#5#amm

Apache-2.0

190KB
5K SLoC

Solana TWAMM

简介

无许可TWAMM(时间加权平均价格市场制作人)服务帮助Solana上的交易者高效执行大额订单。它将大额订单汇集在一起,将其拆分为小块,并在指定的时间间隔内执行。通过使用预言机价格,内部匹配相反方向的订单,并通过Jupiter的最佳执行路线结算净未清余额。此外,市场制作人(或任何人)都有机会以预言机价格结算未清的净余额(即与TWAMM池进行交换),从而为自己和协议节省交换费用。

项目目标

  1. 降低大额订单的价格影响。
  2. 在指定的时间窗口内,尽可能接近平均价格填充订单。
  3. 与手动方法相比,降低复杂性和执行费用。
  4. 在执行订单时,让用户保留其代币的完全控制权。
  5. 通过提供完全透明度来降低逆向选择。

最初的想法属于Paradigm。但本项目不是依赖可能缺乏流动性的内部池,而是利用Jupiter结算净未清余额,并开放机会给任何流动性提供者以预言机价格结算交易。

服务由三大部分组成:Web用户界面、后端和链上程序。

Web用户界面是一个示例用户界面,显示活跃用户订单、交易进度、最小/最大/平均填充价格,并允许向链上程序提交订单指令。

后端是一个Typescript程序,用于触发链上cranks。后端程序不存储任何状态,是权限无限制的cranks执行的示例。

链上程序处理订单指令,存储用户和代币对相关信息,并持有待交换的代币和代管费用。

设计考虑

  1. 订单可以在任何给定时间全部或部分取消。在这种情况下,部分执行的交易结果将被返回。也可以为现有订单充值。
  2. 当订单完成时,需要明确提取已交换的流动性。但这项操作是无权限的,因此可以由用户或crank job执行。回收的租金SOL可以用作激励。
  3. 为了降低费用、交换次数和价格影响,所有时间间隔的所有订单都被汇总在一起。匹配的买卖数量基于预言机价格进行交换。交换金额基于净(买卖)差值。
  4. 默认情况下,曲柄是无需许可的,但可以可选地要求权限。每个代币对都设置曲柄权限,以减少传递给链上程序账户的数量。
  5. 为了最小化累积网络费用和舍入误差造成的损失,曲柄的频率基于每次迭代的交换金额。频率从每秒一次到目标时间间隔内的几次不等。强制执行最小交换大小,并取决于有效期(TIF)。
  6. 管理员权限可以初始化或修改代币对配置或提取费用。内置了多重签名功能。
  7. 新订单允许的有效时间(TIF)周期按代币对配置,并限于十个不同选项(例如,5m、15m、1h、4h、12h、24h、1w等)。只要没有针对TIF的活跃池,就可以修改(添加/删除/修改)可用的TIF。在订单放置时显示给最终用户的订单到期时间是不均匀的,并基于特定周期在链上开始的时间。用户可以选择加入现有的虚拟池(即,已经开始的TIF周期)或放置一个计划订单,该订单将在下一个时间间隔开始时开始交易。
  8. 每个TIF周期和代币对跟踪一个用户订单。换句话说,如果用户有不同的TIF,他们可以修改现有订单的数量或为同一代币对放置多个订单。

快速开始

设置环境

  1. https://github.com/askibin/twamm.git克隆存储库。
  2. https://docs.solana.com/cli/install-solana-cli-tools安装最新的Solana工具。如果您已经安装了Solana工具,请运行solana-install update以获取最新兼容版本。
  3. https://rustup.rs/安装最新的Rust稳定版本。如果您已经安装了Rust,请运行rustup update以获取最新版本。
  4. https://www.anchor-lang.com/docs/installation安装最新的Anchor框架。如果您已经安装了Anchor,请运行avm update以获取最新版本。

构建

首先,使用solana-keygen new -o <PROG_ID_JSON>为程序地址生成新密钥。然后,在Anchor.tomlprograms/twamm/src/lib.rs中将现有的程序ID替换为新生成的地址。

此外,确保Anchor.toml中钱包的路径正确。或者,当运行Anchor部署或测试命令时,您可以使用--provider.wallet参数指定您的钱包。钱包的公钥将在程序初始部署时设置为升级权限。强烈建议在主网上部署时将升级权限设置为多重签名。

twamm目录中运行anchor build命令来构建程序

cd twamm
anchor build

测试

使用cargo test命令执行单元测试

cargo test -- --nocapture

可以按以下方式启动集成测试

npm install
anchor test -- --features test

默认情况下,集成测试在本地验证器上执行,所以不会花费您任何SOL。

部署

要将程序部署到devnet并上传IDL,请使用以下命令

anchor deploy --provider.cluster devnet --program-keypair <PROG_ID_JSON>
anchor idl init --provider.cluster devnet --filepath ./target/idl/twamm.json <PROGRAM ID>

初始化

为了初始化程序,您需要执行 init 指令,然后为每个支持的代币对执行 initTokenPair。请参考 tests/1_basics.ts 中的示例。

用户界面(UI)

UI 是使用 NextJS 构建的,其部署方式与任何类似应用程序相同:请参阅 NextJS 部署

要启动本地实例进行开发,可以使用 yarn

cd app
yarn install
yarn dev

注意:除非程序已正确部署和初始化,否则 UI 不会工作!

Vercel 部署

  • twamm 存储库分叉到您的 Github 账户。

  • 登录 Vercel。

  • 点击 Create a New Project

  • 点击 twamm 旁边的 Import

  • 点击 Root DirectoryEdit 并选择 app

  • Framework Preset 选择 Next.js

  • 设置 环境变量

    NEXT_PUBLIC_PROGRAM_ADDRESS - address of the deployed twamm program
    NEXT_PUBLIC_CLUSTER_API_URL - link to your RPC node (api.mainnet-beta.com won't work due to restrictions)
    NEXT_PUBLIC_ENABLE_TX_SIMUL - set to 0
    NEXT_PUBLIC_SUPPORTED_TOKEN - insert a comma-separated list of supported token mints (don't add any spaces!)
    

例如

NEXT_PUBLIC_PROGRAM_ADDRESS: TWAMdUxafgDN2BJNFaC6pND63tjdLz4AmEKBzuxtbe9
NEXT_PUBLIC_CLUSTER_API_URL: https://rpc.ankr.com/solana
NEXT_PUBLIC_ENABLE_TX_SIMUL: 0
NEXT_PUBLIC_SUPPORTED_TOKEN: So11111111111111111111111111111111111111112,EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v

点击 Deploy

确保 Settings->General 中的 NodeJS 版本与 twamm/app/.nvmrc 中存储的版本相匹配。

旋转(Crank)

为了使程序正常工作,必须定期执行无许可的“旋转”交易。一个示例旋转脚本位于 app/src/crank.ts,可以按以下方式执行

export ANCHOR_WALLET=<ANY FUNDED WALLET>
npx ts-node -P tsconfig.json app/src/crank.ts https://rpc.ankr.com/solana <TOKEN_MINT1> <TOKEN_MINT2>

其中 TOKEN_MINT1TOKEN_MINT2 是要旋转的代币对的相应铸币。

支持

如果您在使用 Twamm 代码库时遇到技术问题,请在 StackExchange 上提出问题(在您的问题中添加 twamm 标签)。

如果您在代码中发现错误,您可以在 Github 上提出问题。但如果这是一个安全问题,请不要在 Github 或公共渠道中公开。请将信息发送到 [email protected]

贡献

我们非常欢迎贡献。有关更多信息,请参阅 贡献指南

许可

Solana TWAMM 代码库在 Apache License 2.0 许可下发布。

免责声明

通过访问或使用 Solana TWAMM 或其任何组件,您接受并同意 免责声明


lib.rs:

TWAMM 程序入口点

依赖项

~21–31MB
~526K SLoC