nftmashin/opensea.go

109 lines
2.5 KiB
Go
Raw Normal View History

2021-11-09 21:47:36 +00:00
package main
import (
"encoding/json"
"math"
2021-11-09 21:47:36 +00:00
"net/http"
"strconv"
)
// https://docs.opensea.io/reference/asset-object
type Asset struct {
Id string
2021-11-09 21:47:36 +00:00
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
2021-11-09 21:47:36 +00:00
}
// https://docs.opensea.io/reference/getting-assets
type Assets []Asset
func GetAssets() (Assets, error) {
parsed := struct {
Assets []struct {
Id uint64 `json:"id"`
2021-11-09 21:47:36 +00:00
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"`
2021-11-09 21:47:36 +00:00
PaymentToken struct {
Id uint64 `json:"id"`
Symbol string `json:"symbol"`
2021-11-09 21:47:36 +00:00
USDPrice string `json:"usd_price"`
Decimals int `json:"decimals"`
2021-11-09 21:47:36 +00:00
} `json:"payment_token"`
Transaction struct {
Hash string `json:"transaction_hash"`
} `json:"transaction"`
} `json:"last_sale"`
} `json:"assets"`
}{}
assets := Assets{}
res, err := http.DefaultClient.Get("https://api.opensea.io/api/v1/assets" +
"?order_direction=desc" +
"&offset=0" +
"&limit=50" +
"&order_by=sale_date")
if err != nil {
return assets, err
}
err = json.NewDecoder(res.Body).Decode(&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 {
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)
2021-11-09 21:47:36 +00:00
assets = append(assets, Asset{
Id: strconv.FormatUint(a.Id, 10),
2021-11-09 21:47:36 +00:00
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,
},
2021-11-09 21:47:36 +00:00
TransactionHash: a.LastSale.Transaction.Hash,
},
})
}
return assets, nil
}