diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 0a374581..b304e27f 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,4 +1,4 @@ # CODEOWNERS: https://help.github.com/articles/about-codeowners/ # Primary repo maintainers -* @alexanderbez @AlexeyAkhunov @jackzampolin +* @fedekunze @noot diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..3671c0aa --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,21 @@ +name: Build +on: + pull_request: + branches: + - "development" + +jobs: + cleanup-runs: + runs-on: ubuntu-latest + steps: + - uses: rokroskar/workflow-run-cleanup-action@master + env: + GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" + if: "!startsWith(github.ref, 'refs/tags/') && github.ref != 'refs/heads/development'" + + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - run: | + make build diff --git a/.github/workflows/linkchecker.yml b/.github/workflows/linkchecker.yml new file mode 100644 index 00000000..6013b974 --- /dev/null +++ b/.github/workflows/linkchecker.yml @@ -0,0 +1,12 @@ +name: Check Markdown links +on: + schedule: + - cron: "* */24 * * *" +jobs: + markdown-link-check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@development + - uses: gaurav-nelson/github-action-markdown-link-check@0.6.0 + with: + folder-path: "docs" diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..980deb6c --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,29 @@ +name: Lint +# Lint runs golangci-lint over the entire cosmos-sdk repository +# This workflow is run on every pull request and push to development +# The `golangci` will pass without running if no *.{go, mod, sum} files have been changed. +on: + pull_request: + push: + branches: + - development +jobs: + golangci: + name: golangci-lint + runs-on: ubuntu-latest + timeout-minutes: 6 + steps: + - uses: actions/checkout@v2 + - uses: technote-space/get-diff-action@v1 + with: + SUFFIX_FILTER: | + .go + .mod + .sum + - uses: golangci/golangci-lint-action@master + with: + # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. + version: v1.27 + args: --timeout 10m + github-token: ${{ secrets.github_token }} + if: "env.GIT_DIFF != ''" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..fe47c929 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,212 @@ +name: Tests / Code Coverage +# Tests / Code Coverage workflow runs unit tests and uploads a code coverage report +# This workflow is run on pushes to development & every Pull Requests where a .go, .mod, .sum have been changed +on: + pull_request: + push: + branches: + - development +jobs: + split-test-files: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Create a file with all the pkgs + run: go list ./... | grep -Ev 'vendor|importer|rpc/tester' > pkgs.txt + - name: Split pkgs into 4 files + run: split -n l/4 --additional-suffix=.txt ./pkgs.txt + # cache multiple + - uses: actions/upload-artifact@v2 + with: + name: "${{ github.sha }}-aa" + path: ./xaa.txt + - uses: actions/upload-artifact@v2 + with: + name: "${{ github.sha }}-ab" + path: ./xab.txt + - uses: actions/upload-artifact@v2 + with: + name: "${{ github.sha }}-ac" + path: ./xac.txt + - uses: actions/upload-artifact@v2 + with: + name: "${{ github.sha }}-ad" + path: ./xad.txt + + test-coverage-run-1: + runs-on: ubuntu-latest + needs: split-test-files + timeout-minutes: 10 + steps: + - uses: actions/checkout@v2 + - uses: technote-space/get-diff-action@v1 + id: git_diff + with: + SUFFIX_FILTER: | + .go + .mod + .sum + - uses: actions/download-artifact@v2 + with: + name: "${{ github.sha }}-aa" + if: "env.GIT_DIFF != ''" + - name: test & coverage report creation + run: | + cat xaa.txt | xargs go test -mod=readonly -timeout 8m -coverprofile=coverage.txt -covermode=atomic + if: "env.GIT_DIFF != ''" + - name: filter out proto files + run: | + excludelist+=" $(find ./ -type f -name '*.pb.go')" + for filename in ${excludelist}; do + filename=$(echo $filename | sed 's/^./github.com\/cosmos\/ethermint/g') + echo "Excluding ${filename} from coverage report..." + sed -i.bak "/$(echo $filename | sed 's/\//\\\//g')/d" coverage.txt + done + if: "env.GIT_DIFF != ''" + - uses: codecov/codecov-action@v1 + with: + file: ./coverage.txt + fail_ci_if_error: true + if: "env.GIT_DIFF != ''" + + test-coverage-run-2: + runs-on: ubuntu-latest + needs: split-test-files + timeout-minutes: 10 + steps: + - uses: actions/checkout@v2 + - uses: technote-space/get-diff-action@v1 + id: git_diff + with: + SUFFIX_FILTER: | + .go + .mod + .sum + - uses: actions/download-artifact@v2 + with: + name: "${{ github.sha }}-ab" + if: "env.GIT_DIFF != ''" + - name: test & coverage report creation + run: | + cat xab.txt | xargs go test -mod=readonly -timeout 6m -coverprofile=coverage.txt -covermode=atomic + if: "env.GIT_DIFF != ''" + - name: filter out proto files + run: | + excludelist+=" $(find ./ -type f -name '*.pb.go')" + for filename in ${excludelist}; do + filename=$(echo $filename | sed 's/^./github.com\/cosmos\/ethermint/g') + echo "Excluding ${filename} from coverage report..." + sed -i.bak "/$(echo $filename | sed 's/\//\\\//g')/d" coverage.txt + done + if: "env.GIT_DIFF != ''" + - uses: codecov/codecov-action@v1 + with: + file: ./coverage.txt + fail_ci_if_error: true + if: "env.GIT_DIFF != ''" + + test-coverage-run-3: + runs-on: ubuntu-latest + needs: split-test-files + timeout-minutes: 10 + steps: + - uses: actions/checkout@v2 + - uses: technote-space/get-diff-action@v1 + id: git_diff + with: + SUFFIX_FILTER: | + .go + .mod + .sum + - uses: actions/download-artifact@v2 + with: + name: "${{ github.sha }}-ac" + if: "env.GIT_DIFF != ''" + - name: test & coverage report creation + run: | + cat xac.txt | xargs go test -mod=readonly -timeout 6m -coverprofile=coverage.txt -covermode=atomic + if: "env.GIT_DIFF != ''" + - name: filter out proto files + run: | + excludelist+=" $(find ./ -type f -name '*.pb.go')" + for filename in ${excludelist}; do + filename=$(echo $filename | sed 's/^./github.com\/cosmos\/ethermint/g') + echo "Excluding ${filename} from coverage report..." + sed -i.bak "/$(echo $filename | sed 's/\//\\\//g')/d" coverage.txt + done + if: "env.GIT_DIFF != ''" + - uses: codecov/codecov-action@v1 + with: + file: ./coverage.txt + fail_ci_if_error: true + if: "env.GIT_DIFF != ''" + + test-coverage-run-4: + runs-on: ubuntu-latest + needs: split-test-files + timeout-minutes: 10 + steps: + - uses: actions/checkout@v2 + - uses: technote-space/get-diff-action@v1 + id: git_diff + with: + SUFFIX_FILTER: | + .go + .mod + .sum + - uses: actions/download-artifact@v2 + with: + name: "${{ github.sha }}-ad" + if: "env.GIT_DIFF != ''" + - name: test & coverage report creation + run: | + cat xad.txt | xargs go test -mod=readonly -timeout 6m -coverprofile=coverage.txt -covermode=atomic + if: "env.GIT_DIFF != ''" + - name: filter out proto files + run: | + excludelist+=" $(find ./ -type f -name '*.pb.go')" + for filename in ${excludelist}; do + filename=$(echo $filename | sed 's/^./github.com\/cosmos\/ethermint/g') + echo "Excluding ${filename} from coverage report..." + sed -i.bak "/$(echo $filename | sed 's/\//\\\//g')/d" coverage.txt + done + if: "env.GIT_DIFF != ''" + - uses: codecov/codecov-action@v1 + with: + file: ./coverage.txt + fail_ci_if_error: true + if: "env.GIT_DIFF != ''" + + rpc-tests: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v2 + - uses: technote-space/get-diff-action@v1 + id: git_diff + with: + SUFFIX_FILTER: | + .go + .mod + .sum + - name: rpc-test + run: | + make test-rpc + if: "env.GIT_DIFF != ''" + # TODO: remove tmp dir to fix this + # test-importer: + # runs-on: ubuntu-latest + # timeout-minutes: 10 + # steps: + # - uses: actions/checkout@v2 + # - uses: technote-space/get-diff-action@v1 + # id: git_diff + # with: + # SUFFIX_FILTER: | + # .go + # .mod + # .sum + # - name: importer-test + # run: | + # make test-import + # if: "env.GIT_DIFF != ''" diff --git a/.golangci.yml b/.golangci.yml index 2382a4bc..1cce5232 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,4 +1,5 @@ -# run: +run: + tests: false # # timeout for analysis, e.g. 30s, 5m, default is 1m # timeout: 5m @@ -31,8 +32,8 @@ linters: - typecheck - unconvert - unused + - unparam - misspell - - varcheck issues: exclude-rules: @@ -53,9 +54,9 @@ issues: - text: "ST1016:" linters: - stylecheck - - linters: - - golint - text: "don't use ALL_CAPS in Go names;" + max-issues-per-linter: 10000 + max-same-issues: 10000 + linters-settings: dogsled: max-blank-identifiers: 3 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index e5f9e663..00000000 --- a/.travis.yml +++ /dev/null @@ -1,27 +0,0 @@ -language: go - -go: - - 1.14.x - -cache: - directories: - - "$HOME/.cache/go-build" - - "$GOPATH/pkg/mod" - -matrix: - include: - - name: Verify deps & Lint - script: - - rm -rf $HOME/.cache/golangci-lint || true - - make verify build - - make lint - - name: Unit Tests - script: - - make test-import - - make test-unit - - name: Race Tests - script: - - make test-race - - name: Integration Tests - script: - - make it-tests || true diff --git a/Makefile b/Makefile index bced05a9..953f037c 100644 --- a/Makefile +++ b/Makefile @@ -142,27 +142,16 @@ endif test: test-unit test-unit: - @${GO_MOD} go test -v --vet=off $(PACKAGES) + @go test -v ./... $(PACKAGES) test-race: - @${GO_MOD} go test -v --vet=off -race $(PACKAGES) - -test-cli: - @echo "NO CLI TESTS" - -lint: - @echo "--> Running ci lint..." - GOBIN=$(PWD)/bin go run scripts/ci.go lint + @go test -v --vet=off -race ./... $(PACKAGES) test-import: - @${GO_MOD} go test ./importer -v --vet=off --run=TestImportBlocks --datadir tmp \ + @go test ./importer -v --vet=off --run=TestImportBlocks --datadir tmp \ --blockchain blockchain --timeout=10m - # TODO: remove tmp directory after test run to avoid subsequent errors test-rpc: - @${GO_MOD} go test -v --vet=off ./tests/rpc_test - -it-tests: ./scripts/integration-test-all.sh -q 1 -z 1 -s 2 godocs: @@ -174,15 +163,28 @@ docker: docker tag ${DOCKER_IMAGE}:${DOCKER_TAG} ${DOCKER_IMAGE}:latest docker tag ${DOCKER_IMAGE}:${DOCKER_TAG} ${DOCKER_IMAGE}:${COMMIT_HASH} -format: - @echo "--> Formatting go files" - @find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" | xargs gofmt -w -s - @find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" | xargs misspell -w - .PHONY: build install update-tools tools godocs clean format lint \ test-cli test-race test-unit test test-import +############################################################################### +### Linting ### +############################################################################### + +lint: + golangci-lint run --out-format=tab --issues-exit-code=0 + find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" | xargs gofmt -d -s + +format: + find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -name '*.pb.go' | xargs gofmt -w -s + find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -name '*.pb.go' | xargs misspell -w + find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -name '*.pb.go' | xargs goimports -w -local github.com/tendermint + find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -name '*.pb.go' | xargs goimports -w -local github.com/ethereum/go-ethereum + find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -name '*.pb.go' | xargs goimports -w -local github.com/cosmos/cosmos-sdk + find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -name '*.pb.go' | xargs goimports -w -local github.com/cosmos/ethermint + +.PHONY: lint format + ############################################################################### ### Protobuf ### ############################################################################### diff --git a/importer/importer_test.go b/importer/importer_test.go index eee639c8..3fab25d5 100644 --- a/importer/importer_test.go +++ b/importer/importer_test.go @@ -131,7 +131,7 @@ func createAndTestGenesis(t *testing.T, cms sdk.CommitMultiStore, ak auth.Accoun } } - // get balance of one of the genesis account having 200 ETH + // get balance of one of the genesis account having 400 ETH b := stateDB.GetBalance(genInvestor) require.Equal(t, "200000000000000000000", b.String()) @@ -206,8 +206,7 @@ func TestImportBlocks(t *testing.T) { blockchainInput, err := os.Open(flagBlockchain) require.Nil(t, err) - // nolint: gosec - defer blockchainInput.Close() + defer require.NoError(t, blockchainInput.Close()) // ethereum mainnet config chainContext := core.NewChainContext() diff --git a/rpc/backend.go b/rpc/backend.go index 41a1b7a3..4fae7496 100644 --- a/rpc/backend.go +++ b/rpc/backend.go @@ -6,8 +6,7 @@ import ( "strconv" "github.com/cosmos/cosmos-sdk/client/context" - "github.com/cosmos/ethermint/x/evm" - "github.com/cosmos/ethermint/x/evm/types" + evmtypes "github.com/cosmos/ethermint/x/evm/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -32,12 +31,13 @@ type Backend interface { // TODO: Bloom methods } -// EmintBackend implements Backend +// EthermintBackend implements Backend type EthermintBackend struct { cliCtx context.CLIContext gasLimit int64 } +// NewEthermintBackend creates a new EthermintBackend instance func NewEthermintBackend(cliCtx context.CLIContext) *EthermintBackend { return &EthermintBackend{ cliCtx: cliCtx, @@ -47,12 +47,12 @@ func NewEthermintBackend(cliCtx context.CLIContext) *EthermintBackend { // BlockNumber returns the current block number. func (e *EthermintBackend) BlockNumber() (hexutil.Uint64, error) { - res, height, err := e.cliCtx.QueryWithData(fmt.Sprintf("custom/%s/blockNumber", types.ModuleName), nil) + res, height, err := e.cliCtx.QueryWithData(fmt.Sprintf("custom/%s/blockNumber", evmtypes.ModuleName), nil) if err != nil { return hexutil.Uint64(0), err } - var out types.QueryResBlockNumber + var out evmtypes.QueryResBlockNumber e.cliCtx.Codec.MustUnmarshalJSON(res, &out) e.cliCtx.WithHeight(height) @@ -67,12 +67,12 @@ func (e *EthermintBackend) GetBlockByNumber(blockNum BlockNumber, fullTx bool) ( // GetBlockByHash returns the block identified by hash. func (e *EthermintBackend) GetBlockByHash(hash common.Hash, fullTx bool) (map[string]interface{}, error) { - res, _, err := e.cliCtx.Query(fmt.Sprintf("custom/%s/%s/%s", types.ModuleName, evm.QueryHashToHeight, hash.Hex())) + res, _, err := e.cliCtx.Query(fmt.Sprintf("custom/%s/%s/%s", evmtypes.ModuleName, evmtypes.QueryHashToHeight, hash.Hex())) if err != nil { return nil, err } - var out types.QueryResBlockNumber + var out evmtypes.QueryResBlockNumber if err := e.cliCtx.Codec.UnmarshalJSON(res, &out); err != nil { return nil, err } @@ -120,12 +120,12 @@ func (e *EthermintBackend) getEthBlockByNumber(height int64, fullTx bool) (map[s } } - res, _, err := e.cliCtx.Query(fmt.Sprintf("custom/%s/%s/%s", types.ModuleName, evm.QueryBloom, strconv.FormatInt(block.Block.Height, 10))) + res, _, err := e.cliCtx.Query(fmt.Sprintf("custom/%s/%s/%s", evmtypes.ModuleName, evmtypes.QueryBloom, strconv.FormatInt(block.Block.Height, 10))) if err != nil { return nil, err } - var out types.QueryBloomFilter + var out evmtypes.QueryBloomFilter e.cliCtx.Codec.MustUnmarshalJSON(res, &out) return formatBlock(header, block.Block.Size(), gasLimit, gasUsed, transactions, out.Bloom), nil @@ -161,12 +161,12 @@ func (e *EthermintBackend) GetTransactionLogs(txHash common.Hash) ([]*ethtypes.L // do we need to use the block height somewhere? ctx := e.cliCtx - res, _, err := ctx.QueryWithData(fmt.Sprintf("custom/%s/%s/%s", types.ModuleName, evm.QueryTransactionLogs, txHash.Hex()), nil) + res, _, err := ctx.QueryWithData(fmt.Sprintf("custom/%s/%s/%s", evmtypes.ModuleName, evmtypes.QueryTransactionLogs, txHash.Hex()), nil) if err != nil { return nil, err } - out := new(types.QueryETHLogs) + out := new(evmtypes.QueryETHLogs) if err := e.cliCtx.Codec.UnmarshalJSON(res, &out); err != nil { return nil, err } diff --git a/rpc/eth_api.go b/rpc/eth_api.go index 62073cdb..f895d03b 100644 --- a/rpc/eth_api.go +++ b/rpc/eth_api.go @@ -18,8 +18,7 @@ import ( emint "github.com/cosmos/ethermint/types" "github.com/cosmos/ethermint/utils" "github.com/cosmos/ethermint/version" - "github.com/cosmos/ethermint/x/evm" - "github.com/cosmos/ethermint/x/evm/types" + evmtypes "github.com/cosmos/ethermint/x/evm/types" abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/crypto/merkle" @@ -160,12 +159,12 @@ func (e *PublicEthAPI) BlockNumber() (hexutil.Uint64, error) { // GetBalance returns the provided account's balance up to the provided block number. func (e *PublicEthAPI) GetBalance(address common.Address, blockNum BlockNumber) (*hexutil.Big, error) { ctx := e.cliCtx.WithHeight(blockNum.Int64()) - res, _, err := ctx.QueryWithData(fmt.Sprintf("custom/%s/balance/%s", types.ModuleName, address.Hex()), nil) + res, _, err := ctx.QueryWithData(fmt.Sprintf("custom/%s/balance/%s", evmtypes.ModuleName, address.Hex()), nil) if err != nil { return nil, err } - var out types.QueryResBalance + var out evmtypes.QueryResBalance e.cliCtx.Codec.MustUnmarshalJSON(res, &out) val, err := utils.UnmarshalBigInt(out.Balance) if err != nil { @@ -178,12 +177,12 @@ func (e *PublicEthAPI) GetBalance(address common.Address, blockNum BlockNumber) // GetStorageAt returns the contract storage at the given address, block number, and key. func (e *PublicEthAPI) GetStorageAt(address common.Address, key string, blockNum BlockNumber) (hexutil.Bytes, error) { ctx := e.cliCtx.WithHeight(blockNum.Int64()) - res, _, err := ctx.QueryWithData(fmt.Sprintf("custom/%s/storage/%s/%s", types.ModuleName, address.Hex(), key), nil) + res, _, err := ctx.QueryWithData(fmt.Sprintf("custom/%s/storage/%s/%s", evmtypes.ModuleName, address.Hex(), key), nil) if err != nil { return nil, err } - var out types.QueryResStorage + var out evmtypes.QueryResStorage e.cliCtx.Codec.MustUnmarshalJSON(res, &out) return out.Value, nil } @@ -215,13 +214,13 @@ func (e *PublicEthAPI) GetTransactionCount(address common.Address, blockNum Bloc // GetBlockTransactionCountByHash returns the number of transactions in the block identified by hash. func (e *PublicEthAPI) GetBlockTransactionCountByHash(hash common.Hash) *hexutil.Uint { - res, _, err := e.cliCtx.Query(fmt.Sprintf("custom/%s/%s/%s", types.ModuleName, evm.QueryHashToHeight, hash.Hex())) + res, _, err := e.cliCtx.Query(fmt.Sprintf("custom/%s/%s/%s", evmtypes.ModuleName, evmtypes.QueryHashToHeight, hash.Hex())) if err != nil { // Return nil if block does not exist return nil } - var out types.QueryResBlockNumber + var out evmtypes.QueryResBlockNumber e.cliCtx.Codec.MustUnmarshalJSON(res, &out) return e.getBlockTransactionCountByNumber(out.Number) } @@ -256,12 +255,12 @@ func (e *PublicEthAPI) GetUncleCountByBlockNumber(blockNum BlockNumber) hexutil. // GetCode returns the contract code at the given address and block number. func (e *PublicEthAPI) GetCode(address common.Address, blockNumber BlockNumber) (hexutil.Bytes, error) { ctx := e.cliCtx.WithHeight(blockNumber.Int64()) - res, _, err := ctx.QueryWithData(fmt.Sprintf("custom/%s/%s/%s", types.ModuleName, evm.QueryCode, address.Hex()), nil) + res, _, err := ctx.QueryWithData(fmt.Sprintf("custom/%s/%s/%s", evmtypes.ModuleName, evmtypes.QueryCode, address.Hex()), nil) if err != nil { return nil, err } - var out types.QueryResCode + var out evmtypes.QueryResCode e.cliCtx.Codec.MustUnmarshalJSON(res, &out) return out.Code, nil } @@ -276,7 +275,7 @@ func (e *PublicEthAPI) GetTransactionLogs(txHash common.Hash) ([]*ethtypes.Log, func (e *PublicEthAPI) ExportAccount(address common.Address, blockNumber BlockNumber) (string, error) { ctx := e.cliCtx.WithHeight(blockNumber.Int64()) - res, _, err := ctx.QueryWithData(fmt.Sprintf("custom/%s/%s/%s", types.ModuleName, evm.QueryExportAccount, address.Hex()), nil) + res, _, err := ctx.QueryWithData(fmt.Sprintf("custom/%s/%s/%s", evmtypes.ModuleName, evmtypes.QueryExportAccount, address.Hex()), nil) if err != nil { return "", err } @@ -352,7 +351,7 @@ func (e *PublicEthAPI) SendTransaction(args params.SendTxArgs) (common.Hash, err // SendRawTransaction send a raw Ethereum transaction. func (e *PublicEthAPI) SendRawTransaction(data hexutil.Bytes) (common.Hash, error) { - tx := new(types.MsgEthereumTx) + tx := new(evmtypes.MsgEthereumTx) // RLP decode raw transaction bytes if err := rlp.DecodeBytes(data, tx); err != nil { @@ -395,7 +394,7 @@ func (e *PublicEthAPI) Call(args CallArgs, blockNr rpc.BlockNumber, overrides *m return []byte{}, err } - data, err := types.DecodeResultData(simRes.Result.Data) + data, err := evmtypes.DecodeResultData(simRes.Result.Data) if err != nil { return []byte{}, err } @@ -417,7 +416,7 @@ type account struct { StateDiff *map[common.Hash]common.Hash `json:"stateDiff"` } -// DoCall performs a simulated call operation through the evm. It returns the +// DoCall performs a simulated call operation through the evmtypes. It returns the // estimated gas used on the operation or an error if fails. func (e *PublicEthAPI) doCall( args CallArgs, blockNr rpc.BlockNumber, globalGasCap *big.Int, @@ -476,7 +475,7 @@ func (e *PublicEthAPI) doCall( } // Create new call message - msg := types.NewMsgEthermint(0, &toAddr, sdk.NewIntFromBigInt(value), gas, + msg := evmtypes.NewMsgEthermint(0, &toAddr, sdk.NewIntFromBigInt(value), gas, sdk.NewIntFromBigInt(gasPrice), data, sdk.AccAddress(addr.Bytes())) // Generate tx to be used to simulate (signature isn't needed) @@ -594,14 +593,14 @@ type Transaction struct { S *hexutil.Big `json:"s"` } -func bytesToEthTx(cliCtx context.CLIContext, bz []byte) (*types.MsgEthereumTx, error) { +func bytesToEthTx(cliCtx context.CLIContext, bz []byte) (*evmtypes.MsgEthereumTx, error) { var stdTx sdk.Tx err := cliCtx.Codec.UnmarshalBinaryBare(bz, &stdTx) if err != nil { return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) } - ethTx, ok := stdTx.(types.MsgEthereumTx) + ethTx, ok := stdTx.(evmtypes.MsgEthereumTx) if !ok { return nil, fmt.Errorf("invalid transaction type, must be an amino encoded Ethereum transaction") } @@ -610,7 +609,7 @@ func bytesToEthTx(cliCtx context.CLIContext, bz []byte) (*types.MsgEthereumTx, e // newRPCTransaction returns a transaction that will serialize to the RPC // representation, with the given location metadata set (if available). -func newRPCTransaction(tx types.MsgEthereumTx, txHash, blockHash common.Hash, blockNumber *uint64, index uint64) (*Transaction, error) { +func newRPCTransaction(tx evmtypes.MsgEthereumTx, txHash, blockHash common.Hash, blockNumber *uint64, index uint64) (*Transaction, error) { // Verify signature and retrieve sender address from, err := tx.VerifySig(tx.ChainID()) if err != nil { @@ -666,12 +665,12 @@ func (e *PublicEthAPI) GetTransactionByHash(hash common.Hash) (*Transaction, err // GetTransactionByBlockHashAndIndex returns the transaction identified by hash and index. func (e *PublicEthAPI) GetTransactionByBlockHashAndIndex(hash common.Hash, idx hexutil.Uint) (*Transaction, error) { - res, _, err := e.cliCtx.Query(fmt.Sprintf("custom/%s/%s/%s", types.ModuleName, evm.QueryHashToHeight, hash.Hex())) + res, _, err := e.cliCtx.Query(fmt.Sprintf("custom/%s/%s/%s", evmtypes.ModuleName, evmtypes.QueryHashToHeight, hash.Hex())) if err != nil { return nil, err } - var out types.QueryResBlockNumber + var out evmtypes.QueryResBlockNumber e.cliCtx.Codec.MustUnmarshalJSON(res, &out) return e.getTransactionByBlockNumberAndIndex(out.Number, idx) } @@ -738,7 +737,7 @@ func (e *PublicEthAPI) GetTransactionReceipt(hash common.Hash) (map[string]inter txData := tx.TxResult.GetData() - data, err := types.DecodeResultData(txData) + data, err := evmtypes.DecodeResultData(txData) if err != nil { status = 0 // transaction failed } @@ -814,7 +813,7 @@ type StorageResult struct { // GetProof returns an account object with proof and any storage proofs func (e *PublicEthAPI) GetProof(address common.Address, storageKeys []string, block BlockNumber) (*AccountResult, error) { e.cliCtx = e.cliCtx.WithHeight(int64(block)) - path := fmt.Sprintf("custom/%s/%s/%s", types.ModuleName, evm.QueryAccount, address.Hex()) + path := fmt.Sprintf("custom/%s/%s/%s", evmtypes.ModuleName, evmtypes.QueryAccount, address.Hex()) // query eth account at block height resBz, _, err := e.cliCtx.Query(path) @@ -822,20 +821,20 @@ func (e *PublicEthAPI) GetProof(address common.Address, storageKeys []string, bl return nil, err } - var account types.QueryResAccount + var account evmtypes.QueryResAccount e.cliCtx.Codec.MustUnmarshalJSON(resBz, &account) storageProofs := make([]StorageResult, len(storageKeys)) opts := client.ABCIQueryOptions{Height: int64(block), Prove: true} for i, k := range storageKeys { // Get value for key - vPath := fmt.Sprintf("custom/%s/%s/%s/%s", types.ModuleName, evm.QueryStorage, address, k) + vPath := fmt.Sprintf("custom/%s/%s/%s/%s", evmtypes.ModuleName, evmtypes.QueryStorage, address, k) vRes, err := e.cliCtx.Client.ABCIQueryWithOptions(vPath, nil, opts) if err != nil { return nil, err } - var value types.QueryResStorage + var value evmtypes.QueryResStorage e.cliCtx.Codec.MustUnmarshalJSON(vRes.Response.GetValue(), &value) // check for proof @@ -883,7 +882,7 @@ func (e *PublicEthAPI) GetProof(address common.Address, storageKeys []string, bl } // generateFromArgs populates tx message with args (used in RPC API) -func (e *PublicEthAPI) generateFromArgs(args params.SendTxArgs) (*types.MsgEthereumTx, error) { +func (e *PublicEthAPI) generateFromArgs(args params.SendTxArgs) (*evmtypes.MsgEthereumTx, error) { var ( nonce uint64 gasLimit uint64 @@ -954,7 +953,7 @@ func (e *PublicEthAPI) generateFromArgs(args params.SendTxArgs) (*types.MsgEther } else { gasLimit = (uint64)(*args.Gas) } - msg := types.NewMsgEthereumTx(nonce, args.To, amount, gasLimit, gasPrice, input) + msg := evmtypes.NewMsgEthereumTx(nonce, args.To, amount, gasLimit, gasPrice, input) return &msg, nil } diff --git a/scripts/ci.go b/scripts/ci.go deleted file mode 100755 index 52f2ec7c..00000000 --- a/scripts/ci.go +++ /dev/null @@ -1,73 +0,0 @@ -// +build none - -package main - -import ( - "flag" - "fmt" - "log" - "os" - "os/exec" - "path/filepath" - "runtime" - "strings" -) - -const ( - GOLANGCI_VERSION = "github.com/golangci/golangci-lint/cmd/golangci-lint@v1.23.8" -) - -func main() { - - log.SetFlags(log.Lshortfile) - - if _, err := os.Stat(filepath.Join("scripts", "ci.go")); os.IsNotExist(err) { - log.Fatal("should run build from root dir") - } else if err != nil { - panic(err) - } - if len(os.Args) < 2 { - log.Fatal("cmd required, eg: install") - } - switch os.Args[1] { - case "lint": - lint() - default: - log.Fatal("cmd not found", os.Args[1]) - } -} - -func lint() { - - verbose := flag.Bool("v", false, "Whether to log verbosely") - - // Make sure golangci-lint is available - argsGet := append([]string{"get", GOLANGCI_VERSION}) - cmd := exec.Command(filepath.Join(runtime.GOROOT(), "bin", "go"), argsGet...) - out, err := cmd.CombinedOutput() - if err != nil { - log.Fatalf("could not list packages: %v\n%s", err, string(out)) - } - - cmd = exec.Command(filepath.Join(GOBIN(), "golangci-lint")) - cmd.Args = append(cmd.Args, "run", "--config", ".golangci.yml") - - if *verbose { - cmd.Args = append(cmd.Args, "-v") - } - - fmt.Println("Lint Ethermint", strings.Join(cmd.Args, " \\\n")) - cmd.Stderr, cmd.Stdout = os.Stderr, os.Stdout - - if err := cmd.Run(); err != nil { - log.Fatal("Error: Could not Lint Ethermint. ", "error: ", err, ", cmd: ", cmd) - } -} - -// GOBIN returns the GOBIN environment variable -func GOBIN() string { - if os.Getenv("GOBIN") == "" { - log.Fatal("GOBIN is not set") - } - return os.Getenv("GOBIN") -} diff --git a/x/evm/alias.go b/x/evm/alias.go index ddedf1e5..e86b47df 100644 --- a/x/evm/alias.go +++ b/x/evm/alias.go @@ -7,35 +7,19 @@ import ( // nolint const ( - ModuleName = types.ModuleName - StoreKey = types.StoreKey - RouterKey = types.RouterKey - QueryProtocolVersion = types.QueryProtocolVersion - QueryBalance = types.QueryBalance - QueryBlockNumber = types.QueryBlockNumber - QueryStorage = types.QueryStorage - QueryCode = types.QueryCode - QueryNonce = types.QueryNonce - QueryHashToHeight = types.QueryHashToHeight - QueryTransactionLogs = types.QueryTransactionLogs - QueryBloom = types.QueryBloom - QueryLogs = types.QueryLogs - QueryAccount = types.QueryAccount - QueryExportAccount = types.QueryExportAccount + ModuleName = types.ModuleName + StoreKey = types.StoreKey + RouterKey = types.RouterKey ) // nolint var ( - NewKeeper = keeper.NewKeeper - TxDecoder = types.TxDecoder - NewGenesisStorage = types.NewGenesisStorage + NewKeeper = keeper.NewKeeper + TxDecoder = types.TxDecoder ) //nolint type ( - Keeper = keeper.Keeper - QueryResAccount = types.QueryResAccount - GenesisState = types.GenesisState - GenesisAccount = types.GenesisAccount - GenesisStorage = types.GenesisStorage + Keeper = keeper.Keeper + GenesisState = types.GenesisState ) diff --git a/x/evm/genesis.go b/x/evm/genesis.go index 1cd8332e..78c4d16e 100644 --- a/x/evm/genesis.go +++ b/x/evm/genesis.go @@ -46,7 +46,7 @@ func InitGenesis(ctx sdk.Context, k Keeper, data GenesisState) []abci.ValidatorU // ExportGenesis exports genesis state func ExportGenesis(ctx sdk.Context, k Keeper, ak types.AccountKeeper) GenesisState { // nolint: prealloc - var ethGenAccounts []GenesisAccount + var ethGenAccounts []types.GenesisAccount accounts := ak.GetAllAccounts(ctx) var err error @@ -58,16 +58,16 @@ func ExportGenesis(ctx sdk.Context, k Keeper, ak types.AccountKeeper) GenesisSta addr := common.BytesToAddress(ethAccount.GetAddress().Bytes()) - var storage []GenesisStorage + var storage []types.GenesisStorage err = k.CommitStateDB.ForEachStorage(addr, func(key, value common.Hash) bool { - storage = append(storage, NewGenesisStorage(key, value)) + storage = append(storage, types.NewGenesisStorage(key, value)) return false }) if err != nil { panic(err) } - genAccount := GenesisAccount{ + genAccount := types.GenesisAccount{ Address: addr, Balance: k.GetBalance(ctx, addr), Code: k.GetCode(ctx, addr), diff --git a/x/faucet/keeper/querier.go b/x/faucet/keeper/querier.go index e7992cc0..fc732d4d 100644 --- a/x/faucet/keeper/querier.go +++ b/x/faucet/keeper/querier.go @@ -21,7 +21,7 @@ func NewQuerier(k Keeper) sdk.Querier { } } -func queryFunded(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { +func queryFunded(ctx sdk.Context, _ abci.RequestQuery, k Keeper) ([]byte, error) { funded := k.GetFunded(ctx) bz, err := codec.MarshalJSONIndent(k.cdc, funded)