feat(wallet)_: added supported chains and recurrent purchase url to onramp providers
This commit is contained in:
parent
69514629f0
commit
717c7df690
|
@ -25,6 +25,7 @@ import (
|
|||
wcommon "github.com/status-im/status-go/services/wallet/common"
|
||||
"github.com/status-im/status-go/services/wallet/currency"
|
||||
"github.com/status-im/status-go/services/wallet/history"
|
||||
"github.com/status-im/status-go/services/wallet/onramp"
|
||||
"github.com/status-im/status-go/services/wallet/router"
|
||||
"github.com/status-im/status-go/services/wallet/thirdparty"
|
||||
"github.com/status-im/status-go/services/wallet/token"
|
||||
|
@ -304,7 +305,7 @@ func (api *API) WatchTransactionByChainID(ctx context.Context, chainID uint64, t
|
|||
}
|
||||
}
|
||||
|
||||
func (api *API) GetCryptoOnRamps(ctx context.Context) ([]CryptoOnRamp, error) {
|
||||
func (api *API) GetCryptoOnRamps(ctx context.Context) ([]onramp.CryptoOnRamp, error) {
|
||||
return api.s.cryptoOnRampManager.Get()
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,121 @@
|
|||
package onramp
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"time"
|
||||
)
|
||||
|
||||
type DataSourceType int
|
||||
|
||||
const (
|
||||
DataSourceHTTP DataSourceType = iota + 1
|
||||
DataSourceStatic
|
||||
)
|
||||
|
||||
type CryptoOnRamp struct {
|
||||
Name string `json:"name"`
|
||||
Description string `json:"description"`
|
||||
Fees string `json:"fees"`
|
||||
LogoURL string `json:"logoUrl"`
|
||||
SiteURL string `json:"siteUrl"`
|
||||
RecurrentSiteURL string `json:"recurrentSiteUrl"`
|
||||
Hostname string `json:"hostname"`
|
||||
Params map[string]string `json:"params"` // TODO implement params in JSON and parsing status-mobile
|
||||
SupportedChainIDs []uint64 `json:"supportedChainIds"`
|
||||
}
|
||||
|
||||
type Options struct {
|
||||
DataSource string
|
||||
DataSourceType DataSourceType
|
||||
}
|
||||
|
||||
type Manager struct {
|
||||
options *Options
|
||||
ramps []CryptoOnRamp
|
||||
lastCalled time.Time
|
||||
}
|
||||
|
||||
func NewManager(options *Options) *Manager {
|
||||
return &Manager{
|
||||
options: options,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Manager) Get() ([]CryptoOnRamp, error) {
|
||||
var ramps []CryptoOnRamp
|
||||
var err error
|
||||
|
||||
switch c.options.DataSourceType {
|
||||
case DataSourceHTTP:
|
||||
if !c.hasCacheExpired(time.Now()) {
|
||||
return c.ramps, nil
|
||||
}
|
||||
ramps, err = c.getFromHTTPDataSource()
|
||||
c.lastCalled = time.Now()
|
||||
case DataSourceStatic:
|
||||
ramps, err = c.getFromStaticDataSource()
|
||||
default:
|
||||
return nil, fmt.Errorf("unsupported Manager.DataSourceType '%d'", c.options.DataSourceType)
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
c.ramps = ramps
|
||||
|
||||
return c.ramps, nil
|
||||
}
|
||||
|
||||
func (c *Manager) hasCacheExpired(t time.Time) bool {
|
||||
// If lastCalled + 1 hour is before the given time, then 1 hour hasn't passed yet
|
||||
return c.lastCalled.Add(time.Hour).Before(t)
|
||||
}
|
||||
|
||||
func (c *Manager) getFromHTTPDataSource() ([]CryptoOnRamp, error) {
|
||||
if c.options.DataSource == "" {
|
||||
return nil, errors.New("data source is not set for Manager")
|
||||
}
|
||||
|
||||
sgc := http.Client{
|
||||
Timeout: time.Second * 5,
|
||||
}
|
||||
|
||||
req, err := http.NewRequest(http.MethodGet, c.options.DataSource, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
req.Header.Set("User-Agent", "status-go")
|
||||
|
||||
res, err := sgc.Do(req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if res.Body != nil {
|
||||
defer res.Body.Close()
|
||||
}
|
||||
|
||||
body, err := ioutil.ReadAll(res.Body)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
fmt.Println(string(body))
|
||||
|
||||
var ramps []CryptoOnRamp
|
||||
|
||||
err = json.Unmarshal(body, &ramps)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return ramps, nil
|
||||
}
|
||||
|
||||
func (c *Manager) getFromStaticDataSource() ([]CryptoOnRamp, error) {
|
||||
return getOnRampProviders(), nil
|
||||
}
|
File diff suppressed because one or more lines are too long
|
@ -1,4 +1,4 @@
|
|||
package wallet
|
||||
package onramp
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
@ -10,18 +10,18 @@ import (
|
|||
)
|
||||
|
||||
const (
|
||||
path = "../../_assets/tests/"
|
||||
path = "../../../_assets/tests/"
|
||||
)
|
||||
|
||||
func TestCryptoOnRamps_Get(t *testing.T) {
|
||||
s := httptest.NewServer(http.FileServer(http.Dir(path)))
|
||||
defer s.Close()
|
||||
|
||||
cs := []*CryptoOnRampManager{
|
||||
{options: &CryptoOnRampOptions{dataSourceType: DataSourceStatic}},
|
||||
{options: &CryptoOnRampOptions{
|
||||
dataSourceType: DataSourceHTTP,
|
||||
dataSource: s.URL + "/ramps.json",
|
||||
cs := []*Manager{
|
||||
{options: &Options{DataSourceType: DataSourceStatic}},
|
||||
{options: &Options{
|
||||
DataSourceType: DataSourceHTTP,
|
||||
DataSource: s.URL + "/ramps.json",
|
||||
}},
|
||||
}
|
||||
|
||||
|
@ -38,9 +38,9 @@ func TestCryptoOnRampManager_hasCacheExpired(t *testing.T) {
|
|||
s := httptest.NewServer(http.FileServer(http.Dir(path)))
|
||||
defer s.Close()
|
||||
|
||||
corm := NewCryptoOnRampManager(&CryptoOnRampOptions{
|
||||
dataSourceType: DataSourceHTTP,
|
||||
dataSource: s.URL + "/ramps.json",
|
||||
corm := NewManager(&Options{
|
||||
DataSourceType: DataSourceHTTP,
|
||||
DataSource: s.URL + "/ramps.json",
|
||||
})
|
||||
nt := time.Time{}.Add(30 * time.Minute)
|
||||
|
|
@ -27,6 +27,7 @@ import (
|
|||
"github.com/status-im/status-go/services/wallet/currency"
|
||||
"github.com/status-im/status-go/services/wallet/history"
|
||||
"github.com/status-im/status-go/services/wallet/market"
|
||||
"github.com/status-im/status-go/services/wallet/onramp"
|
||||
"github.com/status-im/status-go/services/wallet/thirdparty"
|
||||
"github.com/status-im/status-go/services/wallet/thirdparty/alchemy"
|
||||
"github.com/status-im/status-go/services/wallet/thirdparty/coingecko"
|
||||
|
@ -60,8 +61,8 @@ func NewService(
|
|||
feed *event.Feed,
|
||||
mediaServer *server.MediaServer,
|
||||
) *Service {
|
||||
cryptoOnRampManager := NewCryptoOnRampManager(&CryptoOnRampOptions{
|
||||
dataSourceType: DataSourceStatic,
|
||||
cryptoOnRampManager := onramp.NewManager(&onramp.Options{
|
||||
DataSourceType: onramp.DataSourceStatic,
|
||||
})
|
||||
|
||||
signals := &walletevent.SignalsTransmitter{
|
||||
|
@ -210,7 +211,7 @@ type Service struct {
|
|||
communityManager *community.Manager
|
||||
transactionManager *transfer.TransactionManager
|
||||
pendingTxManager *transactions.PendingTxTracker
|
||||
cryptoOnRampManager *CryptoOnRampManager
|
||||
cryptoOnRampManager *onramp.Manager
|
||||
transferController *transfer.Controller
|
||||
marketManager *market.Manager
|
||||
started bool
|
||||
|
|
Loading…
Reference in New Issue