Получить текущую учетную запись, выбранную в Metamask, используя Drizzle
Как (в Drizzle) получить учетную запись, выбранную в настоящий момент в Metamask?
У меня есть функция для вызова метода set
смарт-контракта, но на данный момент аккаунт "жестко закодирован":
setValue = value => {
const { drizzle, drizzleState } = this.props;
const contract = drizzle.contracts.PartProduction;
// let drizzle know we want to call the `set` method with `value`
const stackId = contract.methods["set"].cacheSend(value, {
from: drizzleState.accounts[0]
});
// save the `stackId` for later reference
this.setState({ stackId });
};
то есть в: from: drizzleState.accounts[0]
,
Как поменять from:
поле для использования учетной записи, выбранной в Metamask?
1 ответ
Сам по себе drizzleState.accounts[0] обозначает учетную запись, выбранную в Metamask в качестве учетной записи по умолчанию. Если вы выберете какую-либо другую учетную запись в Metamask, значение drizzleState.accounts[0] изменится вместе с ней автоматически.
Лучший способ - добавить опцию для опции измороси, чтобы она могла обнаруживать объекты web3 в браузере.
Измените код опции измороси, как показано ниже
web3: {
block: false,
customProvider: new Web3(Web3.givenProvider || "ws://localhost:8545"),
// customProvider: new Web3("wss://kovan.infura.io/ws/v3/5b2a79e624554c8ab922b9a84b076645"),
},
Я написал пример компонента, который демонстрирует проблему как с компонентом AccountData, так и с информацией об учетной записи в drizzleState. Я также предлагаю обходной путь, используя напрямую Web3 API.
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;