1 个不稳定版本
0.1.0 | 2023年3月23日 |
---|
#5 在 #amm 中
190KB
5K SLoC
Solana TWAMM
简介
无许可TWAMM(时间加权平均价格市场制作人)服务帮助Solana上的交易者高效执行大额订单。它将大额订单汇集在一起,将其拆分为小块,并在指定的时间间隔内执行。通过使用预言机价格,内部匹配相反方向的订单,并通过Jupiter的最佳执行路线结算净未清余额。此外,市场制作人(或任何人)都有机会以预言机价格结算未清的净余额(即与TWAMM池进行交换),从而为自己和协议节省交换费用。
项目目标
- 降低大额订单的价格影响。
- 在指定的时间窗口内,尽可能接近平均价格填充订单。
- 与手动方法相比,降低复杂性和执行费用。
- 在执行订单时,让用户保留其代币的完全控制权。
- 通过提供完全透明度来降低逆向选择。
最初的想法属于Paradigm。但本项目不是依赖可能缺乏流动性的内部池,而是利用Jupiter结算净未清余额,并开放机会给任何流动性提供者以预言机价格结算交易。
服务由三大部分组成:Web用户界面、后端和链上程序。
Web用户界面是一个示例用户界面,显示活跃用户订单、交易进度、最小/最大/平均填充价格,并允许向链上程序提交订单指令。
后端是一个Typescript程序,用于触发链上cranks。后端程序不存储任何状态,是权限无限制的cranks执行的示例。
链上程序处理订单指令,存储用户和代币对相关信息,并持有待交换的代币和代管费用。
设计考虑
- 订单可以在任何给定时间全部或部分取消。在这种情况下,部分执行的交易结果将被返回。也可以为现有订单充值。
- 当订单完成时,需要明确提取已交换的流动性。但这项操作是无权限的,因此可以由用户或crank job执行。回收的租金SOL可以用作激励。
- 为了降低费用、交换次数和价格影响,所有时间间隔的所有订单都被汇总在一起。匹配的买卖数量基于预言机价格进行交换。交换金额基于净(买卖)差值。
- 默认情况下,曲柄是无需许可的,但可以可选地要求权限。每个代币对都设置曲柄权限,以减少传递给链上程序账户的数量。
- 为了最小化累积网络费用和舍入误差造成的损失,曲柄的频率基于每次迭代的交换金额。频率从每秒一次到目标时间间隔内的几次不等。强制执行最小交换大小,并取决于有效期(TIF)。
- 管理员权限可以初始化或修改代币对配置或提取费用。内置了多重签名功能。
- 新订单允许的有效时间(TIF)周期按代币对配置,并限于十个不同选项(例如,5m、15m、1h、4h、12h、24h、1w等)。只要没有针对TIF的活跃池,就可以修改(添加/删除/修改)可用的TIF。在订单放置时显示给最终用户的订单到期时间是不均匀的,并基于特定周期在链上开始的时间。用户可以选择加入现有的虚拟池(即,已经开始的TIF周期)或放置一个计划订单,该订单将在下一个时间间隔开始时开始交易。
- 每个TIF周期和代币对跟踪一个用户订单。换句话说,如果用户有不同的TIF,他们可以修改现有订单的数量或为同一代币对放置多个订单。
快速开始
设置环境
- 从https://github.com/askibin/twamm.git克隆存储库。
- 从https://docs.solana.com/cli/install-solana-cli-tools安装最新的Solana工具。如果您已经安装了Solana工具,请运行
solana-install update
以获取最新兼容版本。 - 从https://rustup.rs/安装最新的Rust稳定版本。如果您已经安装了Rust,请运行
rustup update
以获取最新版本。 - 从https://www.anchor-lang.com/docs/installation安装最新的Anchor框架。如果您已经安装了Anchor,请运行
avm update
以获取最新版本。
构建
首先,使用solana-keygen new -o <PROG_ID_JSON>
为程序地址生成新密钥。然后,在Anchor.toml
和programs/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 Directory
的Edit
并选择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_MINT1
和 TOKEN_MINT2
是要旋转的代币对的相应铸币。
支持
如果您在使用 Twamm 代码库时遇到技术问题,请在 StackExchange 上提出问题(在您的问题中添加 twamm
标签)。
如果您在代码中发现错误,您可以在 Github 上提出问题。但如果这是一个安全问题,请不要在 Github 或公共渠道中公开。请将信息发送到 [email protected]。
贡献
我们非常欢迎贡献。有关更多信息,请参阅 贡献指南。
许可
Solana TWAMM 代码库在 Apache License 2.0 许可下发布。
免责声明
通过访问或使用 Solana TWAMM 或其任何组件,您接受并同意 免责声明。
lib.rs
:
TWAMM 程序入口点
依赖项
~21–31MB
~526K SLoC