Skip to content

Commit

Permalink
Merge pull request #79 from 0xcregis/hotfix/release-0.5.1
Browse files Browse the repository at this point in the history
perf: getBlockReceipts
  • Loading branch information
sunjiangjun authored Nov 20, 2023
2 parents 3840e18 + 01f4b49 commit 5560ce1
Show file tree
Hide file tree
Showing 10 changed files with 549 additions and 88 deletions.
2 changes: 2 additions & 0 deletions blockchain/chain/gw.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ func NewNFT(blockchain int64) blockchain.NFT {
if blockchain == 200 {
//eth
return ether.NewNFTClient()
} else if blockchain == 201 {
return polygonpos.NewNFTClient()
} else if blockchain == 202 {
return bnb.NewNFTClient()
} else {
Expand Down
233 changes: 227 additions & 6 deletions blockchain/chain/polygonpos/polygon_pos.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"fmt"
"io"
"log"
"math/big"
"net/http"
"strings"

Expand All @@ -19,14 +20,230 @@ import (
type PolygonPos struct {
}

func (e *PolygonPos) GetToken721(host string, token string, contractAddress string, userAddress string) (map[string]interface{}, error) {
//TODO implement me
panic("implement me")
func (e *PolygonPos) TokenURI(host string, key string, contractAddress string, tokenId string, eip int64) (string, error) {

if len(key) > 1 {
host = fmt.Sprintf("%v/%v", host, key)
}

client, err := ethclient.Dial(host)
if err != nil {
return "", err
}

tokenAddress := common.HexToAddress(contractAddress)
if eip == 721 {
instance, err := token.NewToken721(tokenAddress, client)
if err != nil {
return "", err
}

i, b := new(big.Int).SetString(tokenId, 0)

if !b {
return "", fmt.Errorf("tokenId is error,tokenId=%v", tokenId)
}

return instance.TokenURI(&bind.CallOpts{Pending: false}, i)

} else if eip == 1155 {
instance, err := token.NewToken1155(tokenAddress, client)
if err != nil {
return "", err
}

i, b := new(big.Int).SetString(tokenId, 0)

if !b {
return "", fmt.Errorf("tokenId is error,tokenId=%v", tokenId)
}

return instance.Uri(&bind.CallOpts{Pending: false}, i)
} else {
return "", fmt.Errorf("unknow eip:%v", eip)
}
}

func (e *PolygonPos) GetToken1155(host string, token string, contractAddress string, userAddress string) (map[string]interface{}, error) {
//TODO implement me
panic("implement me")
func (e *PolygonPos) BalanceOf(host string, key string, contractAddress string, address string, tokenId string, eip int64) (string, error) {
if len(key) > 1 {
host = fmt.Sprintf("%v/%v", host, key)
}

client, err := ethclient.Dial(host)
if err != nil {
return "", err
}

tokenAddress := common.HexToAddress(contractAddress)
if eip == 721 {
instance, err := token.NewToken721(tokenAddress, client)
if err != nil {
return "", err
}

count, err := instance.BalanceOf(&bind.CallOpts{Pending: false}, common.HexToAddress(address))
if err == nil {
return count.String(), nil
} else {
return "", err
}

} else if eip == 1155 {
instance, err := token.NewToken1155(tokenAddress, client)
if err != nil {
return "", err
}

i, b := new(big.Int).SetString(tokenId, 0)
if !b {
return "", fmt.Errorf("tokenId is error,tokenId=%v", tokenId)
}
count, err := instance.BalanceOf(&bind.CallOpts{Pending: false}, common.HexToAddress(address), i)
if err == nil {
return count.String(), nil
} else {
return "", err
}
} else {
return "", fmt.Errorf("unknow eip:%v", eip)
}
}

func (e *PolygonPos) OwnerOf(host string, key string, contractAddress string, tokenId string, eip int64) (string, error) {
if len(key) > 1 {
host = fmt.Sprintf("%v/%v", host, key)
}

client, err := ethclient.Dial(host)
if err != nil {
return "", err
}

tokenAddress := common.HexToAddress(contractAddress)
if eip == 721 {
instance, err := token.NewToken721(tokenAddress, client)
if err != nil {
return "", err
}
i, b := new(big.Int).SetString(tokenId, 0)
if !b {
return "", fmt.Errorf("tokenId is error,tokenId=%v", tokenId)
}
addr, err := instance.OwnerOf(&bind.CallOpts{Pending: false}, i)
if err == nil {
return addr.String(), nil
} else {
return "", err
}

} else {
return "", fmt.Errorf("unknow eip:%v", eip)
}
}

func (e *PolygonPos) TotalSupply(host string, key string, contractAddress string, eip int64) (string, error) {
if len(key) > 1 {
host = fmt.Sprintf("%v/%v", host, key)
}

client, err := ethclient.Dial(host)
if err != nil {
return "", err
}

tokenAddress := common.HexToAddress(contractAddress)
if eip == 721 {
instance, err := token.NewToken721(tokenAddress, client)
if err != nil {
return "", err
}

count, err := instance.TotalSupply(&bind.CallOpts{Pending: false})
if err == nil {
return count.String(), nil
} else {
return "", err
}

} else {
return "", fmt.Errorf("unknow eip:%v", eip)
}
}

func (e *PolygonPos) GetToken721(host string, key string, contractAddress string, userAddress string) (map[string]interface{}, error) {
mp := make(map[string]interface{}, 2)
if len(key) > 1 {
host = fmt.Sprintf("%v/%v", host, key)
}

client, err := ethclient.Dial(host)
if err != nil {
return nil, err
}

tokenAddress := common.HexToAddress(contractAddress)
instance, err := token.NewToken721(tokenAddress, client)
if err != nil {
return nil, err
}

address := common.HexToAddress(userAddress)
name, err := instance.Name(&bind.CallOpts{Pending: false, From: address})
if err != nil {
log.Printf("contract:%v,from:%v,err=%v", contractAddress, userAddress, err.Error())
return nil, err
}
mp["name"] = name

symbol, err := instance.Symbol(&bind.CallOpts{Pending: false, From: address})
if err != nil {
log.Printf("contract:%v,from:%v,err=%v", contractAddress, userAddress, err.Error())
return nil, err
} else {
mp["symbol"] = symbol
}

//balance, err := instance.BalanceOf(&bind.CallOpts{Pending: false, From: address}, address)
//if err == nil {
// mp["balance"] = balance.String()
//}
return mp, nil
}

func (e *PolygonPos) GetToken1155(host string, key string, contractAddress string, userAddress string) (map[string]interface{}, error) {
mp := make(map[string]interface{}, 2)
//if len(key) > 1 {
// host = fmt.Sprintf("%v/%v", host, key)
//}

//client, err := ethclient.Dial(host)
//if err != nil {
// return nil, err
//}

//tokenAddress := common.HexToAddress(contractAddress)
//instance, err := token.NewToken1155(tokenAddress, client)
//if err != nil {
// return nil, err
//}
//
//address := common.HexToAddress(userAddress)
//name, err := instance.Uri(&bind.CallOpts{Pending: false, From: address})
//if err != nil {
// log.Printf("contract:%v,from:%v,err=%v", contractAddress, userAddress, err.Error())
// return nil, err
//}
//mp["name"] = name
//
//symbol, err := instance.Symbol(&bind.CallOpts{Pending: false, From: address})
//if err != nil {
// log.Printf("contract:%v,from:%v,err=%v", contractAddress, userAddress, err.Error())
// return nil, err
//} else {
// mp["symbol"] = symbol
//}

return mp, nil
}

func (e *PolygonPos) Subscribe(host string, token string) (string, error) {
Expand All @@ -52,6 +269,10 @@ func NewChainClient() blockchain.ChainConn {
return &PolygonPos{}
}

func NewNFTClient() blockchain.NFT {
return &PolygonPos{}
}

func (e *PolygonPos) SendRequestToChainByHttp(host string, token string, query string) (string, error) {
//TODO implement me
panic("implement me")
Expand Down
2 changes: 2 additions & 0 deletions blockchain/service/gw.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ func NewApi(blockchain int64, cluster []*config.NodeCluster, xlog *xlog.XLog) bl
func NewNftApi(blockchain int64, cluster []*config.NodeCluster, xlog *xlog.XLog) blockchain.NftApi {
if blockchain == 200 {
return ether.NewNftEth(cluster, blockchain, xlog)
} else if blockchain == 201 {
return polygon.NewNftPolygonPos(cluster, blockchain, xlog)
} else if blockchain == 202 {
return bnb.NewNftBnb(cluster, blockchain, xlog)
}
Expand Down
99 changes: 97 additions & 2 deletions blockchain/service/polygon/polygon_pos.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,90 @@ type PolygonPos struct {
log *xlog.XLog
nodeCluster []*config.NodeCluster
blockChainClient blockchain.ChainConn
nftClient blockchain.NFT
}

func (e *PolygonPos) TokenURI(chainCode int64, contractAddress string, tokenId string, eip int64) (string, error) {
cluster := e.BalanceCluster()
if cluster == nil {
//不存在节点
return "", errors.New("blockchain node has not found")
}
resp, err := e.nftClient.TokenURI(cluster.NodeUrl, cluster.NodeToken, contractAddress, tokenId, eip)
if err != nil {
cluster.ErrorCount += 1
return "", err
}
return resp, nil
}

func (e *PolygonPos) BalanceOf(chainCode int64, contractAddress string, address string, tokenId string, eip int64) (string, error) {
cluster := e.BalanceCluster()
if cluster == nil {
//不存在节点
return "", errors.New("blockchain node has not found")
}
resp, err := e.nftClient.BalanceOf(cluster.NodeUrl, cluster.NodeToken, contractAddress, address, tokenId, eip)
if err != nil {
cluster.ErrorCount += 1
return "", err
}
return resp, nil
}

func (e *PolygonPos) OwnerOf(chainCode int64, contractAddress string, tokenId string, eip int64) (string, error) {
cluster := e.BalanceCluster()
if cluster == nil {
//不存在节点
return "", errors.New("blockchain node has not found")
}
resp, err := e.nftClient.OwnerOf(cluster.NodeUrl, cluster.NodeToken, contractAddress, tokenId, eip)
if err != nil {
cluster.ErrorCount += 1
return "", err
}
return resp, nil
}

func (e *PolygonPos) TotalSupply(chainCode int64, contractAddress string, eip int64) (string, error) {
cluster := e.BalanceCluster()
if cluster == nil {
//不存在节点
return "", errors.New("blockchain node has not found")
}
resp, err := e.nftClient.TotalSupply(cluster.NodeUrl, cluster.NodeToken, contractAddress, eip)
if err != nil {
cluster.ErrorCount += 1
return "", err
}
return resp, nil
}

func (e *PolygonPos) Token(chainCode int64, contractAddr string, abi string, eip string) (string, error) {
//TODO implement me
panic("implement me")
cluster := e.BalanceCluster()
if cluster == nil {
//不存在节点
return "", errors.New("blockchain node has not found")
}

var resp map[string]any
var err error
if eip == "721" {
resp, err = e.blockChainClient.GetToken721(cluster.NodeUrl, cluster.NodeToken, contractAddr, "")
} else if eip == "1155" {
resp, err = e.blockChainClient.GetToken1155(cluster.NodeUrl, cluster.NodeToken, contractAddr, "")
} else if eip == "20" {
resp, err = e.blockChainClient.GetToken20(cluster.NodeUrl, cluster.NodeToken, contractAddr, "")
} else {
return "", fmt.Errorf("unknow the eip:%v", eip)
}

if err != nil {
cluster.ErrorCount += 1
}

bs, _ := json.Marshal(resp)
return string(bs), err
}

func (e *PolygonPos) GetCode(chainCode int64, address string) (string, error) {
Expand Down Expand Up @@ -237,6 +316,22 @@ func NewPolygonPos(cluster []*config.NodeCluster, blockchain int64, xlog *xlog.X
return e
}

func NewNftPolygonPos(cluster []*config.NodeCluster, blockchain int64, xlog *xlog.XLog) blockchain.NftApi {
nftClient := chain.NewNFT(blockchain)
if nftClient == nil {
return nil
}

chain.NewNFT(blockchain)
e := &PolygonPos{
log: xlog,
nodeCluster: cluster,
nftClient: nftClient,
}
e.StartWDT()
return e
}

func (e *PolygonPos) StartWDT() {
go func() {
t := time.NewTicker(10 * time.Minute)
Expand Down
Loading

0 comments on commit 5560ce1

Please sign in to comment.