@@ -103,6 +103,11 @@ type AssetResult struct {
103103 Err error
104104}
105105
106+ type AssetAddressesAll struct {
107+ Res []AssetAddress
108+ Err error
109+ }
110+
106111// Assets returns a paginated list of assets.
107112func (c * apiClient ) Assets (ctx context.Context , query APIQueryParams ) (a []Asset , err error ) {
108113 requestUrl , err := url .Parse (fmt .Sprintf ("%s/%s" , c .server , resourceAssets ))
@@ -240,17 +245,21 @@ func (c *apiClient) AssetTransactions(ctx context.Context, asset string) (trs []
240245 return trs , nil
241246}
242247
243- // AssetAddresses returns list of a addresses containing a specific asset.
244- func (c * apiClient ) AssetAddresses (ctx context.Context , asset string ) (addrs []AssetAddress , err error ) {
245- requestUrl , err := url .Parse (fmt .Sprintf ("%s/%s/%s/%s" , c .server , resourceAssets , asset , resourceAssetHistory ))
248+ func (c * apiClient ) AssetAddresses (ctx context.Context , asset string , query APIQueryParams ) (addrs []AssetAddress , err error ) {
249+ requestUrl , err := url .Parse (fmt .Sprintf ("%s/%s/%s/%s" , c .server , resourceAssets , asset , resourceAddresses ))
246250 if err != nil {
247251 return
248252 }
253+
249254 req , err := http .NewRequestWithContext (ctx , http .MethodGet , requestUrl .String (), nil )
250255 if err != nil {
251256 return
252257 }
253258
259+ v := req .URL .Query ()
260+ v = formatParams (v , query )
261+ req .URL .RawQuery = v .Encode ()
262+
254263 res , err := c .handleRequest (req )
255264 if err != nil {
256265 return
@@ -263,6 +272,50 @@ func (c *apiClient) AssetAddresses(ctx context.Context, asset string) (addrs []A
263272 return addrs , nil
264273}
265274
275+ // AssetAddresses returns list of a addresses containing a specific asset.
276+ func (c * apiClient ) AssetAddressesAll (ctx context.Context , asset string ) <- chan AssetAddressesAll {
277+ ch := make (chan AssetAddressesAll , c .routines )
278+ jobs := make (chan methodOptions , c .routines )
279+ quit := make (chan bool , 1 )
280+
281+ wg := sync.WaitGroup {}
282+
283+ for i := 0 ; i < c .routines ; i ++ {
284+ wg .Add (1 )
285+ go func (jobs chan methodOptions , ch chan AssetAddressesAll , wg * sync.WaitGroup ) {
286+ defer wg .Done ()
287+ for j := range jobs {
288+ ad , err := c .AssetAddresses (j .ctx , asset , j .query )
289+ if len (ad ) != j .query .Count || err != nil {
290+ select {
291+ case quit <- true :
292+ default :
293+ }
294+ }
295+ res := AssetAddressesAll {Res : ad , Err : err }
296+ ch <- res
297+ }
298+
299+ }(jobs , ch , & wg )
300+ }
301+ go func () {
302+ defer close (ch )
303+ fetchScripts := true
304+ for i := 1 ; fetchScripts ; i ++ {
305+ select {
306+ case <- quit :
307+ fetchScripts = false
308+ default :
309+ jobs <- methodOptions {ctx : ctx , query : APIQueryParams {Count : 100 , Page : i }}
310+ }
311+ }
312+
313+ close (jobs )
314+ wg .Wait ()
315+ }()
316+ return ch
317+ }
318+
266319// AssetsByPolicy returns list of assets minted under a specific policy.
267320func (c * apiClient ) AssetsByPolicy (ctx context.Context , policyId string ) (a []Asset , err error ) {
268321 requestUrl , err := url .Parse (fmt .Sprintf ("%s/%s/%s" , c .server , resourcePolicyAssets , policyId ))
0 commit comments