You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
2.9 KiB
Go
122 lines
2.9 KiB
Go
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
|
|
}
|