DeFiPy:DeFi分析工具包
DeFiPy旨在重构各种 DeFi(Solidity)框架,以便使用 Python 分析模拟的 DeFi 设置。

一键发币: SUI | SOL | BNB | ETH | BASE | ARB | OP | POLYGON | AVAX | FTM | OK
欢迎来到世界上第一个集成所有主要协议的 DeFi 分析 Python 包!使用 DeFiPy 实现你的分析。由于 DeFiPy 是以模块化设计构建的,因此还可以通过以下方式按协议分割您的分析:UniswapPy、BalancerPy 和 StableswapPy。该套件旨在重构各种 DeFi(Solidity)框架,以便使用 Python 分析模拟的 DeFi 设置。
目前,如果有人想使用这些协议测试 DeFi 设计,他们可能会默认使用测试框架,例如 Brownie 或 Ape。虽然这些框架非常适合在链上和本地部署进行测试,但它们可能不适合运行严格的基准测试,Web3 设计师可能希望一次性使用数万笔模拟交易对他们的协议进行压力测试。这是因为这些框架针对的是在以太坊虚拟机(EVM)上运行的原始 Solidity 应用程序,因此我们最多只能期望每秒处理 1 到 5 笔交易,这对于大型事件数据集来说并不实际。如果您希望通过数万笔事件来衡量您的想法,那么从机器学习或人工智能进入 Web3 并不是最佳方法。因此,我们提供了这一套 Python 工具,用于此类用途。
1、对 DeFi 分析日益增长的需求
在我看来,我们正处于向代币化经济过渡的过程中,参见 Bettina Warburg 的 TED 演讲。随着这一趋势,我们认为金融不可避免地将在未来几年完全过渡到 DeFi。因此,我们需要建立标准化的定量审计协议,这些协议在今天的传统金融系统中很常见。这需要研究来构建一套工具来应对这种情况。此外,这些 DeFi 协议有望通过人工智能和机器学习在主动流动性管理(ALM)方面取得很大改进,而不是像今天许多收益聚合器系统那样手动操作。
当涉及到将复杂的数据科学概念转化为区块链开发的实际见解时,带来了对 DeFi 基准框架的需求,以测试模拟设计。我们发现实现这一点最有效的方法是通过仿真。正如 Warburg 在她的演讲中提到的,我们将区块链视为一种机构技术,它将重新定义我们当前机构的管理方式。因此,传统金融将成为不久将来的 DeFi。如果是这样的话,那么我们在 DeFi 开发过程中缺少了一个关键步骤,那就是对这些协议进行定量审计,以确保这些协议在处理投资者资金时具有一定的稳健性标准。这就是我们发起 DeFiPy 的原因,它作为用于正确测试这些 DeFi 协议的开源标准工具。
2、基本用法
DeFiPy Python 套件 中的所有协议都有一个通用接口,如下所示:
ERC20
: 跨所有模拟协议使用的模拟 ERC20 代币ExchangeData
: 模拟交易所初始化参数的数据类IExchange
: 所有 DeFiPy 协议包都配备了一个交易所类(即,UniswapExchange
、BalancerExchange
、StableswapExchange
)IExchangeFactory
: 同样,所有 DeFiPy 协议包也有工厂来补充交易所类
2.1 Uniswap V2 示例
Uniswap 是 DeFi 中最广为人知的自动化做市商(AMM),它利用恒定乘积交易机制。要设置一个模拟流动性池(LP),您必须首先使用 ERC20
对象创建对中的代币。接下来,使用 IFactoryExchange
对象创建一个 LP 工厂。一旦设置完成,可以无限量地创建 LP;其流程如下:
from defipy import *
user_nm = 'user_intro'
eth_amount = 3162.277660168379
dai_amount = 316227.7660168379
dai = ERC20("DAI", "0x09")
eth = ERC20("ETH", "0x111")
exchg_data = UniswapExchangeData(tkn0 = eth, tkn1 = dai, symbol="LP",
address="0x011")
factory = UniswapFactory("ETH pool factory", "0x2")
lp = factory.deploy(exchg_data)
lp.add_liquidity("user0", eth_amount, dai_amount, eth_amount, dai_amount)
lp.summary()
# 输出:
Exchange ETH-DAI (LP)
Reserves: ETH = 3162.277660168379, DAI = 316227.7660168379
Liquidity: 31622.776601683792
2.2 Uniswap V3 示例
以下是基本设置(4月25日更新 - ≥ v1.3.0可用):
from defipy import *
user_nm = 'user_intro'
fee = UniV3Utils.FeeAmount.MEDIUM
tick_spacing = UniV3Utils.TICK_SPACINGS[fee]
lwr_tick = UniV3Utils.getMinTick(tick_spacing)
upr_tick = UniV3Utils.getMaxTick(tick_spacing)
init_price = UniV3Utils.encodePriceSqrt(100, 1)
dai = ERC20("DAI", "0x09")
eth = ERC20("ETH", "0x111")
exchg_data = UniswapExchangeData(tkn0 = eth, tkn1 = dai, symbol="LP",
address="0x011", version = 'V3',
tick_spacing = tick_spacing,
fee = fee)
factory = UniswapFactory("ETH pool factory", "0x2")
lp = factory.deploy(exchg_data)
lp.initialize(init_price)
out = lp.mint(user_nm, lwr_tick, upr_tick, 31622.776601683792)
lp.summary()
# 输出:
Exchange ETH-DAI (LP)
Reserves: ETH = 3162.277660168379, DAI = 316227.7660168379
Liquidity: 31622.776601683792
2.3 Balancer 示例
该协议扩展了常数乘积交易池(即 Uniswap),用于处理多于两种资产的池,被称为加权池。由于 Balancer 和 Stableswap 都是多资产协议,它们有一个称为Vault的东西,被誉为这些协议的定义特征。因此,我们也包括了 BalancerVault
和 StableswapVault
,如下所示的基本设置:
from defipy import *
user_nm = 'user_intro'
amt_dai = 10000000
denorm_wt_dai = 10
amt_eth = 67738.6361731024
denorm_wt_eth = 40
init_pool_shares = 100
dai = ERC20("DAI", "0x01")
dai.deposit(None, amt_dai)
weth = ERC20("WETH", "0x02")
weth.deposit(None, amt_eth)
bgrp = BalancerVault()
bgrp.add_token(dai, denorm_wt_dai)
bgrp.add_token(weth, denorm_wt_eth)
bfactory = BalancerFactory("WETH pool factory", "0x")
exchg_data = BalancerExchangeData(vault = bgrp, symbol="LP", address="0x1")
lp = bfactory.deploy(exchg_data)
lp.join_pool(bgrp, init_pool_shares, user_nm)
lp.summary()
# 输出:
Balancer Exchange: DAI|WETH (LP)
Reserves: DAI = 10000000, WETH = 67738.6361731024
Weights: DAI = 0.2, WETH = 0.8
Pool Shares: 100
2.4 Stableswap 示例
这是一个不太知名的协议,用于实现可组合稳定池,非常适合设置稳定币池。以下是基本设置:
from defipy import *
USER = 'user_test'
AMPL_COEFF = 2000
amt_dai = 79566307.559825807715868071
decimal_dai = 18
amt_usdc = 81345068.187939
decimal_usdc = 6
amt_usdt = 55663250.772939
decimal_usdt = 6
dai = ERC20("DAI", "0x01", decimal_dai)
dai.deposit(None, amt_dai)
usdc = ERC20("USDC", "0x02", decimal_usdc)
usdc.deposit(None, amt_usdc)
usdt = ERC20("USDT", "0x03", decimal_usdt)
usdt.deposit(None, amt_usdt)
sgrp = StableswapVault()
sgrp.add_token(dai)
sgrp.add_token(usdc)
sgrp.add_token(usdt)
sfactory = StableswapFactory("Pool factory", "0x")
exchg_data = StableswapExchangeData(vault = sgrp, symbol="LP", address="0x11")
lp = sfactory.deploy(exchg_data)
lp.join_pool(sgrp, AMPL_COEFF, USER)
lp.summary()
#输出:
稳定交换交易所:DAI-USDC-USDT (LP)
储备金:DAI = 79566307.55982581,USDC = 81345068.187939,USDT = 55663250.772939
流动性:216573027.91811988
2.5 DeFiPy-0x 量化终端
这个很酷的小应用程序来自ETHDenver 2024 BUIDL周,在那里我们获得了14个提交中的第3名。

通过使用DeFiPy和0x实时价格API,我们能够将两者结合起来创建一个实时模拟交易工具,允许用户从0x价格API提供的各种区块链、代币和稳定币中选择一个作为建模工具的基础。我们还添加了让用户选择建模参数的功能,例如池允许的最大交换大小、选定硬币与其相应稳定币之间的随机化交易偏差以及基于提供的流动性的位置盈利能力。
除此之外,我们还推出了一个实时仪表板,以便用户可以轻松地与模型进行交互并可视化相关的活动和参数,同时跟踪来自0x价格API的实时池数据;有关更多信息,请参阅README。
这些都是使简单的DeFi建模成为行业规范的必要步骤,通过基于实时价格流模拟数据,以避免困扰行业的所有太常见的崩溃问题。

要查看DeFiPy-0x量化终端,请点击dashboard.defipy.org获取实时链接,或者通过以下shell命令本地设置:
> git clone https://github.com/defipy-devs/defipy
> cd defipy
> pip install .
> bokeh serve --show python/application/quant_terminal/bokeh_server.py
3、即将发布的内容
由于我们正在努力为DeFi分析提供开源工具,以下是我们的下一步计划:
- Uniswap V3 Python重构:从我们的角度来看,目前没有无缝、易于使用的Uniswap V3开源Python重构;2024年4月更新——≥v1.3.0版本可用
- Gwei vs 小数:目前所有代币值均为小数格式,我们将为用户提供实现GWEI(即1 x10^-18)的能力;2025年2月更新——UniV2 ≥ v1.6.0版本可用
- 无常损失:在评估许多AMM的风险因素中起着重要作用;参见调查文章
- 代币合约地址存档:确保无缝使用0x价格API的必要组件,而无需手动获取这些合约地址
- 链上历史价格数据:这是许多分析师的常见要求,我们目前正在研究最佳方法
- 流动性树:这是一个令人兴奋的SYS Labs创新,独特于DeFi,并且是DeFiPy创建的灵感来源,参见ETHDenver 2024演讲,更多关于此的信息即将公布
4、结束语
本文中介绍的工作是更大范围工作的一部分,例如:(a) 模拟简单流动性池的行为;(b) 研究LP中的无常损失的影响;以及(c) 分析更高级DeFi系统中的风险概况和盈利能力,用于SYS Labs即将推出的Pachira协议。这里提供了那些对研究LP感兴趣的人的基本设置。
原文链接:Analyze DeFi in Python using DeFiPy
DefiPlot翻译整理,转载请标明出处
免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。