Ethereum 使用Drizzle在Metamask中选择当前帐户

Ethereum 使用Drizzle在Metamask中选择当前帐户,ethereum,web3,metamask,drizzle,Ethereum,Web3,Metamask,Drizzle,如何(在细雨中)获取Metamask中当前选定的帐户 我有一个函数可以调用智能合约的方法set,但当前帐户是“硬编码的”: i、 e.in:from:drizzleState.accounts[0] 如何将from:字段更改为使用元掩码中选择的帐户?状态。帐户[0]本身表示元掩码中选择的帐户作为默认帐户。如果在Metamask中选择其他帐户,则drizzleState.accounts[0]的值会随之自动更改 我编写了一个示例组件,演示了AccountData组件和处于Drizzle状态的帐户信

如何(在细雨中)获取Metamask中当前选定的帐户

我有一个函数可以调用智能合约的方法
set
,但当前帐户是“硬编码的”:

i、 e.in:
from:drizzleState.accounts[0]


如何将
from:
字段更改为使用元掩码中选择的帐户?

状态。帐户[0]本身表示元掩码中选择的帐户作为默认帐户。如果在Metamask中选择其他帐户,则drizzleState.accounts[0]的值会随之自动更改

我编写了一个示例组件,演示了AccountData组件和处于Drizzle状态的帐户信息的问题。我还提供了一种直接使用web3api的解决方法

import React, { useState, useEffect } from "react";
import { newContextComponents } from "@drizzle/react-components";

const { AccountData } = newContextComponents;

const AccountChangeDetection = ({ drizzle, drizzleState }) => {

  const [ drizzleAcc, setDrizzleAcc ] = useState(drizzleState.accounts[0]);
  const [ drizzleBal, setDrizzleBal ] = useState(drizzleState.accountBalances[drizzleState.accounts[0]]);

  const [ web3Acc, setWeb3Acc ] = useState(null);
  const [ web3Bal, setWeb3Bal ] = useState(null);


  useEffect(() => {

    function loadWeb3Data(web3) {
      web3.eth.getAccounts()
      .then( accounts => {
        setWeb3Acc(accounts[0]);
        web3.eth.getBalance(accounts[0])
        .then(setWeb3Bal);
      } );
    }

    async function listenMMAccount() {
      window.ethereum.on("accountsChanged", async function () {
        // console.log("Account changed");
        // console.log(drizzleState.accountBalances[drizzleState.accounts[0]]);
        setDrizzleAcc(drizzleState.accounts[0]);
        setDrizzleBal(drizzleState.accountBalances[drizzleState.accounts[0]]);
        loadWeb3Data(drizzle.web3);
      });
    }

    loadWeb3Data(drizzle.web3);
    listenMMAccount();
  });

  return (
    <div>

      <strong>AccountData</strong>
      <AccountData
        drizzle={drizzle}
        drizzleState={drizzleState}
        accountIndex={0}
        units="ether"
        precision={3}
      />

      <table>
        <tbody>
          <tr>
            <td>Drizzle</td>
            <td>{drizzleAcc}</td>
            <td>{drizzleBal}</td>
          </tr>
          <tr>
            <td>Web3</td>
            <td>{web3Acc}</td>
            <td>{web3Bal}</td>
          </tr>
        </tbody>
      </table>
    </div>
  );
};

export default AccountChangeDetection;
import React,{useState,useffect}来自“React”;
从“@drizzle/react components”导入{newContextComponents}”;
const{AccountData}=newContextComponents;
const AccountChangeDetection=({drizzle,drizzleState})=>{
const[drizzleAcc,setDrizzleAcc]=useState(drizzleState.accounts[0]);
const[drizzleBal,setDrizzleBal]=useState(drizzleState.accountBalances[drizzleState.accounts[0]];
const[web3Acc,setWeb3Acc]=useState(null);
const[web3Bal,setWeb3Bal]=useState(null);
useffect(()=>{
函数加载Web3DATA(web3){
web3.eth.getAccounts()
。然后(帐户=>{
setWeb3Acc(账户[0]);
web3.eth.getBalance(账户[0])
。然后(setWeb3Bal);
} );
}
异步函数listenMMAccount(){
on(“accountsChanged”,异步函数(){
//控制台日志(“帐户已更改”);
//log(drizzleState.accountBalances[drizzleState.accounts[0]]);
setDrizzleAcc(drizzleState.accounts[0]);
setDrizzleBal(drizzleState.accountBalances[drizzleState.accounts[0]]);
loadWeb3Data(drizzle.web3);
});
}
loadWeb3Data(drizzle.web3);
listenMMAccount();
});
返回(
会计数据
下蒙蒙细雨
{drizzleAcc}
{毛毛雨}
Web3
{web3Acc}
{web3Bal}
);
};
导出默认AccountChangeDetection;

最好的方法是为“细雨”选项添加一个选项,以便它可以在浏览器中检测web3对象

将毛毛雨选项代码编辑到下面

  web3: {
    block: false,
    customProvider: new Web3(Web3.givenProvider || "ws://localhost:8545"),
    // customProvider: new Web3("wss://kovan.infura.io/ws/v3/5b2a79e624554c8ab922b9a84b076645"),

  },

我已经能够重现这个问题。如果我在metamask中切换帐户,drizzleState.accounts和drizzleState.accountBalances将保持不变。@JorgeM.LondoñoP。问题集设置正确了吗?确保已正确设置drizzleOptions的web3属性,并具有回退值。。并且还将帐户“polls”设置为某个值(如1500)。我正在测试它,但是
drizzle状态
没有改变。如何注入drizzle对象?使用DrizzleProvider注入drizzle并订阅当前区块和帐户更改中的更改?我应该提到,我现在使用的是最新版本:@drizzle/react-plugin@1.5.1, web3@1.2.7Well,至少在新版本中,它会断掉毛毛雨。
  web3: {
    block: false,
    customProvider: new Web3(Web3.givenProvider || "ws://localhost:8545"),
    // customProvider: new Web3("wss://kovan.infura.io/ws/v3/5b2a79e624554c8ab922b9a84b076645"),

  },