如何发送wei/eth到合约地址?(使用truffle javascript测试)

Adr*_*lin 4 testing blockchain ethereum solidity truffle

我正在尝试将 wei/eth 发送到我的 Solidity 合约的地址,该合约具有外部应付回退功能。我下面的 truffle javascript 测试不会导致 instance.address 的余额获得任何 wei。instance.address不是接收wei的智能合约地址吗?有人能发现为什么 console.logging 余额结果为 0 吗?或者发现我错过了什么?

谢谢!

const TestContract = artifacts.require("TestContract");


contract('TestContract', async (accounts) => { 

it('should send 1 ether to TestContract', async () => {
  let instance = await TestContract.deployed();

  instance.send({from: accounts[1], value: 1000000000000000000}); 
  let balance = await web3.eth.getBalance(instance.address);
  console.log('instance.address balance: ' + parseInt(balance));
)}
Run Code Online (Sandbox Code Playgroud)

Zul*_*din 6

由于您没有在问题中提供合同,因此我在这里假设您的合同如下所示。

文件路径

./contracts/TestContract.sol

pragma solidity ^0.4.23;

contract TestContract {

    // all logic goes here...

    function() public payable {
        // payable fallback to receive and store ETH
    }

}
Run Code Online (Sandbox Code Playgroud)

这样,如果你想将 ETH 从 JS 发送accounts[1]TestContract使用的 JS,请按以下步骤操作:

文件路径

./test/TestContract.js

const tc = artifacts.require("TestContract");

contract('TestContract', async (accounts) => {

    let instance;

    // Runs before all tests in this block.
    // Read about .new() VS .deployed() here:
    // https://twitter.com/zulhhandyplast/status/1026181801239171072
    before(async () => {
        instance = await tc.new();
    })

    it('TestContract balance should starts with 0 ETH', async () => {
        let balance = await web3.eth.getBalance(instance.address);
        assert.equal(balance, 0);
    })

    it('TestContract balance should has 1 ETH after deposit', async () => {
        let one_eth = web3.toWei(1, "ether");
        await web3.eth.sendTransaction({from: accounts[1], to: instance.address, value: one_eth});
        let balance_wei = await web3.eth.getBalance(instance.address);
        let balance_ether = web3.fromWei(balance_wei.toNumber(), "ether");
        assert.equal(balance_ether, 1);
    })

})
Run Code Online (Sandbox Code Playgroud)

.new()请参阅我在上面代码中的评论,以了解有关 Truffle 中和关键字之间的差异的更多信息.deployed()

我的解决方案的完整源代码可以在这里找到。

  • 现在可以使用 web3.utils.toWei 来转换为 wei (2认同)