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)
+ })
+ })
+})