From f7f4925b2ea462d247c8d850be4a278e5d78791b Mon Sep 17 00:00:00 2001 From: adam Date: Thu, 19 Jan 2023 17:29:53 -0800 Subject: [PATCH 1/8] save --- .gitignore | 1 + cli/cosmos.go | 41 ++++ cli/export.go | 23 +-- cli/indexer.go | 26 +-- cli/root.go | 7 + cli/utils.go | 17 -- cmd/indexer/main.go | 25 +-- db/007_chains_decimals.sql | 5 + db/008_cosmos_staking.sql | 22 +++ db/009_cosmos1.sql | 5 + docker/dev/docker.env | 2 +- go.mod | 42 +++- go.sum | 183 +++++++++++++++-- indexer/cosmos.go | 369 +++++++++++++++++++++++++++++++++++ indexer/cosmos_test.go | 30 +++ indexer/indexer.go | 5 +- indexer/old.go.txt | 65 ------ pkg/db/chains_sql.go | 4 +- pkg/db/chains_test.go | 26 ++- pkg/db/cosmos_staking.go | 42 ++++ pkg/db/cosmos_staking_sql.go | 10 + pkg/db/db.go | 9 +- pkg/db/db_test.go | 20 +- pkg/types/types.go | 14 +- pkg/utils/staking/staking.go | 2 +- pkg/utils/token/token.go | 2 +- 26 files changed, 826 insertions(+), 171 deletions(-) create mode 100644 cli/cosmos.go delete mode 100644 cli/utils.go create mode 100644 db/007_chains_decimals.sql create mode 100644 db/008_cosmos_staking.sql create mode 100644 db/009_cosmos1.sql create mode 100644 indexer/cosmos.go create mode 100644 indexer/cosmos_test.go delete mode 100644 indexer/old.go.txt create mode 100644 pkg/db/cosmos_staking.go create mode 100644 pkg/db/cosmos_staking_sql.go diff --git a/.gitignore b/.gitignore index e50be37..aa19f4d 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ .idea/ .vscode/ **.DS_Store +cmd/arkeodrop/__debug_bin diff --git a/cli/cosmos.go b/cli/cosmos.go new file mode 100644 index 0000000..22c074a --- /dev/null +++ b/cli/cosmos.go @@ -0,0 +1,41 @@ +package cli + +import ( + "fmt" + + "github.com/ArkeoNetwork/airdrop/indexer" + "github.com/ArkeoNetwork/common/utils" + "github.com/spf13/cobra" +) + +var ( + indexDelegatorsCmd = &cobra.Command{ + Use: "delegators", + Short: "gather cosmos-sdk chain data store in our db", + Run: runDelegatorsIndexer, + // Args: cobra.ExactValidArgs(2), + } +) + +func runDelegatorsIndexer(cmd *cobra.Command, args []string) { + flags := cmd.InheritedFlags() + envPath, _ := flags.GetString("env") + c := utils.ReadDBConfig(envPath) + if c == nil { + fmt.Print("error: no config loaded") + return + } + + chain := args[0] + params := indexer.CosmosIndexerParams{Chain: chain, DB: *c} + indxr, err := indexer.NewCosmosIndexer(params) + if err != nil { + cmd.PrintErrf("error creating cosmos indexer: %+v", err) + return + } + + if err := indxr.IndexDelegators(); err != nil { + fmt.Printf("error indexing delegators: %+v", err) + return + } +} diff --git a/cli/export.go b/cli/export.go index 17b54bb..5ad493c 100644 --- a/cli/export.go +++ b/cli/export.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/ArkeoNetwork/airdrop/pkg/db" + "github.com/ArkeoNetwork/common/utils" "github.com/pkg/errors" "github.com/spf13/cobra" ) @@ -31,32 +32,24 @@ func runExport(cmd *cobra.Command, args []string) { log.Infof("starting export process for %s, %s", args[0], args[1]) flags := cmd.InheritedFlags() envPath, _ := flags.GetString("env") - c := readConfig(envPath) - + c := utils.ReadDBConfig(envPath) + if c == nil { + cmd.PrintErrln("db config undefined") + return + } flags = cmd.Flags() fileName, _ := flags.GetString("output") if fileName == "" { fileName = fmt.Sprintf("/tmp/airdrop_%s_%s.csv", args[0], args[1]) } - params := db.DBConfig{ - Host: c.DBHost, - Port: c.DBPort, - User: c.DBUser, - Pass: c.DBPass, - DBName: c.DBName, - PoolMaxConns: c.DBPoolMaxConns, - PoolMinConns: c.DBPoolMinConns, - SSLMode: c.DBSSLMode, - } - - err := exportWeightedTokenAvgs(params, args[0], args[1], fileName) + err := exportWeightedTokenAvgs(*c, args[0], args[1], fileName) if err != nil { log.Errorf("error exporting: %+v", err) } } -func exportWeightedTokenAvgs(dbConfig db.DBConfig, chain, token, fileName string) error { +func exportWeightedTokenAvgs(dbConfig utils.DBConfig, chain, token, fileName string) error { d, err := db.New(dbConfig) if err != nil { return errors.Wrapf(err, "error connecting to the db") diff --git a/cli/indexer.go b/cli/indexer.go index 525f04e..f659574 100644 --- a/cli/indexer.go +++ b/cli/indexer.go @@ -2,14 +2,12 @@ package cli import ( "github.com/ArkeoNetwork/airdrop/indexer" - "github.com/ArkeoNetwork/airdrop/pkg/db" - "github.com/ArkeoNetwork/directory/pkg/logging" + "github.com/ArkeoNetwork/common/logging" + "github.com/ArkeoNetwork/common/utils" "github.com/spf13/cobra" ) type Config struct { - SnapshotStart uint64 `mapstructure:"SNAPSHOT_START"` - SnapshotEnd uint64 `mapstructure:"SNAPSHOT_END"` DBHost string `mapstructure:"DB_HOST"` DBPort uint `mapstructure:"DB_PORT"` DBUser string `mapstructure:"DB_USER"` @@ -40,22 +38,16 @@ func runIndexer(cmd *cobra.Command, args []string) { log.Info("starting data generation process") flags := cmd.InheritedFlags() envPath, _ := flags.GetString("env") - c := readConfig(envPath) + c := utils.ReadDBConfig(envPath) + if c == nil { + cmd.PrintErr("db config undefined") + return + } indexerApp := indexer.NewIndexer(indexer.IndexerAppParams{ - SnapshotStart: c.SnapshotStart, - SnapshotEnd: c.SnapshotEnd, - DBConfig: db.DBConfig{ - Host: c.DBHost, - Port: c.DBPort, - User: c.DBUser, - Pass: c.DBPass, - DBName: c.DBName, - PoolMaxConns: c.DBPoolMaxConns, - PoolMinConns: c.DBPoolMinConns, - SSLMode: c.DBSSLMode, - }, + DBConfig: *c, }) + indexerApp.Start() log.Debug("finished data generation process") } diff --git a/cli/root.go b/cli/root.go index f49eefb..124502e 100644 --- a/cli/root.go +++ b/cli/root.go @@ -26,12 +26,19 @@ var ( Short: "gather chain data store in our db", Run: runIndexer, } + + indexCosmosCmd = &cobra.Command{ + Use: "index-cosmos", + Short: "cosmos-sdk indexing", + } ) func init() { rootCmd.PersistentFlags().StringP("env", "e", "docker/dev/docker.env", "env file to source") rootCmd.AddCommand(versionCmd) rootCmd.AddCommand(indexCmd) + indexCosmosCmd.AddCommand(indexDelegatorsCmd) + rootCmd.AddCommand(indexCosmosCmd) rootCmd.AddCommand(exportCmd) } diff --git a/cli/utils.go b/cli/utils.go deleted file mode 100644 index c2b041d..0000000 --- a/cli/utils.go +++ /dev/null @@ -1,17 +0,0 @@ -package cli - -import "github.com/ArkeoNetwork/directory/pkg/config" - -func readConfig(envPath string) *Config { - c := &Config{} - if envPath == "" { - if err := config.LoadFromEnv(c, configNames...); err != nil { - log.Panicf("failed to load config from env: %+v", err) - } - } else { - if err := config.Load(envPath, c); err != nil { - log.Panicf("failed to load config: %+v", err) - } - } - return c -} diff --git a/cmd/indexer/main.go b/cmd/indexer/main.go index 680c09f..7c1ceab 100644 --- a/cmd/indexer/main.go +++ b/cmd/indexer/main.go @@ -4,9 +4,8 @@ import ( "flag" "github.com/ArkeoNetwork/airdrop/indexer" - "github.com/ArkeoNetwork/airdrop/pkg/db" - "github.com/ArkeoNetwork/directory/pkg/config" - "github.com/ArkeoNetwork/directory/pkg/logging" + "github.com/ArkeoNetwork/common/logging" + "github.com/ArkeoNetwork/common/utils" ) type Config struct { @@ -44,28 +43,24 @@ func main() { flag.Parse() c := &Config{} if *envPath == "" { - if err := config.LoadFromEnv(c, configNames...); err != nil { + if err := utils.LoadFromEnv(c, configNames...); err != nil { log.Panicf("failed to load config from env: %+v", err) } } else { - if err := config.Load(*envPath, c); err != nil { + if err := utils.Load(*envPath, c); err != nil { log.Panicf("failed to load config: %+v", err) } } + dbc := utils.ReadDBConfig(*envPath) + if dbc == nil { + log.Error("db config undefined") + return + } indexerApp := indexer.NewIndexer(indexer.IndexerAppParams{ SnapshotStart: c.SnapshotStart, SnapshotEnd: c.SnapshotEnd, - DBConfig: db.DBConfig{ - Host: c.DBHost, - Port: c.DBPort, - User: c.DBUser, - Pass: c.DBPass, - DBName: c.DBName, - PoolMaxConns: c.DBPoolMaxConns, - PoolMinConns: c.DBPoolMinConns, - SSLMode: c.DBSSLMode, - }, + DBConfig: *dbc, }) indexerApp.Start() log.Debug("finished data generation process") diff --git a/db/007_chains_decimals.sql b/db/007_chains_decimals.sql new file mode 100644 index 0000000..a34b9b7 --- /dev/null +++ b/db/007_chains_decimals.sql @@ -0,0 +1,5 @@ + +alter table chains add column decimals integer; +---- create above / drop below ---- +-- undo -- +alter table chains drop column decimals; diff --git a/db/008_cosmos_staking.sql b/db/008_cosmos_staking.sql new file mode 100644 index 0000000..da56b6e --- /dev/null +++ b/db/008_cosmos_staking.sql @@ -0,0 +1,22 @@ +create table cosmos_staking_events +( + id bigserial not null + constraint cosmos_staking_events_pk + primary key, + created timestamptz default now() not null, + updated timestamptz default now() not null, + chain text not null, + event_type text not null, + delegator text not null, + validator text not null, + amount numeric not null, + block_number numeric not null check ( block_number >= 0 ), + txhash text not null, + event_index integer not null, + constraint cosmos_staking_events_unique + unique (chain,txhash,event_index,validator,delegator) +); + +---- create above / drop below ---- +-- undo -- +drop table cosmos_staking_events; diff --git a/db/009_cosmos1.sql b/db/009_cosmos1.sql new file mode 100644 index 0000000..3d95e3a --- /dev/null +++ b/db/009_cosmos1.sql @@ -0,0 +1,5 @@ +insert into chains(name,rpc_url,snapshot_start_block,snapshot_end_block,decimals) +values ('GAIA','https://daemon.cosmos.shapeshift.com/rpc',12940505,13714445,6); + +---- create above / drop below ---- +delete from chains where name = 'GAIA'; diff --git a/docker/dev/docker.env b/docker/dev/docker.env index 49b78e5..c514128 100644 --- a/docker/dev/docker.env +++ b/docker/dev/docker.env @@ -3,7 +3,7 @@ SNAPSHOT_END=1672268704 # db DB_HOST="localhost" -DB_PORT="5432" +DB_PORT="5439" DB_USER="arkeo" DB_PASS="arkeo123" DB_NAME="arkeo_airdrop" diff --git a/go.mod b/go.mod index 2ff421d..eaf1688 100644 --- a/go.mod +++ b/go.mod @@ -3,14 +3,28 @@ module github.com/ArkeoNetwork/airdrop go 1.19 require ( - github.com/ArkeoNetwork/directory v0.0.0-20221226175704-8f01136fa856 + github.com/ArkeoNetwork/common v0.0.1 github.com/ethereum/go-ethereum v1.10.26 github.com/jackc/pgx/v4 v4.17.2 github.com/spf13/cobra v1.5.0 + github.com/stretchr/testify v1.8.0 + github.com/tendermint/tendermint v0.34.22 ) require ( + github.com/beorn7/perks v1.0.1 // indirect + github.com/btcsuite/btcd v0.22.1 // indirect + github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/cosmos/gorocksdb v1.2.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/go-kit/kit v0.12.0 // indirect + github.com/go-kit/log v0.2.1 // indirect + github.com/go-logfmt/logfmt v0.5.1 // indirect + github.com/go-resty/resty/v2 v2.7.0 // indirect + github.com/gogo/protobuf v1.3.3 // indirect + github.com/golang/protobuf v1.5.2 // indirect github.com/google/go-cmp v0.5.8 // indirect + github.com/gtank/merlin v0.1.1 // indirect github.com/huandu/xstrings v1.3.2 // indirect github.com/inconshreveable/mousetrap v1.0.1 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect @@ -21,6 +35,21 @@ require ( github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect github.com/jackc/pgtype v1.12.0 // indirect github.com/jackc/puddle v1.3.0 // indirect + github.com/libp2p/go-buffer-pool v0.1.0 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect + github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/prometheus/client_golang v1.12.2 // indirect + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.34.0 // indirect + github.com/prometheus/procfs v0.7.3 // indirect + github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect + github.com/sasha-s/go-deadlock v0.3.1 // indirect + golang.org/x/net v0.3.0 // indirect + google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959 // indirect + google.golang.org/grpc v1.50.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect ) require ( @@ -30,7 +59,7 @@ require ( github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/georgysavva/scany v1.2.1 - github.com/go-ole/go-ole v1.2.1 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.0 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect @@ -50,8 +79,8 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/viper v1.13.0 // indirect github.com/subosito/gotenv v1.4.1 // indirect - github.com/tklauser/go-sysconf v0.3.5 // indirect - github.com/tklauser/numcpus v0.2.2 // indirect + github.com/tklauser/go-sysconf v0.3.10 // indirect + github.com/tklauser/numcpus v0.4.0 // indirect golang.org/x/crypto v0.4.0 // indirect golang.org/x/sys v0.3.0 // indirect golang.org/x/text v0.5.0 // indirect @@ -61,3 +90,8 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools v2.2.0+incompatible ) + +replace ( + github.com/ArkeoNetwork/common => /Users/adamsamere/chaintech/oss/arkeo/common + github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 +) diff --git a/go.sum b/go.sum index e36be2a..c09a147 100644 --- a/go.sum +++ b/go.sum @@ -36,22 +36,36 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX 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= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/ArkeoNetwork/directory v0.0.0-20221226175704-8f01136fa856 h1:o8jCXMhUz9JQXDhyFeTvuCFrdAChveTwHyM+P8+ed8M= -github.com/ArkeoNetwork/directory v0.0.0-20221226175704-8f01136fa856/go.mod h1:q9FFtZMqaRsuifbyeMaPr/wuiV9d+3gPPsVc1cpxKLY= 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/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= +github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= +github.com/Workiva/go-datastructures v1.0.53 h1:J6Y/52yX10Xc5JjXmGtWoSSxs3mZnGSaq37xZZh7Yig= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 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.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 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= @@ -65,8 +79,12 @@ github.com/cockroachdb/cockroach-go/v2 v2.2.0 h1:/5znzg5n373N/3ESjHF5SMLxiW4RKB0 github.com/cockroachdb/cockroach-go/v2 v2.2.0/go.mod h1:u3MiKYGupPPjkn3ozknpMUpxPaNLTFWAya419/zv6eI= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= +github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y= +github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creachadair/taskgroup v0.3.2 h1:zlfutDS+5XG40AOxcHDSThxKzns8Tnr9jnr6VqkYlkM= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -76,6 +94,10 @@ github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS3 github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= +github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= 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= @@ -86,6 +108,7 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s= github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -95,20 +118,34 @@ github.com/georgysavva/scany v1.2.1/go.mod h1:vGBpL5XRLOocMFFa55pj0P04DrL3I7qKVR github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= +github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= +github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -133,9 +170,13 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= 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.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -145,11 +186,14 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ 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.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 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/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= 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= @@ -169,6 +213,9 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is= +github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= +github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -255,13 +302,25 @@ github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dv github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= github.com/jmoiron/sqlx v1.3.1/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +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/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 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.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -273,14 +332,16 @@ github.com/lib/pq v1.1.0/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.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/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.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= 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= @@ -289,32 +350,78 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= +github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= +github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= +github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= +github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.34.0 h1:RBmGO9d/FVjqHT0yUGQwBJhkwKV+wPCn7KGpvfab0uE= +github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= +github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= -github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= +github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= +github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= 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= @@ -322,8 +429,10 @@ github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9Nz github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 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.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= @@ -355,10 +464,13 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= -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/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA= -github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= +github.com/tendermint/tendermint v0.34.22 h1:XMhtC8s8QqJO4l/dn+TkQvevTRSow3Vixjclr41o+2Q= +github.com/tendermint/tendermint v0.34.22/go.mod h1:YpP5vBEAKUT4g6oyfjKgFeZmdB/GjkJAxfF+cgmJg6Y= +github.com/tendermint/tm-db v0.6.7 h1:fE00Cbl0jayAoqlExN6oyQJ7fR/ZtoVOmvPJ//+shu8= +github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw= +github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= +github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o= +github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4= github.com/urfave/cli/v2 v2.10.2 h1:x3p8awjp/2arX+Nl/G2040AZpOCHS/eMJJ1/a+mye4Y= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= @@ -367,6 +479,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -384,6 +497,7 @@ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9E go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -437,6 +551,7 @@ 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/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= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -444,6 +559,7 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -467,7 +583,13 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY 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-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 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.3.0 h1:VWL6FNY2bEEmsGVKabSlHu5Irp34xmMRoqb/9lF9lxk= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -477,6 +599,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ 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-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= 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= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -487,9 +611,10 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde h1:ejfdSekXMDxDLbRrJMwUk6KnSLZ2McaUCVcIKM+N6jc= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -503,10 +628,12 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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= @@ -520,6 +647,8 @@ golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/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= @@ -527,18 +656,23 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/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-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/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-20210603081109-ebe580a85c40/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-20210823070655-63515b42dcdf/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-20220114195835-da31bd327af9/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-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= golang.org/x/sys v0.3.0/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= @@ -553,7 +687,7 @@ golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -596,6 +730,7 @@ golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 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= @@ -604,6 +739,7 @@ golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4f 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-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/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -658,6 +794,7 @@ google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200324203455-a04cca1dde73/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -674,6 +811,8 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D 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-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959 h1:hw4Y42zL1VyVKxPgRHHh191fpVBGV8sNVmcow5Z8VXY= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -690,6 +829,8 @@ google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM 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.50.0 h1:fPVVDxY9w++VjTZsYvXWqEf9Rqar/e+9zYfxKK+W+YU= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= 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= @@ -700,16 +841,26 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= 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.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/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 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/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/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/indexer/cosmos.go b/indexer/cosmos.go new file mode 100644 index 0000000..064a540 --- /dev/null +++ b/indexer/cosmos.go @@ -0,0 +1,369 @@ +package indexer + +import ( + "context" + "crypto/sha256" + "encoding/hex" + "fmt" + "math/big" + "strings" + + "github.com/ArkeoNetwork/airdrop/pkg/db" + "github.com/ArkeoNetwork/airdrop/pkg/types" + "github.com/ArkeoNetwork/airdrop/pkg/utils" + arkutils "github.com/ArkeoNetwork/common/utils" + "github.com/pkg/errors" + abcitypes "github.com/tendermint/tendermint/abci/types" + "github.com/tendermint/tendermint/rpc/client/http" + tmtypes "github.com/tendermint/tendermint/types" +) + +type CosmosIndexerParams struct { + DB arkutils.DBConfig + Chain string + TendermintHost string + StartHeight int64 + EndHeight int64 +} + +type CosmosIndexer struct { + db *db.AirdropDB + tm *http.HTTP + chain *types.Chain + startHeight int64 + endHeight int64 +} + +func NewCosmosIndexer(params CosmosIndexerParams) (*CosmosIndexer, error) { + d, err := db.New(params.DB) + if err != nil { + return nil, errors.Wrapf(err, "error connecting to db") + } + chain, err := d.FindChain(params.Chain) + if err != nil { + return nil, errors.Wrapf(err, "error finding chain %s", params.Chain) + } + + tm, err := arkutils.NewTendermintClient(chain.RpcUrl) + if err != nil { + return nil, errors.Wrapf(err, "error creating tendermint client with rpc %s", params.TendermintHost) + } + + return &CosmosIndexer{db: d, tm: tm, chain: chain, startHeight: params.StartHeight, endHeight: params.EndHeight}, nil +} + +// 12940505 first cosmos block on 11/22 UTC 710A86BF2922BA304026102128359EBA941601F2C4B010E2B81D583FAB4A77B1 +func (c *CosmosIndexer) IndexDelegators() error { + startHeight := int64(c.chain.SnapshotStartBlock) + endHeight := int64(c.chain.SnapshotEndBlock) + + for i := startHeight; i <= endHeight; i++ { + if err := c.indexDelegations(i); err != nil { + log.Errorf("error indexing delegations at height %d: %+v", i, err) + } + } + return nil +} + +func isStakingTx(tx tmtypes.Tx, txResults *abcitypes.ResponseDeliverTx) bool { + txHash := hashTx(tx) + _ = txHash + for _, evt := range txResults.Events { + switch evt.GetType() { + case "delegate": + return true + case "undelegate": + return true + case "redelegate": + return true + default: + } + } + return false +} + +func (c *CosmosIndexer) handleStakingTx(height int64, tx tmtypes.Tx, txResult *abcitypes.ResponseDeliverTx) error { + txHash := hashTx(tx) + evtsSequenced := make([]abcitypes.Event, len(txResult.GetEvents())) + evtsSeq := int64(0) + evtsIndexMap := make(map[int64]int64, 1024) + for i, evt := range txResult.GetEvents() { + switch evt.GetType() { + case "delegate": + evtsSequenced[evtsSeq] = evt + evtsSeq++ + case "redelegate": + evtsSequenced[evtsSeq] = evt + evtsSeq++ + case "undelegate": + evtsSequenced[evtsSeq] = evt + evtsSeq++ + case "message": + m := make(map[string]string, len(evt.GetAttributes())) + for _, attr := range evt.GetAttributes() { + m[string(attr.GetKey())] = string(attr.GetValue()) + } + if module, ok := m["module"]; ok && module == "staking" { + if delegator, ok := m["sender"]; ok { + log.Infof("adding delegate event delegator %s", delegator) + // log.Infof("setting module_staking_delegator to %s", delegator) + // attribMap["module_staking_delegator"] = delegator + evtsSequenced[evtsSeq] = evt + evtsIndexMap[evtsSeq] = int64(i) + evtsSeq++ + } + } + } + } + stakingEvents := make([]*types.CosmosStakingEvent, 0, len(evtsSequenced)/2) + evtsSequenced = evtsSequenced[:evtsSeq] + var stakingEvt *types.CosmosStakingEvent + for i, evt := range evtsSequenced { + m := attributesToMap(evt.GetAttributes()) + if i%2 == 0 { + _, amount, err := parseAmount(m["amount"], c.chain.Decimals) + if err != nil { + log.Errorf("error parsing amount %s: %+v", m["amount"], err) + } + stakingEvt = &types.CosmosStakingEvent{ + EventType: evt.GetType(), + Validator: m["validator"], + Chain: c.chain.Name, + Value: amount, + BlockNumber: uint64(height), + TxHash: txHash, + } + // should be delegate/un/re? + log.Debug(evt) + + } else { + // should be message+staking module+spender (delegator address)? + log.Debug(evt) + if stakingEvt == nil { + return fmt.Errorf("stakingEvt null, event sequencing (programming) issue") + } + evtIndex, ok := evtsIndexMap[int64(i)] + if !ok { + log.Warnf("no event index found for %d", i) + } + stakingEvt.Delegator = m["sender"] + stakingEvt.EventIndex = evtIndex + stakingEvents = append(stakingEvents, stakingEvt) + stakingEvt = nil + } + } + log.Infof("have %d staking events", len(stakingEvents)) + return c.db.InsertStakingEvents(stakingEvents) +} + +func attributesToMap(attributes []abcitypes.EventAttribute) map[string]string { + m := make(map[string]string, len(attributes)) + for _, a := range attributes { + m[string(a.Key)] = string(a.Value) + } + return m +} + +func (c *CosmosIndexer) indexDelegations(height int64) error { + log := log.WithField("height", fmt.Sprintf("%d", height)) + ctx := context.Background() + block, err := c.tm.Block(ctx, &height) + if err != nil { + return errors.Wrapf(err, "error reading block at %d", height) + } + + blockResults, err := c.tm.BlockResults(ctx, &height) + if err != nil { + return errors.Wrapf(err, "error reading block results at %d", height) + } + + for i := range block.Block.Txs { + tx := block.Block.Txs[i] + txHash := hashTx(tx) + _ = txHash + if isStakingTx(tx, blockResults.TxsResults[i]) { + if err = c.handleStakingTx(height, tx, blockResults.TxsResults[i]); err != nil { + log.Errorf("error handling staking tx %s: %+v", hashTx(tx), err) + } + } + } + return nil +} + +func hashTx(bytes []byte) string { + h := sha256.Sum256(bytes) + return strings.ToUpper(hex.EncodeToString(h[:])) +} + +func parseAmount(in string, decimals uint8) (asset string, amount float64, err error) { + amt := make([]byte, len(in)) + var i int + for i = 0; i < len(in); i++ { + if in[i] < '0' || in[i] > '9' { + break + } + amt[i] = in[i] + } + amt = amt[:i] + asset = in[i:] + samt := string(amt) + log.Infof("%s %s", samt, asset) + + iamt, ok := new(big.Int).SetString(samt, 10) + if !ok { + log.Errorf("unable to convert amount %s to big int", samt) + return + } + + amount = utils.BigIntToFloat(iamt, uint8(decimals)) + return +} + +/* +type txResponseWrapper interface { + getResponseDeliverTx() *abcitypes.ResponseDeliverTx + getTx() tmtypes.Tx +} +type baseTxResponseWrapper struct { + tx tmtypes.Tx + txResult *abcitypes.ResponseDeliverTx +} + +func (w baseTxResponseWrapper) getTx() tmtypes.Tx { + return w.tx +} + +func (w baseTxResponseWrapper) getResponseDeliverTx() *abcitypes.ResponseDeliverTx { + return w.txResult +} + +type delegateTxResponse struct { + baseTxResponseWrapper +} +type undelegateTxResponse struct { + baseTxResponseWrapper +} +type redelegateTxResponse struct { + baseTxResponseWrapper +} +type unbondTxResponse struct { + baseTxResponseWrapper +} + +func (c *CosmosIndexer) handleStakingEvents(height int64, txResponses map[string]txResponseWrapper) error { + stakingEvents := make([]*types.CosmosStakingEvent, 0, len(txResponses)) + for _, txw := range txResponses { + dumpTxResult(txw.getResponseDeliverTx()) + var err error + var stakingEvent *types.CosmosStakingEvent + switch v := txw.(type) { + case delegateTxResponse: + stakingEvent, err = c.handleDelegate(height, v) + case undelegateTxResponse: + err = handleUndelegate(height, v) + case redelegateTxResponse: + err = handleRedelegate(height, v) + case unbondTxResponse: + err = handleUnbond(height, v) + } + if err != nil { + log.Errorf("error handling %s staking event: %+v", txw.getResponseDeliverTx().GetInfo(), err) + continue + } + if stakingEvent == nil { + log.Warnf("no staking event produced for %s", hashTx(txw.getTx())) + continue + } + stakingEvents = append(stakingEvents, stakingEvent) + } + if len(stakingEvents) > 0 { + log.Infof("found %d staking events to write at height %d", len(stakingEvents), height) + if err := c.db.InsertStakingEvents(stakingEvents); err != nil { + return errors.Wrapf(err, "error inserting staking events at height %d, abort", height) + } + } + + return nil +} + +func (c *CosmosIndexer) handleDelegate(height int64, d delegateTxResponse) (*types.CosmosStakingEvent, error) { + tx := d.tx + txHash := hashTx(tx) + log.Infof("tx %s has delegate event", txHash) + txResult := d.txResult + + attribMap := make(map[string]string, 64) + evtsSequenced := make([]abcitypes.Event, len(txResult.GetEvents())) + evtsSeq := 0 + for _, evt := range txResult.GetEvents() { + switch evt.GetType() { + case "delegate": + evtsSequenced[evtsSeq] = evt + evtsSeq++ + // for _, attrib := range evt.GetAttributes() { + // attribMap[string(attrib.GetKey())] = string(attrib.GetValue()) + // } + // case "transfer": + // for _, attrib := range evt.GetAttributes() { + // attribMap[string(attrib.GetKey())] = string(attrib.GetValue()) + // } + case "message": + m := make(map[string]string, len(evt.GetAttributes())) + for _, attr := range evt.GetAttributes() { + m[string(attr.GetKey())] = string(attr.GetValue()) + } + if module, ok := m["module"]; ok && module == "staking" { + if delegator, ok := m["sender"]; ok { + log.Infof("adding delegate event delegator %s", delegator) + // log.Infof("setting module_staking_delegator to %s", delegator) + // attribMap["module_staking_delegator"] = delegator + evtsSequenced[evtsSeq] = evt + evtsSeq++ + } + } + // case "tx": + // for _, attrib := range evt.GetAttributes() { + // if string(attrib.GetKey()) == "acc_seq" { + // spl := strings.Split(string(attrib.GetValue()), "/") + // attribMap["delegator"] = spl[0] + // break + // } + // attribMap[string(attrib.GetKey())] = string(attrib.GetValue()) + // } + default: + } + } + if len(attribMap) < 1 { + return nil, fmt.Errorf("no attributes for delegate event, height: %d, tx: %s", height, txHash) + } + _, amt, err := parseAmount(attribMap["amount"], c.chain.Decimals) + if err != nil { + log.Errorf("error parsing amount %s: %+v", attribMap["amount"], err) + } + cse := &types.CosmosStakingEvent{ + EventType: "delegate", + Chain: c.chain.Name, + BlockNumber: uint64(height), + TxHash: txHash, + Delegator: attribMap["delegator"], + Validator: attribMap["validator"], + Value: amt, + } + + return cse, nil +} +*/ + +// func dumpTxResult(r *abcitypes.ResponseDeliverTx) { +// uniq := make(map[string]string, 256) +// for _, evt := range r.Events { +// // log.Infof("evt: %s", evt.GetType()) +// for _, attrib := range evt.GetAttributes() { +// // log.Infof("%s : %s", attrib.GetKey(), attrib.GetValue()) +// uniq[string(attrib.GetKey())] = string(attrib.GetValue()) +// } +// } +// for k, v := range uniq { +// log.Infof("%s : %s", k, v) +// } +// } diff --git a/indexer/cosmos_test.go b/indexer/cosmos_test.go new file mode 100644 index 0000000..ec9c542 --- /dev/null +++ b/indexer/cosmos_test.go @@ -0,0 +1,30 @@ +package indexer + +import ( + "fmt" + "testing" + + "github.com/ArkeoNetwork/common/utils" + "github.com/stretchr/testify/assert" +) + +const envPath = "/Users/adamsamere/chaintech/oss/arkeo/airdrop/docker/dev/docker.env" + +func TestIndexDelegations(t *testing.T) { + c := utils.ReadDBConfig(envPath) + if c == nil { + fmt.Print("error: no config loaded") + return + } + + // height := int64(12940516) + // height := int64(12940505) + height := int64(12940507) + chain := "GAIA" + params := CosmosIndexerParams{Chain: chain, DB: *c} + indxr, err := NewCosmosIndexer(params) + assert.Nil(t, err) + assert.NotNil(t, indxr) + err = indxr.indexDelegations(height) + assert.Nil(t, err) +} diff --git a/indexer/indexer.go b/indexer/indexer.go index 0d33f47..3f536ee 100644 --- a/indexer/indexer.go +++ b/indexer/indexer.go @@ -4,13 +4,14 @@ import ( "fmt" "github.com/ArkeoNetwork/airdrop/pkg/db" - "github.com/ArkeoNetwork/directory/pkg/logging" + "github.com/ArkeoNetwork/common/logging" + "github.com/ArkeoNetwork/common/utils" ) type IndexerAppParams struct { SnapshotStart uint64 SnapshotEnd uint64 - db.DBConfig + utils.DBConfig } type IndexerApp struct { diff --git a/indexer/old.go.txt b/indexer/old.go.txt deleted file mode 100644 index 3221940..0000000 --- a/indexer/old.go.txt +++ /dev/null @@ -1,65 +0,0 @@ - - // foxAddress := common.HexToAddress(params.FoxAddressEth) - - // fox, err := erc20.NewErc20(foxAddress, client) - // if err != nil { - // log.Errorf("failed to create fox %+v", err) - // } - - // var transferEvents *[]*erc20.Erc20Transfer - // // attemp to open jsonFile - // transferJSONFile, err := os.Open("fox_mainnet_transer_events.json") - // if err != nil { - // log.Info("Unable to find transfer events, will re-download") - // transferEvents, err := token.GetAllTransfers(params.FoxGenesisBlock, blockNumber, 1000, fox) - // if err != nil { - // log.Panicf("failed to get transfers of fox %+v", err) - // } - - // eventsJSON, err := json.MarshalIndent(transferEvents, "", " ") - // if err != nil { - // log.Errorf("failed to json %+v", err) - // } - - // err = ioutil.WriteFile("fox_mainnet_transer_events.json", eventsJSON, 0644) - // if err != nil { - // log.Errorf("failed to write file %+v", err) - // } - // } else { - // defer transferJSONFile.Close() - // transferJSON, err := ioutil.ReadAll(transferJSONFile) - // if err != nil { - // log.Panic("failed to read JSON") - // } else { - // var transferEventsFromFile []*erc20.Erc20Transfer - // err := json.Unmarshal(transferJSON, &transferEventsFromFile) - // if err != nil { - // log.Panic("failed to unmarshal JSON") - // } else { - // transferEvents = &transferEventsFromFile - // } - // } - // } - - // holders := token.GetAllHolders(transferEvents) - // foxMainnetBalanceHistory := token.GenerateBalanceHistory(holders, transferEvents, params.SnapshotStartBlockEth, params.SnapshotEndBlockEth) - - // // // deal with FOX LPers and FOX staking on mainnet - // // foxLPAddress := common.HexToAddress(params.FoxLPAddressEth) - // // foxLP, err := erc20.NewErc20(foxLPAddress, client) - // // if err != nil { - // // log.Errorf("failed to create foxLP %+v", err) - // // } - - // // transferEvents, err = token_utils.GetAllTransfers(params.FoxLPGenesisBlock, blockNumber, 2000, foxLP) - // // if err != nil { - // // log.Panicf("failed to get transfers of fox lp %+v", err) - // // } - // // holders = token_utils.GetAllHolders(transferEvents) - // // foxLPBalanceHistory := token_utils.GenerateBalanceHistory(holders, transferEvents, params.SnapshotStartBlockEth, params.SnapshotEndBlockEth) - - // // we now need to looking at the FOX LP staking contract. - - // weightedBalanceByAddress := token.GetBlockWeigthedAverageBalance(foxMainnetBalanceHistory) - // weightedBalanceByAddressJSON, _ := json.MarshalIndent(weightedBalanceByAddress, "", " ") - // ioutil.WriteFile("weighted_balances.json", weightedBalanceByAddressJSON, 0644) \ No newline at end of file diff --git a/pkg/db/chains_sql.go b/pkg/db/chains_sql.go index beedc2a..6bfa8e3 100644 --- a/pkg/db/chains_sql.go +++ b/pkg/db/chains_sql.go @@ -1,6 +1,6 @@ package db var ( - sqlFindAllChains = `select name,rpc_url,snapshot_start_block,snapshot_end_block from chains` - sqlFindChain = `select name,rpc_url,snapshot_start_block,snapshot_end_block from chains where name = $1` + sqlFindAllChains = `select name,rpc_url,snapshot_start_block,snapshot_end_block,decimals from chains` + sqlFindChain = `select name,rpc_url,snapshot_start_block,snapshot_end_block,decimals from chains where name = $1` ) diff --git a/pkg/db/chains_test.go b/pkg/db/chains_test.go index ce8c5a7..4631c47 100644 --- a/pkg/db/chains_test.go +++ b/pkg/db/chains_test.go @@ -1,7 +1,13 @@ // test for chains.go package db -import "testing" +import ( + "fmt" + "testing" + + "github.com/ArkeoNetwork/common/utils" + "github.com/stretchr/testify/assert" +) // TestFindAllChains - tests FindAllChains func TestFindAllChains(t *testing.T) { @@ -20,3 +26,21 @@ func TestFindAllChains(t *testing.T) { t.Fatalf("expected > 1 chains, found %d", len(chains)) } } + +func TestFindChain(t *testing.T) { + envPath := "/Users/adamsamere/chaintech/oss/arkeo/airdrop/docker/dev/docker.env" + c := utils.ReadDBConfig(envPath) + if c == nil { + fmt.Print("error: no config loaded") + return + } + db, err := New(*c) + assert.Nil(t, err) + assert.NotNil(t, db) + chain, err := db.FindChain("GAIA") + assert.Nil(t, err) + if assert.NotNil(t, chain) { + assert.Equal(t, uint8(6), chain.Decimals) + } + +} diff --git a/pkg/db/cosmos_staking.go b/pkg/db/cosmos_staking.go new file mode 100644 index 0000000..c45db7b --- /dev/null +++ b/pkg/db/cosmos_staking.go @@ -0,0 +1,42 @@ +package db + +import ( + "context" + + "github.com/ArkeoNetwork/airdrop/pkg/types" + "github.com/jackc/pgx/v4" + "github.com/pkg/errors" +) + +func (d *AirdropDB) InsertStakingEvents(event []*types.CosmosStakingEvent) error { + conn, err := d.getConnection() + defer conn.Release() + if err != nil { + return errors.Wrapf(err, "error obtaining db connection") + } + x := make([]interface{}, len(event)) + for i := range event { + x[i] = event[i] + } + + batch := &pgx.Batch{} + for _, evt := range event { + batch.Queue( + sqlInsertCosmosStakingEvent, + evt.Chain, + evt.EventType, + evt.Delegator, + evt.Validator, + evt.Value, + evt.BlockNumber, + evt.TxHash, + evt.EventIndex, + ) + } + results := conn.SendBatch(context.Background(), batch) + err = results.Close() + if err != nil { + return errors.Wrap(err, "error executing batch") + } + return nil +} diff --git a/pkg/db/cosmos_staking_sql.go b/pkg/db/cosmos_staking_sql.go new file mode 100644 index 0000000..8928099 --- /dev/null +++ b/pkg/db/cosmos_staking_sql.go @@ -0,0 +1,10 @@ +package db + +const ( + sqlInsertCosmosStakingEvent = ` + insert into cosmos_staking_events(chain, event_type, delegator, validator, amount, block_number, txhash, event_index) + values ($1,$2,$3,$4,$5,$6,$7,$8) + on conflict on constraint cosmos_staking_events_unique + do nothing + ` +) diff --git a/pkg/db/db.go b/pkg/db/db.go index b6b3629..5b0bf14 100644 --- a/pkg/db/db.go +++ b/pkg/db/db.go @@ -5,7 +5,8 @@ import ( "fmt" "time" - "github.com/ArkeoNetwork/directory/pkg/logging" + "github.com/ArkeoNetwork/common/logging" + "github.com/ArkeoNetwork/common/utils" "github.com/jackc/pgx/v4/pgxpool" "github.com/pkg/errors" ) @@ -39,9 +40,9 @@ func (d *AirdropDB) getConnection() (*pgxpool.Conn, error) { return d.pool.Acquire(context.Background()) } -func New(config DBConfig) (*AirdropDB, error) { +func New(config utils.DBConfig) (*AirdropDB, error) { connStrTemplate := "postgres://%s:%s@%s:%d/%s?pool_max_conns=%d&pool_min_conns=%d&sslmode=%s" - url := fmt.Sprintf(connStrTemplate, config.User, config.Pass, config.Host, config.Port, config.DBName, config.PoolMaxConns, config.PoolMinConns, config.SSLMode) + url := fmt.Sprintf(connStrTemplate, config.DBUser, config.DBPass, config.DBHost, config.DBPort, config.DBName, config.DBPoolMaxConns, config.DBPoolMinConns, config.DBSSLMode) poolConfig, err := pgxpool.ParseConfig(url) if err != nil { return nil, errors.Wrapf(err, "error parsing url to config from: \"%s\"", url) @@ -52,6 +53,6 @@ func New(config DBConfig) (*AirdropDB, error) { return nil, errors.Wrapf(err, "error connecting to db") } - log.Infof("connected pool for db %s on %s:%d", config.DBName, config.Host, config.Port) + log.Infof("connected pool for db %s on %s:%d", config.DBName, config.DBHost, config.DBPort) return &AirdropDB{pool}, nil } diff --git a/pkg/db/db_test.go b/pkg/db/db_test.go index 897ec92..d72ac62 100644 --- a/pkg/db/db_test.go +++ b/pkg/db/db_test.go @@ -3,17 +3,19 @@ package db import ( "context" "testing" + + "github.com/ArkeoNetwork/common/utils" ) -var config = DBConfig{ - Host: "localhost", - Port: 5432, - User: "arkeo", - Pass: "arkeo123", - DBName: "arkeo_airdrop", - PoolMaxConns: 2, - PoolMinConns: 1, - SSLMode: "prefer", +var config = utils.DBConfig{ + DBHost: "localhost", + DBPort: 5432, + DBUser: "arkeo", + DBPass: "arkeo123", + DBName: "arkeo_airdrop", + DBPoolMaxConns: 2, + DBPoolMinConns: 1, + DBSSLMode: "prefer", } func TestNew(t *testing.T) { diff --git a/pkg/types/types.go b/pkg/types/types.go index f51123d..2b73ed1 100644 --- a/pkg/types/types.go +++ b/pkg/types/types.go @@ -15,6 +15,7 @@ type Chain struct { RpcUrl string `db:"rpc_url"` SnapshotStartBlock uint64 `db:"snapshot_start_block"` SnapshotEndBlock uint64 `db:"snapshot_end_block"` + Decimals uint8 `db:"decimals"` } type Transfer struct { @@ -36,7 +37,7 @@ type StakingContract struct { } type StakingEvent struct { - TxHash string `db:"txHash"` + TxHash string `db:"txhash"` LogIndex uint `db:"log_index"` Token string `db:"token"` StakingContract string `db:"staking_contract"` @@ -45,3 +46,14 @@ type StakingEvent struct { BlockNumber uint64 `db:"block_number"` Chain string `db:"chain"` } + +type CosmosStakingEvent struct { + EventType string `db:"event_type"` + Chain string `db:"chain"` + Delegator string `db:"delegator"` + Validator string `db:"validator"` + Value float64 `db:"amount"` + BlockNumber uint64 `db:"block_number"` + TxHash string `db:"txhash"` + EventIndex int64 `db:"event_index"` +} diff --git a/pkg/utils/staking/staking.go b/pkg/utils/staking/staking.go index 78640e4..4d57807 100644 --- a/pkg/utils/staking/staking.go +++ b/pkg/utils/staking/staking.go @@ -4,7 +4,7 @@ import ( "context" "errors" - "github.com/ArkeoNetwork/directory/pkg/logging" + "github.com/ArkeoNetwork/common/logging" "github.com/ArkeoNetwork/airdrop/contracts/stakingrewards" "github.com/ethereum/go-ethereum/accounts/abi/bind" diff --git a/pkg/utils/token/token.go b/pkg/utils/token/token.go index c59f31d..b03d190 100644 --- a/pkg/utils/token/token.go +++ b/pkg/utils/token/token.go @@ -4,7 +4,7 @@ import ( "math/big" "sync" - "github.com/ArkeoNetwork/directory/pkg/logging" + "github.com/ArkeoNetwork/common/logging" "github.com/ArkeoNetwork/airdrop/contracts/erc20" From 2ee90f54922f35cef9be0938ab7b463062ccea06 Mon Sep 17 00:00:00 2001 From: adam Date: Thu, 19 Jan 2023 18:17:28 -0800 Subject: [PATCH 2/8] delegate and unbond --- indexer/cosmos.go | 24 +++++++++++++++++++++--- indexer/cosmos_test.go | 3 ++- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/indexer/cosmos.go b/indexer/cosmos.go index 064a540..32d6b10 100644 --- a/indexer/cosmos.go +++ b/indexer/cosmos.go @@ -72,7 +72,7 @@ func isStakingTx(tx tmtypes.Tx, txResults *abcitypes.ResponseDeliverTx) bool { switch evt.GetType() { case "delegate": return true - case "undelegate": + case "unbond": return true case "redelegate": return true @@ -95,7 +95,7 @@ func (c *CosmosIndexer) handleStakingTx(height int64, tx tmtypes.Tx, txResult *a case "redelegate": evtsSequenced[evtsSeq] = evt evtsSeq++ - case "undelegate": + case "unbond": evtsSequenced[evtsSeq] = evt evtsSeq++ case "message": @@ -125,9 +125,27 @@ func (c *CosmosIndexer) handleStakingTx(height int64, tx tmtypes.Tx, txResult *a if err != nil { log.Errorf("error parsing amount %s: %+v", m["amount"], err) } + var srcValidator, destValidator string + switch evt.GetType() { + case "delegate": + destValidator = m["validator"] + case "redelegate": + // FIXEME: need to split in to unbond and delegate events + destValidator = m["destination_validator"] + srcValidator = m["source_validator"] + case "unbond": + srcValidator = m["validator"] + amount = -amount + } + + validator := destValidator + if evt.GetType() == "unbond" { + validator = srcValidator + } + stakingEvt = &types.CosmosStakingEvent{ EventType: evt.GetType(), - Validator: m["validator"], + Validator: validator, Chain: c.chain.Name, Value: amount, BlockNumber: uint64(height), diff --git a/indexer/cosmos_test.go b/indexer/cosmos_test.go index ec9c542..6694a1b 100644 --- a/indexer/cosmos_test.go +++ b/indexer/cosmos_test.go @@ -19,7 +19,8 @@ func TestIndexDelegations(t *testing.T) { // height := int64(12940516) // height := int64(12940505) - height := int64(12940507) + // height := int64(12940507) + height := int64(13742000) chain := "GAIA" params := CosmosIndexerParams{Chain: chain, DB: *c} indxr, err := NewCosmosIndexer(params) From 6b1262a71d1dcdf2d65be9111bccef6f6754cecd Mon Sep 17 00:00:00 2001 From: adam Date: Thu, 19 Jan 2023 18:41:52 -0800 Subject: [PATCH 3/8] redelegate (revisit) --- cli/cosmos.go | 2 +- indexer/cosmos.go | 43 ++++++++++++++++++++++++++++++------------ indexer/cosmos_test.go | 3 ++- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/cli/cosmos.go b/cli/cosmos.go index 22c074a..a6ed383 100644 --- a/cli/cosmos.go +++ b/cli/cosmos.go @@ -13,7 +13,7 @@ var ( Use: "delegators", Short: "gather cosmos-sdk chain data store in our db", Run: runDelegatorsIndexer, - // Args: cobra.ExactValidArgs(2), + Args: cobra.ExactValidArgs(1), } ) diff --git a/indexer/cosmos.go b/indexer/cosmos.go index 32d6b10..9164e79 100644 --- a/indexer/cosmos.go +++ b/indexer/cosmos.go @@ -105,9 +105,7 @@ func (c *CosmosIndexer) handleStakingTx(height int64, tx tmtypes.Tx, txResult *a } if module, ok := m["module"]; ok && module == "staking" { if delegator, ok := m["sender"]; ok { - log.Infof("adding delegate event delegator %s", delegator) - // log.Infof("setting module_staking_delegator to %s", delegator) - // attribMap["module_staking_delegator"] = delegator + log.Debugf("adding delegate event delegator %s", delegator) evtsSequenced[evtsSeq] = evt evtsIndexMap[evtsSeq] = int64(i) evtsSeq++ @@ -117,7 +115,7 @@ func (c *CosmosIndexer) handleStakingTx(height int64, tx tmtypes.Tx, txResult *a } stakingEvents := make([]*types.CosmosStakingEvent, 0, len(evtsSequenced)/2) evtsSequenced = evtsSequenced[:evtsSeq] - var stakingEvt *types.CosmosStakingEvent + var stakingEvt *stakingEventWrapper for i, evt := range evtsSequenced { m := attributesToMap(evt.GetAttributes()) if i%2 == 0 { @@ -143,14 +141,18 @@ func (c *CosmosIndexer) handleStakingTx(height int64, tx tmtypes.Tx, txResult *a validator = srcValidator } - stakingEvt = &types.CosmosStakingEvent{ - EventType: evt.GetType(), - Validator: validator, - Chain: c.chain.Name, - Value: amount, - BlockNumber: uint64(height), - TxHash: txHash, + stakingEvt = &stakingEventWrapper{ + CosmosStakingEvent: types.CosmosStakingEvent{ + EventType: evt.GetType(), + Validator: validator, + Chain: c.chain.Name, + Value: amount, + BlockNumber: uint64(height), + TxHash: txHash, + }, + srcValidator: srcValidator, } + // should be delegate/un/re? log.Debug(evt) @@ -166,7 +168,19 @@ func (c *CosmosIndexer) handleStakingTx(height int64, tx tmtypes.Tx, txResult *a } stakingEvt.Delegator = m["sender"] stakingEvt.EventIndex = evtIndex - stakingEvents = append(stakingEvents, stakingEvt) + stakingEvents = append(stakingEvents, &stakingEvt.CosmosStakingEvent) + if stakingEvt.EventType == "redelegate" { + unbondEvt := types.CosmosStakingEvent{ + EventType: stakingEvt.EventType, + Delegator: stakingEvt.Delegator, + Validator: stakingEvt.srcValidator, + Chain: c.chain.Name, + Value: -stakingEvt.Value, + BlockNumber: uint64(height), + TxHash: txHash, + } + stakingEvents = append(stakingEvents, &unbondEvt) + } stakingEvt = nil } } @@ -174,6 +188,11 @@ func (c *CosmosIndexer) handleStakingTx(height int64, tx tmtypes.Tx, txResult *a return c.db.InsertStakingEvents(stakingEvents) } +type stakingEventWrapper struct { + types.CosmosStakingEvent + srcValidator string +} + func attributesToMap(attributes []abcitypes.EventAttribute) map[string]string { m := make(map[string]string, len(attributes)) for _, a := range attributes { diff --git a/indexer/cosmos_test.go b/indexer/cosmos_test.go index 6694a1b..c8d64b5 100644 --- a/indexer/cosmos_test.go +++ b/indexer/cosmos_test.go @@ -20,7 +20,8 @@ func TestIndexDelegations(t *testing.T) { // height := int64(12940516) // height := int64(12940505) // height := int64(12940507) - height := int64(13742000) + // height := int64(13742000) + height := int64(12940754) chain := "GAIA" params := CosmosIndexerParams{Chain: chain, DB: *c} indxr, err := NewCosmosIndexer(params) From 172125a3c403c35423bb65c307ac95ec9ccb32e8 Mon Sep 17 00:00:00 2001 From: adam Date: Thu, 19 Jan 2023 19:00:29 -0800 Subject: [PATCH 4/8] quiet denomAmt log, remove commented --- indexer/cosmos.go | 152 +--------------------------------------------- 1 file changed, 2 insertions(+), 150 deletions(-) diff --git a/indexer/cosmos.go b/indexer/cosmos.go index 9164e79..01b93e8 100644 --- a/indexer/cosmos.go +++ b/indexer/cosmos.go @@ -172,6 +172,7 @@ func (c *CosmosIndexer) handleStakingTx(height int64, tx tmtypes.Tx, txResult *a if stakingEvt.EventType == "redelegate" { unbondEvt := types.CosmosStakingEvent{ EventType: stakingEvt.EventType, + EventIndex: 0, // using zero here for extra row to maintain uniqueness Delegator: stakingEvt.Delegator, Validator: stakingEvt.srcValidator, Chain: c.chain.Name, @@ -244,7 +245,7 @@ func parseAmount(in string, decimals uint8) (asset string, amount float64, err e amt = amt[:i] asset = in[i:] samt := string(amt) - log.Infof("%s %s", samt, asset) + log.Debugf("%s %s", samt, asset) iamt, ok := new(big.Int).SetString(samt, 10) if !ok { @@ -255,152 +256,3 @@ func parseAmount(in string, decimals uint8) (asset string, amount float64, err e amount = utils.BigIntToFloat(iamt, uint8(decimals)) return } - -/* -type txResponseWrapper interface { - getResponseDeliverTx() *abcitypes.ResponseDeliverTx - getTx() tmtypes.Tx -} -type baseTxResponseWrapper struct { - tx tmtypes.Tx - txResult *abcitypes.ResponseDeliverTx -} - -func (w baseTxResponseWrapper) getTx() tmtypes.Tx { - return w.tx -} - -func (w baseTxResponseWrapper) getResponseDeliverTx() *abcitypes.ResponseDeliverTx { - return w.txResult -} - -type delegateTxResponse struct { - baseTxResponseWrapper -} -type undelegateTxResponse struct { - baseTxResponseWrapper -} -type redelegateTxResponse struct { - baseTxResponseWrapper -} -type unbondTxResponse struct { - baseTxResponseWrapper -} - -func (c *CosmosIndexer) handleStakingEvents(height int64, txResponses map[string]txResponseWrapper) error { - stakingEvents := make([]*types.CosmosStakingEvent, 0, len(txResponses)) - for _, txw := range txResponses { - dumpTxResult(txw.getResponseDeliverTx()) - var err error - var stakingEvent *types.CosmosStakingEvent - switch v := txw.(type) { - case delegateTxResponse: - stakingEvent, err = c.handleDelegate(height, v) - case undelegateTxResponse: - err = handleUndelegate(height, v) - case redelegateTxResponse: - err = handleRedelegate(height, v) - case unbondTxResponse: - err = handleUnbond(height, v) - } - if err != nil { - log.Errorf("error handling %s staking event: %+v", txw.getResponseDeliverTx().GetInfo(), err) - continue - } - if stakingEvent == nil { - log.Warnf("no staking event produced for %s", hashTx(txw.getTx())) - continue - } - stakingEvents = append(stakingEvents, stakingEvent) - } - if len(stakingEvents) > 0 { - log.Infof("found %d staking events to write at height %d", len(stakingEvents), height) - if err := c.db.InsertStakingEvents(stakingEvents); err != nil { - return errors.Wrapf(err, "error inserting staking events at height %d, abort", height) - } - } - - return nil -} - -func (c *CosmosIndexer) handleDelegate(height int64, d delegateTxResponse) (*types.CosmosStakingEvent, error) { - tx := d.tx - txHash := hashTx(tx) - log.Infof("tx %s has delegate event", txHash) - txResult := d.txResult - - attribMap := make(map[string]string, 64) - evtsSequenced := make([]abcitypes.Event, len(txResult.GetEvents())) - evtsSeq := 0 - for _, evt := range txResult.GetEvents() { - switch evt.GetType() { - case "delegate": - evtsSequenced[evtsSeq] = evt - evtsSeq++ - // for _, attrib := range evt.GetAttributes() { - // attribMap[string(attrib.GetKey())] = string(attrib.GetValue()) - // } - // case "transfer": - // for _, attrib := range evt.GetAttributes() { - // attribMap[string(attrib.GetKey())] = string(attrib.GetValue()) - // } - case "message": - m := make(map[string]string, len(evt.GetAttributes())) - for _, attr := range evt.GetAttributes() { - m[string(attr.GetKey())] = string(attr.GetValue()) - } - if module, ok := m["module"]; ok && module == "staking" { - if delegator, ok := m["sender"]; ok { - log.Infof("adding delegate event delegator %s", delegator) - // log.Infof("setting module_staking_delegator to %s", delegator) - // attribMap["module_staking_delegator"] = delegator - evtsSequenced[evtsSeq] = evt - evtsSeq++ - } - } - // case "tx": - // for _, attrib := range evt.GetAttributes() { - // if string(attrib.GetKey()) == "acc_seq" { - // spl := strings.Split(string(attrib.GetValue()), "/") - // attribMap["delegator"] = spl[0] - // break - // } - // attribMap[string(attrib.GetKey())] = string(attrib.GetValue()) - // } - default: - } - } - if len(attribMap) < 1 { - return nil, fmt.Errorf("no attributes for delegate event, height: %d, tx: %s", height, txHash) - } - _, amt, err := parseAmount(attribMap["amount"], c.chain.Decimals) - if err != nil { - log.Errorf("error parsing amount %s: %+v", attribMap["amount"], err) - } - cse := &types.CosmosStakingEvent{ - EventType: "delegate", - Chain: c.chain.Name, - BlockNumber: uint64(height), - TxHash: txHash, - Delegator: attribMap["delegator"], - Validator: attribMap["validator"], - Value: amt, - } - - return cse, nil -} -*/ - -// func dumpTxResult(r *abcitypes.ResponseDeliverTx) { -// uniq := make(map[string]string, 256) -// for _, evt := range r.Events { -// // log.Infof("evt: %s", evt.GetType()) -// for _, attrib := range evt.GetAttributes() { -// // log.Infof("%s : %s", attrib.GetKey(), attrib.GetValue()) -// uniq[string(attrib.GetKey())] = string(attrib.GetValue()) -// } -// } -// for k, v := range uniq { -// log.Infof("%s : %s", k, v) -// } -// } From 976a984b94771fccb9fa83a7ac2eb00e937c22ef Mon Sep 17 00:00:00 2001 From: adam Date: Fri, 20 Jan 2023 10:21:18 -0800 Subject: [PATCH 5/8] read block and results concurrently resume from latest indexed --- indexer/cosmos.go | 45 ++++++++++++++++++++++++++++------- pkg/db/cosmos_staking.go | 13 ++++++++++ pkg/db/cosmos_staking_sql.go | 3 +++ pkg/db/cosmos_staking_test.go | 33 +++++++++++++++++++++++++ 4 files changed, 85 insertions(+), 9 deletions(-) create mode 100644 pkg/db/cosmos_staking_test.go diff --git a/indexer/cosmos.go b/indexer/cosmos.go index 01b93e8..b4a9fd4 100644 --- a/indexer/cosmos.go +++ b/indexer/cosmos.go @@ -7,6 +7,7 @@ import ( "fmt" "math/big" "strings" + "sync" "github.com/ArkeoNetwork/airdrop/pkg/db" "github.com/ArkeoNetwork/airdrop/pkg/types" @@ -15,6 +16,7 @@ import ( "github.com/pkg/errors" abcitypes "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/rpc/client/http" + coretypes "github.com/tendermint/tendermint/rpc/core/types" tmtypes "github.com/tendermint/tendermint/types" ) @@ -57,6 +59,15 @@ func (c *CosmosIndexer) IndexDelegators() error { startHeight := int64(c.chain.SnapshotStartBlock) endHeight := int64(c.chain.SnapshotEndBlock) + latest, err := c.db.FindLatestIndexedCosmosStakingBlock() + if err != nil { + return errors.Wrapf(err, "error finding latest indexed block") + } + if latest > startHeight { + log.Infof("found latest indexed block %d, starting at %d", latest, latest-1) + startHeight = latest - 1 + } + for i := startHeight; i <= endHeight; i++ { if err := c.indexDelegations(i); err != nil { log.Errorf("error indexing delegations at height %d: %+v", i, err) @@ -83,6 +94,7 @@ func isStakingTx(tx tmtypes.Tx, txResults *abcitypes.ResponseDeliverTx) bool { } func (c *CosmosIndexer) handleStakingTx(height int64, tx tmtypes.Tx, txResult *abcitypes.ResponseDeliverTx) error { + log := log.WithField("height", fmt.Sprintf("%d", height)) txHash := hashTx(tx) evtsSequenced := make([]abcitypes.Event, len(txResult.GetEvents())) evtsSeq := int64(0) @@ -204,15 +216,30 @@ func attributesToMap(attributes []abcitypes.EventAttribute) map[string]string { func (c *CosmosIndexer) indexDelegations(height int64) error { log := log.WithField("height", fmt.Sprintf("%d", height)) - ctx := context.Background() - block, err := c.tm.Block(ctx, &height) - if err != nil { - return errors.Wrapf(err, "error reading block at %d", height) - } + var ( + ctx = context.Background() + block *coretypes.ResultBlock + blockResults *coretypes.ResultBlockResults + blockErr error + blockResErr error + wg sync.WaitGroup + ) - blockResults, err := c.tm.BlockResults(ctx, &height) - if err != nil { - return errors.Wrapf(err, "error reading block results at %d", height) + wg.Add(2) + go func() { + defer wg.Done() + block, blockErr = c.tm.Block(ctx, &height) + }() + go func() { + defer wg.Done() + blockResults, blockResErr = c.tm.BlockResults(ctx, &height) + }() + wg.Wait() + if blockErr != nil { + return errors.Wrapf(blockErr, "error reading block %d", height) + } + if blockResErr != nil { + return errors.Wrapf(blockResErr, "error reading blockResults %d", blockResErr) } for i := range block.Block.Txs { @@ -220,7 +247,7 @@ func (c *CosmosIndexer) indexDelegations(height int64) error { txHash := hashTx(tx) _ = txHash if isStakingTx(tx, blockResults.TxsResults[i]) { - if err = c.handleStakingTx(height, tx, blockResults.TxsResults[i]); err != nil { + if err := c.handleStakingTx(height, tx, blockResults.TxsResults[i]); err != nil { log.Errorf("error handling staking tx %s: %+v", hashTx(tx), err) } } diff --git a/pkg/db/cosmos_staking.go b/pkg/db/cosmos_staking.go index c45db7b..21a2bb8 100644 --- a/pkg/db/cosmos_staking.go +++ b/pkg/db/cosmos_staking.go @@ -40,3 +40,16 @@ func (d *AirdropDB) InsertStakingEvents(event []*types.CosmosStakingEvent) error } return nil } + +func (d *AirdropDB) FindLatestIndexedCosmosStakingBlock() (int64, error) { + conn, err := d.getConnection() + defer conn.Release() + if err != nil { + return 0, errors.Wrapf(err, "error obtaining db connection") + } + var r int64 + if err = selectOne(conn, sqlFindLatestCosmosStakingBlockIndexed, &r); err != nil { + return 0, errors.Wrapf(err, "error selecting latest block") + } + return r, nil +} diff --git a/pkg/db/cosmos_staking_sql.go b/pkg/db/cosmos_staking_sql.go index 8928099..707a57b 100644 --- a/pkg/db/cosmos_staking_sql.go +++ b/pkg/db/cosmos_staking_sql.go @@ -7,4 +7,7 @@ const ( on conflict on constraint cosmos_staking_events_unique do nothing ` + sqlFindLatestCosmosStakingBlockIndexed = ` + select max(block_number) from cosmos_staking_events + ` ) diff --git a/pkg/db/cosmos_staking_test.go b/pkg/db/cosmos_staking_test.go new file mode 100644 index 0000000..9a7dd44 --- /dev/null +++ b/pkg/db/cosmos_staking_test.go @@ -0,0 +1,33 @@ +package db + +import ( + "testing" + + "github.com/ArkeoNetwork/common/utils" + "github.com/stretchr/testify/assert" +) + +var envPath = "/Users/adamsamere/chaintech/oss/arkeo/airdrop/docker/dev/docker.env" + +// #javanaming +func TestFindLatestIndexedCosmosStakingBlock(t *testing.T) { + c := utils.ReadDBConfig(envPath) + if !assert.NotNil(t, c) { + t.FailNow() + } + d, err := New(*c) + if !assert.Nil(t, err) { + t.FailNow() + } + if !assert.NotNil(t, d) { + t.FailNow() + } + + latest, err := d.FindLatestIndexedCosmosStakingBlock() + if !assert.Nil(t, err) { + t.FailNow() + } + if assert.NotNil(t, latest) { + assert.Greater(t, latest, int64(0)) + } +} From 8329608436aada9a6d5a7acac763e01bf3c5bee0 Mon Sep 17 00:00:00 2001 From: adam Date: Fri, 20 Jan 2023 11:42:39 -0800 Subject: [PATCH 6/8] use TxSearch for module=staking (performance) --- indexer/cosmos.go | 70 ++++++++++++++++++++++------------------------- 1 file changed, 33 insertions(+), 37 deletions(-) diff --git a/indexer/cosmos.go b/indexer/cosmos.go index b4a9fd4..66bd3d0 100644 --- a/indexer/cosmos.go +++ b/indexer/cosmos.go @@ -7,7 +7,6 @@ import ( "fmt" "math/big" "strings" - "sync" "github.com/ArkeoNetwork/airdrop/pkg/db" "github.com/ArkeoNetwork/airdrop/pkg/types" @@ -76,9 +75,7 @@ func (c *CosmosIndexer) IndexDelegators() error { return nil } -func isStakingTx(tx tmtypes.Tx, txResults *abcitypes.ResponseDeliverTx) bool { - txHash := hashTx(tx) - _ = txHash +func shouldStoreTx(tx tmtypes.Tx, txResults *abcitypes.ResponseDeliverTx) bool { for _, evt := range txResults.Events { switch evt.GetType() { case "delegate": @@ -131,6 +128,7 @@ func (c *CosmosIndexer) handleStakingTx(height int64, tx tmtypes.Tx, txResult *a for i, evt := range evtsSequenced { m := attributesToMap(evt.GetAttributes()) if i%2 == 0 { + // staking event itself: delegate,unbond,redelegate _, amount, err := parseAmount(m["amount"], c.chain.Decimals) if err != nil { log.Errorf("error parsing amount %s: %+v", m["amount"], err) @@ -164,10 +162,6 @@ func (c *CosmosIndexer) handleStakingTx(height int64, tx tmtypes.Tx, txResult *a }, srcValidator: srcValidator, } - - // should be delegate/un/re? - log.Debug(evt) - } else { // should be message+staking module+spender (delegator address)? log.Debug(evt) @@ -197,7 +191,7 @@ func (c *CosmosIndexer) handleStakingTx(height int64, tx tmtypes.Tx, txResult *a stakingEvt = nil } } - log.Infof("have %d staking events", len(stakingEvents)) + log.Infof("inserting %d staking events", len(stakingEvents)) return c.db.InsertStakingEvents(stakingEvents) } @@ -217,39 +211,41 @@ func attributesToMap(attributes []abcitypes.EventAttribute) map[string]string { func (c *CosmosIndexer) indexDelegations(height int64) error { log := log.WithField("height", fmt.Sprintf("%d", height)) var ( - ctx = context.Background() - block *coretypes.ResultBlock - blockResults *coretypes.ResultBlockResults - blockErr error - blockResErr error - wg sync.WaitGroup + ctx = context.Background() + txSearchResults []*coretypes.ResultTx + txSearchErr error ) - wg.Add(2) - go func() { - defer wg.Done() - block, blockErr = c.tm.Block(ctx, &height) - }() - go func() { - defer wg.Done() - blockResults, blockResErr = c.tm.BlockResults(ctx, &height) - }() - wg.Wait() - if blockErr != nil { - return errors.Wrapf(blockErr, "error reading block %d", height) + page := 1 + perPage := 100 + query := fmt.Sprintf("tx.height=%d AND message.module='staking'", height) + txSearchResults = make([]*coretypes.ResultTx, 0, 128) + for { + searchResults, err := c.tm.TxSearch(ctx, query, false, &page, &perPage, "asc") + if err != nil { + txSearchErr = errors.Wrapf(err, "error reading search results height: %d page %d", height, page) + break + } + + txSearchResults = append(txSearchResults, searchResults.Txs...) + if len(txSearchResults) == searchResults.TotalCount { + log.Debugf("height %d break tx search loop with %d gathered. %d in page %d totalCount %d", height, len(txSearchResults), len(searchResults.Txs), page, searchResults.TotalCount) + break + } + txSearchResults = append(txSearchResults, searchResults.Txs...) + page++ } - if blockResErr != nil { - return errors.Wrapf(blockResErr, "error reading blockResults %d", blockResErr) + + if txSearchErr != nil { + return errors.Wrapf(txSearchErr, "error searching txs block %d", height) } - for i := range block.Block.Txs { - tx := block.Block.Txs[i] - txHash := hashTx(tx) - _ = txHash - if isStakingTx(tx, blockResults.TxsResults[i]) { - if err := c.handleStakingTx(height, tx, blockResults.TxsResults[i]); err != nil { - log.Errorf("error handling staking tx %s: %+v", hashTx(tx), err) - } + for _, t := range txSearchResults { + if !shouldStoreTx(t.Tx, &t.TxResult) { + continue + } + if err := c.handleStakingTx(height, t.Tx, &t.TxResult); err != nil { + log.Errorf("error handling staking tx %s: %+v", hashTx(t.Tx), err) } } return nil From 2b656174870a5a15eba20c4b8a6e7bc6d57c657c Mon Sep 17 00:00:00 2001 From: adam Date: Fri, 20 Jan 2023 12:07:11 -0800 Subject: [PATCH 7/8] GetEnvPath to utils (testing) --- indexer/cosmos_test.go | 7 +++---- pkg/db/chains_test.go | 6 +++--- pkg/db/cosmos_staking_test.go | 7 +++---- pkg/utils/utils.go | 14 ++++++++++++++ 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/indexer/cosmos_test.go b/indexer/cosmos_test.go index c8d64b5..ab5a640 100644 --- a/indexer/cosmos_test.go +++ b/indexer/cosmos_test.go @@ -4,14 +4,13 @@ import ( "fmt" "testing" - "github.com/ArkeoNetwork/common/utils" + "github.com/ArkeoNetwork/airdrop/pkg/utils" + arkutils "github.com/ArkeoNetwork/common/utils" "github.com/stretchr/testify/assert" ) -const envPath = "/Users/adamsamere/chaintech/oss/arkeo/airdrop/docker/dev/docker.env" - func TestIndexDelegations(t *testing.T) { - c := utils.ReadDBConfig(envPath) + c := arkutils.ReadDBConfig(utils.GetEnvPath()) if c == nil { fmt.Print("error: no config loaded") return diff --git a/pkg/db/chains_test.go b/pkg/db/chains_test.go index 4631c47..90eb1a9 100644 --- a/pkg/db/chains_test.go +++ b/pkg/db/chains_test.go @@ -5,7 +5,8 @@ import ( "fmt" "testing" - "github.com/ArkeoNetwork/common/utils" + "github.com/ArkeoNetwork/airdrop/pkg/utils" + arkutils "github.com/ArkeoNetwork/common/utils" "github.com/stretchr/testify/assert" ) @@ -28,8 +29,7 @@ func TestFindAllChains(t *testing.T) { } func TestFindChain(t *testing.T) { - envPath := "/Users/adamsamere/chaintech/oss/arkeo/airdrop/docker/dev/docker.env" - c := utils.ReadDBConfig(envPath) + c := arkutils.ReadDBConfig(utils.GetEnvPath()) if c == nil { fmt.Print("error: no config loaded") return diff --git a/pkg/db/cosmos_staking_test.go b/pkg/db/cosmos_staking_test.go index 9a7dd44..222bcc9 100644 --- a/pkg/db/cosmos_staking_test.go +++ b/pkg/db/cosmos_staking_test.go @@ -3,15 +3,14 @@ package db import ( "testing" - "github.com/ArkeoNetwork/common/utils" + "github.com/ArkeoNetwork/airdrop/pkg/utils" + arkutils "github.com/ArkeoNetwork/common/utils" "github.com/stretchr/testify/assert" ) -var envPath = "/Users/adamsamere/chaintech/oss/arkeo/airdrop/docker/dev/docker.env" - // #javanaming func TestFindLatestIndexedCosmosStakingBlock(t *testing.T) { - c := utils.ReadDBConfig(envPath) + c := arkutils.ReadDBConfig(utils.GetEnvPath()) if !assert.NotNil(t, c) { t.FailNow() } diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index 60b4a50..a593288 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -3,11 +3,25 @@ package utils import ( "math" "math/big" + "os" + + "github.com/ArkeoNetwork/common/logging" ) +var log = logging.WithoutFields() + func BigIntToFloat(value *big.Int, decimals uint8) float64 { transferValue := new(big.Float).SetInt(value) transferValue.Quo(transferValue, big.NewFloat(float64(math.Pow10(int(decimals))))) transferValueDecimal, _ := transferValue.Float64() return transferValueDecimal } + +func GetEnvPath() string { + envPath := os.Getenv("AIRDROP_ENV_PATH") + if envPath == "" { + log.Warn("no value in $AIRDROP_ENV_PATH") + } + + return envPath +} From a9b179419e60da6c5599bcbd36596f54c056b8a4 Mon Sep 17 00:00:00 2001 From: adam Date: Wed, 25 Jan 2023 09:35:33 -0800 Subject: [PATCH 8/8] update cosmos start height --- db/009_cosmos1.sql | 2 +- go.mod | 1 - go.sum | 3 --- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/db/009_cosmos1.sql b/db/009_cosmos1.sql index 3d95e3a..ddb1260 100644 --- a/db/009_cosmos1.sql +++ b/db/009_cosmos1.sql @@ -1,5 +1,5 @@ insert into chains(name,rpc_url,snapshot_start_block,snapshot_end_block,decimals) -values ('GAIA','https://daemon.cosmos.shapeshift.com/rpc',12940505,13714445,6); +values ('GAIA','https://daemon.cosmos.shapeshift.com:443/rpc',13050670,13714445,6); ---- create above / drop below ---- delete from chains where name = 'GAIA'; diff --git a/go.mod b/go.mod index eaf1688..0efb116 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,6 @@ require ( github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.5.1 // indirect - github.com/go-resty/resty/v2 v2.7.0 // indirect github.com/gogo/protobuf v1.3.3 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/google/go-cmp v0.5.8 // indirect diff --git a/go.sum b/go.sum index c09a147..a2813a4 100644 --- a/go.sum +++ b/go.sum @@ -133,8 +133,6 @@ github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNV github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= -github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -584,7 +582,6 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 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=