2024-06-27 14:21:20 +00:00
|
|
|
package wallet
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
2024-08-12 12:53:32 +00:00
|
|
|
"errors"
|
2024-08-20 10:09:39 +00:00
|
|
|
"fmt"
|
|
|
|
"net/http"
|
|
|
|
"net/http/httptest"
|
2024-06-27 14:21:20 +00:00
|
|
|
"testing"
|
2024-08-20 10:09:39 +00:00
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/event"
|
2024-06-27 14:21:20 +00:00
|
|
|
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
2024-08-12 12:53:32 +00:00
|
|
|
gomock "go.uber.org/mock/gomock"
|
|
|
|
|
2024-08-20 10:09:39 +00:00
|
|
|
"github.com/status-im/status-go/appdatabase"
|
|
|
|
"github.com/status-im/status-go/multiaccounts/accounts"
|
|
|
|
"github.com/status-im/status-go/params"
|
|
|
|
"github.com/status-im/status-go/rpc"
|
2024-08-12 12:53:32 +00:00
|
|
|
"github.com/status-im/status-go/services/wallet/onramp"
|
|
|
|
mock_onramp "github.com/status-im/status-go/services/wallet/onramp/mock"
|
2024-08-20 10:09:39 +00:00
|
|
|
"github.com/status-im/status-go/services/wallet/requests"
|
2024-06-27 14:21:20 +00:00
|
|
|
"github.com/status-im/status-go/services/wallet/walletconnect"
|
2024-08-20 10:09:39 +00:00
|
|
|
"github.com/status-im/status-go/t/helpers"
|
|
|
|
"github.com/status-im/status-go/walletdatabase"
|
2024-06-27 14:21:20 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// TestAPI_GetWalletConnectActiveSessions tames coverage
|
|
|
|
func TestAPI_GetWalletConnectActiveSessions(t *testing.T) {
|
|
|
|
db, close := walletconnect.SetupTestDB(t)
|
|
|
|
defer close()
|
|
|
|
api := &API{
|
|
|
|
s: &Service{db: db},
|
|
|
|
}
|
|
|
|
|
|
|
|
sessions, err := api.GetWalletConnectActiveSessions(context.Background(), 0)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, 0, len(sessions))
|
|
|
|
}
|
2024-07-02 21:46:47 +00:00
|
|
|
|
|
|
|
// TestAPI_HashMessageEIP191
|
|
|
|
func TestAPI_HashMessageEIP191(t *testing.T) {
|
|
|
|
api := &API{}
|
|
|
|
|
|
|
|
res := api.HashMessageEIP191(context.Background(), []byte("test"))
|
|
|
|
require.Equal(t, "0x4a5c5d454721bbbb25540c3317521e71c373ae36458f960d2ad46ef088110e95", res.String())
|
|
|
|
}
|
2024-07-30 12:43:45 +00:00
|
|
|
|
|
|
|
func TestAPI_IsChecksumValidForAddress(t *testing.T) {
|
|
|
|
api := &API{}
|
|
|
|
|
|
|
|
res, err := api.IsChecksumValidForAddress("0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.False(t, res)
|
|
|
|
|
|
|
|
res, err = api.IsChecksumValidForAddress("0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa")
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.True(t, res)
|
|
|
|
}
|
2024-08-12 12:53:32 +00:00
|
|
|
|
|
|
|
func TestAPI_GetCryptoOnRamps(t *testing.T) {
|
|
|
|
ctrl := gomock.NewController(t)
|
|
|
|
defer ctrl.Finish()
|
|
|
|
|
|
|
|
provider0 := mock_onramp.NewMockProvider(ctrl)
|
|
|
|
id0 := "provider0"
|
|
|
|
provider0.EXPECT().ID().Return(id0).AnyTimes()
|
|
|
|
provider1 := mock_onramp.NewMockProvider(ctrl)
|
|
|
|
id1 := "provider1"
|
|
|
|
provider1.EXPECT().ID().Return(id1).AnyTimes()
|
|
|
|
providers := []onramp.Provider{provider0, provider1}
|
|
|
|
onrampManager := onramp.NewManager(providers)
|
|
|
|
|
|
|
|
api := &API{
|
|
|
|
s: &Service{cryptoOnRampManager: onrampManager},
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx := context.Background()
|
|
|
|
|
|
|
|
// Check returned providers
|
|
|
|
provider0.EXPECT().GetCryptoOnRamp(ctx).Return(onramp.CryptoOnRamp{ID: id0}, nil)
|
|
|
|
provider1.EXPECT().GetCryptoOnRamp(ctx).Return(onramp.CryptoOnRamp{ID: id1}, nil)
|
|
|
|
|
|
|
|
retProviders, err := api.GetCryptoOnRamps(ctx)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, len(providers), len(retProviders))
|
|
|
|
require.Equal(t, id0, retProviders[0].ID)
|
|
|
|
require.Equal(t, id1, retProviders[1].ID)
|
|
|
|
|
|
|
|
// Check error handling
|
|
|
|
provider0.EXPECT().GetCryptoOnRamp(ctx).Return(onramp.CryptoOnRamp{}, errors.New("error"))
|
|
|
|
provider1.EXPECT().GetCryptoOnRamp(ctx).Return(onramp.CryptoOnRamp{ID: id1}, nil)
|
|
|
|
retProviders, err = api.GetCryptoOnRamps(ctx)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, 1, len(retProviders))
|
|
|
|
require.Equal(t, id1, retProviders[0].ID)
|
|
|
|
|
|
|
|
// Check URL retrieval
|
|
|
|
provider1.EXPECT().GetURL(ctx, onramp.Parameters{}).Return("url", nil)
|
|
|
|
url, err := api.GetCryptoOnRampURL(ctx, id1, onramp.Parameters{})
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, "url", url)
|
|
|
|
}
|
2024-08-20 10:09:39 +00:00
|
|
|
|
|
|
|
func TestAPI_GetAddressDetails(t *testing.T) {
|
|
|
|
appDB, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{})
|
|
|
|
require.NoError(t, err)
|
|
|
|
defer appDB.Close()
|
|
|
|
|
|
|
|
accountsDb, err := accounts.NewDB(appDB)
|
|
|
|
require.NoError(t, err)
|
|
|
|
defer accountsDb.Close()
|
|
|
|
|
|
|
|
db, err := helpers.SetupTestMemorySQLDB(walletdatabase.DbInitializer{})
|
|
|
|
require.NoError(t, err)
|
|
|
|
defer db.Close()
|
|
|
|
|
|
|
|
accountFeed := &event.Feed{}
|
|
|
|
|
|
|
|
chainID := uint64(1)
|
|
|
|
address := "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
|
|
|
|
|
|
|
providerConfig := params.ProviderConfig{
|
|
|
|
Enabled: true,
|
|
|
|
Name: rpc.ProviderStatusProxy,
|
|
|
|
User: "user1",
|
|
|
|
Password: "pass1",
|
|
|
|
}
|
|
|
|
providerConfigs := []params.ProviderConfig{providerConfig}
|
|
|
|
|
|
|
|
// Create a new server that delays the response by 1 second
|
|
|
|
serverWith1SecDelay := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
time.Sleep(1 * time.Second)
|
|
|
|
fmt.Fprintln(w, `{"result": "0x10"}`)
|
|
|
|
}))
|
|
|
|
defer serverWith1SecDelay.Close()
|
|
|
|
|
|
|
|
networks := []params.Network{
|
|
|
|
{
|
|
|
|
ChainID: chainID,
|
|
|
|
DefaultRPCURL: serverWith1SecDelay.URL,
|
|
|
|
DefaultFallbackURL: serverWith1SecDelay.URL,
|
|
|
|
},
|
|
|
|
}
|
2024-10-15 15:59:17 +00:00
|
|
|
config := rpc.ClientConfig{
|
|
|
|
Client: nil,
|
|
|
|
UpstreamChainID: chainID,
|
|
|
|
Networks: networks,
|
|
|
|
DB: appDB,
|
|
|
|
WalletFeed: nil,
|
|
|
|
ProviderConfigs: providerConfigs,
|
|
|
|
}
|
|
|
|
c, err := rpc.NewClient(config)
|
2024-08-20 10:09:39 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
chainClient, err := c.EthClient(chainID)
|
|
|
|
require.NoError(t, err)
|
|
|
|
chainClient.SetWalletNotifier(func(chainID uint64, message string) {})
|
|
|
|
c.SetWalletNotifier(func(chainID uint64, message string) {})
|
|
|
|
|
|
|
|
service := NewService(db, accountsDb, appDB, c, accountFeed, nil, nil, nil, ¶ms.NodeConfig{}, nil, nil, nil, nil, nil, "")
|
|
|
|
|
|
|
|
api := &API{
|
|
|
|
s: service,
|
|
|
|
}
|
|
|
|
|
|
|
|
// Test getting address details using `GetAddressDetails` call, that always waits for the request to finish
|
|
|
|
details, err := api.GetAddressDetails(context.Background(), 1, address)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, true, details.HasActivity)
|
|
|
|
|
|
|
|
// empty params
|
|
|
|
details, err = api.AddressDetails(context.Background(), &requests.AddressDetails{})
|
|
|
|
require.Error(t, err)
|
|
|
|
require.ErrorIs(t, err, requests.ErrAddresInvalid)
|
|
|
|
require.Nil(t, details)
|
|
|
|
|
|
|
|
// no response longer than the set timeout
|
|
|
|
details, err = api.AddressDetails(context.Background(), &requests.AddressDetails{
|
|
|
|
Address: address,
|
|
|
|
TimeoutInMilliseconds: 500,
|
|
|
|
})
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, false, details.HasActivity)
|
|
|
|
|
|
|
|
// timeout longer than the response time
|
|
|
|
details, err = api.AddressDetails(context.Background(), &requests.AddressDetails{
|
|
|
|
Address: address,
|
|
|
|
TimeoutInMilliseconds: 1200,
|
|
|
|
})
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, true, details.HasActivity)
|
|
|
|
|
|
|
|
// specific chain and timeout longer than the response time
|
|
|
|
details, err = api.AddressDetails(context.Background(), &requests.AddressDetails{
|
|
|
|
Address: address,
|
|
|
|
ChainIDs: []uint64{chainID},
|
|
|
|
TimeoutInMilliseconds: 1200,
|
|
|
|
})
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, true, details.HasActivity)
|
|
|
|
}
|