Я хочу создать веб-сайт, который будет переводить деньги в режиме реального времени с моего кошелька ethereum на другой кошелек ethereum. Для этого нужен скрипт (.js) для контроля баланса моего кошелька в режиме реального времени, и когда на мой кошелек придет транзакция, скрипт будет автоматически переводить деньги с моего кошелька на нужный мне адрес.
Но я не знаю, как реализовать отслеживание баланса кошелька в режиме реального времени. Я использую web3.js.
Мне посоветовали использовать web3.eth.filter('latest'), но он почему-то не работает и выдает ошибку
(TypeError: web3.eth.filter не является функцией). Я использую Next-JS и запускаю его в браузере командой «npm run dev». И также выдает ошибку
(TypeError: web3.fromWei не является функцией)
Директория Pages состоит только из _app.js и .env
Написание «npm list web3» в командной строке дает:
+-- @alch/alchemy-web3@1.3.0
| +-- @types/web3@1.2.2
| | `-- web3@1.7.3 deduped
| `--web3@1.7.1
`--web3@1.7.3
_app.js:
import '../styles/globals.css';
import './.env';
function MyApp({ Component, pageProps }) {
const Web3 = require("web3");
const myWallet = "MY_ETHEREUM_ADDRESS";
const sendTo = "SEND_TO_ADDRESS"; //where do we send ethereum
const web3 = new Web3(new Web3.providers.HttpProvider("https://mainnet.infura.io/v3/MY_KEY_IN_INFURA")) //my key in infura
let balance = web3.eth.getBalance(myWallet);
function scanBalance(walletAddress) {
//const web3 = new Web3(new Web3.providers.HttpProvider("https://mainnet.infura.io/v3/MY_PROJECT_ID")
web3.eth.getBalance(walletAddress, function (err, bal) {
if (err) {
console.log(err)
} else {
balance = bal;
console.log(`Balance [${myWallet}]: ${web3.fromWei(balance, "ether")}`);
}
})
}
scanBalance(myWallet);
//TypeError: web3.eth.filter is not a function
const filter = web3.eth.filter('latest');
filter.watch((err, res) => {
scanBalance(myWallet)
});
async function transfer() {
require('dotenv').config();
const { API_URL, PRIVATE_KEY } = process.env;
const { createAlchemyWeb3 } = require("@alch/alchemy-web3");
const alchemyWeb3 = createAlchemyWeb3(API_URL);
const nonce = await alchemyWeb3.eth.getTransactionCount(myWallet, 'latest'); // nonce starts counting from 0
const transaction = {
'to': sendTo,
'value': balance,
'gas': 30000,
'nonce': nonce,
// optional data field to send message or execute smart contract
};
const signedTx = await alchemyWeb3.eth.accounts.signTransaction(transaction, PRIVATE_KEY);
alchemyWeb3.eth.sendSignedTransaction(signedTx.rawTransaction, function (error, hash) {
if (!error) {
console.log(" The hash of your transaction is: ", hash, "\n Check Alchemy's Mempool to view the status of your transaction!");
} else {
console.log("❗Something went wrong while submitting your transaction:", error)
}
});
}
function checkBalanceVal() {
if (balance > 0) {
console.log("balance > 0");
transfer();
} else {
console.log("balance < 0");
}
}
return <Component {...pageProps} />
}
export default MyApp