проблема node js

Поддержка
  • подскажите пожалуйста в чем моя ошибка, вот код:

    const { Web3 } = require('web3');
    
    
    await(new Promise((resolve, reject) => {
        // Создайте экземпляр Web3, указав URL-адрес RPC-сервера Polygon
        const web3 = new Web3('https://polygon.llamarpc.com');
    
        // Замените 'txHash' на хеш вашей транзакции
        const txHash = '0xf9c36be52a6bd83d640f5d007740a053be18775302576503b1591ec8af1a6131'; // Замените на фактический хеш вашей транзакции
    
        try {
            // Получите информацию о транзакции с использованием промиса
            const receipt =  web3.eth.getTransactionReceipt(txHash);
    
            if (receipt === null) {
                tx_status = "pending";
                console.log('Транзакция пока не подтверждена');
            } else {
                console.log('Транзакция подтверждена');
                if (receipt.status === "1n") {
                    tx_status = "success"
                }
                else {
                    tx_status = "fail"
                }
                [[TX_STATUS]] = tx_status;
                [[RECEIPT]] = receipt;
                console.log([[TX_STATUS]], [[RECEIPT]]);
                //console.log('Статус транзакции:', [[TX_STATUS]]); // '0x1' для успешной транзакции, '0x0' для неуспешной
            }
        } catch (error) {
            console.error('Ошибка при получении информации о транзакции:', error);
        }
        resolve()
    
    }));
    

    но нет переменной receipt, вместо нее в лог выводится {}, или же вообще ничего, то есть по идее скрипт не успевает обработать запрос полностью, я пробовал синхронизировать различными методами, вроде как решение проблемы добавить в строку

    const receipt =  web3.eth.getTransactionReceipt(txHash); 
    

    await, но тогда получаем ошибку

    const receipt =await web3.eth.getTransactionReceipt(txHash);
                               ^^^^^
    
    SyntaxError: await is only valid in async functions and the top level bodies of modules
    

    пробовал синхронизировать и многими другими способами, но безуспешно, например:

    const { Web3 } = require('web3');
    async function getTransactionReceipt() {
      return new Promise(async (resolve, reject) => {
        try {
          // Создайте экземпляр Web3, указав URL-адрес RPC-сервера Polygon
          const web3 = new Web3('https://polygon.llamarpc.com');
    
          // Замените 'txHash' на хеш вашей транзакции
          const txHash = '0xf9c36be52a6bd83d640f5d007740a053be18775302576503b1591ec8af1a6131'; // Замените на фактический хеш вашей транзакции
    
          // Получите информацию о транзакции с использованием промиса
          const receipt = await web3.eth.getTransactionReceipt(txHash);
    
          console.log(receipt);
          resolve();
        } catch (error) {
          console.error('Ошибка при получении информации о транзакции:', error);
          reject(error);
        }
      });
    }
    getTransactionReceipt().then(() => {
      // Ваш промис был разрешен
    }).catch((error) => {
      // Произошла ошибка в промисе
    });
    
  • перемещать resolve в первом коде пробовал, результат также безуспешный

  • @themarket попробуйте так

    const { Web3 } = require('web3');
    
    // Создайте экземпляр Web3, указав URL-адрес RPC-сервера Polygon
    const web3 = new Web3('https://polygon.llamarpc.com');
    
    // Замените 'txHash' на хеш вашей транзакции
    const txHash = '0xf9c36be52a6bd83d640f5d007740a053be18775302576503b1591ec8af1a6131'; // Замените на фактический хеш вашей транзакции
    
    try {
    	// Получите информацию о транзакции с использованием промиса
    	const receipt = await web3.eth.getTransactionReceipt(txHash);
    
    	if (receipt === null) {
    		tx_status = "pending";
    		console.log('Транзакция пока не подтверждена');
    	} else {
    		console.log('Транзакция подтверждена');
    		if (receipt.status === "1n") {
    			tx_status = "success"
    		}
    		else {
    			tx_status = "fail"
    		}
    		[[TX_STATUS]] = tx_status;
    		[[RECEIPT]] = receipt;
    		console.log([[TX_STATUS]], [[RECEIPT]]);
    		//console.log('Статус транзакции:', [[TX_STATUS]]); // '0x1' для успешной транзакции, '0x0' для неуспешной
    	}
    } catch (error) {
    	console.error('Ошибка при получении информации о транзакции:', error);
    }
    
  • @UserTrue Поток №1 : Транзакция подтверждена
    Поток №1 : Node process stopped. - ваш код выводит в лог

    чуть изменил его и добавил после

    const receipt = await web3.eth.getTransactionReceipt(txHash);
    console.log(receipt)
    

    теперь в логе
    Поток №1 : undefined
    Поток №1 : Node process stopped.

  • @UserTrue пишет, что await можно употреблять только внутри асинхронных функций, я поэтому и нагородил функцию и промис

  • @themarket said in проблема node js:

    @UserTrue Поток №1 : Транзакция подтверждена
    Поток №1 : Node process stopped. - ваш код выводит в лог

    Значит в целом с кодом все нормально, проблема не с асинхронностью. И я не тестировад код, исправил только визуально ваши проблемы с асинхронным кодом

  • @themarket said in проблема node js:

    чуть изменил его и добавил после

    const receipt = await web3.eth.getTransactionReceipt(txHash);
    console.log(receipt)

    теперь в логе
    Поток №1 : undefined
    Поток №1 : Node process stopped.

    Скорей всего там какой-то сложный объект и он не может его сериализовать, чтобы вывести в лог БАСа. Поэтому не пытайтесь это сделать или передать его в переменную БАС, берите из него только нужные данные.

    const { Web3 } = require('web3');
    
    // Создайте экземпляр Web3, указав URL-адрес RPC-сервера Polygon
    const web3 = new Web3('https://polygon.llamarpc.com');
    
    // Замените 'txHash' на хеш вашей транзакции
    const txHash = '0xf9c36be52a6bd83d640f5d007740a053be18775302576503b1591ec8af1a6131'; // Замените на фактический хеш вашей транзакции
    let tx_status
    try {
    	// Получите информацию о транзакции с использованием промиса
    	const receipt = await web3.eth.getTransactionReceipt(txHash);
    
    	if (receipt === null) {
    		tx_status = "pending";
    		console.log('Транзакция пока не подтверждена');
    	} else {
    		console.log('Транзакция подтверждена');
    		if (receipt.status === "1n") {
    			tx_status = "success"
    		}
    		else {
    			tx_status = "fail"
    		}
    		[[TX_STATUS]] = tx_status;
    
    		//console.log('Статус транзакции:', [[TX_STATUS]]); // '0x1' для успешной транзакции, '0x0' для неуспешной
    	}
    } catch (error) {
    	console.error('Ошибка при получении информации о транзакции:', error);
    }
    
    
  • @UserTrue в receipt в формате json, мне оттуда нужен result, он в формате bigInt

    если я сделаю

    console.log('Статус:', receipt.status);
    

    то получу в лог Поток №1 : Статус:
    бигинт как-то по-особенному надо выводить?

    сам json:

    {
      blockHash: '0x060f5717dff435edd16df0c9be20a01b3eb7e7d8e35cdd5b0b658031c5d69496',
      blockNumber: 48002943n,
      cumulativeGasUsed: 7263908n,
      effectiveGasPrice: 91377342858n,
      from: '0x354ef3cc21485c0ff2032291884e40c3415e550a',
      gasUsed: 118759n,
      logs: [
        {
          address: '0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789',
          topics: [Array],
          data: '0x',
          blockNumber: 48002943n,
          transactionHash: '0xf9c36be52a6bd83d640f5d007740a053be18775302576503b1591ec8af1a6131',
          transactionIndex: 37n,
          blockHash: '0x060f5717dff435edd16df0c9be20a01b3eb7e7d8e35cdd5b0b658031c5d69496',
          logIndex: 210n,
          removed: false
        },
        {
          address: '0x000031dd6d9d3a133e663660b959162870d755d4',
          topics: [Array],
          data: '0x',
          blockNumber: 48002943n,
          transactionHash: '0xf9c36be52a6bd83d640f5d007740a053be18775302576503b1591ec8af1a6131',
          transactionIndex: 37n,
          blockHash: '0x060f5717dff435edd16df0c9be20a01b3eb7e7d8e35cdd5b0b658031c5d69496',
          logIndex: 211n,
          removed: false
        },
        {
          address: '0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789',
          topics: [Array],
          data: '0x000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000002ff2451ac80b3800000000000000000000000000000000000000000000000000000000000240ec',
          blockNumber: 48002943n,
          transactionHash: '0xf9c36be52a6bd83d640f5d007740a053be18775302576503b1591ec8af1a6131',
          transactionIndex: 37n,
          blockHash: '0x060f5717dff435edd16df0c9be20a01b3eb7e7d8e35cdd5b0b658031c5d69496',
          logIndex: 212n,
          removed: false
        },
        {
          address: '0x0000000000000000000000000000000000001010',
          topics: [Array],
          data: '0x000000000000000000000000000000000000000000000000002ff2451ac80b380000000000000000000000000000000000000000000009dee182b0977e91b8a900000000000000000000000000000000000000000000000052bf15fc8b52f4740000000000000000000000000000000000000000000009dee152be5263c9ad7100000000000000000000000000000000000000000000000052ef0841a61affac',
          blockNumber: 48002943n,
          transactionHash: '0xf9c36be52a6bd83d640f5d007740a053be18775302576503b1591ec8af1a6131',
          transactionIndex: 37n,
          blockHash: '0x060f5717dff435edd16df0c9be20a01b3eb7e7d8e35cdd5b0b658031c5d69496',
          logIndex: 213n,
          removed: false
        },
        {
          topics: [Array],
          data: '0x000000000000000000000000000000000000000000000000000ca85208443400000000000000000000000000000000000000000000000000532c096e467fde24000000000000000000000000000000000000000000006e45018836a104044e3a000000000000000000000000000000000000000000000000531f611c3e3baa24000000000000000000000000000000000000000000006e450194def30c48823a',
          blockNumber: 48002943n,
          transactionHash: '0xf9c36be52a6bd83d640f5d007740a053be18775302576503b1591ec8af1a6131',
          transactionIndex: 37n,
          blockHash: '0x060f5717dff435edd16df0c9be20a01b3eb7e7d8e35cdd5b0b658031c5d69496',
          removed: false
        }
      ],
      logsBloom: '0x10000000000000000000000000000000000000000000004000000000000400000008000000000002000200110000000000108000000000000000020000000000000000000000000000000002000000800000000000000000000300000000000000000400080000000400040000000000000000000000004080840000000000000000000b00000000010002000000000000000000000000000001000000000000200000000400000000400020000000000000001000000000000002000000004000000000000008000001000400010008004008000000800000108000000000000000010000000000000000000000000000000000000000000000000000100000',
      status: 1n,
      to: '0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789',
      transactionHash: '0xf9c36be52a6bd83d640f5d007740a053be18775302576503b1591ec8af1a6131',
      transactionIndex: 37n,
      type: 2n
    
  • @themarket said in проблема node js:

    он в формате bigInt

    его нужно привести к строке, BigInt это не просто число или строка

  • @UserTrue очень благодарен! а то, что бас не выводит вроде бы не самый большой json в лог/переменную, это норма?

  • @themarket вряд-ли это проблема бас, скорей всего nodejs не может привести этот объект к json, а бас с нодой данными в json обменивается