如何计算pancakeswap和uniswap的代币价格
本文主要描述如何计算 UniswapV2 版本的价格
pancakeswap 核心代码和 UniswapV2 基本一致,因此代码可以共用,本文以 PancakeSwap 为例
核心思路
主要使用了 PancakeRouterV2 合约的两个方法
function getAmountsOut(uint amountIn, address[] calldata path) public view returns (uint[] memory amounts)
function getAmountsIn(uint amountOut, address[] calldata path) public view returns (uint[] memory amount
我们以第一个函数为例
amountIn 表示卖出 token 数量
path 表示交易路径,比如你要卖出 TokenA,换成 BNB,那么最简单的交易路径就是 TokenA -> Wrapped BNB
返回值 amounts,表示能获得的目标 Token 数量
所以 getAmountsOut 这个函数最终表达的意思就是
我用某个数量的TokenA,能换到多少数量的TokenB
同理,getAmountsIn 的意思是
我需要多少TokenA,才能换到某个数量的TokenB
一个算的是输出数量,一个算的是输入数量,分别对应的买价/卖家
价格影响因素
在我们发起一笔 PancakeSwap 交易中,影响价格的主要是 2 个因素
交易数量 (关于具体影响的公式,可以查看 Uniswap 的做市原理)
交易路径
怎么寻找交易路径
获取一个币的交易路径是一个 NP 问题,不属于合约管的,需要我们自己用代码实现,如果传错了交易路径,可能会造成巨大的价格滑点。
我是用的方法是基于大部分 Token 的主流动池一定是 BNB/BUSD/USDT 三者中的一个,所以分别用这 3 个 Token 测试 getAmountsOut 函数,返回数量最大的就是最优路径。
比如 TokenA,如果我测出来主流动池是 BUSD,那么如果我
使用 BUSD 购买,path = [BUSD, TokenA]
使用 BNB 购买,path = [WBNB, BUSD, TokenA]
使用 USDT 购买,path = [USDT, BUSD, TokenA]
使用 TokenB 购买,path = [TokenB, BUSD, TokenA]
同理,如果是卖出,把 path reverse 一下即可
总结
所以最终计算交易价格分为以下几步
确定交易金额和交易类型(买/卖)
确定交易路径
最后使用 getAmountsOut 或者 getAmountsIn 来估算,用结果相除即可得到价格
最后给出一段最简单的,假设主交易池是 BNB,计算 500 美金购买 Token 的价格计算伪代码:
// 构建 PancakeRouter 合约
const router = new ethers.Contract(
‘0x10ED43C718714eb63d5aA57B78B54704E256024E’,
[
“function getAmountsOut(uint amountIn, address[] calldata path) public view returns (uint[] memory amounts)”,
“function getAmountsIn(uint amountOut, address[] calldata path) public view returns (uint[] memory amounts)”,
],
provider
);
const amountIn = ethers.utils.parseUnits(‘500’, 18);
const amountOuts = router.getAmountsOut(amountIn, [USDT, WBNB, TOKEN]));
// 最后买入价格 =
Number(amountOuts[2]) / (10 ** token.decimals) / 500
// 卖出价格大家可以自己测试怎么写
联系作者
微信:chinesetrapboy
————————————————
版权声明:本文为CSDN博主「武藤游戏777」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_61277587/article/details/120765204