100 lines
2.9 KiB
Go
100 lines
2.9 KiB
Go
package communitytokens
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
|
"github.com/ethereum/go-ethereum/common"
|
|
"github.com/status-im/status-go/contracts/community-tokens/assets"
|
|
"github.com/status-im/status-go/contracts/community-tokens/collectibles"
|
|
"github.com/status-im/status-go/rpc"
|
|
"github.com/status-im/status-go/services/wallet/bigint"
|
|
)
|
|
|
|
type Manager struct {
|
|
rpcClient *rpc.Client
|
|
}
|
|
|
|
func NewManager(rpcClient *rpc.Client) *Manager {
|
|
return &Manager{
|
|
rpcClient: rpcClient,
|
|
}
|
|
}
|
|
|
|
func (m *Manager) NewCollectiblesInstance(chainID uint64, contractAddress string) (*collectibles.Collectibles, error) {
|
|
backend, err := m.rpcClient.EthClient(chainID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return collectibles.NewCollectibles(common.HexToAddress(contractAddress), backend)
|
|
}
|
|
|
|
func (m *Manager) GetCollectiblesContractInstance(chainID uint64, contractAddress string) (*collectibles.Collectibles, error) {
|
|
contractInst, err := m.NewCollectiblesInstance(chainID, contractAddress)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return contractInst, nil
|
|
}
|
|
|
|
func (m *Manager) NewAssetsInstance(chainID uint64, contractAddress string) (*assets.Assets, error) {
|
|
backend, err := m.rpcClient.EthClient(chainID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return assets.NewAssets(common.HexToAddress(contractAddress), backend)
|
|
}
|
|
|
|
func (m *Manager) GetAssetContractInstance(chainID uint64, contractAddress string) (*assets.Assets, error) {
|
|
contractInst, err := m.NewAssetsInstance(chainID, contractAddress)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return contractInst, nil
|
|
}
|
|
|
|
func (m *Manager) GetCollectibleContractData(chainID uint64, contractAddress string) (*CollectibleContractData, error) {
|
|
callOpts := &bind.CallOpts{Context: context.Background(), Pending: false}
|
|
|
|
contract, err := m.GetCollectiblesContractInstance(chainID, contractAddress)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
totalSupply, err := contract.TotalSupply(callOpts)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
transferable, err := contract.Transferable(callOpts)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
remoteBurnable, err := contract.RemoteBurnable(callOpts)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &CollectibleContractData{
|
|
TotalSupply: &bigint.BigInt{Int: totalSupply},
|
|
Transferable: transferable,
|
|
RemoteBurnable: remoteBurnable,
|
|
InfiniteSupply: GetInfiniteSupply().Cmp(totalSupply) == 0,
|
|
}, nil
|
|
}
|
|
|
|
func (m *Manager) GetAssetContractData(chainID uint64, contractAddress string) (*AssetContractData, error) {
|
|
callOpts := &bind.CallOpts{Context: context.Background(), Pending: false}
|
|
contract, err := m.GetAssetContractInstance(chainID, contractAddress)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
totalSupply, err := contract.TotalSupply(callOpts)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &AssetContractData{
|
|
TotalSupply: &bigint.BigInt{Int: totalSupply},
|
|
InfiniteSupply: GetInfiniteSupply().Cmp(totalSupply) == 0,
|
|
}, nil
|
|
}
|