Реагировать на получение метамаски статуса последней транзакции
Я использую это, чтобы сделать вызов функции в смарт-контракт через метамаску в реагировать:
export default class EthereumForm1 extends Component {
constructor (props) {
super (props);
const MyContract = window.web3.eth.contract(ContractABI);
this.state = {
ContractInstance: MyContract.at('ContractAddress')
}
this.doPause = this.doPause.bind (this);
}
doPause() {
const { pause } = this.state.ContractInstance;
pause (
{
gas: 30000,
gasPrice: 32000000000,
value: window.web3.toWei (0, 'ether')
},
(err) => {
if (err) console.error ('Error1::::', err);
console.log ('Contract should be paused');
})
}
Что я хочу, чтобы запустить код JQuery с загрузкой GIF: $(".Loading").show();
пока транзакция обрабатывается и удалите ее после. Кроме того, было бы хорошо добавить статус транзакции в div после, как в метамаске (либо пройдено, либо отклонено).
2 ответа
Решение
Что помогло мне, так это проверять каждые несколько секунд, завершена ли моя транзакция, и если да, то скрывать загрузчик.
if (latestTx != null) {
window.web3.eth.getTransactionReceipt(latestTx, function (error, result) {
if (error) {
$(".Loading").hide();
console.error ('Error1::::', error);
}
console.log(result);
if(result != null){
latestTx = null;
$(".Loading").hide();
}
});
}
Вам не нужно jquery, чтобы сделать это. Состояние реакции может управлять статусом прогресса автоматически. Все, что вам нужно сделать, это позвонить setState
функция.
class EthereumFrom1 extends React.Component {
state = {
loading: false
};
constructor(props) {
super(props);
this.doPause = this.doPause.bind(this);
}
doPause() {
const {pause} = this.state.ContractInstance;
pause(
{
gas: 30000,
gasPrice: 32000000000,
value: window.web3.toWei(0, 'ether')
},
(err) => {
if (err) console.error('Error1::::', err);
this.setState({loading: true});
})
}
render() {
return (
<div>
{this.state.loading ?
<div className="Loading">
Loading...
</div> : <div>done</div>
}
</div>
)
}
}