@@ -85,21 +85,49 @@ public async Task<List<NFT>> GetAll(QueryAllParams queryParams = null)
85
85
else
86
86
{
87
87
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
91
93
{
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
+ }
94
123
}
95
- else
124
+ catch
96
125
{
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 ( ) ) ) ;
99
130
}
100
- var allNfts = new List < NFT > ( ) ;
101
- for ( int i = start ; i <= end ; i ++ )
102
- allNfts . Add ( await Get ( i . ToString ( ) ) ) ;
103
131
return allNfts ;
104
132
}
105
133
}
@@ -118,20 +146,59 @@ public async Task<List<NFT>> GetOwned(string address = null)
118
146
{
119
147
string owner = address ?? await ThirdwebManager . Instance . SDK . wallet . GetAddress ( ) ;
120
148
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
123
152
{
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 ++ )
126
165
{
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
+ ) ;
128
183
}
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 ++ )
130
189
{
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
+ }
135
202
}
136
203
}
137
204
return ownedNfts ;
0 commit comments