Pre:
最近在看pancakeBunny机枪池的源代码时,看到了他们有个zap
功能
Zap 功能本质上允许用户直接从单一资产(BNB)切换到 LP 代币(BNB-CAKE LP),只需单击一个按钮,而无需进行煎饼交换和切换不同的资产
源码里是直接调用pancakeswap router
合约,后面打算尝试写个类似的dex
dapp玩一下。
现在先试一下如何调用pancakeswap router
进行代币的交换。
pancakebunny zap 源码:
贴个函数,solidity的代码量感觉都比较少,多看看多实践应该不难掌握吧~
1 | // 将代币的一半换成另一种代币,然后提供流动性 |
Pancakeswap Router交互
pancakeswap router contract里面共17个函数,如下
流动性相关:
-
addLiquidity
-
addLiquidityETH
-
removeLiquidity
-
removeLiquidityETH
-
removeLiquidityETHSupportingFeeOnTransferTokens
-
removeLiquidityETHWithPermit
-
removeLiquidityETHWithPermitSupportingFeeOnTransferTokens
-
removeLiquidityWithPermit
swap相关:
-
swapETHForExactTokens
-
swapExactETHForTokens
-
swapExactETHForTokensSupportingFeeOnTransferTokens
-
swapExactTokensForETH
-
swapExactTokensForETHSupportingFeeOnTransferTokens
-
swapExactTokensForTokens
-
swapExactTokensForTokensSupportingFeeOnTransferTokens
-
swapTokensForExactETH
-
swapTokensForExactTokens
Swap: BNB -> anyToken
swapExactETHForTokens:
swapExactETHForTokens():
-
amountOutMin
:收到最小量 -
path
:代币地址列表,eg:[BNB代币地址,anyToken代币地址]
-
to
:收币地址 -
deadline
:交易过期时间
1 | pancakeswap2_txn = contract.functions.swapExactETHForTokens( |
例子:记录tx
Swap: AToken -> BToken
approve授权:
先要将你的代币授权给pancakeswap router contract
approve():
-
spender:给予授权的地址,这里是要授权给
pancakeswap router contract
-
rawAmount:代币数量
1 | aprove_txn = erc20_contract.functions.approve( |
例子:记录tx
swapExactTokensForTokens:
swapExactTokensForTokens():
-
amountIn:交换数量
-
amountOutMin:收到最小量,考虑滑点
-
path
:代币地址列表,一般要有中间代币,eg:[AToken代币地址,中间代币地址,BToken代币地址]
-
to
:收币地址 -
deadline
:交易过期时间
1 | pancakeswap2_txn = contract.functions.swapExactTokensForTokens( |
例子:记录tx
Bug:
暂时只遇到以下报错:
TRANSFER_FAILED:
Fail with error 'Pancake: TRANSFER_FAILED'
:
-
注意授权
-
注意gas fee够不够
INSUFFICIENT_OUTPUT_AMOUNT or INSUFFICIENT_INPUT_AMOUNT
Fail with error 'PancakeRouter: INSUFFICIENT_OUTPUT_AMOUNT
Fail with error 'PancakeLibrary: INSUFFICIENT_INPUT_AMOUNT
注意数量单位是wei
,可以用web3.toWei('5.1', 'gwei'),
转换成gwei
Question:
还有几个问题还有些疑惑:
-
调用
swapExactTokensForTokens
,如何自动获取中间的转换代币?是用BNB
还是CAKE
? -
通过滑点计算出
amountOutMin
-
gas fee要给多少?才不会过高过低?
Todo:
-
部署合约,做个和Zap类似的小dapp
-
defi自动收菜
- 定时收菜,每过一段时间(如每月15号),自动collect,然后卖出换U, 甚至进一步可以 将u质押到
venus
里 - 冲新矿的二矿,有高apr,短时间挖提买,监控代币,如果代币价格接近成本价,则全部清仓
- 定时收菜,每过一段时间(如每月15号),自动collect,然后卖出换U, 甚至进一步可以 将u质押到
还是要多实践多do呀,maybe会有一些new idea~