nftmashin/opensea.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
}