diff --git a/.github/workflows/on-pr.yaml b/.github/workflows/on-pr.yaml index c139e829..99f446dd 100644 --- a/.github/workflows/on-pr.yaml +++ b/.github/workflows/on-pr.yaml @@ -60,11 +60,15 @@ jobs: integrationtest: name: Run integration tests env: + STACK_ORCHESTRATOR_REF: fcbc74451c5494664fe21f765e89c9c6565c07cb + GO_ETHEREUM_REF: 498101102c891c4f8c3cab5649158c642ee1fd6b GOPATH: /tmp/go DB_WRITE: true ETH_FORWARD_ETH_CALLS: false ETH_PROXY_ON_ERROR: false - ETH_HTTP_PATH: "" + ETH_HTTP_PATH: "go-ethereum:8545" + WATCHED_ADDRESS_GAP_FILLER_ENABLED: false + WATCHED_ADDRESS_GAP_FILLER_INTERVAL: 2 strategy: matrix: go-version: [1.16.x] @@ -78,10 +82,44 @@ jobs: with: go-version: ${{ matrix.go-version }} - uses: actions/checkout@v2 - - name: Run database - run: docker-compose -f docker-compose.test.yml -f docker-compose.yml up -d ipld-eth-db dapptools contract eth-server + with: + path: "./ipld-eth-server" + - uses: actions/checkout@v2 + with: + ref: ${{ env.STACK_ORCHESTRATOR_REF }} + path: "./stack-orchestrator/" + repository: vulcanize/stack-orchestrator + - uses: actions/checkout@v2 + with: + ref: ${{ env.GO_ETHEREUM_REF }} + repository: vulcanize/go-ethereum + path: "./go-ethereum/" + - name: Create config file + run: | + echo vulcanize_go_ethereum=$GITHUB_WORKSPACE/go-ethereum/ > ./config.sh + echo vulcanize_ipld_eth_server=$GITHUB_WORKSPACE/ipld-eth-server/ >> ./config.sh + echo db_write=$DB_WRITE >> ./config.sh + echo eth_forward_eth_calls=$ETH_FORWARD_ETH_CALLS >> ./config.sh + echo eth_proxy_on_error=$ETH_PROXY_ON_ERROR >> ./config.sh + echo eth_http_path=$ETH_HTTP_PATH >> ./config.sh + cat ./config.sh + - name: Build geth + run: | + cd $GITHUB_WORKSPACE/stack-orchestrator/helper-scripts + ./compile-geth.sh \ + -p "$GITHUB_WORKSPACE/config.sh" \ + -e docker + - name: Run docker compose + run: | + docker-compose \ + -f "$GITHUB_WORKSPACE/stack-orchestrator/docker/latest/docker-compose-db.yml" \ + -f "$GITHUB_WORKSPACE/stack-orchestrator/docker/local/docker-compose-go-ethereum.yml" \ + -f "$GITHUB_WORKSPACE/stack-orchestrator/docker/local/docker-compose-ipld-eth-server.yml" \ + --env-file "$GITHUB_WORKSPACE/config.sh" \ + up -d --build - name: Test run: | + cd $GITHUB_WORKSPACE/ipld-eth-server while [ "$(curl -s -o /dev/null -w ''%{http_code}'' localhost:8081)" != "200" ]; do echo "waiting for ipld-eth-server..." && sleep 5; done && \ while [ "$(curl -s -o /dev/null -w ''%{http_code}'' localhost:8545)" != "200" ]; do echo "waiting for geth-statediff..." && sleep 5; done && \ make integrationtest @@ -89,11 +127,15 @@ jobs: integrationtest_forwardethcalls: name: Run integration tests for direct proxy fall-through of eth_calls env: + STACK_ORCHESTRATOR_REF: fcbc74451c5494664fe21f765e89c9c6565c07cb + GO_ETHEREUM_REF: 498101102c891c4f8c3cab5649158c642ee1fd6b GOPATH: /tmp/go DB_WRITE: false ETH_FORWARD_ETH_CALLS: true ETH_PROXY_ON_ERROR: false - ETH_HTTP_PATH: "dapptools:8545" + ETH_HTTP_PATH: "go-ethereum:8545" + WATCHED_ADDRESS_GAP_FILLER_ENABLED: false + WATCHED_ADDRESS_GAP_FILLER_INTERVAL: 2 strategy: matrix: go-version: [1.16.x] @@ -107,10 +149,113 @@ jobs: with: go-version: ${{ matrix.go-version }} - uses: actions/checkout@v2 - - name: Run database - run: docker-compose -f docker-compose.test.yml -f docker-compose.yml up -d ipld-eth-db dapptools contract eth-server + with: + path: "./ipld-eth-server" + - uses: actions/checkout@v2 + with: + ref: ${{ env.STACK_ORCHESTRATOR_REF }} + path: "./stack-orchestrator/" + repository: vulcanize/stack-orchestrator + - uses: actions/checkout@v2 + with: + ref: ${{ env.GO_ETHEREUM_REF }} + repository: vulcanize/go-ethereum + path: "./go-ethereum/" + - name: Create config file + run: | + echo vulcanize_go_ethereum=$GITHUB_WORKSPACE/go-ethereum/ > ./config.sh + echo vulcanize_ipld_eth_server=$GITHUB_WORKSPACE/ipld-eth-server/ >> ./config.sh + echo db_write=$DB_WRITE >> ./config.sh + echo eth_forward_eth_calls=$ETH_FORWARD_ETH_CALLS >> ./config.sh + echo eth_proxy_on_error=$ETH_PROXY_ON_ERROR >> ./config.sh + echo eth_http_path=$ETH_HTTP_PATH >> ./config.sh + cat ./config.sh + - name: Build geth + run: | + cd $GITHUB_WORKSPACE/stack-orchestrator/helper-scripts + ./compile-geth.sh \ + -p "$GITHUB_WORKSPACE/config.sh" \ + -e docker + - name: Run docker compose + run: | + docker-compose \ + -f "$GITHUB_WORKSPACE/stack-orchestrator/docker/latest/docker-compose-db.yml" \ + -f "$GITHUB_WORKSPACE/stack-orchestrator/docker/local/docker-compose-go-ethereum.yml" \ + -f "$GITHUB_WORKSPACE/stack-orchestrator/docker/local/docker-compose-ipld-eth-server.yml" \ + --env-file "$GITHUB_WORKSPACE/config.sh" \ + up -d --build - name: Test run: | + cd $GITHUB_WORKSPACE/ipld-eth-server + while [ "$(curl -s -o /dev/null -w ''%{http_code}'' localhost:8081)" != "200" ]; do echo "waiting for ipld-eth-server..." && sleep 5; done && \ + while [ "$(curl -s -o /dev/null -w ''%{http_code}'' localhost:8545)" != "200" ]; do echo "waiting for geth-statediff..." && sleep 5; done && \ + make integrationtest + + integrationtest_watchedaddress_gapfillingservice: + name: Run integration tests for watched addresses with gap filling service enabled + env: + STACK_ORCHESTRATOR_REF: fcbc74451c5494664fe21f765e89c9c6565c07cb + GO_ETHEREUM_REF: 498101102c891c4f8c3cab5649158c642ee1fd6b + GOPATH: /tmp/go + DB_WRITE: true + ETH_FORWARD_ETH_CALLS: false + ETH_PROXY_ON_ERROR: false + ETH_HTTP_PATH: "go-ethereum:8545" + WATCHED_ADDRESS_GAP_FILLER_ENABLED: true + WATCHED_ADDRESS_GAP_FILLER_INTERVAL: 2 + strategy: + matrix: + go-version: [1.16.x] + os: [ubuntu-latest] + runs-on: ${{ matrix.os }} + steps: + - name: Create GOPATH + run: mkdir -p /tmp/go + - name: Install Go + uses: actions/setup-go@v2 + with: + go-version: ${{ matrix.go-version }} + - uses: actions/checkout@v2 + with: + path: "./ipld-eth-server" + - uses: actions/checkout@v2 + with: + ref: ${{ env.STACK_ORCHESTRATOR_REF }} + path: "./stack-orchestrator/" + repository: vulcanize/stack-orchestrator + - uses: actions/checkout@v2 + with: + ref: ${{ env.GO_ETHEREUM_REF }} + repository: vulcanize/go-ethereum + path: "./go-ethereum/" + - name: Create config file + run: | + echo vulcanize_go_ethereum=$GITHUB_WORKSPACE/go-ethereum/ > ./config.sh + echo vulcanize_ipld_eth_server=$GITHUB_WORKSPACE/ipld-eth-server/ >> ./config.sh + echo db_write=$DB_WRITE >> ./config.sh + echo eth_forward_eth_calls=$ETH_FORWARD_ETH_CALLS >> ./config.sh + echo eth_proxy_on_error=$ETH_PROXY_ON_ERROR >> ./config.sh + echo eth_http_path=$ETH_HTTP_PATH >> ./config.sh + echo watched_addres_gap_filler_enabled=$WATCHED_ADDRESS_GAP_FILLER_ENABLED >> ./config.sh + echo watched_addres_gap_filler_interval=$WATCHED_ADDRESS_GAP_FILLER_INTERVAL >> ./config.sh + cat ./config.sh + - name: Build geth + run: | + cd $GITHUB_WORKSPACE/stack-orchestrator/helper-scripts + ./compile-geth.sh \ + -p "$GITHUB_WORKSPACE/config.sh" \ + -e docker + - name: Run docker compose + run: | + docker-compose \ + -f "$GITHUB_WORKSPACE/stack-orchestrator/docker/latest/docker-compose-db.yml" \ + -f "$GITHUB_WORKSPACE/stack-orchestrator/docker/local/docker-compose-go-ethereum.yml" \ + -f "$GITHUB_WORKSPACE/stack-orchestrator/docker/local/docker-compose-ipld-eth-server.yml" \ + --env-file "$GITHUB_WORKSPACE/config.sh" \ + up -d --build + - name: Test + run: | + cd $GITHUB_WORKSPACE/ipld-eth-server while [ "$(curl -s -o /dev/null -w ''%{http_code}'' localhost:8081)" != "200" ]; do echo "waiting for ipld-eth-server..." && sleep 5; done && \ while [ "$(curl -s -o /dev/null -w ''%{http_code}'' localhost:8545)" != "200" ]; do echo "waiting for geth-statediff..." && sleep 5; done && \ make integrationtest diff --git a/Makefile b/Makefile index 6cecdaa5..c128ff6a 100644 --- a/Makefile +++ b/Makefile @@ -71,13 +71,6 @@ test_local: | $(GINKGO) $(GOOSE) go fmt ./... ./scripts/run_unit_test.sh -.PHONY: integrationtest_local -integrationtest_local: | $(GINKGO) $(GOOSE) - go vet ./... - go fmt ./... - ./scripts/run_integration_test.sh - ./scripts/run_integration_test_forward_eth_calls.sh - build: go fmt ./... GO111MODULE=on go build diff --git a/README.md b/README.md index 1ecf32a4..5f282536 100644 --- a/README.md +++ b/README.md @@ -33,9 +33,9 @@ External dependency ## Install Start by downloading ipld-eth-server and moving into the repo: -`GO111MODULE=off go get -d github.com/vulcanize/ipld-eth-server` +`GO111MODULE=off go get -d github.com/vulcanize/ipld-eth-server/v3` -`cd $GOPATH/src/github.com/vulcanize/ipld-eth-server` +`cd $GOPATH/src/github.com/vulcanize/ipld-eth-server/v3@v3.x.x` Then, build the binary: @@ -148,8 +148,8 @@ TODO: Add the rest of the standard endpoints and unique endpoints (e.g. getSlice ### Testing -`make test` will run the unit tests -`make test` setups a clean `vulcanize_testing` db + +Follow steps in [test/README.md](./test/README.md) ## Monitoring diff --git a/cmd/root.go b/cmd/root.go index f5d6401c..4683f170 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -27,7 +27,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" - "github.com/vulcanize/ipld-eth-server/pkg/prom" + "github.com/vulcanize/ipld-eth-server/v3/pkg/prom" ) var ( diff --git a/cmd/serve.go b/cmd/serve.go index 11330ad6..4ba7f17c 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -32,11 +32,12 @@ import ( "github.com/spf13/viper" "github.com/vulcanize/gap-filler/pkg/mux" - "github.com/vulcanize/ipld-eth-server/pkg/eth" - "github.com/vulcanize/ipld-eth-server/pkg/graphql" - srpc "github.com/vulcanize/ipld-eth-server/pkg/rpc" - s "github.com/vulcanize/ipld-eth-server/pkg/serve" - v "github.com/vulcanize/ipld-eth-server/version" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth" + fill "github.com/vulcanize/ipld-eth-server/v3/pkg/fill" + "github.com/vulcanize/ipld-eth-server/v3/pkg/graphql" + srpc "github.com/vulcanize/ipld-eth-server/v3/pkg/rpc" + s "github.com/vulcanize/ipld-eth-server/v3/pkg/serve" + v "github.com/vulcanize/ipld-eth-server/v3/version" ) var ErrNoRpcEndpoints = errors.New("no rpc endpoints is available") @@ -100,12 +101,25 @@ func serve() { logWithCommand.Info("state validator disabled") } + var watchedAddressFillService *fill.Service + if serverConfig.WatchedAddressGapFillerEnabled { + watchedAddressFillService = fill.New(serverConfig) + wg.Add(1) + go watchedAddressFillService.Start(wg) + logWithCommand.Info("watched address gap filler enabled") + } else { + logWithCommand.Info("watched address gap filler disabled") + } + shutdown := make(chan os.Signal, 1) signal.Notify(shutdown, os.Interrupt) <-shutdown if graphQL != nil { graphQL.Stop() } + if watchedAddressFillService != nil { + watchedAddressFillService.Stop() + } server.Stop() wg.Wait() } @@ -133,7 +147,7 @@ func startServers(server s.Server, settings *s.Config) error { if settings.HTTPEnabled { logWithCommand.Info("starting up HTTP server") - _, err := srpc.StartHTTPEndpoint(settings.HTTPEndpoint, server.APIs(), []string{"eth", "net"}, nil, []string{"*"}, rpc.HTTPTimeouts{}) + _, err := srpc.StartHTTPEndpoint(settings.HTTPEndpoint, server.APIs(), []string{"vdb", "eth", "net"}, nil, []string{"*"}, rpc.HTTPTimeouts{}) if err != nil { return err } @@ -360,6 +374,10 @@ func init() { serveCmd.PersistentFlags().Bool("validator-enabled", false, "turn on the state validator") serveCmd.PersistentFlags().Uint("validator-every-nth-block", 1500, "only validate every Nth block") + // watched address gap filler flags + serveCmd.PersistentFlags().Bool("watched-address-gap-filler-enabled", false, "turn on the watched address gap filler") + serveCmd.PersistentFlags().Int("watched-address-gap-filler-interval", 60, "watched address gap fill interval in secs") + // and their bindings // eth graphql server viper.BindPFlag("eth.server.graphql", serveCmd.PersistentFlags().Lookup("eth-server-graphql")) @@ -408,4 +426,8 @@ func init() { // state validator flags viper.BindPFlag("validator.enabled", serveCmd.PersistentFlags().Lookup("validator-enabled")) viper.BindPFlag("validator.everyNthBlock", serveCmd.PersistentFlags().Lookup("validator-every-nth-block")) + + // watched address gap filler flags + viper.BindPFlag("watch.fill.enabled", serveCmd.PersistentFlags().Lookup("watched-address-gap-filler-enabled")) + viper.BindPFlag("watch.fill.interval", serveCmd.PersistentFlags().Lookup("watched-address-gap-filler-interval")) } diff --git a/cmd/subscribe.go b/cmd/subscribe.go index c8d9f7a1..cd3cc2cc 100644 --- a/cmd/subscribe.go +++ b/cmd/subscribe.go @@ -27,9 +27,9 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" - "github.com/vulcanize/ipld-eth-server/pkg/client" - "github.com/vulcanize/ipld-eth-server/pkg/eth" - w "github.com/vulcanize/ipld-eth-server/pkg/serve" + "github.com/vulcanize/ipld-eth-server/v3/pkg/client" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth" + w "github.com/vulcanize/ipld-eth-server/v3/pkg/serve" ) // subscribeCmd represents the subscribe command diff --git a/cmd/validate.go b/cmd/validate.go index 4b61eeb7..3c95edbf 100644 --- a/cmd/validate.go +++ b/cmd/validate.go @@ -22,10 +22,10 @@ import ( log "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/spf13/viper" - validator "github.com/vulcanize/eth-ipfs-state-validator/pkg" - ipfsethdb "github.com/vulcanize/ipfs-ethdb/postgres" + validator "github.com/vulcanize/eth-ipfs-state-validator/v3/pkg" + ipfsethdb "github.com/vulcanize/ipfs-ethdb/v3/postgres" - s "github.com/vulcanize/ipld-eth-server/pkg/serve" + s "github.com/vulcanize/ipld-eth-server/v3/pkg/serve" ) const GroupName = "statedb-validate" diff --git a/cmd/version.go b/cmd/version.go index 5c01ae83..f2939e44 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -19,7 +19,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/spf13/cobra" - v "github.com/vulcanize/ipld-eth-server/version" + v "github.com/vulcanize/ipld-eth-server/v3/version" ) // versionCmd represents the version command diff --git a/docker-compose.test.yml b/docker-compose.test.yml index 6c1a5448..ecdd3e40 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -2,13 +2,11 @@ version: '3.2' services: contract: - depends_on: - - dapptools build: context: ./test/contract args: - ETH_ADDR: "http://dapptools:8545" + ETH_ADDR: "http://go-ethereum:8545" environment: - ETH_ADDR: "http://dapptools:8545" + ETH_ADDR: "http://go-ethereum:8545" ports: - "127.0.0.1:3000:3000" diff --git a/docker-compose.yml b/docker-compose.yml index cef19e6b..132a8d2e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,27 +1,9 @@ version: '3.2' services: - dapptools: - restart: unless-stopped - depends_on: - - ipld-eth-db - image: vulcanize/dapptools:v0.30.0-v1.10.16-statediff-3.0.2a - environment: - DB_USER: vdbm - DB_NAME: vulcanize_testing - DB_HOST: ipld-eth-db - DB_PORT: 5432 - DB_PASSWORD: password - DB_WRITE: $DB_WRITE - DB_TYPE: postgres - DB_DRIVER: sqlx - ports: - - "127.0.0.1:8545:8545" - - "127.0.0.1:8546:8546" - ipld-eth-db: restart: always - image: vulcanize/ipld-eth-db:v3.0.7 + image: vulcanize/ipld-eth-db:v3.2.0 environment: POSTGRES_USER: "vdbm" POSTGRES_DB: "vulcanize_testing" @@ -56,6 +38,8 @@ services: ETH_FORWARD_ETH_CALLS: $ETH_FORWARD_ETH_CALLS ETH_PROXY_ON_ERROR: $ETH_PROXY_ON_ERROR ETH_HTTP_PATH: $ETH_HTTP_PATH + WATCHED_ADDRESS_GAP_FILLER_ENABLED: $WATCHED_ADDRESS_GAP_FILLER_ENABLED + WATCHED_ADDRESS_GAP_FILLER_INTERVAL: $WATCHED_ADDRESS_GAP_FILLER_INTERVAL volumes: - type: bind source: ./chain.json diff --git a/documentation/apis.md b/documentation/apis.md index 09ccdd81..13eced40 100644 --- a/documentation/apis.md +++ b/documentation/apis.md @@ -12,7 +12,7 @@ We can expose a number of different APIs for remote access to ipld-eth-server da ipld-eth-server stores all processed data in Postgres using PG-IPFS, this includes all of the IPLD objects. [Postgraphile](https://www.graphile.org/postgraphile/) can be used to expose GraphQL endpoints for the Postgres tables. -e.g. +e.g. `postgraphile --plugins @graphile/pg-pubsub --subscriptions --simple-subscriptions -c postgres://localhost:5432/vulcanize_public?sslmode=disable -s public,btc,eth -a -j` @@ -33,16 +33,16 @@ by ipld-eth-server to filter and return a requested subset of chain data to the An example of how to subscribe to a real-time Ethereum data feed from ipld-eth-server using the `Stream` RPC method is provided below ```go - package main + package main import ( "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rpc" "github.com/spf13/viper" - - "github.com/vulcanize/ipld-eth-server/pkg/client" - "github.com/vulcanize/ipld-eth-server/pkg/eth" - "github.com/vulcanize/ipld-eth-server/pkg/watch" + + "github.com/vulcanize/ipld-eth-server/v3/pkg/client" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth" + "github.com/vulcanize/ipld-eth-server/v3/pkg/watch" ) config, _ := eth.NewEthSubscriptionConfig() @@ -153,16 +153,16 @@ the addresses in the `addresses` fields are pre-hashed ETH addresses. An example of how to subscribe to a real-time Bitcoin data feed from ipld-eth-server using the `Stream` RPC method is provided below ```go - package main + package main import ( "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rpc" "github.com/spf13/viper" - - "github.com/vulcanize/ipld-eth-server/pkg/btc" - "github.com/vulcanize/ipld-eth-server/pkg/client" - "github.com/vulcanize/ipld-eth-server/pkg/watch" + + "github.com/vulcanize/ipld-eth-server/v3/pkg/btc" + "github.com/vulcanize/ipld-eth-server/v3/pkg/client" + "github.com/vulcanize/ipld-eth-server/v3/pkg/watch" ) config, _ := btc.NewBtcSubscriptionConfig() diff --git a/environments/example.toml b/environments/example.toml index 102a592c..8713c71f 100644 --- a/environments/example.toml +++ b/environments/example.toml @@ -16,6 +16,7 @@ graphqlEndpoint = "127.0.0.1:8083" # $SERVER_GRAPHQL_ENDPOINT [ethereum] + chainConfig = "./chain.json" # ETH_CHAIN_CONFIG chainID = "1" # $ETH_CHAIN_ID defaultSender = "" # $ETH_DEFAULT_SENDER_ADDR rpcGasCap = "1000000000000" # $ETH_RPC_GAS_CAP @@ -27,3 +28,8 @@ clientName = "Geth" # $ETH_CLIENT_NAME genesisBlock = "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3" # $ETH_GENESIS_BLOCK networkID = "1" # $ETH_NETWORK_ID + +[watch] + [watch.fill] + enabled = false + interval = 30 diff --git a/go.mod b/go.mod index 4f17ee96..aa292c91 100644 --- a/go.mod +++ b/go.mod @@ -1,38 +1,31 @@ -module github.com/vulcanize/ipld-eth-server +module github.com/vulcanize/ipld-eth-server/v3 go 1.15 require ( - github.com/ethereum/go-ethereum v1.10.16 - github.com/fsnotify/fsnotify v1.5.1 // indirect - github.com/go-sql-driver/mysql v1.6.0 // indirect + github.com/ethereum/go-ethereum v1.10.17 github.com/graph-gophers/graphql-go v1.3.0 github.com/ipfs/go-block-format v0.0.3 github.com/ipfs/go-cid v0.0.7 github.com/ipfs/go-ipfs-blockstore v1.0.1 github.com/ipfs/go-ipfs-ds-help v1.0.0 github.com/ipfs/go-ipld-format v0.2.0 - github.com/jmoiron/sqlx v1.2.0 + github.com/jmoiron/sqlx v1.3.5 github.com/joho/godotenv v1.4.0 - github.com/lib/pq v1.10.4 + github.com/lib/pq v1.10.5 github.com/machinebox/graphql v0.2.2 - github.com/mailgun/groupcache/v2 v2.2.1 + github.com/mailgun/groupcache/v2 v2.3.0 github.com/matryer/is v1.4.0 // indirect - github.com/multiformats/go-multihash v0.0.15 + github.com/multiformats/go-multihash v0.1.0 github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.13.0 + github.com/onsi/gomega v1.19.0 github.com/prometheus/client_golang v1.11.0 - github.com/shirou/gopsutil v3.21.5+incompatible // indirect - github.com/sirupsen/logrus v1.7.0 - github.com/spf13/cobra v1.1.1 - github.com/spf13/viper v1.7.0 - github.com/tklauser/go-sysconf v0.3.6 // indirect - github.com/vulcanize/eth-ipfs-state-validator v0.1.0 + github.com/sirupsen/logrus v1.8.1 + github.com/spf13/cobra v1.4.0 + github.com/spf13/viper v1.11.0 + github.com/vulcanize/eth-ipfs-state-validator/v3 v3.0.0 github.com/vulcanize/gap-filler v0.3.1 - github.com/vulcanize/ipfs-ethdb v0.0.6 - golang.org/x/crypto v0.0.0-20211202192323-5770296d904e // indirect - golang.org/x/sys v0.0.0-20211205182925-97ca703d548d // indirect - golang.org/x/tools v0.1.8 // indirect + github.com/vulcanize/ipfs-ethdb/v3 v3.0.1 ) -replace github.com/ethereum/go-ethereum v1.10.16 => github.com/vulcanize/go-ethereum v1.10.16-statediff-3.0.2 +replace github.com/ethereum/go-ethereum v1.10.17 => github.com/vulcanize/go-ethereum v1.10.17-statediff-3.2.1 diff --git a/go.sum b/go.sum index b72e93a6..2118e8df 100644 --- a/go.sum +++ b/go.sum @@ -8,6 +8,7 @@ cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSR cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -19,6 +20,21 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -26,9 +42,13 @@ cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUM cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -38,6 +58,7 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= contrib.go.opencensus.io/exporter/prometheus v0.3.0/go.mod h1:rpCPVQKhiyH8oomWgm34ZmgIdZa8OVYO5WAIygPbBBE= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= @@ -52,6 +73,9 @@ github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIo github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= @@ -63,10 +87,10 @@ github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxB github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= @@ -106,7 +130,9 @@ github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1: github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -143,8 +169,15 @@ github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcug github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= -github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= +github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= +github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= +github.com/btcsuite/btcd/btcec/v2 v2.1.2/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= +github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= @@ -178,13 +211,20 @@ github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuP github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9/go.mod h1:1MxXX1Ux4x6mqPmjkUgTP1CdXIBXKX7T+Jk9Gxrmx+U= github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/cockroach-go/v2 v2.0.3 h1:ZA346ACHIZctef6trOTwBAEvPVm1k0uLm/bb2Atc+S8= @@ -212,6 +252,7 @@ github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfc github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 h1:HVTnpeuvF6Owjd5mniCL8DEXo7uYXdQEmOP4FJbV5tg= github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= @@ -230,6 +271,10 @@ github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6Uh github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= +github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= @@ -251,6 +296,8 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf h1:sh8rkQZavChcmakYiSlqu2425CHyFXLZZnvm7PDpU8M= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/dop251/goja v0.0.0-20200106141417-aaec0e7bde29/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= @@ -272,17 +319,20 @@ github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4s github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/ethereum/go-ethereum v1.9.11/go.mod h1:7oC0Ni6dosMv5pxMigm6s0hN8g4haJMBnqmmo0D9YfQ= -github.com/ethereum/go-ethereum v1.10.14/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW8ncyZLv37o+KNyy0HrrHgfnOaGQC2qvN+A= github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg= github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= @@ -358,6 +408,8 @@ github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= +github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= @@ -378,6 +430,7 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -397,6 +450,7 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -415,10 +469,13 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -429,6 +486,8 @@ github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -436,11 +495,19 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -448,6 +515,11 @@ github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk= @@ -463,7 +535,6 @@ github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= -github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/graph-gophers/graphql-go v1.3.0 h1:Eb9x/q6MFpCLz7jBCiP/WTxjSDrYLR1QY41SORZyNJ0= github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/graphql-go/graphql v0.7.9 h1:5Va/Rt4l5g3YjwDnid3vFfn43faaQBq7rMcIZ0VnV34= @@ -483,20 +554,29 @@ github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e h1:3YKHER4n github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e/go.mod h1:I8h3MITA53gN9OnWGCgaMa0JWVRdXthWw4M3CPM54OY= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -513,8 +593,12 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= @@ -523,10 +607,12 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v0.0.0-20161224104101-679507af18f3/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= -github.com/huin/goupnp v1.0.2 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= +github.com/huin/goupnp v1.0.3-0.20220313090229-ca81a64b4204 h1:+EYBkW+dbi3F/atB+LSQZSWh7+HNrV3A/N0y6DSoy9k= +github.com/huin/goupnp v1.0.3-0.20220313090229-ca81a64b4204/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= @@ -846,8 +932,9 @@ github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/ github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= +github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= @@ -859,6 +946,7 @@ github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= @@ -873,7 +961,6 @@ github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0= github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/karalabe/usb v0.0.0-20211005121534-4c5740d64559/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= @@ -898,6 +985,7 @@ github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfo github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= github.com/koron/go-ssdp v0.0.2 h1:fL3wAoyT6hXHQlORyXUW4Q23kkQpJRgEAYcZB5BR71o= github.com/koron/go-ssdp v0.0.2/go.mod h1:XoLfkAiA2KeZsYh4DbHxD7h3nR2AZNqVQOa+LJuqPYs= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -919,10 +1007,9 @@ github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.4.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.5.2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk= -github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.5 h1:J+gdV2cUmX7ZqL2B0lFcW0m+egaHC2V3lpO8nWxyYiQ= +github.com/lib/pq v1.10.5/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= github.com/libp2p/go-addr-util v0.1.0 h1:acKsntI33w2bTU7tC9a0SaPimJGfSI0bFKC18ChxeVI= @@ -1256,10 +1343,11 @@ github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0Q github.com/machinebox/graphql v0.2.2 h1:dWKpJligYKhYKO5A2gvNhkJdQMNZeChZYyBbrZkBZfo= github.com/machinebox/graphql v0.2.2/go.mod h1:F+kbVMHuwrQ5tYgU9JXlnskM8nOaFxCAEolaQybkjWA= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailgun/groupcache/v2 v2.2.1 h1:OalhvLqdhiHd76CU8gn+w6UqeEa1m60ChrVwwKkmqh4= -github.com/mailgun/groupcache/v2 v2.2.1/go.mod h1:fgFJNRQar4yVloM0SzqWhOuTF83HCO5DDXVnZQVVJ58= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailgun/groupcache/v2 v2.3.0 h1:/Usq3VewXa8t+afFaUAY7g8N9cRNqBT5nDhECYwLcd8= +github.com/mailgun/groupcache/v2 v2.3.0/go.mod h1:tH8aMaTRIjFMJsmJ9p7Y5HGBj9hV/J9rKQ+/3dIXzNU= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -1286,8 +1374,10 @@ github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -1297,10 +1387,12 @@ github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= @@ -1308,6 +1400,7 @@ github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/Qd github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v2.0.1+incompatible h1:xQ15muvnzGBHpIpdrNi1DA5x0+TcBZzsIDwmw9uTHzw= github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= @@ -1317,6 +1410,7 @@ github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyex github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= @@ -1338,6 +1432,7 @@ github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -1346,14 +1441,17 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= @@ -1408,8 +1506,9 @@ github.com/multiformats/go-multihash v0.0.9/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= -github.com/multiformats/go-multihash v0.0.15 h1:hWOPdrNqDjwHDx82vsYGSDZNyktOJJ2dzZJzFkOV1jM= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= +github.com/multiformats/go-multihash v0.1.0 h1:CgAgwqk3//SVEw3T+6DqI4mWMyRuDwZtOWcJT0q9+EA= +github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= @@ -1457,14 +1556,18 @@ github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvw github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= @@ -1480,15 +1583,21 @@ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= +github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.0-beta.8 h1:dy81yyLYJDwMTifq24Oi/IslOslRrDSb3jwDggjz3Z0= +github.com/pelletier/go-toml/v2 v2.0.0-beta.8/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/pganalyze/pg_query_go/v2 v2.1.0 h1:donwPZ4G/X+kMs7j5eYtKjdziqyOLVp3pkUrzb9lDl8= +github.com/pganalyze/pg_query_go/v2 v2.1.0/go.mod h1:XAxmVqz1tEGqizcQ3YSdN90vCOHBWjJi8URL1er5+cA= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= @@ -1497,6 +1606,7 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -1506,6 +1616,7 @@ github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXx github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e h1:ZOcivgkkFRnjfoTcGsDq3UQYiBmekwLA+qg0OjyB/ls= github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= @@ -1513,6 +1624,7 @@ github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= @@ -1576,8 +1688,10 @@ github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OK github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/crypt v0.5.0/go.mod h1:l+nzl7KWh51rpzp2h7t4MZWyiEWdhNpOAnclKvg+mdA= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= @@ -1586,9 +1700,8 @@ github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KR github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/gopsutil v3.21.5+incompatible h1:OloQyEerMi7JUrXiNzy8wQ5XN+baemxSl12QgIzt0jc= -github.com/shirou/gopsutil v3.21.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v0.0.0-20200419222939-1884f454f8ea/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -1621,8 +1734,9 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= @@ -1643,25 +1757,28 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO github.com/spaolacci/murmur3 v1.0.1-0.20190317074736-539464a789e9/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= +github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q= +github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.11.0 h1:7OX/1FS6n7jHD1zGrZTM7WtY13ZELRyosK4k93oPr44= +github.com/spf13/viper v1.11.0/go.mod h1:djo0X/bA5+tYVoCn+C7cAYJGcVn/qYLFTG8gdUsX7Zk= github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 h1:Gb2Tyox57NRNuZ2d3rmvB3pcmbu7O1RS3m8WRx7ilrg= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= @@ -1680,8 +1797,9 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= @@ -1690,19 +1808,20 @@ github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70 github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= +github.com/thoas/go-funk v0.9.2 h1:oKlNYv0AY5nyf9g+/GhMgS/UO2ces0QRdPKwkhY3VCk= +github.com/thoas/go-funk v0.9.2/go.mod h1:+IWnUfUmFO1+WVYQWQtIJHeRRdaIyyYglZN7xzUPe4Q= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= +github.com/tklauser/go-sysconf v0.3.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp3vU4= github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= -github.com/tklauser/go-sysconf v0.3.6 h1:oc1sJWvKkmvIxhDHeKWvZS4f6AW+YcoguSfRF2/Hmo4= -github.com/tklauser/go-sysconf v0.3.6/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA= github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c h1:u6SKchux2yDvFQnDHS3lPnIRmfVJ5Sxy3ao2SIdysLQ= github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -1715,14 +1834,14 @@ github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPU github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= -github.com/vulcanize/eth-ipfs-state-validator v0.1.0 h1:ZB54GOUrxQeSYvOmqk8jMgtGzG+Oyh7YeSCio9vCEPE= -github.com/vulcanize/eth-ipfs-state-validator v0.1.0/go.mod h1:QtmfhqDjN29UHHk2Fb+ouzO4j/lbhM7GuiEmxHIKdzk= +github.com/vulcanize/eth-ipfs-state-validator/v3 v3.0.0 h1:hQcbewsJX5Xpd3xdE9n3JpGyuzUqMhwhpQCpbN+9Uiw= +github.com/vulcanize/eth-ipfs-state-validator/v3 v3.0.0/go.mod h1:CuuygZPciwwLV5vNY1LcIi0PZxXZbOmicw1/IkrPpPI= github.com/vulcanize/gap-filler v0.3.1 h1:N5d+jCJo/VTWFvBSbTD7biRhK/OqDZzi1tgA85SIBKs= github.com/vulcanize/gap-filler v0.3.1/go.mod h1:qowG1cgshVpBqMokiWro/1xhh0uypw7oAu8FQ42JMy4= -github.com/vulcanize/go-ethereum v1.10.16-statediff-3.0.2 h1:H3SLHZdvTyKYbFc1CO2b8A9XF3BcakcXtvThKPbgT8k= -github.com/vulcanize/go-ethereum v1.10.16-statediff-3.0.2/go.mod h1:NI+tCVeIQBPrMfJUZvTLjhCieb7CZcmNPbJVlXbncxU= -github.com/vulcanize/ipfs-ethdb v0.0.6 h1:Jl+YHtee5Zd8jD9wix2aJLYXwX/WpPt37QBzoz8pVwM= -github.com/vulcanize/ipfs-ethdb v0.0.6/go.mod h1:DvZpevG89N5ST26WeaErQ+31Q1lQwGBEhn/s9wgGo3g= +github.com/vulcanize/go-ethereum v1.10.17-statediff-3.2.1 h1:BUIaiqqsWM61KfzIowqrGJ8TM2SWwmral4iJ/nhTSe0= +github.com/vulcanize/go-ethereum v1.10.17-statediff-3.2.1/go.mod h1:mDwZX+QoWdqzQo6SDG3YVqCYACutcSG6uzpziMvTu28= +github.com/vulcanize/ipfs-ethdb/v3 v3.0.1 h1:gm+6SgxcNOCz6mgwvhsxORLXsr9yIFvbJDuoAK85ONs= +github.com/vulcanize/ipfs-ethdb/v3 v3.0.1/go.mod h1:SPBTTl5CqRexYfkI66pbzE5nQziYpoQ+7hH0XveA9IU= github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= github.com/warpfork/go-testmark v0.3.0 h1:Q81c4u7hT+BR5kNfNQhEF0VT2pmL7+Kk0wD+ORYl7iA= github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= @@ -1768,6 +1887,9 @@ github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxt go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd/api/v3 v3.5.2/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= +go.etcd.io/etcd/client/pkg/v3 v3.5.2/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.2/go.mod h1:2D7ZejHVMIfog1221iLSYlQRzrtECw3kz4I4VAQm3qI= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -1777,6 +1899,7 @@ go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/otel v0.20.0 h1:eaP0Fqu7SXHwvjiqDq83zImeehOHX8doTvU9AwXON8g= @@ -1817,6 +1940,7 @@ go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.0 h1:mZQZefskPPCMIBCSEH0v2/iUqqLrYtaeqwD6FUGUnFE= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= @@ -1847,6 +1971,7 @@ golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1861,13 +1986,16 @@ golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211202192323-5770296d904e h1:MUP6MR3rJ7Gk9LEia0LP2ytiH6MuCfs7qYz+47jGdD8= -golang.org/x/crypto v0.0.0-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1881,6 +2009,7 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1895,8 +2024,9 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -1905,10 +2035,12 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57 h1:LQmS1nU0twXLA96Kt7U9qtHJEbBk3z6Q0V4UXjZkpr4= +golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1955,21 +2087,32 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5 h1:bRb386wvrE+oBNdF1d/Xh9mQrfQ4ecYhW5qJ5GvTGT4= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1977,7 +2120,21 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2026,9 +2183,11 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2041,6 +2200,7 @@ golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2059,34 +2219,58 @@ golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211205182925-97ca703d548d h1:FjkYO/PPp4Wi0EAUOVLxePm7qVW4r4ctbWpURyuOD0E= -golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2127,6 +2311,7 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2164,21 +2349,31 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.8 h1:P1HhGGuLW4aAclzjtmJdf0mJOjVUZUzOTqkAkWL+l6w= -golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023 h1:0c3L82FDQ5rt1bjTBlchS8t6RQ6299/+5bWMnRLh+uI= +golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= @@ -2205,6 +2400,26 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2251,6 +2466,48 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= @@ -2274,9 +2531,21 @@ google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -2289,8 +2558,9 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2303,8 +2573,9 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= +gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190213234257-ec84240a7772/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= @@ -2343,6 +2614,8 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= +lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/main.go b/main.go index 6bc9b782..724af69e 100644 --- a/main.go +++ b/main.go @@ -18,7 +18,7 @@ package main import ( "github.com/sirupsen/logrus" - "github.com/vulcanize/ipld-eth-server/cmd" + "github.com/vulcanize/ipld-eth-server/v3/cmd" ) func main() { diff --git a/pkg/client/client.go b/pkg/client/client.go index 729c1185..c470ff41 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -20,11 +20,10 @@ package client import ( "context" - "github.com/vulcanize/ipld-eth-server/pkg/eth" - "github.com/ethereum/go-ethereum/rpc" - "github.com/vulcanize/ipld-eth-server/pkg/serve" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth" + "github.com/vulcanize/ipld-eth-server/v3/pkg/serve" ) // Client is used to subscribe to the ipld-eth-server ipld data stream diff --git a/pkg/eth/api.go b/pkg/eth/api.go index 340d1ec2..34451e95 100644 --- a/pkg/eth/api.go +++ b/pkg/eth/api.go @@ -42,7 +42,7 @@ import ( "github.com/ethereum/go-ethereum/statediff" "github.com/sirupsen/logrus" - "github.com/vulcanize/ipld-eth-server/pkg/shared" + "github.com/vulcanize/ipld-eth-server/v3/pkg/shared" ) // APIName is the namespace for the watcher's eth api diff --git a/pkg/eth/api_test.go b/pkg/eth/api_test.go index 38c42161..b3ef9d9f 100644 --- a/pkg/eth/api_test.go +++ b/pkg/eth/api_test.go @@ -36,9 +36,10 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - "github.com/vulcanize/ipld-eth-server/pkg/eth" - "github.com/vulcanize/ipld-eth-server/pkg/eth/test_helpers" - ethServerShared "github.com/vulcanize/ipld-eth-server/pkg/shared" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth/test_helpers" + "github.com/vulcanize/ipld-eth-server/v3/pkg/shared" + ethServerShared "github.com/vulcanize/ipld-eth-server/v3/pkg/shared" ) var ( @@ -195,8 +196,8 @@ var _ = Describe("API", func() { tx interfaces.Batch ) - db = eth.SetupTestDB() - indexAndPublisher := eth.SetupTestStateDiffIndexer(ctx, chainConfig, test_helpers.Genesis.Hash()) + db = shared.SetupDB() + indexAndPublisher := shared.SetupTestStateDiffIndexer(ctx, chainConfig, test_helpers.Genesis.Hash()) backend, err := eth.NewEthBackend(db, ð.Config{ ChainConfig: chainConfig, @@ -241,7 +242,7 @@ var _ = Describe("API", func() { // setting chain config to for london block chainConfig.LondonBlock = big.NewInt(2) - indexAndPublisher = eth.SetupTestStateDiffIndexer(ctx, chainConfig, test_helpers.Genesis.Hash()) + indexAndPublisher = shared.SetupTestStateDiffIndexer(ctx, chainConfig, test_helpers.Genesis.Hash()) tx, err = indexAndPublisher.PushBlock(test_helpers.MockLondonBlock, test_helpers.MockLondonReceipts, test_helpers.MockLondonBlock.Difficulty()) Expect(err).ToNot(HaveOccurred()) @@ -251,7 +252,7 @@ var _ = Describe("API", func() { }) // Single test db tear down at end of all tests - defer It("test teardown", func() { eth.TearDownTestDB(db) }) + defer It("test teardown", func() { shared.TearDownDB(db) }) /* Headers and blocks diff --git a/pkg/eth/backend.go b/pkg/eth/backend.go index 424c600f..8b12ca44 100644 --- a/pkg/eth/backend.go +++ b/pkg/eth/backend.go @@ -43,12 +43,12 @@ import ( "github.com/ethereum/go-ethereum/trie" "github.com/jmoiron/sqlx" log "github.com/sirupsen/logrus" - validator "github.com/vulcanize/eth-ipfs-state-validator/pkg" - ipfsethdb "github.com/vulcanize/ipfs-ethdb/postgres" + validator "github.com/vulcanize/eth-ipfs-state-validator/v3/pkg" + ipfsethdb "github.com/vulcanize/ipfs-ethdb/v3/postgres" ethServerShared "github.com/ethereum/go-ethereum/statediff/indexer/shared" - "github.com/vulcanize/ipld-eth-server/pkg/shared" + "github.com/vulcanize/ipld-eth-server/v3/pkg/shared" ) var ( diff --git a/pkg/eth/cid_retriever.go b/pkg/eth/cid_retriever.go index b0875382..bcebcde7 100644 --- a/pkg/eth/cid_retriever.go +++ b/pkg/eth/cid_retriever.go @@ -27,7 +27,7 @@ import ( "github.com/lib/pq" log "github.com/sirupsen/logrus" - "github.com/vulcanize/ipld-eth-server/pkg/shared" + "github.com/vulcanize/ipld-eth-server/v3/pkg/shared" ) // Retriever interface for substituting mocks in tests diff --git a/pkg/eth/cid_retriever_test.go b/pkg/eth/cid_retriever_test.go index ff8d0698..abe56659 100644 --- a/pkg/eth/cid_retriever_test.go +++ b/pkg/eth/cid_retriever_test.go @@ -29,8 +29,9 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - "github.com/vulcanize/ipld-eth-server/pkg/eth" - "github.com/vulcanize/ipld-eth-server/pkg/eth/test_helpers" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth/test_helpers" + "github.com/vulcanize/ipld-eth-server/v3/pkg/shared" ) var ( @@ -215,13 +216,13 @@ var _ = Describe("Retriever", func() { retriever *eth.CIDRetriever ) BeforeEach(func() { - db = eth.SetupTestDB() - diffIndexer = eth.SetupTestStateDiffIndexer(ctx, params.TestChainConfig, test_helpers.Genesis.Hash()) + db = shared.SetupDB() + diffIndexer = shared.SetupTestStateDiffIndexer(ctx, params.TestChainConfig, test_helpers.Genesis.Hash()) retriever = eth.NewCIDRetriever(db) }) AfterEach(func() { - eth.TearDownTestDB(db) + shared.TearDownDB(db) }) Describe("Retrieve", func() { diff --git a/pkg/eth/eth_state_test.go b/pkg/eth/eth_state_test.go index 17d0434f..999ee3c9 100644 --- a/pkg/eth/eth_state_test.go +++ b/pkg/eth/eth_state_test.go @@ -37,9 +37,10 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - "github.com/vulcanize/ipld-eth-server/pkg/eth" - "github.com/vulcanize/ipld-eth-server/pkg/eth/test_helpers" - ethServerShared "github.com/vulcanize/ipld-eth-server/pkg/shared" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth/test_helpers" + "github.com/vulcanize/ipld-eth-server/v3/pkg/shared" + ethServerShared "github.com/vulcanize/ipld-eth-server/v3/pkg/shared" ) var ( @@ -74,8 +75,8 @@ var _ = Describe("eth state reading tests", func() { It("test init", func() { // db and type initializations var err error - db = eth.SetupTestDB() - transformer := eth.SetupTestStateDiffIndexer(ctx, chainConfig, test_helpers.Genesis.Hash()) + db = shared.SetupDB() + transformer := shared.SetupTestStateDiffIndexer(ctx, chainConfig, test_helpers.Genesis.Hash()) backend, err = eth.NewEthBackend(db, ð.Config{ ChainConfig: chainConfig, @@ -155,7 +156,7 @@ var _ = Describe("eth state reading tests", func() { } // Insert some non-canonical data into the database so that we test our ability to discern canonicity - indexAndPublisher := eth.SetupTestStateDiffIndexer(ctx, chainConfig, test_helpers.Genesis.Hash()) + indexAndPublisher := shared.SetupTestStateDiffIndexer(ctx, chainConfig, test_helpers.Genesis.Hash()) tx, err := indexAndPublisher.PushBlock(test_helpers.MockBlock, test_helpers.MockReceipts, test_helpers.MockBlock.Difficulty()) Expect(err).ToNot(HaveOccurred()) @@ -181,7 +182,7 @@ var _ = Describe("eth state reading tests", func() { Expect(err).ToNot(HaveOccurred()) }) defer It("test teardown", func() { - eth.TearDownTestDB(db) + shared.TearDownDB(db) chain.Stop() }) diff --git a/pkg/eth/filterer_test.go b/pkg/eth/filterer_test.go index 6894f99c..21cabc54 100644 --- a/pkg/eth/filterer_test.go +++ b/pkg/eth/filterer_test.go @@ -25,9 +25,9 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - "github.com/vulcanize/ipld-eth-server/pkg/eth" - "github.com/vulcanize/ipld-eth-server/pkg/eth/test_helpers" - "github.com/vulcanize/ipld-eth-server/pkg/shared" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth/test_helpers" + "github.com/vulcanize/ipld-eth-server/v3/pkg/shared" ) var ( diff --git a/pkg/eth/helpers.go b/pkg/eth/helpers.go index b4d4f679..f9a995fc 100644 --- a/pkg/eth/helpers.go +++ b/pkg/eth/helpers.go @@ -17,16 +17,7 @@ package eth import ( - "encoding/json" - "fmt" - "os" - - "github.com/ethereum/go-ethereum/cmd/utils" - log "github.com/sirupsen/logrus" - sdtypes "github.com/ethereum/go-ethereum/statediff/types" - - "github.com/ethereum/go-ethereum/params" ) func ResolveToNodeType(nodeType int) sdtypes.NodeType { @@ -43,41 +34,3 @@ func ResolveToNodeType(nodeType int) sdtypes.NodeType { return sdtypes.Unknown } } - -// LoadConfig loads chain config from json file -func LoadConfig(chainConfigPath string) (*params.ChainConfig, error) { - file, err := os.Open(chainConfigPath) - if err != nil { - utils.Fatalf("Failed to read chain config file: %v", err) - - return nil, err - } - defer file.Close() - - chainConfig := new(params.ChainConfig) - if err := json.NewDecoder(file).Decode(chainConfig); err != nil { - utils.Fatalf("invalid chain config file: %v", err) - - return nil, err - } - - log.Infof("Using chain config from %s file. Content %+v", chainConfigPath, chainConfig) - - return chainConfig, nil -} - -// ChainConfig returns the appropriate ethereum chain config for the provided chain id -func ChainConfig(chainID uint64) (*params.ChainConfig, error) { - switch chainID { - case 1: - return params.MainnetChainConfig, nil - case 3: - return params.RopstenChainConfig, nil - case 4: - return params.RinkebyChainConfig, nil - case 5: - return params.GoerliChainConfig, nil - default: - return nil, fmt.Errorf("chain config for chainid %d not available", chainID) - } -} diff --git a/pkg/eth/ipld_fetcher.go b/pkg/eth/ipld_fetcher.go index fbef10bd..8396d368 100644 --- a/pkg/eth/ipld_fetcher.go +++ b/pkg/eth/ipld_fetcher.go @@ -25,7 +25,7 @@ import ( "github.com/ethereum/go-ethereum/statediff/indexer/models" "github.com/jmoiron/sqlx" log "github.com/sirupsen/logrus" - "github.com/vulcanize/ipld-eth-server/pkg/shared" + "github.com/vulcanize/ipld-eth-server/v3/pkg/shared" ) // Fetcher interface for substituting mocks in tests diff --git a/pkg/eth/ipld_fetcher_test.go b/pkg/eth/ipld_fetcher_test.go index f5521188..5ac47009 100644 --- a/pkg/eth/ipld_fetcher_test.go +++ b/pkg/eth/ipld_fetcher_test.go @@ -23,8 +23,9 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - "github.com/vulcanize/ipld-eth-server/pkg/eth" - "github.com/vulcanize/ipld-eth-server/pkg/eth/test_helpers" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth/test_helpers" + "github.com/vulcanize/ipld-eth-server/v3/pkg/shared" ) var _ = Describe("IPLDFetcher", func() { @@ -39,8 +40,8 @@ var _ = Describe("IPLDFetcher", func() { err error tx interfaces.Batch ) - db = eth.SetupTestDB() - pubAndIndexer = eth.SetupTestStateDiffIndexer(ctx, params.TestChainConfig, test_helpers.Genesis.Hash()) + db = shared.SetupDB() + pubAndIndexer = shared.SetupTestStateDiffIndexer(ctx, params.TestChainConfig, test_helpers.Genesis.Hash()) tx, err = pubAndIndexer.PushBlock(test_helpers.MockBlock, test_helpers.MockReceipts, test_helpers.MockBlock.Difficulty()) for _, node := range test_helpers.MockStateNodes { @@ -54,7 +55,7 @@ var _ = Describe("IPLDFetcher", func() { }) AfterEach(func() { - eth.TearDownTestDB(db) + shared.TearDownDB(db) }) It("Fetches and returns IPLDs for the CIDs provided in the CIDWrapper", func() { diff --git a/pkg/eth/test_helpers.go b/pkg/eth/test_helpers.go index 621ea6fd..f59f4b43 100644 --- a/pkg/eth/test_helpers.go +++ b/pkg/eth/test_helpers.go @@ -17,67 +17,9 @@ package eth import ( - "context" - "os" - "strconv" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/statediff/indexer" - "github.com/ethereum/go-ethereum/statediff/indexer/database/sql/postgres" - "github.com/ethereum/go-ethereum/statediff/indexer/interfaces" "github.com/ethereum/go-ethereum/statediff/indexer/models" - "github.com/ethereum/go-ethereum/statediff/indexer/node" - "github.com/jmoiron/sqlx" - . "github.com/onsi/gomega" - "github.com/vulcanize/ipld-eth-server/pkg/shared" ) -func SetupTestDB() *sqlx.DB { - config := getTestDBConfig() - - db, err := shared.NewDB(config.DbConnectionString(), config) - Expect(err).NotTo(HaveOccurred()) - - return db -} - -// TearDownTestDB is used to tear down the watcher dbs after tests -func TearDownTestDB(db *sqlx.DB) { - tx, err := db.Beginx() - Expect(err).NotTo(HaveOccurred()) - _, err = tx.Exec(`DELETE FROM eth.transaction_cids`) - Expect(err).NotTo(HaveOccurred()) - _, err = tx.Exec(`DELETE FROM eth.receipt_cids`) - Expect(err).NotTo(HaveOccurred()) - _, err = tx.Exec(`DELETE FROM eth.state_cids`) - Expect(err).NotTo(HaveOccurred()) - _, err = tx.Exec(`DELETE FROM eth.storage_cids`) - Expect(err).NotTo(HaveOccurred()) - _, err = tx.Exec(`DELETE FROM blocks`) - Expect(err).NotTo(HaveOccurred()) - _, err = tx.Exec(`DELETE FROM eth.log_cids`) - Expect(err).NotTo(HaveOccurred()) - - err = tx.Commit() - Expect(err).NotTo(HaveOccurred()) -} - -func SetupTestStateDiffIndexer(ctx context.Context, chainConfig *params.ChainConfig, genHash common.Hash) interfaces.StateDiffIndexer { - testInfo := node.Info{ - GenesisBlock: genHash.String(), - NetworkID: "1", - ID: "1", - ClientName: "geth", - ChainID: params.TestChainConfig.ChainID.Uint64(), - } - - stateDiffIndexer, err := indexer.NewStateDiffIndexer(ctx, chainConfig, testInfo, getTestDBConfig()) - Expect(err).NotTo(HaveOccurred()) - - return stateDiffIndexer -} - // TxModelsContainsCID used to check if a list of TxModels contains a specific cid string func TxModelsContainsCID(txs []models.TxModel, cid string) bool { for _, tx := range txs { @@ -97,15 +39,3 @@ func ReceiptModelsContainsCID(rcts []models.ReceiptModel, cid string) bool { } return false } - -func getTestDBConfig() postgres.Config { - port, _ := strconv.Atoi(os.Getenv("DATABASE_PORT")) - return postgres.Config{ - Hostname: os.Getenv("DATABASE_HOSTNAME"), - DatabaseName: os.Getenv("DATABASE_NAME"), - Username: os.Getenv("DATABASE_USER"), - Password: os.Getenv("DATABASE_PASSWORD"), - Port: port, - Driver: postgres.PGX, - } -} diff --git a/pkg/eth/test_helpers/test_data.go b/pkg/eth/test_helpers/test_data.go index 0c7e46dd..650b7cbc 100644 --- a/pkg/eth/test_helpers/test_data.go +++ b/pkg/eth/test_helpers/test_data.go @@ -38,7 +38,7 @@ import ( "github.com/multiformats/go-multihash" log "github.com/sirupsen/logrus" - "github.com/vulcanize/ipld-eth-server/pkg/eth" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth" ) // Test variables @@ -326,7 +326,7 @@ var ( StorageLeafKey = crypto.Keccak256Hash(storageLocation[:]).Bytes() StorageValue = crypto.Keccak256([]byte{1, 2, 3, 4, 5}) StoragePartialPath = common.Hex2Bytes("20290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563") - StorageLeafNode, _ = rlp.EncodeToBytes([]interface{}{ + StorageLeafNode, _ = rlp.EncodeToBytes(&[]interface{}{ StoragePartialPath, StorageValue, }) @@ -336,14 +336,14 @@ var ( ContractCodeHash = crypto.Keccak256Hash(MockContractByteCode) contractPath = common.Bytes2Hex([]byte{'\x06'}) ContractLeafKey = testhelpers.AddressToLeafKey(ContractAddress) - ContractAccount, _ = rlp.EncodeToBytes(types.StateAccount{ + ContractAccount, _ = rlp.EncodeToBytes(&types.StateAccount{ Nonce: nonce1, Balance: big.NewInt(0), CodeHash: ContractCodeHash.Bytes(), Root: common.HexToHash(ContractRoot), }) ContractPartialPath = common.Hex2Bytes("3114658a74d9cc9f7acf2c5cd696c3494d7c344d78bfec3add0d91ec4e8d1c45") - ContractLeafNode, _ = rlp.EncodeToBytes([]interface{}{ + ContractLeafNode, _ = rlp.EncodeToBytes(&[]interface{}{ ContractPartialPath, ContractAccount, }) @@ -354,14 +354,14 @@ var ( AccountCodeHash = common.HexToHash("0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470") AccountAddresss = common.HexToAddress("0x0D3ab14BBaD3D99F4203bd7a11aCB94882050E7e") AccountLeafKey = testhelpers.Account2LeafKey - Account, _ = rlp.EncodeToBytes(types.StateAccount{ + Account, _ = rlp.EncodeToBytes(&types.StateAccount{ Nonce: nonce0, Balance: AccountBalance, CodeHash: AccountCodeHash.Bytes(), Root: common.HexToHash(AccountRoot), }) AccountPartialPath = common.Hex2Bytes("3957f3e2f04a0764c3a0491b175f69926da61efbcc8f61fa1455fd2d2b4cdd45") - AccountLeafNode, _ = rlp.EncodeToBytes([]interface{}{ + AccountLeafNode, _ = rlp.EncodeToBytes(&[]interface{}{ AccountPartialPath, Account, }) diff --git a/pkg/fill/fill_suite_test.go b/pkg/fill/fill_suite_test.go new file mode 100644 index 00000000..4b5a9103 --- /dev/null +++ b/pkg/fill/fill_suite_test.go @@ -0,0 +1,29 @@ +// VulcanizeDB +// Copyright © 2022 Vulcanize + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. + +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package fill_test + +import ( + "testing" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +func TestFill(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "ipld eth server fill test suite") +} diff --git a/pkg/fill/service.go b/pkg/fill/service.go new file mode 100644 index 00000000..cd3d3df6 --- /dev/null +++ b/pkg/fill/service.go @@ -0,0 +1,206 @@ +// VulcanizeDB +// Copyright © 2022 Vulcanize + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. + +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package fill + +import ( + "math" + "strings" + "sync" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/statediff" + "github.com/jmoiron/sqlx" + log "github.com/sirupsen/logrus" + + "github.com/vulcanize/ipld-eth-server/v3/pkg/serve" +) + +// WatchedAddress type is used to process currently watched addresses +type WatchedAddress struct { + Address string `db:"address"` + CreatedAt uint64 `db:"created_at"` + WatchedAt uint64 `db:"watched_at"` + LastFilledAt uint64 `db:"last_filled_at"` + + StartBlock uint64 + EndBlock uint64 +} + +// Service is the underlying struct for the watched address gap filling service +type Service struct { + db *sqlx.DB + client *rpc.Client + interval int + quitChan chan bool +} + +// NewServer creates a new Service +func New(config *serve.Config) *Service { + return &Service{ + db: config.DB, + client: config.Client, + interval: config.WatchedAddressGapFillInterval, + quitChan: make(chan bool), + } +} + +// Start is used to begin the service +func (s *Service) Start(wg *sync.WaitGroup) { + defer wg.Done() + for { + select { + case <-s.quitChan: + log.Info("quiting eth ipld server process") + return + default: + s.fill() + } + } +} + +// Stop is used to gracefully stop the service +func (s *Service) Stop() { + log.Info("stopping watched address gap filler") + close(s.quitChan) +} + +// fill performs the filling of indexing gap for watched addresses +func (s *Service) fill() { + // Wait for specified interval duration + time.Sleep(time.Duration(s.interval) * time.Second) + + // Get watched addresses from the db + rows := s.fetchWatchedAddresses() + + // Get the block number to start fill at + // Get the block number to end fill at + fillWatchedAddresses, minStartBlock, maxEndBlock := s.GetFillAddresses(rows) + + if len(fillWatchedAddresses) > 0 { + log.Infof("running watched address gap filler for block range: (%d, %d)", minStartBlock, maxEndBlock) + } + + // Fill the missing diffs + for blockNumber := minStartBlock; blockNumber <= maxEndBlock; blockNumber++ { + params := statediff.Params{ + IntermediateStateNodes: true, + IntermediateStorageNodes: true, + IncludeBlock: true, + IncludeReceipts: true, + IncludeTD: true, + IncludeCode: true, + } + + fillAddresses := []interface{}{} + for _, fillWatchedAddress := range fillWatchedAddresses { + if blockNumber >= fillWatchedAddress.StartBlock && blockNumber <= fillWatchedAddress.EndBlock { + params.WatchedAddresses = append(params.WatchedAddresses, common.HexToAddress(fillWatchedAddress.Address)) + fillAddresses = append(fillAddresses, fillWatchedAddress.Address) + } + } + + if len(fillAddresses) > 0 { + s.writeStateDiffAt(blockNumber, params) + s.UpdateLastFilledAt(blockNumber, fillAddresses) + } + } +} + +// GetFillAddresses finds the encompassing range to perform fill for the given watched addresses +// it also sets the address specific fill range +func (s *Service) GetFillAddresses(rows []WatchedAddress) ([]WatchedAddress, uint64, uint64) { + fillWatchedAddresses := []WatchedAddress{} + minStartBlock := uint64(math.MaxUint64) + maxEndBlock := uint64(0) + + for _, row := range rows { + // Check for a gap between created_at and watched_at + // CreatedAt and WatchedAt being equal is considered a gap of one block + if row.CreatedAt > row.WatchedAt { + continue + } + + startBlock := uint64(0) + endBlock := uint64(0) + + // Check if some of the gap was filled earlier + if row.LastFilledAt > 0 { + if row.LastFilledAt < row.WatchedAt { + startBlock = row.LastFilledAt + 1 + } + } else { + startBlock = row.CreatedAt + } + + // Add the address for filling + if startBlock > 0 { + row.StartBlock = startBlock + if startBlock < minStartBlock { + minStartBlock = startBlock + } + + endBlock = row.WatchedAt + row.EndBlock = endBlock + if endBlock > maxEndBlock { + maxEndBlock = endBlock + } + + fillWatchedAddresses = append(fillWatchedAddresses, row) + } + } + + return fillWatchedAddresses, minStartBlock, maxEndBlock +} + +// UpdateLastFilledAt updates the fill status for the provided addresses in the db +func (s *Service) UpdateLastFilledAt(blockNumber uint64, fillAddresses []interface{}) { + // Prepare the query + query := "UPDATE eth_meta.watched_addresses SET last_filled_at=? WHERE address IN (?" + strings.Repeat(",?", len(fillAddresses)-1) + ")" + query = s.db.Rebind(query) + + args := []interface{}{blockNumber} + args = append(args, fillAddresses...) + + // Execute the update query + _, err := s.db.Exec(query, args...) + if err != nil { + log.Fatalf(err.Error()) + } +} + +// fetchWatchedAddresses fetches watched addresses from the db +func (s *Service) fetchWatchedAddresses() []WatchedAddress { + rows := []WatchedAddress{} + pgStr := "SELECT * FROM eth_meta.watched_addresses" + + err := s.db.Select(&rows, pgStr) + if err != nil { + log.Fatalf("Error fetching watched addreesses: %s", err.Error()) + } + + return rows +} + +// writeStateDiffAt makes a RPC call to writeout statediffs at a blocknumber with the given params +func (s *Service) writeStateDiffAt(blockNumber uint64, params statediff.Params) { + err := s.client.Call(nil, "statediff_writeStateDiffAt", blockNumber, params) + if err != nil { + log.Fatalf("Error making a RPC call to write statediff at block number %d: %s", blockNumber, err.Error()) + } +} diff --git a/pkg/fill/service_test.go b/pkg/fill/service_test.go new file mode 100644 index 00000000..439635f7 --- /dev/null +++ b/pkg/fill/service_test.go @@ -0,0 +1,411 @@ +// VulcanizeDB +// Copyright © 2022 Vulcanize + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. + +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package fill_test + +import ( + "context" + "math/big" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/statediff/indexer/interfaces" + sdtypes "github.com/ethereum/go-ethereum/statediff/types" + "github.com/jmoiron/sqlx" + + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth/test_helpers" + fill "github.com/vulcanize/ipld-eth-server/v3/pkg/fill" + "github.com/vulcanize/ipld-eth-server/v3/pkg/serve" + "github.com/vulcanize/ipld-eth-server/v3/pkg/shared" +) + +var _ = Describe("Service", func() { + + var ( + db *sqlx.DB + watchedAddressGapFiller *fill.Service + statediffIndexer interfaces.StateDiffIndexer + err error + + contract1Address = "0x5d663F5269090bD2A7DC2390c911dF6083D7b28F" + contract2Address = "0x6Eb7e5C66DB8af2E96159AC440cbc8CDB7fbD26B" + contract3Address = "0xcfeB164C328CA13EFd3C77E1980d94975aDfedfc" + + chainConfig = params.TestChainConfig + ctx = context.Background() + ) + + It("test init", func() { + // db initialization + db = shared.SetupDB() + + // indexer initialization + // statediffIndexer, err = indexer.NewStateDiffIndexer(nil, db) + statediffIndexer = shared.SetupTestStateDiffIndexer(ctx, chainConfig, test_helpers.Genesis.Hash()) + Expect(err).ToNot(HaveOccurred()) + + // fill service intialization + watchedAddressGapFiller = fill.New(&serve.Config{ + DB: db, + }) + }) + + defer It("test teardown", func() { + shared.TearDownDB(db) + }) + + Describe("GetFillAddresses", func() { + Context("overlapping fill ranges", func() { + It("gives the range to run fill for each address", func() { + // input data + rows := []fill.WatchedAddress{ + { + Address: contract1Address, + CreatedAt: 10, + WatchedAt: 50, + LastFilledAt: 0, + }, + { + Address: contract2Address, + CreatedAt: 40, + WatchedAt: 70, + LastFilledAt: 0, + }, + { + Address: contract3Address, + CreatedAt: 20, + WatchedAt: 30, + LastFilledAt: 0, + }, + } + + // expected output data + expectedOutputAddresses := []fill.WatchedAddress{ + { + Address: contract1Address, + CreatedAt: 10, + WatchedAt: 50, + LastFilledAt: 0, + StartBlock: 10, + EndBlock: 50, + }, + { + Address: contract2Address, + CreatedAt: 40, + WatchedAt: 70, + LastFilledAt: 0, + StartBlock: 40, + EndBlock: 70, + }, + { + Address: contract3Address, + CreatedAt: 20, + WatchedAt: 30, + LastFilledAt: 0, + StartBlock: 20, + EndBlock: 30, + }, + } + expectedOutputStartBlock := uint64(10) + expectedOutputEndBlock := uint64(70) + + fillWatchedAddresses, minStartBlock, maxEndBlock := watchedAddressGapFiller.GetFillAddresses(rows) + + Expect(fillWatchedAddresses).To(Equal(expectedOutputAddresses)) + Expect(minStartBlock).To(Equal(expectedOutputStartBlock)) + Expect(maxEndBlock).To(Equal(expectedOutputEndBlock)) + }) + }) + + Context("non-overlapping fill ranges", func() { + It("gives the range to run fill for each address", func() { + // input data + rows := []fill.WatchedAddress{ + { + Address: contract1Address, + CreatedAt: 10, + WatchedAt: 50, + LastFilledAt: 0, + }, + { + Address: contract2Address, + CreatedAt: 70, + WatchedAt: 90, + LastFilledAt: 0, + }, + } + + // expected output data + expectedOutputAddresses := []fill.WatchedAddress{ + { + Address: contract1Address, + CreatedAt: 10, + WatchedAt: 50, + LastFilledAt: 0, + StartBlock: 10, + EndBlock: 50, + }, + { + Address: contract2Address, + CreatedAt: 70, + WatchedAt: 90, + LastFilledAt: 0, + StartBlock: 70, + EndBlock: 90, + }, + } + expectedOutputStartBlock := uint64(10) + expectedOutputEndBlock := uint64(90) + + fillWatchedAddresses, minStartBlock, maxEndBlock := watchedAddressGapFiller.GetFillAddresses(rows) + + Expect(fillWatchedAddresses).To(Equal(expectedOutputAddresses)) + Expect(minStartBlock).To(Equal(expectedOutputStartBlock)) + Expect(maxEndBlock).To(Equal(expectedOutputEndBlock)) + }) + }) + + Context("a contract watched before it was created", func() { + It("gives no range for an address when it is watched before it's created", func() { + // input data + rows := []fill.WatchedAddress{ + { + Address: contract1Address, + CreatedAt: 10, + WatchedAt: 50, + LastFilledAt: 0, + }, + { + Address: contract2Address, + CreatedAt: 90, + WatchedAt: 70, + LastFilledAt: 0, + }, + } + + // expected output data + expectedOutputAddresses := []fill.WatchedAddress{ + { + Address: contract1Address, + CreatedAt: 10, + WatchedAt: 50, + LastFilledAt: 0, + StartBlock: 10, + EndBlock: 50, + }, + } + expectedOutputStartBlock := uint64(10) + expectedOutputEndBlock := uint64(50) + + fillWatchedAddresses, minStartBlock, maxEndBlock := watchedAddressGapFiller.GetFillAddresses(rows) + + Expect(fillWatchedAddresses).To(Equal(expectedOutputAddresses)) + Expect(minStartBlock).To(Equal(expectedOutputStartBlock)) + Expect(maxEndBlock).To(Equal(expectedOutputEndBlock)) + }) + }) + + Context("a contract having some of the gap filled earlier", func() { + It("gives the remaining range for an address to run fill for", func() { + // input data + rows := []fill.WatchedAddress{ + { + Address: contract1Address, + CreatedAt: 10, + WatchedAt: 50, + LastFilledAt: 0, + }, + { + Address: contract2Address, + CreatedAt: 40, + WatchedAt: 70, + LastFilledAt: 50, + }, + } + + // expected output data + expectedOutputAddresses := []fill.WatchedAddress{ + { + Address: contract1Address, + CreatedAt: 10, + WatchedAt: 50, + LastFilledAt: 0, + StartBlock: 10, + EndBlock: 50, + }, + { + Address: contract2Address, + CreatedAt: 40, + WatchedAt: 70, + LastFilledAt: 50, + StartBlock: 51, + EndBlock: 70, + }, + } + expectedOutputStartBlock := uint64(10) + expectedOutputEndBlock := uint64(70) + + fillWatchedAddresses, minStartBlock, maxEndBlock := watchedAddressGapFiller.GetFillAddresses(rows) + + Expect(fillWatchedAddresses).To(Equal(expectedOutputAddresses)) + Expect(minStartBlock).To(Equal(expectedOutputStartBlock)) + Expect(maxEndBlock).To(Equal(expectedOutputEndBlock)) + }) + + It("gives no range for an address when the gap is already filled", func() { + // input data + rows := []fill.WatchedAddress{ + { + Address: contract1Address, + CreatedAt: 10, + WatchedAt: 50, + LastFilledAt: 0, + }, + { + Address: contract2Address, + CreatedAt: 40, + WatchedAt: 70, + LastFilledAt: 70, + }, + } + + // expected output data + expectedOutputAddresses := []fill.WatchedAddress{ + { + Address: contract1Address, + CreatedAt: 10, + WatchedAt: 50, + LastFilledAt: 0, + StartBlock: 10, + EndBlock: 50, + }, + } + expectedOutputStartBlock := uint64(10) + expectedOutputEndBlock := uint64(50) + + fillWatchedAddresses, minStartBlock, maxEndBlock := watchedAddressGapFiller.GetFillAddresses(rows) + + Expect(fillWatchedAddresses).To(Equal(expectedOutputAddresses)) + Expect(minStartBlock).To(Equal(expectedOutputStartBlock)) + Expect(maxEndBlock).To(Equal(expectedOutputEndBlock)) + }) + }) + }) + + Describe("UpdateLastFilledAt", func() { + pgStr := "SELECT * FROM eth_meta.watched_addresses" + + BeforeEach(func() { + shared.TearDownDB(db) + }) + + It("updates last filled at for a single address", func() { + // fill db with watched addresses + watchedAddresses := []sdtypes.WatchAddressArg{ + { + Address: contract1Address, + CreatedAt: 10, + }, + } + watchedAt := uint64(50) + err = statediffIndexer.InsertWatchedAddresses(watchedAddresses, big.NewInt(int64(watchedAt))) + Expect(err).ToNot(HaveOccurred()) + + // update last filled at block in the db + fillAddresses := []interface{}{ + contract1Address, + } + fillAt := uint64(12) + watchedAddressGapFiller.UpdateLastFilledAt(fillAt, fillAddresses) + + // expected data + expectedData := []fill.WatchedAddress{ + { + Address: contract1Address, + CreatedAt: 10, + WatchedAt: watchedAt, + LastFilledAt: fillAt, + }, + } + + rows := []fill.WatchedAddress{} + err = db.Select(&rows, pgStr) + Expect(err).ToNot(HaveOccurred()) + + Expect(rows).To(Equal(expectedData)) + }) + + It("updates last filled at for multiple address", func() { + // fill db with watched addresses + watchedAddresses := []sdtypes.WatchAddressArg{ + { + Address: contract1Address, + CreatedAt: 10, + }, + { + Address: contract2Address, + CreatedAt: 20, + }, + { + Address: contract3Address, + CreatedAt: 30, + }, + } + watchedAt := uint64(50) + err = statediffIndexer.InsertWatchedAddresses(watchedAddresses, big.NewInt(int64(watchedAt))) + Expect(err).ToNot(HaveOccurred()) + + // update last filled at block in the db + fillAddresses := []interface{}{ + contract1Address, + contract2Address, + contract3Address, + } + fillAt := uint64(50) + watchedAddressGapFiller.UpdateLastFilledAt(fillAt, fillAddresses) + + // expected data + expectedData := []fill.WatchedAddress{ + { + Address: contract1Address, + CreatedAt: 10, + WatchedAt: watchedAt, + LastFilledAt: fillAt, + }, + { + Address: contract2Address, + CreatedAt: 20, + WatchedAt: watchedAt, + LastFilledAt: fillAt, + }, + { + Address: contract3Address, + CreatedAt: 30, + WatchedAt: watchedAt, + LastFilledAt: fillAt, + }, + } + + rows := []fill.WatchedAddress{} + err = db.Select(&rows, pgStr) + Expect(err).ToNot(HaveOccurred()) + + Expect(rows).To(Equal(expectedData)) + }) + }) +}) diff --git a/pkg/graphql/graphql.go b/pkg/graphql/graphql.go index 0a746a78..465bf286 100644 --- a/pkg/graphql/graphql.go +++ b/pkg/graphql/graphql.go @@ -33,7 +33,7 @@ import ( "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rpc" - "github.com/vulcanize/ipld-eth-server/pkg/eth" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth" ) var ( diff --git a/pkg/graphql/graphql_test.go b/pkg/graphql/graphql_test.go index dec0d0dd..50375b3a 100644 --- a/pkg/graphql/graphql_test.go +++ b/pkg/graphql/graphql_test.go @@ -35,10 +35,11 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - "github.com/vulcanize/ipld-eth-server/pkg/eth" - "github.com/vulcanize/ipld-eth-server/pkg/eth/test_helpers" - "github.com/vulcanize/ipld-eth-server/pkg/graphql" - ethServerShared "github.com/vulcanize/ipld-eth-server/pkg/shared" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth/test_helpers" + "github.com/vulcanize/ipld-eth-server/v3/pkg/graphql" + "github.com/vulcanize/ipld-eth-server/v3/pkg/shared" + ethServerShared "github.com/vulcanize/ipld-eth-server/v3/pkg/shared" ) var _ = Describe("GraphQL", func() { @@ -65,8 +66,8 @@ var _ = Describe("GraphQL", func() { It("test init", func() { var err error - db = eth.SetupTestDB() - transformer := eth.SetupTestStateDiffIndexer(ctx, chainConfig, test_helpers.Genesis.Hash()) + db = shared.SetupDB() + transformer := shared.SetupTestStateDiffIndexer(ctx, chainConfig, test_helpers.Genesis.Hash()) backend, err = eth.NewEthBackend(db, ð.Config{ ChainConfig: chainConfig, @@ -130,7 +131,7 @@ var _ = Describe("GraphQL", func() { } // Insert some non-canonical data into the database so that we test our ability to discern canonicity - indexAndPublisher := eth.SetupTestStateDiffIndexer(ctx, chainConfig, test_helpers.Genesis.Hash()) + indexAndPublisher := shared.SetupTestStateDiffIndexer(ctx, chainConfig, test_helpers.Genesis.Hash()) blockHash = test_helpers.MockBlock.Hash() contractAddress = test_helpers.ContractAddr @@ -166,7 +167,7 @@ var _ = Describe("GraphQL", func() { defer It("test teardown", func() { err := graphQLServer.Stop() Expect(err).ToNot(HaveOccurred()) - eth.TearDownTestDB(db) + shared.TearDownDB(db) chain.Stop() }) diff --git a/pkg/graphql/service.go b/pkg/graphql/service.go index 726e0d98..10ea5981 100644 --- a/pkg/graphql/service.go +++ b/pkg/graphql/service.go @@ -29,7 +29,7 @@ import ( "github.com/graph-gophers/graphql-go/relay" "github.com/sirupsen/logrus" - "github.com/vulcanize/ipld-eth-server/pkg/eth" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth" ) // Service encapsulates a GraphQL service. @@ -69,7 +69,7 @@ func (s *Service) Start(server *p2p.Server) error { return err } - handler := node.NewHTTPHandlerStack(s.handler, s.cors, s.vhosts) + handler := node.NewHTTPHandlerStack(s.handler, s.cors, s.vhosts, nil) // start http server _, addr, err := node.StartHTTPEndpoint(s.endpoint, rpc.DefaultHTTPTimeouts, handler) diff --git a/pkg/net/api_test.go b/pkg/net/api_test.go index 0a8f7206..f47829c7 100644 --- a/pkg/net/api_test.go +++ b/pkg/net/api_test.go @@ -20,7 +20,7 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - "github.com/vulcanize/ipld-eth-server/pkg/net" + "github.com/vulcanize/ipld-eth-server/v3/pkg/net" ) var _ = Describe("API", func() { diff --git a/pkg/rpc/http.go b/pkg/rpc/http.go index 8c5e9831..81e7b143 100644 --- a/pkg/rpc/http.go +++ b/pkg/rpc/http.go @@ -33,7 +33,7 @@ func StartHTTPEndpoint(endpoint string, apis []rpc.API, modules []string, cors [ if err != nil { utils.Fatalf("Could not register HTTP API: %w", err) } - handler := node.NewHTTPHandlerStack(srv, cors, vhosts) + handler := node.NewHTTPHandlerStack(srv, cors, vhosts, nil) // start http server _, addr, err := node.StartHTTPEndpoint(endpoint, rpc.DefaultHTTPTimeouts, handler) diff --git a/pkg/rpc/ipc.go b/pkg/rpc/ipc.go index 7b8e1c28..eedf5184 100644 --- a/pkg/rpc/ipc.go +++ b/pkg/rpc/ipc.go @@ -25,7 +25,7 @@ import ( "github.com/ethereum/go-ethereum/p2p/netutil" "github.com/ethereum/go-ethereum/rpc" log "github.com/sirupsen/logrus" - "github.com/vulcanize/ipld-eth-server/pkg/prom" + "github.com/vulcanize/ipld-eth-server/v3/pkg/prom" ) var ( diff --git a/pkg/rpc/ws.go b/pkg/rpc/ws.go index 65ae2642..a19d5cc1 100644 --- a/pkg/rpc/ws.go +++ b/pkg/rpc/ws.go @@ -24,7 +24,7 @@ import ( "github.com/ethereum/go-ethereum/node" "github.com/ethereum/go-ethereum/rpc" - "github.com/vulcanize/ipld-eth-server/pkg/prom" + "github.com/vulcanize/ipld-eth-server/v3/pkg/prom" ) // StartWSEndpoint starts a websocket endpoint. diff --git a/pkg/serve/api.go b/pkg/serve/api.go index 8cf3d43f..4a9dfbde 100644 --- a/pkg/serve/api.go +++ b/pkg/serve/api.go @@ -20,9 +20,10 @@ import ( "context" "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/statediff/types" log "github.com/sirupsen/logrus" - "github.com/vulcanize/ipld-eth-server/pkg/eth" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth" ) // APIName is the namespace used for the state diffing service API @@ -33,13 +34,15 @@ const APIVersion = "0.0.1" // PublicServerAPI is the public api for the watcher type PublicServerAPI struct { - w Server + w Server + rpc *rpc.Client } // NewPublicServerAPI creates a new PublicServerAPI with the provided underlying Server process -func NewPublicServerAPI(w Server) *PublicServerAPI { +func NewPublicServerAPI(w Server, client *rpc.Client) *PublicServerAPI { return &PublicServerAPI{ - w: w, + w: w, + rpc: client, } } @@ -81,3 +84,13 @@ func (api *PublicServerAPI) Stream(ctx context.Context, params eth.SubscriptionS return rpcSub, nil } + +// WatchAddress makes a geth WatchAddress API call with the given operation and args +func (api *PublicServerAPI) WatchAddress(operation types.OperationType, args []types.WatchAddressArg) error { + err := api.rpc.Call(nil, "statediff_watchAddress", operation, args) + if err != nil { + return err + } + + return nil +} diff --git a/pkg/serve/config.go b/pkg/serve/config.go index c971691c..14fdd19b 100644 --- a/pkg/serve/config.go +++ b/pkg/serve/config.go @@ -27,14 +27,13 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/statediff" "github.com/ethereum/go-ethereum/statediff/indexer/database/sql/postgres" "github.com/jmoiron/sqlx" "github.com/spf13/viper" - "github.com/vulcanize/ipld-eth-server/pkg/eth" - "github.com/vulcanize/ipld-eth-server/pkg/prom" - "github.com/vulcanize/ipld-eth-server/pkg/shared" - ethServerShared "github.com/vulcanize/ipld-eth-server/pkg/shared" + "github.com/vulcanize/ipld-eth-server/v3/pkg/prom" + ethServerShared "github.com/vulcanize/ipld-eth-server/v3/pkg/shared" ) // Env variables @@ -56,6 +55,9 @@ const ( VALIDATOR_ENABLED = "VALIDATOR_ENABLED" VALIDATOR_EVERY_NTH_BLOCK = "VALIDATOR_EVERY_NTH_BLOCK" + + WATCHED_ADDRESS_GAP_FILLER_ENABLED = "WATCHED_ADDRESS_GAP_FILLER_ENABLED" + WATCHED_ADDRESS_GAP_FILLER_INTERVAL = "WATCHED_ADDRESS_GAP_FILLER_INTERVAL" ) // Config struct @@ -96,6 +98,9 @@ type Config struct { StateValidationEnabled bool StateValidationEveryNthBlock uint64 + + WatchedAddressGapFillerEnabled bool + WatchedAddressGapFillInterval int } // NewConfig is used to initialize a watcher config from a .toml file @@ -202,7 +207,7 @@ func NewConfig() (*Config, error) { c.IpldGraphqlEnabled = ipldGraphqlEnabled overrideDBConnConfig(&c.DBConfig) - serveDB, err := shared.NewDB(c.DBConfig.DbConnectionString(), c.DBConfig) + serveDB, err := ethServerShared.NewDB(c.DBConfig.DbConnectionString(), c.DBConfig) if err != nil { return nil, err } @@ -223,15 +228,17 @@ func NewConfig() (*Config, error) { } chainConfigPath := viper.GetString("ethereum.chainConfig") if chainConfigPath != "" { - c.ChainConfig, err = eth.LoadConfig(chainConfigPath) + c.ChainConfig, err = statediff.LoadConfig(chainConfigPath) } else { - c.ChainConfig, err = eth.ChainConfig(nodeInfo.ChainID) + c.ChainConfig, err = statediff.ChainConfig(nodeInfo.ChainID) } c.loadGroupCacheConfig() c.loadValidatorConfig() + c.loadWatchedAddressGapFillerConfig() + return c, err } @@ -294,3 +301,11 @@ func (c *Config) loadValidatorConfig() { c.StateValidationEnabled = viper.GetBool("validator.enabled") c.StateValidationEveryNthBlock = viper.GetUint64("validator.everyNthBlock") } + +func (c *Config) loadWatchedAddressGapFillerConfig() { + viper.BindEnv("watch.fill.enabled", WATCHED_ADDRESS_GAP_FILLER_ENABLED) + viper.BindEnv("watch.fill.interval", WATCHED_ADDRESS_GAP_FILLER_INTERVAL) + + c.WatchedAddressGapFillerEnabled = viper.GetBool("watch.fill.enabled") + c.WatchedAddressGapFillInterval = viper.GetInt("watch.fill.interval") +} diff --git a/pkg/serve/service.go b/pkg/serve/service.go index 1704ea64..b22963cc 100644 --- a/pkg/serve/service.go +++ b/pkg/serve/service.go @@ -31,8 +31,8 @@ import ( "github.com/jmoiron/sqlx" log "github.com/sirupsen/logrus" - "github.com/vulcanize/ipld-eth-server/pkg/eth" - "github.com/vulcanize/ipld-eth-server/pkg/net" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth" + "github.com/vulcanize/ipld-eth-server/v3/pkg/net" ) const ( @@ -129,7 +129,7 @@ func (sap *Service) APIs() []rpc.API { { Namespace: APIName, Version: APIVersion, - Service: NewPublicServerAPI(sap), + Service: NewPublicServerAPI(sap, sap.client), Public: true, }, { diff --git a/pkg/shared/test_helpers.go b/pkg/shared/test_helpers.go index eed5a7f0..d9795b59 100644 --- a/pkg/shared/test_helpers.go +++ b/pkg/shared/test_helpers.go @@ -18,8 +18,20 @@ package shared import ( "bytes" + "context" + "os" + "strconv" + . "github.com/onsi/gomega" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/statediff/indexer" + "github.com/ethereum/go-ethereum/statediff/indexer/database/sql/postgres" + "github.com/ethereum/go-ethereum/statediff/indexer/interfaces" "github.com/ethereum/go-ethereum/statediff/indexer/models" + "github.com/ethereum/go-ethereum/statediff/indexer/node" + "github.com/jmoiron/sqlx" ) // IPLDsContainBytes used to check if a list of strings contains a particular string @@ -31,3 +43,65 @@ func IPLDsContainBytes(iplds []models.IPLDModel, b []byte) bool { } return false } + +// SetupDB is use to setup a db for watcher tests +func SetupDB() *sqlx.DB { + config := getTestDBConfig() + + db, err := NewDB(config.DbConnectionString(), config) + Expect(err).NotTo(HaveOccurred()) + + return db +} + +// TearDownDB is used to tear down the watcher dbs after tests +func TearDownDB(db *sqlx.DB) { + tx, err := db.Beginx() + Expect(err).NotTo(HaveOccurred()) + _, err = tx.Exec(`DELETE FROM eth.header_cids`) + Expect(err).NotTo(HaveOccurred()) + _, err = tx.Exec(`DELETE FROM eth.transaction_cids`) + Expect(err).NotTo(HaveOccurred()) + _, err = tx.Exec(`DELETE FROM eth.receipt_cids`) + Expect(err).NotTo(HaveOccurred()) + _, err = tx.Exec(`DELETE FROM eth.state_cids`) + Expect(err).NotTo(HaveOccurred()) + _, err = tx.Exec(`DELETE FROM eth.storage_cids`) + Expect(err).NotTo(HaveOccurred()) + _, err = tx.Exec(`DELETE FROM blocks`) + Expect(err).NotTo(HaveOccurred()) + _, err = tx.Exec(`DELETE FROM eth.log_cids`) + Expect(err).NotTo(HaveOccurred()) + _, err = tx.Exec(`DELETE FROM eth_meta.watched_addresses`) + Expect(err).NotTo(HaveOccurred()) + + err = tx.Commit() + Expect(err).NotTo(HaveOccurred()) +} + +func SetupTestStateDiffIndexer(ctx context.Context, chainConfig *params.ChainConfig, genHash common.Hash) interfaces.StateDiffIndexer { + testInfo := node.Info{ + GenesisBlock: genHash.String(), + NetworkID: "1", + ID: "1", + ClientName: "geth", + ChainID: params.TestChainConfig.ChainID.Uint64(), + } + + _, stateDiffIndexer, err := indexer.NewStateDiffIndexer(ctx, chainConfig, testInfo, getTestDBConfig()) + Expect(err).NotTo(HaveOccurred()) + + return stateDiffIndexer +} + +func getTestDBConfig() postgres.Config { + port, _ := strconv.Atoi(os.Getenv("DATABASE_PORT")) + return postgres.Config{ + Hostname: os.Getenv("DATABASE_HOSTNAME"), + DatabaseName: os.Getenv("DATABASE_NAME"), + Username: os.Getenv("DATABASE_USER"), + Password: os.Getenv("DATABASE_PASSWORD"), + Port: port, + Driver: postgres.SQLX, + } +} diff --git a/scripts/run_integration_test.sh b/scripts/run_integration_test.sh index 09bffcef..20867cf3 100755 --- a/scripts/run_integration_test.sh +++ b/scripts/run_integration_test.sh @@ -3,16 +3,9 @@ set -o xtrace export ETH_FORWARD_ETH_CALLS=false export DB_WRITE=true -export ETH_HTTP_PATH="" export ETH_PROXY_ON_ERROR=false - -# Clear up existing docker images and volume. -docker-compose down --remove-orphans --volumes - -# Build and start the containers. -# Note: Build only if `ipld-eth-server` or other container code is modified. Otherwise comment this line. -docker-compose -f docker-compose.test.yml -f docker-compose.yml build eth-server -docker-compose -f docker-compose.test.yml -f docker-compose.yml up -d ipld-eth-db dapptools contract eth-server +export WATCHED_ADDRESS_GAP_FILLER_ENABLED=false +export WATCHED_ADDRESS_GAP_FILLER_INTERVAL=5 export PGPASSWORD=password export DATABASE_USER=vdbm diff --git a/scripts/run_integration_test_forward_eth_calls.sh b/scripts/run_integration_test_forward_eth_calls.sh old mode 100644 new mode 100755 index 0b7ab672..6ef9c068 --- a/scripts/run_integration_test_forward_eth_calls.sh +++ b/scripts/run_integration_test_forward_eth_calls.sh @@ -3,16 +3,9 @@ set -o xtrace export ETH_FORWARD_ETH_CALLS=true export DB_WRITE=false -export ETH_HTTP_PATH="dapptools:8545" export ETH_PROXY_ON_ERROR=false - -# Clear up existing docker images and volume. -docker-compose down --remove-orphans --volumes - -# Build and start the containers. -# Note: Build only if `ipld-eth-server` or other container code is modified. Otherwise comment this line. -docker-compose -f docker-compose.test.yml -f docker-compose.yml build eth-server -docker-compose -f docker-compose.test.yml -f docker-compose.yml up -d ipld-eth-db dapptools contract eth-server +export WATCHED_ADDRESS_GAP_FILLER_ENABLED=false +export WATCHED_ADDRESS_GAP_FILLER_INTERVAL=5 export PGPASSWORD=password export DATABASE_USER=vdbm diff --git a/scripts/run_integration_test_watched_address_gap_filler.sh b/scripts/run_integration_test_watched_address_gap_filler.sh new file mode 100755 index 00000000..3b472cd5 --- /dev/null +++ b/scripts/run_integration_test_watched_address_gap_filler.sh @@ -0,0 +1,19 @@ +set -e +set -o xtrace + +export ETH_FORWARD_ETH_CALLS=false +export DB_WRITE=true +export ETH_PROXY_ON_ERROR=false +export WATCHED_ADDRESS_GAP_FILLER_ENABLED=true +export WATCHED_ADDRESS_GAP_FILLER_INTERVAL=5 + +export PGPASSWORD=password +export DATABASE_USER=vdbm +export DATABASE_PORT=8077 +export DATABASE_PASSWORD=password +export DATABASE_HOSTNAME=127.0.0.1 + +# Wait for containers to be up and execute the integration test. +while [ "$(curl -s -o /dev/null -w ''%{http_code}'' localhost:8081)" != "200" ]; do echo "waiting for ipld-eth-server..." && sleep 5; done && \ + while [ "$(curl -s -o /dev/null -w ''%{http_code}'' localhost:8545)" != "200" ]; do echo "waiting for geth-statediff..." && sleep 5; done && \ + make integrationtest diff --git a/scripts/run_unit_test.sh b/scripts/run_unit_test.sh index bcbeced7..27f7e2ef 100755 --- a/scripts/run_unit_test.sh +++ b/scripts/run_unit_test.sh @@ -1,5 +1,8 @@ # Clear up existing docker images and volume. docker-compose down --remove-orphans --volumes -docker-compose -f docker-compose.test.yml -f docker-compose.yml up -d ipld-eth-db -PGPASSWORD=password DATABASE_USER=vdbm DATABASE_PORT=8077 DATABASE_PASSWORD=password DATABASE_HOSTNAME=127.0.0.1 DATABASE_NAME=vulcanize_testing make test \ No newline at end of file +docker-compose -f docker-compose.yml up -d ipld-eth-db +sleep 10 +PGPASSWORD=password DATABASE_USER=vdbm DATABASE_PORT=8077 DATABASE_PASSWORD=password DATABASE_HOSTNAME=127.0.0.1 DATABASE_NAME=vulcanize_testing make test + +docker-compose down --remove-orphans --volumes diff --git a/test/README.md b/test/README.md index 7d5c3b82..c740b286 100644 --- a/test/README.md +++ b/test/README.md @@ -1,15 +1,112 @@ +# Test Insructions -Spin up services: -``` -docker-compose -f docker-compose.test.yml -f docker-compose.yml up -d db dapptools contract eth-server -``` +## Setup -Running unit tests: -```bash -make test_local -``` +- Clone [stack-orchestrator](https://github.com/vulcanize/stack-orchestrator) and [go-ethereum](https://github.com/vulcanize/go-ethereum) repositories. -Running integration test: -```bash -make integrationtest_local -``` \ No newline at end of file +- Checkout [v3 release](https://github.com/vulcanize/go-ethereum/releases/tag/v1.10.17-statediff-3.2.0) in go-ethereum repo. + ```bash + # In go-ethereum repo. + git checkout v1.10.17-statediff-3.2.0 + ``` + +- Checkout working commit in stack-orchestrator repo. + ```bash + # In stack-orchestrator repo. + git checkout fcbc74451c5494664fe21f765e89c9c6565c07cb + ``` + +## Run + +- Run unit tests: + + ```bash + # In ipld-eth-server root directory. + ./scripts/run_unit_test.sh + ``` + +- Run integration tests: + + - Update (Replace existing content) config file [config.sh](https://github.com/vulcanize/stack-orchestrator/blob/main/config.sh) in stack-orchestrator repo: + ```bash + #!/bin/bash + + # Path to go-ethereum repo. + vulcanize_go_ethereum=~/go-ethereum/ + + # Path to ipld-eth-server repo. + vulcanize_ipld_eth_server=~/ipld-eth-server/ + + db_write=true + eth_forward_eth_calls=false + eth_proxy_on_error=false + eth_http_path="go-ethereum:8545" + ``` + + - Run stack-orchestrator: + ```bash + # In stack-orchestrator root directory. + cd helper-scripts + + ./wrapper.sh \ + -e docker \ + -d ../docker/latest/docker-compose-db.yml \ + -d ../docker/local/docker-compose-go-ethereum.yml \ + -d ../docker/local/docker-compose-ipld-eth-server.yml \ + -v remove \ + -p ../config.sh + ``` + + - Run test: + ```bash + # In ipld-eth-server root directory. + ./scripts/run_integration_test.sh + ``` + + - Update `config.sh` file: + ```bash + #!/bin/bash + + # Path to go-ethereum repo. + vulcanize_go_ethereum=~/go-ethereum/ + + # Path to ipld-eth-server repo. + vulcanize_ipld_eth_server=~/ipld-eth-server/ + + db_write=false + eth_forward_eth_calls=true + eth_proxy_on_error=false + eth_http_path="go-ethereum:8545" + ``` + + - Stop the stack-orchestrator and start again using the same command + + - Run integration tests for direct proxy fall-through of eth_calls: + ```bash + ./scripts/run_integration_test_forward_eth_calls.sh + ``` + + - Update `config.sh` file: + ```bash + #!/bin/bash + + # Path to go-ethereum repo. + vulcanize_go_ethereum=~/go-ethereum/ + + # Path to ipld-eth-server repo. + vulcanize_ipld_eth_server=~/ipld-eth-server/ + + db_write=true + eth_forward_eth_calls=false + eth_proxy_on_error=false + eth_http_path="go-ethereum:8545" + watched_addres_gap_filler_enabled=true + watched_addres_gap_filler_interval=5 + ``` + + - Stop the stack-orchestrator and start again using the same command + + - Run integration tests for watched addresses with gap filling service enabled: + ```bash + ./scripts/run_integration_test_watched_address_gap_filler.sh + ``` diff --git a/test/contract/contracts/SLVToken.sol b/test/contract/contracts/SLVToken.sol new file mode 100644 index 00000000..9c6d89b0 --- /dev/null +++ b/test/contract/contracts/SLVToken.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract SLVToken is ERC20 { + uint256 private countA; + uint256 private countB; + + constructor() ERC20("Silver", "SLV") {} + + function incrementCountA() public { + countA = countA + 1; + } + + function incrementCountB() public { + countB = countB + 1; + } + + receive() external payable {} + + function destroy() public { + selfdestruct(payable(msg.sender)); + } +} diff --git a/test/contract/hardhat.config.js b/test/contract/hardhat.config.js index b474482c..6bd2508a 100644 --- a/test/contract/hardhat.config.js +++ b/test/contract/hardhat.config.js @@ -17,15 +17,26 @@ task("accounts", "Prints the list of accounts", async () => { * @type import('hardhat/config').HardhatUserConfig */ module.exports = { - solidity: "0.8.0", + solidity: { + version: "0.8.0", + settings: { + outputSelection: { + '*': { + '*': [ + 'abi', 'storageLayout', + ] + } + } + } + }, networks: { local: { url: 'http://127.0.0.1:8545', - chainId: 4 + chainId: 99 }, docker: { url: process.env.ETH_ADDR, - chainId: 4 + chainId: 99 } } }; diff --git a/test/contract/package-lock.json b/test/contract/package-lock.json index 87061f13..d1ac222a 100644 --- a/test/contract/package-lock.json +++ b/test/contract/package-lock.json @@ -11,7 +11,8 @@ "dependencies": { "@openzeppelin/contracts": "^4.0.0", "fastify": "^3.14.2", - "hardhat": "^2.2.0" + "hardhat": "^2.2.0", + "solidity-create2-deployer": "^0.4.0" }, "devDependencies": { "@nomiclabs/hardhat-ethers": "^2.0.2", @@ -469,7 +470,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.1.0.tgz", "integrity": "sha512-N/W9Sbn1/C6Kh2kuHRjf/hX6euMK4+9zdJRBB8sDWmihVntjUAfxbusGZKzDQD8i3szAHhTz8K7XADV5iFNfJw==", - "dev": true, "funding": [ { "type": "individual", @@ -496,7 +496,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.1.0.tgz", "integrity": "sha512-8dJUnT8VNvPwWhYIau4dwp7qe1g+KgdRm4XTWvjkI9gAT2zZa90WF5ApdZ3vl1r6NDmnn6vUVvyphClRZRteTQ==", - "dev": true, "funding": [ { "type": "individual", @@ -521,7 +520,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.1.0.tgz", "integrity": "sha512-qQDMkjGZSSJSKl6AnfTgmz9FSnzq3iEoEbHTYwjDlEAv+LNP7zd4ixCcVWlWyk+2siud856M5CRhAmPdupeN9w==", - "dev": true, "funding": [ { "type": "individual", @@ -544,7 +542,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.1.0.tgz", "integrity": "sha512-rfWQR12eHn2cpstCFS4RF7oGjfbkZb0oqep+BfrT+gWEGWG2IowJvIsacPOvzyS1jhNF4MQ4BS59B04Mbovteg==", - "dev": true, "funding": [ { "type": "individual", @@ -567,7 +564,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.1.0.tgz", "integrity": "sha512-npD1bLvK4Bcxz+m4EMkx+F8Rd7CnqS9DYnhNu0/GlQBXhWjvfoAZzk5HJ0f1qeyp8d+A86PTuzLOGOXf4/CN8g==", - "dev": true, "funding": [ { "type": "individual", @@ -586,7 +582,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.1.0.tgz", "integrity": "sha512-vBKr39bum7DDbOvkr1Sj19bRMEPA4FnST6Utt6xhDzI7o7L6QNkDn2yrCfP+hnvJGhZFKtLygWwqlTBZoBXYLg==", - "dev": true, "funding": [ { "type": "individual", @@ -606,7 +601,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.1.0.tgz", "integrity": "sha512-wUvQlhTjPjFXIdLPOuTrFeQmSa6Wvls1bGXQNQWvB/SEn1NsTCE8PmumIEZxmOPjSHl1eV2uyHP5jBm5Cgj92Q==", - "dev": true, "funding": [ { "type": "individual", @@ -627,7 +621,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.1.0.tgz", "integrity": "sha512-sGTxb+LVjFxJcJeUswAIK6ncgOrh3D8c192iEJd7mLr95V6du119rRfYT/b87WPkZ5I3gRBUYIYXtdgCWACe8g==", - "dev": true, "funding": [ { "type": "individual", @@ -646,7 +639,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.1.0.tgz", "integrity": "sha512-0/SuHrxc8R8k+JiLmJymxHJbojUDWBQqO+b+XFdwaP0jGzqC09YDy/CAlSZB6qHsBifY8X3I89HcK/oMqxRdBw==", - "dev": true, "funding": [ { "type": "individual", @@ -665,7 +657,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.1.0.tgz", "integrity": "sha512-dvTMs/4XGSc57cYOW0KjgX1NdTujUu7mNb6PQdJWg08m9ULzPyGZuBkFJnijBcp6vTOCQ59RwjboWgNWw393og==", - "dev": true, "funding": [ { "type": "individual", @@ -693,7 +684,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.1.0.tgz", "integrity": "sha512-fNwry20yLLPpnRRwm3fBL+2ksgO+KMadxM44WJmRIoTKzy4269+rbq9KFoe2LTqq2CXJM2CE70beGaNrpuqflQ==", - "dev": true, "funding": [ { "type": "individual", @@ -719,7 +709,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.1.0.tgz", "integrity": "sha512-obIWdlujloExPHWJGmhJO/sETOOo7SEb6qemV4f8kyFoXg+cJK+Ta9SvBrj7hsUK85n3LZeZJZRjjM7oez3Clg==", - "dev": true, "funding": [ { "type": "individual", @@ -749,7 +738,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.1.0.tgz", "integrity": "sha512-00n2iBy27w8zrGZSiU762UOVuzCQZxUZxopsZC47++js6xUFuI74DHcJ5K/2pddlF1YBskvmMuboEu1geK8mnA==", - "dev": true, "funding": [ { "type": "individual", @@ -780,7 +768,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.1.0.tgz", "integrity": "sha512-vrTB1W6AEYoadww5c9UyVJ2YcSiyIUTNDRccZIgwTmFFoSHwBtcvG1hqy9RzJ1T0bMdATbM9Hfx2mJ6H0i7Hig==", - "dev": true, "funding": [ { "type": "individual", @@ -799,14 +786,12 @@ "node_modules/@ethersproject/keccak256/node_modules/js-sha3": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", - "dev": true + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" }, "node_modules/@ethersproject/logger": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.1.0.tgz", "integrity": "sha512-wtUaD1lBX10HBXjjKV9VHCBnTdUaKQnQ2XSET1ezglqLdPdllNOIlLfhyCRqXm5xwcjExVI5ETokOYfjPtaAlw==", - "dev": true, "funding": [ { "type": "individual", @@ -822,7 +807,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.1.0.tgz", "integrity": "sha512-A/NIrIED/G/IgU1XUukOA3WcFRxn2I4O5GxsYGA5nFlIi+UZWdGojs85I1VXkR1gX9eFnDXzjE6OtbgZHjFhIA==", - "dev": true, "funding": [ { "type": "individual", @@ -841,7 +825,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.1.0.tgz", "integrity": "sha512-B8cUbHHTgs8OtgJIafrRcz/YPDobVd5Ru8gTnShOiM9EBuFpYHQpq3+8iQJ6pyczDu6HP/oc/njAsIBhwFZYew==", - "dev": true, "funding": [ { "type": "individual", @@ -861,7 +844,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.1.0.tgz", "integrity": "sha512-519KKTwgmH42AQL3+GFV3SX6khYEfHsvI6v8HYejlkigSDuqttdgVygFTDsGlofNFchhDwuclrxQnD5B0YLNMg==", - "dev": true, "funding": [ { "type": "individual", @@ -880,7 +862,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.1.0.tgz", "integrity": "sha512-FjpZL2lSXrYpQDg2fMjugZ0HjQD9a+2fOOoRhhihh+Z+qi/xZ8vIlPoumrEP1DzIG4DBV6liUqLNqnX2C6FIAA==", - "dev": true, "funding": [ { "type": "individual", @@ -917,7 +898,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", - "dev": true, "engines": { "node": ">=8.3.0" }, @@ -938,7 +918,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.1.0.tgz", "integrity": "sha512-+uuczLQZ4+no9cP6TCoCktXx0u2YbNaRT7lRkSt12d8263e702f0u+4JnnRO8Qmv5nylWJebnqCHzyxP+6mLqw==", - "dev": true, "funding": [ { "type": "individual", @@ -958,7 +937,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.1.0.tgz", "integrity": "sha512-vDTyHIwNPrecy55gKGZ47eJZhBm8LLBxihzi5ou+zrSvYTpkSTWRcKUlXFDFQVwfWB+P5PGyERAdiDEI76clxw==", - "dev": true, "funding": [ { "type": "individual", @@ -978,7 +956,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.1.0.tgz", "integrity": "sha512-+fNSeZRstOpdRJpdGUkRONFCaiAqWkc91zXgg76Nlp5ndBQE25Kk5yK8gCPG1aGnCrbariiPr5j9DmrYH78JCA==", - "dev": true, "funding": [ { "type": "individual", @@ -999,7 +976,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.0" @@ -1009,7 +985,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.1.0.tgz", "integrity": "sha512-tE5LFlbmdObG8bY04NpuwPWSRPgEswfxweAI1sH7TbP0ml1elNfqcq7ii/3AvIN05i5U0Pkm3Tf8bramt8MmLw==", - "dev": true, "funding": [ { "type": "individual", @@ -1032,7 +1007,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.1.0.tgz", "integrity": "sha512-kPodsGyo9zg1g9XSXp1lGhFaezBAUUsAUB1Vf6OkppE5Wksg4Et+x3kG4m7J/uShDMP2upkJtHNsIBK2XkVpKQ==", - "dev": true, "funding": [ { "type": "individual", @@ -1055,7 +1029,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.1.0.tgz", "integrity": "sha512-perBZy0RrmmL0ejiFGUOlBVjMsUceqLut3OBP3zP96LhiJWWbS8u1NqQVgN4/Gyrbziuda66DxiQocXhsvx+Sw==", - "dev": true, "funding": [ { "type": "individual", @@ -1076,7 +1049,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.1.0.tgz", "integrity": "sha512-s10crRLZEA0Bgv6FGEl/AKkTw9f+RVUrlWDX1rHnD4ZncPFeiV2AJr4nT7QSUhxJdFPvjyKRDb3nEH27dIqcPQ==", - "dev": true, "funding": [ { "type": "individual", @@ -1103,7 +1075,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.1.0.tgz", "integrity": "sha512-isvJrx6qG0nKWfxsGORNjmOq/nh175fStfvRTA2xEKrGqx8JNJY83fswu4GkILowfriEM/eYpretfJnfzi7YhA==", - "dev": true, "funding": [ { "type": "individual", @@ -1124,7 +1095,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.1.0.tgz", "integrity": "sha512-ULmUtiYQLTUS+y3DgkLzRhFEK10zMwmjOthnjiZxee3Q/MVwr3rnmuAnXIUZrPjna6hvUPnyRIdW5XuF0Ld0YQ==", - "dev": true, "funding": [ { "type": "individual", @@ -1157,7 +1127,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.1.0.tgz", "integrity": "sha512-LTeluWgTq04+RNqAkVhpydPcRZK/kKxD2Vy7PYGrAD27ABO9kTqTBKwiOuzTyAHKUQHfnvZbXmxBXJAGViSDcA==", - "dev": true, "funding": [ { "type": "individual", @@ -1180,7 +1149,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.1.0.tgz", "integrity": "sha512-NsUCi/TpBb+oTFvMSccUkJGtp5o/84eOyqp5q5aBeiNBSLkYyw21znRn9mAmxZgySpxgruVgKbaapnYPgvctPQ==", - "dev": true, "funding": [ { "type": "individual", @@ -1630,8 +1598,7 @@ "node_modules/aes-js": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=", - "dev": true + "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" }, "node_modules/agent-base": { "version": "6.0.2", @@ -1870,8 +1837,7 @@ "node_modules/bech32": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "dev": true + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, "node_modules/binary-extensions": { "version": "2.2.0", @@ -2774,7 +2740,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.1.0.tgz", "integrity": "sha512-2L6Ge6wMBw02FlRoCLg4E0Elt3khMNlW6ULawa10mMeeZToYJ5+uCfiuTuB+XZ6om1Y7wuO9ZzezP8FsU2M/+g==", - "dev": true, "funding": [ { "type": "individual", @@ -5427,7 +5392,7 @@ "dev": true, "license": "MIT", "dependencies": { - "node-fetch": "^2.6.7", + "node-fetch": "2.1.2", "whatwg-fetch": "2.0.4" } }, @@ -7533,7 +7498,7 @@ "dev": true, "license": "MIT", "dependencies": { - "node-fetch": "^2.6.7" + "node-fetch": "~1.7.1" } }, "node_modules/ganache-core/node_modules/fetch-ponyfill/node_modules/is-stream": { @@ -7545,7 +7510,7 @@ } }, "node_modules/ganache-core/node_modules/fetch-ponyfill/node_modules/node-fetch": { - "version": "2.6.7", + "version": "1.7.3", "dev": true, "license": "MIT", "dependencies": { @@ -9217,7 +9182,7 @@ "license": "MIT" }, "node_modules/ganache-core/node_modules/node-fetch": { - "version": "2.6.7", + "version": "2.1.2", "dev": true, "license": "MIT", "engines": { @@ -14740,6 +14705,17 @@ "semver": "bin/semver" } }, + "node_modules/solidity-create2-deployer": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/solidity-create2-deployer/-/solidity-create2-deployer-0.4.0.tgz", + "integrity": "sha512-bB5d8fPt4dWsOoRodrsyfWKcjiv77IFl84+e6EckMMGYlfL2ZFqUoMz6tnqqiUFrM9abF1p6dWFOgJ/3zVc8yQ==", + "dependencies": { + "ethers": "^5.0.14" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/sonic-boom": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", @@ -16056,7 +16032,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.1.0.tgz", "integrity": "sha512-N/W9Sbn1/C6Kh2kuHRjf/hX6euMK4+9zdJRBB8sDWmihVntjUAfxbusGZKzDQD8i3szAHhTz8K7XADV5iFNfJw==", - "dev": true, "requires": { "@ethersproject/address": "^5.1.0", "@ethersproject/bignumber": "^5.1.0", @@ -16073,7 +16048,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.1.0.tgz", "integrity": "sha512-8dJUnT8VNvPwWhYIau4dwp7qe1g+KgdRm4XTWvjkI9gAT2zZa90WF5ApdZ3vl1r6NDmnn6vUVvyphClRZRteTQ==", - "dev": true, "requires": { "@ethersproject/bignumber": "^5.1.0", "@ethersproject/bytes": "^5.1.0", @@ -16088,7 +16062,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.1.0.tgz", "integrity": "sha512-qQDMkjGZSSJSKl6AnfTgmz9FSnzq3iEoEbHTYwjDlEAv+LNP7zd4ixCcVWlWyk+2siud856M5CRhAmPdupeN9w==", - "dev": true, "requires": { "@ethersproject/abstract-provider": "^5.1.0", "@ethersproject/bignumber": "^5.1.0", @@ -16101,7 +16074,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.1.0.tgz", "integrity": "sha512-rfWQR12eHn2cpstCFS4RF7oGjfbkZb0oqep+BfrT+gWEGWG2IowJvIsacPOvzyS1jhNF4MQ4BS59B04Mbovteg==", - "dev": true, "requires": { "@ethersproject/bignumber": "^5.1.0", "@ethersproject/bytes": "^5.1.0", @@ -16114,7 +16086,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.1.0.tgz", "integrity": "sha512-npD1bLvK4Bcxz+m4EMkx+F8Rd7CnqS9DYnhNu0/GlQBXhWjvfoAZzk5HJ0f1qeyp8d+A86PTuzLOGOXf4/CN8g==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.1.0" } @@ -16123,7 +16094,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.1.0.tgz", "integrity": "sha512-vBKr39bum7DDbOvkr1Sj19bRMEPA4FnST6Utt6xhDzI7o7L6QNkDn2yrCfP+hnvJGhZFKtLygWwqlTBZoBXYLg==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.1.0", "@ethersproject/properties": "^5.1.0" @@ -16133,7 +16103,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.1.0.tgz", "integrity": "sha512-wUvQlhTjPjFXIdLPOuTrFeQmSa6Wvls1bGXQNQWvB/SEn1NsTCE8PmumIEZxmOPjSHl1eV2uyHP5jBm5Cgj92Q==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.1.0", "@ethersproject/logger": "^5.1.0", @@ -16144,7 +16113,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.1.0.tgz", "integrity": "sha512-sGTxb+LVjFxJcJeUswAIK6ncgOrh3D8c192iEJd7mLr95V6du119rRfYT/b87WPkZ5I3gRBUYIYXtdgCWACe8g==", - "dev": true, "requires": { "@ethersproject/logger": "^5.1.0" } @@ -16153,7 +16121,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.1.0.tgz", "integrity": "sha512-0/SuHrxc8R8k+JiLmJymxHJbojUDWBQqO+b+XFdwaP0jGzqC09YDy/CAlSZB6qHsBifY8X3I89HcK/oMqxRdBw==", - "dev": true, "requires": { "@ethersproject/bignumber": "^5.1.0" } @@ -16162,7 +16129,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.1.0.tgz", "integrity": "sha512-dvTMs/4XGSc57cYOW0KjgX1NdTujUu7mNb6PQdJWg08m9ULzPyGZuBkFJnijBcp6vTOCQ59RwjboWgNWw393og==", - "dev": true, "requires": { "@ethersproject/abi": "^5.1.0", "@ethersproject/abstract-provider": "^5.1.0", @@ -16180,7 +16146,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.1.0.tgz", "integrity": "sha512-fNwry20yLLPpnRRwm3fBL+2ksgO+KMadxM44WJmRIoTKzy4269+rbq9KFoe2LTqq2CXJM2CE70beGaNrpuqflQ==", - "dev": true, "requires": { "@ethersproject/abstract-signer": "^5.1.0", "@ethersproject/address": "^5.1.0", @@ -16196,7 +16161,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.1.0.tgz", "integrity": "sha512-obIWdlujloExPHWJGmhJO/sETOOo7SEb6qemV4f8kyFoXg+cJK+Ta9SvBrj7hsUK85n3LZeZJZRjjM7oez3Clg==", - "dev": true, "requires": { "@ethersproject/abstract-signer": "^5.1.0", "@ethersproject/basex": "^5.1.0", @@ -16216,7 +16180,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.1.0.tgz", "integrity": "sha512-00n2iBy27w8zrGZSiU762UOVuzCQZxUZxopsZC47++js6xUFuI74DHcJ5K/2pddlF1YBskvmMuboEu1geK8mnA==", - "dev": true, "requires": { "@ethersproject/abstract-signer": "^5.1.0", "@ethersproject/address": "^5.1.0", @@ -16237,7 +16200,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.1.0.tgz", "integrity": "sha512-vrTB1W6AEYoadww5c9UyVJ2YcSiyIUTNDRccZIgwTmFFoSHwBtcvG1hqy9RzJ1T0bMdATbM9Hfx2mJ6H0i7Hig==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.1.0", "js-sha3": "0.5.7" @@ -16246,22 +16208,19 @@ "js-sha3": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", - "dev": true + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" } } }, "@ethersproject/logger": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.1.0.tgz", - "integrity": "sha512-wtUaD1lBX10HBXjjKV9VHCBnTdUaKQnQ2XSET1ezglqLdPdllNOIlLfhyCRqXm5xwcjExVI5ETokOYfjPtaAlw==", - "dev": true + "integrity": "sha512-wtUaD1lBX10HBXjjKV9VHCBnTdUaKQnQ2XSET1ezglqLdPdllNOIlLfhyCRqXm5xwcjExVI5ETokOYfjPtaAlw==" }, "@ethersproject/networks": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.1.0.tgz", "integrity": "sha512-A/NIrIED/G/IgU1XUukOA3WcFRxn2I4O5GxsYGA5nFlIi+UZWdGojs85I1VXkR1gX9eFnDXzjE6OtbgZHjFhIA==", - "dev": true, "requires": { "@ethersproject/logger": "^5.1.0" } @@ -16270,7 +16229,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.1.0.tgz", "integrity": "sha512-B8cUbHHTgs8OtgJIafrRcz/YPDobVd5Ru8gTnShOiM9EBuFpYHQpq3+8iQJ6pyczDu6HP/oc/njAsIBhwFZYew==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.1.0", "@ethersproject/sha2": "^5.1.0" @@ -16280,7 +16238,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.1.0.tgz", "integrity": "sha512-519KKTwgmH42AQL3+GFV3SX6khYEfHsvI6v8HYejlkigSDuqttdgVygFTDsGlofNFchhDwuclrxQnD5B0YLNMg==", - "dev": true, "requires": { "@ethersproject/logger": "^5.1.0" } @@ -16289,7 +16246,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.1.0.tgz", "integrity": "sha512-FjpZL2lSXrYpQDg2fMjugZ0HjQD9a+2fOOoRhhihh+Z+qi/xZ8vIlPoumrEP1DzIG4DBV6liUqLNqnX2C6FIAA==", - "dev": true, "requires": { "@ethersproject/abstract-provider": "^5.1.0", "@ethersproject/abstract-signer": "^5.1.0", @@ -16316,7 +16272,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", - "dev": true, "requires": {} } } @@ -16325,7 +16280,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.1.0.tgz", "integrity": "sha512-+uuczLQZ4+no9cP6TCoCktXx0u2YbNaRT7lRkSt12d8263e702f0u+4JnnRO8Qmv5nylWJebnqCHzyxP+6mLqw==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.1.0", "@ethersproject/logger": "^5.1.0" @@ -16335,7 +16289,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.1.0.tgz", "integrity": "sha512-vDTyHIwNPrecy55gKGZ47eJZhBm8LLBxihzi5ou+zrSvYTpkSTWRcKUlXFDFQVwfWB+P5PGyERAdiDEI76clxw==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.1.0", "@ethersproject/logger": "^5.1.0" @@ -16345,7 +16298,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.1.0.tgz", "integrity": "sha512-+fNSeZRstOpdRJpdGUkRONFCaiAqWkc91zXgg76Nlp5ndBQE25Kk5yK8gCPG1aGnCrbariiPr5j9DmrYH78JCA==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.1.0", "@ethersproject/logger": "^5.1.0", @@ -16356,7 +16308,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.0" @@ -16368,7 +16319,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.1.0.tgz", "integrity": "sha512-tE5LFlbmdObG8bY04NpuwPWSRPgEswfxweAI1sH7TbP0ml1elNfqcq7ii/3AvIN05i5U0Pkm3Tf8bramt8MmLw==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.1.0", "@ethersproject/logger": "^5.1.0", @@ -16381,7 +16331,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.1.0.tgz", "integrity": "sha512-kPodsGyo9zg1g9XSXp1lGhFaezBAUUsAUB1Vf6OkppE5Wksg4Et+x3kG4m7J/uShDMP2upkJtHNsIBK2XkVpKQ==", - "dev": true, "requires": { "@ethersproject/bignumber": "^5.1.0", "@ethersproject/bytes": "^5.1.0", @@ -16394,7 +16343,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.1.0.tgz", "integrity": "sha512-perBZy0RrmmL0ejiFGUOlBVjMsUceqLut3OBP3zP96LhiJWWbS8u1NqQVgN4/Gyrbziuda66DxiQocXhsvx+Sw==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.1.0", "@ethersproject/constants": "^5.1.0", @@ -16405,7 +16353,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.1.0.tgz", "integrity": "sha512-s10crRLZEA0Bgv6FGEl/AKkTw9f+RVUrlWDX1rHnD4ZncPFeiV2AJr4nT7QSUhxJdFPvjyKRDb3nEH27dIqcPQ==", - "dev": true, "requires": { "@ethersproject/address": "^5.1.0", "@ethersproject/bignumber": "^5.1.0", @@ -16422,7 +16369,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.1.0.tgz", "integrity": "sha512-isvJrx6qG0nKWfxsGORNjmOq/nh175fStfvRTA2xEKrGqx8JNJY83fswu4GkILowfriEM/eYpretfJnfzi7YhA==", - "dev": true, "requires": { "@ethersproject/bignumber": "^5.1.0", "@ethersproject/constants": "^5.1.0", @@ -16433,7 +16379,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.1.0.tgz", "integrity": "sha512-ULmUtiYQLTUS+y3DgkLzRhFEK10zMwmjOthnjiZxee3Q/MVwr3rnmuAnXIUZrPjna6hvUPnyRIdW5XuF0Ld0YQ==", - "dev": true, "requires": { "@ethersproject/abstract-provider": "^5.1.0", "@ethersproject/abstract-signer": "^5.1.0", @@ -16456,7 +16401,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.1.0.tgz", "integrity": "sha512-LTeluWgTq04+RNqAkVhpydPcRZK/kKxD2Vy7PYGrAD27ABO9kTqTBKwiOuzTyAHKUQHfnvZbXmxBXJAGViSDcA==", - "dev": true, "requires": { "@ethersproject/base64": "^5.1.0", "@ethersproject/bytes": "^5.1.0", @@ -16469,7 +16413,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.1.0.tgz", "integrity": "sha512-NsUCi/TpBb+oTFvMSccUkJGtp5o/84eOyqp5q5aBeiNBSLkYyw21znRn9mAmxZgySpxgruVgKbaapnYPgvctPQ==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.1.0", "@ethersproject/hash": "^5.1.0", @@ -16871,8 +16814,7 @@ "aes-js": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=", - "dev": true + "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" }, "agent-base": { "version": "6.0.2", @@ -17059,8 +17001,7 @@ "bech32": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "dev": true + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, "binary-extensions": { "version": "2.2.0", @@ -17807,7 +17748,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.1.0.tgz", "integrity": "sha512-2L6Ge6wMBw02FlRoCLg4E0Elt3khMNlW6ULawa10mMeeZToYJ5+uCfiuTuB+XZ6om1Y7wuO9ZzezP8FsU2M/+g==", - "dev": true, "requires": { "@ethersproject/abi": "5.1.0", "@ethersproject/abstract-provider": "5.1.0", @@ -19810,7 +19750,7 @@ "version": "2.2.3", "dev": true, "requires": { - "node-fetch": "^2.6.7", + "node-fetch": "2.1.2", "whatwg-fetch": "2.0.4" } }, @@ -21621,7 +21561,7 @@ "version": "4.1.0", "dev": true, "requires": { - "node-fetch": "^2.6.7" + "node-fetch": "~1.7.1" }, "dependencies": { "is-stream": { @@ -21629,7 +21569,7 @@ "dev": true }, "node-fetch": { - "version": "2.6.7", + "version": "1.7.3", "dev": true, "requires": { "encoding": "^0.1.11", @@ -22827,7 +22767,7 @@ "dev": true }, "node-fetch": { - "version": "2.6.7", + "version": "2.1.2", "dev": true }, "node-gyp-build": { @@ -26969,6 +26909,14 @@ } } }, + "solidity-create2-deployer": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/solidity-create2-deployer/-/solidity-create2-deployer-0.4.0.tgz", + "integrity": "sha512-bB5d8fPt4dWsOoRodrsyfWKcjiv77IFl84+e6EckMMGYlfL2ZFqUoMz6tnqqiUFrM9abF1p6dWFOgJ/3zVc8yQ==", + "requires": { + "ethers": "^5.0.14" + } + }, "sonic-boom": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", diff --git a/test/contract/package.json b/test/contract/package.json index 98733292..096d3b4e 100644 --- a/test/contract/package.json +++ b/test/contract/package.json @@ -15,7 +15,8 @@ "dependencies": { "@openzeppelin/contracts": "^4.0.0", "fastify": "^3.14.2", - "hardhat": "^2.2.0" + "hardhat": "^2.2.0", + "solidity-create2-deployer": "^0.4.0" }, "devDependencies": { "@nomiclabs/hardhat-ethers": "^2.0.2", diff --git a/test/contract/src/index.js b/test/contract/src/index.js index b20d54a2..0a5c1377 100644 --- a/test/contract/src/index.js +++ b/test/contract/src/index.js @@ -1,6 +1,14 @@ const fastify = require('fastify')({ logger: true }); const hre = require("hardhat"); +const { + deployContract, + isDeployed +} = require("solidity-create2-deployer"); + +const { getStorageSlotKey, deployCreate2Factory } = require('./utils'); + +const CREATE2_FACTORY_ADDRESS = '0x4a27c059FD7E383854Ea7DE6Be9c390a795f6eE3' // readiness check fastify.get('/v1/healthz', async (req, reply) => { @@ -63,6 +71,109 @@ fastify.get('/v1/sendEth', async (req, reply) => { } }); +fastify.get('/v1/deploySLVContract', async (req, reply) => { + const SLVToken = await hre.ethers.getContractFactory("SLVToken"); + const token = await SLVToken.deploy(); + const receipt = await token.deployTransaction.wait(); + + return { + address: token.address, + txHash: token.deployTransaction.hash, + blockNumber: receipt.blockNumber, + blockHash: receipt.blockHash, + } +}); + +fastify.get('/v1/destroySLVContract', async (req, reply) => { + const addr = req.query.addr; + + const SLVToken = await hre.ethers.getContractFactory("SLVToken"); + const token = SLVToken.attach(addr); + + const tx = await token.destroy(); + const receipt = await tx.wait(); + + return { + blockNumber: receipt.blockNumber, + } +}) + +fastify.get('/v1/incrementCountA', async (req, reply) => { + const addr = req.query.addr; + + const SLVToken = await hre.ethers.getContractFactory("SLVToken"); + const token = await SLVToken.attach(addr); + + const tx = await token.incrementCountA(); + const receipt = await tx.wait(); + + return { + blockNumber: receipt.blockNumber, + } +}); + +fastify.get('/v1/incrementCountB', async (req, reply) => { + const addr = req.query.addr; + + const SLVToken = await hre.ethers.getContractFactory("SLVToken"); + const token = await SLVToken.attach(addr); + + const tx = await token.incrementCountB(); + const receipt = await tx.wait(); + + return { + blockNumber: receipt.blockNumber, + } +}); + +fastify.get('/v1/getStorageKey', async (req, reply) => { + const contract = req.query.contract; + const label = req.query.label; + + const key = await getStorageSlotKey(contract, label) + + return { + key + } +}); + +fastify.get('/v1/create2Contract', async (req, reply) => { + const contract = req.query.contract; + const salt = req.query.salt; + + const provider = hre.ethers.provider; + const signer = await hre.ethers.getSigner(); + const isFactoryDeployed = await isDeployed(CREATE2_FACTORY_ADDRESS, provider); + + if (!isFactoryDeployed) { + await deployCreate2Factory(provider, signer) + } + + const contractFactory = await hre.ethers.getContractFactory(contract); + const bytecode = contractFactory.bytecode; + const constructorTypes = []; + const constructorArgs = []; + + const { txHash, address, receipt } = await deployContract({ + salt, + contractBytecode: bytecode, + constructorTypes: constructorTypes, + constructorArgs: constructorArgs, + signer + }); + + const success = await isDeployed(address, provider); + + if (success) { + return { + address, + txHash, + blockNumber: receipt.blockNumber, + blockHash: receipt.blockHash, + } + } +}); + async function main() { try { await fastify.listen(3000, '0.0.0.0'); @@ -72,4 +183,4 @@ async function main() { } } -main(); \ No newline at end of file +main(); diff --git a/test/contract/src/utils.js b/test/contract/src/utils.js new file mode 100644 index 00000000..e8f7bfa1 --- /dev/null +++ b/test/contract/src/utils.js @@ -0,0 +1,54 @@ +const { artifacts } = require("hardhat") +const { utils, BigNumber } = require("ethers") +const { deployFactory } = require("solidity-create2-deployer"); + +const CREATE2_FACTORY_ACCOUNT = '0x2287Fa6efdEc6d8c3E0f4612ce551dEcf89A357A'; + +async function getStorageLayout(contractName) { + const artifact = await artifacts.readArtifact(contractName); + const buildInfo = await artifacts.getBuildInfo(`${artifact.sourceName}:${artifact.contractName}`); + + if (!buildInfo) { + throw new Error('storageLayout not present in compiler output.'); + } + + const output = buildInfo.output; + const { storageLayout } = output.contracts[artifact.sourceName][artifact.contractName]; + + if (!storageLayout) { + throw new Error('Contract hasn\'t been compiled.'); + } + + return storageLayout; +}; + +async function getStorageSlotKey(contractName, variableName) { + storageLayout = await getStorageLayout(contractName) + + const { storage } = storageLayout; + const targetState = storage.find((state) => state.label === variableName); + + // Throw if state variable could not be found in storage layout. + if (!targetState) { + throw new Error('Variable not present in storage layout.'); + } + + key = utils.hexlify(BigNumber.from(targetState.slot)); + return key +}; + +async function deployCreate2Factory(provider, signer) { + // Send eth to account as required to deploy create2 factory contract. + let tx = { + to: CREATE2_FACTORY_ACCOUNT, + value: utils.parseEther('0.01') + } + + const txResponse = await signer.sendTransaction(tx); + await txResponse.wait() + + // Deploy create2 factory contract. + await deployFactory(provider) +} + +module.exports = { getStorageSlotKey, deployCreate2Factory } diff --git a/test/direct_proxy_integration_test.go b/test/direct_proxy_integration_test.go index 4256c18d..69c4746e 100644 --- a/test/direct_proxy_integration_test.go +++ b/test/direct_proxy_integration_test.go @@ -13,13 +13,15 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - "github.com/vulcanize/ipld-eth-server/pkg/eth" - integration "github.com/vulcanize/ipld-eth-server/test" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth" + integration "github.com/vulcanize/ipld-eth-server/v3/test" ) var _ = Describe("Integration test", func() { directProxyEthCalls, err := strconv.ParseBool(os.Getenv("ETH_FORWARD_ETH_CALLS")) Expect(err).To(BeNil()) + watchedAddressServiceEnabled, err := strconv.ParseBool(os.Getenv("WATCHED_ADDRESS_GAP_FILLER_ENABLED")) + Expect(err).To(BeNil()) gethHttpPath := "http://127.0.0.1:8545" gethClient, err := ethclient.Dial(gethHttpPath) Expect(err).ToNot(HaveOccurred()) @@ -38,11 +40,14 @@ var _ = Describe("Integration test", func() { var txErr error sleepInterval := 2 * time.Second + BeforeEach(func() { + if !directProxyEthCalls || watchedAddressServiceEnabled { + Skip("skipping direct-proxy-forwarding integration tests") + } + }) + Describe("get Block", func() { BeforeEach(func() { - if !directProxyEthCalls { - Skip("skipping direct-proxy-forwarding integration tests") - } contract, contractErr = integration.DeployContract() time.Sleep(sleepInterval) }) @@ -94,9 +99,6 @@ var _ = Describe("Integration test", func() { Describe("Transaction", func() { BeforeEach(func() { - if !directProxyEthCalls { - Skip("skipping direct-proxy-forwarding integration tests") - } contract, contractErr = integration.DeployContract() time.Sleep(sleepInterval) }) @@ -122,9 +124,6 @@ var _ = Describe("Integration test", func() { Describe("Receipt", func() { BeforeEach(func() { - if !directProxyEthCalls { - Skip("skipping direct-proxy-forwarding integration tests") - } contract, contractErr = integration.DeployContract() time.Sleep(sleepInterval) }) @@ -142,9 +141,6 @@ var _ = Describe("Integration test", func() { Describe("FilterLogs", func() { BeforeEach(func() { - if !directProxyEthCalls { - Skip("skipping direct-proxy-forwarding integration tests") - } contract, contractErr = integration.DeployContract() time.Sleep(sleepInterval) }) @@ -174,9 +170,6 @@ var _ = Describe("Integration test", func() { Describe("CodeAt", func() { BeforeEach(func() { - if !directProxyEthCalls { - Skip("skipping direct-proxy-forwarding integration tests") - } contract, contractErr = integration.DeployContract() time.Sleep(sleepInterval) }) @@ -224,9 +217,6 @@ var _ = Describe("Integration test", func() { Describe("Get balance", func() { address := "0x1111111111111111111111111111111111111112" BeforeEach(func() { - if !directProxyEthCalls { - Skip("skipping direct-proxy-forwarding integration tests") - } tx, txErr = integration.SendEth(address, "0.01") time.Sleep(sleepInterval) }) @@ -286,9 +276,6 @@ var _ = Describe("Integration test", func() { Describe("Get Storage", func() { BeforeEach(func() { - if !directProxyEthCalls { - Skip("skipping direct-proxy-forwarding integration tests") - } contract, contractErr = integration.DeployContract() erc20TotalSupply, bigIntResult = new(big.Int).SetString("1000000000000000000000", 10) @@ -392,9 +379,6 @@ var _ = Describe("Integration test", func() { Describe("eth call", func() { BeforeEach(func() { - if !directProxyEthCalls { - Skip("skipping direct-proxy-forwarding integration tests") - } contract, contractErr = integration.DeployContract() erc20TotalSupply, bigIntResult = new(big.Int).SetString("1000000000000000000000", 10) @@ -445,9 +429,6 @@ var _ = Describe("Integration test", func() { Describe("Chain ID", func() { It("Check chain id", func() { - if !directProxyEthCalls { - Skip("skipping direct-proxy-forwarding integration tests") - } _, err := gethClient.ChainID(ctx) Expect(err).ToNot(HaveOccurred()) diff --git a/test/helper.go b/test/helper.go index 5cd8ee2a..59b4db71 100644 --- a/test/helper.go +++ b/test/helper.go @@ -5,6 +5,9 @@ import ( "fmt" "math/big" "net/http" + + "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/statediff/types" ) type ContractDeployed struct { @@ -27,6 +30,14 @@ type Tx struct { BlockHash string `json:"blockHash"` } +type StorageKey struct { + Key string `json:"key"` +} + +type CountIncremented struct { + BlockNumber int64 `json:"blockNumber"` +} + const srvUrl = "http://localhost:3000" func DeployContract() (*ContractDeployed, error) { @@ -77,3 +88,100 @@ func SendEth(to string, value string) (*Tx, error) { return &tx, nil } + +func DeploySLVContract() (*ContractDeployed, error) { + res, err := http.Get(fmt.Sprintf("%s/v1/deploySLVContract", srvUrl)) + if err != nil { + return nil, err + } + defer res.Body.Close() + + var contract ContractDeployed + + decoder := json.NewDecoder(res.Body) + err = decoder.Decode(&contract) + if err != nil { + return nil, err + } + + return &contract, nil +} + +func DestroySLVContract(addr string) (*ContractDestroyed, error) { + res, err := http.Get(fmt.Sprintf("%s/v1/destroySLVContract?addr=%s", srvUrl, addr)) + if err != nil { + return nil, err + } + defer res.Body.Close() + + var data ContractDestroyed + decoder := json.NewDecoder(res.Body) + + return &data, decoder.Decode(&data) +} + +func IncrementCount(addr string, count string) (*CountIncremented, error) { + res, err := http.Get(fmt.Sprintf("%s/v1/incrementCount%s?addr=%s", srvUrl, count, addr)) + if err != nil { + return nil, err + } + + var blockNumber CountIncremented + + decoder := json.NewDecoder(res.Body) + err = decoder.Decode(&blockNumber) + if err != nil { + return nil, err + } + + return &blockNumber, nil +} + +func GetStorageSlotKey(contract string, label string) (*StorageKey, error) { + res, err := http.Get(fmt.Sprintf("%s/v1/getStorageKey?contract=%s&label=%s", srvUrl, contract, label)) + if err != nil { + return nil, err + } + defer res.Body.Close() + + var key StorageKey + + decoder := json.NewDecoder(res.Body) + err = decoder.Decode(&key) + if err != nil { + return nil, err + } + + return &key, nil +} + +func ClearWatchedAddresses(gethRPCClient *rpc.Client) error { + gethMethod := "statediff_watchAddress" + args := []types.WatchAddressArg{} + + // Clear watched addresses + gethErr := gethRPCClient.Call(nil, gethMethod, types.Clear, args) + if gethErr != nil { + return gethErr + } + + return nil +} + +func Create2Contract(contractName string, salt string) (*ContractDeployed, error) { + res, err := http.Get(fmt.Sprintf("%s/v1/create2Contract?contract=%s&salt=%s", srvUrl, contractName, salt)) + if err != nil { + return nil, err + } + defer res.Body.Close() + + var contract ContractDeployed + + decoder := json.NewDecoder(res.Body) + err = decoder.Decode(&contract) + if err != nil { + return nil, err + } + + return &contract, nil +} diff --git a/test/integration_test.go b/test/integration_test.go index 9abaaaff..fa5eb6b1 100644 --- a/test/integration_test.go +++ b/test/integration_test.go @@ -16,8 +16,8 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - "github.com/vulcanize/ipld-eth-server/pkg/eth" - integration "github.com/vulcanize/ipld-eth-server/test" + "github.com/vulcanize/ipld-eth-server/v3/pkg/eth" + integration "github.com/vulcanize/ipld-eth-server/v3/test" ) const nonExistingBlockHash = "0x111111111111111111111111111111111111111111111111111111111111111" @@ -31,6 +31,8 @@ var ( var _ = Describe("Integration test", func() { directProxyEthCalls, err := strconv.ParseBool(os.Getenv("ETH_FORWARD_ETH_CALLS")) Expect(err).To(BeNil()) + watchedAddressServiceEnabled, err := strconv.ParseBool(os.Getenv("WATCHED_ADDRESS_GAP_FILLER_ENABLED")) + Expect(err).To(BeNil()) gethHttpPath := "http://127.0.0.1:8545" gethClient, err := ethclient.Dial(gethHttpPath) Expect(err).ToNot(HaveOccurred()) @@ -49,11 +51,14 @@ var _ = Describe("Integration test", func() { var txErr error sleepInterval := 2 * time.Second + BeforeEach(func() { + if directProxyEthCalls || watchedAddressServiceEnabled { + Skip("skipping no-direct-proxy-forwarding integration tests") + } + }) + Describe("get Block", func() { BeforeEach(func() { - if directProxyEthCalls { - Skip("skipping no-direct-proxy-forwarding integration tests") - } contract, contractErr = integration.DeployContract() time.Sleep(sleepInterval) }) @@ -123,9 +128,6 @@ var _ = Describe("Integration test", func() { Describe("Transaction", func() { BeforeEach(func() { - if directProxyEthCalls { - Skip("skipping no-direct-proxy-forwarding integration tests") - } contract, contractErr = integration.DeployContract() time.Sleep(sleepInterval) }) @@ -157,9 +159,6 @@ var _ = Describe("Integration test", func() { Describe("Receipt", func() { BeforeEach(func() { - if directProxyEthCalls { - Skip("skipping no-direct-proxy-forwarding integration tests") - } contract, contractErr = integration.DeployContract() time.Sleep(sleepInterval) }) @@ -187,9 +186,6 @@ var _ = Describe("Integration test", func() { Describe("FilterLogs", func() { BeforeEach(func() { - if directProxyEthCalls { - Skip("skipping no-direct-proxy-forwarding integration tests") - } contract, contractErr = integration.DeployContract() time.Sleep(sleepInterval) }) @@ -220,9 +216,6 @@ var _ = Describe("Integration test", func() { Describe("CodeAt", func() { BeforeEach(func() { - if directProxyEthCalls { - Skip("skipping no-direct-proxy-forwarding integration tests") - } contract, contractErr = integration.DeployContract() time.Sleep(sleepInterval) }) @@ -270,9 +263,6 @@ var _ = Describe("Integration test", func() { Describe("Get balance", func() { address := "0x1111111111111111111111111111111111111112" BeforeEach(func() { - if directProxyEthCalls { - Skip("skipping no-direct-proxy-forwarding integration tests") - } tx, txErr = integration.SendEth(address, "0.01") time.Sleep(sleepInterval) }) @@ -335,10 +325,12 @@ var _ = Describe("Integration test", func() { }) Describe("Get Storage", func() { + var slvContract *integration.ContractDeployed + var slvCountA *big.Int + + contractSalt := "SLVContractSalt" + BeforeEach(func() { - if directProxyEthCalls { - Skip("skipping no-direct-proxy-forwarding integration tests") - } contract, contractErr = integration.DeployContract() erc20TotalSupply, bigIntResult = new(big.Int).SetString("1000000000000000000000", 10) @@ -418,12 +410,48 @@ var _ = Describe("Integration test", func() { Expect(gethStorage).To(Equal(ipldStorage)) }) + It("get storage for SLV countA after tx", func() { + slvContract, contractErr = integration.Create2Contract("SLVToken", contractSalt) + Expect(contractErr).ToNot(HaveOccurred()) + countAIndex := "0x5" + + time.Sleep(sleepInterval) + + gethStorage, err := gethClient.StorageAt(ctx, common.HexToAddress(slvContract.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + + gethCountA := new(big.Int).SetBytes(gethStorage) + slvCountA = gethCountA + + ipldStorage, err := ipldClient.StorageAt(ctx, common.HexToAddress(slvContract.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + + ipldCountA := new(big.Int).SetBytes(ipldStorage) + Expect(ipldCountA.String()).To(Equal(slvCountA.String())) + + _, txErr = integration.IncrementCount(slvContract.Address, "A") + Expect(txErr).ToNot(HaveOccurred()) + slvCountA.Add(slvCountA, big.NewInt(1)) + + time.Sleep(sleepInterval) + + ipldStorage, err = ipldClient.StorageAt(ctx, common.HexToAddress(slvContract.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + + ipldCountA = new(big.Int).SetBytes(ipldStorage) + Expect(ipldCountA.String()).To(Equal(slvCountA.String())) + }) + It("get storage after self destruct", func() { totalSupplyIndex := "0x2" + countAIndex := "0x5" tx, err := integration.DestroyContract(contract.Address) Expect(err).ToNot(HaveOccurred()) + slvTx, err := integration.DestroyContract(slvContract.Address) + Expect(err).ToNot(HaveOccurred()) + time.Sleep(sleepInterval) gethStorage1, err := gethClient.StorageAt(ctx, common.HexToAddress(contract.Address), common.HexToHash(totalSupplyIndex), big.NewInt(tx.BlockNumber-1)) @@ -447,14 +475,44 @@ var _ = Describe("Integration test", func() { Expect(err).ToNot(HaveOccurred()) Expect(ipldStorage2).To(Equal(ipldStorage3)) + + // Check for SLV contract + gethStorage, err := gethClient.StorageAt(ctx, common.HexToAddress(slvContract.Address), common.HexToHash(countAIndex), big.NewInt(slvTx.BlockNumber)) + Expect(err).ToNot(HaveOccurred()) + Expect(gethStorage).To(Equal(eth.EmptyNodeValue)) + + ipldStorage, err := ipldClient.StorageAt(ctx, common.HexToAddress(slvContract.Address), common.HexToHash(countAIndex), big.NewInt(slvTx.BlockNumber)) + Expect(err).ToNot(HaveOccurred()) + Expect(ipldStorage).To(Equal(gethStorage)) + + slvCountA.Set(big.NewInt(0)) + }) + + It("get storage after redeploying", func() { + slvContract, contractErr = integration.Create2Contract("SLVToken", contractSalt) + Expect(contractErr).ToNot(HaveOccurred()) + time.Sleep(sleepInterval) + + countAIndex := "0x5" + + gethStorage, err := gethClient.StorageAt(ctx, common.HexToAddress(slvContract.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + + gethCountA := new(big.Int).SetBytes(gethStorage) + Expect(gethCountA.String()).To(Equal(slvCountA.String())) + + ipldStorage, err := ipldClient.StorageAt(ctx, common.HexToAddress(slvContract.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + + ipldCountA := new(big.Int).SetBytes(ipldStorage) + Expect(ipldCountA.String()).To(Equal(slvCountA.String())) + + Expect(gethStorage).To(Equal(ipldStorage)) }) }) Describe("eth call", func() { BeforeEach(func() { - if directProxyEthCalls { - Skip("skipping no-direct-proxy-forwarding integration tests") - } contract, contractErr = integration.DeployContract() erc20TotalSupply, bigIntResult = new(big.Int).SetString("1000000000000000000000", 10) @@ -505,9 +563,6 @@ var _ = Describe("Integration test", func() { Describe("Chain ID", func() { It("Check chain id", func() { - if directProxyEthCalls { - Skip("skipping no-direct-proxy-forwarding integration tests") - } gethChainId, err := gethClient.ChainID(ctx) Expect(err).ToNot(HaveOccurred()) @@ -537,7 +592,7 @@ func compareTxs(tx1 *types.Transaction, tx2 *types.Transaction) { Expect(tx1.Hash()).To(Equal(tx2.Hash())) Expect(tx1.Size()).To(Equal(tx2.Size())) - signer := types.NewEIP155Signer(big.NewInt(4)) + signer := types.NewEIP155Signer(big.NewInt(99)) gethSender, err := types.Sender(signer, tx1) Expect(err).ToNot(HaveOccurred()) diff --git a/test/watch_address_integration_test.go b/test/watch_address_integration_test.go new file mode 100644 index 00000000..b8e5f049 --- /dev/null +++ b/test/watch_address_integration_test.go @@ -0,0 +1,674 @@ +package integration_test + +import ( + "context" + "math/big" + "os" + "strconv" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/statediff/types" + sdtypes "github.com/ethereum/go-ethereum/statediff/types" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + integration "github.com/vulcanize/ipld-eth-server/v3/test" +) + +var ( + gethMethod = "statediff_watchAddress" + ipldMethod = "vdb_watchAddress" + + sleepInterval = 2 * time.Second +) + +var _ = Describe("WatchAddress integration test", func() { + dbWrite, err := strconv.ParseBool(os.Getenv("DB_WRITE")) + Expect(err).To(BeNil()) + + watchedAddressServiceEnabled, err := strconv.ParseBool(os.Getenv("WATCHED_ADDRESS_GAP_FILLER_ENABLED")) + Expect(err).To(BeNil()) + + gethHttpPath := "http://127.0.0.1:8545" + gethRPCClient, err := rpc.Dial(gethHttpPath) + Expect(err).ToNot(HaveOccurred()) + + ipldEthHttpPath := "http://127.0.0.1:8081" + ipldClient, err := ethclient.Dial(ipldEthHttpPath) + Expect(err).ToNot(HaveOccurred()) + ipldRPCClient, err := rpc.Dial(ipldEthHttpPath) + Expect(err).ToNot(HaveOccurred()) + + var ( + ctx = context.Background() + + txErr error + contractErr error + incErr error + + contract1 *integration.ContractDeployed + contract2 *integration.ContractDeployed + contract3 *integration.ContractDeployed + + countAIndex string + + prevBalance1 *big.Int + prevBalance2 *big.Int + prevBalance3 *big.Int + + actualBalance1 *big.Int + actualBalance2 *big.Int + actualBalance3 *big.Int + + prevCountA1 *big.Int + prevCountA2 *big.Int + prevCountA3 *big.Int + + actualCountA1 *big.Int + actualCountA2 *big.Int + actualCountA3 *big.Int + ) + + BeforeEach(func() { + if !dbWrite || watchedAddressServiceEnabled { + Skip("skipping WatchAddress API integration tests") + } + }) + + It("test init", func() { + // Deploy three contracts + contract1, contractErr = integration.DeploySLVContract() + Expect(contractErr).ToNot(HaveOccurred()) + + contract2, contractErr = integration.DeploySLVContract() + Expect(contractErr).ToNot(HaveOccurred()) + + contract3, contractErr = integration.DeploySLVContract() + Expect(contractErr).ToNot(HaveOccurred()) + + // Get the storage slot key + storageSlotAKey, err := integration.GetStorageSlotKey("SLVToken", "countA") + Expect(err).ToNot(HaveOccurred()) + countAIndex = storageSlotAKey.Key + + // Clear out watched addresses + err = integration.ClearWatchedAddresses(gethRPCClient) + Expect(err).ToNot(HaveOccurred()) + + // Get initial balances for all the contracts + // Contract 1 + actualBalance1 = big.NewInt(0) + initBalance1, err := ipldClient.BalanceAt(ctx, common.HexToAddress(contract1.Address), nil) + Expect(err).ToNot(HaveOccurred()) + Expect(initBalance1.String()).To(Equal(actualBalance1.String())) + prevBalance1 = big.NewInt(0) + + // Contract 2 + actualBalance2 = big.NewInt(0) + initBalance2, err := ipldClient.BalanceAt(ctx, common.HexToAddress(contract2.Address), nil) + Expect(err).ToNot(HaveOccurred()) + Expect(initBalance2.String()).To(Equal(actualBalance2.String())) + prevBalance2 = big.NewInt(0) + + // Contract 3 + actualBalance3 = big.NewInt(0) + initBalance3, err := ipldClient.BalanceAt(ctx, common.HexToAddress(contract3.Address), nil) + Expect(err).ToNot(HaveOccurred()) + Expect(initBalance3.String()).To(Equal(actualBalance3.String())) + prevBalance3 = big.NewInt(0) + + // Get initial storage values for the contracts + // Contract 1, countA + actualCountA1 = big.NewInt(0) + ipldCountA1Storage, err := ipldClient.StorageAt(ctx, common.HexToAddress(contract1.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + ipldCountA1 := new(big.Int).SetBytes(ipldCountA1Storage) + Expect(ipldCountA1.String()).To(Equal(actualCountA1.String())) + prevCountA1 = big.NewInt(0) + + // Contract 2, countA + actualCountA2 = big.NewInt(0) + ipldCountA2Storage, err := ipldClient.StorageAt(ctx, common.HexToAddress(contract2.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + ipldCountA2 := new(big.Int).SetBytes(ipldCountA2Storage) + Expect(ipldCountA2.String()).To(Equal(actualCountA2.String())) + prevCountA2 = big.NewInt(0) + + // Contract 3, countA + actualCountA3 = big.NewInt(0) + ipldCountA3Storage, err := ipldClient.StorageAt(ctx, common.HexToAddress(contract3.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + ipldCountA3 := new(big.Int).SetBytes(ipldCountA3Storage) + Expect(ipldCountA3.String()).To(Equal(actualCountA2.String())) + prevCountA3 = big.NewInt(0) + }) + + defer It("test cleanup", func() { + // Clear out watched addresses + err := integration.ClearWatchedAddresses(gethRPCClient) + Expect(err).ToNot(HaveOccurred()) + }) + + Context("no contracts being watched", func() { + It("indexes state for all the contracts", func() { + // WatchedAddresses = [] + // Send eth to all three contract accounts + // Contract 1 + _, txErr = integration.SendEth(contract1.Address, "0.01") + time.Sleep(sleepInterval) + Expect(txErr).ToNot(HaveOccurred()) + actualBalance1.Add(actualBalance1, big.NewInt(10000000000000000)) + + balance1AfterTransfer, err := ipldClient.BalanceAt(ctx, common.HexToAddress(contract1.Address), nil) + Expect(err).ToNot(HaveOccurred()) + Expect(balance1AfterTransfer.String()).To(Equal(actualBalance1.String())) + prevBalance1.Set(actualBalance1) + + // Contract 2 + _, txErr = integration.SendEth(contract2.Address, "0.01") + time.Sleep(sleepInterval) + Expect(txErr).ToNot(HaveOccurred()) + actualBalance2.Add(actualBalance2, big.NewInt(10000000000000000)) + + balance2AfterTransfer, err := ipldClient.BalanceAt(ctx, common.HexToAddress(contract2.Address), nil) + Expect(err).ToNot(HaveOccurred()) + Expect(balance2AfterTransfer.String()).To(Equal(actualBalance2.String())) + prevBalance2.Set(actualBalance2) + + // Contract 3 + _, txErr = integration.SendEth(contract3.Address, "0.01") + time.Sleep(sleepInterval) + Expect(txErr).ToNot(HaveOccurred()) + actualBalance3.Add(actualBalance3, big.NewInt(10000000000000000)) + + balance3AfterTransfer, err := ipldClient.BalanceAt(ctx, common.HexToAddress(contract3.Address), nil) + Expect(err).ToNot(HaveOccurred()) + Expect(balance3AfterTransfer.String()).To(Equal(actualBalance3.String())) + prevBalance3.Set(actualBalance3) + + // Increment counts + // Contract 1, countA + _, incErr = integration.IncrementCount(contract1.Address, "A") + time.Sleep(sleepInterval) + Expect(incErr).ToNot(HaveOccurred()) + actualCountA1.Add(actualCountA1, big.NewInt(1)) + + countA1AfterIncrementStorage, err := ipldClient.StorageAt(ctx, common.HexToAddress(contract1.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA1AfterIncrement := new(big.Int).SetBytes(countA1AfterIncrementStorage) + Expect(countA1AfterIncrement.String()).To(Equal(actualCountA1.String())) + prevCountA1.Set(actualCountA1) + + // Contract 2, countA + _, incErr = integration.IncrementCount(contract2.Address, "A") + time.Sleep(sleepInterval) + Expect(incErr).ToNot(HaveOccurred()) + actualCountA2.Add(actualCountA2, big.NewInt(1)) + + countA2AfterIncrementStorage, err := ipldClient.StorageAt(ctx, common.HexToAddress(contract2.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA2AfterIncrement := new(big.Int).SetBytes(countA2AfterIncrementStorage) + Expect(countA2AfterIncrement.String()).To(Equal(actualCountA2.String())) + prevCountA2.Set(actualCountA2) + + // Contract 3, countA + _, incErr = integration.IncrementCount(contract3.Address, "A") + time.Sleep(sleepInterval) + Expect(incErr).ToNot(HaveOccurred()) + actualCountA3.Add(actualCountA3, big.NewInt(1)) + + countA3AfterIncrementStorage, err := ipldClient.StorageAt(ctx, common.HexToAddress(contract3.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA3AfterIncrement := new(big.Int).SetBytes(countA3AfterIncrementStorage) + Expect(countA3AfterIncrement.String()).To(Equal(actualCountA3.String())) + prevCountA3.Set(actualCountA3) + }) + }) + + Context("one contract being watched", func() { + It("indexes state only for the watched contract", func() { + operation := types.Add + args := []types.WatchAddressArg{ + { + Address: contract1.Address, + CreatedAt: uint64(contract1.BlockNumber), + }, + } + ipldErr := ipldRPCClient.Call(nil, ipldMethod, operation, args) + Expect(ipldErr).ToNot(HaveOccurred()) + + // WatchedAddresses = [Contract1] + // Send eth to all three contract accounts + // Contract 1 + _, txErr = integration.SendEth(contract1.Address, "0.01") + time.Sleep(sleepInterval) + Expect(txErr).ToNot(HaveOccurred()) + actualBalance1.Add(actualBalance1, big.NewInt(10000000000000000)) + + balance1AfterTransfer, err := ipldClient.BalanceAt(ctx, common.HexToAddress(contract1.Address), nil) + Expect(err).ToNot(HaveOccurred()) + Expect(balance1AfterTransfer.String()).To(Equal(actualBalance1.String())) + prevBalance1.Set(actualBalance1) + + // Contract 2 + _, txErr = integration.SendEth(contract2.Address, "0.01") + time.Sleep(sleepInterval) + Expect(txErr).ToNot(HaveOccurred()) + actualBalance2.Add(actualBalance2, big.NewInt(10000000000000000)) + + balance2AfterTransfer, err := ipldClient.BalanceAt(ctx, common.HexToAddress(contract2.Address), nil) + Expect(err).ToNot(HaveOccurred()) + Expect(balance2AfterTransfer.String()).To(Equal(prevBalance2.String())) + + // Contract 3 + _, txErr = integration.SendEth(contract3.Address, "0.01") + time.Sleep(sleepInterval) + Expect(txErr).ToNot(HaveOccurred()) + actualBalance3.Add(actualBalance3, big.NewInt(10000000000000000)) + + balance3AfterTransfer, err := ipldClient.BalanceAt(ctx, common.HexToAddress(contract3.Address), nil) + Expect(err).ToNot(HaveOccurred()) + Expect(balance3AfterTransfer.String()).To(Equal(prevBalance3.String())) + + // Increment counts + // Contract 1, countA + _, incErr = integration.IncrementCount(contract1.Address, "A") + time.Sleep(sleepInterval) + Expect(incErr).ToNot(HaveOccurred()) + actualCountA1.Add(actualCountA1, big.NewInt(1)) + + countA1AfterIncrementStorage, err := ipldClient.StorageAt(ctx, common.HexToAddress(contract1.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA1AfterIncrement := new(big.Int).SetBytes(countA1AfterIncrementStorage) + Expect(countA1AfterIncrement.String()).To(Equal(actualCountA1.String())) + prevCountA1.Set(actualCountA1) + + // Contract 2, countA + _, incErr = integration.IncrementCount(contract2.Address, "A") + time.Sleep(sleepInterval) + Expect(incErr).ToNot(HaveOccurred()) + actualCountA2.Add(actualCountA2, big.NewInt(1)) + + countA2AfterIncrementStorage, err := ipldClient.StorageAt(ctx, common.HexToAddress(contract2.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA2AfterIncrement := new(big.Int).SetBytes(countA2AfterIncrementStorage) + Expect(countA2AfterIncrement.String()).To(Equal(prevCountA2.String())) + + // Contract 3, countA + _, incErr = integration.IncrementCount(contract3.Address, "A") + time.Sleep(sleepInterval) + Expect(incErr).ToNot(HaveOccurred()) + actualCountA3.Add(actualCountA3, big.NewInt(1)) + + countA3AfterIncrementStorage, err := ipldClient.StorageAt(ctx, common.HexToAddress(contract3.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA3AfterIncrement := new(big.Int).SetBytes(countA3AfterIncrementStorage) + Expect(countA3AfterIncrement.String()).To(Equal(prevCountA3.String())) + }) + }) + + Context("contract added to a non-empty watch-list", func() { + It("indexes state only for the watched contracts", func() { + operation := types.Add + args := []types.WatchAddressArg{ + { + Address: contract2.Address, + CreatedAt: uint64(contract2.BlockNumber), + }, + } + ipldErr := ipldRPCClient.Call(nil, ipldMethod, operation, args) + Expect(ipldErr).ToNot(HaveOccurred()) + + // WatchedAddresses = [Contract1, Contract2] + // Send eth to all three contract accounts + // Contract 1 + _, txErr = integration.SendEth(contract1.Address, "0.01") + time.Sleep(sleepInterval) + Expect(txErr).ToNot(HaveOccurred()) + actualBalance1.Add(actualBalance1, big.NewInt(10000000000000000)) + + balance1AfterTransfer, err := ipldClient.BalanceAt(ctx, common.HexToAddress(contract1.Address), nil) + Expect(err).ToNot(HaveOccurred()) + Expect(balance1AfterTransfer.String()).To(Equal(actualBalance1.String())) + prevBalance1.Set(actualBalance1) + + // Contract 2 + _, txErr = integration.SendEth(contract2.Address, "0.01") + time.Sleep(sleepInterval) + Expect(txErr).ToNot(HaveOccurred()) + actualBalance2.Add(actualBalance2, big.NewInt(10000000000000000)) + + balance2AfterTransfer, err := ipldClient.BalanceAt(ctx, common.HexToAddress(contract2.Address), nil) + Expect(err).ToNot(HaveOccurred()) + Expect(balance2AfterTransfer.String()).To(Equal(actualBalance2.String())) + prevBalance2.Set(actualBalance2) + + // Contract 3 + _, txErr = integration.SendEth(contract3.Address, "0.01") + time.Sleep(sleepInterval) + Expect(txErr).ToNot(HaveOccurred()) + actualBalance3.Add(actualBalance3, big.NewInt(10000000000000000)) + + balance3AfterTransfer, err := ipldClient.BalanceAt(ctx, common.HexToAddress(contract3.Address), nil) + Expect(err).ToNot(HaveOccurred()) + Expect(balance3AfterTransfer.String()).To(Equal(prevBalance3.String())) + + // Increment counts + // Contract 1, countA + _, incErr = integration.IncrementCount(contract1.Address, "A") + time.Sleep(sleepInterval) + Expect(incErr).ToNot(HaveOccurred()) + actualCountA1.Add(actualCountA1, big.NewInt(1)) + + countA1AfterIncrementStorage, err := ipldClient.StorageAt(ctx, common.HexToAddress(contract1.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA1AfterIncrement := new(big.Int).SetBytes(countA1AfterIncrementStorage) + Expect(countA1AfterIncrement.String()).To(Equal(actualCountA1.String())) + prevCountA1.Set(actualCountA1) + + // Contract 2, countA + _, incErr = integration.IncrementCount(contract2.Address, "A") + time.Sleep(sleepInterval) + Expect(incErr).ToNot(HaveOccurred()) + actualCountA2.Add(actualCountA2, big.NewInt(1)) + + countA2AfterIncrementStorage, err := ipldClient.StorageAt(ctx, common.HexToAddress(contract2.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA2AfterIncrement := new(big.Int).SetBytes(countA2AfterIncrementStorage) + Expect(countA2AfterIncrement.String()).To(Equal(actualCountA2.String())) + prevCountA2.Set(actualCountA2) + + // Contract 3, countA + _, incErr = integration.IncrementCount(contract3.Address, "A") + time.Sleep(sleepInterval) + Expect(incErr).ToNot(HaveOccurred()) + actualCountA3.Add(actualCountA3, big.NewInt(1)) + + countA3AfterIncrementStorage, err := ipldClient.StorageAt(ctx, common.HexToAddress(contract3.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA3AfterIncrement := new(big.Int).SetBytes(countA3AfterIncrementStorage) + Expect(countA3AfterIncrement.String()).To(Equal(prevCountA3.String())) + }) + }) + + Context("contract removed from the watch-list", func() { + It("indexes state only for the watched contract", func() { + operation := types.Remove + args := []types.WatchAddressArg{ + { + Address: contract1.Address, + CreatedAt: uint64(contract1.BlockNumber), + }, + } + ipldErr := ipldRPCClient.Call(nil, ipldMethod, operation, args) + Expect(ipldErr).ToNot(HaveOccurred()) + + // WatchedAddresses = [Contract2] + // Send eth to all three contract accounts + // Contract 1 + _, txErr = integration.SendEth(contract1.Address, "0.01") + time.Sleep(sleepInterval) + Expect(txErr).ToNot(HaveOccurred()) + actualBalance1.Add(actualBalance1, big.NewInt(10000000000000000)) + + balance1AfterTransfer, err := ipldClient.BalanceAt(ctx, common.HexToAddress(contract1.Address), nil) + Expect(err).ToNot(HaveOccurred()) + Expect(balance1AfterTransfer.String()).To(Equal(prevBalance1.String())) + + // Contract 2 + _, txErr = integration.SendEth(contract2.Address, "0.01") + time.Sleep(sleepInterval) + Expect(txErr).ToNot(HaveOccurred()) + actualBalance2.Add(actualBalance2, big.NewInt(10000000000000000)) + + balance2AfterTransfer, err := ipldClient.BalanceAt(ctx, common.HexToAddress(contract2.Address), nil) + Expect(err).ToNot(HaveOccurred()) + Expect(balance2AfterTransfer.String()).To(Equal(actualBalance2.String())) + prevBalance2.Set(actualBalance2) + + // Contract 3 + _, txErr = integration.SendEth(contract3.Address, "0.01") + time.Sleep(sleepInterval) + Expect(txErr).ToNot(HaveOccurred()) + actualBalance3.Add(actualBalance3, big.NewInt(10000000000000000)) + + balance3AfterTransfer, err := ipldClient.BalanceAt(ctx, common.HexToAddress(contract3.Address), nil) + Expect(err).ToNot(HaveOccurred()) + Expect(balance3AfterTransfer.String()).To(Equal(prevBalance3.String())) + + // Increment counts + // Contract 1, countA + _, incErr = integration.IncrementCount(contract1.Address, "A") + time.Sleep(sleepInterval) + Expect(incErr).ToNot(HaveOccurred()) + actualCountA1.Add(actualCountA1, big.NewInt(1)) + + countA1AfterIncrementStorage, err := ipldClient.StorageAt(ctx, common.HexToAddress(contract1.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA1AfterIncrement := new(big.Int).SetBytes(countA1AfterIncrementStorage) + Expect(countA1AfterIncrement.String()).To(Equal(prevCountA1.String())) + + // Contract 2, countA + _, incErr = integration.IncrementCount(contract2.Address, "A") + time.Sleep(sleepInterval) + Expect(incErr).ToNot(HaveOccurred()) + actualCountA2.Add(actualCountA2, big.NewInt(1)) + + countA2AfterIncrementStorage, err := ipldClient.StorageAt(ctx, common.HexToAddress(contract2.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA2AfterIncrement := new(big.Int).SetBytes(countA2AfterIncrementStorage) + Expect(countA2AfterIncrement.String()).To(Equal(actualCountA2.String())) + prevCountA2.Set(actualCountA2) + + // Contract 3, countA + _, incErr = integration.IncrementCount(contract3.Address, "A") + time.Sleep(sleepInterval) + Expect(incErr).ToNot(HaveOccurred()) + actualCountA3.Add(actualCountA3, big.NewInt(1)) + + countA3AfterIncrementStorage, err := ipldClient.StorageAt(ctx, common.HexToAddress(contract3.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA3AfterIncrement := new(big.Int).SetBytes(countA3AfterIncrementStorage) + Expect(countA3AfterIncrement.String()).To(Equal(prevCountA3.String())) + }) + }) + + Context("list of watched addresses set", func() { + It("indexes state only for the watched contracts", func() { + operation := types.Set + args := []types.WatchAddressArg{ + { + Address: contract1.Address, + CreatedAt: uint64(contract1.BlockNumber), + }, + { + Address: contract3.Address, + CreatedAt: uint64(contract3.BlockNumber), + }, + } + ipldErr := ipldRPCClient.Call(nil, ipldMethod, operation, args) + Expect(ipldErr).ToNot(HaveOccurred()) + + // WatchedAddresses = [Contract1, Contract3] + // Send eth to all three contract accounts + // Contract 1 + _, txErr = integration.SendEth(contract1.Address, "0.01") + time.Sleep(sleepInterval) + Expect(txErr).ToNot(HaveOccurred()) + actualBalance1.Add(actualBalance1, big.NewInt(10000000000000000)) + + balance1AfterTransfer, err := ipldClient.BalanceAt(ctx, common.HexToAddress(contract1.Address), nil) + Expect(err).ToNot(HaveOccurred()) + Expect(balance1AfterTransfer.String()).To(Equal(actualBalance1.String())) + prevBalance1.Set(actualBalance1) + + // Contract 2 + _, txErr = integration.SendEth(contract2.Address, "0.01") + time.Sleep(sleepInterval) + Expect(txErr).ToNot(HaveOccurred()) + actualBalance2.Add(actualBalance2, big.NewInt(10000000000000000)) + + balance2AfterTransfer, err := ipldClient.BalanceAt(ctx, common.HexToAddress(contract2.Address), nil) + Expect(err).ToNot(HaveOccurred()) + Expect(balance2AfterTransfer.String()).To(Equal(prevBalance2.String())) + + // Contract 3 + _, txErr = integration.SendEth(contract3.Address, "0.01") + time.Sleep(sleepInterval) + Expect(txErr).ToNot(HaveOccurred()) + actualBalance3.Add(actualBalance3, big.NewInt(10000000000000000)) + + balance3AfterTransfer, err := ipldClient.BalanceAt(ctx, common.HexToAddress(contract3.Address), nil) + Expect(err).ToNot(HaveOccurred()) + Expect(balance3AfterTransfer.String()).To(Equal(actualBalance3.String())) + prevBalance3.Set(actualBalance3) + + // Increment counts + // Contract 1, countA + _, incErr = integration.IncrementCount(contract1.Address, "A") + time.Sleep(sleepInterval) + Expect(incErr).ToNot(HaveOccurred()) + actualCountA1.Add(actualCountA1, big.NewInt(1)) + + countA1AfterIncrementStorage, err := ipldClient.StorageAt(ctx, common.HexToAddress(contract1.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA1AfterIncrement := new(big.Int).SetBytes(countA1AfterIncrementStorage) + Expect(countA1AfterIncrement.String()).To(Equal(actualCountA1.String())) + prevCountA1.Set(actualCountA1) + + // Contract 2, countA + _, incErr = integration.IncrementCount(contract2.Address, "A") + time.Sleep(sleepInterval) + Expect(incErr).ToNot(HaveOccurred()) + actualCountA2.Add(actualCountA2, big.NewInt(1)) + + countA2AfterIncrementStorage, err := ipldClient.StorageAt(ctx, common.HexToAddress(contract2.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA2AfterIncrement := new(big.Int).SetBytes(countA2AfterIncrementStorage) + Expect(countA2AfterIncrement.String()).To(Equal(prevCountA2.String())) + + // Contract 3, countA + _, incErr = integration.IncrementCount(contract3.Address, "A") + time.Sleep(sleepInterval) + Expect(incErr).ToNot(HaveOccurred()) + actualCountA3.Add(actualCountA3, big.NewInt(1)) + + countA3AfterIncrementStorage, err := ipldClient.StorageAt(ctx, common.HexToAddress(contract3.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA3AfterIncrement := new(big.Int).SetBytes(countA3AfterIncrementStorage) + Expect(countA3AfterIncrement.String()).To(Equal(actualCountA3.String())) + prevCountA3.Set(actualCountA3) + }) + }) + + Context("list of watched addresses cleared", func() { + It("indexes state for all the contracts", func() { + operation := types.Clear + args := []types.WatchAddressArg{} + ipldErr := ipldRPCClient.Call(nil, ipldMethod, operation, args) + Expect(ipldErr).ToNot(HaveOccurred()) + + // WatchedAddresses = [] + // Send eth to all three contract accounts + // Contract 1 + _, txErr = integration.SendEth(contract1.Address, "0.01") + time.Sleep(sleepInterval) + Expect(txErr).ToNot(HaveOccurred()) + actualBalance1.Add(actualBalance1, big.NewInt(10000000000000000)) + + balance1AfterTransfer, err := ipldClient.BalanceAt(ctx, common.HexToAddress(contract1.Address), nil) + Expect(err).ToNot(HaveOccurred()) + Expect(balance1AfterTransfer.String()).To(Equal(actualBalance1.String())) + prevBalance1.Set(actualBalance1) + + // Contract 2 + _, txErr = integration.SendEth(contract2.Address, "0.01") + time.Sleep(sleepInterval) + Expect(txErr).ToNot(HaveOccurred()) + actualBalance2.Add(actualBalance2, big.NewInt(10000000000000000)) + + balance2AfterTransfer, err := ipldClient.BalanceAt(ctx, common.HexToAddress(contract2.Address), nil) + Expect(err).ToNot(HaveOccurred()) + Expect(balance2AfterTransfer.String()).To(Equal(actualBalance2.String())) + prevBalance2.Set(actualBalance2) + + // Contract 3 + _, txErr = integration.SendEth(contract3.Address, "0.01") + time.Sleep(sleepInterval) + Expect(txErr).ToNot(HaveOccurred()) + actualBalance3.Add(actualBalance3, big.NewInt(10000000000000000)) + + balance3AfterTransfer, err := ipldClient.BalanceAt(ctx, common.HexToAddress(contract3.Address), nil) + Expect(err).ToNot(HaveOccurred()) + Expect(balance3AfterTransfer.String()).To(Equal(actualBalance3.String())) + prevBalance3.Set(actualBalance3) + + // Increment counts + // Contract 1, countA + _, incErr = integration.IncrementCount(contract1.Address, "A") + time.Sleep(sleepInterval) + Expect(incErr).ToNot(HaveOccurred()) + actualCountA1.Add(actualCountA1, big.NewInt(1)) + + countA1AfterIncrementStorage, err := ipldClient.StorageAt(ctx, common.HexToAddress(contract1.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA1AfterIncrement := new(big.Int).SetBytes(countA1AfterIncrementStorage) + Expect(countA1AfterIncrement.String()).To(Equal(actualCountA1.String())) + prevCountA1.Set(actualCountA1) + + // Contract 2, countA + _, incErr = integration.IncrementCount(contract2.Address, "A") + time.Sleep(sleepInterval) + Expect(incErr).ToNot(HaveOccurred()) + actualCountA2.Add(actualCountA2, big.NewInt(1)) + + countA2AfterIncrementStorage, err := ipldClient.StorageAt(ctx, common.HexToAddress(contract2.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA2AfterIncrement := new(big.Int).SetBytes(countA2AfterIncrementStorage) + Expect(countA2AfterIncrement.String()).To(Equal(actualCountA2.String())) + prevCountA2.Set(actualCountA2) + + // Contract 3, countA + _, incErr = integration.IncrementCount(contract3.Address, "A") + time.Sleep(sleepInterval) + Expect(incErr).ToNot(HaveOccurred()) + actualCountA3.Add(actualCountA3, big.NewInt(1)) + + countA3AfterIncrementStorage, err := ipldClient.StorageAt(ctx, common.HexToAddress(contract3.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA3AfterIncrement := new(big.Int).SetBytes(countA3AfterIncrementStorage) + Expect(countA3AfterIncrement.String()).To(Equal(actualCountA3.String())) + prevCountA3.Set(actualCountA3) + }) + }) + + Context("with invalid args", func() { + It("returns an error on invalid operation arg", func() { + operation := "WrongOp" + args := []sdtypes.WatchAddressArg{} + + gethErr := gethRPCClient.Call(nil, gethMethod, operation, args) + Expect(gethErr).To(HaveOccurred()) + + ipldErr := ipldRPCClient.Call(nil, ipldMethod, operation, args) + Expect(ipldErr).To(HaveOccurred()) + + Expect(ipldErr).To(Equal(gethErr)) + }) + + It("returns an error on args of invalid type", func() { + operation := types.Add + args := []string{"WrongArg"} + + gethErr := gethRPCClient.Call(nil, gethMethod, operation, args) + Expect(gethErr).To(HaveOccurred()) + + ipldErr := ipldRPCClient.Call(nil, ipldMethod, operation, args) + Expect(ipldErr).To(HaveOccurred()) + + Expect(ipldErr).To(Equal(gethErr)) + }) + }) +}) diff --git a/test/watched_address_gap_filling_service_integration_test.go b/test/watched_address_gap_filling_service_integration_test.go new file mode 100644 index 00000000..d507261c --- /dev/null +++ b/test/watched_address_gap_filling_service_integration_test.go @@ -0,0 +1,318 @@ +package integration_test + +import ( + "context" + "math/big" + "os" + "strconv" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/statediff/types" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + + integration "github.com/vulcanize/ipld-eth-server/v3/test" +) + +var _ = Describe("Watched address gap filling service integration test", func() { + dbWrite, err := strconv.ParseBool(os.Getenv("DB_WRITE")) + Expect(err).To(BeNil()) + + watchedAddressServiceEnabled, err := strconv.ParseBool(os.Getenv("WATCHED_ADDRESS_GAP_FILLER_ENABLED")) + Expect(err).To(BeNil()) + + serviceInterval, err := strconv.ParseInt(os.Getenv("WATCHED_ADDRESS_GAP_FILLER_INTERVAL"), 10, 0) + Expect(err).To(BeNil()) + + gethHttpPath := "http://127.0.0.1:8545" + gethRPCClient, err := rpc.Dial(gethHttpPath) + Expect(err).ToNot(HaveOccurred()) + + ipldEthHttpPath := "http://127.0.0.1:8081" + ipldClient, err := ethclient.Dial(ipldEthHttpPath) + Expect(err).ToNot(HaveOccurred()) + ipldRPCClient, err := rpc.Dial(ipldEthHttpPath) + Expect(err).ToNot(HaveOccurred()) + + var ( + ctx = context.Background() + + contractErr error + txErr error + + GLD1 *integration.ContractDeployed + SLV1 *integration.ContractDeployed + SLV2 *integration.ContractDeployed + + countAIndex string + countBIndex string + + oldCountA1 = big.NewInt(0) + oldCountA2 = big.NewInt(0) + oldCountB2 = big.NewInt(0) + + updatedCountA1 = big.NewInt(1) + updatedCountA2 = big.NewInt(1) + updatedCountB2 = big.NewInt(1) + + SLV2CountBIncrementedAt *integration.CountIncremented + + contract1Salt = "contract1SLV" + ) + + BeforeEach(func() { + if !dbWrite || !watchedAddressServiceEnabled { + Skip("skipping watched address gap filling service integration tests") + } + }) + + It("test init", func() { + // Clear out watched addresses + err := integration.ClearWatchedAddresses(gethRPCClient) + Expect(err).ToNot(HaveOccurred()) + + // Deploy a GLD contract + GLD1, contractErr = integration.DeployContract() + Expect(contractErr).ToNot(HaveOccurred()) + + // Watch GLD1 contract + operation := types.Add + args := []types.WatchAddressArg{ + { + Address: GLD1.Address, + CreatedAt: uint64(GLD1.BlockNumber), + }, + } + ipldErr := ipldRPCClient.Call(nil, ipldMethod, operation, args) + Expect(ipldErr).ToNot(HaveOccurred()) + + // Deploy two SLV contracts and update storage slots + SLV1, contractErr = integration.Create2Contract("SLVToken", contract1Salt) + Expect(contractErr).ToNot(HaveOccurred()) + + _, txErr = integration.IncrementCount(SLV1.Address, "A") + Expect(txErr).ToNot(HaveOccurred()) + + SLV2, contractErr = integration.DeploySLVContract() + Expect(contractErr).ToNot(HaveOccurred()) + + _, txErr = integration.IncrementCount(SLV2.Address, "A") + Expect(txErr).ToNot(HaveOccurred()) + SLV2CountBIncrementedAt, txErr = integration.IncrementCount(SLV2.Address, "B") + Expect(txErr).ToNot(HaveOccurred()) + + // Get storage slot keys + storageSlotAKey, err := integration.GetStorageSlotKey("SLVToken", "countA") + Expect(err).ToNot(HaveOccurred()) + countAIndex = storageSlotAKey.Key + + storageSlotBKey, err := integration.GetStorageSlotKey("SLVToken", "countB") + Expect(err).ToNot(HaveOccurred()) + countBIndex = storageSlotBKey.Key + }) + + defer It("test cleanup", func() { + // Destroy create2 contract + _, err := integration.DestroySLVContract(SLV1.Address) + Expect(err).ToNot(HaveOccurred()) + + // Clear out watched addresses + err = integration.ClearWatchedAddresses(gethRPCClient) + Expect(err).ToNot(HaveOccurred()) + }) + + Context("previously unwatched contract watched", func() { + It("indexes state only for watched contract", func() { + // WatchedAddresses = [GLD1] + // SLV1, countA + countA1Storage, err := ipldClient.StorageAt(ctx, common.HexToAddress(SLV1.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA1 := new(big.Int).SetBytes(countA1Storage) + Expect(countA1.String()).To(Equal(oldCountA1.String())) + + // SLV2, countA + countA2Storage, err := ipldClient.StorageAt(ctx, common.HexToAddress(SLV2.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA2 := new(big.Int).SetBytes(countA2Storage) + Expect(countA2.String()).To(Equal(oldCountA2.String())) + + // SLV2, countB + countB2Storage, err := ipldClient.StorageAt(ctx, common.HexToAddress(SLV2.Address), common.HexToHash(countBIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countB2 := new(big.Int).SetBytes(countB2Storage) + Expect(countB2.String()).To(Equal(oldCountB2.String())) + }) + + It("indexes past state on watching a contract", func() { + // Watch SLV1 contract + args := []types.WatchAddressArg{ + { + Address: SLV1.Address, + CreatedAt: uint64(SLV1.BlockNumber), + }, + } + ipldErr := ipldRPCClient.Call(nil, ipldMethod, types.Add, args) + Expect(ipldErr).ToNot(HaveOccurred()) + + // Sleep for service interval + few extra seconds + time.Sleep(time.Duration(serviceInterval+2) * time.Second) + + // WatchedAddresses = [GLD1, SLV1] + // SLV1, countA + countA1Storage, err := ipldClient.StorageAt(ctx, common.HexToAddress(SLV1.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA1 := new(big.Int).SetBytes(countA1Storage) + Expect(countA1.String()).To(Equal(updatedCountA1.String())) + + // SLV2, countA + countA2Storage, err := ipldClient.StorageAt(ctx, common.HexToAddress(SLV2.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA2 := new(big.Int).SetBytes(countA2Storage) + Expect(countA2.String()).To(Equal(oldCountA2.String())) + + // SLV2, countB + countB2Storage, err := ipldClient.StorageAt(ctx, common.HexToAddress(SLV2.Address), common.HexToHash(countBIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countB2 := new(big.Int).SetBytes(countB2Storage) + Expect(countB2.String()).To(Equal(oldCountB2.String())) + }) + }) + + Context("previously unwatched contract watched (different 'created_at')", func() { + It("indexes past state from 'created_at' onwards on watching a contract", func() { + // Watch SLV2 (created_at -> countB incremented) contract + args := []types.WatchAddressArg{ + { + Address: SLV2.Address, + CreatedAt: uint64(SLV2CountBIncrementedAt.BlockNumber), + }, + } + ipldErr := ipldRPCClient.Call(nil, ipldMethod, types.Add, args) + Expect(ipldErr).ToNot(HaveOccurred()) + + // Sleep for service interval + few extra seconds + time.Sleep(time.Duration(serviceInterval+2) * time.Second) + + // WatchedAddresses = [GLD1, SLV1, SLV2] + // SLV2, countA + countA2Storage, err := ipldClient.StorageAt(ctx, common.HexToAddress(SLV2.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA2 := new(big.Int).SetBytes(countA2Storage) + Expect(countA2.String()).To(Equal(oldCountA2.String())) + + // SLV2, countB + countB2Storage, err := ipldClient.StorageAt(ctx, common.HexToAddress(SLV2.Address), common.HexToHash(countBIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countB2 := new(big.Int).SetBytes(countB2Storage) + Expect(countB2.String()).To(Equal(updatedCountB2.String())) + }) + + It("indexes missing past state on watching a contract from an earlier 'created_at'", func() { + // Remove SLV2 (created_at -> countB incremented) watched contract + args := []types.WatchAddressArg{ + { + Address: SLV2.Address, + CreatedAt: uint64(SLV2CountBIncrementedAt.BlockNumber), + }, + } + ipldErr := ipldRPCClient.Call(nil, ipldMethod, types.Remove, args) + Expect(ipldErr).ToNot(HaveOccurred()) + + // Watch SLV2 (created_at -> deployment) contract + args = []types.WatchAddressArg{ + { + Address: SLV2.Address, + CreatedAt: uint64(SLV2.BlockNumber), + }, + } + ipldErr = ipldRPCClient.Call(nil, ipldMethod, types.Add, args) + Expect(ipldErr).ToNot(HaveOccurred()) + + // Sleep for service interval + few extra seconds + time.Sleep(time.Duration(serviceInterval+2) * time.Second) + + // WatchedAddresses = [GLD1, SLV1, SLV2] + // SLV2, countA + countA2Storage, err := ipldClient.StorageAt(ctx, common.HexToAddress(SLV2.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA2 := new(big.Int).SetBytes(countA2Storage) + Expect(countA2.String()).To(Equal(updatedCountA2.String())) + + // SLV2, countB + countB2Storage, err := ipldClient.StorageAt(ctx, common.HexToAddress(SLV2.Address), common.HexToHash(countBIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countB2 := new(big.Int).SetBytes(countB2Storage) + Expect(countB2.String()).To(Equal(updatedCountB2.String())) + }) + }) + + Context("destroyed contract redeployed and watched", func() { + It("returns zero value for destroyed contract", func() { + _, err := integration.DestroySLVContract(SLV1.Address) + Expect(err).ToNot(HaveOccurred()) + + updatedCountA1 = big.NewInt(0) + + operation := types.Remove + args := []types.WatchAddressArg{ + { + Address: SLV1.Address, + CreatedAt: uint64(SLV1.BlockNumber), + }, + } + ipldErr := ipldRPCClient.Call(nil, ipldMethod, operation, args) + Expect(ipldErr).ToNot(HaveOccurred()) + + // WatchedAddresses = [GLD1, SLV2] + // SLV1, countA + countA1Storage, err := ipldClient.StorageAt(ctx, common.HexToAddress(SLV1.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA1 := new(big.Int).SetBytes(countA1Storage) + Expect(countA1.String()).To(Equal(updatedCountA1.String())) + oldCountA1.Set(updatedCountA1) + }) + + It("indexes state for redeployed contract", func() { + // Redeploy contract + SLV1, contractErr = integration.Create2Contract("SLVToken", contract1Salt) + Expect(contractErr).ToNot(HaveOccurred()) + + // Add to watched address + operation := types.Add + args := []types.WatchAddressArg{ + { + Address: SLV1.Address, + CreatedAt: uint64(SLV1.BlockNumber), + }, + } + ipldErr := ipldRPCClient.Call(nil, ipldMethod, operation, args) + Expect(ipldErr).ToNot(HaveOccurred()) + + // Sleep for service interval + few extra seconds + time.Sleep(time.Duration(serviceInterval+2) * time.Second) + + // WatchedAddresses = [GLD1, SLV2, SLV1] + // SLV1, countA + countA1Storage, err := ipldClient.StorageAt(ctx, common.HexToAddress(SLV1.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA1 := new(big.Int).SetBytes(countA1Storage) + Expect(countA1.String()).To(Equal(updatedCountA1.String())) + oldCountA1.Set(updatedCountA1) + + // Update storage slots + _, txErr = integration.IncrementCount(SLV1.Address, "A") + time.Sleep(sleepInterval) + Expect(txErr).ToNot(HaveOccurred()) + updatedCountA1.Add(updatedCountA1, big.NewInt(1)) + + countA1AfterIncrementStorage, err := ipldClient.StorageAt(ctx, common.HexToAddress(SLV1.Address), common.HexToHash(countAIndex), nil) + Expect(err).ToNot(HaveOccurred()) + countA1AfterIncrement := new(big.Int).SetBytes(countA1AfterIncrementStorage) + Expect(countA1AfterIncrement.String()).To(Equal(updatedCountA1.String())) + oldCountA1.Set(updatedCountA1) + }) + }) +})