背景:
OKC自上线以来,一直存在一个问题,就是无法使用Hardhad和ethers.js进行部署和调用合约,这个问题为很多熟悉使用hardhat和ethers.js的开发者带来了不便和困扰。
原因:
OKC不支持Hardhad和ethers.js的根本原因在于,ehters.js在部署和调用合约的时候,会先在本地计算好交易哈希,然后与从链上获取的交易哈希做对比,如果交易哈希不一致就会报错。etherjs.js在本地计算交易哈希的方法是和以太坊一致的,而OEC计算交易哈希的算法和以太坊的不一致,因此就导致使用ethers.js在OEC上部署和调用合约的时候报交易哈希不一致的错误。
由于hardhat底层是依赖于ethers.js的,因此使用hardhat部署和调用合约的时候也会存在相同的问题。
现状:
经过OKC团队的努力,现已经将OKC的交易哈希算法升级,与以太坊保持一致,并已在OKC主网和测试网上线。经过在测试网测试,目前已经可以使用Hardhad和ethers.js在OKC测试网上进行部署和调用合约,体验如丝般顺滑。
测试:
下面贴出一段使用hardhat部署uniswap的代码脚本,和测试结果
const { ethers } = require("hardhat");
const FEE_TO_SETTER = "0x0000000000000000000000000000000000000000"
const WOKT_ADDRESS = "0x2219845942d28716c0F7C605765fABDcA1a7d9E0"
async function addLiquidity() {
let owner
[owner] = await ethers.getSigners();
console.log("deploying mock token ...")
const MockToken = await ethers.getContractFactory("mockERC20")
const tokenA = await MockToken.deploy()
console.log("tokenA deployed at : " + tokenA.address)
const tokenB = await MockToken.deploy()
console.log("tokenB deployed at : " + tokenB.address)
console.log("minting mock token ...")
await tokenA.mint(owner.address, ethers.utils.parseEther('10000'))
await tokenB.mint(owner.address, ethers.utils.parseEther('10000'))
console.log("tokenA balance: " + await tokenA.balanceOf(owner.address))
console.log("tokenB balance: " + await tokenB.balanceOf(owner.address))
console.log("deploying swap ...")
const PairFactory = await ethers.getContractFactory("UniswapV2Factory")
const Router = await ethers.getContractFactory("UniswapV2Router02")
const pairFactory = await PairFactory.deploy(FEE_TO_SETTER)
const hash = await pairFactory.getHash()
const router = await Router.deploy(pairFactory.address, WOKT_ADDRESS, hash)
console.log("pair code hash: " + hash)
console.log("router factory deployed at : " + router.address)
console.log("pair factory deployed at : " + pairFactory.address)
console.log("approving token ...")
await tokenA.approve(router.address, ethers.utils.parseEther('10000'))
await tokenB.approve(router.address, ethers.utils.parseEther('10000'))
console.log("adding liquidity ...")
await router.addLiquidity(
tokenA.address,
tokenB.address,
ethers.utils.parseEther('10000'),
ethers.utils.parseEther('10000'),
0,
0,
owner.address,
Date.now() + 86400
)
const pairAddress = await pairFactory.getPair(tokenA.address, tokenB.address)
const Pair = await ethers.getContractFactory("UniswapV2Pair")
const pair = await Pair.attach(pairAddress)
const LPBalance = await pair.balanceOf(owner.address)
console.log("LP balance: " + LPBalance)
}
addLiquidity()
执行命令:
hardhat run scripts/addLiquidityTest.js --network OECTestnet
测试结果如下:
deploying mock token ...
tokenA deployed at : 0xaf5E2955D3b3c0f9Ddee0Eb3cEBAaB0557790BA4
tokenB deployed at : 0x5a22Eb62C851ee54248E953E3AF681974A3b52e7
minting mock token ...
tokenA balance: 10000000000000000000000
tokenB balance: 10000000000000000000000
deploying swap ...
pair code hash: 0x49018e33b4fcecd6638ed4ea6338be0821c5bb2fb8d1224da42df2a3960c873f
router factory deployed at : 0xC78678e91812B010D13F807408934560F0C935d1
pair factory deployed at : 0x6644BE9e283cACA2Ddbf8FBE55943E012395099D
approving token ...
adding liquidity ...
LP balance: 9999999999999999999000
通过测试我们可以看出,使用hardhat可以成功在OKC测试网上进行部署和调用合约,并且相对于以太坊,速度更快,手续费更低。