reactjs 如何从React前端向智能合约发送可变数量的以太币?

p1tboqfb  于 2023-06-29  发布在  React
关注(0)|答案(3)|浏览(167)

我正试图从我的React前端向我的智能合约发送一个可变数量的以太坊。在混音,我可以做到这一点没有问题,只需选择金额和发送它与功能
在我的前端,这是一个函数,其中values.amount是100 wei

const sendEth = async(e) => {
  e.preventDefault()
  try {
    const { ethereum } = window;

    if (ethereum) {
      const provider = new ethers.providers.Web3Provider(ethereum);
      const signer = provider.getSigner();
      const connectedContract = new ethers.Contract(CONTRACT_ADDRESS, escrowAbi.abi, signer);
      let nftTxn = await connectedContract.depositEth(values.amount);
        
      console.log("Mining...please wait.", nftTxn)
      await nftTxn.wait();
      
      console.log(`Mined, see transaction: https://rinkeby.etherscan.io/tx/${nftTxn.hash}`);
      // console.log(connectedContract)

    } else {
      console.log("Ethereum object doesn't exist!");
    }
  } catch (error) {
    console.log(error)
  }

}
在我的智能合约中,这是我的depositEth函数-然而msg.value是我想要传递的参数,但我不能将其作为参数传递给此函数?
仅供参考,在我的应用程序,一旦你他们支付eth的合同,它将释放一个NFT。

function depositEth() public payable hasToken(address(this), nftAddress)  {
        require(msg.value == amountOwed, 'You ow more money');
        buyerAddress = payable(msg.sender);

        if(walletHoldsToken(address(this),nftAddress)) {
         ERC721(nftAddress).safeTransferFrom(address(this), buyerAddress, tokenID);
        }
    }

所以我想问的是,我如何将x数量的eth发送到一个在前端定义了该值的合约?

mcvgt66p

mcvgt66p1#

在你的智能合约中定义一个函数来返回所欠的金额:

function getOwedAmount() public view returns (uint256) {
    // i  am assuming " amountOwed" is state variable, uint256
    return amountOwed;
  }

创建合同后。

const connectedContract = new ethers.Contract(CONTRACT_ADDRESS, escrowAbi.abi, signer)

获取拥有量

let owedAmount = await contract.getOwedAmount();
owedAmount=owedAmount.toString()
let transaction=await connectedContract.depositEth({value:owedAmount})
await transaction.wait();

由于depositEth是可支付,我们可以将最后一个参数作为一个对象传递,指定我们发送的金额,Solidity将自动将金额分配给msg.value

tjvv9vkg

tjvv9vkg2#

您的depositEth()函数需要0个参数,因此JS代码段也需要传递0个参数。
ethers中有overrides对象,总是在常规函数参数之后传递(在您的情况下,在第一个位置,因为有0个参数),允许修改调用函数的事务的某些字段,包括它的value

let nftTxn = await connectedContract.depositEth({
    value: values.amount
});
8iwquhpp

8iwquhpp3#

从ethers库调用parseEther即可。

let nftTxn = await connectedContract.depositEth(address, { value: ethers.utils.parseEther("0.0000000000000001") });

//发送100 wei的等待事务.wait()

相关问题