chore_: stickers buy added to the router
This commit is contained in:
parent
74e9ce93bf
commit
ddc75815eb
|
@ -27,4 +27,5 @@ const (
|
||||||
ProcessorENSRegisterName = "ENSRegister"
|
ProcessorENSRegisterName = "ENSRegister"
|
||||||
ProcessorENSReleaseName = "ENSRelease"
|
ProcessorENSReleaseName = "ENSRelease"
|
||||||
ProcessorENSPublicKeyName = "ENSPublicKey"
|
ProcessorENSPublicKeyName = "ENSPublicKey"
|
||||||
|
ProcessorStickersBuyName = "StickersBuy"
|
||||||
)
|
)
|
||||||
|
|
|
@ -42,4 +42,5 @@ type ProcessorInputParams struct {
|
||||||
BonderFee *big.Int
|
BonderFee *big.Int
|
||||||
Username string
|
Username string
|
||||||
PublicKey string
|
PublicKey string
|
||||||
|
PackID *big.Int
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,6 @@ func NewENSRegisterProcessor(rpcClient *rpc.Client, transactor transactions.Tran
|
||||||
contractMaker: &contracts.ContractMaker{
|
contractMaker: &contracts.ContractMaker{
|
||||||
RPCClient: rpcClient,
|
RPCClient: rpcClient,
|
||||||
},
|
},
|
||||||
// rpcClient: rpcClient,
|
|
||||||
transactor: transactor,
|
transactor: transactor,
|
||||||
ensService: ensService,
|
ensService: ensService,
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,156 @@
|
||||||
|
package pathprocessor
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"math/big"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum"
|
||||||
|
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||||
|
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
||||||
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||||
|
ethTypes "github.com/ethereum/go-ethereum/core/types"
|
||||||
|
"github.com/status-im/status-go/account"
|
||||||
|
"github.com/status-im/status-go/contracts"
|
||||||
|
"github.com/status-im/status-go/contracts/snt"
|
||||||
|
stickersContracts "github.com/status-im/status-go/contracts/stickers"
|
||||||
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
|
"github.com/status-im/status-go/rpc"
|
||||||
|
"github.com/status-im/status-go/services/stickers"
|
||||||
|
walletCommon "github.com/status-im/status-go/services/wallet/common"
|
||||||
|
"github.com/status-im/status-go/transactions"
|
||||||
|
)
|
||||||
|
|
||||||
|
type StickersBuyProcessor struct {
|
||||||
|
contractMaker *contracts.ContractMaker
|
||||||
|
transactor transactions.TransactorIface
|
||||||
|
stickersService *stickers.Service
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewStickersBuyProcessor(rpcClient *rpc.Client, transactor transactions.TransactorIface, stickersService *stickers.Service) *StickersBuyProcessor {
|
||||||
|
return &StickersBuyProcessor{
|
||||||
|
contractMaker: &contracts.ContractMaker{
|
||||||
|
RPCClient: rpcClient,
|
||||||
|
},
|
||||||
|
transactor: transactor,
|
||||||
|
stickersService: stickersService,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *StickersBuyProcessor) Name() string {
|
||||||
|
return ProcessorStickersBuyName
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *StickersBuyProcessor) AvailableFor(params ProcessorInputParams) (bool, error) {
|
||||||
|
return params.FromChain.ChainID == walletCommon.EthereumMainnet || params.FromChain.ChainID == walletCommon.EthereumSepolia, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *StickersBuyProcessor) CalculateFees(params ProcessorInputParams) (*big.Int, *big.Int, error) {
|
||||||
|
return ZeroBigIntValue, ZeroBigIntValue, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *StickersBuyProcessor) PackTxInputData(params ProcessorInputParams) ([]byte, error) {
|
||||||
|
stickerType, err := s.contractMaker.NewStickerType(params.FromChain.ChainID)
|
||||||
|
if err != nil {
|
||||||
|
return []byte{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
callOpts := &bind.CallOpts{Context: context.Background(), Pending: false}
|
||||||
|
|
||||||
|
packInfo, err := stickerType.GetPackData(callOpts, params.PackID)
|
||||||
|
if err != nil {
|
||||||
|
return []byte{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
stickerMarketABI, err := abi.JSON(strings.NewReader(stickersContracts.StickerMarketABI))
|
||||||
|
if err != nil {
|
||||||
|
return []byte{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
extraData, err := stickerMarketABI.Pack("buyToken", params.PackID, params.FromAddr, packInfo.Price)
|
||||||
|
if err != nil {
|
||||||
|
return []byte{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
sntABI, err := abi.JSON(strings.NewReader(snt.SNTABI))
|
||||||
|
if err != nil {
|
||||||
|
return []byte{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
stickerMarketAddress, err := stickersContracts.StickerMarketContractAddress(params.FromChain.ChainID)
|
||||||
|
if err != nil {
|
||||||
|
return []byte{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return sntABI.Pack("approveAndCall", stickerMarketAddress, packInfo.Price, extraData)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *StickersBuyProcessor) EstimateGas(params ProcessorInputParams) (uint64, error) {
|
||||||
|
contractAddress, err := s.GetContractAddress(params)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
input, err := s.PackTxInputData(params)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ethClient, err := s.contractMaker.RPCClient.EthClient(params.FromChain.ChainID)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
msg := ethereum.CallMsg{
|
||||||
|
From: params.FromAddr,
|
||||||
|
To: &contractAddress,
|
||||||
|
Value: ZeroBigIntValue,
|
||||||
|
Data: input,
|
||||||
|
}
|
||||||
|
|
||||||
|
estimation, err := ethClient.EstimateGas(context.Background(), msg)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
increasedEstimation := float64(estimation) * IncreaseEstimatedGasFactor
|
||||||
|
|
||||||
|
return uint64(increasedEstimation), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *StickersBuyProcessor) BuildTx(params ProcessorInputParams) (*ethTypes.Transaction, error) {
|
||||||
|
toAddr := types.Address(params.ToAddr)
|
||||||
|
inputData, err := s.PackTxInputData(params)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
sendArgs := &MultipathProcessorTxArgs{
|
||||||
|
TransferTx: &transactions.SendTxArgs{
|
||||||
|
From: types.Address(params.FromAddr),
|
||||||
|
To: &toAddr,
|
||||||
|
Value: (*hexutil.Big)(ZeroBigIntValue),
|
||||||
|
Data: inputData,
|
||||||
|
},
|
||||||
|
ChainID: params.FromChain.ChainID,
|
||||||
|
}
|
||||||
|
|
||||||
|
return s.BuildTransaction(sendArgs)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *StickersBuyProcessor) Send(sendArgs *MultipathProcessorTxArgs, verifiedAccount *account.SelectedExtKey) (hash types.Hash, err error) {
|
||||||
|
return s.transactor.SendTransactionWithChainID(sendArgs.ChainID, *sendArgs.TransferTx, verifiedAccount)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *StickersBuyProcessor) BuildTransaction(sendArgs *MultipathProcessorTxArgs) (*ethTypes.Transaction, error) {
|
||||||
|
return s.transactor.ValidateAndBuildTransaction(sendArgs.ChainID, *sendArgs.TransferTx)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *StickersBuyProcessor) CalculateAmountOut(params ProcessorInputParams) (*big.Int, error) {
|
||||||
|
return params.AmountIn, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *StickersBuyProcessor) GetContractAddress(params ProcessorInputParams) (common.Address, error) {
|
||||||
|
return snt.ContractAddress(params.FromChain.ChainID)
|
||||||
|
}
|
|
@ -286,6 +286,7 @@ func NewRouter(rpcClient *rpc.Client, transactor *transactions.Transactor, token
|
||||||
ensRegister := pathprocessor.NewENSRegisterProcessor(rpcClient, transactor, ensService)
|
ensRegister := pathprocessor.NewENSRegisterProcessor(rpcClient, transactor, ensService)
|
||||||
ensRelease := pathprocessor.NewENSReleaseProcessor(rpcClient, transactor, ensService)
|
ensRelease := pathprocessor.NewENSReleaseProcessor(rpcClient, transactor, ensService)
|
||||||
ensPublicKey := pathprocessor.NewENSPublicKeyProcessor(rpcClient, transactor, ensService)
|
ensPublicKey := pathprocessor.NewENSPublicKeyProcessor(rpcClient, transactor, ensService)
|
||||||
|
buyStickers := pathprocessor.NewStickersBuyProcessor(rpcClient, transactor, stickersService)
|
||||||
|
|
||||||
processors[transfer.Name()] = transfer
|
processors[transfer.Name()] = transfer
|
||||||
processors[erc721Transfer.Name()] = erc721Transfer
|
processors[erc721Transfer.Name()] = erc721Transfer
|
||||||
|
@ -296,6 +297,7 @@ func NewRouter(rpcClient *rpc.Client, transactor *transactions.Transactor, token
|
||||||
processors[ensRegister.Name()] = ensRegister
|
processors[ensRegister.Name()] = ensRegister
|
||||||
processors[ensRelease.Name()] = ensRelease
|
processors[ensRelease.Name()] = ensRelease
|
||||||
processors[ensPublicKey.Name()] = ensPublicKey
|
processors[ensPublicKey.Name()] = ensPublicKey
|
||||||
|
processors[buyStickers.Name()] = buyStickers
|
||||||
|
|
||||||
return &Router{
|
return &Router{
|
||||||
rpcClient: rpcClient,
|
rpcClient: rpcClient,
|
||||||
|
@ -342,7 +344,7 @@ type Router struct {
|
||||||
|
|
||||||
func (r *Router) requireApproval(ctx context.Context, sendType SendType, approvalContractAddress *common.Address, account common.Address, network *params.Network, token *token.Token, amountIn *big.Int) (
|
func (r *Router) requireApproval(ctx context.Context, sendType SendType, approvalContractAddress *common.Address, account common.Address, network *params.Network, token *token.Token, amountIn *big.Int) (
|
||||||
bool, *big.Int, uint64, uint64, error) {
|
bool, *big.Int, uint64, uint64, error) {
|
||||||
if sendType.IsCollectiblesTransfer() || sendType.IsEnsTransfer() {
|
if sendType.IsCollectiblesTransfer() || sendType.IsEnsTransfer() || sendType.IsStickersTransfer() {
|
||||||
return false, nil, 0, 0, nil
|
return false, nil, 0, 0, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -550,7 +552,8 @@ func (r *Router) SuggestedRoutes(
|
||||||
// Skip processors that are added because of the Router V2, to not break the current functionality
|
// Skip processors that are added because of the Router V2, to not break the current functionality
|
||||||
if pProcessor.Name() == pathprocessor.ProcessorENSRegisterName ||
|
if pProcessor.Name() == pathprocessor.ProcessorENSRegisterName ||
|
||||||
pProcessor.Name() == pathprocessor.ProcessorENSReleaseName ||
|
pProcessor.Name() == pathprocessor.ProcessorENSReleaseName ||
|
||||||
pProcessor.Name() == pathprocessor.ProcessorENSPublicKeyName {
|
pProcessor.Name() == pathprocessor.ProcessorENSPublicKeyName ||
|
||||||
|
pProcessor.Name() == pathprocessor.ProcessorStickersBuyName {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,10 @@ func (s SendType) IsEnsTransfer() bool {
|
||||||
return s == ENSRegister || s == ENSRelease || s == ENSSetPubKey
|
return s == ENSRegister || s == ENSRelease || s == ENSSetPubKey
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s SendType) IsStickersTransfer() bool {
|
||||||
|
return s == StickersBuy
|
||||||
|
}
|
||||||
|
|
||||||
func (s SendType) FetchPrices(marketManager *market.Manager, tokenID string) (map[string]float64, error) {
|
func (s SendType) FetchPrices(marketManager *market.Manager, tokenID string) (map[string]float64, error) {
|
||||||
symbols := []string{tokenID, "ETH"}
|
symbols := []string{tokenID, "ETH"}
|
||||||
if s.IsCollectiblesTransfer() {
|
if s.IsCollectiblesTransfer() {
|
||||||
|
@ -96,7 +100,7 @@ func (s SendType) isTransfer(routerV2Logic bool) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s SendType) needL1Fee() bool {
|
func (s SendType) needL1Fee() bool {
|
||||||
return s != ENSRegister && s != ENSRelease && s != ENSSetPubKey && s != StickersBuy
|
return !s.IsEnsTransfer() && !s.IsStickersTransfer()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s SendType) canUseProcessor(p pathprocessor.PathProcessor) bool {
|
func (s SendType) canUseProcessor(p pathprocessor.PathProcessor) bool {
|
||||||
|
@ -112,13 +116,18 @@ func (s SendType) canUseProcessor(p pathprocessor.PathProcessor) bool {
|
||||||
return pathProcessorName == pathprocessor.ProcessorENSReleaseName
|
return pathProcessorName == pathprocessor.ProcessorENSReleaseName
|
||||||
case ENSSetPubKey:
|
case ENSSetPubKey:
|
||||||
return pathProcessorName == pathprocessor.ProcessorENSPublicKeyName
|
return pathProcessorName == pathprocessor.ProcessorENSPublicKeyName
|
||||||
|
case StickersBuy:
|
||||||
|
return pathProcessorName == pathprocessor.ProcessorStickersBuyName
|
||||||
default:
|
default:
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s SendType) isAvailableBetween(from, to *params.Network) bool {
|
func (s SendType) isAvailableBetween(from, to *params.Network) bool {
|
||||||
if s.IsCollectiblesTransfer() || s.IsEnsTransfer() {
|
if s.IsCollectiblesTransfer() ||
|
||||||
|
s.IsEnsTransfer() ||
|
||||||
|
s.IsStickersTransfer() ||
|
||||||
|
s == Swap {
|
||||||
return from.ChainID == to.ChainID
|
return from.ChainID == to.ChainID
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,10 +135,6 @@ func (s SendType) isAvailableBetween(from, to *params.Network) bool {
|
||||||
return from.ChainID != to.ChainID
|
return from.ChainID != to.ChainID
|
||||||
}
|
}
|
||||||
|
|
||||||
if s == Swap {
|
|
||||||
return from.ChainID == to.ChainID
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -153,7 +158,7 @@ func (s SendType) isAvailableFor(network *params.Network) bool {
|
||||||
return swapAllowedNetworks[network.ChainID]
|
return swapAllowedNetworks[network.ChainID]
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.IsEnsTransfer() {
|
if s.IsEnsTransfer() || s.IsStickersTransfer() {
|
||||||
return network.ChainID == walletCommon.EthereumMainnet || network.ChainID == walletCommon.EthereumSepolia
|
return network.ChainID == walletCommon.EthereumMainnet || network.ChainID == walletCommon.EthereumSepolia
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@ import (
|
||||||
"github.com/status-im/status-go/params"
|
"github.com/status-im/status-go/params"
|
||||||
"github.com/status-im/status-go/services/ens"
|
"github.com/status-im/status-go/services/ens"
|
||||||
"github.com/status-im/status-go/services/wallet/async"
|
"github.com/status-im/status-go/services/wallet/async"
|
||||||
|
"github.com/status-im/status-go/services/wallet/bigint"
|
||||||
walletCommon "github.com/status-im/status-go/services/wallet/common"
|
walletCommon "github.com/status-im/status-go/services/wallet/common"
|
||||||
"github.com/status-im/status-go/services/wallet/router/pathprocessor"
|
"github.com/status-im/status-go/services/wallet/router/pathprocessor"
|
||||||
walletToken "github.com/status-im/status-go/services/wallet/token"
|
walletToken "github.com/status-im/status-go/services/wallet/token"
|
||||||
|
@ -49,6 +50,7 @@ type RouteInputParams struct {
|
||||||
// For send types like EnsRegister, EnsRelease, EnsSetPubKey, StickersBuy
|
// For send types like EnsRegister, EnsRelease, EnsSetPubKey, StickersBuy
|
||||||
Username string `json:"username"`
|
Username string `json:"username"`
|
||||||
PublicKey string `json:"publicKey"`
|
PublicKey string `json:"publicKey"`
|
||||||
|
PackID *bigint.BigInt `json:"packID"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type PathV2 struct {
|
type PathV2 struct {
|
||||||
|
@ -318,6 +320,12 @@ func validateInputData(input *RouteInputParams) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if input.SendType == StickersBuy {
|
||||||
|
if input.PackID == nil {
|
||||||
|
return errors.New("packID is required for StickersBuy")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if input.FromLockedAmount != nil && len(input.FromLockedAmount) > 0 {
|
if input.FromLockedAmount != nil && len(input.FromLockedAmount) > 0 {
|
||||||
for chainID, amount := range input.FromLockedAmount {
|
for chainID, amount := range input.FromLockedAmount {
|
||||||
if input.TestnetMode {
|
if input.TestnetMode {
|
||||||
|
@ -442,6 +450,7 @@ func (r *Router) SuggestedRoutesV2(ctx context.Context, input *RouteInputParams)
|
||||||
|
|
||||||
Username: input.Username,
|
Username: input.Username,
|
||||||
PublicKey: input.PublicKey,
|
PublicKey: input.PublicKey,
|
||||||
|
PackID: input.PackID.Int,
|
||||||
}
|
}
|
||||||
|
|
||||||
can, err := pProcessor.AvailableFor(ProcessorInputParams)
|
can, err := pProcessor.AvailableFor(ProcessorInputParams)
|
||||||
|
|
Loading…
Reference in New Issue