diff --git a/Makefile b/Makefile index 8bf23bac..b29538d7 100644 --- a/Makefile +++ b/Makefile @@ -238,6 +238,10 @@ format: ### Localnet ### ############################################################################### +# Build docker image and tag as kava/kava:local +docker-build: + $(DOCKER) build -t kava/kava:local . + build-docker-local-kava: @$(MAKE) -C networks/local @@ -285,8 +289,13 @@ test-basic: test @# AppStateDeterminism does not use Seed flag @go test ./app -run TestAppStateDeterminism -Enabled -Commit -NumBlocks=5 -BlockSize=200 -Seed 4 -v -timeout 2m +# run end-to-end tests (local docker container must be built, see docker-build) +test-e2e: + export E2E_KAVA_FUNDED_ACCOUNT_MNEMONIC='season bone lucky dog depth pond royal decide unknown device fruit inch clock trap relief horse morning taxi bird session throw skull avocado private'; \ + go test -failfast -count=1 -v ./tests/e2e/... + test: - @go test $$(go list ./... | grep -v 'contrib') + @go test $$(go list ./... | grep -v 'contrib' | grep -v 'tests/e2e') # Run cli integration tests # `-p 4` to use 4 cores, `-tags cli_test` to tell go not to ignore the cli package diff --git a/go.mod b/go.mod index a38cdfd9..c75985bf 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.18 require ( github.com/cosmos/cosmos-proto v1.0.0-alpha6 github.com/cosmos/cosmos-sdk v0.45.10 + github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/ibc-go/v3 v3.4.0 github.com/ethereum/go-ethereum v1.10.16 github.com/gogo/protobuf v1.3.3 @@ -12,6 +13,7 @@ require ( github.com/golang/protobuf v1.5.2 github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 + github.com/ory/dockertest/v3 v3.9.1 github.com/spf13/cast v1.5.0 github.com/spf13/cobra v1.6.0 github.com/stretchr/testify v1.8.0 @@ -27,7 +29,10 @@ require ( require ( filippo.io/edwards25519 v1.0.0-beta.2 // indirect github.com/99designs/keyring v1.1.6 // indirect + github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect + github.com/Microsoft/go-winio v0.6.0 // indirect + github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect github.com/StackExchange/wmi v1.2.1 // indirect github.com/VictoriaMetrics/fastcache v1.6.0 // indirect github.com/Workiva/go-datastructures v1.0.53 // indirect @@ -38,13 +43,13 @@ require ( github.com/btcsuite/btcd v0.22.1 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce // indirect - github.com/cenkalti/backoff/v4 v4.1.1 // indirect + github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/coinbase/rosetta-sdk-go v0.7.0 // indirect github.com/confio/ics23/go v0.7.0 // indirect + github.com/containerd/continuity v0.3.0 // indirect github.com/cosmos/btcutil v1.0.4 // indirect - github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/iavl v0.19.4 // indirect github.com/cosmos/ledger-cosmos-go v0.11.1 // indirect github.com/cosmos/ledger-go v0.9.2 // indirect @@ -55,6 +60,10 @@ require ( github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect github.com/dgraph-io/badger/v3 v3.2103.2 // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect + github.com/docker/cli v20.10.14+incompatible // indirect + github.com/docker/docker v20.10.19+incompatible // indirect + github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.0 // indirect github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b // indirect github.com/edsrzf/mmap-go v1.0.0 // indirect @@ -74,6 +83,7 @@ require ( github.com/google/btree v1.0.1 // indirect github.com/google/flatbuffers v1.12.1 // indirect github.com/google/orderedcode v0.0.1 // indirect + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect @@ -88,6 +98,7 @@ require ( github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.2.0 // indirect github.com/huin/goupnp v1.0.2 // indirect + github.com/imdario/mergo v0.3.12 // indirect github.com/improbable-eng/grpc-web v0.15.0 // indirect github.com/inconshreveable/mousetrap v1.0.1 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect @@ -105,8 +116,12 @@ require ( github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/minio/highwayhash v1.0.2 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae // indirect github.com/mtibben/percent v0.2.1 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.0-rc2 // indirect + github.com/opencontainers/runc v1.1.3 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.0.5 // indirect github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect @@ -125,6 +140,7 @@ require ( github.com/rs/zerolog v1.27.0 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect + github.com/sirupsen/logrus v1.9.0 // indirect github.com/spf13/afero v1.8.2 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect @@ -139,16 +155,21 @@ require ( github.com/tklauser/go-sysconf v0.3.7 // indirect github.com/tklauser/numcpus v0.2.3 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect + github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect + github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/zondax/hid v0.9.0 // indirect go.etcd.io/bbolt v1.3.6 // indirect go.opencensus.io v0.23.0 // indirect golang.org/x/crypto v0.1.0 // indirect golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect + golang.org/x/mod v0.6.0 // indirect golang.org/x/net v0.1.0 // indirect golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0 // indirect golang.org/x/sys v0.1.0 // indirect golang.org/x/term v0.1.0 // indirect golang.org/x/text v0.4.0 // indirect + golang.org/x/tools v0.2.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6 // indirect diff --git a/go.sum b/go.sum index 59bb8943..f088807f 100644 --- a/go.sum +++ b/go.sum @@ -45,6 +45,7 @@ github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiU github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= @@ -65,7 +66,9 @@ github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= +github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= @@ -154,8 +157,9 @@ github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOC github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= 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/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= @@ -164,9 +168,11 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf 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/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= @@ -179,11 +185,14 @@ github.com/coinbase/rosetta-sdk-go v0.7.0 h1:lmTO/JEpCvZgpbkOITL95rA80CPKb5CtMzL github.com/coinbase/rosetta-sdk-go v0.7.0/go.mod h1:7nD3oBPIiHqhRprqvMgPoGxe/nyq3yftRmpsy29coWE= github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= +github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.4 h1:n7C2ngKXo7UC9gNyMNLbzqz7Asuf+7Qv4gnX/rOdQ44= @@ -212,7 +221,10 @@ github.com/creachadair/taskgroup v0.3.2 h1:zlfutDS+5XG40AOxcHDSThxKzns8Tnr9jnr6V github.com/creachadair/taskgroup v0.3.2/go.mod h1:wieWwecHVzsidg2CsUnFinW1faVN4+kq+TDlRJQ0Wbk= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= +github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/danieljoos/wincred v1.0.2 h1:zf4bhty2iLuwgjgpraD2E9UbvO+fe54XXGJbOwe23fU= github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= @@ -243,9 +255,16 @@ github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUn github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/docker/cli v20.10.14+incompatible h1:dSBKJOVesDgHo7rbxlYjYsXe7gPzrTT+/cKQgpDAazg= +github.com/docker/cli v20.10.14+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.19+incompatible h1:lzEmjivyNHFHMNAFLXORMBXyGIhw/UP4DvJwvyKYq64= +github.com/docker/docker v20.10.19+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= @@ -279,6 +298,7 @@ github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/ github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -329,6 +349,7 @@ github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5Nq github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= 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/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= @@ -340,6 +361,7 @@ github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/E github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/gateway v1.1.0 h1:u0SuhL9+Il+UbjM9VIE3ntfRujKbvVpFvNB4HbjeVQ0= github.com/gogo/gateway v1.1.0/go.mod h1:S7rR8FRQyG3QFESeSv4l2WnsyzlCLG0CzBbUUo/mbic= @@ -425,6 +447,8 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -513,6 +537,8 @@ github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSa github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= @@ -669,6 +695,9 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua 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/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae h1:O4SWKdcHVCvYqyDV+9CJA1fcDN2L11Bule0iFy3YlAI= +github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -676,6 +705,7 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= @@ -715,8 +745,13 @@ github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034= +github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= github.com/opencontainers/runc v1.1.3 h1:vIXrkId+0/J2Ymu2m7VjGvbSlAId9XNRPhn2p4b+d8w= +github.com/opencontainers/runc v1.1.3/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -727,6 +762,8 @@ github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= +github.com/ory/dockertest/v3 v3.9.1 h1:v4dkG+dlu76goxMiTT2j8zV7s4oPPEppKT8K8p2f1kY= +github.com/ory/dockertest/v3 v3.9.1/go.mod h1:42Ir9hmvaAPm0Mgibk6mBPi7SFvTXxEcnztDYOJ//uM= github.com/otiai10/copy v1.6.0 h1:IinKAryFFuPONZ7cm6T6E2QX/vcJwSnlaA5lfoaXIiQ= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -833,6 +870,7 @@ github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0 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/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= @@ -845,7 +883,9 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -898,6 +938,7 @@ github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PK github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 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/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= @@ -939,10 +980,18 @@ github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/X github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vmihailenco/msgpack/v5 v5.1.4/go.mod h1:C5gboKD0TJPqWDTVTtrQNfRbiBwHZGo8UTqP/9/XvLI= github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= @@ -1044,6 +1093,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/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I= +golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1139,6 +1189,7 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1150,6 +1201,7 @@ golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1196,13 +1248,18 @@ golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/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-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.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1242,6 +1299,7 @@ golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1288,6 +1346,7 @@ golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.2.0 h1:G6AHpWxTMGY1KyEYoAQ5WTtIekUUvDNjan3ugu60JvE= +golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1387,6 +1446,7 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8 h1:KR8+MyP7/qOlV+8Af01LtjL04bu7on42eVsxT4EyBQk= google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= @@ -1425,7 +1485,10 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.2.0 h1:I0DwBVMGAx26dttAj1BtJLAkVGncrkkUXfJLC4Flt/I= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go new file mode 100644 index 00000000..e4d4e280 --- /dev/null +++ b/tests/e2e/e2e_test.go @@ -0,0 +1,51 @@ +package e2e_test + +import ( + "context" + "math/big" + "testing" + + "github.com/stretchr/testify/suite" + + "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/kava-labs/kava/tests/e2e/testutil" +) + +func ukava(amt int64) sdk.Coin { + return sdk.NewCoin("ukava", sdk.NewInt(amt)) +} + +type IntegrationTestSuite struct { + testutil.E2eTestSuite +} + +func TestIntegrationTestSuite(t *testing.T) { + suite.Run(t, new(IntegrationTestSuite)) +} + +// example test that queries kava chain & kava's EVM +func (suite *IntegrationTestSuite) TestChainID() { + // TODO: make chain agnostic, don't hardcode expected chain ids + + evmNetworkId, err := suite.EvmClient.NetworkID(context.Background()) + suite.NoError(err) + suite.Equal(big.NewInt(8888), evmNetworkId) + + nodeInfo, err := suite.Tm.GetNodeInfo(context.Background(), &tmservice.GetNodeInfoRequest{}) + suite.NoError(err) + suite.Equal(testutil.ChainId, nodeInfo.DefaultNodeInfo.Network) +} + +// example test that funds a new account & queries its balance +func (suite *IntegrationTestSuite) TestFundedAccount() { + funds := ukava(1e7) + acc := suite.NewFundedAccount("example-acc", sdk.NewCoins(funds)) + res, err := suite.Bank.Balance(context.Background(), banktypes.NewQueryBalanceRequest( + acc.Address, "ukava", + )) + suite.NoError(err) + suite.Equal(funds, *res.Balance) +} diff --git a/tests/e2e/generated/kava-1/config/addrbook.json b/tests/e2e/generated/kava-1/config/addrbook.json new file mode 100644 index 00000000..cbaf0bae --- /dev/null +++ b/tests/e2e/generated/kava-1/config/addrbook.json @@ -0,0 +1,4 @@ +{ + "key": "a8235b98e65b6890091537ac", + "addrs": [] +} \ No newline at end of file diff --git a/tests/e2e/generated/kava-1/config/app.toml b/tests/e2e/generated/kava-1/config/app.toml new file mode 100644 index 00000000..03877fa0 --- /dev/null +++ b/tests/e2e/generated/kava-1/config/app.toml @@ -0,0 +1,272 @@ +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +############################################################################### +### Base Configuration ### +############################################################################### + +# The minimum gas prices a validator is willing to accept for processing a +# transaction. A transaction's fees must meet the minimum of any denomination +# specified in this config (e.g. 0.25token1;0.0001token2). +minimum-gas-prices = "0.001ukava;1000000000akava" + +# default: the last 100 states are kept in addition to every 500th state; pruning at 10 block intervals +# nothing: all historic states will be saved, nothing will be deleted (i.e. archiving node) +# everything: all saved states will be deleted, storing only the current and previous state; pruning at 10 block intervals +# custom: allow pruning options to be manually specified through 'pruning-keep-recent', 'pruning-keep-every', and 'pruning-interval' +pruning = "nothing" + +# These are applied if and only if the pruning strategy is custom. +pruning-keep-recent = "0" +pruning-keep-every = "0" +pruning-interval = "0" + +# HaltHeight contains a non-zero block height at which a node will gracefully +# halt and shutdown that can be used to assist upgrades and testing. +# +# Note: Commitment of state will be attempted on the corresponding block. +halt-height = 0 + +# HaltTime contains a non-zero minimum block time (in Unix seconds) at which +# a node will gracefully halt and shutdown that can be used to assist upgrades +# and testing. +# +# Note: Commitment of state will be attempted on the corresponding block. +halt-time = 0 + +# MinRetainBlocks defines the minimum block height offset from the current +# block being committed, such that all blocks past this offset are pruned +# from Tendermint. It is used as part of the process of determining the +# ResponseCommit.RetainHeight value during ABCI Commit. A value of 0 indicates +# that no blocks should be pruned. +# +# This configuration value is only responsible for pruning Tendermint blocks. +# It has no bearing on application state pruning which is determined by the +# "pruning-*" configurations. +# +# Note: Tendermint block pruning is dependant on this parameter in conunction +# with the unbonding (safety threshold) period, state pruning and state sync +# snapshot parameters to determine the correct minimum value of +# ResponseCommit.RetainHeight. +min-retain-blocks = 0 + +# InterBlockCache enables inter-block caching. +inter-block-cache = true + +# IndexEvents defines the set of events in the form {eventType}.{attributeKey}, +# which informs Tendermint what to index. If empty, all events will be indexed. +# +# Example: +# ["message.sender", "message.recipient"] +index-events = [] + +# IavlCacheSize set the size of the iavl tree cache. +# Default cache size is 50mb. +iavl-cache-size = 781250 +trace = true +# IAVLDisableFastNode enables or disables the fast node feature of IAVL. +# Default is true. +iavl-disable-fastnode = true + +############################################################################### +### Telemetry Configuration ### +############################################################################### + +[telemetry] + +# Prefixed with keys to separate services. +service-name = "" + +# Enabled enables the application telemetry functionality. When enabled, +# an in-memory sink is also enabled by default. Operators may also enabled +# other sinks such as Prometheus. +enabled = false + +# Enable prefixing gauge values with hostname. +enable-hostname = false + +# Enable adding hostname to labels. +enable-hostname-label = false + +# Enable adding service to labels. +enable-service-label = false + +# PrometheusRetentionTime, when positive, enables a Prometheus metrics sink. +prometheus-retention-time = 0 + +# GlobalLabels defines a global set of name/value label tuples applied to all +# metrics emitted using the wrapper functions defined in telemetry package. +# +# Example: +# [["chain_id", "cosmoshub-1"]] +global-labels = [ +] + +############################################################################### +### API Configuration ### +############################################################################### + +[api] + +# Enable defines if the API server should be enabled. +enable = true + +# Swagger defines if swagger documentation should automatically be registered. +swagger = false + +# Address defines the API server to listen on. +address = "tcp://0.0.0.0:1317" + +# MaxOpenConnections defines the number of maximum open connections. +max-open-connections = 1000 + +# RPCReadTimeout defines the Tendermint RPC read timeout (in seconds). +rpc-read-timeout = 10 + +# RPCWriteTimeout defines the Tendermint RPC write timeout (in seconds). +rpc-write-timeout = 0 + +# RPCMaxBodyBytes defines the Tendermint maximum response body (in bytes). +rpc-max-body-bytes = 1000000 + +# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk). +enabled-unsafe-cors = true + +############################################################################### +### Rosetta Configuration ### +############################################################################### + +[rosetta] + +# Enable defines if the Rosetta API server should be enabled. +enable = true + +# Address defines the Rosetta API server to listen on. +address = ":8080" + +# Network defines the name of the blockchain that will be returned by Rosetta. +blockchain = "app" + +# Network defines the name of the network that will be returned by Rosetta. +network = "network" + +# Retries defines the number of retries when connecting to the node before failing. +retries = 3 + +# Offline defines if Rosetta server should run in offline mode. +offline = false + +############################################################################### +### gRPC Configuration ### +############################################################################### + +[grpc] + +# Enable defines if the gRPC server should be enabled. +enable = true + +# Address defines the gRPC server address to bind to. +address = "0.0.0.0:9090" + +############################################################################### +### gRPC Web Configuration ### +############################################################################### + +[grpc-web] + +# GRPCWebEnable defines if the gRPC-web should be enabled. +# NOTE: gRPC must also be enabled, otherwise, this configuration is a no-op. +enable = true + +# Address defines the gRPC-web server address to bind to. +address = "0.0.0.0:9091" + +# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk). +enable-unsafe-cors = false + +############################################################################### +### State Sync Configuration ### +############################################################################### + +# State sync snapshots allow other nodes to rapidly join the network without replaying historical +# blocks, instead downloading and applying a snapshot of the application state at a given height. +[state-sync] + +# snapshot-interval specifies the block interval at which local state sync snapshots are +# taken (0 to disable). Must be a multiple of pruning-keep-every. +snapshot-interval = 0 + +# snapshot-keep-recent specifies the number of recent snapshots to keep and serve (0 to keep all). +snapshot-keep-recent = 2 + +############################################################################### +### EVM Configuration ### +############################################################################### + +[evm] + +# Tracer defines the 'vm.Tracer' type that the EVM will use when the node is run in +# debug mode. To enable tracing use the '--evm.tracer' flag when starting your node. +# Valid types are: json|struct|access_list|markdown +tracer = "json" + +# MaxTxGasWanted defines the gas wanted for each eth tx returned in ante handler in check tx mode. +max-tx-gas-wanted = 500000 + +############################################################################### +### JSON RPC Configuration ### +############################################################################### + +[json-rpc] + +# Enable defines if the gRPC server should be enabled. +enable = true + +# Address defines the EVM RPC HTTP server address to bind to. +address = "0.0.0.0:8545" + +# Address defines the EVM WebSocket server address to bind to. +ws-address = "0.0.0.0:8546" + +# API defines a list of JSON-RPC namespaces that should be enabled +# Example: "eth,txpool,personal,net,debug,web3" +api = "eth,net,web3" + +# GasCap sets a cap on gas that can be used in eth_call/estimateGas (0=infinite). Default: 25,000,000. +gas-cap = 25000000 + +# EVMTimeout is the global timeout for eth_call. Default: 5s. +evm-timeout = "5s" + +# TxFeeCap is the global tx-fee cap for send transaction. Default: 1eth. +txfee-cap = 1 + +# FilterCap sets the global cap for total number of filters that can be created +filter-cap = 200 + +# FeeHistoryCap sets the global cap for total number of blocks that can be fetched +feehistory-cap = 100 + +# LogsCap defines the max number of results can be returned from single 'eth_getLogs' query. +logs-cap = 10000 + +# BlockRangeCap defines the max block range allowed for 'eth_getLogs' query. +block-range-cap = 10000 + +# HTTPTimeout is the read/write timeout of http json-rpc server. +http-timeout = "30s" + +# HTTPIdleTimeout is the idle timeout of http json-rpc server. +http-idle-timeout = "2m0s" + +############################################################################### +### TLS Configuration ### +############################################################################### + +[tls] + +# Certificate path defines the cert.pem file path for the TLS configuration. +certificate-path = "" + +# Key path defines the key.pem file path for the TLS configuration. +key-path = "" diff --git a/tests/e2e/generated/kava-1/config/client.toml b/tests/e2e/generated/kava-1/config/client.toml new file mode 100644 index 00000000..bb1abab1 --- /dev/null +++ b/tests/e2e/generated/kava-1/config/client.toml @@ -0,0 +1,17 @@ +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +############################################################################### +### Client Configuration ### +############################################################################### + +# The network chain ID +chain-id = "kavalocalnet_8888-1" +# The keyring's backend, where the keys are stored (os|file|kwallet|pass|test|memory) +keyring-backend = "test" +# CLI output format (text|json) +output = "text" +# : to Tendermint RPC interface for this chain +node = "tcp://localhost:26657" +# Transaction broadcasting mode (sync|async|block) +broadcast-mode = "block" diff --git a/tests/e2e/generated/kava-1/config/config.toml b/tests/e2e/generated/kava-1/config/config.toml new file mode 100644 index 00000000..82c439d0 --- /dev/null +++ b/tests/e2e/generated/kava-1/config/config.toml @@ -0,0 +1,466 @@ +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +# NOTE: Any path below can be absolute (e.g. "/var/myawesomeapp/data") or +# relative to the home directory (e.g. "data"). The home directory is +# "$HOME/.tendermint" by default, but could be changed via $TMHOME env variable +# or --home cmd flag. + +####################################################################### +### Main Base Config Options ### +####################################################################### + +# TCP or UNIX socket address of the ABCI application, +# or the name of an ABCI application compiled in with the Tendermint binary +proxy_app = "tcp://127.0.0.1:26658" + +# A custom human readable name for this node +moniker = "validator" + +# If this node is many blocks behind the tip of the chain, FastSync +# allows them to catchup quickly by downloading blocks in parallel +# and verifying their commits +fast_sync = true + +# Database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb +# * goleveldb (github.com/syndtr/goleveldb - most popular implementation) +# - pure go +# - stable +# * cleveldb (uses levigo wrapper) +# - fast +# - requires gcc +# - use cleveldb build tag (go build -tags cleveldb) +# * boltdb (uses etcd's fork of bolt - github.com/etcd-io/bbolt) +# - EXPERIMENTAL +# - may be faster is some use-cases (random reads - indexer) +# - use boltdb build tag (go build -tags boltdb) +# * rocksdb (uses github.com/tecbot/gorocksdb) +# - EXPERIMENTAL +# - requires gcc +# - use rocksdb build tag (go build -tags rocksdb) +# * badgerdb (uses github.com/dgraph-io/badger) +# - EXPERIMENTAL +# - use badgerdb build tag (go build -tags badgerdb) +db_backend = "goleveldb" + +# Database directory +db_dir = "data" + +# Output level for logging, including package level options +log_level = "info" + +# Output format: 'plain' (colored text) or 'json' +log_format = "plain" + +##### additional base config options ##### + +# Path to the JSON file containing the initial validator set and other meta data +genesis_file = "config/genesis.json" + +# Path to the JSON file containing the private key to use as a validator in the consensus protocol +priv_validator_key_file = "config/priv_validator_key.json" + +# Path to the JSON file containing the last sign state of a validator +priv_validator_state_file = "data/priv_validator_state.json" + +# TCP or UNIX socket address for Tendermint to listen on for +# connections from an external PrivValidator process +priv_validator_laddr = "" + +# Path to the JSON file containing the private key to use for node authentication in the p2p protocol +node_key_file = "config/node_key.json" + +# Mechanism to connect to the ABCI application: socket | grpc +abci = "socket" + +# If true, query the ABCI app on connecting to a new peer +# so the app can decide if we should keep the connection or not +filter_peers = false + + +####################################################################### +### Advanced Configuration Options ### +####################################################################### + +####################################################### +### RPC Server Configuration Options ### +####################################################### +[rpc] + +# TCP or UNIX socket address for the RPC server to listen on +laddr = "tcp://127.0.0.1:26657" + +# A list of origins a cross-domain request can be executed from +# Default value '[]' disables cors support +# Use '["*"]' to allow any origin +cors_allowed_origins = [] + +# A list of methods the client is allowed to use with cross-domain requests +cors_allowed_methods = ["HEAD", "GET", "POST", ] + +# A list of non simple headers the client is allowed to use with cross-domain requests +cors_allowed_headers = ["Origin", "Accept", "Content-Type", "X-Requested-With", "X-Server-Time", ] + +# TCP or UNIX socket address for the gRPC server to listen on +# NOTE: This server only supports /broadcast_tx_commit +grpc_laddr = "" + +# Maximum number of simultaneous connections. +# Does not include RPC (HTTP&WebSocket) connections. See max_open_connections +# If you want to accept a larger number than the default, make sure +# you increase your OS limits. +# 0 - unlimited. +# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} +# 1024 - 40 - 10 - 50 = 924 = ~900 +grpc_max_open_connections = 900 + +# Activate unsafe RPC commands like /dial_seeds and /unsafe_flush_mempool +unsafe = false + +# Maximum number of simultaneous connections (including WebSocket). +# Does not include gRPC connections. See grpc_max_open_connections +# If you want to accept a larger number than the default, make sure +# you increase your OS limits. +# 0 - unlimited. +# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} +# 1024 - 40 - 10 - 50 = 924 = ~900 +max_open_connections = 900 + +# Maximum number of unique clientIDs that can /subscribe +# If you're using /broadcast_tx_commit, set to the estimated maximum number +# of broadcast_tx_commit calls per block. +max_subscription_clients = 100 + +# Maximum number of unique queries a given client can /subscribe to +# If you're using GRPC (or Local RPC client) and /broadcast_tx_commit, set to +# the estimated # maximum number of broadcast_tx_commit calls per block. +max_subscriptions_per_client = 5 + +# Experimental parameter to specify the maximum number of events a node will +# buffer, per subscription, before returning an error and closing the +# subscription. Must be set to at least 100, but higher values will accommodate +# higher event throughput rates (and will use more memory). +experimental_subscription_buffer_size = 200 + +# Experimental parameter to specify the maximum number of RPC responses that +# can be buffered per WebSocket client. If clients cannot read from the +# WebSocket endpoint fast enough, they will be disconnected, so increasing this +# parameter may reduce the chances of them being disconnected (but will cause +# the node to use more memory). +# +# Must be at least the same as "experimental_subscription_buffer_size", +# otherwise connections could be dropped unnecessarily. This value should +# ideally be somewhat higher than "experimental_subscription_buffer_size" to +# accommodate non-subscription-related RPC responses. +experimental_websocket_write_buffer_size = 200 + +# If a WebSocket client cannot read fast enough, at present we may +# silently drop events instead of generating an error or disconnecting the +# client. +# +# Enabling this experimental parameter will cause the WebSocket connection to +# be closed instead if it cannot read fast enough, allowing for greater +# predictability in subscription behaviour. +experimental_close_on_slow_client = false + +# How long to wait for a tx to be committed during /broadcast_tx_commit. +# WARNING: Using a value larger than 10s will result in increasing the +# global HTTP write timeout, which applies to all connections and endpoints. +# See https://github.com/tendermint/tendermint/issues/3435 +timeout_broadcast_tx_commit = "10s" + +# Maximum size of request body, in bytes +max_body_bytes = 1000000 + +# Maximum size of request header, in bytes +max_header_bytes = 1048576 + +# The path to a file containing certificate that is used to create the HTTPS server. +# Might be either absolute path or path related to Tendermint's config directory. +# If the certificate is signed by a certificate authority, +# the certFile should be the concatenation of the server's certificate, any intermediates, +# and the CA's certificate. +# NOTE: both tls_cert_file and tls_key_file must be present for Tendermint to create HTTPS server. +# Otherwise, HTTP server is run. +tls_cert_file = "" + +# The path to a file containing matching private key that is used to create the HTTPS server. +# Might be either absolute path or path related to Tendermint's config directory. +# NOTE: both tls-cert-file and tls-key-file must be present for Tendermint to create HTTPS server. +# Otherwise, HTTP server is run. +tls_key_file = "" + +# pprof listen address (https://golang.org/pkg/net/http/pprof) +pprof_laddr = "localhost:6060" + +####################################################### +### P2P Configuration Options ### +####################################################### +[p2p] + +# Address to listen for incoming connections +laddr = "tcp://0.0.0.0:26656" + +# Address to advertise to peers for them to dial +# If empty, will use the same port as the laddr, +# and will introspect on the listener or use UPnP +# to figure out the address. ip and port are required +# example: 159.89.10.97:26656 +external_address = "" + +# Comma separated list of seed nodes to connect to +seeds = "" + +# Comma separated list of nodes to keep persistent connections to +persistent_peers = "" + +# UPNP port forwarding +upnp = false + +# Path to address book +addr_book_file = "config/addrbook.json" + +# Set true for strict address routability rules +# Set false for private or local networks +addr_book_strict = true + +# Maximum number of inbound peers +max_num_inbound_peers = 40 + +# Maximum number of outbound peers to connect to, excluding persistent peers +max_num_outbound_peers = 10 + +# List of node IDs, to which a connection will be (re)established ignoring any existing limits +unconditional_peer_ids = "" + +# Maximum pause when redialing a persistent peer (if zero, exponential backoff is used) +persistent_peers_max_dial_period = "0s" + +# Time to wait before flushing messages out on the connection +flush_throttle_timeout = "100ms" + +# Maximum size of a message packet payload, in bytes +max_packet_msg_payload_size = 1024 + +# Rate at which packets can be sent, in bytes/second +send_rate = 5120000 + +# Rate at which packets can be received, in bytes/second +recv_rate = 5120000 + +# Set true to enable the peer-exchange reactor +pex = true + +# Seed mode, in which node constantly crawls the network and looks for +# peers. If another node asks it for addresses, it responds and disconnects. +# +# Does not work if the peer-exchange reactor is disabled. +seed_mode = false + +# Comma separated list of peer IDs to keep private (will not be gossiped to other peers) +private_peer_ids = "" + +# Toggle to disable guard against peers connecting from the same ip. +allow_duplicate_ip = false + +# Peer connection configuration. +handshake_timeout = "20s" +dial_timeout = "3s" + +####################################################### +### Mempool Configuration Option ### +####################################################### +[mempool] + +# Mempool version to use: +# 1) "v0" - (default) FIFO mempool. +# 2) "v1" - prioritized mempool. +version = "v0" + +recheck = true +broadcast = true +wal_dir = "" + +# Maximum number of transactions in the mempool +size = 5000 + +# Limit the total size of all txs in the mempool. +# This only accounts for raw transactions (e.g. given 1MB transactions and +# max_txs_bytes=5MB, mempool will only accept 5 transactions). +max_txs_bytes = 1073741824 + +# Size of the cache (used to filter transactions we saw earlier) in transactions +cache_size = 10000 + +# Do not remove invalid transactions from the cache (default: false) +# Set to true if it's not possible for any invalid transaction to become valid +# again in the future. +keep-invalid-txs-in-cache = false + +# Maximum size of a single transaction. +# NOTE: the max size of a tx transmitted over the network is {max_tx_bytes}. +max_tx_bytes = 1048576 + +# Maximum size of a batch of transactions to send to a peer +# Including space needed by encoding (one varint per transaction). +# XXX: Unused due to https://github.com/tendermint/tendermint/issues/5796 +max_batch_bytes = 0 + +# ttl-duration, if non-zero, defines the maximum amount of time a transaction +# can exist for in the mempool. +# +# Note, if ttl-num-blocks is also defined, a transaction will be removed if it +# has existed in the mempool at least ttl-num-blocks number of blocks or if it's +# insertion time into the mempool is beyond ttl-duration. +ttl-duration = "0s" + +# ttl-num-blocks, if non-zero, defines the maximum number of blocks a transaction +# can exist for in the mempool. +# +# Note, if ttl-duration is also defined, a transaction will be removed if it +# has existed in the mempool at least ttl-num-blocks number of blocks or if +# it's insertion time into the mempool is beyond ttl-duration. +ttl-num-blocks = 0 + +####################################################### +### State Sync Configuration Options ### +####################################################### +[statesync] +# State sync rapidly bootstraps a new node by discovering, fetching, and restoring a state machine +# snapshot from peers instead of fetching and replaying historical blocks. Requires some peers in +# the network to take and serve state machine snapshots. State sync is not attempted if the node +# has any local state (LastBlockHeight > 0). The node will have a truncated block history, +# starting from the height of the snapshot. +enable = false + +# RPC servers (comma-separated) for light client verification of the synced state machine and +# retrieval of state data for node bootstrapping. Also needs a trusted height and corresponding +# header hash obtained from a trusted source, and a period during which validators can be trusted. +# +# For Cosmos SDK-based chains, trust_period should usually be about 2/3 of the unbonding time (~2 +# weeks) during which they can be financially punished (slashed) for misbehavior. +rpc_servers = "" +trust_height = 0 +trust_hash = "" +trust_period = "168h0m0s" + +# Time to spend discovering snapshots before initiating a restore. +discovery_time = "15s" + +# Temporary directory for state sync snapshot chunks, defaults to the OS tempdir (typically /tmp). +# Will create a new, randomly named directory within, and remove it when done. +temp_dir = "" + +# The timeout duration before re-requesting a chunk, possibly from a different +# peer (default: 1 minute). +chunk_request_timeout = "10s" + +# The number of concurrent chunk fetchers to run (default: 1). +chunk_fetchers = "4" + +####################################################### +### Fast Sync Configuration Connections ### +####################################################### +[fastsync] + +# Fast Sync version to use: +# 1) "v0" (default) - the legacy fast sync implementation +# 2) "v1" - refactor of v0 version for better testability +# 2) "v2" - complete redesign of v0, optimized for testability & readability +version = "v0" + +####################################################### +### Consensus Configuration Options ### +####################################################### +[consensus] + +wal_file = "data/cs.wal/wal" + +# How long we wait for a proposal block before prevoting nil +timeout_propose = "3s" +# How much timeout_propose increases with each round +timeout_propose_delta = "500ms" +# How long we wait after receiving +2/3 prevotes for “anything” (ie. not a single block or nil) +timeout_prevote = "1s" +# How much the timeout_prevote increases with each round +timeout_prevote_delta = "500ms" +# How long we wait after receiving +2/3 precommits for “anything” (ie. not a single block or nil) +timeout_precommit = "1s" +# How much the timeout_precommit increases with each round +timeout_precommit_delta = "500ms" +# How long we wait after committing a block, before starting on the new +# height (this gives us a chance to receive some more precommits, even +# though we already have +2/3). +timeout_commit = "1s" + +# How many blocks to look back to check existence of the node's consensus votes before joining consensus +# When non-zero, the node will panic upon restart +# if the same consensus key was used to sign {double_sign_check_height} last blocks. +# So, validators should stop the state machine, wait for some blocks, and then restart the state machine to avoid panic. +double_sign_check_height = 0 + +# Make progress as soon as we have all the precommits (as if TimeoutCommit = 0) +skip_timeout_commit = false + +# EmptyBlocks mode and possible interval between empty blocks +create_empty_blocks = true +create_empty_blocks_interval = "0s" + +# Reactor sleep duration parameters +peer_gossip_sleep_duration = "100ms" +peer_query_maj23_sleep_duration = "2s" + +####################################################### +### Storage Configuration Options ### +####################################################### +[storage] + +# Set to true to discard ABCI responses from the state store, which can save a +# considerable amount of disk space. Set to false to ensure ABCI responses are +# persisted. ABCI responses are required for /block_results RPC queries, and to +# reindex events in the command-line tool. +discard_abci_responses = false + +####################################################### +### Transaction Indexer Configuration Options ### +####################################################### +[tx_index] + +# What indexer to use for transactions +# +# The application will set which txs to index. In some cases a node operator will be able +# to decide which txs to index based on configuration set in the application. +# +# Options: +# 1) "null" +# 2) "kv" (default) - the simplest possible indexer, backed by key-value storage (defaults to levelDB; see DBBackend). +# - When "kv" is chosen "tx.height" and "tx.hash" will always be indexed. +# 3) "psql" - the indexer services backed by PostgreSQL. +# When "kv" or "psql" is chosen "tx.height" and "tx.hash" will always be indexed. +indexer = "kv" + +# The PostgreSQL connection configuration, the connection format: +# postgresql://:@:/? +psql-conn = "" + +####################################################### +### Instrumentation Configuration Options ### +####################################################### +[instrumentation] + +# When true, Prometheus metrics are served under /metrics on +# PrometheusListenAddr. +# Check out the documentation for the list of available metrics. +prometheus = false + +# Address to listen for Prometheus collector(s) connections +prometheus_listen_addr = ":26660" + +# Maximum number of simultaneous connections. +# If you want to accept a larger number than the default, make sure +# you increase your OS limits. +# 0 - unlimited. +max_open_connections = 3 + +# Instrumentation namespace +namespace = "tendermint" diff --git a/tests/e2e/generated/kava-1/config/genesis.json b/tests/e2e/generated/kava-1/config/genesis.json new file mode 100644 index 00000000..b9ad04b7 --- /dev/null +++ b/tests/e2e/generated/kava-1/config/genesis.json @@ -0,0 +1,2976 @@ +{ + "genesis_time": "2023-02-15T18:28:01.981711Z", + "chain_id": "kavalocalnet_8888-1", + "initial_height": "1", + "consensus_params": { + "block": { + "max_bytes": "22020096", + "max_gas": "-1", + "time_iota_ms": "1000" + }, + "evidence": { + "max_age_num_blocks": "100000", + "max_age_duration": "172800000000000", + "max_bytes": "1048576" + }, + "validator": { + "pub_key_types": [ + "ed25519" + ] + }, + "version": {} + }, + "app_hash": "", + "app_state": { + "auction": { + "next_auction_id": "1", + "params": { + "max_auction_duration": "172800s", + "forward_bid_duration": "28800s", + "reverse_bid_duration": "3600s", + "increment_surplus": "0.050000000000000000", + "increment_debt": "0.050000000000000000", + "increment_collateral": "0.050000000000000000" + }, + "auctions": [] + }, + "auth": { + "params": { + "max_memo_characters": "256", + "tx_sig_limit": "7", + "tx_size_cost_per_byte": "10", + "sig_verify_cost_ed25519": "590", + "sig_verify_cost_secp256k1": "1000" + }, + "accounts": [ + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "account_number": "0", + "address": "kava1ypjp0m04pyp73hwgtc0dgkx0e9rrydecm054da", + "pub_key": null, + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "account_number": "0", + "address": "kava1vlpsrmdyuywvaqrv7rx6xga224sqfwz3fyfhwq", + "pub_key": null, + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "account_number": "0", + "address": "kava1agcvt07tcw0tglu0hmwdecsnuxp2yd45f3avgm", + "pub_key": null, + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "account_number": "0", + "address": "kava1g33w0mh4mjllhaj3y4dcwkwquxgwrma9ga5t94", + "pub_key": null, + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "account_number": "0", + "address": "kava1kla4wl0ccv7u85cemvs3y987hqk0afcv7vue84", + "pub_key": null, + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "account_number": "0", + "address": "kava1ynf22ap74j6znl503a56y23x5stfr0aw5kntp8", + "pub_key": null, + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "account_number": "0", + "address": "kava14q5sawxdxtpap5x5sgzj7v4sp3ucncjlpuk3hs", + "pub_key": null, + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "account_number": "0", + "address": "kava1z3ytjpr6ancl8gw80z6f47z9smug7986x29vtj", + "pub_key": null, + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "account_number": "0", + "address": "kava1j9je7f6s0v6k7dmgv6u5k5ru202f5ffsc7af04", + "pub_key": null, + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "account_number": "0", + "address": "kava1ektgdyy0z23qqnd67ns3qvfzgfgjd5xe82lf5c", + "pub_key": null, + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "account_number": "0", + "address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "pub_key": null, + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "account_number": "0", + "address": "kava1n96qpdfcz2m7y364ewk8srv9zuq6ucwduyjaag", + "pub_key": null, + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "account_number": "0", + "address": "kava1sw54s6gq76acm35ls6m5c0kr93dstgrh6eftld", + "pub_key": null, + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "account_number": "0", + "address": "kava1t4dvu32e309pzhmdn3aqcjlj79h9876plynrfm", + "pub_key": null, + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "account_number": "0", + "address": "kava1wuzhkn2f8nqe2aprnwt3jkjvvr9m7dlkpumtz2", + "pub_key": null, + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "account_number": "0", + "address": "kava173w2zz287s36ewnnkf4mjansnthnnsz7rtrxqc", + "pub_key": null, + "sequence": "0" + }, + { + "@type": "/cosmos.vesting.v1beta1.PeriodicVestingAccount", + "base_vesting_account": { + "base_account": { + "account_number": "0", + "address": "kava1fwfwmt6vupf3m9uvpdsuuc4dga8p5dtl4npcqz", + "pub_key": null, + "sequence": "0" + }, + "delegated_free": [], + "delegated_vesting": [], + "end_time": "1696540229", + "original_vesting": [ + { + "amount": "5000000000", + "denom": "ukava" + } + ] + }, + "start_time": "1665004229", + "vesting_periods": [ + { + "amount": [ + { + "amount": "5000000000", + "denom": "ukava" + } + ], + "length": "31536000" + } + ] + }, + { + "@type": "/ethermint.types.v1.EthAccount", + "base_account": { + "address": "kava1ak4pa9z2aty94ze2cs06wsdnkg9hsvfkp40r02", + "pub_key": null, + "account_number": "0", + "sequence": "0" + }, + "code_hash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "@type": "/ethermint.types.v1.EthAccount", + "base_account": { + "address": "kava123fxg0l602etulhhcdm0vt7l57qya5wjcrwhzz", + "pub_key": null, + "account_number": "0", + "sequence": "0" + }, + "code_hash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "@type": "/ethermint.types.v1.EthAccount", + "base_account": { + "address": "kava10wlnqzyss4accfqmyxwx5jy5x9nfkwh6qm7n4t", + "pub_key": null, + "account_number": "0", + "sequence": "3" + }, + "code_hash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "@type": "/ethermint.types.v1.EthAccount", + "base_account": { + "address": "kava15tmj37vh7ch504px9fcfglmvx6y9m70646ev8t", + "pub_key": null, + "account_number": "0", + "sequence": "0" + }, + "code_hash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "@type": "/ethermint.types.v1.EthAccount", + "base_account": { + "account_number": "41", + "address": "kava1afcspmdzlqzn2c53krj4mt2yskv6wtrds2jqht", + "pub_key": null, + "sequence": "1" + }, + "code_hash": "0x45d85d503e0143ffd2bb95d7bcb4dadfc1c05ff005fc7c26e63eb47f496fdafc" + }, + { + "@type": "/ethermint.types.v1.EthAccount", + "base_account": { + "account_number": "0", + "address": "kava1vtf08rd2z9fm8qwxa54y3el5vues8ty64qcdyr", + "pub_key": null, + "sequence": "1" + }, + "code_hash": "0xefe54230c8a74092194afdcb21c230b4cc4e07d0e6cd22bf0d3721f518df8ef2" + }, + { + "@type": "/ethermint.types.v1.EthAccount", + "base_account": { + "account_number": "0", + "address": "kava1wrrekcy2h0zs9shkruuwqsvsldq8hm70yad4ke", + "pub_key": null, + "sequence": "1" + }, + "code_hash": "0xd51cf04c1b78bc48b348e8455c4181539ab0b7ff84bb081fed109cd5feafaede" + } + ] + }, + "authz": { + "authorization": [] + }, + "bank": { + "params": { + "send_enabled": [], + "default_send_enabled": true + }, + "balances": [ + { + "address": "kava1z3ytjpr6ancl8gw80z6f47z9smug7986x29vtj", + "coins": [ + { + "denom": "ukava", + "amount": "1000000000000" + } + ] + }, + { + "address": "kava1ypjp0m04pyp73hwgtc0dgkx0e9rrydecm054da", + "coins": [ + { + "denom": "ukava", + "amount": "1000000000" + } + ] + }, + { + "address": "kava1ynf22ap74j6znl503a56y23x5stfr0aw5kntp8", + "coins": [ + { + "denom": "ukava", + "amount": "1000000000000" + } + ] + }, + { + "address": "kava1g33w0mh4mjllhaj3y4dcwkwquxgwrma9ga5t94", + "coins": [ + { + "denom": "ukava", + "amount": "1000000000000" + } + ] + }, + { + "address": "kava1fwfwmt6vupf3m9uvpdsuuc4dga8p5dtl4npcqz", + "coins": [ + { + "denom": "ukava", + "amount": "10000000000" + } + ] + }, + { + "address": "kava123fxg0l602etulhhcdm0vt7l57qya5wjcrwhzz", + "coins": [ + { + "denom": "bnb", + "amount": "100000000000" + }, + { + "denom": "ukava", + "amount": "1000000000" + } + ] + }, + { + "address": "kava1t4dvu32e309pzhmdn3aqcjlj79h9876plynrfm", + "coins": [ + { + "denom": "ukava", + "amount": "1000000000000" + } + ] + }, + { + "address": "kava1vlpsrmdyuywvaqrv7rx6xga224sqfwz3fyfhwq", + "coins": [ + { + "denom": "bkava-kavavaloper1ypjp0m04pyp73hwgtc0dgkx0e9rrydeckewa42", + "amount": "10000000000000000" + }, + { + "denom": "bnb", + "amount": "10000000000000000" + }, + { + "denom": "btcb", + "amount": "10000000000000000" + }, + { + "denom": "busd", + "amount": "10000000000000000" + }, + { + "denom": "hard", + "amount": "1000000000000000000" + }, + { + "denom": "swp", + "amount": "1000000000000000000" + }, + { + "denom": "ukava", + "amount": "1000000000000" + }, + { + "denom": "usdx", + "amount": "10000000000000000" + }, + { + "denom": "xrpb", + "amount": "10000000000000000" + } + ] + }, + { + "address": "kava1wuzhkn2f8nqe2aprnwt3jkjvvr9m7dlkpumtz2", + "coins": [ + { + "denom": "ukava", + "amount": "1000000000000" + } + ] + }, + { + "address": "kava10wlnqzyss4accfqmyxwx5jy5x9nfkwh6qm7n4t", + "coins": [ + { + "denom": "ukava", + "amount": "1000000000" + } + ] + }, + { + "address": "kava1sw54s6gq76acm35ls6m5c0kr93dstgrh6eftld", + "coins": [ + { + "denom": "ukava", + "amount": "1000000000000" + } + ] + }, + { + "address": "kava1j9je7f6s0v6k7dmgv6u5k5ru202f5ffsc7af04", + "coins": [ + { + "denom": "ukava", + "amount": "1000000000000" + } + ] + }, + { + "address": "kava1n96qpdfcz2m7y364ewk8srv9zuq6ucwduyjaag", + "coins": [ + { + "denom": "ukava", + "amount": "1000000000000" + } + ] + }, + { + "address": "kava15tmj37vh7ch504px9fcfglmvx6y9m70646ev8t", + "coins": [ + { + "denom": "ukava", + "amount": "1000000000" + } + ] + }, + { + "address": "kava14q5sawxdxtpap5x5sgzj7v4sp3ucncjlpuk3hs", + "coins": [ + { + "denom": "ukava", + "amount": "1000000000000" + } + ] + }, + { + "address": "kava1kla4wl0ccv7u85cemvs3y987hqk0afcv7vue84", + "coins": [ + { + "denom": "ukava", + "amount": "1000000000000" + } + ] + }, + { + "address": "kava1cj7njkw2g9fqx4e768zc75dp9sks8u9znxrf0w", + "coins": [ + { + "denom": "hard", + "amount": "1000000000000" + }, + { + "denom": "swp", + "amount": "1000000000000" + }, + { + "denom": "ukava", + "amount": "1000000000000" + } + ] + }, + { + "address": "kava1ektgdyy0z23qqnd67ns3qvfzgfgjd5xe82lf5c", + "coins": [ + { + "denom": "ukava", + "amount": "1000000000000" + } + ] + }, + { + "address": "kava1mfru9azs5nua2wxcd4sq64g5nt7nn4n8s2w8cu", + "coins": [ + { + "denom": "btcb", + "amount": "200000000" + }, + { + "denom": "hard", + "amount": "1000000000" + }, + { + "denom": "swp", + "amount": "5000000000" + }, + { + "denom": "ukava", + "amount": "5000000000" + }, + { + "denom": "usdx", + "amount": "103000000000" + } + ] + }, + { + "address": "kava1agcvt07tcw0tglu0hmwdecsnuxp2yd45f3avgm", + "coins": [ + { + "denom": "ukava", + "amount": "1000000000000" + } + ] + }, + { + "address": "kava1ak4pa9z2aty94ze2cs06wsdnkg9hsvfkp40r02", + "coins": [ + { + "denom": "bnb", + "amount": "100000000000" + }, + { + "denom": "ukava", + "amount": "2000000000" + } + ] + }, + { + "address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "coins": [ + { + "denom": "ukava", + "amount": "1000000000000" + } + ] + }, + { + "address": "kava173w2zz287s36ewnnkf4mjansnthnnsz7rtrxqc", + "coins": [ + { + "denom": "bkava-kavavaloper1ypjp0m04pyp73hwgtc0dgkx0e9rrydeckewa42", + "amount": "10000000000000000" + }, + { + "denom": "bnb", + "amount": "10000000000000000" + }, + { + "denom": "btcb", + "amount": "10000000000000000" + }, + { + "denom": "busd", + "amount": "10000000000000000" + }, + { + "denom": "hard", + "amount": "1000000000000000000" + }, + { + "denom": "swp", + "amount": "1000000000000000000" + }, + { + "denom": "ukava", + "amount": "1000000000000" + }, + { + "denom": "usdx", + "amount": "10000000000000000" + }, + { + "denom": "xrpb", + "amount": "10000000000000000" + } + ] + } + ], + "supply": [], + "denom_metadata": [] + }, + "bep3": { + "params": { + "asset_params": [ + { + "denom": "btcb", + "coin_id": "0", + "supply_limit": { + "limit": "100000000000", + "time_limited": false, + "time_period": "0", + "time_based_limit": "0" + }, + "active": true, + "deputy_address": "kava1kla4wl0ccv7u85cemvs3y987hqk0afcv7vue84", + "fixed_fee": "2", + "min_swap_amount": "3", + "max_swap_amount": "2000000000", + "min_block_lock": "24686", + "max_block_lock": "86400" + }, + { + "denom": "xrpb", + "coin_id": "144", + "supply_limit": { + "limit": "2000000000000000", + "time_limited": false, + "time_period": "0", + "time_based_limit": "0" + }, + "active": true, + "deputy_address": "kava14q5sawxdxtpap5x5sgzj7v4sp3ucncjlpuk3hs", + "fixed_fee": "100000", + "min_swap_amount": "100001", + "max_swap_amount": "250000000000000", + "min_block_lock": "24686", + "max_block_lock": "86400" + }, + { + "denom": "bnb", + "coin_id": "714", + "supply_limit": { + "limit": "100000000000000", + "time_limited": false, + "time_period": "0", + "time_based_limit": "0" + }, + "active": true, + "deputy_address": "kava1agcvt07tcw0tglu0hmwdecsnuxp2yd45f3avgm", + "fixed_fee": "1000", + "min_swap_amount": "1001", + "max_swap_amount": "500000000000", + "min_block_lock": "24686", + "max_block_lock": "86400" + }, + { + "denom": "busd", + "coin_id": "727", + "supply_limit": { + "limit": "2000000000000000", + "time_limited": false, + "time_period": "0", + "time_based_limit": "0" + }, + "active": true, + "deputy_address": "kava1j9je7f6s0v6k7dmgv6u5k5ru202f5ffsc7af04", + "fixed_fee": "20000", + "min_swap_amount": "20001", + "max_swap_amount": "100000000000000", + "min_block_lock": "24686", + "max_block_lock": "86400" + } + ] + }, + "atomic_swaps": [], + "supplies": [], + "previous_block_time": "1970-01-01T00:00:01Z" + }, + "capability": { + "index": "1", + "owners": [] + }, + "cdp": { + "params": { + "collateral_params": [ + { + "auction_size": "50000000000", + "conversion_factor": "8", + "debt_limit": { + "amount": "20000000000000", + "denom": "usdx" + }, + "denom": "bnb", + "liquidation_market_id": "bnb:usd:30", + "liquidation_penalty": "0.050000000000000000", + "liquidation_ratio": "1.500000000000000000", + "keeper_reward_percentage": "0.01", + "check_collateralization_index_count": "10", + "spot_market_id": "bnb:usd", + "stability_fee": "1.000000000782997700", + "type": "bnb-a" + }, + { + "auction_size": "100000000", + "conversion_factor": "8", + "debt_limit": { + "amount": "2000000000000", + "denom": "usdx" + }, + "denom": "btcb", + "liquidation_market_id": "btc:usd:30", + "liquidation_penalty": "0.050000000000000000", + "liquidation_ratio": "1.500000000000000000", + "keeper_reward_percentage": "0.01", + "check_collateralization_index_count": "10", + "spot_market_id": "btc:usd", + "stability_fee": "1.000000000782997700", + "type": "btcb-a" + }, + { + "denom": "xrpb", + "type": "xrpb-a", + "liquidation_ratio": "1.500000000000000000", + "debt_limit": { + "denom": "usdx", + "amount": "1000000000000" + }, + "stability_fee": "1.000000001547125958", + "auction_size": "100000000000", + "liquidation_penalty": "0.075000000000000000", + "keeper_reward_percentage": "0.01", + "check_collateralization_index_count": "10", + "spot_market_id": "xrp:usd", + "liquidation_market_id": "xrp:usd:30", + "conversion_factor": "8" + }, + { + "denom": "busd", + "type": "busd-a", + "liquidation_ratio": "1.010000000000000000", + "debt_limit": { + "denom": "usdx", + "amount": "3000000000000" + }, + "stability_fee": "1.000000000000000000", + "auction_size": "1000000000000", + "liquidation_penalty": "0.075000000000000000", + "check_collateralization_index_count": "10", + "keeper_reward_percentage": "0.01", + "spot_market_id": "busd:usd", + "liquidation_market_id": "busd:usd:30", + "conversion_factor": "8" + }, + { + "denom": "busd", + "type": "busd-b", + "liquidation_ratio": "1.100000000000000000", + "debt_limit": { + "denom": "usdx", + "amount": "3000000000000" + }, + "stability_fee": "1.000000012857214317", + "auction_size": "1000000000000", + "liquidation_penalty": "0.075000000000000000", + "check_collateralization_index_count": "10", + "keeper_reward_percentage": "0.01", + "spot_market_id": "busd:usd", + "liquidation_market_id": "busd:usd:30", + "conversion_factor": "8" + }, + { + "auction_size": "50000000000", + "conversion_factor": "6", + "debt_limit": { + "amount": "2000000000000", + "denom": "usdx" + }, + "denom": "ukava", + "liquidation_market_id": "kava:usd:30", + "liquidation_penalty": "0.050000000000000000", + "liquidation_ratio": "1.500000000000000000", + "keeper_reward_percentage": "0.01", + "check_collateralization_index_count": "10", + "spot_market_id": "kava:usd", + "stability_fee": "1.000000000782997700", + "type": "ukava-a" + }, + { + "auction_size": "50000000000", + "conversion_factor": "6", + "debt_limit": { + "amount": "2000000000000", + "denom": "usdx" + }, + "denom": "ibc/C72DE26FFF16DE62BE2784E12229BDF5F4465CE8B10530426D6DB53255FF01B2", + "liquidation_market_id": "luna:usd:30", + "spot_market_id": "luna:usd", + "liquidation_penalty": "0.050000000000000000", + "liquidation_ratio": "1.500000000000000000", + "keeper_reward_percentage": "0.01", + "check_collateralization_index_count": "10", + "stability_fee": "1.000000000782997700", + "type": "luna-a" + }, + { + "auction_size": "50000000000", + "conversion_factor": "6", + "debt_limit": { + "amount": "2000000000000", + "denom": "usdx" + }, + "denom": "ibc/4129EB76C01ED14052054BB975DE0C6C5010E12FFD9253C20C58BCD828BEE9A5", + "liquidation_market_id": "akt:usd:30", + "spot_market_id": "akt:usd", + "liquidation_penalty": "0.050000000000000000", + "liquidation_ratio": "1.500000000000000000", + "keeper_reward_percentage": "0.01", + "check_collateralization_index_count": "10", + "stability_fee": "1.000000000782997700", + "type": "akt-a" + }, + { + "auction_size": "50000000000", + "conversion_factor": "6", + "debt_limit": { + "amount": "2000000000000", + "denom": "usdx" + }, + "denom": "ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518", + "liquidation_market_id": "osmo:usd:30", + "spot_market_id": "osmo:usd", + "liquidation_penalty": "0.050000000000000000", + "liquidation_ratio": "1.500000000000000000", + "keeper_reward_percentage": "0.01", + "check_collateralization_index_count": "10", + "stability_fee": "1.000000000782997700", + "type": "osmo-a" + }, + { + "auction_size": "50000000000", + "conversion_factor": "6", + "debt_limit": { + "amount": "2000000000000", + "denom": "usdx" + }, + "denom": "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2", + "liquidation_market_id": "atom:usd:30", + "spot_market_id": "atom:usd", + "liquidation_penalty": "0.050000000000000000", + "liquidation_ratio": "1.500000000000000000", + "keeper_reward_percentage": "0.01", + "check_collateralization_index_count": "10", + "stability_fee": "1.000000000782997700", + "type": "atom-a" + }, + { + "auction_size": "50000000000", + "conversion_factor": "6", + "debt_limit": { + "amount": "2000000000000", + "denom": "usdx" + }, + "denom": "hard", + "liquidation_market_id": "hard:usd:30", + "liquidation_penalty": "0.050000000000000000", + "liquidation_ratio": "1.500000000000000000", + "keeper_reward_percentage": "0.01", + "check_collateralization_index_count": "10", + "spot_market_id": "hard:usd", + "stability_fee": "1.000000000782997700", + "type": "hard-a" + }, + { + "auction_size": "50000000000", + "conversion_factor": "6", + "debt_limit": { + "amount": "2000000000000", + "denom": "usdx" + }, + "denom": "swp", + "liquidation_market_id": "swp:usd:30", + "liquidation_penalty": "0.050000000000000000", + "liquidation_ratio": "1.500000000000000000", + "keeper_reward_percentage": "0.01", + "check_collateralization_index_count": "10", + "spot_market_id": "swp:usd", + "stability_fee": "1.000000000782997700", + "type": "swp-a" + }, + { + "denom": "hbtc", + "type": "hbtc-a", + "liquidation_ratio": "1.500000000000000000", + "debt_limit": { + "denom": "usdx", + "amount": "10000000000000" + }, + "stability_fee": "1.000000001547125958", + "auction_size": "1000000000000", + "liquidation_penalty": "0.075000000000000000", + "check_collateralization_index_count": "10", + "keeper_reward_percentage": "0.01", + "spot_market_id": "btc:usd", + "liquidation_market_id": "btc:usd:30", + "conversion_factor": "8" + } + ], + "debt_param": { + "denom": "usdx", + "reference_asset": "usd", + "conversion_factor": "6", + "debt_floor": "10000000" + }, + "global_debt_limit": { + "denom": "usdx", + "amount": "53000000000000" + }, + "surplus_auction_threshold": "500000000000", + "surplus_auction_lot": "10000000000", + "debt_auction_threshold": "100000000000", + "debt_auction_lot": "10000000000", + "circuit_breaker": false + }, + "cdps": [], + "deposits": [], + "starting_cdp_id": "1", + "debt_denom": "debt", + "gov_denom": "ukava", + "previous_accumulation_times": [], + "total_principals": [] + }, + "committee": { + "next_proposal_id": "1", + "committees": [ + { + "@type": "/kava.committee.v1beta1.MemberCommittee", + "base_committee": { + "id": "1", + "description": "Kava Stability Committee", + "members": [ + "kava1n96qpdfcz2m7y364ewk8srv9zuq6ucwduyjaag" + ], + "permissions": [ + { + "@type": "/kava.committee.v1beta1.TextPermission" + }, + { + "@type": "/kava.committee.v1beta1.ParamsChangePermission", + "allowed_params_changes": [ + { + "subspace": "auction", + "key": "BidDuration" + }, + { + "subspace": "auction", + "key": "IncrementSurplus" + }, + { + "subspace": "auction", + "key": "IncrementDebt" + }, + { + "subspace": "auction", + "key": "IncrementCollateral" + }, + { + "subspace": "bep3", + "key": "AssetParams" + }, + { + "subspace": "cdp", + "key": "GlobalDebtLimit" + }, + { + "subspace": "cdp", + "key": "SurplusThreshold" + }, + { + "subspace": "cdp", + "key": "SurplusLot" + }, + { + "subspace": "cdp", + "key": "DebtThreshold" + }, + { + "subspace": "cdp", + "key": "DebtLot" + }, + { + "subspace": "cdp", + "key": "DistributionFrequency" + }, + { + "subspace": "cdp", + "key": "CollateralParams" + }, + { + "subspace": "cdp", + "key": "DebtParam" + }, + { + "subspace": "incentive", + "key": "Active" + }, + { + "subspace": "kavadist", + "key": "Active" + }, + { + "subspace": "pricefeed", + "key": "Markets" + }, + { + "subspace": "hard", + "key": "MoneyMarkets" + }, + { + "subspace": "hard", + "key": "MinimumBorrowUSDValue" + } + ] + } + ], + "vote_threshold": "0.667000000000000000", + "proposal_duration": "604800s", + "tally_option": "TALLY_OPTION_FIRST_PAST_THE_POST" + } + }, + { + "@type": "/kava.committee.v1beta1.MemberCommittee", + "base_committee": { + "id": "2", + "description": "Kava Safety Committee", + "members": [ + "kava1n96qpdfcz2m7y364ewk8srv9zuq6ucwduyjaag" + ], + "permissions": [ + { + "@type": "/kava.committee.v1beta1.SoftwareUpgradePermission" + } + ], + "vote_threshold": "0.667000000000000000", + "proposal_duration": "604800s", + "tally_option": "TALLY_OPTION_FIRST_PAST_THE_POST" + } + }, + { + "@type": "/kava.committee.v1beta1.MemberCommittee", + "base_committee": { + "id": "3", + "description": "Kava God Committee (testing only)", + "members": [ + "kava1n96qpdfcz2m7y364ewk8srv9zuq6ucwduyjaag" + ], + "permissions": [ + { + "@type": "/kava.committee.v1beta1.GodPermission" + } + ], + "vote_threshold": "0.667000000000000000", + "proposal_duration": "604800s", + "tally_option": "TALLY_OPTION_FIRST_PAST_THE_POST" + } + }, + { + "@type": "/kava.committee.v1beta1.TokenCommittee", + "base_committee": { + "id": "4", + "description": "HARD Governance Committee", + "members": [ + "kava1n96qpdfcz2m7y364ewk8srv9zuq6ucwduyjaag" + ], + "permissions": [ + { + "@type": "/kava.committee.v1beta1.TextPermission" + }, + { + "@type": "/kava.committee.v1beta1.ParamsChangePermission", + "allowed_params_changes": [ + { + "subspace": "hard", + "key": "MoneyMarkets" + }, + { + "subspace": "hard", + "key": "MinimumBorrowUSDValue" + }, + { + "subspace": "incentive", + "key": "HardSupplyRewardPeriods" + }, + { + "subspace": "incentive", + "key": "HardBorrowRewardPeriods" + }, + { + "subspace": "incentive", + "key": "HardDelegatorRewardPeriods" + } + ] + } + ], + "vote_threshold": "0.667000000000000000", + "proposal_duration": "604800s", + "tally_option": "TALLY_OPTION_DEADLINE" + }, + "quorum": "0.330000000000000000", + "tally_denom": "hard" + }, + { + "@type": "/kava.committee.v1beta1.TokenCommittee", + "base_committee": { + "id": "5", + "description": "SWP Governance Committee", + "members": [ + "kava1n96qpdfcz2m7y364ewk8srv9zuq6ucwduyjaag" + ], + "permissions": [ + { + "@type": "/kava.committee.v1beta1.TextPermission" + }, + { + "@type": "/kava.committee.v1beta1.ParamsChangePermission", + "allowed_params_changes": [ + { + "subspace": "swap", + "key": "AllowedPools" + }, + { + "subspace": "swap", + "key": "SwapFee" + }, + { + "subspace": "incentive", + "key": "DelegatorRewardPeriods" + }, + { + "subspace": "incentive", + "key": "SwapRewardPeriods" + } + ] + } + ], + "vote_threshold": "0.667000000000000000", + "proposal_duration": "604800s", + "tally_option": "TALLY_OPTION_DEADLINE" + }, + "quorum": "0.330000000000000000", + "tally_denom": "swp" + } + ], + "proposals": [], + "votes": [] + }, + "community": {}, + "crisis": { + "constant_fee": { + "denom": "ukava", + "amount": "1000" + } + }, + "distribution": { + "params": { + "community_tax": "0.000000000000000000", + "base_proposer_reward": "0.010000000000000000", + "bonus_proposer_reward": "0.040000000000000000", + "withdraw_addr_enabled": true + }, + "fee_pool": { + "community_pool": [] + }, + "delegator_withdraw_infos": [], + "previous_proposer": "", + "outstanding_rewards": [], + "validator_accumulated_commissions": [], + "validator_historical_rewards": [], + "validator_current_rewards": [], + "delegator_starting_infos": [], + "validator_slash_events": [] + }, + "earn": { + "params": { + "allowed_vaults": [ + { + "denom": "usdx", + "strategies": [ + "STRATEGY_TYPE_HARD" + ] + }, + { + "denom": "ukava", + "strategies": [ + "STRATEGY_TYPE_SAVINGS" + ] + }, + { + "denom": "bkava", + "strategies": [ + "STRATEGY_TYPE_SAVINGS" + ] + }, + { + "denom": "erc20/multichain/usdc", + "strategies": [ + "STRATEGY_TYPE_SAVINGS" + ] + } + ] + }, + "vault_records": [], + "vault_share_records": [] + }, + "evidence": { + "evidence": [] + }, + "evm": { + "accounts": [ + { + "address": "0xeA7100edA2f805356291B0E55DaD448599a72C6d", + "code": "608060405234801561001057600080fd5b50600436106102695760003560e01c806379cc679011610151578063a457c2d7116100c3578063d539139311610087578063d5391393146105df578063d547741f146105f4578063dd62ed3e14610607578063e44dbafc14610640578063ec126c7714610667578063ed56531a1461067a57600080fd5b8063a457c2d71461056c578063a9059cbb1461057f578063b32ad1a614610592578063c8e1b4ce146105b9578063ca15c873146105cc57600080fd5b806395d89b411161011557806395d89b41146104ff5780639ac25d08146105075780639dc29fac1461050f5780639e9e466614610522578063a19ff68014610545578063a217fddf1461050757600080fd5b806379cc679014610474578063893d20e8146104875780639010d07c1461048f57806391d14854146104a257806395609212146104b557600080fd5b8063313ce567116101ea578063401d1c73116101ae578063401d1c73146103e457806340c10f19146103f757806342966c681461040a578063628d6cba1461041d5780636f307dc31461043057806370a082311461044b57600080fd5b8063313ce56714610354578063355274ea1461038557806335e1d487146103ab57806336568abe146103be57806339509351146103d157600080fd5b806323fb9eba1161023157806323fb9eba146102e3578063248a9ca3146102f85780632f2ff15d1461031b5780632f4dae9f1461032e5780633092afd51461034157600080fd5b806301ffc9a71461026e57806306fdde0314610296578063095ea7b3146102ab57806318160ddd146102be57806323b872dd146102d0575b600080fd5b61028161027c366004611e25565b61068d565b60405190151581526020015b60405180910390f35b61029e6106b8565b60405161028d9190611e7b565b6102816102b9366004611eca565b61074a565b6002545b60405190815260200161028d565b6102816102de366004611ef4565b610762565b6102f66102f1366004611eca565b610786565b005b6102c2610306366004611f30565b60009081526005602052604090206001015490565b6102f6610329366004611f49565b6107ec565b6102f661033c366004611f30565b610817565b6102f661034f366004611f75565b610830565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000616815260200161028d565b7f00000000000000000000000000000000000000000052b7d2dcc80cd2e40000006102c2565b6102f66103b9366004611f90565b610876565b6102f66103cc366004611f49565b6108de565b6102816103df366004611eca565b610958565b6102f66103f2366004611fd5565b610997565b610281610405366004611eca565b6109e0565b6102f6610418366004611f30565b610a05565b61028161042b366004611f49565b610a12565b60005b6040516001600160a01b03909116815260200161028d565b6102c2610459366004611f75565b6001600160a01b031660009081526020819052604090205490565b6102f6610482366004611eca565b610ab1565b610433610ac6565b61043361049d366004612008565b610ad7565b6102816104b0366004611f49565b610af6565b6104e46104c3366004611f75565b60086020526000908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161028d565b61029e610b21565b6102c2600081565b61028161051d366004611eca565b610b30565b610281610530366004611f30565b60009081526007602052604090205460ff1690565b6102c27f62d52416825983abd68b16e092b60c2eac31fd673bcce92494e063af530d9c3081565b61028161057a366004611eca565b610b55565b61028161058d366004611eca565b610be7565b6102c27fb2a18ae5d0b623b41098012c516d0bf4bef38c068c9e397da870c290888b199981565b6102f66105c7366004611eca565b610bf5565b6102c26105da366004611f30565b610c55565b6102c260008051602061220b83398151915281565b6102f6610602366004611f49565b610c6c565b6102c261061536600461202a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102c27f38cbe5ebce66f5e289a042a8eda57d146aaab8a3f3a9637670043b23d481307081565b610281610675366004612054565b610c92565b6102f6610688366004611f30565b610d06565b60006001600160e01b03198216635a05180f60e01b14806106b257506106b282610db6565b92915050565b6060600380546106c790612079565b80601f01602080910402602001604051908101604052809291908181526020018280546106f390612079565b80156107405780601f1061071557610100808354040283529160200191610740565b820191906000526020600020905b81548152906001019060200180831161072357829003601f168201915b5050505050905090565b600033610758818585610deb565b5060019392505050565b600033610770858285610f0f565b61077b858585610fa1565b506001949350505050565b6000610792813361117a565b6107aa60008051602061220b83398151915284610af6565b6107cf5760405162461bcd60e51b81526004016107c6906120b4565b60405180910390fd5b506001600160a01b03909116600090815260086020526040902055565b600082815260056020526040902060010154610808813361117a565b61081283836111de565b505050565b6000610823813361117a565b61082c82611200565b5050565b600061083c813361117a565b61085460008051602061220b833981519152836112e9565b506001600160a01b031660009081526008602052604081206001810182905555565b6000610882813361117a565b81806108a157506108a160008051602061220b83398151915285610af6565b6108bd5760405162461bcd60e51b81526004016107c6906120b4565b50506001600160a01b03909116600090815260086020526040902060020155565b6001600160a01b038116331461094e5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016107c6565b61082c82826112e9565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061075890829086906109929087906120ee565b610deb565b60006109a3813361117a565b6109bb60008051602061220b833981519152856111de565b506001600160a01b039092166000908152600860205260409020600181019190915555565b600060008051602061220b8339815191526109fb813361117a565b610758848461130b565b610a0f33826114b4565b50565b60006001600160a01b038216610a5e5760405162461bcd60e51b81526020600482015260116024820152707a65726f2062696e64206164647265737360781b60448201526064016107c6565b610a6833846114b4565b6040518381526001600160a01b0383169033907f6b616089d04950dc06c45c6dd787d657980543f89651aec47924752c7d16c8889060200160405180910390a350600192915050565b610abc823383610f0f565b61082c82826114b4565b6000610ad28180610ad7565b905090565b6000828152600660205260408120610aef908361163b565b9392505050565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600480546106c790612079565b600060008051602061220b833981519152610b4b813361117a565b61075884846114b4565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610bda5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016107c6565b61077b8286868403610deb565b600033610758818585610fa1565b6000610c01813361117a565b610c1960008051602061220b83398151915284610af6565b610c355760405162461bcd60e51b81526004016107c6906120b4565b506001600160a01b03909116600090815260086020526040902060010155565b60008181526006602052604081206106b290611647565b600082815260056020526040902060010154610c88813361117a565b61081283836112e9565b600060008051602061220b833981519152610cad813361117a565b610cb7848461130b565b836001600160a01b0316857f05d0634fe981be85c22e2942a880821b70095d84e152c3ea3c17a4e4250d9d6185604051610cf391815260200190565b60405180910390a3506001949350505050565b6000610d12813361117a565b61082c82611651565b610d258282610af6565b61082c5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610d5d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610aef836001600160a01b038416611734565b60006001600160e01b03198216637965db0b60e01b14806106b257506301ffc9a760e01b6001600160e01b03198316146106b2565b6001600160a01b038316610e4d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016107c6565b6001600160a01b038216610eae5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016107c6565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610f9b5781811015610f8e5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016107c6565b610f9b8484848403610deb565b50505050565b6001600160a01b0383166110055760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016107c6565b6001600160a01b0382166110675760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016107c6565b611072838383611783565b6001600160a01b038316600090815260208190526040902054818110156110ea5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016107c6565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906111219084906120ee565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161116d91815260200190565b60405180910390a3610f9b565b6111848282610af6565b61082c5761119c816001600160a01b0316601461181e565b6111a783602061181e565b6040516020016111b8929190612106565b60408051601f198184030181529082905262461bcd60e51b82526107c691600401611e7b565b6111e88282610d1b565b60008281526006602052604090206108129082610da1565b600081815260076020526040902054819060ff168061124957506000805260076020527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df5460ff165b6112955760405162461bcd60e51b815260206004820152601b60248201527f5061757361626c65436f6e74726f6c3a206e6f7420706175736564000000000060448201526064016107c6565b60008281526007602052604090819020805460ff19169055517fd05bfc2250abb0f8fd265a54c53a24359c5484af63cad2e4ce87c78ab751395a906112dd9084815260200190565b60405180910390a15050565b6112f382826119ba565b60008281526006602052604090206108129082611a21565b6001600160a01b0382163014156113645760405162461bcd60e51b815260206004820152601c60248201527f666f72626964206d696e7420746f20616464726573732874686973290000000060448201526064016107c6565b7fb2a18ae5d0b623b41098012c516d0bf4bef38c068c9e397da870c290888b199960005260076020527f5696ae725ce2b6df49ae5fc2132a3b5bfbfa3f910a4f4ebf5d914369aee88e285460ff16156113ed5760405162461bcd60e51b815260206004820152600b60248201526a1b5a5b9d081c185d5cd95960aa1b60448201526064016107c6565b33600090815260086020526040902080548211156114435760405162461bcd60e51b81526020600482015260136024820152721b5a5b9d195c881b585e08195e18d959591959606a1b60448201526064016107c6565b8181600201600082825461145791906120ee565b90915550506001810154600282015411156114aa5760405162461bcd60e51b81526020600482015260136024820152721b5a5b9d195c8818d85c08195e18d959591959606a1b60448201526064016107c6565b6108128383611a36565b6001600160a01b03821630141561150d5760405162461bcd60e51b815260206004820152601e60248201527f666f72626964206275726e2066726f6d2061646472657373287468697329000060448201526064016107c6565b7f62d52416825983abd68b16e092b60c2eac31fd673bcce92494e063af530d9c3060005260076020527f22c0851725d81d5a2873b6243c078a2bee0ad249f1327d73347baddfab2bafdf5460ff16156115965760405162461bcd60e51b815260206004820152600b60248201526a189d5c9b881c185d5cd95960aa1b60448201526064016107c6565b6115ae60008051602061220b83398151915233610af6565b156116315733600090815260086020526040902060028101548211156116165760405162461bcd60e51b815260206004820152601b60248201527f6d696e746572206275726e20616d6f756e74206578636565646564000000000060448201526064016107c6565b8181600201600082825461162a919061217b565b9091555050505b61082c8282611ac3565b6000610aef8383611c1d565b60006106b2825490565b600081815260076020526040902054819060ff1615801561169d57506000805260076020527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df5460ff16155b6116e95760405162461bcd60e51b815260206004820152601760248201527f5061757361626c65436f6e74726f6c3a2070617573656400000000000000000060448201526064016107c6565b60008281526007602052604090819020805460ff19166001179055517f0cb09dc71d57eeec2046f6854976717e4874a3cf2d6ddeddde337e5b6de6ba31906112dd9084815260200190565b600081815260018301602052604081205461177b575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106b2565b5060006106b2565b7f38cbe5ebce66f5e289a042a8eda57d146aaab8a3f3a9637670043b23d481307060005260076020527fed3cf84bcbd51c215e74472d803ae179cc7a6cdc7f43fbb4dee24097246f8ede5460ff16156108125760405162461bcd60e51b815260206004820152601b60248201527f746f6b656e207472616e73666572207768696c6520706175736564000000000060448201526064016107c6565b6060600061182d836002612192565b6118389060026120ee565b67ffffffffffffffff811115611850576118506121b1565b6040519080825280601f01601f19166020018201604052801561187a576020820181803683370190505b509050600360fc1b81600081518110611895576118956121c7565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106118c4576118c46121c7565b60200101906001600160f81b031916908160001a90535060006118e8846002612192565b6118f39060016120ee565b90505b600181111561196b576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611927576119276121c7565b1a60f81b82828151811061193d5761193d6121c7565b60200101906001600160f81b031916908160001a90535060049490941c93611964816121dd565b90506118f6565b508315610aef5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016107c6565b6119c48282610af6565b1561082c5760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610aef836001600160a01b038416611c47565b7f00000000000000000000000000000000000000000052b7d2dcc80cd2e400000081611a6160025490565b611a6b91906120ee565b1115611ab95760405162461bcd60e51b815260206004820152601960248201527f45524332304361707065643a206361702065786365656465640000000000000060448201526064016107c6565b61082c8282611d3a565b6001600160a01b038216611b235760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016107c6565b611b2f82600083611783565b6001600160a01b03821660009081526020819052604090205481811015611ba35760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016107c6565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611bd290849061217b565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6000826000018281548110611c3457611c346121c7565b9060005260206000200154905092915050565b60008181526001830160205260408120548015611d30576000611c6b60018361217b565b8554909150600090611c7f9060019061217b565b9050818114611ce4576000866000018281548110611c9f57611c9f6121c7565b9060005260206000200154905080876000018481548110611cc257611cc26121c7565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611cf557611cf56121f4565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106b2565b60009150506106b2565b6001600160a01b038216611d905760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016107c6565b611d9c60008383611783565b8060026000828254611dae91906120ee565b90915550506001600160a01b03821660009081526020819052604081208054839290611ddb9084906120ee565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600060208284031215611e3757600080fd5b81356001600160e01b031981168114610aef57600080fd5b60005b83811015611e6a578181015183820152602001611e52565b83811115610f9b5750506000910152565b6020815260008251806020840152611e9a816040850160208701611e4f565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114611ec557600080fd5b919050565b60008060408385031215611edd57600080fd5b611ee683611eae565b946020939093013593505050565b600080600060608486031215611f0957600080fd5b611f1284611eae565b9250611f2060208501611eae565b9150604084013590509250925092565b600060208284031215611f4257600080fd5b5035919050565b60008060408385031215611f5c57600080fd5b82359150611f6c60208401611eae565b90509250929050565b600060208284031215611f8757600080fd5b610aef82611eae565b600080600060608486031215611fa557600080fd5b611fae84611eae565b92506020840135915060408401358015158114611fca57600080fd5b809150509250925092565b600080600060608486031215611fea57600080fd5b611ff384611eae565b95602085013595506040909401359392505050565b6000806040838503121561201b57600080fd5b50508035926020909101359150565b6000806040838503121561203d57600080fd5b61204683611eae565b9150611f6c60208401611eae565b60008060006060848603121561206957600080fd5b83359250611f2060208501611eae565b600181811c9082168061208d57607f821691505b602082108114156120ae57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600a90820152693737ba1036b4b73a32b960b11b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612101576121016120d8565b500190565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161213e816017850160208801611e4f565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161216f816028840160208801611e4f565b01602801949350505050565b60008282101561218d5761218d6120d8565b500390565b60008160001904831182151516156121ac576121ac6120d8565b500290565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000816121ec576121ec6120d8565b506000190190565b634e487b7160e01b600052603160045260246000fdfe9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a2646970667358221220cc339a6941d06bc62d9fc1f8b87fe583b29c4485e2b35994fed501f5939dfbff64736f6c634300080a0033", + "storage": [ + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000002", + "value": "0x000000000000000000000000000000000000000000000000000000003b9aca00" + }, + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000003", + "value": "0x55534420436f696e000000000000000000000000000000000000000000000010" + }, + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000004", + "value": "0x5553444300000000000000000000000000000000000000000000000000000008" + }, + { + "key": "0x0f7b334bd042cdf6106f0b03608629c72b3dd9b502867391943cdad165052fd8", + "value": "0x00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000" + }, + { + "key": "0x0f7b334bd042cdf6106f0b03608629c72b3dd9b502867391943cdad165052fd9", + "value": "0x00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000" + }, + { + "key": "0x0f7b334bd042cdf6106f0b03608629c72b3dd9b502867391943cdad165052fda", + "value": "0x000000000000000000000000000000000000000000000000000000003b9aca00" + }, + { + "key": "0x10063f6f476eb36557de3ef096f492b7bd3be08cd7962b61529ef37274c58979", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "key": "0x1aed3814bfc23b375c5fbfdef8784e4d0f209df3f52fb56ec3335fc09dade332", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "key": "0x2c942ac975ca41e6510f3a38fdd96f840c5923682c849df648463765f8910bb8", + "value": "0x000000000000000000000000000000000000000000000000000000003b9aca00" + }, + { + "key": "0x3195c024b2ddd6d9b8f6c836aa52f67fe69376c8903d009b80229b3ce4425f51", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "key": "0x3b88b54959f4503ee0c9a3b506a4cab9144808a26ffb5738a7f73ebfb166a2d0", + "value": "0x0000000000000000000000007bbf300890857b8c241b219c6a489431669b3afa" + }, + { + "key": "0x3ce32fc73819a4967bb4929f14c98e2b8119f4bae7bfa814fa68b54ee5be649d", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "key": "0x54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f8", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "key": "0xb5cfa58595dee30140fb81207e9dab40b17aa1c01eb58fc78d547684f1782e43", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "key": "0xf1ca0f4808f7f0c52440675894727c9e66265266cd1e1f5015f8b745ca2de5f3", + "value": "0x0000000000000000000000007bbf300890857b8c241b219c6a489431669b3afa" + } + ] + }, + { + "address": "0x62d2f38dAA1153b381c6ed2A48e7f4673303ac9A", + "code": "608060405234801561001057600080fd5b50600436106100b45760003560e01c806372425d9d1161007157806372425d9d146101a657806386d516e8146101c4578063a8b0574e146101e2578063bce38bd714610200578063c3077fa914610230578063ee82ac5e14610262576100b4565b80630f28c97d146100b9578063252dba42146100d757806327e86d6e14610108578063399542e91461012657806342cbb15c146101585780634d2301cc14610176575b600080fd5b6100c1610292565b6040516100ce91906106a3565b60405180910390f35b6100f160048036038101906100ec91906109d2565b61029a565b6040516100ff929190610b65565b60405180910390f35b610110610423565b60405161011d9190610bae565b60405180910390f35b610140600480360381019061013b9190610c01565b610438565b60405161014f93929190610d6b565b60405180910390f35b610160610457565b60405161016d91906106a3565b60405180910390f35b610190600480360381019061018b9190610da9565b61045f565b60405161019d91906106a3565b60405180910390f35b6101ae610480565b6040516101bb91906106a3565b60405180910390f35b6101cc610488565b6040516101d991906106a3565b60405180910390f35b6101ea610490565b6040516101f79190610de5565b60405180910390f35b61021a60048036038101906102159190610c01565b610498565b6040516102279190610e00565b60405180910390f35b61024a600480360381019061024591906109d2565b610640565b60405161025993929190610d6b565b60405180910390f35b61027c60048036038101906102779190610e4e565b610663565b6040516102899190610bae565b60405180910390f35b600042905090565b60006060439150825167ffffffffffffffff8111156102bc576102bb6106e8565b5b6040519080825280602002602001820160405280156102ef57816020015b60608152602001906001900390816102da5790505b50905060005b835181101561041d5760008085838151811061031457610313610e7b565b5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1686848151811061034957610348610e7b565b5b6020026020010151602001516040516103629190610ee6565b6000604051808303816000865af19150503d806000811461039f576040519150601f19603f3d011682016040523d82523d6000602084013e6103a4565b606091505b5091509150816103e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e090610f5a565b60405180910390fd5b808484815181106103fd576103fc610e7b565b5b60200260200101819052505050808061041590610fa9565b9150506102f5565b50915091565b60006001436104329190610ff2565b40905090565b60008060604392504340915061044e8585610498565b90509250925092565b600043905090565b60008173ffffffffffffffffffffffffffffffffffffffff16319050919050565b600044905090565b600045905090565b600041905090565b6060815167ffffffffffffffff8111156104b5576104b46106e8565b5b6040519080825280602002602001820160405280156104ee57816020015b6104db61066e565b8152602001906001900390816104d35790505b50905060005b82518110156106395760008084838151811061051357610512610e7b565b5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1685848151811061054857610547610e7b565b5b6020026020010151602001516040516105619190610ee6565b6000604051808303816000865af19150503d806000811461059e576040519150601f19603f3d011682016040523d82523d6000602084013e6105a3565b606091505b509150915085156105ef57816105ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e590611098565b60405180910390fd5b5b604051806040016040528083151581526020018281525084848151811061061957610618610e7b565b5b60200260200101819052505050808061063190610fa9565b9150506104f4565b5092915050565b6000806060610650600185610438565b8093508194508295505050509193909250565b600081409050919050565b6040518060400160405280600015158152602001606081525090565b6000819050919050565b61069d8161068a565b82525050565b60006020820190506106b86000830184610694565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610720826106d7565b810181811067ffffffffffffffff8211171561073f5761073e6106e8565b5b80604052505050565b60006107526106be565b905061075e8282610717565b919050565b600067ffffffffffffffff82111561077e5761077d6106e8565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006107c98261079e565b9050919050565b6107d9816107be565b81146107e457600080fd5b50565b6000813590506107f6816107d0565b92915050565b600080fd5b600067ffffffffffffffff82111561081c5761081b6106e8565b5b610825826106d7565b9050602081019050919050565b82818337600083830152505050565b600061085461084f84610801565b610748565b9050828152602081018484840111156108705761086f6107fc565b5b61087b848285610832565b509392505050565b600082601f830112610898576108976106d2565b5b81356108a8848260208601610841565b91505092915050565b6000604082840312156108c7576108c6610794565b5b6108d16040610748565b905060006108e1848285016107e7565b600083015250602082013567ffffffffffffffff81111561090557610904610799565b5b61091184828501610883565b60208301525092915050565b600061093061092b84610763565b610748565b905080838252602082019050602084028301858111156109535761095261078f565b5b835b8181101561099a57803567ffffffffffffffff811115610978576109776106d2565b5b80860161098589826108b1565b85526020850194505050602081019050610955565b5050509392505050565b600082601f8301126109b9576109b86106d2565b5b81356109c984826020860161091d565b91505092915050565b6000602082840312156109e8576109e76106c8565b5b600082013567ffffffffffffffff811115610a0657610a056106cd565b5b610a12848285016109a4565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610a81578082015181840152602081019050610a66565b83811115610a90576000848401525b50505050565b6000610aa182610a47565b610aab8185610a52565b9350610abb818560208601610a63565b610ac4816106d7565b840191505092915050565b6000610adb8383610a96565b905092915050565b6000602082019050919050565b6000610afb82610a1b565b610b058185610a26565b935083602082028501610b1785610a37565b8060005b85811015610b535784840389528151610b348582610acf565b9450610b3f83610ae3565b925060208a01995050600181019050610b1b565b50829750879550505050505092915050565b6000604082019050610b7a6000830185610694565b8181036020830152610b8c8184610af0565b90509392505050565b6000819050919050565b610ba881610b95565b82525050565b6000602082019050610bc36000830184610b9f565b92915050565b60008115159050919050565b610bde81610bc9565b8114610be957600080fd5b50565b600081359050610bfb81610bd5565b92915050565b60008060408385031215610c1857610c176106c8565b5b6000610c2685828601610bec565b925050602083013567ffffffffffffffff811115610c4757610c466106cd565b5b610c53858286016109a4565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610c9281610bc9565b82525050565b6000604083016000830151610cb06000860182610c89565b5060208301518482036020860152610cc88282610a96565b9150508091505092915050565b6000610ce18383610c98565b905092915050565b6000602082019050919050565b6000610d0182610c5d565b610d0b8185610c68565b935083602082028501610d1d85610c79565b8060005b85811015610d595784840389528151610d3a8582610cd5565b9450610d4583610ce9565b925060208a01995050600181019050610d21565b50829750879550505050505092915050565b6000606082019050610d806000830186610694565b610d8d6020830185610b9f565b8181036040830152610d9f8184610cf6565b9050949350505050565b600060208284031215610dbf57610dbe6106c8565b5b6000610dcd848285016107e7565b91505092915050565b610ddf816107be565b82525050565b6000602082019050610dfa6000830184610dd6565b92915050565b60006020820190508181036000830152610e1a8184610cf6565b905092915050565b610e2b8161068a565b8114610e3657600080fd5b50565b600081359050610e4881610e22565b92915050565b600060208284031215610e6457610e636106c8565b5b6000610e7284828501610e39565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b6000610ec082610a47565b610eca8185610eaa565b9350610eda818560208601610a63565b80840191505092915050565b6000610ef28284610eb5565b915081905092915050565b600082825260208201905092915050565b7f4d756c746963616c6c206167677265676174653a2063616c6c206661696c6564600082015250565b6000610f44602083610efd565b9150610f4f82610f0e565b602082019050919050565b60006020820190508181036000830152610f7381610f37565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610fb48261068a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610fe757610fe6610f7a565b5b600182019050919050565b6000610ffd8261068a565b91506110088361068a565b92508282101561101b5761101a610f7a565b5b828203905092915050565b7f4d756c746963616c6c32206167677265676174653a2063616c6c206661696c6560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000611082602183610efd565b915061108d82611026565b604082019050919050565b600060208201905081810360008301526110b181611075565b905091905056fea2646970667358221220abd9cadc14e2f74213535fd9ad887c7bdc5f4ea6aa73d9aedcb1f0513098ea8e64736f6c63430008090033", + "storage": [] + }, + { + "address": "0x70C79B608aBBC502c2F61f38E04190fB407BefCF", + "code": "6080604052600436106100a05760003560e01c8063313ce56711610064578063313ce567146101ad57806370a08231146101d857806395d89b4114610215578063a9059cbb14610240578063d0e30db01461027d578063dd62ed3e14610287576100af565b806306fdde03146100b4578063095ea7b3146100df57806318160ddd1461011c57806323b872dd146101475780632e1a7d4d14610184576100af565b366100af576100ad6102c4565b005b600080fd5b3480156100c057600080fd5b506100c961036a565b6040516100d69190610bbe565b60405180910390f35b3480156100eb57600080fd5b5061010660048036038101906101019190610c79565b6103f8565b6040516101139190610cd4565b60405180910390f35b34801561012857600080fd5b506101316104ea565b60405161013e9190610cfe565b60405180910390f35b34801561015357600080fd5b5061016e60048036038101906101699190610d19565b6104f2565b60405161017b9190610cd4565b60405180910390f35b34801561019057600080fd5b506101ab60048036038101906101a69190610d6c565b6108c2565b005b3480156101b957600080fd5b506101c2610a32565b6040516101cf9190610db5565b60405180910390f35b3480156101e457600080fd5b506101ff60048036038101906101fa9190610dd0565b610a45565b60405161020c9190610cfe565b60405180910390f35b34801561022157600080fd5b5061022a610a5d565b6040516102379190610bbe565b60405180910390f35b34801561024c57600080fd5b5061026760048036038101906102629190610c79565b610aeb565b6040516102749190610cd4565b60405180910390f35b6102856102c4565b005b34801561029357600080fd5b506102ae60048036038101906102a99190610dfd565b610b00565b6040516102bb9190610cfe565b60405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546103139190610e6c565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040516103609190610cfe565b60405180910390a2565b6000805461037790610ef1565b80601f01602080910402602001604051908101604052809291908181526020018280546103a390610ef1565b80156103f05780601f106103c5576101008083540402835291602001916103f0565b820191906000526020600020905b8154815290600101906020018083116103d357829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104d89190610cfe565b60405180910390a36001905092915050565b600047905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056d90610f6f565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415801561064e57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156107a65781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070990610fdb565b60405180910390fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461079e9190610ffb565b925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546107f59190610ffb565b9250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461084b9190610e6c565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516108af9190610cfe565b60405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093b90610f6f565b60405180910390fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546109939190610ffb565b925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156109e0573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6582604051610a279190610cfe565b60405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054610a6a90610ef1565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9690610ef1565b8015610ae35780601f10610ab857610100808354040283529160200191610ae3565b820191906000526020600020905b815481529060010190602001808311610ac657829003601f168201915b505050505081565b6000610af83384846104f2565b905092915050565b6004602052816000526040600020602052806000526040600020600091509150505481565b600081519050919050565b600082825260208201905092915050565b60005b83811015610b5f578082015181840152602081019050610b44565b83811115610b6e576000848401525b50505050565b6000601f19601f8301169050919050565b6000610b9082610b25565b610b9a8185610b30565b9350610baa818560208601610b41565b610bb381610b74565b840191505092915050565b60006020820190508181036000830152610bd88184610b85565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610c1082610be5565b9050919050565b610c2081610c05565b8114610c2b57600080fd5b50565b600081359050610c3d81610c17565b92915050565b6000819050919050565b610c5681610c43565b8114610c6157600080fd5b50565b600081359050610c7381610c4d565b92915050565b60008060408385031215610c9057610c8f610be0565b5b6000610c9e85828601610c2e565b9250506020610caf85828601610c64565b9150509250929050565b60008115159050919050565b610cce81610cb9565b82525050565b6000602082019050610ce96000830184610cc5565b92915050565b610cf881610c43565b82525050565b6000602082019050610d136000830184610cef565b92915050565b600080600060608486031215610d3257610d31610be0565b5b6000610d4086828701610c2e565b9350506020610d5186828701610c2e565b9250506040610d6286828701610c64565b9150509250925092565b600060208284031215610d8257610d81610be0565b5b6000610d9084828501610c64565b91505092915050565b600060ff82169050919050565b610daf81610d99565b82525050565b6000602082019050610dca6000830184610da6565b92915050565b600060208284031215610de657610de5610be0565b5b6000610df484828501610c2e565b91505092915050565b60008060408385031215610e1457610e13610be0565b5b6000610e2285828601610c2e565b9250506020610e3385828601610c2e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610e7782610c43565b9150610e8283610c43565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610eb757610eb6610e3d565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610f0957607f821691505b60208210811415610f1d57610f1c610ec2565b5b50919050565b7f574b4156413a20616d6f756e74203c2062616c616e6365000000000000000000600082015250565b6000610f59601783610b30565b9150610f6482610f23565b602082019050919050565b60006020820190508181036000830152610f8881610f4c565b9050919050565b7f574b4156413a20616c6c6f77616e6365203c20616d6f756e7400000000000000600082015250565b6000610fc5601983610b30565b9150610fd082610f8f565b602082019050919050565b60006020820190508181036000830152610ff481610fb8565b9050919050565b600061100682610c43565b915061101183610c43565b92508282101561102457611023610e3d565b5b82820390509291505056fea26469706673582212200c0f9b15327ac79d31169413e421bd27d39e9809f7fd940e8929ed9685f5fa4564736f6c63430008090033", + "storage": [ + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000000", + "value": "0x57726170706564204b6176610000000000000000000000000000000000000018" + }, + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000001", + "value": "0x574b41564100000000000000000000000000000000000000000000000000000a" + }, + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000002", + "value": "0x0000000000000000000000000000000000000000000000000000000000000012" + } + ] + } + ], + "params": { + "evm_denom": "akava", + "enable_create": true, + "enable_call": true, + "extra_eips": [], + "chain_config": { + "homestead_block": "0", + "dao_fork_block": "0", + "dao_fork_support": true, + "eip150_block": "0", + "eip150_hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155_block": "0", + "eip158_block": "0", + "byzantium_block": "0", + "constantinople_block": "0", + "petersburg_block": "0", + "istanbul_block": "0", + "muir_glacier_block": "0", + "berlin_block": "0", + "london_block": null, + "arrow_glacier_block": null, + "merge_fork_block": null + }, + "eip712_allowed_msgs": [] + } + }, + "evmutil": { + "accounts": [], + "params": { + "enabled_conversion_pairs": [ + { + "kava_erc20_address": "0xeA7100edA2f805356291B0E55DaD448599a72C6d", + "denom": "erc20/multichain/usdc" + } + ] + } + }, + "feemarket": { + "params": { + "no_base_fee": true, + "base_fee_change_denominator": 8, + "elasticity_multiplier": 2, + "enable_height": "0", + "base_fee": "1000000000" + }, + "block_gas": "0" + }, + "genutil": { + "gen_txs": [ + { + "body": { + "messages": [ + { + "@type": "/cosmos.staking.v1beta1.MsgCreateValidator", + "description": { + "moniker": "validator", + "identity": "", + "website": "", + "security_contact": "", + "details": "" + }, + "commission": { + "rate": "0.100000000000000000", + "max_rate": "0.200000000000000000", + "max_change_rate": "0.010000000000000000" + }, + "min_self_delegation": "1", + "delegator_address": "kava1ypjp0m04pyp73hwgtc0dgkx0e9rrydecm054da", + "validator_address": "kavavaloper1ypjp0m04pyp73hwgtc0dgkx0e9rrydeckewa42", + "pubkey": { + "@type": "/cosmos.crypto.ed25519.PubKey", + "key": "/iEtt5/G+7hUT4FJ4p29yi2DCRut5Bm1Zx6doestjUA=" + }, + "value": { + "denom": "ukava", + "amount": "1000000000" + } + } + ], + "memo": "461d9761df5db0a112407ca8a82f1774ef2dbaa3@192.168.0.7:26656", + "timeout_height": "0", + "extension_options": [], + "non_critical_extension_options": [] + }, + "auth_info": { + "signer_infos": [ + { + "public_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AgIWiZpdEVb69gfaqyNjbA0b3oe+nRS9BZ9gH/I6oGz+" + }, + "mode_info": { + "single": { + "mode": "SIGN_MODE_DIRECT" + } + }, + "sequence": "0" + } + ], + "fee": { + "amount": [], + "gas_limit": "200000", + "payer": "", + "granter": "" + } + }, + "signatures": [ + "HE2tfqs81EJLOSmbJQyGv/TLFY5p6Yj028UBRnGMJcdROiNa6QLRnq4VWgpUOViHAgMvqWyZUbMfMc2rrGMUVQ==" + ] + } + ] + }, + "gov": { + "starting_proposal_id": "1", + "deposits": [], + "votes": [], + "proposals": [], + "deposit_params": { + "min_deposit": [ + { + "denom": "ukava", + "amount": "10000000" + } + ], + "max_deposit_period": "172800s" + }, + "voting_params": { + "voting_period": "172800s" + }, + "tally_params": { + "quorum": "0.334000000000000000", + "threshold": "0.500000000000000000", + "veto_threshold": "0.334000000000000000" + } + }, + "hard": { + "params": { + "money_markets": [ + { + "denom": "usdx", + "borrow_limit": { + "has_max_limit": false, + "maximum_limit": "20000000", + "loan_to_value": "0.80" + }, + "spot_market_id": "usdx:usd", + "conversion_factor": "1000000", + "interest_rate_model": { + "base_rate_apy": "0.05", + "base_multiplier": "0.1", + "kink": "0.8", + "jump_multiplier": "0.5" + }, + "reserve_factor": "0.0", + "keeper_reward_percentage": "0.05" + }, + { + "denom": "ukava", + "borrow_limit": { + "has_max_limit": false, + "maximum_limit": "100000000000", + "loan_to_value": "0.80" + }, + "spot_market_id": "kava:usd", + "conversion_factor": "1000000", + "interest_rate_model": { + "base_rate_apy": "0.05", + "base_multiplier": "2", + "kink": "0.85", + "jump_multiplier": "10" + }, + "reserve_factor": "0.1", + "keeper_reward_percentage": "0.01" + }, + { + "denom": "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2", + "borrow_limit": { + "has_max_limit": false, + "maximum_limit": "100000000000", + "loan_to_value": "0.80" + }, + "spot_market_id": "atom:usd", + "conversion_factor": "1000000", + "interest_rate_model": { + "base_rate_apy": "0.05", + "base_multiplier": "2", + "kink": "0.85", + "jump_multiplier": "10" + }, + "reserve_factor": "0.1", + "keeper_reward_percentage": "0.01" + }, + { + "denom": "ibc/4129EB76C01ED14052054BB975DE0C6C5010E12FFD9253C20C58BCD828BEE9A5", + "borrow_limit": { + "has_max_limit": false, + "maximum_limit": "100000000000", + "loan_to_value": "0.80" + }, + "spot_market_id": "akt:usd", + "conversion_factor": "1000000", + "interest_rate_model": { + "base_rate_apy": "0.05", + "base_multiplier": "2", + "kink": "0.85", + "jump_multiplier": "10" + }, + "reserve_factor": "0.1", + "keeper_reward_percentage": "0.01" + }, + { + "denom": "ibc/C72DE26FFF16DE62BE2784E12229BDF5F4465CE8B10530426D6DB53255FF01B2", + "borrow_limit": { + "has_max_limit": false, + "maximum_limit": "100000000000", + "loan_to_value": "0.80" + }, + "spot_market_id": "luna:usd", + "conversion_factor": "1000000", + "interest_rate_model": { + "base_rate_apy": "0.05", + "base_multiplier": "2", + "kink": "0.85", + "jump_multiplier": "10" + }, + "reserve_factor": "0.1", + "keeper_reward_percentage": "0.01" + }, + { + "denom": "ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518", + "borrow_limit": { + "has_max_limit": false, + "maximum_limit": "100000000000", + "loan_to_value": "0.80" + }, + "spot_market_id": "osmo:usd", + "conversion_factor": "1000000", + "interest_rate_model": { + "base_rate_apy": "0.05", + "base_multiplier": "2", + "kink": "0.85", + "jump_multiplier": "10" + }, + "reserve_factor": "0.1", + "keeper_reward_percentage": "0.01" + }, + { + "denom": "bnb", + "borrow_limit": { + "has_max_limit": false, + "maximum_limit": "100000000000", + "loan_to_value": "0.8" + }, + "spot_market_id": "bnb:usd", + "conversion_factor": "100000000", + "interest_rate_model": { + "base_rate_apy": "0.05", + "base_multiplier": "2", + "kink": "0.8", + "jump_multiplier": "10" + }, + "reserve_factor": "0.01", + "keeper_reward_percentage": "0.01" + }, + { + "denom": "busd", + "borrow_limit": { + "has_max_limit": false, + "maximum_limit": "100000000000", + "loan_to_value": "0.8" + }, + "spot_market_id": "busd:usd", + "conversion_factor": "100000000", + "interest_rate_model": { + "base_rate_apy": "0.01", + "base_multiplier": "2", + "kink": "0.8", + "jump_multiplier": "10" + }, + "reserve_factor": "0.01", + "keeper_reward_percentage": "0.01" + }, + { + "denom": "xrpb", + "borrow_limit": { + "has_max_limit": false, + "maximum_limit": "100000000000", + "loan_to_value": "0.5" + }, + "spot_market_id": "xrp:usd", + "conversion_factor": "100000000", + "interest_rate_model": { + "base_rate_apy": "0.00", + "base_multiplier": "0.2", + "kink": "0.8", + "jump_multiplier": "1.0" + }, + "reserve_factor": "0.025", + "keeper_reward_percentage": "0.01" + } + ], + "minimum_borrow_usd_value": "10.000000000000000000" + }, + "previous_accumulation_times": [], + "deposits": [], + "borrows": [], + "total_supplied": [], + "total_borrowed": [], + "total_reserves": [] + }, + "ibc": { + "client_genesis": { + "clients": [], + "clients_consensus": [], + "clients_metadata": [], + "params": { + "allowed_clients": [ + "06-solomachine", + "07-tendermint" + ] + }, + "create_localhost": false, + "next_client_sequence": "0" + }, + "connection_genesis": { + "connections": [], + "client_connection_paths": [], + "next_connection_sequence": "0", + "params": { + "max_expected_time_per_block": "30000000000" + } + }, + "channel_genesis": { + "channels": [], + "acknowledgements": [], + "commitments": [], + "receipts": [], + "send_sequences": [], + "recv_sequences": [], + "ack_sequences": [], + "next_channel_sequence": "0" + } + }, + "incentive": { + "params": { + "usdx_minting_reward_periods": [ + { + "active": true, + "rewards_per_second": { + "amount": "122354", + "denom": "ukava" + }, + "collateral_type": "bnb-a", + "start": "2021-12-08T14:00:00Z", + "end": "2024-10-16T14:00:00Z" + }, + { + "active": true, + "rewards_per_second": { + "amount": "122354", + "denom": "ukava" + }, + "collateral_type": "luna-a", + "start": "2021-12-08T14:00:00Z", + "end": "2024-10-16T14:00:00Z" + }, + { + "active": true, + "rewards_per_second": { + "amount": "122354", + "denom": "ukava" + }, + "collateral_type": "btcb-a", + "start": "2021-12-08T14:00:00Z", + "end": "2024-10-16T14:00:00Z" + }, + { + "active": true, + "rewards_per_second": { + "amount": "30588", + "denom": "ukava" + }, + "collateral_type": "busd-a", + "start": "2021-12-08T14:00:00Z", + "end": "2024-10-16T14:00:00Z" + }, + { + "active": true, + "rewards_per_second": { + "amount": "31746", + "denom": "ukava" + }, + "collateral_type": "xrpb-a", + "start": "2021-12-08T14:00:00Z", + "end": "2024-10-16T14:00:00Z" + }, + { + "active": true, + "rewards_per_second": { + "amount": "31746", + "denom": "ukava" + }, + "collateral_type": "ukava-a", + "start": "2021-12-08T14:00:00Z", + "end": "2024-10-16T14:00:00Z" + }, + { + "active": true, + "rewards_per_second": { + "amount": "23809", + "denom": "ukava" + }, + "collateral_type": "hard-a", + "start": "2021-12-08T14:00:00Z", + "end": "2024-10-16T14:00:00Z" + } + ], + "hard_supply_reward_periods": [ + { + "active": true, + "collateral_type": "bnb", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "123455", + "denom": "hard" + } + ] + }, + { + "active": true, + "collateral_type": "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "123455", + "denom": "hard" + } + ] + }, + { + "active": true, + "collateral_type": "ibc/4129EB76C01ED14052054BB975DE0C6C5010E12FFD9253C20C58BCD828BEE9A5", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "123455", + "denom": "hard" + } + ] + }, + { + "active": true, + "collateral_type": "ibc/C72DE26FFF16DE62BE2784E12229BDF5F4465CE8B10530426D6DB53255FF01B2", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "123455", + "denom": "hard" + } + ] + }, + { + "active": true, + "collateral_type": "ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "123455", + "denom": "hard" + } + ] + }, + { + "active": true, + "collateral_type": "btcb", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "12355", + "denom": "hard" + }, + { + "amount": "12355", + "denom": "ukava" + } + ] + }, + { + "active": true, + "collateral_type": "xrpb", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "12355", + "denom": "hard" + }, + { + "amount": "12355", + "denom": "ukava" + } + ] + }, + { + "active": true, + "collateral_type": "usdx", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "12355", + "denom": "hard" + }, + { + "amount": "12355", + "denom": "ukava" + } + ] + }, + { + "active": true, + "collateral_type": "busd", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "12355", + "denom": "hard" + }, + { + "amount": "12355", + "denom": "ukava" + } + ] + }, + { + "active": true, + "collateral_type": "ukava", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "123455", + "denom": "hard" + } + ] + }, + { + "active": true, + "collateral_type": "hard", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "123455", + "denom": "hard" + } + ] + } + ], + "hard_borrow_reward_periods": [ + { + "active": true, + "collateral_type": "bnb", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "12345", + "denom": "hard" + } + ] + }, + { + "active": true, + "collateral_type": "busd", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "12345", + "denom": "hard" + } + ] + }, + { + "active": true, + "collateral_type": "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "12345", + "denom": "hard" + } + ] + }, + { + "active": true, + "collateral_type": "ibc/4129EB76C01ED14052054BB975DE0C6C5010E12FFD9253C20C58BCD828BEE9A5", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "12345", + "denom": "hard" + } + ] + }, + { + "active": true, + "collateral_type": "ibc/C72DE26FFF16DE62BE2784E12229BDF5F4465CE8B10530426D6DB53255FF01B2", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "12345", + "denom": "hard" + } + ] + }, + { + "active": true, + "collateral_type": "ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "12345", + "denom": "hard" + } + ] + }, + { + "active": true, + "collateral_type": "ukava", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "12345", + "denom": "hard" + } + ] + }, + { + "active": true, + "collateral_type": "xrpb", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "12345", + "denom": "hard" + } + ] + }, + { + "active": true, + "collateral_type": "btcb", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "12345", + "denom": "hard" + } + ] + } + ], + "delegator_reward_periods": [ + { + "active": true, + "collateral_type": "ukava", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "316880", + "denom": "hard" + }, + { + "amount": "316880", + "denom": "swp" + } + ] + } + ], + "savings_reward_periods": [ + { + "active": true, + "collateral_type": "ukava", + "start": "2022-04-21T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "31688", + "denom": "ukava" + } + ] + }, + { + "active": true, + "collateral_type": "usdx", + "start": "2022-04-21T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "31688", + "denom": "ukava" + } + ] + } + ], + "swap_reward_periods": [ + { + "active": true, + "collateral_type": "ukava:usdx", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "316880", + "denom": "swp" + }, + { + "amount": "31688", + "denom": "ukava" + } + ] + }, + { + "active": true, + "collateral_type": "swp:usdx", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "616880", + "denom": "swp" + }, + { + "amount": "31688", + "denom": "ukava" + } + ] + }, + { + "active": true, + "collateral_type": "hard:usdx", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "116880", + "denom": "swp" + } + ] + }, + { + "active": true, + "collateral_type": "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2:usdx", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "116880", + "denom": "swp" + } + ] + }, + { + "active": true, + "collateral_type": "ibc/4129EB76C01ED14052054BB975DE0C6C5010E12FFD9253C20C58BCD828BEE9A5:usdx", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "116880", + "denom": "swp" + } + ] + }, + { + "active": true, + "collateral_type": "ibc/C72DE26FFF16DE62BE2784E12229BDF5F4465CE8B10530426D6DB53255FF01B2:usdx", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "116880", + "denom": "swp" + } + ] + }, + { + "active": true, + "collateral_type": "ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518:usdx", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "116880", + "denom": "swp" + } + ] + }, + { + "active": true, + "collateral_type": "busd:usdx", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "156880", + "denom": "swp" + } + ] + } + ], + "earn_reward_periods": [ + { + "active": true, + "collateral_type": "ukava", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "3168", + "denom": "ukava" + } + ] + }, + { + "active": true, + "collateral_type": "usdx", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "316880", + "denom": "ukava" + } + ] + }, + { + "active": true, + "collateral_type": "bkava", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "316880", + "denom": "ukava" + } + ] + }, + { + "active": true, + "collateral_type": "erc20/multichain/usdc", + "start": "2021-12-08T14:00:00Z", + "end": "2024-01-01T00:00:00Z", + "rewards_per_second": [ + { + "amount": "316880", + "denom": "ukava" + } + ] + } + ], + "claim_multipliers": [ + { + "denom": "hard", + "multipliers": [ + { + "name": "large", + "months_lockup": "0", + "factor": "1.0" + } + ] + }, + { + "denom": "swp", + "multipliers": [ + { + "name": "large", + "months_lockup": "0", + "factor": "1.0" + } + ] + }, + { + "denom": "ukava", + "multipliers": [ + { + "name": "large", + "months_lockup": "0", + "factor": "1.0" + } + ] + } + ], + "claim_end": "2025-01-01T00:00:00Z" + }, + "usdx_reward_state": { + "accumulation_times": [], + "multi_reward_indexes": [] + }, + "hard_supply_reward_state": { + "accumulation_times": [], + "multi_reward_indexes": [] + }, + "hard_borrow_reward_state": { + "accumulation_times": [], + "multi_reward_indexes": [] + }, + "delegator_reward_state": { + "accumulation_times": [], + "multi_reward_indexes": [] + }, + "swap_reward_state": { + "accumulation_times": [], + "multi_reward_indexes": [] + }, + "usdx_minting_claims": [], + "hard_liquidity_provider_claims": [], + "delegator_claims": [], + "swap_claims": [], + "savings_reward_state": { + "accumulation_times": [], + "multi_reward_indexes": [] + }, + "savings_claims": [], + "earn_reward_state": { + "accumulation_times": [], + "multi_reward_indexes": [] + }, + "earn_claims": [] + }, + "issuance": { + "params": { + "assets": [ + { + "owner": "kava1vlpsrmdyuywvaqrv7rx6xga224sqfwz3fyfhwq", + "denom": "ukava", + "blocked_addresses": [], + "paused": false, + "blockable": false, + "rate_limit": { + "active": false, + "limit": "0", + "time_period": "0s" + } + }, + { + "owner": "kava1vlpsrmdyuywvaqrv7rx6xga224sqfwz3fyfhwq", + "denom": "swp", + "blocked_addresses": [], + "paused": false, + "blockable": false, + "rate_limit": { + "active": false, + "limit": "0", + "time_period": "0s" + } + }, + { + "owner": "kava1vlpsrmdyuywvaqrv7rx6xga224sqfwz3fyfhwq", + "denom": "erc20/multichain/usdt", + "blocked_addresses": [], + "paused": false, + "blockable": false, + "rate_limit": { + "active": false, + "limit": "0", + "time_period": "0s" + } + }, + { + "owner": "kava1vlpsrmdyuywvaqrv7rx6xga224sqfwz3fyfhwq", + "denom": "usdx", + "blocked_addresses": [], + "paused": false, + "blockable": false, + "rate_limit": { + "active": false, + "limit": "0", + "time_period": "0s" + } + }, + { + "owner": "kava1vlpsrmdyuywvaqrv7rx6xga224sqfwz3fyfhwq", + "denom": "erc20/multichain/usdc", + "blocked_addresses": [], + "paused": false, + "blockable": false, + "rate_limit": { + "active": false, + "limit": "0", + "time_period": "0s" + } + }, + { + "owner": "kava1vlpsrmdyuywvaqrv7rx6xga224sqfwz3fyfhwq", + "denom": "hard", + "blocked_addresses": [], + "paused": false, + "blockable": false, + "rate_limit": { + "active": false, + "limit": "0", + "time_period": "0s" + } + }, + { + "owner": "kava1vlpsrmdyuywvaqrv7rx6xga224sqfwz3fyfhwq", + "denom": "busd", + "blocked_addresses": [], + "paused": false, + "blockable": false, + "rate_limit": { + "active": false, + "limit": "0", + "time_period": "0s" + } + }, + { + "owner": "kava1vlpsrmdyuywvaqrv7rx6xga224sqfwz3fyfhwq", + "denom": "btcb", + "blocked_addresses": [], + "paused": false, + "blockable": false, + "rate_limit": { + "active": false, + "limit": "0", + "time_period": "0s" + } + }, + { + "owner": "kava1vlpsrmdyuywvaqrv7rx6xga224sqfwz3fyfhwq", + "denom": "bnb", + "blocked_addresses": [], + "paused": false, + "blockable": false, + "rate_limit": { + "active": false, + "limit": "0", + "time_period": "0s" + } + }, + { + "owner": "kava1vlpsrmdyuywvaqrv7rx6xga224sqfwz3fyfhwq", + "denom": "xrpb", + "blocked_addresses": [], + "paused": false, + "blockable": false, + "rate_limit": { + "active": false, + "limit": "0", + "time_period": "0s" + } + } + ] + }, + "supplies": [] + }, + "kavadist": { + "params": { + "active": false, + "periods": [], + "infrastructure_params": { + "infrastructure_periods": [], + "core_rewards": [], + "partner_rewards": [] + } + }, + "previous_block_time": "1970-01-01T00:00:01Z" + }, + "liquid": {}, + "mint": { + "minter": { + "inflation": "0.130000000000000000", + "annual_provisions": "0.000000000000000000" + }, + "params": { + "mint_denom": "ukava", + "inflation_rate_change": "0.130000000000000000", + "inflation_max": "0.750000000000000000", + "inflation_min": "0.750000000000000000", + "goal_bonded": "0.670000000000000000", + "blocks_per_year": "6311520" + } + }, + "params": null, + "pricefeed": { + "params": { + "markets": [ + { + "active": true, + "base_asset": "bnb", + "market_id": "bnb:usd", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "bnb", + "market_id": "bnb:usd:30", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "btc", + "market_id": "btc:usd", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "btc", + "market_id": "btc:usd:30", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "xrp", + "market_id": "xrp:usd:30", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "xrp", + "market_id": "xrp:usd", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "busd", + "market_id": "busd:usd", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "busd", + "market_id": "busd:usd:30", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "kava", + "market_id": "kava:usd", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "kava", + "market_id": "kava:usd:30", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "hard", + "market_id": "hard:usd", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "hard", + "market_id": "hard:usd:30", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "atom", + "market_id": "atom:usd", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "atom", + "market_id": "atom:usd:30", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "osmo", + "market_id": "osmo:usd", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "osmo", + "market_id": "osmo:usd:30", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "akt", + "market_id": "akt:usd", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "akt", + "market_id": "akt:usd:30", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "luna", + "market_id": "luna:usd", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "luna", + "market_id": "luna:usd:30", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "usdx", + "market_id": "usdx:usd", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "usdx", + "market_id": "usdx:usd:30", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "usdx", + "market_id": "usdx:usd:720", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "swp", + "market_id": "swp:usd", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "swp", + "market_id": "swp:usd:30", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "erc20/multichain/usdc", + "market_id": "erc20/multichain/usdc:usd", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + }, + { + "active": true, + "base_asset": "erc20/multichain/usdc", + "market_id": "erc20/multichain/usdc:usd:30", + "oracles": [ + "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em" + ], + "quote_asset": "usd" + } + ] + }, + "posted_prices": [ + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "bnb:usd", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "215.962650000000001782" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "bnb:usd:30", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "217.962650000000001782" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "btc:usd", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "29500.962650000000001782" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "btc:usd:30", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "28500.962650000000001782" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "akt:usd", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "1.962650000000001782" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "akt:usd:30", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "1.962650000000001782" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "osmo:usd", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "4.962650000000001782" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "osmo:usd:30", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "4.962650000000001782" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "luna:usd", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "92.962650000000001782" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "luna:usd:30", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "92.962650000000001782" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "atom:usd", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "24.962650000000001782" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "atom:usd:30", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "24.962650000000001782" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "xrp:usd", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "0.552650000000001782" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "xrp:usd:30", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "0.552650000000001782" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "busd:usd", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "1.000000000000000000" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "busd:usd:30", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "1.000000000000000000" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "usdx:usd", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "1.000000000000000000" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "usdx:usd:30", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "1.000000000000000000" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "usdx:usd:720", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "1.000000000000000000" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "kava:usd", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "3.000000000000000000" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "kava:usd:30", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "3.000000000000000000" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "hard:usd", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "0.500000000000000000" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "hard:usd:30", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "0.500000000000000000" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "swp:usd", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "2.150000000000000000" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "swp:usd:30", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "2.150000000000000000" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "erc20/multichain/usdc:usd", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "1.000000000000000000" + }, + { + "expiry": "2023-07-20T00:00:00Z", + "market_id": "erc20/multichain/usdc:usd:30", + "oracle_address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em", + "price": "1.000000000000000000" + } + ] + }, + "router": {}, + "savings": { + "params": { + "supported_denoms": [ + "bkava-kavavaloper1ypjp0m04pyp73hwgtc0dgkx0e9rrydeckewa42", + "usdx", + "ukava", + "hard", + "swp", + "bkava", + "erc20/multichain/usdc" + ] + }, + "deposits": [] + }, + "slashing": { + "params": { + "signed_blocks_window": "100", + "min_signed_per_window": "0.500000000000000000", + "downtime_jail_duration": "600s", + "slash_fraction_double_sign": "0.050000000000000000", + "slash_fraction_downtime": "0.010000000000000000" + }, + "signing_infos": [], + "missed_blocks": [] + }, + "staking": { + "params": { + "unbonding_time": "1814400s", + "max_validators": 100, + "max_entries": 7, + "historical_entries": 10000, + "bond_denom": "ukava" + }, + "last_total_power": "0", + "last_validator_powers": [], + "validators": [], + "delegations": [], + "unbonding_delegations": [], + "redelegations": [], + "exported": false + }, + "swap": { + "params": { + "allowed_pools": [ + { + "token_a": "ukava", + "token_b": "usdx" + }, + { + "token_a": "hard", + "token_b": "usdx" + }, + { + "token_a": "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2", + "token_b": "usdx" + }, + { + "token_a": "ibc/4129EB76C01ED14052054BB975DE0C6C5010E12FFD9253C20C58BCD828BEE9A5", + "token_b": "usdx" + }, + { + "token_a": "ibc/C72DE26FFF16DE62BE2784E12229BDF5F4465CE8B10530426D6DB53255FF01B2", + "token_b": "usdx" + }, + { + "token_a": "ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518", + "token_b": "usdx" + }, + { + "token_a": "swp", + "token_b": "usdx" + }, + { + "token_a": "bnb", + "token_b": "usdx" + }, + { + "token_a": "btcb", + "token_b": "usdx" + }, + { + "token_a": "busd", + "token_b": "usdx" + }, + { + "token_a": "usdx", + "token_b": "xrpb" + } + ], + "swap_fee": "0.001500000000000000" + }, + "pool_records": [ + { + "pool_id": "btcb:usdx", + "reserves_a": { + "amount": "200000000", + "denom": "btcb" + }, + "reserves_b": { + "amount": "100000000000", + "denom": "usdx" + }, + "total_shares": "4472135954" + }, + { + "pool_id": "hard:usdx", + "reserves_a": { + "amount": "1000000000", + "denom": "hard" + }, + "reserves_b": { + "amount": "1000000000", + "denom": "usdx" + }, + "total_shares": "1000000000" + }, + { + "pool_id": "swp:usdx", + "reserves_a": { + "amount": "5000000000", + "denom": "swp" + }, + "reserves_b": { + "amount": "1000000000", + "denom": "usdx" + }, + "total_shares": "2236067977" + }, + { + "pool_id": "ukava:usdx", + "reserves_a": { + "amount": "5000000000", + "denom": "ukava" + }, + "reserves_b": { + "amount": "1000000000", + "denom": "usdx" + }, + "total_shares": "2236067977" + } + ], + "share_records": [ + { + "depositor": "kava173w2zz287s36ewnnkf4mjansnthnnsz7rtrxqc", + "pool_id": "btcb:usdx", + "shares_owned": "4472135954" + }, + { + "depositor": "kava173w2zz287s36ewnnkf4mjansnthnnsz7rtrxqc", + "pool_id": "hard:usdx", + "shares_owned": "1000000000" + }, + { + "depositor": "kava173w2zz287s36ewnnkf4mjansnthnnsz7rtrxqc", + "pool_id": "swp:usdx", + "shares_owned": "2236067977" + }, + { + "depositor": "kava173w2zz287s36ewnnkf4mjansnthnnsz7rtrxqc", + "pool_id": "ukava:usdx", + "shares_owned": "2236067977" + } + ] + }, + "transfer": { + "port_id": "transfer", + "denom_traces": [], + "params": { + "send_enabled": true, + "receive_enabled": true + } + }, + "upgrade": {}, + "validatorvesting": null, + "vesting": {} + } +} diff --git a/tests/e2e/generated/kava-1/config/gentx/gentx-461d9761df5db0a112407ca8a82f1774ef2dbaa3.json b/tests/e2e/generated/kava-1/config/gentx/gentx-461d9761df5db0a112407ca8a82f1774ef2dbaa3.json new file mode 100644 index 00000000..69811f55 --- /dev/null +++ b/tests/e2e/generated/kava-1/config/gentx/gentx-461d9761df5db0a112407ca8a82f1774ef2dbaa3.json @@ -0,0 +1 @@ +{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgCreateValidator","description":{"moniker":"validator","identity":"","website":"","security_contact":"","details":""},"commission":{"rate":"0.100000000000000000","max_rate":"0.200000000000000000","max_change_rate":"0.010000000000000000"},"min_self_delegation":"1","delegator_address":"kava1ypjp0m04pyp73hwgtc0dgkx0e9rrydecm054da","validator_address":"kavavaloper1ypjp0m04pyp73hwgtc0dgkx0e9rrydeckewa42","pubkey":{"@type":"/cosmos.crypto.ed25519.PubKey","key":"/iEtt5/G+7hUT4FJ4p29yi2DCRut5Bm1Zx6doestjUA="},"value":{"denom":"ukava","amount":"1000000000"}}],"memo":"461d9761df5db0a112407ca8a82f1774ef2dbaa3@192.168.0.7:26656","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[{"public_key":{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"AgIWiZpdEVb69gfaqyNjbA0b3oe+nRS9BZ9gH/I6oGz+"},"mode_info":{"single":{"mode":"SIGN_MODE_DIRECT"}},"sequence":"0"}],"fee":{"amount":[],"gas_limit":"200000","payer":"","granter":""}},"signatures":["HE2tfqs81EJLOSmbJQyGv/TLFY5p6Yj028UBRnGMJcdROiNa6QLRnq4VWgpUOViHAgMvqWyZUbMfMc2rrGMUVQ=="]} diff --git a/tests/e2e/generated/kava-1/config/init-data-directory.sh b/tests/e2e/generated/kava-1/config/init-data-directory.sh new file mode 100755 index 00000000..3a5b1c0b --- /dev/null +++ b/tests/e2e/generated/kava-1/config/init-data-directory.sh @@ -0,0 +1,16 @@ +#! /bin/sh +set -e + +# This script creates a data directory if one doesn't exist. +# It's designed to run before the chain starts to properly initialize the data directory in case `kvd init` was not run. +# This behaviour should probably live in tendermint. + +configDir=$HOME/.kava/config +dataDir=$HOME/.kava/data +valStateFile=$dataDir/priv_validator_state.json + +if ! test -f "$valStateFile"; then + echo "$valStateFile doesn't exist, creating it" + mkdir -p $dataDir + cp $configDir/priv_validator_state.json.example "$valStateFile" +fi diff --git a/tests/e2e/generated/kava-1/config/node_key.json b/tests/e2e/generated/kava-1/config/node_key.json new file mode 100644 index 00000000..4cc69c01 --- /dev/null +++ b/tests/e2e/generated/kava-1/config/node_key.json @@ -0,0 +1 @@ +{"priv_key":{"type":"tendermint/PrivKeyEd25519","value":"CD7Hkk7hzHx/nn2DasmELmhord4rn0SDLpHrXtATuiM6anFSdulMLfZLZFrKpHtl/kvESy+B0NH4Hf2GI+BkEg=="}} \ No newline at end of file diff --git a/tests/e2e/generated/kava-1/config/priv_validator_key.json b/tests/e2e/generated/kava-1/config/priv_validator_key.json new file mode 100644 index 00000000..3004c00a --- /dev/null +++ b/tests/e2e/generated/kava-1/config/priv_validator_key.json @@ -0,0 +1,11 @@ +{ + "address": "8A635482445A7726F17DEB53014D8E8E3E6DA6B6", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "/iEtt5/G+7hUT4FJ4p29yi2DCRut5Bm1Zx6doestjUA=" + }, + "priv_key": { + "type": "tendermint/PrivKeyEd25519", + "value": "w+2nJVmnZb0NEaf6mDWy85/EOvELbPtXjeioUGfBUqn+IS23n8b7uFRPgUninb3KLYMJG63kGbVnHp2h6y2NQA==" + } +} \ No newline at end of file diff --git a/tests/e2e/generated/kava-1/config/priv_validator_state.json.example b/tests/e2e/generated/kava-1/config/priv_validator_state.json.example new file mode 100644 index 00000000..48f3b67e --- /dev/null +++ b/tests/e2e/generated/kava-1/config/priv_validator_state.json.example @@ -0,0 +1,5 @@ +{ + "height": "0", + "round": 0, + "step": 0 +} \ No newline at end of file diff --git a/tests/e2e/runner/main.go b/tests/e2e/runner/main.go new file mode 100644 index 00000000..90d41e10 --- /dev/null +++ b/tests/e2e/runner/main.go @@ -0,0 +1,151 @@ +package runner + +import ( + "fmt" + "log" + "net/http" + "time" + + "github.com/ory/dockertest/v3" + "github.com/ory/dockertest/v3/docker" +) + +type Config struct { + ConfigDir string + ImageTag string + + KavaRpcPort string + KavaGrpcPort string + KavaRestPort string + KavaEvmPort string +} + +// NodeRunner is responsible for starting and managing docker containers to run a node. +type NodeRunner interface { + StartChains() + Shutdown() +} + +// SingleKavaNodeRunner manages and runs a single Kava node. +type SingleKavaNodeRunner struct { + config Config + + pool *dockertest.Pool + resource *dockertest.Resource +} + +var _ NodeRunner = &SingleKavaNodeRunner{} + +func NewSingleKavaNode(config Config) *SingleKavaNodeRunner { + return &SingleKavaNodeRunner{ + config: config, + } +} + +func (k *SingleKavaNodeRunner) StartChains() { + log.Println("starting kava node") + k.setupDockerPool() + err := k.waitForChainStart() + if err != nil { + k.Shutdown() + panic(err) + } +} + +func (k *SingleKavaNodeRunner) Shutdown() { + log.Println("shutting down kava node") + k.pool.Purge(k.resource) +} + +func (k *SingleKavaNodeRunner) setupDockerPool() { + pool, err := dockertest.NewPool("") + if err != nil { + log.Fatalf("Failed to make docker pool: %s", err) + } + k.pool = pool + + err = pool.Client.Ping() + if err != nil { + log.Fatalf("Failed to connect to docker: %s", err) + } + + resource, err := k.pool.RunWithOptions(&dockertest.RunOptions{ + Name: "kavanode", + Repository: "kava/kava", + Tag: k.config.ImageTag, + Cmd: []string{ + "sh", + "-c", + "/root/.kava/config/init-data-directory.sh && kava start --rpc.laddr=tcp://0.0.0.0:26657", + }, + Mounts: []string{ + fmt.Sprintf("%s:/root/.kava/config", k.config.ConfigDir), + }, + ExposedPorts: []string{ + "26657", // port inside container for Kava RPC + "1317", // port inside container for Kava REST API + "9090", // port inside container for Kava GRPC + "8545", // port inside container for EVM JSON-RPC + }, + // expose the internal ports on the configured ports + PortBindings: map[docker.Port][]docker.PortBinding{ + "26657": {{HostIP: "", HostPort: k.config.KavaRpcPort}}, + "1327": {{HostIP: "", HostPort: k.config.KavaRestPort}}, + "9090": {{HostIP: "", HostPort: k.config.KavaGrpcPort}}, + "8545": {{HostIP: "", HostPort: k.config.KavaEvmPort}}, + }, + }, func(config *docker.HostConfig) { + // set AutoRemove to true so that stopped container goes away by itself + config.AutoRemove = true + config.RestartPolicy = docker.RestartPolicy{Name: "no"} + }) + if err != nil { + log.Fatalf("Failed to start kava node: %s", err) + } + k.resource = resource + log.Println(resource.GetHostPort("26657")) +} + +func (k *SingleKavaNodeRunner) waitForChainStart() error { + // exponential backoff on trying to ping the node, timeout after 30 seconds + k.pool.MaxWait = 30 * time.Second + if err := k.pool.Retry(k.pingKava); err != nil { + return fmt.Errorf("failed to start & connect to chain: %s", err) + } + // the evm takes a bit longer to start up. wait for it to start as well. + if err := k.pool.Retry(k.pingEvm); err != nil { + return fmt.Errorf("failed to start & connect to chain: %s", err) + } + return nil +} + +func (k *SingleKavaNodeRunner) pingKava() error { + log.Println("pinging kava chain...") + url := fmt.Sprintf("http://localhost:%s/status", k.config.KavaRpcPort) + res, err := http.Get(url) + if err != nil { + return err + } + defer res.Body.Close() + if res.StatusCode >= 400 { + return fmt.Errorf("ping to status failed: %d", res.StatusCode) + } + log.Println("successfully started Kava!") + return nil +} + +func (k *SingleKavaNodeRunner) pingEvm() error { + log.Println("pinging evm...") + url := fmt.Sprintf("http://localhost:%s", k.config.KavaEvmPort) + res, err := http.Get(url) + if err != nil { + return err + } + defer res.Body.Close() + // when running, it should respond 405 to a GET request + if res.StatusCode != 405 { + return fmt.Errorf("ping to evm failed: %d", res.StatusCode) + } + log.Println("successfully pinged EVM!") + return nil +} diff --git a/tests/e2e/testutil/account.go b/tests/e2e/testutil/account.go new file mode 100644 index 00000000..3e5082e5 --- /dev/null +++ b/tests/e2e/testutil/account.go @@ -0,0 +1,127 @@ +package testutil + +import ( + "fmt" + "log" + "os" + + "github.com/cosmos/cosmos-sdk/crypto/hd" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + sdk "github.com/cosmos/cosmos-sdk/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/cosmos/go-bip39" + + "github.com/kava-labs/kava/app" + "github.com/kava-labs/kava/tests/util" +) + +type SigningAccount struct { + name string + mnemonic string + signer *util.Signer + requests chan<- util.MsgRequest + responses <-chan util.MsgResponse + + Address sdk.AccAddress + + l *log.Logger +} + +// GetAccount returns the account with the given name or fails +func (suite *E2eTestSuite) GetAccount(name string) *SigningAccount { + acc, found := suite.accounts[name] + if !found { + suite.Failf("account does not exist", "failed to find account with name %s", name) + } + return acc +} + +// AddNewSigningAccount sets up a new account with a signer. +func (suite *E2eTestSuite) AddNewSigningAccount(name string, hdPath *hd.BIP44Params, chainId, mnemonic string) *SigningAccount { + if _, found := suite.accounts[name]; found { + suite.Failf("can't create signing account", "account with name %s already exists", name) + } + + privKeyBytes, err := hd.Secp256k1.Derive()(mnemonic, "", hdPath.String()) + suite.NoErrorf(err, "failed to derive private key from mnemonic for %s: %s", name, err) + privKey := &secp256k1.PrivKey{Key: privKeyBytes} + + signer := util.NewSigner( + chainId, + suite.encodingConfig, + suite.Auth, + suite.Tx, + privKey, + 100, + ) + + requests := make(chan util.MsgRequest) + responses, err := signer.Run(requests) + suite.NoErrorf(err, "failed to start signer for account %s: %s", name, err) + + logger := log.New(os.Stdout, fmt.Sprintf("[%s] ", name), log.LstdFlags) + + // TODO: authenticated eth client. + suite.accounts[name] = &SigningAccount{ + name: name, + mnemonic: mnemonic, + signer: signer, + requests: requests, + responses: responses, + l: logger, + + Address: signer.Address(), + } + + return suite.accounts[name] +} + +// SignAndBroadcastKavaTx sends a request to the signer and awaits its response. +func (a *SigningAccount) SignAndBroadcastKavaTx(req util.MsgRequest) util.MsgResponse { + a.l.Printf("broadcasting tx %+v\n", req.Data) + // send the request to signer + a.requests <- req + + // block and await response + // response is not returned until the msg is committed to a block + res := <-a.responses + + // error will be set if response is not Code 0 (success) or Code 19 (already in mempool) + if res.Err != nil { + a.l.Printf("response code: %d error: %s\n", res.Result.Code, res.Result.RawLog) + } else { + a.l.Printf("response code: %d, hash %s\n", res.Result.Code, res.Result.TxHash) + } + + return res +} + +func (suite *E2eTestSuite) NewFundedAccount(name string, funds sdk.Coins) *SigningAccount { + entropy, err := bip39.NewEntropy(128) + suite.NoErrorf(err, "failed to generate entropy for account %s: %s", name, err) + mnemonic, err := bip39.NewMnemonic(entropy) + suite.NoErrorf(err, "failed to create new mnemonic for account %s: %s", name, err) + + acc := suite.AddNewSigningAccount( + name, + hd.CreateHDPath(app.Bip44CoinType, 0, 0), + ChainId, + mnemonic, + ) + + whale := suite.GetAccount(FundedAccountName) + res := whale.SignAndBroadcastKavaTx( + util.MsgRequest{ + Msgs: []sdk.Msg{ + banktypes.NewMsgSend(whale.Address, acc.Address, funds), + }, + GasLimit: 1e5, + FeeAmount: sdk.NewCoins(sdk.NewCoin(StakingDenom, sdk.NewInt(75000))), + Data: fmt.Sprintf("initial funding of account %s", name), + }, + ) + + suite.NoErrorf(res.Err, "failed to fund new account %s: %s", name, res.Err) + + return acc +} diff --git a/tests/e2e/testutil/suite.go b/tests/e2e/testutil/suite.go new file mode 100644 index 00000000..1bea3bba --- /dev/null +++ b/tests/e2e/testutil/suite.go @@ -0,0 +1,114 @@ +package testutil + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/stretchr/testify/suite" + "google.golang.org/grpc" + + "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" + "github.com/cosmos/cosmos-sdk/crypto/hd" + txtypes "github.com/cosmos/cosmos-sdk/types/tx" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/kava-labs/kava/app" + kavaparams "github.com/kava-labs/kava/app/params" + "github.com/kava-labs/kava/tests/e2e/runner" + "github.com/kava-labs/kava/tests/util" +) + +const ( + ChainId = "kavalocalnet_8888-1" + FundedAccountName = "whale" + StakingDenom = "ukava" +) + +type E2eTestSuite struct { + suite.Suite + + runner runner.NodeRunner + grpcConn *grpc.ClientConn + encodingConfig kavaparams.EncodingConfig + + EvmClient *ethclient.Client + Auth authtypes.QueryClient + Bank banktypes.QueryClient + Tm tmservice.ServiceClient + Tx txtypes.ServiceClient + + accounts map[string]*SigningAccount +} + +func (suite *E2eTestSuite) SetupSuite() { + app.SetSDKConfig() + suite.encodingConfig = app.MakeEncodingConfig() + + // this mnemonic is expected to be a funded account that can seed the funds for all + // new accounts created during tests. it will be available under Accounts["whale"] + fundedAccountMnemonic := os.Getenv("E2E_KAVA_FUNDED_ACCOUNT_MNEMONIC") + if fundedAccountMnemonic == "" { + suite.Fail("no E2E_KAVA_FUNDED_ACCOUNT_MNEMONIC provided") + } + + configDir, err := filepath.Abs("./generated/kava-1/config") + if err != nil { + suite.Fail("failed to get config dir: %s", err) + } + config := runner.Config{ + ConfigDir: configDir, + + KavaRpcPort: "26657", + KavaRestPort: "1317", + KavaGrpcPort: "9090", + KavaEvmPort: "8545", + + ImageTag: "local", + } + suite.runner = runner.NewSingleKavaNode(config) + suite.runner.StartChains() + + // setup an unauthenticated evm client + evmRpcUrl := fmt.Sprintf("http://localhost:%s", config.KavaEvmPort) + suite.EvmClient, err = ethclient.Dial(evmRpcUrl) + if err != nil { + suite.runner.Shutdown() + suite.Fail("failed to connect to evm: %s", err) + } + + // create grpc connection + grpcUrl := fmt.Sprintf("http://localhost:%s", config.KavaGrpcPort) + suite.grpcConn, err = util.NewGrpcConnection(grpcUrl) + if err != nil { + suite.runner.Shutdown() + suite.Fail("failed to create grpc connection: %s", err) + } + + // setup unauthenticated query clients for kava / cosmos + suite.Auth = authtypes.NewQueryClient(suite.grpcConn) + suite.Bank = banktypes.NewQueryClient(suite.grpcConn) + suite.Tm = tmservice.NewServiceClient(suite.grpcConn) + suite.Tx = txtypes.NewServiceClient(suite.grpcConn) + + // initialize accounts map + suite.accounts = make(map[string]*SigningAccount) + // setup the signing account for the initially funded account (used to fund all other accounts) + suite.AddNewSigningAccount( + FundedAccountName, + hd.CreateHDPath(app.Bip44CoinType, 0, 0), + ChainId, + fundedAccountMnemonic, + ) +} + +func (suite *E2eTestSuite) TearDownSuite() { + // close all account request channels + for _, a := range suite.accounts { + close(a.requests) + } + // gracefully shutdown docker container(s) + suite.runner.Shutdown() +} diff --git a/tests/util/grpc.go b/tests/util/grpc.go new file mode 100644 index 00000000..99221543 --- /dev/null +++ b/tests/util/grpc.go @@ -0,0 +1,36 @@ +package util + +import ( + "crypto/tls" + "fmt" + "net/url" + + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" +) + +// NewGrpcConnection parses a GRPC endpoint and creates a connection to it +func NewGrpcConnection(endpoint string) (*grpc.ClientConn, error) { + grpcUrl, err := url.Parse(endpoint) + if err != nil { + return nil, err + } + + var secureOpt grpc.DialOption + switch grpcUrl.Scheme { + case "http": + secureOpt = grpc.WithInsecure() + case "https": + creds := credentials.NewTLS(&tls.Config{}) + secureOpt = grpc.WithTransportCredentials(creds) + default: + return nil, fmt.Errorf("unknown grpc url scheme: %s", grpcUrl.Scheme) + } + + grpcConn, err := grpc.Dial(grpcUrl.Host, secureOpt) + if err != nil { + return nil, err + } + + return grpcConn, nil +} diff --git a/tests/util/signing.go b/tests/util/signing.go new file mode 100644 index 00000000..6f50c06b --- /dev/null +++ b/tests/util/signing.go @@ -0,0 +1,421 @@ +package util + +import ( + "context" + "fmt" + "time" + + "github.com/kava-labs/kava/app/params" + + sdkclient "github.com/cosmos/cosmos-sdk/client" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + txtypes "github.com/cosmos/cosmos-sdk/types/tx" + "github.com/cosmos/cosmos-sdk/types/tx/signing" + authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + tmmempool "github.com/tendermint/tendermint/mempool" +) + +type MsgRequest struct { + Msgs []sdk.Msg + GasLimit uint64 + FeeAmount sdk.Coins + Memo string + // Arbitrary data to be referenced in the corresponding MsgResponse, unused + // in signing. This is mostly useful to match MsgResponses with MsgRequests. + Data interface{} +} + +type MsgResponse struct { + Request MsgRequest + Tx authsigning.Tx + TxBytes []byte + Result sdk.TxResponse + Err error +} + +// internal result for inner loop logic +type broadcastTxResult int + +const ( + txOK broadcastTxResult = iota + txFailed + txRetry + txResetSequence +) + +// Signer broadcasts msgs to a single kava node +type Signer struct { + chainID string + encodingConfig params.EncodingConfig + authClient authtypes.QueryClient + txClient txtypes.ServiceClient + privKey cryptotypes.PrivKey + inflightTxLimit uint64 +} + +func NewSigner( + chainID string, + encodingConfig params.EncodingConfig, + authClient authtypes.QueryClient, + txClient txtypes.ServiceClient, + privKey cryptotypes.PrivKey, + inflightTxLimit uint64) *Signer { + + return &Signer{ + chainID: chainID, + encodingConfig: encodingConfig, + authClient: authClient, + txClient: txClient, + privKey: privKey, + inflightTxLimit: inflightTxLimit, + } +} + +func (s *Signer) pollAccountState() <-chan authtypes.AccountI { + accountState := make(chan authtypes.AccountI) + + go func() { + for { + request := authtypes.QueryAccountRequest{ + Address: GetAccAddress(s.privKey).String(), + } + response, err := s.authClient.Account(context.Background(), &request) + + if err == nil { + var account authtypes.AccountI + + err = s.encodingConfig.InterfaceRegistry.UnpackAny(response.Account, &account) + if err == nil { + accountState <- account + } + } + + time.Sleep(1 * time.Second) + } + }() + + return accountState +} + +func (s *Signer) Run(requests <-chan MsgRequest) (<-chan MsgResponse, error) { + // poll account state in it's own goroutine + // and send status updates to the signing goroutine + // + // TODO: instead of polling, we can wait for block + // websocket events with a fallback to polling + accountState := s.pollAccountState() + + responses := make(chan MsgResponse) + go func() { + // wait until account is loaded to start signing + account := <-accountState + // store current request waiting to be broadcasted + var currentRequest *MsgRequest + // keep track of all successfully broadcasted txs + // index is sequence % inflightTxLimit + inflight := make([]*MsgResponse, s.inflightTxLimit) + // used for confirming sent txs only + prevDeliverTxSeq := account.GetSequence() + // tx sequence of already signed messages + checkTxSeq := account.GetSequence() + // tx sequence of broadcast queue, is reset upon + // unauthorized errors to recheck/refill mempool + broadcastTxSeq := account.GetSequence() + + for { + // the inflight limit includes the current request + // + // account.GetSequence() represents the first tx in the mempool (at the last known state) + // or the next sequence to sign with if checkTxSeq == account.GetSequence() (zero msgs in flight) + // + // checkTxSeq always represents the next available mempool sequence to sign with + // + // if currentRequest is nil, then it will be used for the next request received + // if currentRequest is not nil, then checkTxSeq will be used to sign that request + // + // therefore, assuming no errors, broadcastTxSeq will be checkTxSeq-1 or checkTxSeq, dependent on + // if the currentRequest has been been successfully broadcast + // + // if an unauthorized error occurs, a tx in the mempool was dropped (or mempool flushed, node restart, etc) + // and broadcastTxSeq is reset to account.GetSequence() in order to refil the mempool and ensure + // checkTxSeq is valid + // + // if an authorized error occurs due to another process signing messages on behalf of the same + // address, then broadcastTxSeq will continually be reset until that sequence is delivered to a block + // + // this results in the message we signed with the same sequence being skipped as well as + // draining our inflight messages to 0. + // + // On deployments, a similar event will occur. we will continually broadcast until + // all of the previous transactions are processed and out of the mempool. + // + // it's possible to increase the checkTx (up to the inflight limit) until met with a successful broadcast, + // to fill the mempool faster, but this feature is umimplemented and would be best enabled only once + // on startup. An authorized error during normal operation would be difficult or impossible to tell apart + // from a dropped mempool tx (without further improving mempool queries). Options such as persisting inflight + // state out of process may be better. + inflightLimitReached := checkTxSeq-account.GetSequence() >= s.inflightTxLimit + + // if we are still processing a request or the inflight limit is reached + // then block until the next account update without accepting new requests + if currentRequest != nil || inflightLimitReached { + account = <-accountState + } else { + // block on state update or new requests + select { + case account = <-accountState: + case request := <-requests: + currentRequest = &request + } + } + + // send delivered (included in block) responses to caller + if account.GetSequence() > prevDeliverTxSeq { + for i := prevDeliverTxSeq; i < account.GetSequence(); i++ { + response := inflight[i%s.inflightTxLimit] + // sequences may be skipped due to errors + if response != nil { + responses <- *response + } + // clear to prevent duplicate confirmations on errors + inflight[i%s.inflightTxLimit] = nil + } + prevDeliverTxSeq = account.GetSequence() + } + + // recover from errors due to untracked messages in mempool + // this will happen on deploys, or if another process + // signs a tx using the same address + if checkTxSeq < account.GetSequence() { + checkTxSeq = account.GetSequence() + } + + // if currentRequest then lastRequestTxSeq == checkTxSeq + // if not currentRequest then lastRequestTxSeq == checkTxSeq - 1 + lastRequestTxSeq := checkTxSeq + if currentRequest == nil && lastRequestTxSeq > 0 { + lastRequestTxSeq-- + } + // reset broadcast seq if iterated over last request seq + // we always want to broadcast the current or last request + // to heartbeat the mempool + if broadcastTxSeq > lastRequestTxSeq { + broadcastTxSeq = lastRequestTxSeq + } + + // loop serves three purposes + // - recover from dropped txs (broadcastTxSeq < lastRequestTxSeq) + // - send new requests (currentRequest is set) + // - send mempool heartbeat (currentRequest is nil) + BROADCAST_LOOP: + for broadcastTxSeq <= lastRequestTxSeq { + + // we have a new request that has not been successfully broadcasted + // and are at the last broadcastTxSeq (broadcastTxSeq == checkTxSeq in this case) + sendingCurrentRequest := broadcastTxSeq == lastRequestTxSeq && currentRequest != nil + + // check if we have a previous response to check/retry/send for the broadcastTxSeq + response := inflight[broadcastTxSeq%s.inflightTxLimit] + + // no response -- either checkTxSeq was skipped (untracked mempool tx), or + // we are signing a new transactions (currentRequest is not nil) + if response == nil { + // nothing to do if no response to retry and not sending a current request + if !sendingCurrentRequest { + // move onto next broadcastTxSeq or exit loop + broadcastTxSeq++ + continue + } + + txBuilder := s.encodingConfig.TxConfig.NewTxBuilder() + txBuilder.SetMsgs(currentRequest.Msgs...) + txBuilder.SetGasLimit(currentRequest.GasLimit) + txBuilder.SetFeeAmount(currentRequest.FeeAmount) + + signerData := authsigning.SignerData{ + ChainID: s.chainID, + AccountNumber: account.GetAccountNumber(), + Sequence: broadcastTxSeq, + } + + tx, txBytes, err := Sign(s.encodingConfig.TxConfig, s.privKey, txBuilder, signerData) + + response = &MsgResponse{ + Request: *currentRequest, + Tx: tx, + TxBytes: txBytes, + Err: err, + } + + // could not sign and encode the currentRequest + if response.Err != nil { + // clear invalid request, since this is non-recoverable + currentRequest = nil + + // response immediately with error + responses <- *response + + // exit loop + broadcastTxSeq++ + continue + } + } + + // broadcast tx and get result + // + // there are four main types of results + // + // OK (tx in mempool, store response - add to inflight txs) + // Retry (tx not in mempool, but retry - do not change inflight status) + // Failed (tx not in mempool, not recoverable - clear inflight status, reply to channel) + // Unauthorized (tx not in mempool - sequence not valid) + broadcastRequest := txtypes.BroadcastTxRequest{ + TxBytes: response.TxBytes, + Mode: txtypes.BroadcastMode_BROADCAST_MODE_SYNC, + } + broadcastResponse, err := s.txClient.BroadcastTx(context.Background(), &broadcastRequest) + + // set to determine action at the end of loop + // default is OK + txResult := txOK + + // determine action to take when err (and no response) + if err != nil { + if tmmempool.IsPreCheckError(err) { + // ErrPreCheck - not recoverable + response.Err = err + txResult = txFailed + } else { + // could not contact node (POST failed, dns errors, etc) + // exit loop, wait for another account state update + // TODO: are there cases here that we will never recover from? + // should we implement retry limit? + response.Err = err + txResult = txRetry + } + } else { + // store rpc result in response + response.Result = *broadcastResponse.TxResponse + + // determine action to take based on rpc result + switch response.Result.Code { + // 0: success, in mempool + case sdkerrors.SuccessABCICode: + txResult = txOK + // 4: unauthorized + case sdkerrors.ErrUnauthorized.ABCICode(): + txResult = txResetSequence + // 19: success, tx already in mempool + case sdkerrors.ErrTxInMempoolCache.ABCICode(): + txResult = txOK + // 20: mempool full + case sdkerrors.ErrMempoolIsFull.ABCICode(): + txResult = txRetry + // 32: wrong sequence + case sdkerrors.ErrWrongSequence.ABCICode(): + txResult = txResetSequence + default: + response.Err = fmt.Errorf("message failed to broadcast, unrecoverable error code %d", response.Result.Code) + txResult = txFailed + } + } + + switch txResult { + case txOK: + // clear any errors from previous attempts + response.Err = nil + + // store for delivery later + inflight[broadcastTxSeq%s.inflightTxLimit] = response + + // if this is the current/last request, then clear + // the request and increment the checkTxSeq + if sendingCurrentRequest { + currentRequest = nil + checkTxSeq++ + } + + // go to next request + broadcastTxSeq++ + case txFailed: + // do not store the request as inflight (it's not in the mempool) + inflight[broadcastTxSeq%s.inflightTxLimit] = nil + + // clear current request if it failed + if sendingCurrentRequest { + currentRequest = nil + } + + // immediatley response to channel + responses <- *response + // go to next request + broadcastTxSeq++ + case txRetry: + break BROADCAST_LOOP + case txResetSequence: + broadcastTxSeq = account.GetSequence() + break BROADCAST_LOOP + } + } + } + }() + + return responses, nil +} + +// Address returns the address of the Signer +func (s *Signer) Address() sdk.AccAddress { + return GetAccAddress(s.privKey) +} + +// Sign signs a populated TxBuilder and returns a signed Tx and raw transaction bytes +func Sign( + txConfig sdkclient.TxConfig, + privKey cryptotypes.PrivKey, + txBuilder sdkclient.TxBuilder, + signerData authsigning.SignerData, +) (authsigning.Tx, []byte, error) { + signatureData := signing.SingleSignatureData{ + SignMode: signing.SignMode_SIGN_MODE_DIRECT, + Signature: nil, + } + sigV2 := signing.SignatureV2{ + PubKey: privKey.PubKey(), + Data: &signatureData, + Sequence: signerData.Sequence, + } + if err := txBuilder.SetSignatures(sigV2); err != nil { + return txBuilder.GetTx(), nil, err + } + + signBytes, err := txConfig.SignModeHandler().GetSignBytes(signing.SignMode_SIGN_MODE_DIRECT, signerData, txBuilder.GetTx()) + if err != nil { + return txBuilder.GetTx(), nil, err + } + signature, err := privKey.Sign(signBytes) + if err != nil { + return txBuilder.GetTx(), nil, err + } + + sigV2.Data = &signing.SingleSignatureData{ + SignMode: signing.SignMode_SIGN_MODE_DIRECT, + Signature: signature, + } + if err := txBuilder.SetSignatures(sigV2); err != nil { + return txBuilder.GetTx(), nil, err + } + + txBytes, err := txConfig.TxEncoder()(txBuilder.GetTx()) + if err != nil { + return txBuilder.GetTx(), nil, err + } + + return txBuilder.GetTx(), txBytes, nil +} + +func GetAccAddress(privKey cryptotypes.PrivKey) sdk.AccAddress { + return privKey.PubKey().Address().Bytes() +}