簡體   English   中英

如何發送wei/eth到合約地址? (使用松露 javascript 測試)

[英]How to send wei/eth to contract address? (using truffle javascript test)

我正在嘗試將 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));
)}

由於您沒有在問題中提供合同,因此我在這里假設您的合同如下所示。

文件路徑

./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()關鍵字之間差異的更多信息。

我的解決方案的完整源代碼可以在這里找到。

解決了! 我忘了我必須像這樣通過 web3 和 eth 發送交易:

web3.eth.sendTransaction({})

不管怎么說,還是要謝謝你!

你 myst 發送到一個地址,而不是一個對象。

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

用於在您的松露測試文件中使用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)
    });
});

您好,您剛剛忘記了 instance.send 之前的 await,因此調用 get balance 不會“看到”發送的以太幣,希望對未來的讀者有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM