其他分享
首页 > 其他分享> > Dapp TokenFarm开发(3)---合约开发

Dapp TokenFarm开发(3)---合约开发

作者:互联网

2 区块链开发

2.0 区块链项目初始化

2.0.0 项目解析

我们开发的Dapp 是需要用户把代币(mDai Token) 质押到我们的Dapp(TokenFarm),然后我们发送空投代币(Dapp Token)作为奖励给到用户

我们使用 Ganache 与 truffle 来进行开发与测试

2.0.1 Migrations

Migrations 是 truffle 实现快速部署新合约的配置合约

truffle migrate
即可快速更新合约

2.1 初尝试

我们已经在contracts 中有 两个erc20(标准代币合约) 的文件,各有1000000*10^18 wei,如果看不懂请自行谷歌一下,在这里不详细解析

2.1.0 创建TokenFarm合约

我们在 src/contracts 创建一个solidity 合约文件 TokenFarm.sol 如下

pragma solidity ^0.5.0;

contract TokenFarm {
	
  string public name = "Dapp Token Farm";
}

2.1.1 配置部署文件

然后在 migrations 中添加合约部署文件 2_deploy_contracts.js 如下

const TokenFarm = artifacts.require("TokenFarm");
const DappToken = artifacts.require("DappToken");
const DaiToken = artifacts.require("DaiToken");

module.exports =async function(deployer,network,accounts) {
  // 部署合约
  await deployer.deploy(DaiToken)
  const daiToken = await DaiToken.deployed()
  await deployer.deploy(DappToken)
  const dappToken = await DappToken.deployed()


  await deployer.deploy(TokenFarm)
  const tokenFarm = await TokenFarm.deployed()
};

2.1.2 创建测试文件

根目录下创建文件 test 文件夹

test 文件夹创建文件 TokenFarm.test.js

用作测试文件

const { assert } = require('chai');

const TokenFarm = artifacts.require("TokenFarm");
const DappToken = artifacts.require("DappToken");
const DaiToken = artifacts.require("DaiToken");

require('chai').use(require('chai-as-promised')).should()

2.1.3 Ganache 部署

然后打开 Ganache 点 QuickStart 快速部署一条区块链

配置 Ganache 端口与 truffle.config.js 保持一致(均为7545)

2.1.4 合约部署

  1. 终端输入 truffle compile 编译合约文件生成 uri

  2. 终端输入 truffle migrate 即可部署合约到区块链中

出现一堆代码,还有Ganache 多出几条交易

我们看到下面这条表示部署成功了

2.1.5 测试

继续编写测试代码 truffle.config.js 如下

contract('TokenFarm', ([owner, investor]) => {
  let daiToken, dappToken, tokenFarm

  before(async ()=>{
    // 加载合约
    daiToken = await DaiToken.new()
    dappToken = await DappToken.new()
    tokenFarm = await TokenFarm.new()

    // 把所有的代币发送给tokenFarm
    await dappToken.transfer(tokenFarm.address, tokens('1000000'))

    // 发送100 给代币到用户
    await daiToken.transfer(investor, tokens('100'), { from: owner })
  })

  // 测试 daiToken 合约 name 属性 返回值是否为 'Mock DAI Token'
  describe('Mock Dai deployment', async ()=>{
    it('has a name', async ()=>{
      const name = await daiToken.name()
      assert.equal(name,'Mock DAI Token')
    })
  })

  // 测试 DappToken 合约 name 属性 返回值是否为 'Dapp Token'
  describe('peiqi', async ()=>{
    it('has a name', async ()=>{
      const name = await daiToken.name() // error
      assert.equal(name,'Dapp Token')
    })
  })
  }
)

然后终端输入 truffle test 测试

结果如下

'Mock Dai deployment' 测试成功

'peiqi' 测试失败了(因为 dappToken.name() 改成了 daiToken.name() )

最终代码改成如下

const { assert } = require('chai');

const TokenFarm = artifacts.require("TokenFarm");
const DappToken = artifacts.require("DappToken");
const DaiToken = artifacts.require("DaiToken");

require('chai').use(require('chai-as-promised')).should()

contract('TokenFarm', ([owner, investor]) => {
  let daiToken, dappToken, tokenFarm

  before(async ()=>{
    // 加载合约
    daiToken = await DaiToken.new()
    dappToken = await DappToken.new()
    tokenFarm = await TokenFarm.new()

    // 把所有的代币发送给tokenFarm
    await dappToken.transfer(tokenFarm.address, tokens('1000000'))

    // 发送100 给代币到用户
    await daiToken.transfer(investor, tokens('100'), { from: owner })
  })

  // 测试 daiToken 合约 name 属性 返回值是否为 'Mock DAI Token'
  describe('Mock Dai deployment', async ()=>{
    it('has a name', async ()=>{
      const name = await daiToken.name()
      assert.equal(name,'Mock DAI Token')
    })
  })

  // 测试 DappToken 合约 name 属性 返回值是否为 'Dapp Token'
  describe('Dapp Token deployment', async ()=>{
    it('has a name', async ()=>{
      const name = await dappToken.name() // 已更正
      assert.equal(name,'DApp Token')
    })
  })
  }
)

终端输入truffle test 测试结果如下

两个测试都打钩成功通过了

标签:const,name,require,await,daiToken,---,Dapp,TokenFarm
来源: https://www.cnblogs.com/Jerrvis/p/16314056.html