2019-07-25 20:38:55 +00:00
// This is a test utility for Ethermint's Web3 JSON-RPC services.
//
2020-08-05 15:17:50 +00:00
// To run these tests please first ensure you have the ethermintd running
2019-07-25 20:38:55 +00:00
//
2021-04-17 10:00:07 +00:00
// You can configure the desired HOST and MODE as well in integration-test-all.sh
2020-04-21 19:37:10 +00:00
package tests
2019-07-25 20:38:55 +00:00
import (
"bytes"
"encoding/json"
"fmt"
"math/big"
"net/http"
2020-04-21 19:37:10 +00:00
"os"
2019-07-25 20:38:55 +00:00
"testing"
2020-04-13 19:18:50 +00:00
"time"
2019-09-24 14:49:40 +00:00
2020-05-12 19:12:52 +00:00
"github.com/stretchr/testify/require"
2020-05-02 17:39:26 +00:00
ethcmn "github.com/ethereum/go-ethereum/common"
2019-09-24 14:49:40 +00:00
"github.com/ethereum/go-ethereum/common/hexutil"
2020-04-13 19:18:50 +00:00
ethtypes "github.com/ethereum/go-ethereum/core/types"
2020-05-12 19:12:52 +00:00
2020-10-22 20:39:51 +00:00
rpctypes "github.com/cosmos/ethermint/rpc/types"
2020-12-08 19:51:26 +00:00
ethermint "github.com/cosmos/ethermint/types"
2019-07-25 20:38:55 +00:00
)
const (
addrA = "0xc94770007dda54cF92009BFF0dE90c06F603a09f"
addrAStoreKey = 0
)
2020-04-21 19:37:10 +00:00
var (
2020-12-15 19:52:09 +00:00
MODE = os . Getenv ( "MODE" )
2020-08-13 17:14:48 +00:00
from = [ ] byte { }
2020-12-15 19:52:09 +00:00
zeroString = "0x0"
2020-04-21 19:37:10 +00:00
)
2019-07-25 20:38:55 +00:00
2020-04-21 19:37:10 +00:00
func TestMain ( m * testing . M ) {
2020-06-25 07:51:56 +00:00
if MODE != "rpc" {
_ , _ = fmt . Fprintln ( os . Stdout , "Skipping RPC test" )
2020-04-21 19:37:10 +00:00
return
}
2020-08-13 17:14:48 +00:00
var err error
2020-12-15 19:52:09 +00:00
from , err = GetAddress ( )
2020-08-13 17:14:48 +00:00
if err != nil {
fmt . Printf ( "failed to get account: %s\n" , err )
os . Exit ( 1 )
}
2020-04-21 19:37:10 +00:00
// Start all tests
code := m . Run ( )
os . Exit ( code )
}
2021-04-17 10:00:07 +00:00
func TestEth_GetTransactionCount ( t * testing . T ) {
// TODO: this test passes on when run on its own, but fails when run with the other tests
if testing . Short ( ) {
t . Skip ( "skipping TestEth_GetTransactionCount" )
}
prev := GetNonce ( t , "latest" )
SendTestTransaction ( t , from )
time . Sleep ( 20 * time . Second )
post := GetNonce ( t , "latest" )
require . Equal ( t , prev , post - 1 )
}
func TestEth_GetLogs_NoLogs ( t * testing . T ) {
param := make ( [ ] map [ string ] [ ] string , 1 )
param [ 0 ] = make ( map [ string ] [ ] string )
param [ 0 ] [ "topics" ] = [ ] string { }
rpcRes := Call ( t , "eth_getLogs" , param )
require . NotNil ( t , rpcRes )
require . Nil ( t , rpcRes . Error )
var logs [ ] * ethtypes . Log
err := json . Unmarshal ( rpcRes . Result , & logs )
require . NoError ( t , err )
require . Empty ( t , logs ) // begin, end are -1, crit.Addresses, crit.Topics are empty array, so no log should be returned(run this test before anyone else so that log will be empty)
}
2020-07-23 19:38:47 +00:00
func TestBlockBloom ( t * testing . T ) {
2020-12-15 19:52:09 +00:00
hash := DeployTestContractWithFunction ( t , from )
receipt := WaitForReceipt ( t , hash )
2020-07-23 19:38:47 +00:00
number := receipt [ "blockNumber" ] . ( string )
param := [ ] interface { } { number , false }
2020-12-15 19:52:09 +00:00
rpcRes := Call ( t , "eth_getBlockByNumber" , param )
2020-07-23 19:38:47 +00:00
block := make ( map [ string ] interface { } )
err := json . Unmarshal ( rpcRes . Result , & block )
require . NoError ( t , err )
2020-12-15 19:52:09 +00:00
lb := HexToBigInt ( t , block [ "logsBloom" ] . ( string ) )
2020-07-23 19:38:47 +00:00
require . NotEqual ( t , big . NewInt ( 0 ) , lb )
require . Equal ( t , hash . String ( ) , block [ "transactions" ] . ( [ ] interface { } ) [ 0 ] )
}
func TestEth_GetLogs_Topics_AB ( t * testing . T ) {
// TODO: this test passes on when run on its own, but fails when run with the other tests
if testing . Short ( ) {
t . Skip ( "skipping TestEth_GetLogs_Topics_AB" )
}
2020-12-15 19:52:09 +00:00
rpcRes := Call ( t , "eth_blockNumber" , [ ] string { } )
2020-07-23 19:38:47 +00:00
var res hexutil . Uint64
err := res . UnmarshalJSON ( rpcRes . Result )
require . NoError ( t , err )
param := make ( [ ] map [ string ] interface { } , 1 )
param [ 0 ] = make ( map [ string ] interface { } )
param [ 0 ] [ "topics" ] = [ ] string { helloTopic , worldTopic }
param [ 0 ] [ "fromBlock" ] = res . String ( )
2020-12-15 19:52:09 +00:00
hash := DeployTestContractWithFunction ( t , from )
WaitForReceipt ( t , hash )
2020-07-23 19:38:47 +00:00
2020-12-15 19:52:09 +00:00
rpcRes = Call ( t , "eth_getLogs" , param )
2020-07-23 19:38:47 +00:00
var logs [ ] * ethtypes . Log
err = json . Unmarshal ( rpcRes . Result , & logs )
require . NoError ( t , err )
require . Equal ( t , 1 , len ( logs ) )
}
func TestEth_GetTransactionLogs ( t * testing . T ) {
// TODO: this test passes on when run on its own, but fails when run with the other tests
if testing . Short ( ) {
2020-09-23 15:36:07 +00:00
t . Skip ( "skipping TestEth_GetTransactionLogs" )
2020-07-23 19:38:47 +00:00
}
2020-12-15 19:52:09 +00:00
hash , _ := DeployTestContract ( t , from )
2020-07-23 19:38:47 +00:00
param := [ ] string { hash . String ( ) }
2020-12-15 19:52:09 +00:00
rpcRes := Call ( t , "eth_getTransactionLogs" , param )
2020-07-23 19:38:47 +00:00
logs := new ( [ ] * ethtypes . Log )
err := json . Unmarshal ( rpcRes . Result , logs )
require . NoError ( t , err )
require . Equal ( t , 1 , len ( * logs ) )
}
2019-07-25 20:38:55 +00:00
func TestEth_protocolVersion ( t * testing . T ) {
2020-12-08 19:51:26 +00:00
expectedRes := hexutil . Uint ( ethermint . ProtocolVersion )
2019-07-25 20:38:55 +00:00
2020-12-15 19:52:09 +00:00
rpcRes := Call ( t , "eth_protocolVersion" , [ ] string { } )
2019-07-25 20:38:55 +00:00
2019-09-24 14:49:40 +00:00
var res hexutil . Uint
2020-05-04 22:02:26 +00:00
err := res . UnmarshalJSON ( rpcRes . Result )
2020-04-01 18:49:21 +00:00
require . NoError ( t , err )
2019-09-24 14:49:40 +00:00
t . Logf ( "Got protocol version: %s\n" , res . String ( ) )
2020-04-01 18:49:21 +00:00
require . Equal ( t , expectedRes , res , "expected: %s got: %s\n" , expectedRes . String ( ) , rpcRes . Result )
2019-07-25 20:38:55 +00:00
}
2020-07-08 07:57:19 +00:00
func TestEth_chainId ( t * testing . T ) {
2020-12-15 19:52:09 +00:00
rpcRes := Call ( t , "eth_chainId" , [ ] string { } )
2020-07-08 07:57:19 +00:00
var res hexutil . Uint
err := res . UnmarshalJSON ( rpcRes . Result )
require . NoError ( t , err )
require . NotEqual ( t , "0x0" , res . String ( ) )
}
2019-07-25 20:38:55 +00:00
func TestEth_blockNumber ( t * testing . T ) {
2020-12-15 19:52:09 +00:00
rpcRes := Call ( t , "eth_blockNumber" , [ ] string { } )
2020-04-01 18:49:21 +00:00
2019-09-24 14:49:40 +00:00
var res hexutil . Uint64
2020-05-04 22:02:26 +00:00
err := res . UnmarshalJSON ( rpcRes . Result )
2020-04-01 18:49:21 +00:00
require . NoError ( t , err )
2019-09-24 14:49:40 +00:00
t . Logf ( "Got block number: %s\n" , res . String ( ) )
2019-07-25 20:38:55 +00:00
}
2020-06-08 16:43:37 +00:00
func TestEth_coinbase ( t * testing . T ) {
zeroAddress := hexutil . Bytes ( ethcmn . Address { } . Bytes ( ) )
2020-12-15 19:52:09 +00:00
rpcRes := Call ( t , "eth_coinbase" , [ ] string { } )
2020-06-08 16:43:37 +00:00
var res hexutil . Bytes
err := res . UnmarshalJSON ( rpcRes . Result )
require . NoError ( t , err )
t . Logf ( "Got coinbase block proposer: %s\n" , res . String ( ) )
2020-08-13 17:14:48 +00:00
require . NotEqual ( t , zeroAddress . String ( ) , res . String ( ) , "expected: not %s got: %s\n" , zeroAddress . String ( ) , res . String ( ) )
2020-06-08 16:43:37 +00:00
}
2019-07-25 20:38:55 +00:00
func TestEth_GetBalance ( t * testing . T ) {
2020-12-15 19:52:09 +00:00
rpcRes := Call ( t , "eth_getBalance" , [ ] string { addrA , zeroString } )
2019-07-25 20:38:55 +00:00
2019-09-24 14:49:40 +00:00
var res hexutil . Big
2020-05-04 22:02:26 +00:00
err := res . UnmarshalJSON ( rpcRes . Result )
2020-04-01 18:49:21 +00:00
require . NoError ( t , err )
2019-09-24 14:49:40 +00:00
t . Logf ( "Got balance %s for %s\n" , res . String ( ) , addrA )
2019-07-25 20:38:55 +00:00
// 0 if x == y; where x is res, y is 0
2019-09-24 14:49:40 +00:00
if res . ToInt ( ) . Cmp ( big . NewInt ( 0 ) ) != 0 {
t . Errorf ( "expected balance: %d, got: %s" , 0 , res . String ( ) )
2019-07-25 20:38:55 +00:00
}
}
func TestEth_GetStorageAt ( t * testing . T ) {
2019-09-24 14:49:40 +00:00
expectedRes := hexutil . Bytes { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
2021-04-17 10:00:07 +00:00
testKey := 1 // using 0 as key here will create an ethereum empty hash which is considered as invalid hash
rpcRes := Call ( t , "eth_getStorageAt" , [ ] string { addrA , fmt . Sprint ( testKey ) , "0x3" } )
2019-07-25 20:38:55 +00:00
2019-09-24 14:49:40 +00:00
var storage hexutil . Bytes
2020-05-04 22:02:26 +00:00
err := storage . UnmarshalJSON ( rpcRes . Result )
2020-04-01 18:49:21 +00:00
require . NoError ( t , err )
2019-09-24 14:49:40 +00:00
t . Logf ( "Got value [%X] for %s with key %X\n" , storage , addrA , addrAStoreKey )
2020-04-01 18:49:21 +00:00
require . True ( t , bytes . Equal ( storage , expectedRes ) , "expected: %d (%d bytes) got: %d (%d bytes)" , expectedRes , len ( expectedRes ) , storage , len ( storage ) )
2019-07-25 20:38:55 +00:00
}
2020-05-12 19:12:52 +00:00
func TestEth_GetProof ( t * testing . T ) {
params := make ( [ ] interface { } , 3 )
params [ 0 ] = addrA
2020-08-23 21:41:54 +00:00
params [ 1 ] = [ ] string { fmt . Sprint ( addrAStoreKey ) }
2021-04-17 10:00:07 +00:00
params [ 2 ] = "0x3" // queries at height <= 2 are not supported
2020-12-15 19:52:09 +00:00
rpcRes := Call ( t , "eth_getProof" , params )
2020-05-12 19:12:52 +00:00
require . NotNil ( t , rpcRes )
2020-10-22 20:39:51 +00:00
var accRes rpctypes . AccountResult
2020-05-12 19:12:52 +00:00
err := json . Unmarshal ( rpcRes . Result , & accRes )
require . NoError ( t , err )
require . NotEmpty ( t , accRes . AccountProof )
require . NotEmpty ( t , accRes . StorageProof )
t . Logf ( "Got AccountResult %s" , rpcRes . Result )
}
2019-07-25 20:38:55 +00:00
func TestEth_GetCode ( t * testing . T ) {
2019-09-24 14:49:40 +00:00
expectedRes := hexutil . Bytes { }
2020-12-15 19:52:09 +00:00
rpcRes := Call ( t , "eth_getCode" , [ ] string { addrA , zeroString } )
2019-09-24 14:49:40 +00:00
var code hexutil . Bytes
2020-05-04 22:02:26 +00:00
err := code . UnmarshalJSON ( rpcRes . Result )
2019-09-24 14:49:40 +00:00
2020-04-01 18:49:21 +00:00
require . NoError ( t , err )
2019-07-25 20:38:55 +00:00
2019-09-24 14:49:40 +00:00
t . Logf ( "Got code [%X] for %s\n" , code , addrA )
2020-04-01 18:49:21 +00:00
require . True ( t , bytes . Equal ( expectedRes , code ) , "expected: %X got: %X" , expectedRes , code )
2019-07-25 20:38:55 +00:00
}
2020-04-07 20:00:06 +00:00
2020-06-22 16:07:35 +00:00
func TestEth_SendTransaction_Transfer ( t * testing . T ) {
param := make ( [ ] map [ string ] string , 1 )
param [ 0 ] = make ( map [ string ] string )
param [ 0 ] [ "from" ] = "0x" + fmt . Sprintf ( "%x" , from )
param [ 0 ] [ "to" ] = "0x0000000000000000000000000000000012341234"
param [ 0 ] [ "value" ] = "0x16345785d8a0000"
param [ 0 ] [ "gasLimit" ] = "0x5208"
param [ 0 ] [ "gasPrice" ] = "0x55ae82600"
2021-04-17 10:00:07 +00:00
rpcRes := Call ( t , "personal_unlockAccount" , [ ] interface { } { param [ 0 ] [ "from" ] , "" } )
require . Nil ( t , rpcRes . Error )
rpcRes = Call ( t , "eth_sendTransaction" , param )
2020-06-22 16:07:35 +00:00
var hash hexutil . Bytes
err := json . Unmarshal ( rpcRes . Result , & hash )
require . NoError ( t , err )
2020-12-15 19:52:09 +00:00
receipt := WaitForReceipt ( t , hash )
2020-06-22 16:07:35 +00:00
require . NotNil ( t , receipt )
require . Equal ( t , "0x1" , receipt [ "status" ] . ( string ) )
}
func TestEth_SendTransaction_ContractDeploy ( t * testing . T ) {
2020-04-13 19:18:50 +00:00
param := make ( [ ] map [ string ] string , 1 )
param [ 0 ] = make ( map [ string ] string )
param [ 0 ] [ "from" ] = "0x" + fmt . Sprintf ( "%x" , from )
param [ 0 ] [ "data" ] = "0x6080604052348015600f57600080fd5b5060117f775a94827b8fd9b519d36cd827093c664f93347070a554f65e4a6f56cd73889860405160405180910390a2603580604b6000396000f3fe6080604052600080fdfea165627a7a723058206cab665f0f557620554bb45adf266708d2bd349b8a4314bdff205ee8440e3c240029"
2021-04-17 10:00:07 +00:00
rpcRes := Call ( t , "personal_unlockAccount" , [ ] interface { } { param [ 0 ] [ "from" ] , "" } )
require . Nil ( t , rpcRes . Error )
rpcRes = Call ( t , "eth_sendTransaction" , param )
2020-04-13 19:18:50 +00:00
var hash hexutil . Bytes
2020-05-04 22:02:26 +00:00
err := json . Unmarshal ( rpcRes . Result , & hash )
2020-04-13 19:18:50 +00:00
require . NoError ( t , err )
}
2020-04-07 20:00:06 +00:00
func TestEth_NewFilter ( t * testing . T ) {
param := make ( [ ] map [ string ] [ ] string , 1 )
param [ 0 ] = make ( map [ string ] [ ] string )
param [ 0 ] [ "topics" ] = [ ] string { "0x0000000000000000000000000000000000000000000000000000000012341234" }
2020-12-15 19:52:09 +00:00
rpcRes := Call ( t , "eth_newFilter" , param )
2020-04-07 20:00:06 +00:00
2020-07-23 19:38:47 +00:00
var ID string
2020-05-04 22:02:26 +00:00
err := json . Unmarshal ( rpcRes . Result , & ID )
2020-04-13 19:18:50 +00:00
require . NoError ( t , err )
}
func TestEth_NewBlockFilter ( t * testing . T ) {
2020-12-15 19:52:09 +00:00
rpcRes := Call ( t , "eth_newBlockFilter" , [ ] string { } )
2020-04-13 19:18:50 +00:00
2020-07-23 19:38:47 +00:00
var ID string
2020-05-04 22:02:26 +00:00
err := json . Unmarshal ( rpcRes . Result , & ID )
2020-04-13 19:18:50 +00:00
require . NoError ( t , err )
}
2020-07-03 15:40:00 +00:00
func TestEth_GetFilterChanges_BlockFilter ( t * testing . T ) {
2020-12-15 19:52:09 +00:00
rpcRes := Call ( t , "eth_newBlockFilter" , [ ] string { } )
2020-07-03 15:40:00 +00:00
2020-07-23 19:38:47 +00:00
var ID string
2020-07-03 15:40:00 +00:00
err := json . Unmarshal ( rpcRes . Result , & ID )
require . NoError ( t , err )
time . Sleep ( 5 * time . Second )
2020-12-15 19:52:09 +00:00
changesRes := Call ( t , "eth_getFilterChanges" , [ ] string { ID } )
2020-07-03 15:40:00 +00:00
var hashes [ ] ethcmn . Hash
err = json . Unmarshal ( changesRes . Result , & hashes )
require . NoError ( t , err )
require . GreaterOrEqual ( t , len ( hashes ) , 1 )
}
2020-04-13 19:18:50 +00:00
func TestEth_GetFilterChanges_NoLogs ( t * testing . T ) {
param := make ( [ ] map [ string ] [ ] string , 1 )
param [ 0 ] = make ( map [ string ] [ ] string )
param [ 0 ] [ "topics" ] = [ ] string { }
2020-12-15 19:52:09 +00:00
rpcRes := Call ( t , "eth_newFilter" , param )
2020-04-13 19:18:50 +00:00
2020-07-23 19:38:47 +00:00
var ID string
2020-05-04 22:02:26 +00:00
err := json . Unmarshal ( rpcRes . Result , & ID )
2020-04-13 19:18:50 +00:00
require . NoError ( t , err )
2020-12-15 19:52:09 +00:00
changesRes := Call ( t , "eth_getFilterChanges" , [ ] string { ID } )
2020-04-13 19:18:50 +00:00
var logs [ ] * ethtypes . Log
err = json . Unmarshal ( changesRes . Result , & logs )
require . NoError ( t , err )
}
func TestEth_GetFilterChanges_WrongID ( t * testing . T ) {
2020-12-15 19:52:09 +00:00
req , err := json . Marshal ( CreateRequest ( "eth_getFilterChanges" , [ ] string { "0x1122334400000077" } ) )
2020-05-04 22:02:26 +00:00
require . NoError ( t , err )
var rpcRes * Response
time . Sleep ( 1 * time . Second )
/* #nosec */
2020-06-25 07:51:56 +00:00
res , err := http . Post ( HOST , "application/json" , bytes . NewBuffer ( req ) )
2020-05-04 22:02:26 +00:00
require . NoError ( t , err )
decoder := json . NewDecoder ( res . Body )
rpcRes = new ( Response )
err = decoder . Decode ( & rpcRes )
require . NoError ( t , err )
err = res . Body . Close ( )
require . NoError ( t , err )
require . NotNil ( t , "invalid filter ID" , rpcRes . Error . Message )
2020-04-13 19:18:50 +00:00
}
2020-05-02 17:39:26 +00:00
func TestEth_GetTransactionReceipt ( t * testing . T ) {
2020-12-15 19:52:09 +00:00
hash := SendTestTransaction ( t , from )
2020-05-02 17:39:26 +00:00
time . Sleep ( time . Second * 5 )
param := [ ] string { hash . String ( ) }
2020-12-15 19:52:09 +00:00
rpcRes := Call ( t , "eth_getTransactionReceipt" , param )
2020-06-04 10:40:21 +00:00
require . Nil ( t , rpcRes . Error )
2020-05-02 17:39:26 +00:00
receipt := make ( map [ string ] interface { } )
2020-05-04 22:02:26 +00:00
err := json . Unmarshal ( rpcRes . Result , & receipt )
2020-05-02 17:39:26 +00:00
require . NoError ( t , err )
2020-06-04 10:40:21 +00:00
require . NotEmpty ( t , receipt )
2020-05-02 17:39:26 +00:00
require . Equal ( t , "0x1" , receipt [ "status" ] . ( string ) )
2020-05-14 20:55:33 +00:00
require . Equal ( t , [ ] interface { } { } , receipt [ "logs" ] . ( [ ] interface { } ) )
2020-05-02 17:39:26 +00:00
}
func TestEth_GetTransactionReceipt_ContractDeployment ( t * testing . T ) {
2021-04-17 10:00:07 +00:00
rpcRes := Call ( t , "personal_unlockAccount" , [ ] interface { } { hexutil . Bytes ( from ) , "" } )
require . Nil ( t , rpcRes . Error )
2020-12-15 19:52:09 +00:00
hash , _ := DeployTestContract ( t , from )
2020-04-13 19:18:50 +00:00
2020-05-02 17:39:26 +00:00
time . Sleep ( time . Second * 5 )
2020-04-13 19:18:50 +00:00
param := [ ] string { hash . String ( ) }
2021-04-17 10:00:07 +00:00
rpcRes = Call ( t , "eth_getTransactionReceipt" , param )
2020-04-13 19:18:50 +00:00
2020-05-02 17:39:26 +00:00
receipt := make ( map [ string ] interface { } )
2020-05-04 22:02:26 +00:00
err := json . Unmarshal ( rpcRes . Result , & receipt )
2020-05-02 17:39:26 +00:00
require . NoError ( t , err )
require . Equal ( t , "0x1" , receipt [ "status" ] . ( string ) )
require . NotEqual ( t , ethcmn . Address { } . String ( ) , receipt [ "contractAddress" ] . ( string ) )
2020-05-04 22:02:26 +00:00
require . NotNil ( t , receipt [ "logs" ] )
2020-04-13 19:18:50 +00:00
}
func TestEth_GetFilterChanges_NoTopics ( t * testing . T ) {
2020-12-15 19:52:09 +00:00
rpcRes := Call ( t , "eth_blockNumber" , [ ] string { } )
2020-04-13 19:18:50 +00:00
var res hexutil . Uint64
2020-05-04 22:02:26 +00:00
err := res . UnmarshalJSON ( rpcRes . Result )
2020-04-13 19:18:50 +00:00
require . NoError ( t , err )
param := make ( [ ] map [ string ] interface { } , 1 )
param [ 0 ] = make ( map [ string ] interface { } )
param [ 0 ] [ "topics" ] = [ ] string { }
param [ 0 ] [ "fromBlock" ] = res . String ( )
2020-05-04 22:02:26 +00:00
// instantiate new filter
2020-12-15 19:52:09 +00:00
rpcRes = Call ( t , "eth_newFilter" , param )
2020-07-27 19:33:16 +00:00
require . Nil ( t , rpcRes . Error )
2020-09-23 15:36:07 +00:00
var ID string
2020-04-13 19:18:50 +00:00
err = json . Unmarshal ( rpcRes . Result , & ID )
require . NoError ( t , err )
2020-05-04 22:02:26 +00:00
// deploy contract, emitting some event
2020-12-15 19:52:09 +00:00
DeployTestContract ( t , from )
2020-04-13 19:18:50 +00:00
// get filter changes
2020-12-15 19:52:09 +00:00
changesRes := Call ( t , "eth_getFilterChanges" , [ ] string { ID } )
2021-04-17 10:00:07 +00:00
require . Equal ( t , 2 , len ( changesRes . Result ) )
2020-04-13 19:18:50 +00:00
}
func TestEth_GetFilterChanges_Addresses ( t * testing . T ) {
2020-05-04 22:02:26 +00:00
t . Skip ( )
2020-04-13 19:18:50 +00:00
// TODO: need transaction receipts to determine contract deployment address
}
func TestEth_GetFilterChanges_BlockHash ( t * testing . T ) {
2020-05-04 22:02:26 +00:00
t . Skip ( )
2020-04-13 19:18:50 +00:00
// TODO: need transaction receipts to determine tx block
}
// hash of Hello event
var helloTopic = "0x775a94827b8fd9b519d36cd827093c664f93347070a554f65e4a6f56cd738898"
// world parameter in Hello event
var worldTopic = "0x0000000000000000000000000000000000000000000000000000000000000011"
// Tests topics case where there are topics in first two positions
func TestEth_GetFilterChanges_Topics_AB ( t * testing . T ) {
time . Sleep ( time . Second )
2020-12-15 19:52:09 +00:00
rpcRes := Call ( t , "eth_blockNumber" , [ ] string { } )
2020-04-13 19:18:50 +00:00
var res hexutil . Uint64
2020-05-04 22:02:26 +00:00
err := res . UnmarshalJSON ( rpcRes . Result )
2020-04-13 19:18:50 +00:00
require . NoError ( t , err )
param := make ( [ ] map [ string ] interface { } , 1 )
param [ 0 ] = make ( map [ string ] interface { } )
param [ 0 ] [ "topics" ] = [ ] string { helloTopic , worldTopic }
param [ 0 ] [ "fromBlock" ] = res . String ( )
2020-05-04 22:02:26 +00:00
// instantiate new filter
2020-12-15 19:52:09 +00:00
rpcRes = Call ( t , "eth_newFilter" , param )
2020-09-09 14:55:01 +00:00
var ID string
2020-04-13 19:18:50 +00:00
err = json . Unmarshal ( rpcRes . Result , & ID )
2020-09-09 14:55:01 +00:00
require . NoError ( t , err , string ( rpcRes . Result ) )
2020-04-13 19:18:50 +00:00
2020-12-15 19:52:09 +00:00
DeployTestContractWithFunction ( t , from )
2020-04-13 19:18:50 +00:00
// get filter changes
2020-12-15 19:52:09 +00:00
changesRes := Call ( t , "eth_getFilterChanges" , [ ] string { ID } )
2021-04-17 10:00:07 +00:00
require . Equal ( t , 2 , len ( changesRes . Result ) )
2020-04-13 19:18:50 +00:00
}
func TestEth_GetFilterChanges_Topics_XB ( t * testing . T ) {
2020-12-15 19:52:09 +00:00
rpcRes := Call ( t , "eth_blockNumber" , [ ] string { } )
2020-04-13 19:18:50 +00:00
var res hexutil . Uint64
2020-05-04 22:02:26 +00:00
err := res . UnmarshalJSON ( rpcRes . Result )
2020-04-13 19:18:50 +00:00
require . NoError ( t , err )
param := make ( [ ] map [ string ] interface { } , 1 )
param [ 0 ] = make ( map [ string ] interface { } )
param [ 0 ] [ "topics" ] = [ ] interface { } { nil , worldTopic }
param [ 0 ] [ "fromBlock" ] = res . String ( )
2020-05-04 22:02:26 +00:00
// instantiate new filter
2020-12-15 19:52:09 +00:00
rpcRes = Call ( t , "eth_newFilter" , param )
2020-09-23 15:36:07 +00:00
var ID string
2020-04-13 19:18:50 +00:00
err = json . Unmarshal ( rpcRes . Result , & ID )
require . NoError ( t , err )
2020-12-15 19:52:09 +00:00
DeployTestContractWithFunction ( t , from )
2020-04-13 19:18:50 +00:00
// get filter changes
2020-12-15 19:52:09 +00:00
changesRes := Call ( t , "eth_getFilterChanges" , [ ] string { ID } )
2021-04-17 10:00:07 +00:00
require . Equal ( t , 2 , len ( changesRes . Result ) )
2020-04-13 19:18:50 +00:00
}
func TestEth_GetFilterChanges_Topics_XXC ( t * testing . T ) {
2020-05-04 22:02:26 +00:00
t . Skip ( )
2020-04-13 19:18:50 +00:00
// TODO: call test function, need tx receipts to determine contract address
}
2020-05-04 22:02:26 +00:00
func TestEth_PendingTransactionFilter ( t * testing . T ) {
2020-12-15 19:52:09 +00:00
rpcRes := Call ( t , "eth_newPendingTransactionFilter" , [ ] string { } )
2020-04-16 14:53:14 +00:00
2020-09-23 15:36:07 +00:00
var ID string
err := json . Unmarshal ( rpcRes . Result , & ID )
2020-04-16 14:53:14 +00:00
require . NoError ( t , err )
for i := 0 ; i < 5 ; i ++ {
2020-12-15 19:52:09 +00:00
DeployTestContractWithFunction ( t , from )
2020-04-16 14:53:14 +00:00
}
time . Sleep ( 10 * time . Second )
// get filter changes
2020-12-15 19:52:09 +00:00
changesRes := Call ( t , "eth_getFilterChanges" , [ ] string { ID } )
2020-04-16 14:53:14 +00:00
require . NotNil ( t , changesRes )
var txs [ ] * hexutil . Bytes
err = json . Unmarshal ( changesRes . Result , & txs )
require . NoError ( t , err , string ( changesRes . Result ) )
require . True ( t , len ( txs ) >= 2 , "could not get any txs" , "changesRes.Result" , string ( changesRes . Result ) )
}
2020-05-15 02:08:13 +00:00
2020-06-01 18:12:34 +00:00
func TestEth_EstimateGas ( t * testing . T ) {
2021-02-16 21:04:29 +00:00
2020-06-01 18:12:34 +00:00
param := make ( [ ] map [ string ] string , 1 )
param [ 0 ] = make ( map [ string ] string )
param [ 0 ] [ "from" ] = "0x" + fmt . Sprintf ( "%x" , from )
param [ 0 ] [ "to" ] = "0x1122334455667788990011223344556677889900"
param [ 0 ] [ "value" ] = "0x1"
2021-04-17 10:00:07 +00:00
rpcRes := Call ( t , "personal_unlockAccount" , [ ] interface { } { param [ 0 ] [ "from" ] , "" } )
require . NotNil ( t , rpcRes )
rpcRes = Call ( t , "eth_estimateGas" , param )
2020-09-02 19:41:05 +00:00
require . NotNil ( t , rpcRes )
require . NotEmpty ( t , rpcRes . Result )
2020-06-01 18:12:34 +00:00
2020-09-02 19:41:05 +00:00
var gas string
2020-06-01 18:12:34 +00:00
err := json . Unmarshal ( rpcRes . Result , & gas )
2020-09-02 19:41:05 +00:00
require . NoError ( t , err , string ( rpcRes . Result ) )
2020-06-01 18:12:34 +00:00
2021-04-17 10:00:07 +00:00
require . Equal ( t , "0xfab9" , gas )
2020-06-01 18:12:34 +00:00
}
2020-06-17 16:14:21 +00:00
2020-06-25 07:51:56 +00:00
func TestEth_EstimateGas_ContractDeployment ( t * testing . T ) {
bytecode := "0x608060405234801561001057600080fd5b5060117f775a94827b8fd9b519d36cd827093c664f93347070a554f65e4a6f56cd73889860405160405180910390a260d08061004d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063eb8ac92114602d575b600080fd5b606060048036036040811015604157600080fd5b8101908080359060200190929190803590602001909291905050506062565b005b8160008190555080827ff3ca124a697ba07e8c5e80bebcfcc48991fc16a63170e8a9206e30508960d00360405160405180910390a3505056fea265627a7a723158201d94d2187aaf3a6790527b615fcc40970febf0385fa6d72a2344848ebd0df3e964736f6c63430005110032"
2021-02-16 21:04:29 +00:00
//deploy contract befor call estimateGas, make account nonce changed
hash , _ := DeployTestContract ( t , from )
time . Sleep ( 5 * time . Second )
paramdeploy := [ ] string { hash . String ( ) }
rpcRes := Call ( t , "eth_getTransactionReceipt" , paramdeploy )
require . Nil ( t , rpcRes . Error )
2020-06-25 07:51:56 +00:00
param := make ( [ ] map [ string ] string , 1 )
param [ 0 ] = make ( map [ string ] string )
param [ 0 ] [ "from" ] = "0x" + fmt . Sprintf ( "%x" , from )
param [ 0 ] [ "data" ] = bytecode
2021-04-17 10:00:07 +00:00
rpcRes := Call ( t , "personal_unlockAccount" , [ ] interface { } { param [ 0 ] [ "from" ] , "" } )
require . NotNil ( t , rpcRes )
2021-02-16 21:04:29 +00:00
rpcRes = Call ( t , "eth_estimateGas" , param )
2020-09-02 19:41:05 +00:00
require . NotNil ( t , rpcRes )
require . NotEmpty ( t , rpcRes . Result )
2020-06-25 07:51:56 +00:00
var gas hexutil . Uint64
err := json . Unmarshal ( rpcRes . Result , & gas )
2020-09-02 19:41:05 +00:00
require . NoError ( t , err , string ( rpcRes . Result ) )
2020-06-25 07:51:56 +00:00
2021-04-17 10:00:07 +00:00
require . Equal ( t , "0x1ab8d" , gas . String ( ) )
2020-06-25 07:51:56 +00:00
}
2020-06-17 16:14:21 +00:00
func TestEth_GetBlockByNumber ( t * testing . T ) {
param := [ ] interface { } { "0x1" , false }
2020-12-15 19:52:09 +00:00
rpcRes := Call ( t , "eth_getBlockByNumber" , param )
2020-06-17 16:14:21 +00:00
block := make ( map [ string ] interface { } )
err := json . Unmarshal ( rpcRes . Result , & block )
require . NoError ( t , err )
require . Equal ( t , "0x0" , block [ "extraData" ] . ( string ) )
2020-06-18 20:35:06 +00:00
require . Equal ( t , [ ] interface { } { } , block [ "uncles" ] . ( [ ] interface { } ) )
2020-06-17 16:14:21 +00:00
}