Как отправить эфир на счет вместо создания смарт-контракта с помощью ethers.js

Я хотел бы отправить немного эфира на счет в ropsten testnet. Я использую следующий код и библиотеку https://docs.ethers.io/ethers.js/html/ . Однако вместо отправки эфира на toсчет создается контракт. Что я делаю не так?

const wallet = new Wallet(config.privateKey);
wallet.provider = ethers.providers.getDefaultProvider('ropsten');


const transaction = {
    nonce: 0,
    gasLimit: config.gasLimit,
    gasPrice: gasPrice,
    to: to,
    value: ethers.utils.parseEther(amount),
    // data: "0x",
    // This ensures the transaction cannot be replayed on different networks
    chainId: 3 // ropsten
};

const signedTransaction = wallet.sign(transaction);

return new Promise((resolve, reject) => {
    wallet.sendTransaction(signedTransaction)
        .then(function(hash) {
            logTransaction(hash, config.sourceAddress, to, amount, gasPrice);
            resolve(hash);
        }).catch(function(err) {
            reject(err);
        });
});

Это пример транзакции, созданной с помощью приведенного выше кода:

https://ropsten.etherscan.io/tx/0x79504f592a390cdf36dab6f1ee196bf94cab7b032b0b88caf8e6bccdb2a76dbb

РЕДАКТИРОВАТЬ: проблема возникает из-за подписания транзакции. Если я не подпишу транзакцию, она sendTransaction(transaction)работает как положено и средства переводятся в to. Если я подписываю транзакцию и делаю sendTransaction(signedTransaction)это, создаются указанные контракты. Какова цель его подписания и почему он делает транзакцию «неудачной»?

Распечатайте значение to? Я предполагаю, что это nullили 0.
Значение to: 0x00269e08097635F95aba776030e0907b56a7e181. Ни null, ни 0. Может быть, ему нужен какой-то определенный формат или что-то в этом роде?
Хорошо, я видел, что поле to становится неопределенным после подписания транзакции. Это нормально или ожидаемое поведение
Вы имеете в виду, что transactionобъект изменяется? Можете ли вы показать код и вывод, где вы делаете console.log(transaction.to)выше и ниже signвызова?
Я обнаружил, что проблема заключается в подписании транзакции. я редактирую вопрос
Судя по коду, это выглядит так, будто wallet.sendTransactionсообщение действительно уже подписано, но ничто в коде не указывает на то, что оно должно завершиться ошибкой при отправке уже подписанной транзакции. Возможно, вы нашли ошибку, о которой, вероятно, следует сообщить в выпусках проекта на GitHub. Я думаю, что причина для signотдельного была бы, если бы вы собирались отправить транзакцию за пределы кошелька (например, через sendTransactionметод провайдера, как в примере ).

Ответы (1)

Сериализованная signedTransactionшестнадцатеричная строка транзакции.

Вызов Wallet.prototype.sendTransactionожидает объект транзакции, а не сериализованную транзакцию. Итак, когда он внутренне пытается прочитать tx.to, поскольку tx является строкой, он получает значение null.

Для Provider.prototype.sendTransactionвызова требуется подписанная транзакция.

Итак, если вы хотите вручную подписать транзакцию в своем примере, вы можете вместо этого использовать:

wallet.provider.sendTransaction(signedTransactio);

Это в основном то же самое, как если бы вы использовали:

wallet.sendTransaction(transaction);

Основное отличие состоит в том, что Wallet.prototype.sendTransactionавтоматически заполнит некоторые значения для вас и добавит некоторые служебные функции к возвращаемому объекту транзакции (например, wait())