evm/pancakeswap/nftmarket.go
2021-11-09 08:11:05 +04:00

73 lines
2.6 KiB
Go

package pancakeswap
import (
"context"
"math/big"
"git.lehouerou.net/laurent/evm"
"git.lehouerou.net/laurent/evm/pancakeswap/contracts"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/pkg/errors"
"github.com/shopspring/decimal"
)
const (
MarketAddress = "0x17539cCa21C7933Df5c980172d22659B8C345C5A"
)
type NftMarket struct {
client evm.Client
contract *contracts.NftMarket
wbnb evm.Token
}
func NewNftMarket(client evm.Client) (*NftMarket, error) {
contract, err := contracts.NewNftMarket(common.HexToAddress(MarketAddress), client)
if err != nil {
return nil, errors.Wrap(err, "init contract")
}
wbnb, err := client.TokenService().TokenBySymbol("WBNB")
if err != nil {
return nil, errors.Wrap(err, "init wbnb contract")
}
return &NftMarket{
client: client,
contract: contract,
wbnb: wbnb,
}, nil
}
func (m *NftMarket) GetAskPriceForToken(collection common.Address, tokenid int) (decimal.Decimal, error) {
res, err := m.contract.ViewAsksByCollectionAndTokenIds(&bind.CallOpts{}, collection, []*big.Int{big.NewInt(int64(tokenid))})
if err != nil {
return decimal.Zero, errors.Wrap(err, "calling contract")
}
if len(res.AskInfo) == 0 {
return decimal.Zero, errors.New("no info found for this token")
}
return m.wbnb.ValueFromBigInt(res.AskInfo[0].Price), nil
}
func (m *NftMarket) BuyTokenWithBNB(ctx context.Context, collection common.Address, tokenid int, opts ...evm.ExecutionOption) (evm.Transaction, error) {
return m.client.Execute(ctx, func(ctx context.Context, opts *evm.TransactOpts) (*types.Transaction, error) {
opts.SetGasLimit(1000000)
return m.contract.BuyTokenUsingBNB(opts.TransactOpts, collection, big.NewInt(int64(tokenid)))
}, opts...)
}
func (m *NftMarket) BuyTokenWithWBNB(ctx context.Context, collection common.Address, tokenid int, price decimal.Decimal, opts ...evm.ExecutionOption) (evm.Transaction, error) {
return m.client.Execute(ctx, func(ctx context.Context, opts *evm.TransactOpts) (*types.Transaction, error) {
opts.SetGasLimit(1000000)
return m.contract.BuyTokenUsingWBNB(opts.TransactOpts, collection, big.NewInt(int64(tokenid)), m.wbnb.ValueToBigInt(price))
}, opts...)
}
func (m *NftMarket) CreateAskOrder(ctx context.Context, collection common.Address, tokenid int, price decimal.Decimal, opts ...evm.ExecutionOption) (evm.Transaction, error) {
return m.client.Execute(ctx, func(ctx context.Context, opts *evm.TransactOpts) (*types.Transaction, error) {
return m.contract.CreateAskOrder(opts.TransactOpts, collection, big.NewInt(int64(tokenid)), m.wbnb.ValueToBigInt(price))
}, opts...)
}