之前介绍过怎样实现Pancake的swap功能,其中有个困恼我的问题是,怎么自动查找到交易对?

之前的做法是,要找到比如BNB-BUSD的交易对合约,我先提供流动,提供流动后,钱包里面就出现BNB-BUSD LP的一个代币,从这个代币就能获得LP的合约

今天了解到,原来可以利用Factory的合约来自动查找LP

用的是BSC上的Pancake Factory合约做的例子。

Factory合约里面的getPair函数会自动返回2种币的LP合约:

1
2
3
4
5
async function getPair(tokenA, tokenB) {
let tokenContract = new web3.eth.Contract(factoryAbi, addresses.PANCAKE_FACTORY);
let pair = await tokenContract.methods.getPair(tokenA, tokenB).call();
return pair;
}

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
const Web3 = require('web3');
const erc20Abi = require('./ABI/erc20.json');
const factoryAbi = require('./ABI/factory.json');
const rpcUrl = 'https://bsc-dataseed.binance.org/';
const web3 = new Web3(new Web3.providers.HttpProvider(rpcUrl));
const addresses = {
WBNB: '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c',
BUSD: '0xe9e7cea3dedca5984780bafc599bd69add087d56',
DAI: '0x1af3f329e8be154074d8769d1ffa4ee058b1dbc3',
PANCAKE_FACTORY: '0xcA143Ce32Fe78f1f7019d7d551a6402fC5350c73'
}

async function getPair(tokenA, tokenB) {
let tokenContract = new web3.eth.Contract(factoryAbi, addresses.PANCAKE_FACTORY);
let pair = await tokenContract.methods.getPair(tokenA, tokenB).call();
return pair;
}
//通过小数点多少位,转换对应的数据
function getWeiName(tokenDecimals = 18) {
tokenDecimals = Number(tokenDecimals);
let weiName = 'ether';
switch (tokenDecimals) {
case 3:
weiName = "Kwei";
break;
case 6:
weiName = 'mwei';
break;
case 9:
weiName = 'gwei';
break;
case 12:
weiName = 'microether ';
break;
case 15:
weiName = 'milliether';
break;
case 18:
weiName = 'ether';
break;
default:
weiName = 'ether';
break;

}
return weiName;
}

/**
* 获得ERC20代币余额
* @param {*} tokenAddress 代币的合约
* @param {*} address 钱包地址
* @returns ERC20代币余额
*/
const getTokenBalance = (tokenAddress, address) => {
return new Promise(async (resolve, reject) => {
let tokenContract = new web3.eth.Contract(erc20Abi, tokenAddress);
let result = await tokenContract.methods.balanceOf(address).call();
let decimals = await tokenContract.methods.decimals().call();
let weiName = getWeiName(decimals);
let tokenBalance = web3.utils.fromWei(result, weiName);
resolve(tokenBalance);
})
}

async function main() {
let BnbBusdLp = await getPair(addresses.WBNB, addresses.BUSD);
let BusdPerBnb = await getTokenBalance(addresses.BUSD, BnbBusdLp) / await getTokenBalance(addresses.WBNB, BnbBusdLp);
console.log("BNB price: $"+BusdPerBnb.toFixed(2))
let BusdDaiLp = await getPair(addresses.BUSD, addresses.DAI);
let DaiPerBusd = await getTokenBalance(addresses.DAI, BusdDaiLp) / await getTokenBalance(addresses.BUSD, BusdDaiLp);
console.log("BUSD price: $"+DaiPerBusd.toFixed(2))
}

main();

效果:

image.png