有朋友跟我说,代码基础较差, 但是也想调用智能合约,通过这几天的学习,发现直接通过区块链浏览器也可以实现这个目标。

实现目标

  • 无代码调用智能合约方法,将代币进行兑换
  • 案例1:无代码实现——将ETH兑换成WETH
  • 案例2:编码实现——调用uniswap方法,兑换代币,实现pancakeswap方法

实现过程

  • 调用WETH的合约方法Deposit 方法进行兑换

准备资料

WETH 合约地址 :https://rinkeby.etherscan.io/address/0xc778417e063141139fce010982780140aa0cd5ab

0xc778417e063141139fce010982780140aa0cd5ab

找到兑换方法:Deposit


案例一:尝试测试网络实现兑换

不了解测试网络的老板,可以参考一下我上一篇文章

先兑换WETH,再由WETH兑换其他代币。但是你在使用uniswap合约代码的时候,合约代码会帮你操作这一步。这里我们先手动尝试下利用区块链浏览器进行合约代码的调用。

为什么要兑换WETH

WETH就是“包装过的ETH”(”wrapped ETH”)

以太(Ether 或者ETH)是以太坊(Ethereum)区块链上的原生货币。

其次,是各类其他代币(Alt Tokens/山寨币),这类币就是围绕ETH建立的,符合ERC-20 标准的代币。该标准定义了代币应该如何在以太坊网络上进行转移,以及如保持代币在以太坊网络上的转移能够有一个一致的记录。

ETH本身并不符合自己的 ERC-20标准。

ETH是以太坊网络上的其他币的基本代币,也就是说 ETH在ERC-20标准被制定之前就存在了。所以有了WETH,就能让ETH符合ERC-20标准 能够将ETH兑换成各种代币


在区块链浏览器测试网络进行WETH兑换

rinkeby的WETH合约地址是:

https://rinkeby.etherscan.io/address/0xc778417e063141139fce010982780140aa0cd5ab

通过使用deposit转账,能够获取等量的WETH。

有了WETH之后,就可以进行代币的兑换

案例二:编码调用uniswap方法,兑换代币

区块链浏览器实现步骤:

查看兑换信息,查找方法

查看这条这条兑换信息,方法是Swap Exact Token

https://rinkeby.etherscan.io/tx/0x9a5a17cd13eaf8768dd52bc3e0457d75cc12c8eeb13e27f6977da220224e0da3

查看uniswap V2: Router合约

https://rinkeby.etherscan.io/address/0x7a250d5630b4cf539739df2c5dacb4c659f2488d#code

可以调用swapExactETHForTokens方法来兑换其他代币(token)

刚开始不太会调用,看一下别人如何操作的

https://rinkeby.etherscan.io/tx/0x9a5a17cd13eaf8768dd52bc3e0457d75cc12c8eeb13e27f6977da220224e0da3

看到该方法有几个参数需要调用,具体的说明看上图就可以知道了

依葫芦(主要是葫芦)画瓢,我们在区块链浏览器模仿调用这个方法

调用方法名:swapExactETHForTokens

合约参数:amountOutMin、path、to、deadline

我们想兑换0.001个ETH到DAI代币,所以先换成wei格式为:1000000000000000

已知我们的WETH合约地址是:0xc778417E063141139Fce010982780140Aa0cD5Ab

我们期望兑换的代币是DAI,合约地址是:0x5592EC0cfb4dbc12D3aB100b257153436a1f0FEa

to就是自己的地址:0x601f8D3853b94a062CE2eA960BB3a2F5D033B689

deadline时间的话随便设置一个即可:1640425362

先通过区块链浏览器查询兑换的数目:

https://rinkeby.etherscan.io/address/0x7a250d5630b4cf539739df2c5dacb4c659f2488d#readContract

由上图可知,0.001个ETH可以兑换大约336 个DAI。这里的336918736300705663884单位是wei

编写代码实现

  1. 获取ABI:通过区块链浏览器就可以直接获得https://rinkeby.etherscan.io/address/0x7a250d5630b4cf539739df2c5dacb4c659f2488d#code
  2. 编码实现合约功能,具体代码里说明了
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
const Web3 = require('web3');  

const web3 = new Web3(Web3.givenProvider 'https://rinkeby.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161')

// read json file
const fs = require('fs');
const path = require('path');
const filePath = path.join(\_\_dirname, './uniswap.json');
const jsonfile = JSON.parse(fs.readFileSync(filePath, 'utf8'));
// json encode
const abi = JSON.parse(jsonfile.result);

const privateKey = 'your\_private\_key'

let amount\_swap = web3.utils.toWei('0', 'ether')  //amountOutMin 最小转账金额
let amount\_eth = web3.utils.toWei('0.01', 'ether') // 需要兑换的ETH个数,改这个就好
console.log("amount\_swap", amount\_swap);
console.log("amount\_eth", amount\_eth);

// 需要兑换的合约地址
// 这里是链式调用,会先将ETH兑换成WETH,然后再兑换成DAI
let address\_list = \[
 '0xc778417E063141139Fce010982780140Aa0cD5Ab', //weth
 '0x5592EC0cfb4dbc12D3aB100b257153436a1f0FEa' //dai
\]

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

// uniswap合约地址
const contract\_address = '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D'

const data = new Date()

const timestamp = data.getTime()

const deadline = timestamp + 1000 \* 60 \* 3

main = async () => {
 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.swapExactETHForTokens(
     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()

成功之后输出transactionHash0xc1b9c2ab36f25f04878f50b544bfc61746bf3a8cb094c0a482af8de3fee8868d

通过区块链浏览器查看:https://rinkeby.etherscan.io/tx/0xc1b9c2ab36f25f04878f50b544bfc61746bf3a8cb094c0a482af8de3fee8868d

到此间,我们就完成了使用代码完成pancakeswap的部分功能了。

通过metamask导入DAI的合约,可以看到我们的DAI余额