diff --git a/Makefile b/Makefile index 720a196e..d970a0f4 100644 --- a/Makefile +++ b/Makefile @@ -67,10 +67,10 @@ test: | $(GINKGO) $(GOOSE) integrationtest: | $(GINKGO) $(GOOSE) go vet ./... go fmt ./... - #export PGPASSWORD=$(DATABASE_PASSWORD) - #dropdb -h $(DATABASE_HOSTNAME) -p $(DATABASE_PORT) -U $(DATABASE_USER) --if-exists $(TEST_DB) - #createdb -h $(DATABASE_HOSTNAME) -p $(DATABASE_PORT) -U $(DATABASE_USER) $(TEST_DB) - #$(GOOSE) -dir db/migrations postgres "$(TEST_CONNECT_STRING)" up + export PGPASSWORD=$(DATABASE_PASSWORD) + dropdb -h $(DATABASE_HOSTNAME) -p $(DATABASE_PORT) -U $(DATABASE_USER) --if-exists $(TEST_DB) + createdb -h $(DATABASE_HOSTNAME) -p $(DATABASE_PORT) -U $(DATABASE_USER) $(TEST_DB) + $(GOOSE) -dir db/migrations postgres "$(TEST_CONNECT_STRING)" up $(GINKGO) -r test/ -v .PHONY: test_local diff --git a/pkg/eth/api.go b/pkg/eth/api.go index cf4b1322..0b2bc8df 100644 --- a/pkg/eth/api.go +++ b/pkg/eth/api.go @@ -698,7 +698,7 @@ func (pea *PublicEthAPI) GetStorageAt(ctx context.Context, address common.Addres } } if err == sql.ErrNoRows { - return make([]byte, 32), nil + return hexutil.Bytes{}, errors.New("header not found") } return nil, err } diff --git a/pkg/eth/api_test.go b/pkg/eth/api_test.go index 076a7693..b97c6c7d 100644 --- a/pkg/eth/api_test.go +++ b/pkg/eth/api_test.go @@ -18,13 +18,16 @@ package eth_test import ( "context" + "math/big" "strconv" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/eth/filters" + "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rpc" . "github.com/onsi/ginkgo" @@ -168,7 +171,7 @@ var ( "to": expectedTransaction3.To, "gasUsed": hexutil.Uint64(test_helpers.MockReceipts[2].GasUsed), "cumulativeGasUsed": hexutil.Uint64(test_helpers.MockReceipts[2].CumulativeGasUsed), - "contractAddress": nil, + "contractAddress": test_helpers.ContractAddress, "logs": test_helpers.MockReceipts[2].Logs, "logsBloom": test_helpers.MockReceipts[2].Bloom, "root": hexutil.Bytes(test_helpers.MockReceipts[2].PostState), @@ -177,8 +180,9 @@ var ( var _ = Describe("API", func() { var ( - db *postgres.DB - api *eth.PublicEthAPI + db *postgres.DB + api *eth.PublicEthAPI + chainConfig = params.TestChainConfig ) // Test db setup, rather than using BeforeEach we only need to setup once since the tests do not mutate the database // Note: if you focus one of the tests be sure to focus this and the defered It() @@ -187,7 +191,11 @@ var _ = Describe("API", func() { db, err = shared.SetupDB() Expect(err).ToNot(HaveOccurred()) indexAndPublisher := eth2.NewIPLDPublisher(db) - backend, err := eth.NewEthBackend(db, ð.Config{}) + backend, err := eth.NewEthBackend(db, ð.Config{ + ChainConfig: chainConfig, + VmConfig: vm.Config{}, + RPCGasCap: big.NewInt(10000000000), + }) Expect(err).ToNot(HaveOccurred()) api = eth.NewPublicEthAPI(backend, nil, false) err = indexAndPublisher.Publish(test_helpers.MockConvertedPayload) @@ -361,6 +369,7 @@ var _ = Describe("API", func() { Describe("eth_getUncleCountByBlockNumber", func() { It("Retrieves the number of uncles for the canonical block with the provided number", func() { count := api.GetUncleCountByBlockNumber(ctx, number) + Expect(*count).NotTo(Equal(nil)) Expect(uint64(*count)).To(Equal(uint64(2))) }) }) @@ -368,6 +377,7 @@ var _ = Describe("API", func() { Describe("eth_getUncleCountByBlockHash", func() { It("Retrieves the number of uncles for the block with the provided hash", func() { count := api.GetUncleCountByBlockHash(ctx, blockHash) + Expect(*count).NotTo(Equal(nil)) Expect(uint64(*count)).To(Equal(uint64(2))) }) }) @@ -948,8 +958,17 @@ var _ = Describe("API", func() { Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal((*hexutil.Big)(common.Big0))) }) - It("Throws an error for an account it cannot find the balance for", func() { - _, err := api.GetBalance(ctx, randomAddr, rpc.BlockNumberOrHashWithHash(blockHash, true)) + It("Retrieves the eth balance for the non-existing account address at the block with the provided hash", func() { + bal, err := api.GetBalance(ctx, randomAddr, rpc.BlockNumberOrHashWithHash(blockHash, true)) + Expect(err).ToNot(HaveOccurred()) + Expect(bal).To(Equal((*hexutil.Big)(common.Big0))) + }) + It("Throws an error for an account of a non-existing block hash", func() { + _, err := api.GetBalance(ctx, test_helpers.AccountAddresss, rpc.BlockNumberOrHashWithHash(randomHash, true)) + Expect(err).To(HaveOccurred()) + }) + It("Throws an error for an account of a non-existing block number", func() { + _, err := api.GetBalance(ctx, test_helpers.AccountAddresss, rpc.BlockNumberOrHashWithNumber(wrongNumber)) Expect(err).To(HaveOccurred()) }) }) diff --git a/pkg/eth/backend.go b/pkg/eth/backend.go index 87470108..596bf25a 100644 --- a/pkg/eth/backend.go +++ b/pkg/eth/backend.go @@ -51,6 +51,7 @@ import ( var ( errPendingBlockNumber = errors.New("pending block number not supported") errNegativeBlockNumber = errors.New("negative block number not supported") + errInvalidBlockNumber = errors.New("invalid block number") ) const ( @@ -598,21 +599,27 @@ func (b *Backend) GetAccountByNumber(ctx context.Context, address common.Address return nil, errPendingBlockNumber } hash, err := b.GetCanonicalHash(uint64(number)) - if err != nil { + if err == sql.ErrNoRows || hash == (common.Hash{}) { + return nil, fmt.Errorf("no canoncial block hash found for provided height (%d)", number) + } else if err != nil { return nil, err } - if hash == (common.Hash{}) { - return nil, fmt.Errorf("no canoncial block hash found for provided height (%d)", number) - } + return b.GetAccountByHash(ctx, address, hash) } // GetAccountByHash returns the account object for the provided address at the block with the provided hash func (b *Backend) GetAccountByHash(ctx context.Context, address common.Address, hash common.Hash) (*state.Account, error) { + _, err := b.HeaderByHash(context.Background(), hash) + if err == sql.ErrNoRows { + return nil, fmt.Errorf("no canoncial block found for provided hash (%s)", hash) + } + _, accountRlp, err := b.IPLDRetriever.RetrieveAccountByAddressAndBlockHash(address, hash) if err != nil { return nil, err } + acct := new(state.Account) return acct, rlp.DecodeBytes(accountRlp, acct) } diff --git a/pkg/eth/cid_retriever_test.go b/pkg/eth/cid_retriever_test.go index 88a702fa..db6a426c 100644 --- a/pkg/eth/cid_retriever_test.go +++ b/pkg/eth/cid_retriever_test.go @@ -237,6 +237,7 @@ var _ = Describe("Retriever", func() { Expect(empty).ToNot(BeTrue()) Expect(len(cids)).To(Equal(1)) Expect(cids[0].BlockNumber).To(Equal(test_helpers.MockCIDWrapper.BlockNumber)) + expectedHeaderCID := test_helpers.MockCIDWrapper.Header expectedHeaderCID.ID = cids[0].Header.ID expectedHeaderCID.NodeID = cids[0].Header.NodeID @@ -250,6 +251,7 @@ var _ = Describe("Retriever", func() { Expect(eth.ReceiptModelsContainsCID(cids[0].Receipts, test_helpers.MockCIDWrapper.Receipts[1].CID)).To(BeTrue()) Expect(eth.ReceiptModelsContainsCID(cids[0].Receipts, test_helpers.MockCIDWrapper.Receipts[2].CID)).To(BeTrue()) Expect(len(cids[0].StateNodes)).To(Equal(2)) + for _, stateNode := range cids[0].StateNodes { if stateNode.CID == test_helpers.State1CID.String() { Expect(stateNode.StateKey).To(Equal(common.BytesToHash(test_helpers.ContractLeafKey).Hex())) diff --git a/pkg/eth/eth_state_test.go b/pkg/eth/eth_state_test.go index 55f66467..cc701eea 100644 --- a/pkg/eth/eth_state_test.go +++ b/pkg/eth/eth_state_test.go @@ -38,7 +38,6 @@ import ( eth2 "github.com/vulcanize/ipld-eth-indexer/pkg/eth" "github.com/vulcanize/ipld-eth-indexer/pkg/postgres" "github.com/vulcanize/ipld-eth-indexer/pkg/shared" - "github.com/vulcanize/ipld-eth-server/pkg/eth" "github.com/vulcanize/ipld-eth-server/pkg/eth/test_helpers" ) @@ -234,12 +233,15 @@ var _ = Describe("eth state reading tests", func() { bal, err = api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithNumber(1)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedAcct1BalanceBlock1)) - _, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithNumber(1)) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) - _, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithNumber(1)) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) + + bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithNumber(1)) + Expect(err).ToNot(HaveOccurred()) + Expect(bal).To(Equal((*hexutil.Big)(common.Big0))) + + bal, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithNumber(1)) + Expect(err).ToNot(HaveOccurred()) + Expect(bal).To(Equal((*hexutil.Big)(common.Big0))) + bal, err = api.GetBalance(ctx, test_helpers.TestBankAddress, rpc.BlockNumberOrHashWithNumber(1)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedBankBalanceBlock1)) @@ -247,12 +249,15 @@ var _ = Describe("eth state reading tests", func() { bal, err = api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithNumber(2)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedAcct1BalanceBlock1)) + bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithNumber(2)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedAcct2BalanceBlock2)) + bal, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithNumber(2)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedContractBalance)) + bal, err = api.GetBalance(ctx, test_helpers.TestBankAddress, rpc.BlockNumberOrHashWithNumber(2)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedBankBalanceBlock2)) @@ -260,12 +265,15 @@ var _ = Describe("eth state reading tests", func() { bal, err = api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithNumber(3)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedAcct1BalanceBlock1)) + bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithNumber(3)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedAcct2BalanceBlock3)) + bal, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithNumber(3)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedContractBalance)) + bal, err = api.GetBalance(ctx, test_helpers.TestBankAddress, rpc.BlockNumberOrHashWithNumber(3)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedBankBalanceBlock2)) @@ -273,12 +281,15 @@ var _ = Describe("eth state reading tests", func() { bal, err = api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithNumber(4)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedAcct1BalanceBlock1)) + bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithNumber(4)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedAcct2BalanceBlock4)) + bal, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithNumber(4)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedContractBalance)) + bal, err = api.GetBalance(ctx, test_helpers.TestBankAddress, rpc.BlockNumberOrHashWithNumber(4)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedBankBalanceBlock2)) @@ -286,12 +297,15 @@ var _ = Describe("eth state reading tests", func() { bal, err = api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithNumber(5)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedAcct1BalanceBlock5)) + bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithNumber(5)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedAcct2BalanceBlock4)) + bal, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithNumber(5)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedContractBalance)) + bal, err = api.GetBalance(ctx, test_helpers.TestBankAddress, rpc.BlockNumberOrHashWithNumber(5)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedBankBalanceBlock2)) @@ -304,12 +318,15 @@ var _ = Describe("eth state reading tests", func() { bal, err = api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithHash(blocks[1].Hash(), true)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedAcct1BalanceBlock1)) - _, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithHash(blocks[1].Hash(), true)) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) + + bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithHash(blocks[1].Hash(), true)) + Expect(err).ToNot(HaveOccurred()) + Expect(bal).To(Equal((*hexutil.Big)(common.Big0))) + _, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithHash(blocks[1].Hash(), true)) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) + Expect(err).ToNot(HaveOccurred()) + Expect(bal).To(Equal((*hexutil.Big)(common.Big0))) + bal, err = api.GetBalance(ctx, test_helpers.TestBankAddress, rpc.BlockNumberOrHashWithHash(blocks[1].Hash(), true)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedBankBalanceBlock1)) @@ -317,12 +334,15 @@ var _ = Describe("eth state reading tests", func() { bal, err = api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithHash(blocks[2].Hash(), true)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedAcct1BalanceBlock1)) + bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithHash(blocks[2].Hash(), true)) Expect(err).ToNot(HaveOccurred()) + Expect(bal).To(Equal(expectedAcct2BalanceBlock2)) bal, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithHash(blocks[2].Hash(), true)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedContractBalance)) + bal, err = api.GetBalance(ctx, test_helpers.TestBankAddress, rpc.BlockNumberOrHashWithHash(blocks[2].Hash(), true)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedBankBalanceBlock2)) @@ -330,12 +350,15 @@ var _ = Describe("eth state reading tests", func() { bal, err = api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithHash(blocks[3].Hash(), true)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedAcct1BalanceBlock1)) + bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithHash(blocks[3].Hash(), true)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedAcct2BalanceBlock3)) + bal, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithHash(blocks[3].Hash(), true)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedContractBalance)) + bal, err = api.GetBalance(ctx, test_helpers.TestBankAddress, rpc.BlockNumberOrHashWithHash(blocks[3].Hash(), true)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedBankBalanceBlock2)) @@ -343,12 +366,15 @@ var _ = Describe("eth state reading tests", func() { bal, err = api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithHash(blocks[4].Hash(), true)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedAcct1BalanceBlock1)) + bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithHash(blocks[4].Hash(), true)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedAcct2BalanceBlock4)) + bal, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithHash(blocks[4].Hash(), true)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedContractBalance)) + bal, err = api.GetBalance(ctx, test_helpers.TestBankAddress, rpc.BlockNumberOrHashWithHash(blocks[4].Hash(), true)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedBankBalanceBlock2)) @@ -356,37 +382,45 @@ var _ = Describe("eth state reading tests", func() { bal, err = api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithHash(blocks[5].Hash(), true)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedAcct1BalanceBlock5)) + bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithHash(blocks[5].Hash(), true)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedAcct2BalanceBlock4)) + bal, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithHash(blocks[5].Hash(), true)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedContractBalance)) + bal, err = api.GetBalance(ctx, test_helpers.TestBankAddress, rpc.BlockNumberOrHashWithHash(blocks[5].Hash(), true)) Expect(err).ToNot(HaveOccurred()) Expect(bal).To(Equal(expectedBankBalanceBlock2)) }) - It("Throws an error for an account it cannot find the balance for an account at the provided block number", func() { - _, err := api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithNumber(0)) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) - _, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithNumber(0)) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) - _, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithNumber(0)) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) + It("Returns `0` for an account it cannot find the balance for an account at the provided block number", func() { + bal, err := api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithNumber(0)) + Expect(err).ToNot(HaveOccurred()) + Expect(bal).To(Equal((*hexutil.Big)(common.Big0))) + + bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithNumber(0)) + Expect(err).ToNot(HaveOccurred()) + Expect(bal).To(Equal((*hexutil.Big)(common.Big0))) + + bal, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithNumber(0)) + Expect(err).ToNot(HaveOccurred()) + Expect(bal).To(Equal((*hexutil.Big)(common.Big0))) }) - It("Throws an error for an account it cannot find the balance for an account at the provided block hash", func() { - _, err := api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithHash(blocks[0].Hash(), true)) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) - _, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithHash(blocks[0].Hash(), true)) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) - _, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithHash(blocks[0].Hash(), true)) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) + It("Returns `0` for an error for an account it cannot find the balance for an account at the provided block hash", func() { + bal, err := api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithHash(blocks[0].Hash(), true)) + Expect(err).ToNot(HaveOccurred()) + Expect(bal).To(Equal((*hexutil.Big)(common.Big0))) + + bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithHash(blocks[0].Hash(), true)) + Expect(err).ToNot(HaveOccurred()) + Expect(bal).To(Equal((*hexutil.Big)(common.Big0))) + + bal, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithHash(blocks[0].Hash(), true)) + Expect(err).ToNot(HaveOccurred()) + Expect(bal).To(Equal((*hexutil.Big)(common.Big0))) + }) }) @@ -425,16 +459,16 @@ var _ = Describe("eth state reading tests", func() { It("Throws an error if it tries to access a contract which does not exist", func() { _, err := api.GetStorageAt(ctx, test_helpers.ContractAddr, test_helpers.ContractSlotKeyHash.Hex(), rpc.BlockNumberOrHashWithNumber(0)) Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) + Expect(err.Error()).To(ContainSubstring("header not found")) _, err = api.GetStorageAt(ctx, test_helpers.ContractAddr, test_helpers.ContractSlotKeyHash.Hex(), rpc.BlockNumberOrHashWithNumber(1)) Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) + Expect(err.Error()).To(ContainSubstring("header not found")) }) It("Throws an error if it tries to access a contract slot which does not exist", func() { _, err := api.GetStorageAt(ctx, test_helpers.ContractAddr, randomHash.Hex(), rpc.BlockNumberOrHashWithNumber(2)) Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) + Expect(err.Error()).To(ContainSubstring("header not found")) }) It("Retrieves the storage value at the provided contract address and storage leaf key at the block with the provided hash or number", func() { // After deployment diff --git a/pkg/eth/test_helpers/test_data.go b/pkg/eth/test_helpers/test_data.go index d26d670d..f205b8c0 100644 --- a/pkg/eth/test_helpers/test_data.go +++ b/pkg/eth/test_helpers/test_data.go @@ -34,7 +34,7 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/statediff/testhelpers" - "github.com/ipfs/go-block-format" + blocks "github.com/ipfs/go-block-format" "github.com/multiformats/go-multihash" log "github.com/sirupsen/logrus" @@ -80,7 +80,7 @@ var ( }, } ReceiptsRlp, _ = rlp.EncodeToBytes(MockReceipts) - MockBlock = types.NewBlock(&MockHeader, MockTransactions, MockUncles, MockReceipts, new(trie.Trie)) + MockBlock = createNewBlock(&MockHeader, MockTransactions, MockUncles, MockReceipts, new(trie.Trie)) MockHeaderRlp, _ = rlp.EncodeToBytes(MockBlock.Header()) MockChildHeader = types.Header{ Time: 0, @@ -104,15 +104,22 @@ var ( mockTopic21 = common.HexToHash("0x05") mockTopic22 = common.HexToHash("0x07") MockLog1 = &types.Log{ - Address: Address, - Topics: []common.Hash{mockTopic11, mockTopic12}, - Data: []byte{}, + Address: Address, + Topics: []common.Hash{mockTopic11, mockTopic12}, + Data: []byte{}, + BlockNumber: BlockNumber.Uint64(), + TxIndex: 0, + Index: 0, } MockLog2 = &types.Log{ - Address: AnotherAddress, - Topics: []common.Hash{mockTopic21, mockTopic22}, - Data: []byte{}, + Address: AnotherAddress, + Topics: []common.Hash{mockTopic21, mockTopic22}, + Data: []byte{}, + BlockNumber: BlockNumber.Uint64(), + TxIndex: 1, + Index: 1, } + HeaderCID, _ = ipld.RawdataToCid(ipld.MEthHeader, MockHeaderRlp, multihash.KECCAK_256) HeaderMhKey = shared.MultihashKeyFromCID(HeaderCID) Trx1CID, _ = ipld.RawdataToCid(ipld.MEthTx, MockTransactions.GetRlp(0), multihash.KECCAK_256) @@ -375,6 +382,8 @@ var ( StateNodes: MockStateNodes, } + Reward = eth.CalcEthBlockReward(MockBlock.Header(), MockBlock.Uncles(), MockBlock.Transactions(), MockReceipts) + MockCIDWrapper = ð2.CIDWrapper{ BlockNumber: new(big.Int).Set(BlockNumber), Header: eth.HeaderModel{ @@ -384,7 +393,7 @@ var ( CID: HeaderCID.String(), MhKey: HeaderMhKey, TotalDifficulty: MockBlock.Difficulty().String(), - Reward: "5312500000000000000", + Reward: Reward.String(), StateRoot: MockBlock.Root().String(), RctRoot: MockBlock.ReceiptHash().String(), TxRoot: MockBlock.TxHash().String(), @@ -489,6 +498,17 @@ var ( } ) +func createNewBlock(header *types.Header, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt, hasher types.Hasher) *types.Block { + block := types.NewBlock(header, txs, uncles, receipts, hasher) + bHash := block.Hash() + for _, r := range receipts { + for _, l := range r.Logs { + l.BlockHash = bHash + } + } + return block +} + // createTransactionsAndReceipts is a helper function to generate signed mock transactions and mock receipts with mock logs func createTransactionsAndReceipts() (types.Transactions, types.Receipts, common.Address) { // make transactions @@ -519,13 +539,26 @@ func createTransactionsAndReceipts() (types.Transactions, types.Receipts, common } // make receipts mockReceipt1 := types.NewReceipt(common.HexToHash("0x0").Bytes(), false, 50) + + hash1 := signedTrx1.Hash() + MockLog1.TxHash = hash1 + mockReceipt1.Logs = []*types.Log{MockLog1} - mockReceipt1.TxHash = signedTrx1.Hash() + mockReceipt1.TxHash = hash1 + mockReceipt1.GasUsed = mockReceipt1.CumulativeGasUsed + mockReceipt2 := types.NewReceipt(common.HexToHash("0x1").Bytes(), false, 100) + hash2 := signedTrx2.Hash() + MockLog2.TxHash = hash2 + mockReceipt2.Logs = []*types.Log{MockLog2} - mockReceipt2.TxHash = signedTrx2.Hash() - mockReceipt3 := types.NewReceipt(common.HexToHash("0x2").Bytes(), false, 75) + mockReceipt2.TxHash = hash2 + mockReceipt2.GasUsed = mockReceipt2.CumulativeGasUsed - mockReceipt1.CumulativeGasUsed + + mockReceipt3 := types.NewReceipt(common.HexToHash("0x2").Bytes(), false, 175) mockReceipt3.Logs = []*types.Log{} mockReceipt3.TxHash = signedTrx3.Hash() + mockReceipt3.GasUsed = mockReceipt3.CumulativeGasUsed - mockReceipt2.CumulativeGasUsed + return types.Transactions{signedTrx1, signedTrx2, signedTrx3}, types.Receipts{mockReceipt1, mockReceipt2, mockReceipt3}, SenderAddr } diff --git a/test/integration_test.go b/test/integration_test.go index 243185c3..76a8e993 100644 --- a/test/integration_test.go +++ b/test/integration_test.go @@ -2,16 +2,17 @@ package integration_test import ( "context" + "math/big" + "time" + "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "time" "github.com/ethereum/go-ethereum/rlp" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" integration "github.com/vulcanize/ipld-eth-server/test" - "math/big" "github.com/ethereum/go-ethereum/ethclient" )