#reactjs #hash #transactions #metamask #ethers.js
Вопрос:
У меня, наверное, есть несколько очень простых вопросов, заранее спасибо за вашу помощь!
Разработка простого приложения DApp с использованием ethersjs
и. REACTJS
Мне удалось заставить платеж работать плюс поиск хэша транзакции в startPayment
функции
Вопросы:
- Как я могу передать данные с
const WalletDeposit
конца наconst handleSubmit
и поместить их в rawtx? - Как я могу активно проверять, есть ли хэш, и если да, то запустить
const postTransaction
функцию?
Дополнительная информация: Строка console.log('Hash', txhash)
at line 56
действительно получает хэш транзакции после совершения платежа. Но я не могу использовать данные из этого в handleSubmit. Я уже пытался создать как переменную с useState, но это ни к чему не привело.
Мой код до сих пор:
import React, {useState, useEffect} from 'react'; import axios from 'axios'; import { ethers } from "ethers"; import ErrorMessage from "./ErrorMessage"; import TxList from "./TxList"; import UserService from "../../../services/user.service"; const startPayment = async ({ setError, setTxs, setHash, ether, addr }) =gt; { try { if (!window.ethereum) throw new Error("No crypto wallet found. Please install it."); await window.ethereum.send("eth_requestAccounts"); const provider = new ethers.providers.Web3Provider(window.ethereum); const signer = provider.getSigner(); // const userAddress = await signer.getAddress(); ethers.utils.getAddress(addr); const tx = await signer.sendTransaction({ to: addr, value: ethers.utils.parseEther(ether) }); setTxs([tx]); setHash([tx][0].hash); } catch (err) { if (err.message === 'Internal JSON-RPC error.') { setError("Check your balance, insufficient funds") } if (err.message === 'MetaMask Tx Signature: User denied transaction signature.') { setError("You have rejected the transaction!") } else { setError(err.message); } } }; const WalletDeposit = ({show, close}) =gt; { const [price, setPrice] = useState(''); const [firstName, setFirstName] = useState(''); const [error, setError] = useState(); const [txs, setTxs] = useState([]); const [txhash, setHash] = useState(); const [totalTokens, setTokens] = useState(); const [tokenPrice, setTokenPrice] = useState(); const [checkboxvalue1, setCheckboxValue1] = useState(''); console.log('Hash: ', txhash); const handleSubmit = async (e) =gt; { e.preventDefault(); const data = new FormData(e.target); const tokens = data.get("tokens"); const tokenPrice = tokens / price.usd; setTokens(tokens); setTokenPrice(tokenPrice); setError(); await startPayment({ setError, setTxs, setHash, ether: tokenPrice.toString(), addr: '0x000000000000000000000000000' lt;= not using this address ;) }); const postTransaction = () =gt; { const rawtx = { "type": "deposit", "status": "pending", "fees": 2, "txamount": tokens, "ticker": "usd", "txhash": txhash, "product": 0, "ethPrice": tokenPrice.toString() }; UserService.postTransactionType(rawtx) .then( response =gt; { close() window.location.reload(); alert('We have received a deposit and it will be checked, the status will be updated in your transaction overview.'); return response.data.data } ) .catch(error =gt; { console.error('There was an error!', error); }); } if (!txhash === '') { postTransaction(); } }; const calculatePrice = () =gt; { axios.get('http://api.coingecko.com/api/v3/simple/price?ids=binancecoinamp;vs_currencies=usd') .then((response) =gt; { setPrice(response.data.binancecoin) }) } useEffect(() =gt; { calculatePrice() }, []); return ( lt;gt; { show ? lt;div className="popup popup_settings" id="popup-settings"gt; lt;div className="popup-wrapper"gt; lt;button className="close" onClick={() =gt; close()}gt; amp;times; lt;/buttongt; lt;div className="popup__title h6"gt;Deposit Fundslt;/divgt; lt;form className="popup__form" onSubmit={handleSubmit}gt; lt;div className="popup__field field js-field"gt; lt;div className="field__label"gt;Amount in USDlt;/divgt; lt;div className="field__wrap"gt; lt;input className="field__input js-field-input" name="tokens" min={1} type="number" onChange={e =gt; setFirstName(e.target.value)} /gt; lt;/divgt; lt;/divgt; lt;divgt; Amount USD in BNB: {firstName / price.usd} {/* (amount (usd price) : bnb price (calc)) */} lt;/divgt; lt;div className="popup__variants"gt; lt;label className="checkbox"gt; lt;input className="checkbox__input" type="checkbox" onChange={() =gt; setCheckboxValue1(!checkboxvalue1)} /gt; lt;span className="checkbox__in"gt; lt;span className="checkbox__tick"gt;lt;/spangt; lt;span className="checkbox__text"gt; I hereby confirm that I will add funds and can't redo this unless I withdraw my funds. lt;/spangt; lt;/spangt; lt;/labelgt; lt;/divgt; lt;button type="submit" className="popup__btn btn btn_blue btn_wide" className={!checkboxvalue1 ? "popup__btn btn btn_gray btn_wide" : "popup__btn btn btn_blue btn_wide"} disabled={!checkboxvalue1} gt; Buy now lt;/buttongt; lt;ErrorMessage message={error} /gt; lt;TxList txs={txs} /gt; lt;/formgt; lt;/divgt; lt;/divgt; : null } lt;/gt; ); } export default WalletDeposit;