Я использую ethers
для взаимодействия с контрактами на Ethereum.
Вот как выглядит мой метод:
const tx = await signer
.sendTransaction({
to: contractAddress,
value: ethers.utils.parseEther(price),
data: hex,
gasPrice: ethers.utils.parseUnits(gas, 9),
})
И это работает нормально. Но каждый раз мне приходится искать Etherscan, чтобы найти hex транзакции и передать его параметру data
. Можно ли просто передать имя метода из контракта и параметры вместо того, чтобы передавать это значение hex
?
Может быть, в ethers
есть какой-нибудь метод для кодирования этого метода с параметрами в шестнадцатеричное значение?
Что вам нужно, так это контракт ABI. Обычно он записывается как объект json, который вы можете импортировать в свой скрипт js, или он может быть написан так (удобочитаемый-ABI):
const contractABI = [
"function foo(uint256 bar) external",
// other functions or events ...
]
ABI содержит все (или некоторые) методы контракта и способы их кодирования/декодирования.
С помощью ABI вы можете создать объект контракта следующим образом:
const contract = new ethers.Contract(contractAddress, contractABI, provider);
который можно использовать для отправки транзакций следующим образом:
const my_bar = 123 // example
const tx = await contract.connect(signer).foo(my_bar, {
value: ethers.utils.parseEther(price),
gasPrice: ethers.utils.parseUnits(gas, 9),
})
Вы можете импортировать его как любой объект в javascript. Если контракт, с которым вы хотите взаимодействовать, проверен на etherscan, вы найдете ABI под исходным кодом на той же странице.
я должен использовать Etherscan для этого? Я уже использую API-интерфейс Infura, теперь мне нужно будет использовать ключ API Etherscan, чтобы получить ABI?
Его проще взять с сайта. Пример UniswapV2Router etherscan.io/адрес/…, вы нажимаете «Экспорт ABI»> «Формат JSON» и вставляете в файл
Мне нужно это в коде, а также мне нужно, чтобы это было просто и динамично, я не могу просто скопировать и вставить. Есть ли другой способ импортировать ABI или только через API?
Полученный вами ABI можно использовать для всех контрактов с одним и тем же интерфейсом. Если вы взаимодействуете с сотнями различных интерфейсов контрактов, то использование etherscan API будет самым быстрым.
хорошо, я думал, что есть другие способы сделать это без каких-либо API-ключей и т. д., но я вижу, что должен использовать его, хорошо, спасибо
Как получить контракт ABI? Как я могу импортировать его с помощью
ethers
?