在这一讲中,我们将用Truffle对上一讲中的SimpleArbi.sol进行测试。
首先,我们需要从Alchemy.com申请一个免费的web3 provider:
注册成功后,点击Create App,选择Ethereum Mainnet,然后在生成的App后面找到view key,将里面的http url保存到本地,以后我们与以太坊进行交互,都要通过这个http url来发送JSON-RPC请求。
如果还没有安装Truffle:
npm install -g truffle
我们建立一个Deploy目录,在里面初始化一个Truffle工程:
mkdir ~/Projects/Deploy
cd ~/Projects/Deploy
truffle init
我们看到它自动生成了几个目录:
build: 存放编译好的智能合约abi
contracts: 存放智能合约的源代码
migrations: 存放部署脚本
首先我们打开truffle-config.js,做一些基本配置:
在networks中的development项,配置测试环境下的IP、端口以及network_id,同时把skipDryRun设置为true。
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*",
skipDryRun: true
},
},
在compilers项,设置solidity的版本号(0.8.0),optimizer enabled设置为true。
compilers: {
solc: {
version: "0.8.0",
settings: {
optimizer: {
enabled: true,
runs: 200
},
}
}
}
然后,在migrations目录下,新建一个脚本2_deploy_contracts.js,通过这个脚本告诉truffle如何部署我们的合约:
var SimpleArbi = artifacts.require("../contracts/SimpleArbi.sol");module.exports = function(deployer, network, accounts) {
deployer.deploy(SimpleArbi);
};
接下来,把SimpleArbi.sol文件拷贝到contracts目录下。
下面,我们开始进行编译:
cd ~/Projects/Deploy
truffle compile
当出现Compiled susccesfully using:…的提示时,就表示编译成功了。
下面我们把编译好的智能合约部署在本地的测试环境下。
如果还没有安装Ganache-cli:
npm install -g ganache-cli
打开另外一个Terminal,建立一个以太坊主网的fork环境(后面的https://…是你刚才从Alchemy申请的http url):
ganache-cli --fork https://eth-mainnet.alchemyapi.io/v2/你的api_key
它为我们自动建立了十个测试账户,每个里面有100ETH,在与合约交互时,它会默认使用第一个账户。
回到第一个Terminal中进行部署:
cd ~/Projects/Deploy
truffle migrate
部署成功后,它显示了交易哈希、合约地址等信息:
下面,我们就可以进行测试了。
进入truffle控制台:
cd ~/Projects/Deploy
truffle console
先定义WETH的地址:
WETH = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';
用instance代表合约的实例:
instance = await SimpleArbi.deployed();
查看一下合约的所有者是谁:
owner = await instance.getOwner()
owner
向合约转10个ETH:
instance.send(web3.utils.toWei('10', 'ether'))
调用合约的ETHtoWETH()函数,把5个ETH转换为WETH:
instance.ETHtoWETH(web3.utils.toWei('5', 'ether'))
调用合约的getTokenBalance()函数,检查一下合约中WETH的余额:
weth = await instance.getTokenBalance(WETH, instance.address);
weth.toString();
调用合约的turnOutToken()函数,把WETH转出到所有者的钱包里:
instance.turnOutToken(WETH, weth)
检查一下所有者钱包里的WETH数量:
weth = await instance.getTokenBalance(WETH, accounts[0]);
weth.toString();
最后,我们来测试一下flashLoan()函数,发起一笔闪电贷,:
result = await instance.flashLoan(WETH, web3.utils.toWei('100'))
result
交易成功,如果想看交易日志:
result.receipt.rawLogs
至此,我们在本地的主网fork环境下,对SimpleArbi.sol合约的函数进行了测试,由于测试环境是完全fork主网的,所以就可以放心地部署到主网上面了。下一讲中,我们继续丰富合约代码,在其中加入Dex套利操作。
这一讲的代码在github上同步更新:
欢迎来即刻App与我互动,即刻账号: 月影007