You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
2.0 KiB
C#
53 lines
2.0 KiB
C#
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Numerics;
|
|
using System.Threading.Tasks;
|
|
using ChainSafe.Gaming.Evm.Contracts.BuiltIn;
|
|
using ChainSafe.Gaming.MultiCall;
|
|
using ChainSafe.Gaming.UnityPackage;
|
|
using ChainSafe.Gaming.Web3;
|
|
using JetBrains.Annotations;
|
|
using Nethereum.Contracts.QueryHandlers.MultiCall;
|
|
using Nethereum.Hex.HexConvertors.Extensions;
|
|
|
|
namespace ChainSafe.Gaming.Evm.Contracts.Custom
|
|
{
|
|
public partial class Erc721Contract
|
|
{
|
|
[Pure]
|
|
public async Task<List<OwnerOfBatchModel>> GetOwnerOfBatch(string[] tokenIds)
|
|
{
|
|
var multiCall = (IMultiCall)Web3Unity.Web3.ServiceProvider.GetService(typeof(IMultiCall));
|
|
if (multiCall == null)
|
|
throw new Web3Exception(
|
|
$"Can't execute {nameof(GetOwnerOfBatch)}. No MultiCall component was provided during construction.");
|
|
|
|
var calls = tokenIds
|
|
.Select(BuildCall)
|
|
.ToList();
|
|
|
|
var multiCallResponse = await multiCall.MultiCallAsync(calls.ToArray());
|
|
|
|
return multiCallResponse
|
|
.Select(BuildResult)
|
|
.ToList();
|
|
|
|
Call3Value BuildCall(string tokenId)
|
|
{
|
|
object param = tokenId.StartsWith("0x") ? tokenId : BigInteger.Parse(tokenId);
|
|
var callData = OriginalContract.Calldata(EthMethods.OwnerOf, new[] { param });
|
|
return new Call3Value
|
|
{ Target = OriginalContract.Address, AllowFailure = true, CallData = callData.HexToByteArray() };
|
|
}
|
|
|
|
OwnerOfBatchModel BuildResult(Result result, int index)
|
|
{
|
|
if (result is not { Success: true }) return new OwnerOfBatchModel { Failure = true };
|
|
|
|
var owner = OriginalContract.Decode(EthMethods.OwnerOf, result.ReturnData.ToHex());
|
|
return new OwnerOfBatchModel { TokenId = tokenIds[index], Owner = owner[0].ToString() };
|
|
}
|
|
}
|
|
}
|
|
}
|