ブロックチェーンからの読み取り
ブロックチェーンからの読み取りは、Sequence Indexer のUnityネイティブ実装を利用して行います。
ChainIndexer
クラス のインスタンスを作成することを推奨します。これにより、IIndexer
インターフェース が提供するすべての機能を利用できます。
IIndexer polygonIndexer = new ChainIndexer(Chain.Polygon);
指定したチェーンのインデクサAPIが稼働しているかどうかは、Ping
非同期Taskで確認できます。リクエストが失敗する場合に役立ちます。開発中は、ステータスページ でもインデクサの稼働状況を確認できます。
IIndexer chainIndexer = new ChainIndexer(chain);
bool indexerIsWorking = await chainIndexer.Ping();
残高の取得
ユーザーのEther(またはネットワークのデフォルトガス通貨)の残高を確認するには、GetEtherBalance
非同期Taskを使用します。
IIndexer chainIndexer = new ChainIndexer(chain);
EtherBalance balance = await chainIndexer.GetEtherBalance(address);
BigInteger balanceInWei = balance.balanceWei;
トークン残高の取得
ユーザーのトークン残高を取得するには、GetTokenBalances
非同期Taskを利用します。
IIndexer chainIndexer = new ChainIndexer(chain);
GetTokenBalancesReturn balances = await chainIndexer.GetTokenBalances(new GetTokenBalancesArgs(address));
TokenBalance[] tokenBalances = balances.balances;
この方法で取得した場合、各スマートコントラクトごとに1つのトークンインスタンスのみが返されます。アドレスを指定せずに取得することで、プレイヤーがどのコントラクトからトークンを所有しているか、ウォレットにどのERC20があるかを把握できます。
ERC721やERC1155トークンの個別残高を取得したい場合は、GetTokenBalancesArgs
でコントラクトを指定してください。
IIndexer chainIndexer = new ChainIndexer(chain);
GetTokenBalancesReturn balances = await chainIndexer.GetTokenBalances(new GetTokenBalancesArgs(userAddress, contractAddress));
TokenBalance[] tokenBalances = balances.balances;
プレイヤーが特定のコントラクトで多くのtokenIdを持っている場合(または多くのコントラクトからトークンを所有している場合)、ページネーション処理が必要になります。この場合、GetTokenBalancesReturn
で受け取る Page
を確認し、続きがあればPageを含めて再度リクエストしてください。
IIndexer chainIndexer = new ChainIndexer(chain);
GetTokenBalancesReturn balances = await chainIndexer.GetTokenBalances(new GetTokenBalancesArgs(userAddress, contractAddress));
List<TokenBalance> finalResult = new List<TokenBalance>();
TokenBalance[] tokenBalances = balances.balances;
AddItemsFromArrayToList(tokenBalances, finalResult);
while (tokenBalances.page.more) {
tokenBalances = await GetTokenBalances(new GetTokenBalancesArgs(accountAddress, contractAddress, tokenBalances.page));
AddItemsFromArrayToList(tokenBalances, finalResult);
}
この操作を簡単にするために、GetTokenBalancesOrganizedInDictionary
というラッパーを用意しています。これにより、指定したcontractAddressとuserAccountAddressのすべてのTokenBalanceを取得し、tokenID(BigInteger)からTokenBalanceへのDictionaryとして整理します。通常はこちらを利用するのが便利です。
IIndexer chainIndexer = new ChainIndexer(chain);
Dictionary<BigInteger, TokenBalance> tokenBalancesDictionary = await chainIndexer.GetTokenBalancesOrganizedInDictionary(accountAddress, contractAddress);
これにより、各token idの残高確認も非常に簡単になります。
トークン供給量の取得
特定のスマートコントラクトのトークン総供給量を取得したい場合は、GetTokenSupplies
非同期Taskを利用できます。
IIndexer chainIndexer = new ChainIndexer(chain);
GetTokenSuppliesReturn tokenSupplies = await chainIndexer.GetTokenSupplies(new GetTokenSuppliesArgs(contractAddress))
この操作はあまり一般的ではないと考えていますが、必要な場合のために公開しています。
トークン供給量マップの取得
GetTokenSupplies
を頻繁に利用する方向けに、複数のトークンコントラクトやトークンIDの供給量をマップ形式で取得できる GetTokenSuppliesMap
非同期Taskも提供しています。
IIndexer indexer = new ChainIndexer(Chain.Polygon);
string usdcAddress = "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359".ToLower();
string wmaticAddress = "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270".ToLower();
string skyweaverAddress = "0x631998e91476da5b870d741192fc5cbc55f5a52e".ToLower();
string skyweaverTokenId1 = "68657";
string skyweaverTokenId2 = "66669";
string skyweaverTokenId3 = "66668";
GetTokenSuppliesMapReturn suppliesMapReturn = await indexer.GetTokenSuppliesMap(new GetTokenSuppliesMapArgs(
new Dictionary<string, string[]>()
{
{ usdcAddress, new string[] { } },
{ wmaticAddress, new string[] { "0" } },
{ skyweaverAddress, new string[] { skyweaverTokenId1, skyweaverTokenId2, skyweaverTokenId3 } },
}));
Dictionary<string, TokenSupply[]> suppliesMap = suppliesMapReturn.supplies;
ここでは、suppliesMap[usdcAddress].Length = 1
となり、TokenSupplyオブジェクトはERC20トークンの供給量に対応します。
同様に、suppliesMap[skyweaverAddress].Length = 3
となり、TokenSupplyオブジェクトは指定したトークンIDの供給量に対応します。
トランザクション履歴の取得
特定アカウントのトランザクション履歴を取得するには、GetTransactionHistory
メソッドを利用します。
IIndexer chainIndexer = new ChainIndexer(chain);
GetTransactionHistoryReturn history = await chainIndexer.GetTransactionHistory(
new GetTransactionHistoryArgs(new TransactionHistoryFilter()
{
accountAddress = userAccountAddress;
})
);
TransactionHistoryFilter
オブジェクトを使うことで、アカウントアドレスやコントラクトアドレスなど、トランザクション履歴の絞り込み条件を指定できます。詳細はこちらをご覧ください。