6408709018
* add support for eth_getBlockByNumber to accept the term safe which we are using as 30 blocks * fix lint catch of unnecessary cast * add finalized to get block by number * Update chain/types/ethtypes/eth_types.go Co-authored-by: Rod Vagg <rod@vagg.org> * add test for eth get block by number to accept latest and safe and finalized as arguments --------- Co-authored-by: Rod Vagg <rod@vagg.org>
163 lines
5.1 KiB
Go
163 lines
5.1 KiB
Go
package itests
|
|
|
|
import (
|
|
"context"
|
|
"strconv"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/filecoin-project/go-state-types/builtin"
|
|
|
|
"github.com/filecoin-project/lotus/build"
|
|
"github.com/filecoin-project/lotus/chain/types"
|
|
"github.com/filecoin-project/lotus/chain/types/ethtypes"
|
|
"github.com/filecoin-project/lotus/chain/wallet/key"
|
|
"github.com/filecoin-project/lotus/itests/kit"
|
|
)
|
|
|
|
func TestEthAddressToFilecoinAddress(t *testing.T) {
|
|
// Disable EthRPC to confirm that this method does NOT need the EthEnableRPC config set to true
|
|
client, _, _ := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ThroughRPC(), kit.DisableEthRPC())
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
|
|
defer cancel()
|
|
|
|
secpKey, err := key.GenerateKey(types.KTDelegated)
|
|
require.NoError(t, err)
|
|
|
|
filecoinKeyAddr, err := client.WalletImport(ctx, &secpKey.KeyInfo)
|
|
require.NoError(t, err)
|
|
|
|
ethAddr, err := ethtypes.EthAddressFromFilecoinAddress(filecoinKeyAddr)
|
|
require.NoError(t, err)
|
|
|
|
apiFilAddr, err := client.EthAddressToFilecoinAddress(ctx, ethAddr)
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, filecoinKeyAddr, apiFilAddr)
|
|
|
|
filecoinIdArr := builtin.StorageMarketActorAddr
|
|
ethAddr, err = ethtypes.EthAddressFromFilecoinAddress(filecoinIdArr)
|
|
require.NoError(t, err)
|
|
|
|
apiFilAddr, err = client.EthAddressToFilecoinAddress(ctx, ethAddr)
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, filecoinIdArr, apiFilAddr)
|
|
|
|
}
|
|
|
|
func TestFilecoinAddressToEthAddress(t *testing.T) {
|
|
// Disable EthRPC to confirm that this method does NOT need the EthEnableRPC config set to true
|
|
client, _, _ := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ThroughRPC(), kit.DisableEthRPC())
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
|
|
defer cancel()
|
|
|
|
secpDelegatedKey, err := key.GenerateKey(types.KTDelegated)
|
|
require.NoError(t, err)
|
|
|
|
filecoinKeyAddr, err := client.WalletImport(ctx, &secpDelegatedKey.KeyInfo)
|
|
require.NoError(t, err)
|
|
|
|
ethAddr, err := ethtypes.EthAddressFromFilecoinAddress(filecoinKeyAddr)
|
|
require.NoError(t, err)
|
|
|
|
apiEthAddr, err := client.FilecoinAddressToEthAddress(ctx, filecoinKeyAddr)
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, ethAddr, apiEthAddr)
|
|
|
|
filecoinIdArr := builtin.StorageMarketActorAddr
|
|
ethAddr, err = ethtypes.EthAddressFromFilecoinAddress(filecoinIdArr)
|
|
require.NoError(t, err)
|
|
|
|
apiEthAddr, err = client.FilecoinAddressToEthAddress(ctx, filecoinIdArr)
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, ethAddr, apiEthAddr)
|
|
|
|
secpKey, err := key.GenerateKey(types.KTSecp256k1)
|
|
require.NoError(t, err)
|
|
|
|
filecoinSecpAddr, err := client.WalletImport(ctx, &secpKey.KeyInfo)
|
|
require.NoError(t, err)
|
|
|
|
_, err = client.FilecoinAddressToEthAddress(ctx, filecoinSecpAddr)
|
|
|
|
require.ErrorContains(t, err, ethtypes.ErrInvalidAddress.Error())
|
|
}
|
|
|
|
func TestEthGetGenesis(t *testing.T) {
|
|
blockTime := 100 * time.Millisecond
|
|
client, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ThroughRPC())
|
|
ens.InterconnectAll().BeginMining(blockTime)
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
|
|
defer cancel()
|
|
|
|
ethBlk, err := client.EVM().EthGetBlockByNumber(ctx, "0x0", true)
|
|
require.NoError(t, err)
|
|
|
|
genesis, err := client.ChainGetGenesis(ctx)
|
|
require.NoError(t, err)
|
|
|
|
genesisCid, err := genesis.Key().Cid()
|
|
require.NoError(t, err)
|
|
|
|
genesisHash, err := ethtypes.EthHashFromCid(genesisCid)
|
|
require.NoError(t, err)
|
|
require.Equal(t, ethBlk.Hash, genesisHash)
|
|
}
|
|
|
|
func TestNetVersion(t *testing.T) {
|
|
blockTime := 100 * time.Millisecond
|
|
client, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ThroughRPC())
|
|
ens.InterconnectAll().BeginMining(blockTime)
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
|
|
defer cancel()
|
|
|
|
version, err := client.NetVersion(ctx)
|
|
require.NoError(t, err)
|
|
require.Equal(t, strconv.Itoa(build.Eip155ChainId), version)
|
|
}
|
|
|
|
func TestEthBlockNumberAliases(t *testing.T) {
|
|
blockTime := 2 * time.Millisecond
|
|
kit.QuietMiningLogs()
|
|
client, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ThroughRPC())
|
|
ens.InterconnectAll().BeginMining(blockTime)
|
|
ens.Start()
|
|
|
|
build.Clock.Sleep(time.Second)
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
|
|
defer cancel()
|
|
|
|
head := client.WaitTillChain(ctx, kit.HeightAtLeast(build.Finality+100))
|
|
|
|
// latest should be head-1 (parents)
|
|
latestEthBlk, err := client.EVM().EthGetBlockByNumber(ctx, "latest", true)
|
|
require.NoError(t, err)
|
|
diff := int64(latestEthBlk.Number) - int64(head.Height()-1)
|
|
require.GreaterOrEqual(t, diff, int64(0))
|
|
require.LessOrEqual(t, diff, int64(2))
|
|
|
|
// safe should be latest-30
|
|
safeEthBlk, err := client.EVM().EthGetBlockByNumber(ctx, "safe", true)
|
|
require.NoError(t, err)
|
|
diff = int64(latestEthBlk.Number-30) - int64(safeEthBlk.Number)
|
|
require.GreaterOrEqual(t, diff, int64(0))
|
|
require.LessOrEqual(t, diff, int64(2))
|
|
|
|
// finalized should be Finality blocks behind latest
|
|
finalityEthBlk, err := client.EVM().EthGetBlockByNumber(ctx, "finalized", true)
|
|
require.NoError(t, err)
|
|
diff = int64(latestEthBlk.Number) - int64(build.Finality) - int64(finalityEthBlk.Number)
|
|
require.GreaterOrEqual(t, diff, int64(0))
|
|
require.LessOrEqual(t, diff, int64(2))
|
|
}
|