mirror of
https://github.com/status-im/status-go.git
synced 2025-02-08 12:54:37 +00:00
9b9a91f654
This commit maps this kind of errors `status-proxy-0.error: failed with 50011064 gas: insufficient funds for gas * price + value: address 0x4eeB09cf0076F840b38511D808464eE48efD4305 have 0 want 10000000000000` to this form: `status-proxy-0.error: failed with 50011064 gas: insufficient funds for gas * price + value: address 0x4eeB09cf0076F840b38511D808464eE48efD4305` which means that we don't want to display to a user details of how much they have and how much is needed for fees, cause those data are very often misleading, referring mostly to "how much user has". New error added in case there is no positive balances across all enabled chains.
349 lines
9.2 KiB
Go
349 lines
9.2 KiB
Go
package pathprocessor
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/status-im/status-go/params"
|
|
walletCommon "github.com/status-im/status-go/services/wallet/common"
|
|
"github.com/status-im/status-go/services/wallet/token"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
var mainnet = params.Network{
|
|
ChainID: walletCommon.EthereumMainnet,
|
|
ChainName: "Mainnet",
|
|
RPCURL: "https://eth-archival.rpc.grove.city/v1/",
|
|
FallbackURL: "https://mainnet.infura.io/v3/",
|
|
BlockExplorerURL: "https://etherscan.io/",
|
|
IconURL: "network/Network=Ethereum",
|
|
ChainColor: "#627EEA",
|
|
ShortName: "eth",
|
|
NativeCurrencyName: "Ether",
|
|
NativeCurrencySymbol: "ETH",
|
|
NativeCurrencyDecimals: 18,
|
|
IsTest: false,
|
|
Layer: 1,
|
|
Enabled: true,
|
|
RelatedChainID: walletCommon.EthereumMainnet,
|
|
}
|
|
|
|
var optimism = params.Network{
|
|
ChainID: walletCommon.OptimismMainnet,
|
|
ChainName: "Optimism",
|
|
RPCURL: "https://optimism-mainnet.rpc.grove.city/v1/",
|
|
FallbackURL: "https://optimism-mainnet.infura.io/v3/",
|
|
BlockExplorerURL: "https://optimistic.etherscan.io",
|
|
IconURL: "network/Network=Optimism",
|
|
ChainColor: "#E90101",
|
|
ShortName: "oeth",
|
|
NativeCurrencyName: "Ether",
|
|
NativeCurrencySymbol: "ETH",
|
|
NativeCurrencyDecimals: 18,
|
|
IsTest: false,
|
|
Layer: 2,
|
|
Enabled: true,
|
|
RelatedChainID: walletCommon.OptimismMainnet,
|
|
}
|
|
|
|
var testEstimationMap = map[string]Estimation{
|
|
ProcessorTransferName: {uint64(1000), nil},
|
|
ProcessorBridgeHopName: {uint64(5000), nil},
|
|
ProcessorSwapParaswapName: {uint64(2000), nil},
|
|
}
|
|
|
|
type expectedResult struct {
|
|
expected bool
|
|
expectedError error
|
|
}
|
|
|
|
func TestPathProcessors(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
input ProcessorInputParams
|
|
expectedError error
|
|
expected map[string]expectedResult
|
|
}{
|
|
{
|
|
name: "Empty Input Params",
|
|
input: ProcessorInputParams{
|
|
TestsMode: true,
|
|
},
|
|
expected: map[string]expectedResult{
|
|
ProcessorTransferName: {
|
|
expected: false,
|
|
expectedError: ErrNoChainSet,
|
|
},
|
|
ProcessorBridgeHopName: {
|
|
expected: false,
|
|
expectedError: ErrNoChainSet,
|
|
},
|
|
ProcessorSwapParaswapName: {
|
|
expected: false,
|
|
expectedError: ErrNoChainSet,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "Same Chains Set - No FormToken - No ToToken",
|
|
input: ProcessorInputParams{
|
|
TestsMode: true,
|
|
FromChain: &mainnet,
|
|
ToChain: &mainnet,
|
|
TestEstimationMap: testEstimationMap,
|
|
},
|
|
expected: map[string]expectedResult{
|
|
ProcessorTransferName: {
|
|
expected: false,
|
|
expectedError: ErrNoTokenSet,
|
|
},
|
|
ProcessorBridgeHopName: {
|
|
expected: false,
|
|
expectedError: ErrNoTokenSet,
|
|
},
|
|
ProcessorSwapParaswapName: {
|
|
expected: false,
|
|
expectedError: ErrToAndFromTokensMustBeSet,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "Same Chains Set - FormToken Set - No ToToken",
|
|
input: ProcessorInputParams{
|
|
TestsMode: true,
|
|
FromChain: &mainnet,
|
|
ToChain: &mainnet,
|
|
FromToken: &token.Token{
|
|
Symbol: EthSymbol,
|
|
},
|
|
TestEstimationMap: testEstimationMap,
|
|
},
|
|
expected: map[string]expectedResult{
|
|
ProcessorTransferName: {
|
|
expected: true,
|
|
expectedError: nil,
|
|
},
|
|
ProcessorBridgeHopName: {
|
|
expected: false,
|
|
expectedError: ErrFromAndToChainsMustBeDifferent,
|
|
},
|
|
ProcessorSwapParaswapName: {
|
|
expected: false,
|
|
expectedError: ErrToAndFromTokensMustBeSet,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "Same Chains Set - FormToken Set - ToToken Set - Same Tokens",
|
|
input: ProcessorInputParams{
|
|
TestsMode: true,
|
|
FromChain: &mainnet,
|
|
ToChain: &mainnet,
|
|
FromToken: &token.Token{
|
|
Symbol: EthSymbol,
|
|
},
|
|
ToToken: &token.Token{
|
|
Symbol: EthSymbol,
|
|
},
|
|
TestEstimationMap: testEstimationMap,
|
|
},
|
|
expected: map[string]expectedResult{
|
|
ProcessorTransferName: {
|
|
expected: false,
|
|
expectedError: ErrToTokenShouldNotBeSet,
|
|
},
|
|
ProcessorBridgeHopName: {
|
|
expected: false,
|
|
expectedError: ErrToTokenShouldNotBeSet,
|
|
},
|
|
ProcessorSwapParaswapName: {
|
|
expected: false,
|
|
expectedError: ErrFromAndToTokensMustBeDifferent,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "Same Chains Set - FormToken Set - ToToken Set - Different Tokens",
|
|
input: ProcessorInputParams{
|
|
TestsMode: true,
|
|
FromChain: &mainnet,
|
|
ToChain: &mainnet,
|
|
FromToken: &token.Token{
|
|
Symbol: EthSymbol,
|
|
},
|
|
ToToken: &token.Token{
|
|
Symbol: UsdcSymbol,
|
|
},
|
|
TestEstimationMap: testEstimationMap,
|
|
},
|
|
expected: map[string]expectedResult{
|
|
ProcessorTransferName: {
|
|
expected: false,
|
|
expectedError: ErrToTokenShouldNotBeSet,
|
|
},
|
|
ProcessorBridgeHopName: {
|
|
expected: false,
|
|
expectedError: ErrToTokenShouldNotBeSet,
|
|
},
|
|
ProcessorSwapParaswapName: {
|
|
expected: true,
|
|
expectedError: nil,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "Different Chains Set - No FormToken - No ToToken",
|
|
input: ProcessorInputParams{
|
|
TestsMode: true,
|
|
FromChain: &mainnet,
|
|
ToChain: &optimism,
|
|
TestEstimationMap: testEstimationMap,
|
|
},
|
|
expected: map[string]expectedResult{
|
|
ProcessorTransferName: {
|
|
expected: false,
|
|
expectedError: ErrNoTokenSet,
|
|
},
|
|
ProcessorBridgeHopName: {
|
|
expected: false,
|
|
expectedError: ErrNoTokenSet,
|
|
},
|
|
ProcessorSwapParaswapName: {
|
|
expected: false,
|
|
expectedError: ErrFromAndToChainsMustBeSame,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "Different Chains Set - FormToken Set - No ToToken",
|
|
input: ProcessorInputParams{
|
|
TestsMode: true,
|
|
FromChain: &mainnet,
|
|
ToChain: &optimism,
|
|
FromToken: &token.Token{
|
|
Symbol: EthSymbol,
|
|
},
|
|
TestEstimationMap: testEstimationMap,
|
|
},
|
|
expected: map[string]expectedResult{
|
|
ProcessorTransferName: {
|
|
expected: false,
|
|
expectedError: nil,
|
|
},
|
|
ProcessorBridgeHopName: {
|
|
expected: true,
|
|
expectedError: nil,
|
|
},
|
|
ProcessorSwapParaswapName: {
|
|
expected: false,
|
|
expectedError: ErrFromAndToChainsMustBeSame,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "Different Chains Set - FormToken Set - ToToken Set - Same Tokens",
|
|
input: ProcessorInputParams{
|
|
TestsMode: true,
|
|
FromChain: &mainnet,
|
|
ToChain: &optimism,
|
|
FromToken: &token.Token{
|
|
Symbol: EthSymbol,
|
|
},
|
|
ToToken: &token.Token{
|
|
Symbol: EthSymbol,
|
|
},
|
|
TestEstimationMap: testEstimationMap,
|
|
},
|
|
expected: map[string]expectedResult{
|
|
ProcessorTransferName: {
|
|
expected: false,
|
|
expectedError: ErrToTokenShouldNotBeSet,
|
|
},
|
|
ProcessorBridgeHopName: {
|
|
expected: false,
|
|
expectedError: ErrToTokenShouldNotBeSet,
|
|
},
|
|
ProcessorSwapParaswapName: {
|
|
expected: false,
|
|
expectedError: ErrFromAndToChainsMustBeSame,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "Different Chains Set - FormToken Set - ToToken Set - Different Tokens",
|
|
input: ProcessorInputParams{
|
|
TestsMode: true,
|
|
FromChain: &mainnet,
|
|
ToChain: &optimism,
|
|
FromToken: &token.Token{
|
|
Symbol: EthSymbol,
|
|
},
|
|
ToToken: &token.Token{
|
|
Symbol: UsdcSymbol,
|
|
},
|
|
TestEstimationMap: testEstimationMap,
|
|
},
|
|
expected: map[string]expectedResult{
|
|
ProcessorTransferName: {
|
|
expected: false,
|
|
expectedError: ErrToTokenShouldNotBeSet,
|
|
},
|
|
ProcessorBridgeHopName: {
|
|
expected: false,
|
|
expectedError: ErrToTokenShouldNotBeSet,
|
|
},
|
|
ProcessorSwapParaswapName: {
|
|
expected: false,
|
|
expectedError: ErrFromAndToChainsMustBeSame,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
for processorName, expResult := range tt.expected {
|
|
t.Run(fmt.Sprintf("%s[%s]", processorName, tt.name), func(t *testing.T) {
|
|
|
|
var processor PathProcessor
|
|
if processorName == ProcessorTransferName {
|
|
processor = NewTransferProcessor(nil, nil)
|
|
} else if processorName == ProcessorBridgeHopName {
|
|
processor = NewHopBridgeProcessor(nil, nil, nil, nil)
|
|
} else if processorName == ProcessorSwapParaswapName {
|
|
processor = NewSwapParaswapProcessor(nil, nil, nil)
|
|
}
|
|
|
|
assert.Equal(t, processorName, processor.Name())
|
|
result, err := processor.AvailableFor(tt.input)
|
|
if expResult.expectedError != nil {
|
|
assert.Error(t, err)
|
|
} else {
|
|
assert.NoError(t, err)
|
|
}
|
|
assert.Equal(t, expResult.expected, result)
|
|
|
|
if tt.input.TestEstimationMap != nil {
|
|
estimatedGas, err := processor.EstimateGas(tt.input)
|
|
assert.NoError(t, err)
|
|
assert.Greater(t, estimatedGas, uint64(0))
|
|
|
|
input := tt.input
|
|
input.TestEstimationMap = map[string]Estimation{
|
|
"randomName": {10000, nil},
|
|
}
|
|
estimatedGas, err = processor.EstimateGas(input)
|
|
assert.Error(t, err)
|
|
assert.Equal(t, ErrNoEstimationFound, err)
|
|
assert.Equal(t, uint64(0), estimatedGas)
|
|
} else {
|
|
estimatedGas, err := processor.EstimateGas(tt.input)
|
|
assert.Error(t, err)
|
|
assert.Equal(t, ErrNoEstimationFound, err)
|
|
assert.Equal(t, uint64(0), estimatedGas)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
}
|