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

Posted

技术标签:

【中文标题】如何将 wei/eth 发送到合约地址? (使用 truffle javascript 测试)【英文标题】:How to send wei/eth to contract address? (using truffle javascript test) 【发布时间】:2019-03-15 09:47:33 【问题描述】:

我正在尝试将 wei/eth 发送到我的 Solidity 合约的地址,该合约具有外部应付回退功能。我下面的松露 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));
)

【问题讨论】:

您是否尝试从accounts[1]TestContract 发送1 ETH? 是的!好吧,明确地指向 TestContract 的实例地址。 【参考方案1】:

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

文件路径

./contracts/TestContract.sol

pragma solidity ^0.4.23;

contract TestContract 

    // all logic goes here...

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


这样,如果你想使用 JS 将 ETH 从accounts[1] 发送到TestContract,这里是如何做到的:

文件路径

./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);
    )

)

查看我在上面代码中的注释,了解更多关于 Truffle 中 .new().deployed() 关键字之间的区别。

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

【讨论】:

现在可以使用web3.utils.toWei转换为wei【参考方案2】:

解决了!我忘了我必须像这样通过 web3 和 eth 发送交易:

web3.eth.sendTransaction()

还是谢谢!

【讨论】:

【参考方案3】:

你可能会发送到一个地址,而不是一个对象。

instance.send(from: accounts[1], value: 1000000000000000000);

【讨论】:

啊!更改了该行但得到:TypeError: instance.address.send is not a function【参考方案4】:

用于在您的 truffle 测试文件中使用 Web3.js v1.4.0

const SolidityTest = artifacts.require('SolidityTest');

contract('SolidityTest', (accounts) => 

    let solidityTest;

    before(async () => 
        solidityTest = await SolidityTest.new();
    )

    it('Test something', async () => 

        // Send 100 wei to the contract.
        // `sendEth` is your payable method.
        await solidityTest.sendEth(from: accounts[1], value: 100);

        // Check account 1 balance.
        let acc1Balance = await web3.eth.getBalance(accounts[1]);
        // Convert the unit from wei to eth
        acc1Balance = web3.utils.fromWei(acc1Balance, 'ether')
        console.log('acc1 balance:', acc1Balance)

        // Check the contract balance.
        let contractBalance = await web3.eth.getBalance(solidityTest.address);
        contractBalance = web3.utils.fromWei(contractBalance, 'ether')
        console.log('contract balance:', contractBalance)
    );
);

【讨论】:

【参考方案5】:

您好,您只是忘记了 instance.send 之前的 await,因此调用 get balance 时不要“看到”发送的以太币,希望对未来的读者有所帮助

【讨论】:

您能否提供一个工作代码 sn-p 来进一步解释您的解决方案?

以上是关于如何将 wei/eth 发送到合约地址? (使用 truffle javascript 测试)的主要内容,如果未能解决你的问题,请参考以下文章

我如何存储合约地址

智能合约将 eth 转移到地址失败

自动将收到的以太币从一个地址转移到另一个地址

如何将 ERC20 代币发送到智能合约余额?

如何测试将以太币发送到具有“应付”功能的合约?

从另一个合约发送 ERC-20 代币