2024-07-18 15:30:10 +00:00
|
|
|
package connector
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
|
|
|
|
"github.com/status-im/status-go/eth-node/types"
|
|
|
|
"github.com/status-im/status-go/params"
|
|
|
|
"github.com/status-im/status-go/services/connector/commands"
|
|
|
|
"github.com/status-im/status-go/signal"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestRequestAccountsSwitchChainAndSendTransactionFlow(t *testing.T) {
|
|
|
|
db, close := createDB(t)
|
|
|
|
defer close()
|
|
|
|
|
|
|
|
nm := commands.NetworkManagerMock{}
|
|
|
|
nm.SetNetworks([]*params.Network{
|
|
|
|
{
|
|
|
|
ChainID: 0x1,
|
|
|
|
Layer: 1,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ChainID: 0x5,
|
|
|
|
Layer: 1,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
rpc := commands.RPCClientMock{}
|
|
|
|
|
|
|
|
service := NewService(db, &rpc, &nm)
|
|
|
|
|
|
|
|
api := NewAPI(service)
|
|
|
|
|
|
|
|
// Try to request accounts without permission
|
|
|
|
request := "{\"method\":\"eth_accounts\",\"params\":[],\"url\":\"http://testDAppURL123\",\"name\":\"testDAppName\",\"iconUrl\":\"http://testDAppIconUrl\"}"
|
|
|
|
response, err := api.CallRPC(request)
|
|
|
|
assert.Empty(t, response)
|
|
|
|
assert.Error(t, err)
|
|
|
|
assert.Equal(t, commands.ErrDAppIsNotPermittedByUser, err)
|
|
|
|
|
|
|
|
accountAddress := types.BytesToAddress(types.FromHex("0x6d0aa2a774b74bb1d36f97700315adf962c69fcg"))
|
|
|
|
expectedHash := types.BytesToHash(types.FromHex("0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"))
|
|
|
|
|
|
|
|
signal.SetMobileSignalHandler(signal.MobileSignalHandler(func(s []byte) {
|
|
|
|
var evt commands.EventType
|
|
|
|
err := json.Unmarshal(s, &evt)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
switch evt.Type {
|
|
|
|
case signal.EventConnectorSendRequestAccounts:
|
|
|
|
var ev signal.ConnectorSendRequestAccountsSignal
|
|
|
|
err := json.Unmarshal(evt.Event, &ev)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
err = api.RequestAccountsAccepted(commands.RequestAccountsAcceptedArgs{
|
|
|
|
RequestID: ev.RequestID,
|
|
|
|
Account: accountAddress,
|
|
|
|
ChainID: 0x1,
|
|
|
|
})
|
|
|
|
assert.NoError(t, err)
|
|
|
|
case signal.EventConnectorSendTransaction:
|
|
|
|
var ev signal.ConnectorSendTransactionSignal
|
|
|
|
err := json.Unmarshal(evt.Event, &ev)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
err = api.SendTransactionAccepted(commands.SendTransactionAcceptedArgs{
|
|
|
|
RequestID: ev.RequestID,
|
|
|
|
Hash: expectedHash,
|
|
|
|
})
|
|
|
|
assert.NoError(t, err)
|
|
|
|
}
|
|
|
|
}))
|
|
|
|
|
|
|
|
// Request accounts, now for real
|
|
|
|
request = "{\"method\": \"eth_requestAccounts\", \"params\": [], \"url\": \"http://testDAppURL123\", \"name\": \"testDAppName\", \"iconUrl\": \"http://testDAppIconUrl\" }"
|
2024-07-25 13:10:13 +00:00
|
|
|
expectedResponse := strings.ToLower(fmt.Sprintf(`["%s"]`, accountAddress.Hex()))
|
2024-07-18 15:30:10 +00:00
|
|
|
response, err = api.CallRPC(request)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.Equal(t, expectedResponse, response)
|
|
|
|
|
|
|
|
// Request to switch ethereum chain
|
2024-07-26 20:00:12 +00:00
|
|
|
expectedChainId := "0x5"
|
|
|
|
request = fmt.Sprintf("{\"method\": \"wallet_switchEthereumChain\", \"params\": [{\"chainId\": \"%s\"}], \"url\": \"http://testDAppURL123\", \"name\": \"testDAppName\", \"iconUrl\": \"http://testDAppIconUrl\" }", expectedChainId)
|
|
|
|
expectedResponse = expectedChainId
|
2024-07-18 15:30:10 +00:00
|
|
|
response, err = api.CallRPC(request)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.Equal(t, expectedResponse, response)
|
|
|
|
|
|
|
|
// Check if the chain was switched
|
|
|
|
request = "{\"method\": \"eth_chainId\", \"params\": [], \"url\": \"http://testDAppURL123\", \"name\": \"testDAppName\", \"iconUrl\": \"http://testDAppIconUrl\" }"
|
|
|
|
response, err = api.CallRPC(request)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.Equal(t, expectedResponse, response)
|
|
|
|
|
|
|
|
// Check the account after switching chain
|
|
|
|
request = "{\"method\": \"eth_accounts\", \"params\": [], \"url\": \"http://testDAppURL123\", \"name\": \"testDAppName\", \"iconUrl\": \"http://testDAppIconUrl\" }"
|
2024-07-25 13:10:13 +00:00
|
|
|
expectedResponse = strings.ToLower(fmt.Sprintf(`["%s"]`, accountAddress.Hex()))
|
2024-07-18 15:30:10 +00:00
|
|
|
response, err = api.CallRPC(request)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.Equal(t, expectedResponse, response)
|
|
|
|
|
|
|
|
// Send transaction
|
|
|
|
request = fmt.Sprintf("{\"method\": \"eth_sendTransaction\", \"params\":[{\"from\":\"%s\",\"to\":\"0x0200000000000000000000000000000000000000\",\"value\":\"0x12345\",\"data\":\"0x307830\"}], \"url\": \"http://testDAppURL123\", \"name\": \"testDAppName\", \"iconUrl\": \"http://testDAppIconUrl\" }", accountAddress.Hex())
|
|
|
|
expectedResponse = expectedHash.Hex()
|
|
|
|
response, err = api.CallRPC(request)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.Equal(t, expectedResponse, response)
|
|
|
|
}
|