@@ -85,21 +85,49 @@ public async Task<List<NFT>> GetAll(QueryAllParams queryParams = null)
8585 else
8686 {
8787 int totalCount = await TotalCount ( ) ;
88- int start ;
89- int end ;
90- if ( queryParams != null )
88+ int start = queryParams ? . start ?? 0 ;
89+ int count = queryParams ? . count + 1 ?? totalCount ;
90+ int end = Math . Min ( start + count , totalCount ) ;
91+ List < NFT > allNfts = new ( ) ;
92+ try
9193 {
92- start = queryParams . start ;
93- end = queryParams . start + queryParams . count ;
94+ var uriFunctions = Enumerable . Range ( start , end - start ) . Select ( i => new TokenERC1155Contract . UriFunction ( ) { TokenId = new BigInteger ( i ) } ) . ToArray ( ) ;
95+ var uriResults = await TransactionManager . ThirdwebMulticallRead < TokenERC1155Contract . UriFunction , TokenERC1155Contract . UriOutputDTO > ( contractAddress , uriFunctions ) ;
96+ var metadataFetchTasks = new List < Task < NFTMetadata > > ( ) ;
97+ for ( int i = 0 ; i < uriResults . Length ; i ++ )
98+ {
99+ var tokenUri = uriResults [ i ] . ReturnValue1 . Replace ( "0x{id}" , uriFunctions [ i ] . TokenId . ToString ( ) ) . ReplaceIPFS ( ) ;
100+ metadataFetchTasks . Add ( ThirdwebManager . Instance . SDK . storage . DownloadText < NFTMetadata > ( tokenUri ) ) ;
101+ }
102+ var metadataResults = await Task . WhenAll ( metadataFetchTasks ) ;
103+ allNfts = new List < NFT > ( ) ;
104+ for ( int i = 0 ; i < uriResults . Length ; i ++ )
105+ {
106+ var tokenId = uriFunctions [ i ] . TokenId . ToString ( ) ;
107+ var metadata = metadataResults [ i ] ;
108+ metadata . image = metadata . image . ReplaceIPFS ( ) ;
109+ metadata . id = tokenId ;
110+ metadata . uri = uriResults [ i ] . ReturnValue1 . ReplaceIPFS ( ) ;
111+
112+ var nft = new NFT
113+ {
114+ owner = "" ,
115+ type = "ERC1155" ,
116+ supply = await TotalSupply ( tokenId ) ,
117+ quantityOwned = 404 ,
118+ metadata = metadata
119+ } ;
120+
121+ allNfts . Add ( nft ) ;
122+ }
94123 }
95- else
124+ catch
96125 {
97- start = 0 ;
98- end = totalCount - 1 ;
126+ ThirdwebDebug . LogWarning ( "Unable to fetch using Multicall3, likely not deployed on this chain, falling back to single queries." ) ;
127+ allNfts = new List < NFT > ( ) ;
128+ for ( int i = start ; i <= end ; i ++ )
129+ allNfts . Add ( await Get ( i . ToString ( ) ) ) ;
99130 }
100- var allNfts = new List < NFT > ( ) ;
101- for ( int i = start ; i <= end ; i ++ )
102- allNfts . Add ( await Get ( i . ToString ( ) ) ) ;
103131 return allNfts ;
104132 }
105133 }
@@ -118,20 +146,59 @@ public async Task<List<NFT>> GetOwned(string address = null)
118146 {
119147 string owner = address ?? await ThirdwebManager . Instance . SDK . wallet . GetAddress ( ) ;
120148 int totalCount = await TotalCount ( ) ;
121- var ownedNfts = new List < NFT > ( ) ;
122- for ( int i = 0 ; i < totalCount ; i ++ )
149+ List < NFT > ownedNfts = new ( ) ;
150+
151+ try
123152 {
124- BigInteger ownedBalance = BigInteger . Parse ( await BalanceOf ( owner , i . ToString ( ) ) ) ;
125- if ( ownedBalance == 0 )
153+ var balanceFunctions = Enumerable . Range ( 0 , totalCount ) . Select ( i => new TokenERC1155Contract . BalanceOfFunction ( ) { Account = owner , Id = new BigInteger ( i ) } ) . ToArray ( ) ;
154+ var balanceResults = await TransactionManager . ThirdwebMulticallRead < TokenERC1155Contract . BalanceOfFunction , TokenERC1155Contract . BalanceOfOutputDTO > (
155+ contractAddress ,
156+ balanceFunctions
157+ ) ;
158+ var nonZeroBalanceTokenIds = balanceResults . Select ( ( result , index ) => ( Balance : result . ReturnValue1 , TokenId : index ) ) . Where ( x => x . Balance > 0 ) . ToList ( ) ;
159+ var uriFunctions = nonZeroBalanceTokenIds . Select ( x => new TokenERC1155Contract . UriFunction ( ) { TokenId = new BigInteger ( x . TokenId ) } ) . ToArray ( ) ;
160+ var uriResults = await TransactionManager . ThirdwebMulticallRead < TokenERC1155Contract . UriFunction , TokenERC1155Contract . UriOutputDTO > ( contractAddress , uriFunctions ) ;
161+ var metadataFetchTasks = uriResults . Select ( uriResult => ThirdwebManager . Instance . SDK . storage . DownloadText < NFTMetadata > ( uriResult . ReturnValue1 . ReplaceIPFS ( ) ) ) . ToList ( ) ;
162+ var metadataResults = await Task . WhenAll ( metadataFetchTasks ) ;
163+ ownedNfts = new List < NFT > ( ) ;
164+ for ( int i = 0 ; i < nonZeroBalanceTokenIds . Count ; i ++ )
126165 {
127- continue ;
166+ var tokenId = nonZeroBalanceTokenIds [ i ] . TokenId . ToString ( ) ;
167+ var balance = nonZeroBalanceTokenIds [ i ] . Balance ;
168+ var metadata = metadataResults [ i ] ;
169+ metadata . image = metadata . image . ReplaceIPFS ( ) ;
170+ metadata . id = tokenId ;
171+ metadata . uri = uriResults [ i ] . ReturnValue1 . ReplaceIPFS ( ) ;
172+
173+ ownedNfts . Add (
174+ new NFT
175+ {
176+ owner = owner ,
177+ type = "ERC1155" ,
178+ supply = await TotalSupply ( tokenId ) ,
179+ quantityOwned = ( int ) balance ,
180+ metadata = metadata
181+ }
182+ ) ;
128183 }
129- else
184+ }
185+ catch
186+ {
187+ ThirdwebDebug . LogWarning ( "Unable to fetch using Multicall3, likely not deployed on this chain, falling back to single queries." ) ;
188+ for ( int i = 0 ; i < totalCount ; i ++ )
130189 {
131- NFT tempNft = await Get ( i . ToString ( ) ) ;
132- tempNft . owner = owner ;
133- tempNft . quantityOwned = ( int ) ownedBalance ;
134- ownedNfts . Add ( tempNft ) ;
190+ BigInteger ownedBalance = BigInteger . Parse ( await BalanceOf ( owner , i . ToString ( ) ) ) ;
191+ if ( ownedBalance == 0 )
192+ {
193+ continue ;
194+ }
195+ else
196+ {
197+ NFT tempNft = await Get ( i . ToString ( ) ) ;
198+ tempNft . owner = owner ;
199+ tempNft . quantityOwned = ( int ) ownedBalance ;
200+ ownedNfts . Add ( tempNft ) ;
201+ }
135202 }
136203 }
137204 return ownedNfts ;
0 commit comments