package main import ( "encoding/json" "io/ioutil" "log" "math" "net/http" "strconv" ) // https://docs.opensea.io/reference/asset-object type Asset struct { Id string TokenId string Permalink string ImageUrl string Name string LastSale AssetLastSale } type AssetLastSale struct { TransactionHash string PaymentToken // TotalPrice has 16 decimals trimmed off if PaymentToken.decimals > 16 TotalPrice float64 } type PaymentToken struct { Id uint64 Symbol string USDPrice float64 Decimals int } // https://docs.opensea.io/reference/getting-assets type Assets []Asset func GetAssets() (Assets, error) { parsed := struct { Assets []struct { Id uint64 `json:"id"` TokenId string `json:"token_id"` Permalink string `json:"permalink"` ImageUrl string `json:"image_url"` Name string `json:"name"` LastSale struct { TotalPrice string `json:"total_price"` PaymentToken struct { Id uint64 `json:"id"` Symbol string `json:"symbol"` USDPrice string `json:"usd_price"` Decimals int `json:"decimals"` } `json:"payment_token"` Transaction struct { Hash string `json:"transaction_hash"` } `json:"transaction"` } `json:"last_sale"` } `json:"assets"` }{} assets := Assets{} req, err := http.NewRequest("GET", "https://api.opensea.io/api/v1/assets"+ "?order_direction=desc"+ "&offset=0"+ "&limit=20"+ "&order_by=sale_date", nil) if err != nil { return assets, err } req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36") req.Header.Set("x-api-key", "") res, err := http.DefaultClient.Do(req) if err != nil { return assets, err } bytes, err := ioutil.ReadAll(res.Body) log.Println(string(bytes)) if err != nil { return assets, err } err = json.Unmarshal(bytes, &parsed) if err != nil { return assets, err } for _, a := range parsed.Assets { tokenUSDPrice, err := strconv.ParseFloat(a.LastSale.PaymentToken.USDPrice, 64) if err != nil { return assets, err } trimmed := a.LastSale.TotalPrice decimals := a.LastSale.PaymentToken.Decimals if a.LastSale.PaymentToken.Decimals > 16 && len(trimmed) > 16 { trimmed = trimmed[:len(trimmed)-16] decimals = decimals - 16 } totalprice, err := strconv.ParseFloat(trimmed, 64) if err != nil { return assets, err } totalprice = totalprice / math.Pow10(decimals) assets = append(assets, Asset{ Id: strconv.FormatUint(a.Id, 10), TokenId: a.TokenId, Permalink: a.Permalink, ImageUrl: a.ImageUrl, Name: a.Name, LastSale: AssetLastSale{ TotalPrice: totalprice, PaymentToken: PaymentToken{ Id: a.LastSale.PaymentToken.Id, Symbol: a.LastSale.PaymentToken.Symbol, Decimals: decimals, USDPrice: tokenUSDPrice, }, TransactionHash: a.LastSale.Transaction.Hash, }, }) } return assets, nil }