本文目标

实现测试网络下面

  • BNB编码实现兑换USDC
  • USDC TOKEN 编码实现兑换 BNB

为后续批量操作打下一定的基础,能够快速批量起号以及交互项目操作做一个前期的实践。

例如pancakeswap IFO中需要批量存入价值100U的cake,那么通过这次实践,再举一反三。我们就可以快速将BNB或者BUSD等兑换cake,并动态存入指定的账号等。同时也是为了熟悉一下BSC链条的操作和使用。

以上都是在测试网络下进行的,跟真实网络差异应该不太。测试网络编码练习主要是不要钱。

添加BSC测试网络

因为正式版测试需要消耗BNB,练手的话直接去测试网络体验吧。

打开区块链浏览器地址:https://testnet.bscscan.com/

点击网页底部添加测试网络到metamask:

查看成功添加到BSC-TESTNETWORK

image-20211226174035501

网络名称:Binance Smart Chain Testnet

PRC URLhttps://data-seed-prebsc-1-s1.binance.org:8545/

链ID:97

Currency Symbol:tBNB

区块浏览器https://testnet.bscscan.com/

有了这些信息,我们就可以直接通过web3js链接bsc测试网络了

BSC testnet 水龙头获得BSC以及其他代币

BSC官方水龙头

先生成一个属于自己的BSC钱包地址,可以直接使用metamask复制钱包地址即可

https://testnet.binance.org/faucet-smart

获得1TBNB来进行测试(为方便,本文后续将TBNB写成BNB了,本文其他处均以BNB指代TBNB)

image-20211226191719496

LINK第三方水龙头

之前领取了LINK,LINk合约地址是:https://testnet.bscscan.com/address/0x84b9b910527ad5c03a9ca831909e21e236ea7b06

实现目标

我想把bnb换成USDC

按道理应该是先由BNB换成WBNB然后再由WBNB换成USDC

找个可以兑换的银行:https://testnet.bscscan.com/tx/0xf8b9aa58db90c335e778e5bb338d0026f79460766d04255cca15ba9c16509024

这里是一个是一个叫BakerySwapRouter的兑换路由,应该可以理解为跟pancakeswap差不多的swap吧

https://testnet.bscscan.com/address/0xcde540d7eafe93ac5fe6233bee57e1270d3e330f

该协议可以看到一个方法 SwapExactBNBForTokens

image-20211226211111642

image-20211226211330527

看到方法中的参数了,提取一下信息,那么我们需要将0.1个BNB兑换成USDC

首先我们需要兑换0.1个BNB,转换成WEI:100000000000000000

WBNB合约地址:0x094616f0bdfb0b526bd735bf66eca0ad254ca81f

USDC合约地址:0x0644014472cD39f51f57ce91be871537D7A5A2Ab

BakerySwapRouter合约地址:0xCDe540d7eAFE93aC5fE6233Bee57E1270D3E330F

先查一下汇率0.1个BNB可以兑换差不多2402个USDC

image-20211226211638657

代码实现BNB兑换USDC

依葫芦(主要是葫芦)画瓢(不明白的老板可以参考我之前的文章有详细说明实现这段代码的过程)实现兑换代码。

const Web3 = require(‘web3’);

const web3 = new Web3(Web3.givenProvider ‘https://data-seed-prebsc-1-s1.binance.org:8545')

// read json file
const fs = require(‘fs’);
const path = require(‘path’);
const filePath = path.join(__dirname, ‘./bakerySwapRouter.json’);
const jsonfile = JSON.parse(fs.readFileSync(filePath, ‘utf8’));
// json encode
const abi = JSON.parse(jsonfile.result);

const privateKey = ‘your_private_key’

let amount_eth = web3.utils.toWei(‘0.1’, ‘ether’) // 需要兑换的ETH个数,改这个就好
let amount_swap = web3.utils.toWei(‘0’, ‘ether’)  //amountOutMin 最小转账金额

console.log(“amount_eth”, amount_eth);
console.log(“amount_swap”, amount_swap);


// 需要兑换的合约地址
// 这里是链式调用,会先将ETH兑换成WETH,然后再兑换成DAI
let address_list = [
 ‘0x094616f0bdfb0b526bd735bf66eca0ad254ca81f’, //wbnb
 ‘0x0644014472cD39f51f57ce91be871537D7A5A2Ab’ //usdc
]

// 接受代币的地址,如果是自己的话就填自己就好
const to = ‘0xb23B27077aC999924B460C374E5f9192B4fAF16E’

// uniswap合约地址
const contract_address = ‘0xCDe540d7eAFE93aC5fE6233Bee57E1270D3E330F’



main = async () => {

 const data = new Date()

 const timestamp = data.getTime()

 const deadline = timestamp + 1000 * 60 * 3

 const contract = new web3.eth.Contract(abi, contract_address)
 // transfer
 
 const account = web3.eth.accounts.privateKeyToAccount(privateKey)
 gasPrice = await web3.eth.getGasPrice()
 console.log(‘gasPrice:’, gasPrice);
 const tx = {
   nonce: await web3.eth.getTransactionCount(account.address),
   from: account.address,
   to: contract_address,
   value: amount_eth,
   gas: 220000,
   gasPrice: gasPrice,
   data: contract.methods.swapExactBNBForTokens(
     amount_swap,
     address_list,
     to,
     deadline
    ).encodeABI()
}
 console.log(tx);
 
 const signedTx = await account.signTransaction(tx)
 const result = await web3.eth.sendSignedTransaction(signedTx.rawTransaction)
 console.log(result)
}

main()

等一会转账成功,获得转账hash:0x11723dc3aa4f8b7fed362a7a44388ffcea77b4ee38a527af63e8e7b29628c6c9

image-20211226212853311

账号里就多了2402个USDC,跟刚才查询的数字是差不多的。

USDC兑换BNB

image-20211226213243039

现在账号里有0.89个BNB,2402个USDC,用100个USDC兑换BNB查询下汇率

image-20211226213351837

差不多能兑换0.006个BNB

方法:swapExactTokensForBNB

如果直接改上面的代码运行时会出错的

image-20211227110122444

查看错误转账hash:0xe97c6d55ca184d167dbe820bb1c83371f57084f9a06258c4e1863b27636c2866,

后来查询ERC-20标准发现,需要在转账之前,先approve才可以转账。我理解为批准授权该合约才能进行转账。

PS:想了解更多的老板可以参考ERC20标准详解

例如我们这里使用BakerySwapRouter进行兑换,那么就是需要在USDC合约上approve我们的BakerySwapRouter操作我们的账号转账。

BakerySwapRouter合约地址是:0xCDe540d7eAFE93aC5fE6233Bee57E1270D3E330F

在USDC合约区块链浏览器下

https://testnet.bscscan.com/address/0x0644014472cD39f51f57ce91be871537D7A5A2Ab#writeContract

我懒得写代码了,直接网页端调用approve方法

image-20211227105024930

approve调用成功的hash:https://testnet.bscscan.com/tx/0x42be3483f90fe6e85883e4f67b3f2649d6493e13eaec1cc9a9ae93fb6329da97

这样我们就成功授权了在USDC合约下面,我们可以使用BakerySwapRouter合约操作我们账号下的USDCtoken了

编写代码实现USDC兑换BNB

const Web3 = require(‘web3’);

const web3 = new Web3(Web3.givenProvider ‘https://data-seed-prebsc-1-s1.binance.org:8545')

// read json file
const fs = require(‘fs’);
const path = require(‘path’);
const filePath = path.join(__dirname, ‘./bakerySwapRouter.json’);
const jsonfile = JSON.parse(fs.readFileSync(filePath, ‘utf8’));
// json encode
const abi = JSON.parse(jsonfile.result);

const privateKey = ‘your_private_key’

let amount_eth = web3.utils.toWei(‘0’, ‘ether’) // 需要兑换的ETH个数
let amount_swap = web3.utils.toWei(‘100’, ‘ether’)  //amountOutMin 最小转账金额

console.log(“amount_eth”, amount_eth);
console.log(“amount_swap”, amount_swap);


// 需要兑换的合约地址
// 这里是链式调用,会先将ETH兑换成WETH,然后再兑换成DAI
let address_list = [
 ‘0x0644014472cD39f51f57ce91be871537D7A5A2Ab’, //USDC
 ‘0x094616f0bdfb0b526bd735bf66eca0ad254ca81f’, //WBNB
 
]

// 接受代币的地址,如果是自己的话就填自己就好
const to = ‘0xb23B27077aC999924B460C374E5f9192B4fAF16E’

// swap合约地址
const contract_address = ‘0xCDe540d7eAFE93aC5fE6233Bee57E1270D3E330F’



main = async () => {

 const data = new Date()

 const timestamp = data.getTime()

 const deadline = timestamp + 1000 * 60 * 3

 const contract = new web3.eth.Contract(abi, contract_address)
 // transfer
 
 const account = web3.eth.accounts.privateKeyToAccount(privateKey)
 gasPrice = await web3.eth.getGasPrice()
 console.log(‘gasPrice:’, gasPrice);
 const tx = {
   nonce: await web3.eth.getTransactionCount(account.address),
   from: account.address,
   to: contract_address,
   value: ‘0x0’,
   gas: 220000,
   gasPrice: gasPrice,
   data: contract.methods.swapExactTokensForBNB(
     amount_swap,
     100000000,
     address_list,
     to,
     deadline
    ).encodeABI()
}
 console.log(tx);
 
 const signedTx = await account.signTransaction(tx)
 const result = await web3.eth.sendSignedTransaction(signedTx.rawTransaction)
 console.log(result)
}

main()

转账成功hash:

0xd09b98b64bbb7b7072a5fef220066114e4720ddcc215a4bb9ea8984a8d5d585e

复制到区块链浏览器查询:

image-20211227110630552

总结

至此,我们就完成了由BNB兑换USDC token。再由USCD token回到BNB的整个过程。

BNB 兑换 Token

方法名:SwapExactBNBForTokens

需要往swap合约地址转账BNB代币,再由swap合约兑换WBNB,WBNB回兑换成你需要的Token

Token兑换BNB

方法名:approveswapExactTokensForBNB

1.需要先到对应Token下面approve批准授权合约地址能够操纵你账号里的Token

2.再调用合约转账0BNB,在信息tx上带上需要兑换的Token兑换BNB

3.由Token->WBNB->BNB回到你的账户,在BET-20-token-txns中就可以看到

image-20211227112302091

到这里基本上了解了BSC网络应该怎么通过代码去玩了,作为新人还是有很多疑惑和好奇的领域需要去探索。欢迎各位老板指点和交流。

现在得到了一份baby外挂的代码,后续可能顺着这个代码复盘一下思路。