Как получить счетчик оферента смарт-контракта с помощью C# ⇐ C#
Как получить счетчик оферента смарт-контракта с помощью C#
Я пытаюсь создать объявление с помощью API OpenSea, и одним из параметров является «счетчик».
Они (OpenSea) говорят, что если вы не уверены в текущем счетчике, его можно прочитать из контракта на Etherscan.
Я поспрашивал, и кажется, что вы можете получить этот счетчик с помощью getCounter(), используя Solidity.
Я использую C# – как мне это сделать?
Я пробовал с помощью контрактного ABI найти и вызвать функцию getCounter или что-то подобное, но в ABI такой функции нет.
Можно ли это сделать?
edit: Вот код C#, который должен вызывать функцию getCounter в ABI контракта и получать счетчик. Проблема в том, что ABI не содержит такой функции.
с использованием системы; используя System.Net.Http; использование System.Numerics; использование System.Threading.Tasks; использование Newtonsoft.Json.Linq; публичный класс ContractInteraction { частная строка, доступная только для чтения, ContractAddress; частный контракт JArray только для чтенияAbi; частная строка «только для чтения» WalletAddress; public ContractInteraction (строка ContractAddress, JArray ContractAbi, строка WallAddress) { this.contractAddress = ContractAddress; this.contractAbi = ContractAbi; this.walletAddress = WalletAddress; } общедоступная асинхронная задача GetCounter() { // Замените этот URL-адрес конечной точкой узла Ethereum, который вы используете string ethereumNodeUrl = "https://mainnet.infura.io/v3/your-infura-key"; // Возможно, вам придется настроить это в зависимости от конкретной функции в вашем контракте, которая возвращает счетчик строка имя метода = "getCounter"; // Создаем запрос JSON-RPC вар rpcRequest = новый { jsonrpc = "2.0", метод = "eth_call", @params = новый { to = адрес контракта, данные = GetFunctionCallData(имя метода), }, идентификатор = 1 }; используя (var client = новый HttpClient()) { вар ответ = ждут client.PostAsJsonAsync(ethereumNodeUrl, rpcRequest); вар responseData = ждут ответа.Content.ReadAsStringAsync(); var result = JObject.Parse(responseData)["результат"].ToString(); // Преобразуем шестнадцатеричный результат в целое число int counter = int.Parse(result, System.Globalization.NumberStyles.HexNumber); возвратный счетчик; } } частная строка GetFunctionCallData (имя метода строки) { функция вар = контрактAbi .Where(token => token["type"].ToString() == "function" && token["name"].ToString() == имя_метода) .FirstOrDefault(); если (функция == ноль) { throw new InvalidOperationException($"Функция '{methodName}' не найдена в ABI контракта."); } строковая подпись = функция["подпись"].ToString(); return $"{signature.Substring(0, 10)}{walletAddress.Substring(2).PadLeft(64, '0')}"; } } классная программа { статическая асинхронная задача Main() { строка ContractAddress = «0xYourContractAddress»; строка ContractAbiFilePath = "путь/к/вашему/abi-file.txt"; строка yourWalletAddress = "0xYourWalletAddress"; строка abiJson = System.IO.File.ReadAllText(contractAbiFilePath); JArray abiArray = JArray.Parse(abiJson); ContractInteraction ContractInteraction = новый ContractInteraction (contractAddress, abiArray, yourWalletAddress); int counter = ждут ContractInteraction.GetCounter(); Console.WriteLine($"Счетчик: {счетчик}"); } }
Я пытаюсь создать объявление с помощью API OpenSea, и одним из параметров является «счетчик».
Они (OpenSea) говорят, что если вы не уверены в текущем счетчике, его можно прочитать из контракта на Etherscan.
Я поспрашивал, и кажется, что вы можете получить этот счетчик с помощью getCounter(), используя Solidity.
Я использую C# – как мне это сделать?
Я пробовал с помощью контрактного ABI найти и вызвать функцию getCounter или что-то подобное, но в ABI такой функции нет.
Можно ли это сделать?
edit: Вот код C#, который должен вызывать функцию getCounter в ABI контракта и получать счетчик. Проблема в том, что ABI не содержит такой функции.
с использованием системы; используя System.Net.Http; использование System.Numerics; использование System.Threading.Tasks; использование Newtonsoft.Json.Linq; публичный класс ContractInteraction { частная строка, доступная только для чтения, ContractAddress; частный контракт JArray только для чтенияAbi; частная строка «только для чтения» WalletAddress; public ContractInteraction (строка ContractAddress, JArray ContractAbi, строка WallAddress) { this.contractAddress = ContractAddress; this.contractAbi = ContractAbi; this.walletAddress = WalletAddress; } общедоступная асинхронная задача GetCounter() { // Замените этот URL-адрес конечной точкой узла Ethereum, который вы используете string ethereumNodeUrl = "https://mainnet.infura.io/v3/your-infura-key"; // Возможно, вам придется настроить это в зависимости от конкретной функции в вашем контракте, которая возвращает счетчик строка имя метода = "getCounter"; // Создаем запрос JSON-RPC вар rpcRequest = новый { jsonrpc = "2.0", метод = "eth_call", @params = новый { to = адрес контракта, данные = GetFunctionCallData(имя метода), }, идентификатор = 1 }; используя (var client = новый HttpClient()) { вар ответ = ждут client.PostAsJsonAsync(ethereumNodeUrl, rpcRequest); вар responseData = ждут ответа.Content.ReadAsStringAsync(); var result = JObject.Parse(responseData)["результат"].ToString(); // Преобразуем шестнадцатеричный результат в целое число int counter = int.Parse(result, System.Globalization.NumberStyles.HexNumber); возвратный счетчик; } } частная строка GetFunctionCallData (имя метода строки) { функция вар = контрактAbi .Where(token => token["type"].ToString() == "function" && token["name"].ToString() == имя_метода) .FirstOrDefault(); если (функция == ноль) { throw new InvalidOperationException($"Функция '{methodName}' не найдена в ABI контракта."); } строковая подпись = функция["подпись"].ToString(); return $"{signature.Substring(0, 10)}{walletAddress.Substring(2).PadLeft(64, '0')}"; } } классная программа { статическая асинхронная задача Main() { строка ContractAddress = «0xYourContractAddress»; строка ContractAbiFilePath = "путь/к/вашему/abi-file.txt"; строка yourWalletAddress = "0xYourWalletAddress"; строка abiJson = System.IO.File.ReadAllText(contractAbiFilePath); JArray abiArray = JArray.Parse(abiJson); ContractInteraction ContractInteraction = новый ContractInteraction (contractAddress, abiArray, yourWalletAddress); int counter = ждут ContractInteraction.GetCounter(); Console.WriteLine($"Счетчик: {счетчик}"); } }
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение