diff --git a/ethereum/Makefile b/ethereum/Makefile index 94c8a69..2ac75b9 100644 --- a/ethereum/Makefile +++ b/ethereum/Makefile @@ -26,8 +26,8 @@ lib/forge-std: wormhole_dependencies: wormhole/ethereum/build wormhole/ethereum/build: - git clone --depth 1 --branch feat/batch_vaas --single-branch https://github.com/certusone/wormhole.git - cd wormhole/ethereum && npm ci && npm run build && make .env + git clone --depth 1 --branch scratch/batch_vaa_integration --single-branch https://github.com/certusone/wormhole.git + cd wormhole/ethereum && npm ci && npm run build && npm run abigen && make .env dependencies: node_modules forge_dependencies wormhole_dependencies diff --git a/offchain-relayer/.relayer.yaml b/offchain-relayer/.relayer.yaml new file mode 100644 index 0000000..e99c7f2 --- /dev/null +++ b/offchain-relayer/.relayer.yaml @@ -0,0 +1,23 @@ +evmRPC: ws://localhost:8545 +evmContract: 0x2f3efA6bbDC5fAf4dC1a600765c7B7829e47bE10 +evmWormholeChainID: 2 +evmNetworkID: 1 + +evm2RPC: ws://localhost:8546 +evm2Contract: 0x2f3efA6bbDC5fAf4dC1a600765c7B7829e47bE10 +evm2WormholeChainID: 4 +evm2NetworkID: 56 + +nodeName: generic-relayer + +senderKeyHex: 4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d + +spyRPC: localhost:7072 + +guardianRPC: localhost:7070 + +unsafeDevMode: true + +logLevel: debug + +statusAddr: :6066 diff --git a/offchain-relayer/.vscode/launch.json b/offchain-relayer/.vscode/launch.json new file mode 100644 index 0000000..b7aefa6 --- /dev/null +++ b/offchain-relayer/.vscode/launch.json @@ -0,0 +1,74 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "relay", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceFolder}/main.go", + "buildFlags": "-gcflags='all=-N -l' --ldflags '-extldflags \"-Wl,--allow-multiple-definition\" -X \"github.com/certusone/wormhole/node/cmd/guardiand.Build=dev\"'", + "args": [ + "relay", + + "--evmRPC", + "ws://localhost:8545", + "--evmContract", + "0x2f3efA6bbDC5fAf4dC1a600765c7B7829e47bE10", + "--evmWormholeChainID", + "2", + "--evmNetworkID", + "1", + + + "--evm2RPC", + "ws://localhost:8546", + "--evm2Contract", + "0x2f3efA6bbDC5fAf4dC1a600765c7B7829e47bE10", + "--evm2WormholeChainID", + "4", + "--evm2NetworkID", + "56", + + + "--nodeName", + "generic-relayer", + + "--dataDir", + "/home/your-user/tmp", + + "--senderKeyHex", + "4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d", + + + "--spyRPC", + "localhost:7072", + + "--guardianRPC", + "localhost:7070", + + "--unsafeDevMode", + + "--logLevel", + "debug", + + "--statusAddr", + ":6066" + + + ], + "env": { + + }, + }, + { + "name": "Connect to relay with dlv", + "type": "go", + "request": "attach", + "mode": "remote", + "remotePath": "${workspaceFolder}", + "port": 2345, + "host": "127.0.0.1" + }, + ] +} diff --git a/offchain-relayer/README.md b/offchain-relayer/README.md new file mode 100644 index 0000000..82a763b --- /dev/null +++ b/offchain-relayer/README.md @@ -0,0 +1,57 @@ +## prereqs + +- tilt up and running with the Spy relayer enabled (`--spy_relayer=True`). +- the CoreRelayer deployed to tilt. +- Golang >= 1.17 +- `jq` installed and available in your path + +## relayer config + +Config like contract addresses and RPC endpoints gets read from the `.relayer.yaml` file. any of the args can also be passed at runtime to override the values from the yaml file. + +## start the relayer + +```bash +./start-relayer.sh +``` + +## creating Go clients from ABIs + +CoreRelayer + +```bash +jq '.abi' ./ethereum/build/CoreRelayer.sol/CoreRelayer.json | docker run -i --rm -v $(pwd):/root -u $(id -u):$(id -g) ethereum/client-go:alltools-stable abigen --abi - --pkg core_relayer --type CoreRelayer --out /root/offchain-relayer/relay/ethereum/core_relayer/abi.go +``` + +## get the deployed replayer contract address + +```bash +CHAINID=1337 && jq '.transactions[] | select(.contractName == "ERC1967Proxy") | .contractAddress' ethereum/broadcast/deploy_contracts.sol/$CHAINID/run-latest.json +``` + +## wormhole ChainID to network ID + +```solidity + + // Wormhole chain ids explicitly enumerated + if (chain == 2) { evmChainId = 1; // ethereum + } else if (chain == 4) { evmChainId = 56; // bsc + } else if (chain == 5) { evmChainId = 137; // polygon + } else if (chain == 6) { evmChainId = 43114; // avalanche + } else if (chain == 7) { evmChainId = 42262; // oasis + } else if (chain == 9) { evmChainId = 1313161554; // aurora + } else if (chain == 10) { evmChainId = 250; // fantom + } else if (chain == 11) { evmChainId = 686; // karura + } else if (chain == 12) { evmChainId = 787; // acala + } else if (chain == 13) { evmChainId = 8217; // klaytn + } else if (chain == 14) { evmChainId = 42220; // celo + } else if (chain == 16) { evmChainId = 1284; // moonbeam + } else if (chain == 17) { evmChainId = 245022934; // neon + } else if (chain == 23) { evmChainId = 42161; // arbitrum + } else if (chain == 24) { evmChainId = 10; // optimism + } else if (chain == 25) { evmChainId = 100; // gnosis + } else { + revert("Unknown chain id."); + } + +``` diff --git a/offchain-relayer/get-addresses.sh b/offchain-relayer/get-addresses.sh new file mode 100755 index 0000000..d74273a --- /dev/null +++ b/offchain-relayer/get-addresses.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +set -exuo pipefail + + +# function for updating or inserting a KEY: value pair in a file. +function upsert_env_file { + file=${1} # file will be created if it does not exist. + key=${2} # line must start with the key. + new_value=${3} + + # replace the value if it exists, else, append it to the file + if [[ -f $file ]] && grep -q "^$key:" $file; then + # file has the key, update it: + if [[ "$OSTYPE" == "darwin"* ]]; then + # on macOS's sed, the -i flag needs the '' argument to not create + # backup files + sed -i '' -e "/^$key:/s/:\ .*/:\ $new_value/" $file + else + sed -i -e "/^$key:/s/:\ .*/:\ $new_value/" $file + fi + else + # file does not have the key, add it: + echo "$key: $new_value" >> $file + fi +} + + +ETH_EVM_CHAINID="1337" +BSC_EVM_CHAINID="1397" + +ETHEREUM_ROOT="$(pwd)/../ethereum" + +ETH_FORGE_BROADCAST="$ETHEREUM_ROOT/broadcast/deploy_contracts.sol/$ETH_EVM_CHAINID/run-latest.json" +BSC_FORGE_BROADCAST="$ETHEREUM_ROOT/broadcast/deploy_contracts.sol/$BSC_EVM_CHAINID/run-latest.json" + + +ethAddr=$(jq --raw-output -c '.transactions[] | select(.contractName == "ERC1967Proxy") | .contractAddress' $ETH_FORGE_BROADCAST) +bscAddr=$(jq --raw-output -c '.transactions[] | select(.contractName == "ERC1967Proxy") | .contractAddress' $BSC_FORGE_BROADCAST) + +upsert_env_file "./.relayer.yaml" "evmContract" $ethAddr +upsert_env_file "./.relayer.yaml" "evm2Contract" $bscAddr diff --git a/offchain-relayer/go.mod b/offchain-relayer/go.mod new file mode 100644 index 0000000..2a60056 --- /dev/null +++ b/offchain-relayer/go.mod @@ -0,0 +1,98 @@ +module github.com/certusone/generic-relayer/offchain-relayer + +go 1.17 + +require ( + github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/btcsuite/btcd v0.22.1 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.2.0 // 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/certusone/wormhole/node v0.0.0-20220921172135-f14835f4b4d8 // indirect + github.com/certusone/wormhole/node/pkg/proto/gossip v0.0.0-00010101000000-000000000000 // indirect + github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/deckarep/golang-set v1.8.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect + github.com/ethereum/go-ethereum v1.10.25 // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/go-ole/go-ole v1.2.5 // indirect + github.com/go-stack/stack v1.8.0 // indirect + github.com/gogo/protobuf v1.3.3 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/gorilla/mux v1.8.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect + github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/ipfs/go-cid v0.3.2 // indirect + github.com/ipfs/go-log/v2 v2.5.1 // indirect + github.com/klauspost/cpuid/v2 v2.1.1 // indirect + github.com/libp2p/go-buffer-pool v0.1.0 // indirect + github.com/libp2p/go-libp2p v0.23.1 // indirect + github.com/libp2p/go-openssl v0.1.0 // indirect + github.com/magiconair/properties v1.8.6 // indirect + github.com/mattn/go-isatty v0.0.16 // indirect + github.com/mattn/go-pointer v0.0.1 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/miguelmota/go-ethereum-hdwallet v0.1.1 // indirect + github.com/minio/sha256-simd v1.0.0 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mr-tron/base58 v1.2.0 // indirect + github.com/multiformats/go-base32 v0.1.0 // indirect + github.com/multiformats/go-base36 v0.1.0 // indirect + github.com/multiformats/go-multiaddr v0.7.0 // indirect + github.com/multiformats/go-multibase v0.1.1 // indirect + github.com/multiformats/go-multicodec v0.6.0 // indirect + github.com/multiformats/go-multihash v0.2.1 // indirect + github.com/multiformats/go-varint v0.0.6 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.5 // indirect + github.com/prometheus/client_golang v1.13.0 // indirect + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.37.0 // indirect + github.com/prometheus/procfs v0.8.0 // indirect + github.com/rjeczalik/notify v0.9.1 // indirect + github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect + github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect + github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/spf13/afero v1.8.2 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/cobra v1.5.0 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.13.0 // indirect + github.com/subosito/gotenv v1.4.1 // indirect + github.com/tklauser/go-sysconf v0.3.5 // indirect + github.com/tklauser/numcpus v0.2.2 // indirect + github.com/tyler-smith/go-bip39 v1.0.2 // indirect + github.com/wormhole-foundation/wormhole/sdk v0.0.0-20220921172135-f14835f4b4d8 // indirect + go.uber.org/atomic v1.10.0 // indirect + go.uber.org/multierr v1.8.0 // indirect + go.uber.org/zap v1.23.0 // indirect + golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect + golang.org/x/net v0.0.0-20220920183852-bf014ff85ad5 // indirect + golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect + golang.org/x/text v0.3.7 // indirect + google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc // indirect + google.golang.org/grpc v1.49.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + lukechampine.com/blake3 v1.1.7 // indirect +) + +// Needed for cosmos-sdk based chains. See +// https://github.com/cosmos/cosmos-sdk/issues/10925 for more details. +replace github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 + +// replace the (nonexistant?) version of the sdk pinned in wormhole's go.mod with a recent version that resolves +replace github.com/wormhole-foundation/wormhole/sdk v0.0.0-00010101000000-000000000000 => github.com/wormhole-foundation/wormhole/sdk v0.0.0-20220921172135-f14835f4b4d8 + +replace github.com/certusone/wormhole/node/pkg/proto/gossip => ./relay/proto/gossip diff --git a/offchain-relayer/go.sum b/offchain-relayer/go.sum new file mode 100644 index 0000000..b648745 --- /dev/null +++ b/offchain-relayer/go.sum @@ -0,0 +1,1008 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= +github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= +github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= +github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= +github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= +github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= +github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= +github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= +github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= +github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= +github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btcd v0.21.0-beta h1:At9hIZdJW0s9E/fAz28nrz6AmcNlSVucCH796ZteX1M= +github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= +github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= +github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= +github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= +github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= +github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ= +github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= +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/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/certusone/wormhole/node v0.0.0-20220921172135-f14835f4b4d8 h1:oByd/cGaTrIeWDR+Dh+jw4MVXrpIK/tqjAKn3NRN5xk= +github.com/certusone/wormhole/node v0.0.0-20220921172135-f14835f4b4d8/go.mod h1:+aKUAX438hsY3pH8FaGd3YvM19jD2203J6nhcwuTEtw= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +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/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= +github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= +github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= +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/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= +github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ethereum/go-ethereum v1.10.4/go.mod h1:nEE0TP5MtxGzOMd7egIrbPJMQBnhVU3ELNxhBglIzhg= +github.com/ethereum/go-ethereum v1.10.21 h1:5lqsEx92ZaZzRyOqBEXux4/UR06m296RGzN3ol3teJY= +github.com/ethereum/go-ethereum v1.10.21/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= +github.com/ethereum/go-ethereum v1.10.25 h1:5dFrKJDnYf8L6/5o42abCE6a9yJm9cs4EJVRyYMr55s= +github.com/ethereum/go-ethereum v1.10.25/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +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= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= +github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= +github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 h1:lLT7ZLSzGLI08vc9cpd+tYmNWjdKDqyr/2L+f6U12Fk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huin/goupnp v1.0.1-0.20210310174557-0ca763054c88/go.mod h1:nNs7wvRfN1eKaMknBydLNQU6146XQim8t4h+q90biWo= +github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= +github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= +github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= +github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= +github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= +github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= +github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= +github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= +github.com/ipfs/go-cid v0.3.2 h1:OGgOd+JCFM+y1DjWPmVH+2/4POtpDzwcr7VgnB7mZXc= +github.com/ipfs/go-cid v0.3.2/go.mod h1:gQ8pKqT/sUxGY+tIwy1RPpAojYu7jAyCp5Tz1svoupw= +github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= +github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= +github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= +github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= +github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio= +github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.1.0 h1:eyi1Ad2aNJMW95zcSbmGg7Cg6cq3ADwLpMAP96d8rF0= +github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.1.1 h1:t0wUqjowdm8ezddV5k0tLWVklVuvLJpoHeb4WBdydm0= +github.com/klauspost/cpuid/v2 v2.1.1/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= +github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= +github.com/libp2p/go-libp2p v0.22.0 h1:2Tce0kHOp5zASFKJbNzRElvh0iZwdtG5uZheNW8chIw= +github.com/libp2p/go-libp2p v0.22.0/go.mod h1:UDolmweypBSjQb2f7xutPnwZ/fxioLbMBxSjRksxxU4= +github.com/libp2p/go-libp2p v0.23.1 h1:hJCmemCCwDaENZfMW12nUYTxoF0W5dIyg+T5jizh2Bs= +github.com/libp2p/go-libp2p v0.23.1/go.mod h1:7/xgogSbnOaGRlRbu4L0P1mVxC7xtLgk4suFhpag6cM= +github.com/libp2p/go-openssl v0.1.0 h1:LBkKEcUv6vtZIQLVTegAil8jbNpJErQ9AnT+bWV+Ooo= +github.com/libp2p/go-openssl v0.1.0/go.mod h1:OiOxwPpL3n4xlenjx2h7AwSGaFSC/KZvf6gNdOBQMtc= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0= +github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miguelmota/go-ethereum-hdwallet v0.1.1 h1:zdXGlHao7idpCBjEGTXThVAtMKs+IxAgivZ75xqkWK0= +github.com/miguelmota/go-ethereum-hdwallet v0.1.1/go.mod h1:f9m9uXokAHA6WNoYOPjj4AqjJS5pquQRiYYj/XSyPYc= +github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= +github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= +github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= +github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= +github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= +github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= +github.com/multiformats/go-multiaddr v0.7.0 h1:gskHcdaCyPtp9XskVwtvEeQOG465sCohbQIirSyqxrc= +github.com/multiformats/go-multiaddr v0.7.0/go.mod h1:Fs50eBDWvZu+l3/9S6xAE7ZYj6yhxlvaVZjakWN7xRs= +github.com/multiformats/go-multibase v0.1.1 h1:3ASCDsuLX8+j4kx58qnJ4YFq/JWTJpCyDW27ztsVTOI= +github.com/multiformats/go-multibase v0.1.1/go.mod h1:ZEjHE+IsUrgp5mhlEAYjMtZwK1k4haNkcaPg9aoe1a8= +github.com/multiformats/go-multicodec v0.6.0 h1:KhH2kSuCARyuJraYMFxrNO3DqIaYhOdS039kbhgVwpE= +github.com/multiformats/go-multicodec v0.6.0/go.mod h1:GUC8upxSBE4oG+q3kWZRw/+6yC1BqO550bjhWsJbZlw= +github.com/multiformats/go-multihash v0.2.1 h1:aem8ZT0VA2nCHHk7bPJ1BjUbHNciqZC/d16Vve9l108= +github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= +github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= +github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= +github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= +github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= +github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.13.0 h1:b71QUfeo5M8gq2+evJdTPfZhYMAU0uKPkyPJ7TPsloU= +github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= +github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= +github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= +github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= +github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= +github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= +github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= +github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +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/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/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= +github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.13.0 h1:BWSJ/M+f+3nmdz9bxB+bWX28kkALN2ok11D0rSo8EJU= +github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= +github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +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/goleveldb v1.0.1-0.20210305035536-64b5b1c73954/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= +github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= +github.com/tklauser/go-sysconf v0.3.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp3vU4= +github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= +github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA= +github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= +github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4= +github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= +github.com/tyler-smith/go-bip39 v1.0.2 h1:+t3w+KwLXO6154GNJY+qUtIxLTmFjfUmpguQT1OlOT8= +github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/wormhole-foundation/wormhole/sdk v0.0.0-20220921172135-f14835f4b4d8 h1:rC0aP0+bM0GlHjkWhYsx9EDHmtpe7FXnkaZYqsFUuB4= +github.com/wormhole-foundation/wormhole/sdk v0.0.0-20220921172135-f14835f4b4d8/go.mod h1:Vg7Cbb370S+JihB+of1rWm9Aaxzf0GPPvKszPeSb7AE= +github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= +go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= +go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d h1:4SFsTMi4UahlKoloni7L4eYzhFRifURQLw+yv0QDCx8= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220812174116-3211cb980234 h1:RDqmgfe7SvlMWoqC3xwQ2blLO3fcWcxMa3eBLRdRW7E= +golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20220920183852-bf014ff85ad5 h1:KafLifaRFIuSJ5C+7CyFJOF9haxKNC1CEIDk8GX6X0k= +golang.org/x/net v0.0.0-20220920183852-bf014ff85ad5/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +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-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/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-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4 h1:myAQVi0cGEoqQVR5POX+8RR2mrocKqNN1hmeMqhX27k= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-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-20210630005230-0f9fa26af87c/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-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +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-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= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= +gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200324203455-a04cca1dde73/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd h1:e0TwkXOdbnH/1x5rc5MZ/VYyiZ4v+RdVfrGMqEwT68I= +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc h1:Nf+EdcTLHR8qDNN/KfkQL0u0ssxt9OhbaWCl5C0ucEI= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0 h1:WTLtQzmQori5FUH25Pq4WT22oCsv8USpQ+F6rqtsmxw= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +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/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +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= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= +lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/offchain-relayer/main.go b/offchain-relayer/main.go new file mode 100644 index 0000000..ae87d03 --- /dev/null +++ b/offchain-relayer/main.go @@ -0,0 +1,62 @@ +package main + +import ( + "fmt" + "os" + + "github.com/spf13/cobra" + + "github.com/spf13/viper" + + "github.com/certusone/generic-relayer/offchain-relayer/relay" +) + +var cfgFile string + +// rootCmd represents the base command when called without any subcommands +var rootCmd = &cobra.Command{ + Use: "offchain-relayer", + Short: "Wormhole relayer for multichain dapp", +} + +// main adds all child commands to the root command and sets flags appropriately. +func main() { + if err := rootCmd.Execute(); err != nil { + fmt.Println(err) + os.Exit(1) + } +} + +func init() { + cobra.OnInitialize(initConfig) + + rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is {pwd}/.relayer.yaml)") + rootCmd.AddCommand(relay.RelayCmd) + +} + +// initConfig reads in config file and ENV variables if set. +func initConfig() { + if cfgFile != "" { + // Use config file from the flag. + viper.SetConfigFile(cfgFile) + } else { + // Find home directory. + wd, err := os.Getwd() + if err != nil { + fmt.Println(err) + os.Exit(1) + } + fmt.Println(wd) + // Search config in working directory with name ".relayer" (without extension). + viper.AddConfigPath(wd) + viper.SetConfigName(".relayer") + } + + viper.AutomaticEnv() // read in environment variables that match + + // If a config file is found, read it in. + if err := viper.ReadInConfig(); err == nil { + fmt.Println("Using config file:", viper.ConfigFileUsed()) + } +} diff --git a/offchain-relayer/relay/ethereum/core_relayer/.gitkeep b/offchain-relayer/relay/ethereum/core_relayer/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/offchain-relayer/relay/ethereum/core_relayer/abi.go b/offchain-relayer/relay/ethereum/core_relayer/abi.go new file mode 100644 index 0000000..679fe01 --- /dev/null +++ b/offchain-relayer/relay/ethereum/core_relayer/abi.go @@ -0,0 +1,2040 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package core_relayer + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription +) + +// CoreRelayerStructsDeliveryInstructions is an auto generated low-level Go binding around an user-defined struct. +type CoreRelayerStructsDeliveryInstructions struct { + PayloadID uint8 + FromAddress [32]byte + FromChain uint16 + TargetAddress [32]byte + TargetChain uint16 + Payload []byte + ChainPayload []byte + DeliveryList []CoreRelayerStructsVAAId + RelayParameters []byte +} + +// CoreRelayerStructsDeliveryParameters is an auto generated low-level Go binding around an user-defined struct. +type CoreRelayerStructsDeliveryParameters struct { + TargetChain uint16 + TargetAddress [32]byte + Payload []byte + DeliveryList []CoreRelayerStructsVAAId + RelayParameters []byte + ChainPayload []byte + Nonce uint32 + ConsistencyLevel uint8 +} + +// CoreRelayerStructsRelayParameters is an auto generated low-level Go binding around an user-defined struct. +type CoreRelayerStructsRelayParameters struct { + Version uint8 + DeliveryGasLimit uint32 + MaximumBatchSize uint8 + NativePayment *big.Int +} + +// CoreRelayerStructsTargetDeliveryParameters is an auto generated low-level Go binding around an user-defined struct. +type CoreRelayerStructsTargetDeliveryParameters struct { + EncodedVM []byte + DeliveryIndex uint8 + TargetCallGasOverride uint32 +} + +// CoreRelayerStructsVAAId is an auto generated low-level Go binding around an user-defined struct. +type CoreRelayerStructsVAAId struct { + EmitterAddress [32]byte + Sequence uint64 +} + +// CoreRelayerMetaData contains all meta data concerning the CoreRelayer contract. +var CoreRelayerMetaData = &bind.MetaData{ + ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldContract\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newContract\",\"type\":\"address\"}],\"name\":\"ContractUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"oldOverhead\",\"type\":\"uint32\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"newOverhead\",\"type\":\"uint32\"}],\"name\":\"EVMGasOverheadUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldOracle\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOracle\",\"type\":\"address\"}],\"name\":\"GasOracleUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransfered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"deliveryHash\",\"type\":\"bytes32\"}],\"name\":\"attemptedDeliveryCount\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"chainId\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"confirmOwnershipTransferRequest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"consistencyLevel\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encoded\",\"type\":\"bytes\"}],\"name\":\"decodeDeliveryInstructions\",\"outputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"payloadID\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"fromAddress\",\"type\":\"bytes32\"},{\"internalType\":\"uint16\",\"name\":\"fromChain\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"targetAddress\",\"type\":\"bytes32\"},{\"internalType\":\"uint16\",\"name\":\"targetChain\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"chainPayload\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"emitterAddress\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sequence\",\"type\":\"uint64\"}],\"internalType\":\"structCoreRelayerStructs.VAAId[]\",\"name\":\"deliveryList\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"relayParameters\",\"type\":\"bytes\"}],\"internalType\":\"structCoreRelayerStructs.DeliveryInstructions\",\"name\":\"instructions\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encoded\",\"type\":\"bytes\"}],\"name\":\"decodeRelayParameters\",\"outputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"deliveryGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"maximumBatchSize\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"nativePayment\",\"type\":\"uint256\"}],\"internalType\":\"structCoreRelayerStructs.RelayParameters\",\"name\":\"relayParams\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"encodedVM\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"deliveryIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"targetCallGasOverride\",\"type\":\"uint32\"}],\"internalType\":\"structCoreRelayerStructs.TargetDeliveryParameters\",\"name\":\"targetParams\",\"type\":\"tuple\"}],\"name\":\"deliver\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequence\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"chainId\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"}],\"name\":\"estimateCost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"gasEstimate\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedVm\",\"type\":\"bytes\"}],\"name\":\"finaliseRewardPayout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasOracle\",\"outputs\":[{\"internalType\":\"contractIGasOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasOracleAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEvmGasOverhead\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"deliveryHash\",\"type\":\"bytes32\"}],\"name\":\"isDeliveryCompleted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"impl\",\"type\":\"address\"}],\"name\":\"isInitialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"encodedVM\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"deliveryIndex\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"targetCallGasOverride\",\"type\":\"uint32\"}],\"internalType\":\"structCoreRelayerStructs.TargetDeliveryParameters\",\"name\":\"targetParams\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"encodedRedeliveryVm\",\"type\":\"bytes\"}],\"name\":\"reDeliver\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequence\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedVm\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"newRelayerParams\",\"type\":\"bytes\"}],\"name\":\"reSend\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequence\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"deliveryHash\",\"type\":\"bytes32\"}],\"name\":\"redeliveryAttemptCount\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"relayerChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"relayerAddress\",\"type\":\"bytes32\"}],\"name\":\"registerChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"chain\",\"type\":\"uint16\"}],\"name\":\"registeredRelayer\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"relayer\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"rewardChain\",\"type\":\"uint16\"}],\"name\":\"relayerRewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"rewardChain\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"nonce\",\"type\":\"uint32\"}],\"name\":\"rewardPayout\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequence\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint16\",\"name\":\"targetChain\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"targetAddress\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"emitterAddress\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sequence\",\"type\":\"uint64\"}],\"internalType\":\"structCoreRelayerStructs.VAAId[]\",\"name\":\"deliveryList\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"relayParameters\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"chainPayload\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"nonce\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"consistencyLevel\",\"type\":\"uint8\"}],\"internalType\":\"structCoreRelayerStructs.DeliveryParameters\",\"name\":\"deliveryParams\",\"type\":\"tuple\"}],\"name\":\"send\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequence\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"thisRelayerChainId\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"submitOwnershipTransferRequest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"thisRelayerChainId\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"newGasOverhead\",\"type\":\"uint32\"}],\"name\":\"updateEvmGasOverhead\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"thisRelayerChainId\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"newGasOracleAddress\",\"type\":\"address\"}],\"name\":\"updateGasOracleContract\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"thisRelayerChainId\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgrade\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"wormhole\",\"outputs\":[{\"internalType\":\"contractIWormhole\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", +} + +// CoreRelayerABI is the input ABI used to generate the binding from. +// Deprecated: Use CoreRelayerMetaData.ABI instead. +var CoreRelayerABI = CoreRelayerMetaData.ABI + +// CoreRelayer is an auto generated Go binding around an Ethereum contract. +type CoreRelayer struct { + CoreRelayerCaller // Read-only binding to the contract + CoreRelayerTransactor // Write-only binding to the contract + CoreRelayerFilterer // Log filterer for contract events +} + +// CoreRelayerCaller is an auto generated read-only Go binding around an Ethereum contract. +type CoreRelayerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// CoreRelayerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type CoreRelayerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// CoreRelayerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type CoreRelayerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// CoreRelayerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type CoreRelayerSession struct { + Contract *CoreRelayer // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// CoreRelayerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type CoreRelayerCallerSession struct { + Contract *CoreRelayerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// CoreRelayerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type CoreRelayerTransactorSession struct { + Contract *CoreRelayerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// CoreRelayerRaw is an auto generated low-level Go binding around an Ethereum contract. +type CoreRelayerRaw struct { + Contract *CoreRelayer // Generic contract binding to access the raw methods on +} + +// CoreRelayerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type CoreRelayerCallerRaw struct { + Contract *CoreRelayerCaller // Generic read-only contract binding to access the raw methods on +} + +// CoreRelayerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type CoreRelayerTransactorRaw struct { + Contract *CoreRelayerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewCoreRelayer creates a new instance of CoreRelayer, bound to a specific deployed contract. +func NewCoreRelayer(address common.Address, backend bind.ContractBackend) (*CoreRelayer, error) { + contract, err := bindCoreRelayer(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &CoreRelayer{CoreRelayerCaller: CoreRelayerCaller{contract: contract}, CoreRelayerTransactor: CoreRelayerTransactor{contract: contract}, CoreRelayerFilterer: CoreRelayerFilterer{contract: contract}}, nil +} + +// NewCoreRelayerCaller creates a new read-only instance of CoreRelayer, bound to a specific deployed contract. +func NewCoreRelayerCaller(address common.Address, caller bind.ContractCaller) (*CoreRelayerCaller, error) { + contract, err := bindCoreRelayer(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &CoreRelayerCaller{contract: contract}, nil +} + +// NewCoreRelayerTransactor creates a new write-only instance of CoreRelayer, bound to a specific deployed contract. +func NewCoreRelayerTransactor(address common.Address, transactor bind.ContractTransactor) (*CoreRelayerTransactor, error) { + contract, err := bindCoreRelayer(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &CoreRelayerTransactor{contract: contract}, nil +} + +// NewCoreRelayerFilterer creates a new log filterer instance of CoreRelayer, bound to a specific deployed contract. +func NewCoreRelayerFilterer(address common.Address, filterer bind.ContractFilterer) (*CoreRelayerFilterer, error) { + contract, err := bindCoreRelayer(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &CoreRelayerFilterer{contract: contract}, nil +} + +// bindCoreRelayer binds a generic wrapper to an already deployed contract. +func bindCoreRelayer(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := abi.JSON(strings.NewReader(CoreRelayerABI)) + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_CoreRelayer *CoreRelayerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _CoreRelayer.Contract.CoreRelayerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_CoreRelayer *CoreRelayerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CoreRelayer.Contract.CoreRelayerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_CoreRelayer *CoreRelayerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CoreRelayer.Contract.CoreRelayerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_CoreRelayer *CoreRelayerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _CoreRelayer.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_CoreRelayer *CoreRelayerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CoreRelayer.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_CoreRelayer *CoreRelayerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CoreRelayer.Contract.contract.Transact(opts, method, params...) +} + +// AttemptedDeliveryCount is a free data retrieval call binding the contract method 0x696262fc. +// +// Solidity: function attemptedDeliveryCount(bytes32 deliveryHash) view returns(uint16) +func (_CoreRelayer *CoreRelayerCaller) AttemptedDeliveryCount(opts *bind.CallOpts, deliveryHash [32]byte) (uint16, error) { + var out []interface{} + err := _CoreRelayer.contract.Call(opts, &out, "attemptedDeliveryCount", deliveryHash) + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +// AttemptedDeliveryCount is a free data retrieval call binding the contract method 0x696262fc. +// +// Solidity: function attemptedDeliveryCount(bytes32 deliveryHash) view returns(uint16) +func (_CoreRelayer *CoreRelayerSession) AttemptedDeliveryCount(deliveryHash [32]byte) (uint16, error) { + return _CoreRelayer.Contract.AttemptedDeliveryCount(&_CoreRelayer.CallOpts, deliveryHash) +} + +// AttemptedDeliveryCount is a free data retrieval call binding the contract method 0x696262fc. +// +// Solidity: function attemptedDeliveryCount(bytes32 deliveryHash) view returns(uint16) +func (_CoreRelayer *CoreRelayerCallerSession) AttemptedDeliveryCount(deliveryHash [32]byte) (uint16, error) { + return _CoreRelayer.Contract.AttemptedDeliveryCount(&_CoreRelayer.CallOpts, deliveryHash) +} + +// ChainId is a free data retrieval call binding the contract method 0x9a8a0592. +// +// Solidity: function chainId() view returns(uint16) +func (_CoreRelayer *CoreRelayerCaller) ChainId(opts *bind.CallOpts) (uint16, error) { + var out []interface{} + err := _CoreRelayer.contract.Call(opts, &out, "chainId") + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +// ChainId is a free data retrieval call binding the contract method 0x9a8a0592. +// +// Solidity: function chainId() view returns(uint16) +func (_CoreRelayer *CoreRelayerSession) ChainId() (uint16, error) { + return _CoreRelayer.Contract.ChainId(&_CoreRelayer.CallOpts) +} + +// ChainId is a free data retrieval call binding the contract method 0x9a8a0592. +// +// Solidity: function chainId() view returns(uint16) +func (_CoreRelayer *CoreRelayerCallerSession) ChainId() (uint16, error) { + return _CoreRelayer.Contract.ChainId(&_CoreRelayer.CallOpts) +} + +// ConsistencyLevel is a free data retrieval call binding the contract method 0xe8dfd508. +// +// Solidity: function consistencyLevel() view returns(uint8) +func (_CoreRelayer *CoreRelayerCaller) ConsistencyLevel(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _CoreRelayer.contract.Call(opts, &out, "consistencyLevel") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// ConsistencyLevel is a free data retrieval call binding the contract method 0xe8dfd508. +// +// Solidity: function consistencyLevel() view returns(uint8) +func (_CoreRelayer *CoreRelayerSession) ConsistencyLevel() (uint8, error) { + return _CoreRelayer.Contract.ConsistencyLevel(&_CoreRelayer.CallOpts) +} + +// ConsistencyLevel is a free data retrieval call binding the contract method 0xe8dfd508. +// +// Solidity: function consistencyLevel() view returns(uint8) +func (_CoreRelayer *CoreRelayerCallerSession) ConsistencyLevel() (uint8, error) { + return _CoreRelayer.Contract.ConsistencyLevel(&_CoreRelayer.CallOpts) +} + +// DecodeDeliveryInstructions is a free data retrieval call binding the contract method 0x4d92d3c9. +// +// Solidity: function decodeDeliveryInstructions(bytes encoded) pure returns((uint8,bytes32,uint16,bytes32,uint16,bytes,bytes,(bytes32,uint64)[],bytes) instructions) +func (_CoreRelayer *CoreRelayerCaller) DecodeDeliveryInstructions(opts *bind.CallOpts, encoded []byte) (CoreRelayerStructsDeliveryInstructions, error) { + var out []interface{} + err := _CoreRelayer.contract.Call(opts, &out, "decodeDeliveryInstructions", encoded) + + if err != nil { + return *new(CoreRelayerStructsDeliveryInstructions), err + } + + out0 := *abi.ConvertType(out[0], new(CoreRelayerStructsDeliveryInstructions)).(*CoreRelayerStructsDeliveryInstructions) + + return out0, err + +} + +// DecodeDeliveryInstructions is a free data retrieval call binding the contract method 0x4d92d3c9. +// +// Solidity: function decodeDeliveryInstructions(bytes encoded) pure returns((uint8,bytes32,uint16,bytes32,uint16,bytes,bytes,(bytes32,uint64)[],bytes) instructions) +func (_CoreRelayer *CoreRelayerSession) DecodeDeliveryInstructions(encoded []byte) (CoreRelayerStructsDeliveryInstructions, error) { + return _CoreRelayer.Contract.DecodeDeliveryInstructions(&_CoreRelayer.CallOpts, encoded) +} + +// DecodeDeliveryInstructions is a free data retrieval call binding the contract method 0x4d92d3c9. +// +// Solidity: function decodeDeliveryInstructions(bytes encoded) pure returns((uint8,bytes32,uint16,bytes32,uint16,bytes,bytes,(bytes32,uint64)[],bytes) instructions) +func (_CoreRelayer *CoreRelayerCallerSession) DecodeDeliveryInstructions(encoded []byte) (CoreRelayerStructsDeliveryInstructions, error) { + return _CoreRelayer.Contract.DecodeDeliveryInstructions(&_CoreRelayer.CallOpts, encoded) +} + +// DecodeRelayParameters is a free data retrieval call binding the contract method 0x18f6df06. +// +// Solidity: function decodeRelayParameters(bytes encoded) pure returns((uint8,uint32,uint8,uint256) relayParams) +func (_CoreRelayer *CoreRelayerCaller) DecodeRelayParameters(opts *bind.CallOpts, encoded []byte) (CoreRelayerStructsRelayParameters, error) { + var out []interface{} + err := _CoreRelayer.contract.Call(opts, &out, "decodeRelayParameters", encoded) + + if err != nil { + return *new(CoreRelayerStructsRelayParameters), err + } + + out0 := *abi.ConvertType(out[0], new(CoreRelayerStructsRelayParameters)).(*CoreRelayerStructsRelayParameters) + + return out0, err + +} + +// DecodeRelayParameters is a free data retrieval call binding the contract method 0x18f6df06. +// +// Solidity: function decodeRelayParameters(bytes encoded) pure returns((uint8,uint32,uint8,uint256) relayParams) +func (_CoreRelayer *CoreRelayerSession) DecodeRelayParameters(encoded []byte) (CoreRelayerStructsRelayParameters, error) { + return _CoreRelayer.Contract.DecodeRelayParameters(&_CoreRelayer.CallOpts, encoded) +} + +// DecodeRelayParameters is a free data retrieval call binding the contract method 0x18f6df06. +// +// Solidity: function decodeRelayParameters(bytes encoded) pure returns((uint8,uint32,uint8,uint256) relayParams) +func (_CoreRelayer *CoreRelayerCallerSession) DecodeRelayParameters(encoded []byte) (CoreRelayerStructsRelayParameters, error) { + return _CoreRelayer.Contract.DecodeRelayParameters(&_CoreRelayer.CallOpts, encoded) +} + +// EstimateCost is a free data retrieval call binding the contract method 0xc1f74e50. +// +// Solidity: function estimateCost(uint16 chainId, uint32 gasLimit) view returns(uint256 gasEstimate) +func (_CoreRelayer *CoreRelayerCaller) EstimateCost(opts *bind.CallOpts, chainId uint16, gasLimit uint32) (*big.Int, error) { + var out []interface{} + err := _CoreRelayer.contract.Call(opts, &out, "estimateCost", chainId, gasLimit) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// EstimateCost is a free data retrieval call binding the contract method 0xc1f74e50. +// +// Solidity: function estimateCost(uint16 chainId, uint32 gasLimit) view returns(uint256 gasEstimate) +func (_CoreRelayer *CoreRelayerSession) EstimateCost(chainId uint16, gasLimit uint32) (*big.Int, error) { + return _CoreRelayer.Contract.EstimateCost(&_CoreRelayer.CallOpts, chainId, gasLimit) +} + +// EstimateCost is a free data retrieval call binding the contract method 0xc1f74e50. +// +// Solidity: function estimateCost(uint16 chainId, uint32 gasLimit) view returns(uint256 gasEstimate) +func (_CoreRelayer *CoreRelayerCallerSession) EstimateCost(chainId uint16, gasLimit uint32) (*big.Int, error) { + return _CoreRelayer.Contract.EstimateCost(&_CoreRelayer.CallOpts, chainId, gasLimit) +} + +// GasOracle is a free data retrieval call binding the contract method 0x5d62a8dd. +// +// Solidity: function gasOracle() view returns(address) +func (_CoreRelayer *CoreRelayerCaller) GasOracle(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CoreRelayer.contract.Call(opts, &out, "gasOracle") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GasOracle is a free data retrieval call binding the contract method 0x5d62a8dd. +// +// Solidity: function gasOracle() view returns(address) +func (_CoreRelayer *CoreRelayerSession) GasOracle() (common.Address, error) { + return _CoreRelayer.Contract.GasOracle(&_CoreRelayer.CallOpts) +} + +// GasOracle is a free data retrieval call binding the contract method 0x5d62a8dd. +// +// Solidity: function gasOracle() view returns(address) +func (_CoreRelayer *CoreRelayerCallerSession) GasOracle() (common.Address, error) { + return _CoreRelayer.Contract.GasOracle(&_CoreRelayer.CallOpts) +} + +// GasOracleAddress is a free data retrieval call binding the contract method 0x786a8f58. +// +// Solidity: function gasOracleAddress() view returns(address) +func (_CoreRelayer *CoreRelayerCaller) GasOracleAddress(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CoreRelayer.contract.Call(opts, &out, "gasOracleAddress") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GasOracleAddress is a free data retrieval call binding the contract method 0x786a8f58. +// +// Solidity: function gasOracleAddress() view returns(address) +func (_CoreRelayer *CoreRelayerSession) GasOracleAddress() (common.Address, error) { + return _CoreRelayer.Contract.GasOracleAddress(&_CoreRelayer.CallOpts) +} + +// GasOracleAddress is a free data retrieval call binding the contract method 0x786a8f58. +// +// Solidity: function gasOracleAddress() view returns(address) +func (_CoreRelayer *CoreRelayerCallerSession) GasOracleAddress() (common.Address, error) { + return _CoreRelayer.Contract.GasOracleAddress(&_CoreRelayer.CallOpts) +} + +// GetEvmGasOverhead is a free data retrieval call binding the contract method 0x11bca1f4. +// +// Solidity: function getEvmGasOverhead() view returns(uint32) +func (_CoreRelayer *CoreRelayerCaller) GetEvmGasOverhead(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _CoreRelayer.contract.Call(opts, &out, "getEvmGasOverhead") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// GetEvmGasOverhead is a free data retrieval call binding the contract method 0x11bca1f4. +// +// Solidity: function getEvmGasOverhead() view returns(uint32) +func (_CoreRelayer *CoreRelayerSession) GetEvmGasOverhead() (uint32, error) { + return _CoreRelayer.Contract.GetEvmGasOverhead(&_CoreRelayer.CallOpts) +} + +// GetEvmGasOverhead is a free data retrieval call binding the contract method 0x11bca1f4. +// +// Solidity: function getEvmGasOverhead() view returns(uint32) +func (_CoreRelayer *CoreRelayerCallerSession) GetEvmGasOverhead() (uint32, error) { + return _CoreRelayer.Contract.GetEvmGasOverhead(&_CoreRelayer.CallOpts) +} + +// IsDeliveryCompleted is a free data retrieval call binding the contract method 0x1dd5f138. +// +// Solidity: function isDeliveryCompleted(bytes32 deliveryHash) view returns(bool) +func (_CoreRelayer *CoreRelayerCaller) IsDeliveryCompleted(opts *bind.CallOpts, deliveryHash [32]byte) (bool, error) { + var out []interface{} + err := _CoreRelayer.contract.Call(opts, &out, "isDeliveryCompleted", deliveryHash) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsDeliveryCompleted is a free data retrieval call binding the contract method 0x1dd5f138. +// +// Solidity: function isDeliveryCompleted(bytes32 deliveryHash) view returns(bool) +func (_CoreRelayer *CoreRelayerSession) IsDeliveryCompleted(deliveryHash [32]byte) (bool, error) { + return _CoreRelayer.Contract.IsDeliveryCompleted(&_CoreRelayer.CallOpts, deliveryHash) +} + +// IsDeliveryCompleted is a free data retrieval call binding the contract method 0x1dd5f138. +// +// Solidity: function isDeliveryCompleted(bytes32 deliveryHash) view returns(bool) +func (_CoreRelayer *CoreRelayerCallerSession) IsDeliveryCompleted(deliveryHash [32]byte) (bool, error) { + return _CoreRelayer.Contract.IsDeliveryCompleted(&_CoreRelayer.CallOpts, deliveryHash) +} + +// IsInitialized is a free data retrieval call binding the contract method 0xd60b347f. +// +// Solidity: function isInitialized(address impl) view returns(bool) +func (_CoreRelayer *CoreRelayerCaller) IsInitialized(opts *bind.CallOpts, impl common.Address) (bool, error) { + var out []interface{} + err := _CoreRelayer.contract.Call(opts, &out, "isInitialized", impl) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsInitialized is a free data retrieval call binding the contract method 0xd60b347f. +// +// Solidity: function isInitialized(address impl) view returns(bool) +func (_CoreRelayer *CoreRelayerSession) IsInitialized(impl common.Address) (bool, error) { + return _CoreRelayer.Contract.IsInitialized(&_CoreRelayer.CallOpts, impl) +} + +// IsInitialized is a free data retrieval call binding the contract method 0xd60b347f. +// +// Solidity: function isInitialized(address impl) view returns(bool) +func (_CoreRelayer *CoreRelayerCallerSession) IsInitialized(impl common.Address) (bool, error) { + return _CoreRelayer.Contract.IsInitialized(&_CoreRelayer.CallOpts, impl) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_CoreRelayer *CoreRelayerCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CoreRelayer.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_CoreRelayer *CoreRelayerSession) Owner() (common.Address, error) { + return _CoreRelayer.Contract.Owner(&_CoreRelayer.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_CoreRelayer *CoreRelayerCallerSession) Owner() (common.Address, error) { + return _CoreRelayer.Contract.Owner(&_CoreRelayer.CallOpts) +} + +// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. +// +// Solidity: function pendingOwner() view returns(address) +func (_CoreRelayer *CoreRelayerCaller) PendingOwner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CoreRelayer.contract.Call(opts, &out, "pendingOwner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. +// +// Solidity: function pendingOwner() view returns(address) +func (_CoreRelayer *CoreRelayerSession) PendingOwner() (common.Address, error) { + return _CoreRelayer.Contract.PendingOwner(&_CoreRelayer.CallOpts) +} + +// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. +// +// Solidity: function pendingOwner() view returns(address) +func (_CoreRelayer *CoreRelayerCallerSession) PendingOwner() (common.Address, error) { + return _CoreRelayer.Contract.PendingOwner(&_CoreRelayer.CallOpts) +} + +// RedeliveryAttemptCount is a free data retrieval call binding the contract method 0x59fbacbf. +// +// Solidity: function redeliveryAttemptCount(bytes32 deliveryHash) view returns(uint16) +func (_CoreRelayer *CoreRelayerCaller) RedeliveryAttemptCount(opts *bind.CallOpts, deliveryHash [32]byte) (uint16, error) { + var out []interface{} + err := _CoreRelayer.contract.Call(opts, &out, "redeliveryAttemptCount", deliveryHash) + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +// RedeliveryAttemptCount is a free data retrieval call binding the contract method 0x59fbacbf. +// +// Solidity: function redeliveryAttemptCount(bytes32 deliveryHash) view returns(uint16) +func (_CoreRelayer *CoreRelayerSession) RedeliveryAttemptCount(deliveryHash [32]byte) (uint16, error) { + return _CoreRelayer.Contract.RedeliveryAttemptCount(&_CoreRelayer.CallOpts, deliveryHash) +} + +// RedeliveryAttemptCount is a free data retrieval call binding the contract method 0x59fbacbf. +// +// Solidity: function redeliveryAttemptCount(bytes32 deliveryHash) view returns(uint16) +func (_CoreRelayer *CoreRelayerCallerSession) RedeliveryAttemptCount(deliveryHash [32]byte) (uint16, error) { + return _CoreRelayer.Contract.RedeliveryAttemptCount(&_CoreRelayer.CallOpts, deliveryHash) +} + +// RegisteredRelayer is a free data retrieval call binding the contract method 0x9d9dfdf7. +// +// Solidity: function registeredRelayer(uint16 chain) view returns(bytes32) +func (_CoreRelayer *CoreRelayerCaller) RegisteredRelayer(opts *bind.CallOpts, chain uint16) ([32]byte, error) { + var out []interface{} + err := _CoreRelayer.contract.Call(opts, &out, "registeredRelayer", chain) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// RegisteredRelayer is a free data retrieval call binding the contract method 0x9d9dfdf7. +// +// Solidity: function registeredRelayer(uint16 chain) view returns(bytes32) +func (_CoreRelayer *CoreRelayerSession) RegisteredRelayer(chain uint16) ([32]byte, error) { + return _CoreRelayer.Contract.RegisteredRelayer(&_CoreRelayer.CallOpts, chain) +} + +// RegisteredRelayer is a free data retrieval call binding the contract method 0x9d9dfdf7. +// +// Solidity: function registeredRelayer(uint16 chain) view returns(bytes32) +func (_CoreRelayer *CoreRelayerCallerSession) RegisteredRelayer(chain uint16) ([32]byte, error) { + return _CoreRelayer.Contract.RegisteredRelayer(&_CoreRelayer.CallOpts, chain) +} + +// RelayerRewards is a free data retrieval call binding the contract method 0xde142814. +// +// Solidity: function relayerRewards(address relayer, uint16 rewardChain) view returns(uint256) +func (_CoreRelayer *CoreRelayerCaller) RelayerRewards(opts *bind.CallOpts, relayer common.Address, rewardChain uint16) (*big.Int, error) { + var out []interface{} + err := _CoreRelayer.contract.Call(opts, &out, "relayerRewards", relayer, rewardChain) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// RelayerRewards is a free data retrieval call binding the contract method 0xde142814. +// +// Solidity: function relayerRewards(address relayer, uint16 rewardChain) view returns(uint256) +func (_CoreRelayer *CoreRelayerSession) RelayerRewards(relayer common.Address, rewardChain uint16) (*big.Int, error) { + return _CoreRelayer.Contract.RelayerRewards(&_CoreRelayer.CallOpts, relayer, rewardChain) +} + +// RelayerRewards is a free data retrieval call binding the contract method 0xde142814. +// +// Solidity: function relayerRewards(address relayer, uint16 rewardChain) view returns(uint256) +func (_CoreRelayer *CoreRelayerCallerSession) RelayerRewards(relayer common.Address, rewardChain uint16) (*big.Int, error) { + return _CoreRelayer.Contract.RelayerRewards(&_CoreRelayer.CallOpts, relayer, rewardChain) +} + +// Wormhole is a free data retrieval call binding the contract method 0x84acd1bb. +// +// Solidity: function wormhole() view returns(address) +func (_CoreRelayer *CoreRelayerCaller) Wormhole(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CoreRelayer.contract.Call(opts, &out, "wormhole") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Wormhole is a free data retrieval call binding the contract method 0x84acd1bb. +// +// Solidity: function wormhole() view returns(address) +func (_CoreRelayer *CoreRelayerSession) Wormhole() (common.Address, error) { + return _CoreRelayer.Contract.Wormhole(&_CoreRelayer.CallOpts) +} + +// Wormhole is a free data retrieval call binding the contract method 0x84acd1bb. +// +// Solidity: function wormhole() view returns(address) +func (_CoreRelayer *CoreRelayerCallerSession) Wormhole() (common.Address, error) { + return _CoreRelayer.Contract.Wormhole(&_CoreRelayer.CallOpts) +} + +// ConfirmOwnershipTransferRequest is a paid mutator transaction binding the contract method 0x038c0b66. +// +// Solidity: function confirmOwnershipTransferRequest() returns() +func (_CoreRelayer *CoreRelayerTransactor) ConfirmOwnershipTransferRequest(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CoreRelayer.contract.Transact(opts, "confirmOwnershipTransferRequest") +} + +// ConfirmOwnershipTransferRequest is a paid mutator transaction binding the contract method 0x038c0b66. +// +// Solidity: function confirmOwnershipTransferRequest() returns() +func (_CoreRelayer *CoreRelayerSession) ConfirmOwnershipTransferRequest() (*types.Transaction, error) { + return _CoreRelayer.Contract.ConfirmOwnershipTransferRequest(&_CoreRelayer.TransactOpts) +} + +// ConfirmOwnershipTransferRequest is a paid mutator transaction binding the contract method 0x038c0b66. +// +// Solidity: function confirmOwnershipTransferRequest() returns() +func (_CoreRelayer *CoreRelayerTransactorSession) ConfirmOwnershipTransferRequest() (*types.Transaction, error) { + return _CoreRelayer.Contract.ConfirmOwnershipTransferRequest(&_CoreRelayer.TransactOpts) +} + +// Deliver is a paid mutator transaction binding the contract method 0x428f7d13. +// +// Solidity: function deliver((bytes,uint8,uint32) targetParams) payable returns(uint64 sequence) +func (_CoreRelayer *CoreRelayerTransactor) Deliver(opts *bind.TransactOpts, targetParams CoreRelayerStructsTargetDeliveryParameters) (*types.Transaction, error) { + return _CoreRelayer.contract.Transact(opts, "deliver", targetParams) +} + +// Deliver is a paid mutator transaction binding the contract method 0x428f7d13. +// +// Solidity: function deliver((bytes,uint8,uint32) targetParams) payable returns(uint64 sequence) +func (_CoreRelayer *CoreRelayerSession) Deliver(targetParams CoreRelayerStructsTargetDeliveryParameters) (*types.Transaction, error) { + return _CoreRelayer.Contract.Deliver(&_CoreRelayer.TransactOpts, targetParams) +} + +// Deliver is a paid mutator transaction binding the contract method 0x428f7d13. +// +// Solidity: function deliver((bytes,uint8,uint32) targetParams) payable returns(uint64 sequence) +func (_CoreRelayer *CoreRelayerTransactorSession) Deliver(targetParams CoreRelayerStructsTargetDeliveryParameters) (*types.Transaction, error) { + return _CoreRelayer.Contract.Deliver(&_CoreRelayer.TransactOpts, targetParams) +} + +// FinaliseRewardPayout is a paid mutator transaction binding the contract method 0x205668cd. +// +// Solidity: function finaliseRewardPayout(bytes encodedVm) returns() +func (_CoreRelayer *CoreRelayerTransactor) FinaliseRewardPayout(opts *bind.TransactOpts, encodedVm []byte) (*types.Transaction, error) { + return _CoreRelayer.contract.Transact(opts, "finaliseRewardPayout", encodedVm) +} + +// FinaliseRewardPayout is a paid mutator transaction binding the contract method 0x205668cd. +// +// Solidity: function finaliseRewardPayout(bytes encodedVm) returns() +func (_CoreRelayer *CoreRelayerSession) FinaliseRewardPayout(encodedVm []byte) (*types.Transaction, error) { + return _CoreRelayer.Contract.FinaliseRewardPayout(&_CoreRelayer.TransactOpts, encodedVm) +} + +// FinaliseRewardPayout is a paid mutator transaction binding the contract method 0x205668cd. +// +// Solidity: function finaliseRewardPayout(bytes encodedVm) returns() +func (_CoreRelayer *CoreRelayerTransactorSession) FinaliseRewardPayout(encodedVm []byte) (*types.Transaction, error) { + return _CoreRelayer.Contract.FinaliseRewardPayout(&_CoreRelayer.TransactOpts, encodedVm) +} + +// ReDeliver is a paid mutator transaction binding the contract method 0x24217508. +// +// Solidity: function reDeliver((bytes,uint8,uint32) targetParams, bytes encodedRedeliveryVm) payable returns(uint64 sequence) +func (_CoreRelayer *CoreRelayerTransactor) ReDeliver(opts *bind.TransactOpts, targetParams CoreRelayerStructsTargetDeliveryParameters, encodedRedeliveryVm []byte) (*types.Transaction, error) { + return _CoreRelayer.contract.Transact(opts, "reDeliver", targetParams, encodedRedeliveryVm) +} + +// ReDeliver is a paid mutator transaction binding the contract method 0x24217508. +// +// Solidity: function reDeliver((bytes,uint8,uint32) targetParams, bytes encodedRedeliveryVm) payable returns(uint64 sequence) +func (_CoreRelayer *CoreRelayerSession) ReDeliver(targetParams CoreRelayerStructsTargetDeliveryParameters, encodedRedeliveryVm []byte) (*types.Transaction, error) { + return _CoreRelayer.Contract.ReDeliver(&_CoreRelayer.TransactOpts, targetParams, encodedRedeliveryVm) +} + +// ReDeliver is a paid mutator transaction binding the contract method 0x24217508. +// +// Solidity: function reDeliver((bytes,uint8,uint32) targetParams, bytes encodedRedeliveryVm) payable returns(uint64 sequence) +func (_CoreRelayer *CoreRelayerTransactorSession) ReDeliver(targetParams CoreRelayerStructsTargetDeliveryParameters, encodedRedeliveryVm []byte) (*types.Transaction, error) { + return _CoreRelayer.Contract.ReDeliver(&_CoreRelayer.TransactOpts, targetParams, encodedRedeliveryVm) +} + +// ReSend is a paid mutator transaction binding the contract method 0xd21f4f50. +// +// Solidity: function reSend(bytes encodedVm, bytes newRelayerParams) payable returns(uint64 sequence) +func (_CoreRelayer *CoreRelayerTransactor) ReSend(opts *bind.TransactOpts, encodedVm []byte, newRelayerParams []byte) (*types.Transaction, error) { + return _CoreRelayer.contract.Transact(opts, "reSend", encodedVm, newRelayerParams) +} + +// ReSend is a paid mutator transaction binding the contract method 0xd21f4f50. +// +// Solidity: function reSend(bytes encodedVm, bytes newRelayerParams) payable returns(uint64 sequence) +func (_CoreRelayer *CoreRelayerSession) ReSend(encodedVm []byte, newRelayerParams []byte) (*types.Transaction, error) { + return _CoreRelayer.Contract.ReSend(&_CoreRelayer.TransactOpts, encodedVm, newRelayerParams) +} + +// ReSend is a paid mutator transaction binding the contract method 0xd21f4f50. +// +// Solidity: function reSend(bytes encodedVm, bytes newRelayerParams) payable returns(uint64 sequence) +func (_CoreRelayer *CoreRelayerTransactorSession) ReSend(encodedVm []byte, newRelayerParams []byte) (*types.Transaction, error) { + return _CoreRelayer.Contract.ReSend(&_CoreRelayer.TransactOpts, encodedVm, newRelayerParams) +} + +// RegisterChain is a paid mutator transaction binding the contract method 0x65bb3ea7. +// +// Solidity: function registerChain(uint16 relayerChainId, bytes32 relayerAddress) returns() +func (_CoreRelayer *CoreRelayerTransactor) RegisterChain(opts *bind.TransactOpts, relayerChainId uint16, relayerAddress [32]byte) (*types.Transaction, error) { + return _CoreRelayer.contract.Transact(opts, "registerChain", relayerChainId, relayerAddress) +} + +// RegisterChain is a paid mutator transaction binding the contract method 0x65bb3ea7. +// +// Solidity: function registerChain(uint16 relayerChainId, bytes32 relayerAddress) returns() +func (_CoreRelayer *CoreRelayerSession) RegisterChain(relayerChainId uint16, relayerAddress [32]byte) (*types.Transaction, error) { + return _CoreRelayer.Contract.RegisterChain(&_CoreRelayer.TransactOpts, relayerChainId, relayerAddress) +} + +// RegisterChain is a paid mutator transaction binding the contract method 0x65bb3ea7. +// +// Solidity: function registerChain(uint16 relayerChainId, bytes32 relayerAddress) returns() +func (_CoreRelayer *CoreRelayerTransactorSession) RegisterChain(relayerChainId uint16, relayerAddress [32]byte) (*types.Transaction, error) { + return _CoreRelayer.Contract.RegisterChain(&_CoreRelayer.TransactOpts, relayerChainId, relayerAddress) +} + +// RewardPayout is a paid mutator transaction binding the contract method 0x710cdd3c. +// +// Solidity: function rewardPayout(uint16 rewardChain, bytes32 receiver, uint32 nonce) payable returns(uint64 sequence) +func (_CoreRelayer *CoreRelayerTransactor) RewardPayout(opts *bind.TransactOpts, rewardChain uint16, receiver [32]byte, nonce uint32) (*types.Transaction, error) { + return _CoreRelayer.contract.Transact(opts, "rewardPayout", rewardChain, receiver, nonce) +} + +// RewardPayout is a paid mutator transaction binding the contract method 0x710cdd3c. +// +// Solidity: function rewardPayout(uint16 rewardChain, bytes32 receiver, uint32 nonce) payable returns(uint64 sequence) +func (_CoreRelayer *CoreRelayerSession) RewardPayout(rewardChain uint16, receiver [32]byte, nonce uint32) (*types.Transaction, error) { + return _CoreRelayer.Contract.RewardPayout(&_CoreRelayer.TransactOpts, rewardChain, receiver, nonce) +} + +// RewardPayout is a paid mutator transaction binding the contract method 0x710cdd3c. +// +// Solidity: function rewardPayout(uint16 rewardChain, bytes32 receiver, uint32 nonce) payable returns(uint64 sequence) +func (_CoreRelayer *CoreRelayerTransactorSession) RewardPayout(rewardChain uint16, receiver [32]byte, nonce uint32) (*types.Transaction, error) { + return _CoreRelayer.Contract.RewardPayout(&_CoreRelayer.TransactOpts, rewardChain, receiver, nonce) +} + +// Send is a paid mutator transaction binding the contract method 0x1e2a68a5. +// +// Solidity: function send((uint16,bytes32,bytes,(bytes32,uint64)[],bytes,bytes,uint32,uint8) deliveryParams) payable returns(uint64 sequence) +func (_CoreRelayer *CoreRelayerTransactor) Send(opts *bind.TransactOpts, deliveryParams CoreRelayerStructsDeliveryParameters) (*types.Transaction, error) { + return _CoreRelayer.contract.Transact(opts, "send", deliveryParams) +} + +// Send is a paid mutator transaction binding the contract method 0x1e2a68a5. +// +// Solidity: function send((uint16,bytes32,bytes,(bytes32,uint64)[],bytes,bytes,uint32,uint8) deliveryParams) payable returns(uint64 sequence) +func (_CoreRelayer *CoreRelayerSession) Send(deliveryParams CoreRelayerStructsDeliveryParameters) (*types.Transaction, error) { + return _CoreRelayer.Contract.Send(&_CoreRelayer.TransactOpts, deliveryParams) +} + +// Send is a paid mutator transaction binding the contract method 0x1e2a68a5. +// +// Solidity: function send((uint16,bytes32,bytes,(bytes32,uint64)[],bytes,bytes,uint32,uint8) deliveryParams) payable returns(uint64 sequence) +func (_CoreRelayer *CoreRelayerTransactorSession) Send(deliveryParams CoreRelayerStructsDeliveryParameters) (*types.Transaction, error) { + return _CoreRelayer.Contract.Send(&_CoreRelayer.TransactOpts, deliveryParams) +} + +// SubmitOwnershipTransferRequest is a paid mutator transaction binding the contract method 0x94cc743d. +// +// Solidity: function submitOwnershipTransferRequest(uint16 thisRelayerChainId, address newOwner) returns() +func (_CoreRelayer *CoreRelayerTransactor) SubmitOwnershipTransferRequest(opts *bind.TransactOpts, thisRelayerChainId uint16, newOwner common.Address) (*types.Transaction, error) { + return _CoreRelayer.contract.Transact(opts, "submitOwnershipTransferRequest", thisRelayerChainId, newOwner) +} + +// SubmitOwnershipTransferRequest is a paid mutator transaction binding the contract method 0x94cc743d. +// +// Solidity: function submitOwnershipTransferRequest(uint16 thisRelayerChainId, address newOwner) returns() +func (_CoreRelayer *CoreRelayerSession) SubmitOwnershipTransferRequest(thisRelayerChainId uint16, newOwner common.Address) (*types.Transaction, error) { + return _CoreRelayer.Contract.SubmitOwnershipTransferRequest(&_CoreRelayer.TransactOpts, thisRelayerChainId, newOwner) +} + +// SubmitOwnershipTransferRequest is a paid mutator transaction binding the contract method 0x94cc743d. +// +// Solidity: function submitOwnershipTransferRequest(uint16 thisRelayerChainId, address newOwner) returns() +func (_CoreRelayer *CoreRelayerTransactorSession) SubmitOwnershipTransferRequest(thisRelayerChainId uint16, newOwner common.Address) (*types.Transaction, error) { + return _CoreRelayer.Contract.SubmitOwnershipTransferRequest(&_CoreRelayer.TransactOpts, thisRelayerChainId, newOwner) +} + +// UpdateEvmGasOverhead is a paid mutator transaction binding the contract method 0x00de5ec4. +// +// Solidity: function updateEvmGasOverhead(uint16 thisRelayerChainId, uint32 newGasOverhead) returns() +func (_CoreRelayer *CoreRelayerTransactor) UpdateEvmGasOverhead(opts *bind.TransactOpts, thisRelayerChainId uint16, newGasOverhead uint32) (*types.Transaction, error) { + return _CoreRelayer.contract.Transact(opts, "updateEvmGasOverhead", thisRelayerChainId, newGasOverhead) +} + +// UpdateEvmGasOverhead is a paid mutator transaction binding the contract method 0x00de5ec4. +// +// Solidity: function updateEvmGasOverhead(uint16 thisRelayerChainId, uint32 newGasOverhead) returns() +func (_CoreRelayer *CoreRelayerSession) UpdateEvmGasOverhead(thisRelayerChainId uint16, newGasOverhead uint32) (*types.Transaction, error) { + return _CoreRelayer.Contract.UpdateEvmGasOverhead(&_CoreRelayer.TransactOpts, thisRelayerChainId, newGasOverhead) +} + +// UpdateEvmGasOverhead is a paid mutator transaction binding the contract method 0x00de5ec4. +// +// Solidity: function updateEvmGasOverhead(uint16 thisRelayerChainId, uint32 newGasOverhead) returns() +func (_CoreRelayer *CoreRelayerTransactorSession) UpdateEvmGasOverhead(thisRelayerChainId uint16, newGasOverhead uint32) (*types.Transaction, error) { + return _CoreRelayer.Contract.UpdateEvmGasOverhead(&_CoreRelayer.TransactOpts, thisRelayerChainId, newGasOverhead) +} + +// UpdateGasOracleContract is a paid mutator transaction binding the contract method 0x3c07f767. +// +// Solidity: function updateGasOracleContract(uint16 thisRelayerChainId, address newGasOracleAddress) returns() +func (_CoreRelayer *CoreRelayerTransactor) UpdateGasOracleContract(opts *bind.TransactOpts, thisRelayerChainId uint16, newGasOracleAddress common.Address) (*types.Transaction, error) { + return _CoreRelayer.contract.Transact(opts, "updateGasOracleContract", thisRelayerChainId, newGasOracleAddress) +} + +// UpdateGasOracleContract is a paid mutator transaction binding the contract method 0x3c07f767. +// +// Solidity: function updateGasOracleContract(uint16 thisRelayerChainId, address newGasOracleAddress) returns() +func (_CoreRelayer *CoreRelayerSession) UpdateGasOracleContract(thisRelayerChainId uint16, newGasOracleAddress common.Address) (*types.Transaction, error) { + return _CoreRelayer.Contract.UpdateGasOracleContract(&_CoreRelayer.TransactOpts, thisRelayerChainId, newGasOracleAddress) +} + +// UpdateGasOracleContract is a paid mutator transaction binding the contract method 0x3c07f767. +// +// Solidity: function updateGasOracleContract(uint16 thisRelayerChainId, address newGasOracleAddress) returns() +func (_CoreRelayer *CoreRelayerTransactorSession) UpdateGasOracleContract(thisRelayerChainId uint16, newGasOracleAddress common.Address) (*types.Transaction, error) { + return _CoreRelayer.Contract.UpdateGasOracleContract(&_CoreRelayer.TransactOpts, thisRelayerChainId, newGasOracleAddress) +} + +// Upgrade is a paid mutator transaction binding the contract method 0x3522be7d. +// +// Solidity: function upgrade(uint16 thisRelayerChainId, address newImplementation) returns() +func (_CoreRelayer *CoreRelayerTransactor) Upgrade(opts *bind.TransactOpts, thisRelayerChainId uint16, newImplementation common.Address) (*types.Transaction, error) { + return _CoreRelayer.contract.Transact(opts, "upgrade", thisRelayerChainId, newImplementation) +} + +// Upgrade is a paid mutator transaction binding the contract method 0x3522be7d. +// +// Solidity: function upgrade(uint16 thisRelayerChainId, address newImplementation) returns() +func (_CoreRelayer *CoreRelayerSession) Upgrade(thisRelayerChainId uint16, newImplementation common.Address) (*types.Transaction, error) { + return _CoreRelayer.Contract.Upgrade(&_CoreRelayer.TransactOpts, thisRelayerChainId, newImplementation) +} + +// Upgrade is a paid mutator transaction binding the contract method 0x3522be7d. +// +// Solidity: function upgrade(uint16 thisRelayerChainId, address newImplementation) returns() +func (_CoreRelayer *CoreRelayerTransactorSession) Upgrade(thisRelayerChainId uint16, newImplementation common.Address) (*types.Transaction, error) { + return _CoreRelayer.Contract.Upgrade(&_CoreRelayer.TransactOpts, thisRelayerChainId, newImplementation) +} + +// CoreRelayerAdminChangedIterator is returned from FilterAdminChanged and is used to iterate over the raw logs and unpacked data for AdminChanged events raised by the CoreRelayer contract. +type CoreRelayerAdminChangedIterator struct { + Event *CoreRelayerAdminChanged // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *CoreRelayerAdminChangedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(CoreRelayerAdminChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(CoreRelayerAdminChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *CoreRelayerAdminChangedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CoreRelayerAdminChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CoreRelayerAdminChanged represents a AdminChanged event raised by the CoreRelayer contract. +type CoreRelayerAdminChanged struct { + PreviousAdmin common.Address + NewAdmin common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAdminChanged is a free log retrieval operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. +// +// Solidity: event AdminChanged(address previousAdmin, address newAdmin) +func (_CoreRelayer *CoreRelayerFilterer) FilterAdminChanged(opts *bind.FilterOpts) (*CoreRelayerAdminChangedIterator, error) { + + logs, sub, err := _CoreRelayer.contract.FilterLogs(opts, "AdminChanged") + if err != nil { + return nil, err + } + return &CoreRelayerAdminChangedIterator{contract: _CoreRelayer.contract, event: "AdminChanged", logs: logs, sub: sub}, nil +} + +// WatchAdminChanged is a free log subscription operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. +// +// Solidity: event AdminChanged(address previousAdmin, address newAdmin) +func (_CoreRelayer *CoreRelayerFilterer) WatchAdminChanged(opts *bind.WatchOpts, sink chan<- *CoreRelayerAdminChanged) (event.Subscription, error) { + + logs, sub, err := _CoreRelayer.contract.WatchLogs(opts, "AdminChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CoreRelayerAdminChanged) + if err := _CoreRelayer.contract.UnpackLog(event, "AdminChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseAdminChanged is a log parse operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. +// +// Solidity: event AdminChanged(address previousAdmin, address newAdmin) +func (_CoreRelayer *CoreRelayerFilterer) ParseAdminChanged(log types.Log) (*CoreRelayerAdminChanged, error) { + event := new(CoreRelayerAdminChanged) + if err := _CoreRelayer.contract.UnpackLog(event, "AdminChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// CoreRelayerBeaconUpgradedIterator is returned from FilterBeaconUpgraded and is used to iterate over the raw logs and unpacked data for BeaconUpgraded events raised by the CoreRelayer contract. +type CoreRelayerBeaconUpgradedIterator struct { + Event *CoreRelayerBeaconUpgraded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *CoreRelayerBeaconUpgradedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(CoreRelayerBeaconUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(CoreRelayerBeaconUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *CoreRelayerBeaconUpgradedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CoreRelayerBeaconUpgradedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CoreRelayerBeaconUpgraded represents a BeaconUpgraded event raised by the CoreRelayer contract. +type CoreRelayerBeaconUpgraded struct { + Beacon common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBeaconUpgraded is a free log retrieval operation binding the contract event 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e. +// +// Solidity: event BeaconUpgraded(address indexed beacon) +func (_CoreRelayer *CoreRelayerFilterer) FilterBeaconUpgraded(opts *bind.FilterOpts, beacon []common.Address) (*CoreRelayerBeaconUpgradedIterator, error) { + + var beaconRule []interface{} + for _, beaconItem := range beacon { + beaconRule = append(beaconRule, beaconItem) + } + + logs, sub, err := _CoreRelayer.contract.FilterLogs(opts, "BeaconUpgraded", beaconRule) + if err != nil { + return nil, err + } + return &CoreRelayerBeaconUpgradedIterator{contract: _CoreRelayer.contract, event: "BeaconUpgraded", logs: logs, sub: sub}, nil +} + +// WatchBeaconUpgraded is a free log subscription operation binding the contract event 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e. +// +// Solidity: event BeaconUpgraded(address indexed beacon) +func (_CoreRelayer *CoreRelayerFilterer) WatchBeaconUpgraded(opts *bind.WatchOpts, sink chan<- *CoreRelayerBeaconUpgraded, beacon []common.Address) (event.Subscription, error) { + + var beaconRule []interface{} + for _, beaconItem := range beacon { + beaconRule = append(beaconRule, beaconItem) + } + + logs, sub, err := _CoreRelayer.contract.WatchLogs(opts, "BeaconUpgraded", beaconRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CoreRelayerBeaconUpgraded) + if err := _CoreRelayer.contract.UnpackLog(event, "BeaconUpgraded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBeaconUpgraded is a log parse operation binding the contract event 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e. +// +// Solidity: event BeaconUpgraded(address indexed beacon) +func (_CoreRelayer *CoreRelayerFilterer) ParseBeaconUpgraded(log types.Log) (*CoreRelayerBeaconUpgraded, error) { + event := new(CoreRelayerBeaconUpgraded) + if err := _CoreRelayer.contract.UnpackLog(event, "BeaconUpgraded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// CoreRelayerContractUpgradedIterator is returned from FilterContractUpgraded and is used to iterate over the raw logs and unpacked data for ContractUpgraded events raised by the CoreRelayer contract. +type CoreRelayerContractUpgradedIterator struct { + Event *CoreRelayerContractUpgraded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *CoreRelayerContractUpgradedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(CoreRelayerContractUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(CoreRelayerContractUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *CoreRelayerContractUpgradedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CoreRelayerContractUpgradedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CoreRelayerContractUpgraded represents a ContractUpgraded event raised by the CoreRelayer contract. +type CoreRelayerContractUpgraded struct { + OldContract common.Address + NewContract common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterContractUpgraded is a free log retrieval operation binding the contract event 0x2e4cc16c100f0b55e2df82ab0b1a7e294aa9cbd01b48fbaf622683fbc0507a49. +// +// Solidity: event ContractUpgraded(address indexed oldContract, address indexed newContract) +func (_CoreRelayer *CoreRelayerFilterer) FilterContractUpgraded(opts *bind.FilterOpts, oldContract []common.Address, newContract []common.Address) (*CoreRelayerContractUpgradedIterator, error) { + + var oldContractRule []interface{} + for _, oldContractItem := range oldContract { + oldContractRule = append(oldContractRule, oldContractItem) + } + var newContractRule []interface{} + for _, newContractItem := range newContract { + newContractRule = append(newContractRule, newContractItem) + } + + logs, sub, err := _CoreRelayer.contract.FilterLogs(opts, "ContractUpgraded", oldContractRule, newContractRule) + if err != nil { + return nil, err + } + return &CoreRelayerContractUpgradedIterator{contract: _CoreRelayer.contract, event: "ContractUpgraded", logs: logs, sub: sub}, nil +} + +// WatchContractUpgraded is a free log subscription operation binding the contract event 0x2e4cc16c100f0b55e2df82ab0b1a7e294aa9cbd01b48fbaf622683fbc0507a49. +// +// Solidity: event ContractUpgraded(address indexed oldContract, address indexed newContract) +func (_CoreRelayer *CoreRelayerFilterer) WatchContractUpgraded(opts *bind.WatchOpts, sink chan<- *CoreRelayerContractUpgraded, oldContract []common.Address, newContract []common.Address) (event.Subscription, error) { + + var oldContractRule []interface{} + for _, oldContractItem := range oldContract { + oldContractRule = append(oldContractRule, oldContractItem) + } + var newContractRule []interface{} + for _, newContractItem := range newContract { + newContractRule = append(newContractRule, newContractItem) + } + + logs, sub, err := _CoreRelayer.contract.WatchLogs(opts, "ContractUpgraded", oldContractRule, newContractRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CoreRelayerContractUpgraded) + if err := _CoreRelayer.contract.UnpackLog(event, "ContractUpgraded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseContractUpgraded is a log parse operation binding the contract event 0x2e4cc16c100f0b55e2df82ab0b1a7e294aa9cbd01b48fbaf622683fbc0507a49. +// +// Solidity: event ContractUpgraded(address indexed oldContract, address indexed newContract) +func (_CoreRelayer *CoreRelayerFilterer) ParseContractUpgraded(log types.Log) (*CoreRelayerContractUpgraded, error) { + event := new(CoreRelayerContractUpgraded) + if err := _CoreRelayer.contract.UnpackLog(event, "ContractUpgraded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// CoreRelayerEVMGasOverheadUpdatedIterator is returned from FilterEVMGasOverheadUpdated and is used to iterate over the raw logs and unpacked data for EVMGasOverheadUpdated events raised by the CoreRelayer contract. +type CoreRelayerEVMGasOverheadUpdatedIterator struct { + Event *CoreRelayerEVMGasOverheadUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *CoreRelayerEVMGasOverheadUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(CoreRelayerEVMGasOverheadUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(CoreRelayerEVMGasOverheadUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *CoreRelayerEVMGasOverheadUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CoreRelayerEVMGasOverheadUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CoreRelayerEVMGasOverheadUpdated represents a EVMGasOverheadUpdated event raised by the CoreRelayer contract. +type CoreRelayerEVMGasOverheadUpdated struct { + OldOverhead uint32 + NewOverhead uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEVMGasOverheadUpdated is a free log retrieval operation binding the contract event 0x39b49e3d7d01371a25a01c8cfd3e6daafc69f017c13b0f9fcb633d97d16c87b9. +// +// Solidity: event EVMGasOverheadUpdated(uint32 indexed oldOverhead, uint32 indexed newOverhead) +func (_CoreRelayer *CoreRelayerFilterer) FilterEVMGasOverheadUpdated(opts *bind.FilterOpts, oldOverhead []uint32, newOverhead []uint32) (*CoreRelayerEVMGasOverheadUpdatedIterator, error) { + + var oldOverheadRule []interface{} + for _, oldOverheadItem := range oldOverhead { + oldOverheadRule = append(oldOverheadRule, oldOverheadItem) + } + var newOverheadRule []interface{} + for _, newOverheadItem := range newOverhead { + newOverheadRule = append(newOverheadRule, newOverheadItem) + } + + logs, sub, err := _CoreRelayer.contract.FilterLogs(opts, "EVMGasOverheadUpdated", oldOverheadRule, newOverheadRule) + if err != nil { + return nil, err + } + return &CoreRelayerEVMGasOverheadUpdatedIterator{contract: _CoreRelayer.contract, event: "EVMGasOverheadUpdated", logs: logs, sub: sub}, nil +} + +// WatchEVMGasOverheadUpdated is a free log subscription operation binding the contract event 0x39b49e3d7d01371a25a01c8cfd3e6daafc69f017c13b0f9fcb633d97d16c87b9. +// +// Solidity: event EVMGasOverheadUpdated(uint32 indexed oldOverhead, uint32 indexed newOverhead) +func (_CoreRelayer *CoreRelayerFilterer) WatchEVMGasOverheadUpdated(opts *bind.WatchOpts, sink chan<- *CoreRelayerEVMGasOverheadUpdated, oldOverhead []uint32, newOverhead []uint32) (event.Subscription, error) { + + var oldOverheadRule []interface{} + for _, oldOverheadItem := range oldOverhead { + oldOverheadRule = append(oldOverheadRule, oldOverheadItem) + } + var newOverheadRule []interface{} + for _, newOverheadItem := range newOverhead { + newOverheadRule = append(newOverheadRule, newOverheadItem) + } + + logs, sub, err := _CoreRelayer.contract.WatchLogs(opts, "EVMGasOverheadUpdated", oldOverheadRule, newOverheadRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CoreRelayerEVMGasOverheadUpdated) + if err := _CoreRelayer.contract.UnpackLog(event, "EVMGasOverheadUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEVMGasOverheadUpdated is a log parse operation binding the contract event 0x39b49e3d7d01371a25a01c8cfd3e6daafc69f017c13b0f9fcb633d97d16c87b9. +// +// Solidity: event EVMGasOverheadUpdated(uint32 indexed oldOverhead, uint32 indexed newOverhead) +func (_CoreRelayer *CoreRelayerFilterer) ParseEVMGasOverheadUpdated(log types.Log) (*CoreRelayerEVMGasOverheadUpdated, error) { + event := new(CoreRelayerEVMGasOverheadUpdated) + if err := _CoreRelayer.contract.UnpackLog(event, "EVMGasOverheadUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// CoreRelayerGasOracleUpdatedIterator is returned from FilterGasOracleUpdated and is used to iterate over the raw logs and unpacked data for GasOracleUpdated events raised by the CoreRelayer contract. +type CoreRelayerGasOracleUpdatedIterator struct { + Event *CoreRelayerGasOracleUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *CoreRelayerGasOracleUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(CoreRelayerGasOracleUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(CoreRelayerGasOracleUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *CoreRelayerGasOracleUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CoreRelayerGasOracleUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CoreRelayerGasOracleUpdated represents a GasOracleUpdated event raised by the CoreRelayer contract. +type CoreRelayerGasOracleUpdated struct { + OldOracle common.Address + NewOracle common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterGasOracleUpdated is a free log retrieval operation binding the contract event 0x73832aa215e2812d2f0c40bd0cf9df82495d3a46da4be338a17d63fb20e108f9. +// +// Solidity: event GasOracleUpdated(address indexed oldOracle, address indexed newOracle) +func (_CoreRelayer *CoreRelayerFilterer) FilterGasOracleUpdated(opts *bind.FilterOpts, oldOracle []common.Address, newOracle []common.Address) (*CoreRelayerGasOracleUpdatedIterator, error) { + + var oldOracleRule []interface{} + for _, oldOracleItem := range oldOracle { + oldOracleRule = append(oldOracleRule, oldOracleItem) + } + var newOracleRule []interface{} + for _, newOracleItem := range newOracle { + newOracleRule = append(newOracleRule, newOracleItem) + } + + logs, sub, err := _CoreRelayer.contract.FilterLogs(opts, "GasOracleUpdated", oldOracleRule, newOracleRule) + if err != nil { + return nil, err + } + return &CoreRelayerGasOracleUpdatedIterator{contract: _CoreRelayer.contract, event: "GasOracleUpdated", logs: logs, sub: sub}, nil +} + +// WatchGasOracleUpdated is a free log subscription operation binding the contract event 0x73832aa215e2812d2f0c40bd0cf9df82495d3a46da4be338a17d63fb20e108f9. +// +// Solidity: event GasOracleUpdated(address indexed oldOracle, address indexed newOracle) +func (_CoreRelayer *CoreRelayerFilterer) WatchGasOracleUpdated(opts *bind.WatchOpts, sink chan<- *CoreRelayerGasOracleUpdated, oldOracle []common.Address, newOracle []common.Address) (event.Subscription, error) { + + var oldOracleRule []interface{} + for _, oldOracleItem := range oldOracle { + oldOracleRule = append(oldOracleRule, oldOracleItem) + } + var newOracleRule []interface{} + for _, newOracleItem := range newOracle { + newOracleRule = append(newOracleRule, newOracleItem) + } + + logs, sub, err := _CoreRelayer.contract.WatchLogs(opts, "GasOracleUpdated", oldOracleRule, newOracleRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CoreRelayerGasOracleUpdated) + if err := _CoreRelayer.contract.UnpackLog(event, "GasOracleUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseGasOracleUpdated is a log parse operation binding the contract event 0x73832aa215e2812d2f0c40bd0cf9df82495d3a46da4be338a17d63fb20e108f9. +// +// Solidity: event GasOracleUpdated(address indexed oldOracle, address indexed newOracle) +func (_CoreRelayer *CoreRelayerFilterer) ParseGasOracleUpdated(log types.Log) (*CoreRelayerGasOracleUpdated, error) { + event := new(CoreRelayerGasOracleUpdated) + if err := _CoreRelayer.contract.UnpackLog(event, "GasOracleUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// CoreRelayerOwnershipTransferedIterator is returned from FilterOwnershipTransfered and is used to iterate over the raw logs and unpacked data for OwnershipTransfered events raised by the CoreRelayer contract. +type CoreRelayerOwnershipTransferedIterator struct { + Event *CoreRelayerOwnershipTransfered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *CoreRelayerOwnershipTransferedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(CoreRelayerOwnershipTransfered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(CoreRelayerOwnershipTransfered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *CoreRelayerOwnershipTransferedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CoreRelayerOwnershipTransferedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CoreRelayerOwnershipTransfered represents a OwnershipTransfered event raised by the CoreRelayer contract. +type CoreRelayerOwnershipTransfered struct { + OldOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransfered is a free log retrieval operation binding the contract event 0x0d18b5fd22306e373229b9439188228edca81207d1667f604daf6cef8aa3ee67. +// +// Solidity: event OwnershipTransfered(address indexed oldOwner, address indexed newOwner) +func (_CoreRelayer *CoreRelayerFilterer) FilterOwnershipTransfered(opts *bind.FilterOpts, oldOwner []common.Address, newOwner []common.Address) (*CoreRelayerOwnershipTransferedIterator, error) { + + var oldOwnerRule []interface{} + for _, oldOwnerItem := range oldOwner { + oldOwnerRule = append(oldOwnerRule, oldOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _CoreRelayer.contract.FilterLogs(opts, "OwnershipTransfered", oldOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &CoreRelayerOwnershipTransferedIterator{contract: _CoreRelayer.contract, event: "OwnershipTransfered", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransfered is a free log subscription operation binding the contract event 0x0d18b5fd22306e373229b9439188228edca81207d1667f604daf6cef8aa3ee67. +// +// Solidity: event OwnershipTransfered(address indexed oldOwner, address indexed newOwner) +func (_CoreRelayer *CoreRelayerFilterer) WatchOwnershipTransfered(opts *bind.WatchOpts, sink chan<- *CoreRelayerOwnershipTransfered, oldOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var oldOwnerRule []interface{} + for _, oldOwnerItem := range oldOwner { + oldOwnerRule = append(oldOwnerRule, oldOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _CoreRelayer.contract.WatchLogs(opts, "OwnershipTransfered", oldOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CoreRelayerOwnershipTransfered) + if err := _CoreRelayer.contract.UnpackLog(event, "OwnershipTransfered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransfered is a log parse operation binding the contract event 0x0d18b5fd22306e373229b9439188228edca81207d1667f604daf6cef8aa3ee67. +// +// Solidity: event OwnershipTransfered(address indexed oldOwner, address indexed newOwner) +func (_CoreRelayer *CoreRelayerFilterer) ParseOwnershipTransfered(log types.Log) (*CoreRelayerOwnershipTransfered, error) { + event := new(CoreRelayerOwnershipTransfered) + if err := _CoreRelayer.contract.UnpackLog(event, "OwnershipTransfered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// CoreRelayerUpgradedIterator is returned from FilterUpgraded and is used to iterate over the raw logs and unpacked data for Upgraded events raised by the CoreRelayer contract. +type CoreRelayerUpgradedIterator struct { + Event *CoreRelayerUpgraded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *CoreRelayerUpgradedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(CoreRelayerUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(CoreRelayerUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *CoreRelayerUpgradedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CoreRelayerUpgradedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CoreRelayerUpgraded represents a Upgraded event raised by the CoreRelayer contract. +type CoreRelayerUpgraded struct { + Implementation common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUpgraded is a free log retrieval operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_CoreRelayer *CoreRelayerFilterer) FilterUpgraded(opts *bind.FilterOpts, implementation []common.Address) (*CoreRelayerUpgradedIterator, error) { + + var implementationRule []interface{} + for _, implementationItem := range implementation { + implementationRule = append(implementationRule, implementationItem) + } + + logs, sub, err := _CoreRelayer.contract.FilterLogs(opts, "Upgraded", implementationRule) + if err != nil { + return nil, err + } + return &CoreRelayerUpgradedIterator{contract: _CoreRelayer.contract, event: "Upgraded", logs: logs, sub: sub}, nil +} + +// WatchUpgraded is a free log subscription operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_CoreRelayer *CoreRelayerFilterer) WatchUpgraded(opts *bind.WatchOpts, sink chan<- *CoreRelayerUpgraded, implementation []common.Address) (event.Subscription, error) { + + var implementationRule []interface{} + for _, implementationItem := range implementation { + implementationRule = append(implementationRule, implementationItem) + } + + logs, sub, err := _CoreRelayer.contract.WatchLogs(opts, "Upgraded", implementationRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CoreRelayerUpgraded) + if err := _CoreRelayer.contract.UnpackLog(event, "Upgraded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUpgraded is a log parse operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_CoreRelayer *CoreRelayerFilterer) ParseUpgraded(log types.Log) (*CoreRelayerUpgraded, error) { + event := new(CoreRelayerUpgraded) + if err := _CoreRelayer.contract.UnpackLog(event, "Upgraded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/offchain-relayer/relay/logger.go b/offchain-relayer/relay/logger.go new file mode 100644 index 0000000..11e0654 --- /dev/null +++ b/offchain-relayer/relay/logger.go @@ -0,0 +1,29 @@ +package relay + +import ( + "unicode" + + "go.uber.org/zap/buffer" + "go.uber.org/zap/zapcore" +) + +type consoleEncoder struct { + zapcore.Encoder +} + +func (e consoleEncoder) EncodeEntry(entry zapcore.Entry, fields []zapcore.Field) (*buffer.Buffer, error) { + buf, err := e.Encoder.EncodeEntry(entry, fields) + if err != nil { + buf.Free() + return nil, err + } + + b := buf.Bytes() + for i := range b { + if unicode.IsControl(rune(b[i])) && !unicode.IsSpace(rune(b[i])) { + b[i] = '\x1A' // Substitute character + } + } + + return buf, nil +} diff --git a/offchain-relayer/relay/proto/gossip/go.mod b/offchain-relayer/relay/proto/gossip/go.mod new file mode 100644 index 0000000..0d08b41 --- /dev/null +++ b/offchain-relayer/relay/proto/gossip/go.mod @@ -0,0 +1,3 @@ +module github.com/certusone/wormhole/node/pkg/proto/gossip + +go 1.17 diff --git a/offchain-relayer/relay/proto/gossip/v1/gossip.pb.go b/offchain-relayer/relay/proto/gossip/v1/gossip.pb.go new file mode 100644 index 0000000..ae3dbad --- /dev/null +++ b/offchain-relayer/relay/proto/gossip/v1/gossip.pb.go @@ -0,0 +1,1151 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.1 +// protoc (unknown) +// source: gossip/v1/gossip.proto + +package gossipv1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type GossipMessage struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Message: + // *GossipMessage_SignedObservation + // *GossipMessage_SignedHeartbeat + // *GossipMessage_SignedVaaWithQuorum + // *GossipMessage_SignedObservationRequest + // *GossipMessage_SignedBatchObservation + // *GossipMessage_SignedBatchVaaWithQuorum + Message isGossipMessage_Message `protobuf_oneof:"message"` +} + +func (x *GossipMessage) Reset() { + *x = GossipMessage{} + if protoimpl.UnsafeEnabled { + mi := &file_gossip_v1_gossip_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GossipMessage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GossipMessage) ProtoMessage() {} + +func (x *GossipMessage) ProtoReflect() protoreflect.Message { + mi := &file_gossip_v1_gossip_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GossipMessage.ProtoReflect.Descriptor instead. +func (*GossipMessage) Descriptor() ([]byte, []int) { + return file_gossip_v1_gossip_proto_rawDescGZIP(), []int{0} +} + +func (m *GossipMessage) GetMessage() isGossipMessage_Message { + if m != nil { + return m.Message + } + return nil +} + +func (x *GossipMessage) GetSignedObservation() *SignedObservation { + if x, ok := x.GetMessage().(*GossipMessage_SignedObservation); ok { + return x.SignedObservation + } + return nil +} + +func (x *GossipMessage) GetSignedHeartbeat() *SignedHeartbeat { + if x, ok := x.GetMessage().(*GossipMessage_SignedHeartbeat); ok { + return x.SignedHeartbeat + } + return nil +} + +func (x *GossipMessage) GetSignedVaaWithQuorum() *SignedVAAWithQuorum { + if x, ok := x.GetMessage().(*GossipMessage_SignedVaaWithQuorum); ok { + return x.SignedVaaWithQuorum + } + return nil +} + +func (x *GossipMessage) GetSignedObservationRequest() *SignedObservationRequest { + if x, ok := x.GetMessage().(*GossipMessage_SignedObservationRequest); ok { + return x.SignedObservationRequest + } + return nil +} + +func (x *GossipMessage) GetSignedBatchObservation() *SignedBatchObservation { + if x, ok := x.GetMessage().(*GossipMessage_SignedBatchObservation); ok { + return x.SignedBatchObservation + } + return nil +} + +func (x *GossipMessage) GetSignedBatchVaaWithQuorum() *SignedBatchVAAWithQuorum { + if x, ok := x.GetMessage().(*GossipMessage_SignedBatchVaaWithQuorum); ok { + return x.SignedBatchVaaWithQuorum + } + return nil +} + +type isGossipMessage_Message interface { + isGossipMessage_Message() +} + +type GossipMessage_SignedObservation struct { + SignedObservation *SignedObservation `protobuf:"bytes,2,opt,name=signed_observation,json=signedObservation,proto3,oneof"` +} + +type GossipMessage_SignedHeartbeat struct { + SignedHeartbeat *SignedHeartbeat `protobuf:"bytes,3,opt,name=signed_heartbeat,json=signedHeartbeat,proto3,oneof"` +} + +type GossipMessage_SignedVaaWithQuorum struct { + SignedVaaWithQuorum *SignedVAAWithQuorum `protobuf:"bytes,4,opt,name=signed_vaa_with_quorum,json=signedVaaWithQuorum,proto3,oneof"` +} + +type GossipMessage_SignedObservationRequest struct { + SignedObservationRequest *SignedObservationRequest `protobuf:"bytes,5,opt,name=signed_observation_request,json=signedObservationRequest,proto3,oneof"` +} + +type GossipMessage_SignedBatchObservation struct { + SignedBatchObservation *SignedBatchObservation `protobuf:"bytes,6,opt,name=signed_batch_observation,json=signedBatchObservation,proto3,oneof"` +} + +type GossipMessage_SignedBatchVaaWithQuorum struct { + SignedBatchVaaWithQuorum *SignedBatchVAAWithQuorum `protobuf:"bytes,7,opt,name=signed_batch_vaa_with_quorum,json=signedBatchVaaWithQuorum,proto3,oneof"` +} + +func (*GossipMessage_SignedObservation) isGossipMessage_Message() {} + +func (*GossipMessage_SignedHeartbeat) isGossipMessage_Message() {} + +func (*GossipMessage_SignedVaaWithQuorum) isGossipMessage_Message() {} + +func (*GossipMessage_SignedObservationRequest) isGossipMessage_Message() {} + +func (*GossipMessage_SignedBatchObservation) isGossipMessage_Message() {} + +func (*GossipMessage_SignedBatchVaaWithQuorum) isGossipMessage_Message() {} + +type SignedHeartbeat struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Serialized Heartbeat message. + Heartbeat []byte `protobuf:"bytes,1,opt,name=heartbeat,proto3" json:"heartbeat,omitempty"` + // ECDSA signature using the node's guardian public key. + Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` + // Guardian address that signed this payload (truncated Eth address). + // This is already contained in Heartbeat, however, we want to verify + // the payload before we deserialize it. + GuardianAddr []byte `protobuf:"bytes,3,opt,name=guardian_addr,json=guardianAddr,proto3" json:"guardian_addr,omitempty"` +} + +func (x *SignedHeartbeat) Reset() { + *x = SignedHeartbeat{} + if protoimpl.UnsafeEnabled { + mi := &file_gossip_v1_gossip_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignedHeartbeat) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignedHeartbeat) ProtoMessage() {} + +func (x *SignedHeartbeat) ProtoReflect() protoreflect.Message { + mi := &file_gossip_v1_gossip_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignedHeartbeat.ProtoReflect.Descriptor instead. +func (*SignedHeartbeat) Descriptor() ([]byte, []int) { + return file_gossip_v1_gossip_proto_rawDescGZIP(), []int{1} +} + +func (x *SignedHeartbeat) GetHeartbeat() []byte { + if x != nil { + return x.Heartbeat + } + return nil +} + +func (x *SignedHeartbeat) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +func (x *SignedHeartbeat) GetGuardianAddr() []byte { + if x != nil { + return x.GuardianAddr + } + return nil +} + +// P2P gossip heartbeats for network introspection purposes. +type Heartbeat struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The node's arbitrarily chosen, untrusted nodeName. + NodeName string `protobuf:"bytes,1,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` + // A monotonic counter that resets to zero on startup. + Counter int64 `protobuf:"varint,2,opt,name=counter,proto3" json:"counter,omitempty"` + // UNIX wall time. + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Networks []*Heartbeat_Network `protobuf:"bytes,4,rep,name=networks,proto3" json:"networks,omitempty"` + // Human-readable representation of the current bridge node release. + Version string `protobuf:"bytes,5,opt,name=version,proto3" json:"version,omitempty"` + // Human-readable representation of the guardian key's address. + GuardianAddr string `protobuf:"bytes,6,opt,name=guardian_addr,json=guardianAddr,proto3" json:"guardian_addr,omitempty"` + // UNIX boot timestamp. + BootTimestamp int64 `protobuf:"varint,7,opt,name=boot_timestamp,json=bootTimestamp,proto3" json:"boot_timestamp,omitempty"` + // List of features enabled on this node. + Features []string `protobuf:"bytes,8,rep,name=features,proto3" json:"features,omitempty"` +} + +func (x *Heartbeat) Reset() { + *x = Heartbeat{} + if protoimpl.UnsafeEnabled { + mi := &file_gossip_v1_gossip_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Heartbeat) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Heartbeat) ProtoMessage() {} + +func (x *Heartbeat) ProtoReflect() protoreflect.Message { + mi := &file_gossip_v1_gossip_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Heartbeat.ProtoReflect.Descriptor instead. +func (*Heartbeat) Descriptor() ([]byte, []int) { + return file_gossip_v1_gossip_proto_rawDescGZIP(), []int{2} +} + +func (x *Heartbeat) GetNodeName() string { + if x != nil { + return x.NodeName + } + return "" +} + +func (x *Heartbeat) GetCounter() int64 { + if x != nil { + return x.Counter + } + return 0 +} + +func (x *Heartbeat) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +func (x *Heartbeat) GetNetworks() []*Heartbeat_Network { + if x != nil { + return x.Networks + } + return nil +} + +func (x *Heartbeat) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *Heartbeat) GetGuardianAddr() string { + if x != nil { + return x.GuardianAddr + } + return "" +} + +func (x *Heartbeat) GetBootTimestamp() int64 { + if x != nil { + return x.BootTimestamp + } + return 0 +} + +func (x *Heartbeat) GetFeatures() []string { + if x != nil { + return x.Features + } + return nil +} + +// A SignedObservation is a signed statement by a given guardian node +// that they observed a given event. +// +// Observations always result from an external, final event being observed. +// Examples are emitted messages in finalized blocks on a block or guardian set changes +// injected by node operators after reaching off-chain consensus. +// +// The event is uniquely identified by its hashed (tx_hash, nonce, values...) tuple. +// +// Other nodes will verify the signature. Once any node has observed a quorum of +// guardians submitting valid signatures for a given hash, they can be assembled into a VAA. +// +// Messages without valid signature are dropped unceremoniously. +type SignedObservation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Guardian pubkey as truncated eth address. + Addr []byte `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr,omitempty"` + // The observation's deterministic, unique hash. + Hash []byte `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash,omitempty"` + // ECSDA signature of the hash using the node's guardian key. + Signature []byte `protobuf:"bytes,3,opt,name=signature,proto3" json:"signature,omitempty"` + // Transaction hash this observation was made from. + // Optional, included for observability. + TxHash []byte `protobuf:"bytes,4,opt,name=tx_hash,json=txHash,proto3" json:"tx_hash,omitempty"` + // Message ID (chain/emitter/seq) for this observation. + // Optional, included for observability. + MessageId string `protobuf:"bytes,5,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"` +} + +func (x *SignedObservation) Reset() { + *x = SignedObservation{} + if protoimpl.UnsafeEnabled { + mi := &file_gossip_v1_gossip_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignedObservation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignedObservation) ProtoMessage() {} + +func (x *SignedObservation) ProtoReflect() protoreflect.Message { + mi := &file_gossip_v1_gossip_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignedObservation.ProtoReflect.Descriptor instead. +func (*SignedObservation) Descriptor() ([]byte, []int) { + return file_gossip_v1_gossip_proto_rawDescGZIP(), []int{3} +} + +func (x *SignedObservation) GetAddr() []byte { + if x != nil { + return x.Addr + } + return nil +} + +func (x *SignedObservation) GetHash() []byte { + if x != nil { + return x.Hash + } + return nil +} + +func (x *SignedObservation) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +func (x *SignedObservation) GetTxHash() []byte { + if x != nil { + return x.TxHash + } + return nil +} + +func (x *SignedObservation) GetMessageId() string { + if x != nil { + return x.MessageId + } + return "" +} + +// A SignedVAAWithQuorum message is sent by nodes whenever one of the VAAs they observed +// reached a 2/3+ quorum to be considered valid. Signed VAAs are broadcasted to the gossip +// network to allow nodes to persist them even if they failed to observe the signature. +type SignedVAAWithQuorum struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Vaa []byte `protobuf:"bytes,1,opt,name=vaa,proto3" json:"vaa,omitempty"` +} + +func (x *SignedVAAWithQuorum) Reset() { + *x = SignedVAAWithQuorum{} + if protoimpl.UnsafeEnabled { + mi := &file_gossip_v1_gossip_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignedVAAWithQuorum) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignedVAAWithQuorum) ProtoMessage() {} + +func (x *SignedVAAWithQuorum) ProtoReflect() protoreflect.Message { + mi := &file_gossip_v1_gossip_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignedVAAWithQuorum.ProtoReflect.Descriptor instead. +func (*SignedVAAWithQuorum) Descriptor() ([]byte, []int) { + return file_gossip_v1_gossip_proto_rawDescGZIP(), []int{4} +} + +func (x *SignedVAAWithQuorum) GetVaa() []byte { + if x != nil { + return x.Vaa + } + return nil +} + +// Any guardian can send a SignedObservationRequest to the network to request +// all guardians to re-observe a given transaction. This is rate-limited to one +// request per second per guardian to prevent abuse. +// +// In the current implementation, this is only implemented for Solana. +// For Solana, the tx_hash is the account address of the transaction's message account. +type SignedObservationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Serialized observation request. + ObservationRequest []byte `protobuf:"bytes,1,opt,name=observation_request,json=observationRequest,proto3" json:"observation_request,omitempty"` + // Signature + Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` + GuardianAddr []byte `protobuf:"bytes,3,opt,name=guardian_addr,json=guardianAddr,proto3" json:"guardian_addr,omitempty"` +} + +func (x *SignedObservationRequest) Reset() { + *x = SignedObservationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_gossip_v1_gossip_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignedObservationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignedObservationRequest) ProtoMessage() {} + +func (x *SignedObservationRequest) ProtoReflect() protoreflect.Message { + mi := &file_gossip_v1_gossip_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignedObservationRequest.ProtoReflect.Descriptor instead. +func (*SignedObservationRequest) Descriptor() ([]byte, []int) { + return file_gossip_v1_gossip_proto_rawDescGZIP(), []int{5} +} + +func (x *SignedObservationRequest) GetObservationRequest() []byte { + if x != nil { + return x.ObservationRequest + } + return nil +} + +func (x *SignedObservationRequest) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +func (x *SignedObservationRequest) GetGuardianAddr() []byte { + if x != nil { + return x.GuardianAddr + } + return nil +} + +type ObservationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ChainId uint32 `protobuf:"varint,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + TxHash []byte `protobuf:"bytes,2,opt,name=tx_hash,json=txHash,proto3" json:"tx_hash,omitempty"` +} + +func (x *ObservationRequest) Reset() { + *x = ObservationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_gossip_v1_gossip_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ObservationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ObservationRequest) ProtoMessage() {} + +func (x *ObservationRequest) ProtoReflect() protoreflect.Message { + mi := &file_gossip_v1_gossip_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ObservationRequest.ProtoReflect.Descriptor instead. +func (*ObservationRequest) Descriptor() ([]byte, []int) { + return file_gossip_v1_gossip_proto_rawDescGZIP(), []int{6} +} + +func (x *ObservationRequest) GetChainId() uint32 { + if x != nil { + return x.ChainId + } + return 0 +} + +func (x *ObservationRequest) GetTxHash() []byte { + if x != nil { + return x.TxHash + } + return nil +} + +// A SignedBatchObservation is a signed statement by a given guardian node +// that they observed a series of messages originating from a transaction. +// +// BatcheObervations are emitted when all the Observations from a tx reach quorum. +// +// The event is uniquely identified by its hash (made from hashing all the +// individual Observation hashes). +// +// Messages without valid signature are dropped unceremoniously. +type SignedBatchObservation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Guardian pubkey as truncated eth address. + Addr []byte `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr,omitempty"` + // The observation batch's deterministic, unique hash. + Hash []byte `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash,omitempty"` + // ECSDA signature of the hash using the node's guardian key. + Signature []byte `protobuf:"bytes,3,opt,name=signature,proto3" json:"signature,omitempty"` + // Transaction hash this observation was made from. + TxHash []byte `protobuf:"bytes,4,opt,name=tx_hash,json=txHash,proto3" json:"tx_hash,omitempty"` + // Chain ID for this observation. + ChainId uint32 `protobuf:"varint,5,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + // Batch ID - emitterChain/transactionID + BatchId string `protobuf:"bytes,6,opt,name=batch_id,json=batchId,proto3" json:"batch_id,omitempty"` +} + +func (x *SignedBatchObservation) Reset() { + *x = SignedBatchObservation{} + if protoimpl.UnsafeEnabled { + mi := &file_gossip_v1_gossip_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignedBatchObservation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignedBatchObservation) ProtoMessage() {} + +func (x *SignedBatchObservation) ProtoReflect() protoreflect.Message { + mi := &file_gossip_v1_gossip_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignedBatchObservation.ProtoReflect.Descriptor instead. +func (*SignedBatchObservation) Descriptor() ([]byte, []int) { + return file_gossip_v1_gossip_proto_rawDescGZIP(), []int{7} +} + +func (x *SignedBatchObservation) GetAddr() []byte { + if x != nil { + return x.Addr + } + return nil +} + +func (x *SignedBatchObservation) GetHash() []byte { + if x != nil { + return x.Hash + } + return nil +} + +func (x *SignedBatchObservation) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +func (x *SignedBatchObservation) GetTxHash() []byte { + if x != nil { + return x.TxHash + } + return nil +} + +func (x *SignedBatchObservation) GetChainId() uint32 { + if x != nil { + return x.ChainId + } + return 0 +} + +func (x *SignedBatchObservation) GetBatchId() string { + if x != nil { + return x.BatchId + } + return "" +} + +type SignedBatchVAAWithQuorum struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BatchVaa []byte `protobuf:"bytes,1,opt,name=batch_vaa,json=batchVaa,proto3" json:"batch_vaa,omitempty"` +} + +func (x *SignedBatchVAAWithQuorum) Reset() { + *x = SignedBatchVAAWithQuorum{} + if protoimpl.UnsafeEnabled { + mi := &file_gossip_v1_gossip_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignedBatchVAAWithQuorum) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignedBatchVAAWithQuorum) ProtoMessage() {} + +func (x *SignedBatchVAAWithQuorum) ProtoReflect() protoreflect.Message { + mi := &file_gossip_v1_gossip_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignedBatchVAAWithQuorum.ProtoReflect.Descriptor instead. +func (*SignedBatchVAAWithQuorum) Descriptor() ([]byte, []int) { + return file_gossip_v1_gossip_proto_rawDescGZIP(), []int{8} +} + +func (x *SignedBatchVAAWithQuorum) GetBatchVaa() []byte { + if x != nil { + return x.BatchVaa + } + return nil +} + +type Heartbeat_Network struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Canonical chain ID. + Id uint32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + // Consensus height of the node. + Height int64 `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"` + // Chain-specific human-readable representation of the bridge contract address. + ContractAddress string `protobuf:"bytes,3,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` + // Connection error count + ErrorCount uint64 `protobuf:"varint,4,opt,name=error_count,json=errorCount,proto3" json:"error_count,omitempty"` +} + +func (x *Heartbeat_Network) Reset() { + *x = Heartbeat_Network{} + if protoimpl.UnsafeEnabled { + mi := &file_gossip_v1_gossip_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Heartbeat_Network) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Heartbeat_Network) ProtoMessage() {} + +func (x *Heartbeat_Network) ProtoReflect() protoreflect.Message { + mi := &file_gossip_v1_gossip_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Heartbeat_Network.ProtoReflect.Descriptor instead. +func (*Heartbeat_Network) Descriptor() ([]byte, []int) { + return file_gossip_v1_gossip_proto_rawDescGZIP(), []int{2, 0} +} + +func (x *Heartbeat_Network) GetId() uint32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *Heartbeat_Network) GetHeight() int64 { + if x != nil { + return x.Height + } + return 0 +} + +func (x *Heartbeat_Network) GetContractAddress() string { + if x != nil { + return x.ContractAddress + } + return "" +} + +func (x *Heartbeat_Network) GetErrorCount() uint64 { + if x != nil { + return x.ErrorCount + } + return 0 +} + +var File_gossip_v1_gossip_proto protoreflect.FileDescriptor + +var file_gossip_v1_gossip_proto_rawDesc = []byte{ + 0x0a, 0x16, 0x67, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x6f, 0x73, 0x73, + 0x69, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x67, 0x6f, 0x73, 0x73, 0x69, 0x70, + 0x2e, 0x76, 0x31, 0x22, 0xb4, 0x04, 0x0a, 0x0d, 0x47, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, + 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, + 0x00, 0x52, 0x11, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x10, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x68, + 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x55, 0x0a, + 0x16, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x61, 0x5f, 0x77, 0x69, 0x74, 0x68, + 0x5f, 0x71, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x67, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, + 0x56, 0x41, 0x41, 0x57, 0x69, 0x74, 0x68, 0x51, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x48, 0x00, 0x52, + 0x13, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x61, 0x61, 0x57, 0x69, 0x74, 0x68, 0x51, 0x75, + 0x6f, 0x72, 0x75, 0x6d, 0x12, 0x63, 0x0a, 0x1a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x6f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x73, 0x73, 0x69, + 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4f, 0x62, 0x73, 0x65, 0x72, + 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, + 0x18, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5d, 0x0a, 0x18, 0x73, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, + 0x73, 0x73, 0x69, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x61, + 0x74, 0x63, 0x68, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, + 0x52, 0x16, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x61, 0x74, 0x63, 0x68, 0x4f, 0x62, 0x73, + 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x1c, 0x73, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x61, 0x5f, 0x77, 0x69, 0x74, + 0x68, 0x5f, 0x71, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x67, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x42, 0x61, 0x74, 0x63, 0x68, 0x56, 0x41, 0x41, 0x57, 0x69, 0x74, 0x68, 0x51, 0x75, 0x6f, + 0x72, 0x75, 0x6d, 0x48, 0x00, 0x52, 0x18, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x61, 0x74, + 0x63, 0x68, 0x56, 0x61, 0x61, 0x57, 0x69, 0x74, 0x68, 0x51, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x42, + 0x09, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x72, 0x0a, 0x0f, 0x53, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x09, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x75, 0x61, + 0x72, 0x64, 0x69, 0x61, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0c, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x22, 0x9b, + 0x03, 0x0a, 0x09, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x38, 0x0a, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x2e, 0x76, 0x31, 0x2e, + 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x52, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, + 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x75, + 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x62, 0x6f, + 0x6f, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0d, 0x62, 0x6f, 0x6f, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x08, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x1a, 0x7d, 0x0a, + 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x61, 0x63, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x91, 0x01, 0x0a, + 0x11, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, + 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, + 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, + 0x22, 0x27, 0x0a, 0x13, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x41, 0x41, 0x57, 0x69, 0x74, + 0x68, 0x51, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x12, 0x10, 0x0a, 0x03, 0x76, 0x61, 0x61, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x76, 0x61, 0x61, 0x22, 0x8e, 0x01, 0x0a, 0x18, 0x53, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x13, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x12, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, + 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x67, 0x75, + 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x22, 0x48, 0x0a, 0x12, 0x4f, 0x62, + 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, + 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x74, 0x78, + 0x48, 0x61, 0x73, 0x68, 0x22, 0xad, 0x01, 0x0a, 0x16, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x61, + 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x19, + 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x61, 0x74, + 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x74, + 0x63, 0x68, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x18, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x61, + 0x74, 0x63, 0x68, 0x56, 0x41, 0x41, 0x57, 0x69, 0x74, 0x68, 0x51, 0x75, 0x6f, 0x72, 0x75, 0x6d, + 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x61, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x08, 0x62, 0x61, 0x74, 0x63, 0x68, 0x56, 0x61, 0x61, 0x42, 0x41, 0x5a, + 0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x65, 0x72, 0x74, + 0x75, 0x73, 0x6f, 0x6e, 0x65, 0x2f, 0x77, 0x6f, 0x72, 0x6d, 0x68, 0x6f, 0x6c, 0x65, 0x2f, 0x6e, + 0x6f, 0x64, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, + 0x73, 0x73, 0x69, 0x70, 0x2f, 0x76, 0x31, 0x3b, 0x67, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x76, 0x31, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_gossip_v1_gossip_proto_rawDescOnce sync.Once + file_gossip_v1_gossip_proto_rawDescData = file_gossip_v1_gossip_proto_rawDesc +) + +func file_gossip_v1_gossip_proto_rawDescGZIP() []byte { + file_gossip_v1_gossip_proto_rawDescOnce.Do(func() { + file_gossip_v1_gossip_proto_rawDescData = protoimpl.X.CompressGZIP(file_gossip_v1_gossip_proto_rawDescData) + }) + return file_gossip_v1_gossip_proto_rawDescData +} + +var file_gossip_v1_gossip_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_gossip_v1_gossip_proto_goTypes = []interface{}{ + (*GossipMessage)(nil), // 0: gossip.v1.GossipMessage + (*SignedHeartbeat)(nil), // 1: gossip.v1.SignedHeartbeat + (*Heartbeat)(nil), // 2: gossip.v1.Heartbeat + (*SignedObservation)(nil), // 3: gossip.v1.SignedObservation + (*SignedVAAWithQuorum)(nil), // 4: gossip.v1.SignedVAAWithQuorum + (*SignedObservationRequest)(nil), // 5: gossip.v1.SignedObservationRequest + (*ObservationRequest)(nil), // 6: gossip.v1.ObservationRequest + (*SignedBatchObservation)(nil), // 7: gossip.v1.SignedBatchObservation + (*SignedBatchVAAWithQuorum)(nil), // 8: gossip.v1.SignedBatchVAAWithQuorum + (*Heartbeat_Network)(nil), // 9: gossip.v1.Heartbeat.Network +} +var file_gossip_v1_gossip_proto_depIdxs = []int32{ + 3, // 0: gossip.v1.GossipMessage.signed_observation:type_name -> gossip.v1.SignedObservation + 1, // 1: gossip.v1.GossipMessage.signed_heartbeat:type_name -> gossip.v1.SignedHeartbeat + 4, // 2: gossip.v1.GossipMessage.signed_vaa_with_quorum:type_name -> gossip.v1.SignedVAAWithQuorum + 5, // 3: gossip.v1.GossipMessage.signed_observation_request:type_name -> gossip.v1.SignedObservationRequest + 7, // 4: gossip.v1.GossipMessage.signed_batch_observation:type_name -> gossip.v1.SignedBatchObservation + 8, // 5: gossip.v1.GossipMessage.signed_batch_vaa_with_quorum:type_name -> gossip.v1.SignedBatchVAAWithQuorum + 9, // 6: gossip.v1.Heartbeat.networks:type_name -> gossip.v1.Heartbeat.Network + 7, // [7:7] is the sub-list for method output_type + 7, // [7:7] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name +} + +func init() { file_gossip_v1_gossip_proto_init() } +func file_gossip_v1_gossip_proto_init() { + if File_gossip_v1_gossip_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_gossip_v1_gossip_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GossipMessage); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gossip_v1_gossip_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignedHeartbeat); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gossip_v1_gossip_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Heartbeat); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gossip_v1_gossip_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignedObservation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gossip_v1_gossip_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignedVAAWithQuorum); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gossip_v1_gossip_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignedObservationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gossip_v1_gossip_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ObservationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gossip_v1_gossip_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignedBatchObservation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gossip_v1_gossip_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignedBatchVAAWithQuorum); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gossip_v1_gossip_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Heartbeat_Network); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_gossip_v1_gossip_proto_msgTypes[0].OneofWrappers = []interface{}{ + (*GossipMessage_SignedObservation)(nil), + (*GossipMessage_SignedHeartbeat)(nil), + (*GossipMessage_SignedVaaWithQuorum)(nil), + (*GossipMessage_SignedObservationRequest)(nil), + (*GossipMessage_SignedBatchObservation)(nil), + (*GossipMessage_SignedBatchVaaWithQuorum)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_gossip_v1_gossip_proto_rawDesc, + NumEnums: 0, + NumMessages: 10, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_gossip_v1_gossip_proto_goTypes, + DependencyIndexes: file_gossip_v1_gossip_proto_depIdxs, + MessageInfos: file_gossip_v1_gossip_proto_msgTypes, + }.Build() + File_gossip_v1_gossip_proto = out.File + file_gossip_v1_gossip_proto_rawDesc = nil + file_gossip_v1_gossip_proto_goTypes = nil + file_gossip_v1_gossip_proto_depIdxs = nil +} diff --git a/offchain-relayer/relay/proto/publicrpc/v1/publicrpc.pb.go b/offchain-relayer/relay/proto/publicrpc/v1/publicrpc.pb.go new file mode 100644 index 0000000..2d89dbd --- /dev/null +++ b/offchain-relayer/relay/proto/publicrpc/v1/publicrpc.pb.go @@ -0,0 +1,1989 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.1 +// protoc (unknown) +// source: publicrpc/v1/publicrpc.proto + +package publicrpcv1 + +import ( + v1 "github.com/certusone/wormhole/node/pkg/proto/gossip/v1" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type ChainID int32 + +const ( + ChainID_CHAIN_ID_UNSPECIFIED ChainID = 0 + ChainID_CHAIN_ID_SOLANA ChainID = 1 + ChainID_CHAIN_ID_ETHEREUM ChainID = 2 + ChainID_CHAIN_ID_TERRA ChainID = 3 + ChainID_CHAIN_ID_BSC ChainID = 4 + ChainID_CHAIN_ID_POLYGON ChainID = 5 + ChainID_CHAIN_ID_AVALANCHE ChainID = 6 + ChainID_CHAIN_ID_OASIS ChainID = 7 + ChainID_CHAIN_ID_ALGORAND ChainID = 8 + ChainID_CHAIN_ID_AURORA ChainID = 9 + ChainID_CHAIN_ID_FANTOM ChainID = 10 + ChainID_CHAIN_ID_KARURA ChainID = 11 + ChainID_CHAIN_ID_ACALA ChainID = 12 + ChainID_CHAIN_ID_KLAYTN ChainID = 13 + ChainID_CHAIN_ID_CELO ChainID = 14 + ChainID_CHAIN_ID_NEAR ChainID = 15 + ChainID_CHAIN_ID_MOONBEAM ChainID = 16 + ChainID_CHAIN_ID_NEON ChainID = 17 + ChainID_CHAIN_ID_TERRA2 ChainID = 18 + ChainID_CHAIN_ID_INJECTIVE ChainID = 19 + ChainID_CHAIN_ID_OSMOSIS ChainID = 20 + ChainID_CHAIN_ID_SUI ChainID = 21 + ChainID_CHAIN_ID_APTOS ChainID = 22 + ChainID_CHAIN_ID_ARBITRUM ChainID = 23 + ChainID_CHAIN_ID_OPTIMISM ChainID = 24 + ChainID_CHAIN_ID_GNOSIS ChainID = 25 + ChainID_CHAIN_ID_PYTHNET ChainID = 26 + // Special case - Eth has two testnets. CHAIN_ID_ETHEREUM is Goerli, + // but we also want to connect to Ropsten, so we add a separate chain. + ChainID_CHAIN_ID_ETHEREUM_ROPSTEN ChainID = 10001 +) + +// Enum value maps for ChainID. +var ( + ChainID_name = map[int32]string{ + 0: "CHAIN_ID_UNSPECIFIED", + 1: "CHAIN_ID_SOLANA", + 2: "CHAIN_ID_ETHEREUM", + 3: "CHAIN_ID_TERRA", + 4: "CHAIN_ID_BSC", + 5: "CHAIN_ID_POLYGON", + 6: "CHAIN_ID_AVALANCHE", + 7: "CHAIN_ID_OASIS", + 8: "CHAIN_ID_ALGORAND", + 9: "CHAIN_ID_AURORA", + 10: "CHAIN_ID_FANTOM", + 11: "CHAIN_ID_KARURA", + 12: "CHAIN_ID_ACALA", + 13: "CHAIN_ID_KLAYTN", + 14: "CHAIN_ID_CELO", + 15: "CHAIN_ID_NEAR", + 16: "CHAIN_ID_MOONBEAM", + 17: "CHAIN_ID_NEON", + 18: "CHAIN_ID_TERRA2", + 19: "CHAIN_ID_INJECTIVE", + 20: "CHAIN_ID_OSMOSIS", + 21: "CHAIN_ID_SUI", + 22: "CHAIN_ID_APTOS", + 23: "CHAIN_ID_ARBITRUM", + 24: "CHAIN_ID_OPTIMISM", + 25: "CHAIN_ID_GNOSIS", + 26: "CHAIN_ID_PYTHNET", + 10001: "CHAIN_ID_ETHEREUM_ROPSTEN", + } + ChainID_value = map[string]int32{ + "CHAIN_ID_UNSPECIFIED": 0, + "CHAIN_ID_SOLANA": 1, + "CHAIN_ID_ETHEREUM": 2, + "CHAIN_ID_TERRA": 3, + "CHAIN_ID_BSC": 4, + "CHAIN_ID_POLYGON": 5, + "CHAIN_ID_AVALANCHE": 6, + "CHAIN_ID_OASIS": 7, + "CHAIN_ID_ALGORAND": 8, + "CHAIN_ID_AURORA": 9, + "CHAIN_ID_FANTOM": 10, + "CHAIN_ID_KARURA": 11, + "CHAIN_ID_ACALA": 12, + "CHAIN_ID_KLAYTN": 13, + "CHAIN_ID_CELO": 14, + "CHAIN_ID_NEAR": 15, + "CHAIN_ID_MOONBEAM": 16, + "CHAIN_ID_NEON": 17, + "CHAIN_ID_TERRA2": 18, + "CHAIN_ID_INJECTIVE": 19, + "CHAIN_ID_OSMOSIS": 20, + "CHAIN_ID_SUI": 21, + "CHAIN_ID_APTOS": 22, + "CHAIN_ID_ARBITRUM": 23, + "CHAIN_ID_OPTIMISM": 24, + "CHAIN_ID_GNOSIS": 25, + "CHAIN_ID_PYTHNET": 26, + "CHAIN_ID_ETHEREUM_ROPSTEN": 10001, + } +) + +func (x ChainID) Enum() *ChainID { + p := new(ChainID) + *p = x + return p +} + +func (x ChainID) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ChainID) Descriptor() protoreflect.EnumDescriptor { + return file_publicrpc_v1_publicrpc_proto_enumTypes[0].Descriptor() +} + +func (ChainID) Type() protoreflect.EnumType { + return &file_publicrpc_v1_publicrpc_proto_enumTypes[0] +} + +func (x ChainID) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ChainID.Descriptor instead. +func (ChainID) EnumDescriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{0} +} + +// MessageID is a VAA's globally unique identifier (see data availability design document). +type MessageID struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Emitter chain ID. + EmitterChain ChainID `protobuf:"varint,1,opt,name=emitter_chain,json=emitterChain,proto3,enum=publicrpc.v1.ChainID" json:"emitter_chain,omitempty"` + // Hex-encoded (without leading 0x) emitter address. + EmitterAddress string `protobuf:"bytes,2,opt,name=emitter_address,json=emitterAddress,proto3" json:"emitter_address,omitempty"` + // Sequence number for (emitter_chain, emitter_address). + Sequence uint64 `protobuf:"varint,3,opt,name=sequence,proto3" json:"sequence,omitempty"` +} + +func (x *MessageID) Reset() { + *x = MessageID{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MessageID) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MessageID) ProtoMessage() {} + +func (x *MessageID) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MessageID.ProtoReflect.Descriptor instead. +func (*MessageID) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{0} +} + +func (x *MessageID) GetEmitterChain() ChainID { + if x != nil { + return x.EmitterChain + } + return ChainID_CHAIN_ID_UNSPECIFIED +} + +func (x *MessageID) GetEmitterAddress() string { + if x != nil { + return x.EmitterAddress + } + return "" +} + +func (x *MessageID) GetSequence() uint64 { + if x != nil { + return x.Sequence + } + return 0 +} + +type BatchID struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Emitter chain ID. + EmitterChain ChainID `protobuf:"varint,1,opt,name=emitter_chain,json=emitterChain,proto3,enum=publicrpc.v1.ChainID" json:"emitter_chain,omitempty"` + // Hex-encoded (without leading 0x) transaction identifier. + TxId string `protobuf:"bytes,2,opt,name=tx_id,json=txId,proto3" json:"tx_id,omitempty"` +} + +func (x *BatchID) Reset() { + *x = BatchID{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchID) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchID) ProtoMessage() {} + +func (x *BatchID) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BatchID.ProtoReflect.Descriptor instead. +func (*BatchID) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{1} +} + +func (x *BatchID) GetEmitterChain() ChainID { + if x != nil { + return x.EmitterChain + } + return ChainID_CHAIN_ID_UNSPECIFIED +} + +func (x *BatchID) GetTxId() string { + if x != nil { + return x.TxId + } + return "" +} + +type GetSignedVAARequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MessageId *MessageID `protobuf:"bytes,1,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"` +} + +func (x *GetSignedVAARequest) Reset() { + *x = GetSignedVAARequest{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSignedVAARequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSignedVAARequest) ProtoMessage() {} + +func (x *GetSignedVAARequest) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSignedVAARequest.ProtoReflect.Descriptor instead. +func (*GetSignedVAARequest) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{2} +} + +func (x *GetSignedVAARequest) GetMessageId() *MessageID { + if x != nil { + return x.MessageId + } + return nil +} + +type GetSignedVAAResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VaaBytes []byte `protobuf:"bytes,1,opt,name=vaa_bytes,json=vaaBytes,proto3" json:"vaa_bytes,omitempty"` +} + +func (x *GetSignedVAAResponse) Reset() { + *x = GetSignedVAAResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSignedVAAResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSignedVAAResponse) ProtoMessage() {} + +func (x *GetSignedVAAResponse) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSignedVAAResponse.ProtoReflect.Descriptor instead. +func (*GetSignedVAAResponse) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{3} +} + +func (x *GetSignedVAAResponse) GetVaaBytes() []byte { + if x != nil { + return x.VaaBytes + } + return nil +} + +type GetSignedBatchVAARequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BatchId *BatchID `protobuf:"bytes,1,opt,name=batch_id,json=batchId,proto3" json:"batch_id,omitempty"` +} + +func (x *GetSignedBatchVAARequest) Reset() { + *x = GetSignedBatchVAARequest{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSignedBatchVAARequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSignedBatchVAARequest) ProtoMessage() {} + +func (x *GetSignedBatchVAARequest) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSignedBatchVAARequest.ProtoReflect.Descriptor instead. +func (*GetSignedBatchVAARequest) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{4} +} + +func (x *GetSignedBatchVAARequest) GetBatchId() *BatchID { + if x != nil { + return x.BatchId + } + return nil +} + +type GetSignedBatchVAAResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BatchVaaBytes []byte `protobuf:"bytes,1,opt,name=batch_vaa_bytes,json=batchVaaBytes,proto3" json:"batch_vaa_bytes,omitempty"` +} + +func (x *GetSignedBatchVAAResponse) Reset() { + *x = GetSignedBatchVAAResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSignedBatchVAAResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSignedBatchVAAResponse) ProtoMessage() {} + +func (x *GetSignedBatchVAAResponse) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSignedBatchVAAResponse.ProtoReflect.Descriptor instead. +func (*GetSignedBatchVAAResponse) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{5} +} + +func (x *GetSignedBatchVAAResponse) GetBatchVaaBytes() []byte { + if x != nil { + return x.BatchVaaBytes + } + return nil +} + +type GetLastHeartbeatsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *GetLastHeartbeatsRequest) Reset() { + *x = GetLastHeartbeatsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetLastHeartbeatsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetLastHeartbeatsRequest) ProtoMessage() {} + +func (x *GetLastHeartbeatsRequest) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetLastHeartbeatsRequest.ProtoReflect.Descriptor instead. +func (*GetLastHeartbeatsRequest) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{6} +} + +type GetLastHeartbeatsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Entries []*GetLastHeartbeatsResponse_Entry `protobuf:"bytes,1,rep,name=entries,proto3" json:"entries,omitempty"` +} + +func (x *GetLastHeartbeatsResponse) Reset() { + *x = GetLastHeartbeatsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetLastHeartbeatsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetLastHeartbeatsResponse) ProtoMessage() {} + +func (x *GetLastHeartbeatsResponse) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetLastHeartbeatsResponse.ProtoReflect.Descriptor instead. +func (*GetLastHeartbeatsResponse) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{7} +} + +func (x *GetLastHeartbeatsResponse) GetEntries() []*GetLastHeartbeatsResponse_Entry { + if x != nil { + return x.Entries + } + return nil +} + +type GetCurrentGuardianSetRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *GetCurrentGuardianSetRequest) Reset() { + *x = GetCurrentGuardianSetRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetCurrentGuardianSetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetCurrentGuardianSetRequest) ProtoMessage() {} + +func (x *GetCurrentGuardianSetRequest) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetCurrentGuardianSetRequest.ProtoReflect.Descriptor instead. +func (*GetCurrentGuardianSetRequest) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{8} +} + +type GetCurrentGuardianSetResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GuardianSet *GuardianSet `protobuf:"bytes,1,opt,name=guardian_set,json=guardianSet,proto3" json:"guardian_set,omitempty"` +} + +func (x *GetCurrentGuardianSetResponse) Reset() { + *x = GetCurrentGuardianSetResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetCurrentGuardianSetResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetCurrentGuardianSetResponse) ProtoMessage() {} + +func (x *GetCurrentGuardianSetResponse) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetCurrentGuardianSetResponse.ProtoReflect.Descriptor instead. +func (*GetCurrentGuardianSetResponse) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{9} +} + +func (x *GetCurrentGuardianSetResponse) GetGuardianSet() *GuardianSet { + if x != nil { + return x.GuardianSet + } + return nil +} + +type GuardianSet struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Guardian set index + Index uint32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` + // List of guardian addresses as human-readable hex-encoded (leading 0x) addresses. + Addresses []string `protobuf:"bytes,2,rep,name=addresses,proto3" json:"addresses,omitempty"` +} + +func (x *GuardianSet) Reset() { + *x = GuardianSet{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GuardianSet) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GuardianSet) ProtoMessage() {} + +func (x *GuardianSet) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GuardianSet.ProtoReflect.Descriptor instead. +func (*GuardianSet) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{10} +} + +func (x *GuardianSet) GetIndex() uint32 { + if x != nil { + return x.Index + } + return 0 +} + +func (x *GuardianSet) GetAddresses() []string { + if x != nil { + return x.Addresses + } + return nil +} + +type GovernorGetAvailableNotionalByChainRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *GovernorGetAvailableNotionalByChainRequest) Reset() { + *x = GovernorGetAvailableNotionalByChainRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GovernorGetAvailableNotionalByChainRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GovernorGetAvailableNotionalByChainRequest) ProtoMessage() {} + +func (x *GovernorGetAvailableNotionalByChainRequest) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GovernorGetAvailableNotionalByChainRequest.ProtoReflect.Descriptor instead. +func (*GovernorGetAvailableNotionalByChainRequest) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{11} +} + +type GovernorGetAvailableNotionalByChainResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // There is an entry for each chain that is being governed. + // Chains that are not being governed are not listed, and assumed to be unlimited. + Entries []*GovernorGetAvailableNotionalByChainResponse_Entry `protobuf:"bytes,1,rep,name=entries,proto3" json:"entries,omitempty"` +} + +func (x *GovernorGetAvailableNotionalByChainResponse) Reset() { + *x = GovernorGetAvailableNotionalByChainResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GovernorGetAvailableNotionalByChainResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GovernorGetAvailableNotionalByChainResponse) ProtoMessage() {} + +func (x *GovernorGetAvailableNotionalByChainResponse) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GovernorGetAvailableNotionalByChainResponse.ProtoReflect.Descriptor instead. +func (*GovernorGetAvailableNotionalByChainResponse) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{12} +} + +func (x *GovernorGetAvailableNotionalByChainResponse) GetEntries() []*GovernorGetAvailableNotionalByChainResponse_Entry { + if x != nil { + return x.Entries + } + return nil +} + +type GovernorGetEnqueuedVAAsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *GovernorGetEnqueuedVAAsRequest) Reset() { + *x = GovernorGetEnqueuedVAAsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GovernorGetEnqueuedVAAsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GovernorGetEnqueuedVAAsRequest) ProtoMessage() {} + +func (x *GovernorGetEnqueuedVAAsRequest) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GovernorGetEnqueuedVAAsRequest.ProtoReflect.Descriptor instead. +func (*GovernorGetEnqueuedVAAsRequest) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{13} +} + +type GovernorGetEnqueuedVAAsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // There is an entry for each enqueued vaa. + Entries []*GovernorGetEnqueuedVAAsResponse_Entry `protobuf:"bytes,1,rep,name=entries,proto3" json:"entries,omitempty"` +} + +func (x *GovernorGetEnqueuedVAAsResponse) Reset() { + *x = GovernorGetEnqueuedVAAsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GovernorGetEnqueuedVAAsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GovernorGetEnqueuedVAAsResponse) ProtoMessage() {} + +func (x *GovernorGetEnqueuedVAAsResponse) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GovernorGetEnqueuedVAAsResponse.ProtoReflect.Descriptor instead. +func (*GovernorGetEnqueuedVAAsResponse) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{14} +} + +func (x *GovernorGetEnqueuedVAAsResponse) GetEntries() []*GovernorGetEnqueuedVAAsResponse_Entry { + if x != nil { + return x.Entries + } + return nil +} + +type GovernorIsVAAEnqueuedRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MessageId *MessageID `protobuf:"bytes,1,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"` +} + +func (x *GovernorIsVAAEnqueuedRequest) Reset() { + *x = GovernorIsVAAEnqueuedRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GovernorIsVAAEnqueuedRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GovernorIsVAAEnqueuedRequest) ProtoMessage() {} + +func (x *GovernorIsVAAEnqueuedRequest) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GovernorIsVAAEnqueuedRequest.ProtoReflect.Descriptor instead. +func (*GovernorIsVAAEnqueuedRequest) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{15} +} + +func (x *GovernorIsVAAEnqueuedRequest) GetMessageId() *MessageID { + if x != nil { + return x.MessageId + } + return nil +} + +type GovernorIsVAAEnqueuedResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + IsEnqueued bool `protobuf:"varint,1,opt,name=is_enqueued,json=isEnqueued,proto3" json:"is_enqueued,omitempty"` +} + +func (x *GovernorIsVAAEnqueuedResponse) Reset() { + *x = GovernorIsVAAEnqueuedResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GovernorIsVAAEnqueuedResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GovernorIsVAAEnqueuedResponse) ProtoMessage() {} + +func (x *GovernorIsVAAEnqueuedResponse) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GovernorIsVAAEnqueuedResponse.ProtoReflect.Descriptor instead. +func (*GovernorIsVAAEnqueuedResponse) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{16} +} + +func (x *GovernorIsVAAEnqueuedResponse) GetIsEnqueued() bool { + if x != nil { + return x.IsEnqueued + } + return false +} + +type GovernorGetTokenListRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *GovernorGetTokenListRequest) Reset() { + *x = GovernorGetTokenListRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GovernorGetTokenListRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GovernorGetTokenListRequest) ProtoMessage() {} + +func (x *GovernorGetTokenListRequest) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GovernorGetTokenListRequest.ProtoReflect.Descriptor instead. +func (*GovernorGetTokenListRequest) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{17} +} + +type GovernorGetTokenListResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // There is an entry for each token that applies to the notional TVL calcuation. + Entries []*GovernorGetTokenListResponse_Entry `protobuf:"bytes,1,rep,name=entries,proto3" json:"entries,omitempty"` +} + +func (x *GovernorGetTokenListResponse) Reset() { + *x = GovernorGetTokenListResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GovernorGetTokenListResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GovernorGetTokenListResponse) ProtoMessage() {} + +func (x *GovernorGetTokenListResponse) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GovernorGetTokenListResponse.ProtoReflect.Descriptor instead. +func (*GovernorGetTokenListResponse) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{18} +} + +func (x *GovernorGetTokenListResponse) GetEntries() []*GovernorGetTokenListResponse_Entry { + if x != nil { + return x.Entries + } + return nil +} + +type GetLastHeartbeatsResponse_Entry struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Verified, hex-encoded (with leading 0x) guardian address. This is the guardian address + // which signed this heartbeat. The GuardianAddr field inside the heartbeat + // is NOT verified - remote nodes can put arbitrary data in it. + VerifiedGuardianAddr string `protobuf:"bytes,1,opt,name=verified_guardian_addr,json=verifiedGuardianAddr,proto3" json:"verified_guardian_addr,omitempty"` + // Base58-encoded libp2p node address that sent this heartbeat, used to + // distinguish between multiple nodes running for the same guardian. + P2PNodeAddr string `protobuf:"bytes,2,opt,name=p2p_node_addr,json=p2pNodeAddr,proto3" json:"p2p_node_addr,omitempty"` + // Raw heartbeat received from the network. Data is only as trusted + // as the guardian node that sent it - none of the fields are verified. + RawHeartbeat *v1.Heartbeat `protobuf:"bytes,3,opt,name=raw_heartbeat,json=rawHeartbeat,proto3" json:"raw_heartbeat,omitempty"` +} + +func (x *GetLastHeartbeatsResponse_Entry) Reset() { + *x = GetLastHeartbeatsResponse_Entry{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetLastHeartbeatsResponse_Entry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetLastHeartbeatsResponse_Entry) ProtoMessage() {} + +func (x *GetLastHeartbeatsResponse_Entry) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetLastHeartbeatsResponse_Entry.ProtoReflect.Descriptor instead. +func (*GetLastHeartbeatsResponse_Entry) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{7, 0} +} + +func (x *GetLastHeartbeatsResponse_Entry) GetVerifiedGuardianAddr() string { + if x != nil { + return x.VerifiedGuardianAddr + } + return "" +} + +func (x *GetLastHeartbeatsResponse_Entry) GetP2PNodeAddr() string { + if x != nil { + return x.P2PNodeAddr + } + return "" +} + +func (x *GetLastHeartbeatsResponse_Entry) GetRawHeartbeat() *v1.Heartbeat { + if x != nil { + return x.RawHeartbeat + } + return nil +} + +type GovernorGetAvailableNotionalByChainResponse_Entry struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ChainId uint32 `protobuf:"varint,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + RemainingAvailableNotional uint64 `protobuf:"varint,2,opt,name=remaining_available_notional,json=remainingAvailableNotional,proto3" json:"remaining_available_notional,omitempty"` + NotionalLimit uint64 `protobuf:"varint,3,opt,name=notional_limit,json=notionalLimit,proto3" json:"notional_limit,omitempty"` + BigTransactionSize uint64 `protobuf:"varint,4,opt,name=big_transaction_size,json=bigTransactionSize,proto3" json:"big_transaction_size,omitempty"` +} + +func (x *GovernorGetAvailableNotionalByChainResponse_Entry) Reset() { + *x = GovernorGetAvailableNotionalByChainResponse_Entry{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GovernorGetAvailableNotionalByChainResponse_Entry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GovernorGetAvailableNotionalByChainResponse_Entry) ProtoMessage() {} + +func (x *GovernorGetAvailableNotionalByChainResponse_Entry) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GovernorGetAvailableNotionalByChainResponse_Entry.ProtoReflect.Descriptor instead. +func (*GovernorGetAvailableNotionalByChainResponse_Entry) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{12, 0} +} + +func (x *GovernorGetAvailableNotionalByChainResponse_Entry) GetChainId() uint32 { + if x != nil { + return x.ChainId + } + return 0 +} + +func (x *GovernorGetAvailableNotionalByChainResponse_Entry) GetRemainingAvailableNotional() uint64 { + if x != nil { + return x.RemainingAvailableNotional + } + return 0 +} + +func (x *GovernorGetAvailableNotionalByChainResponse_Entry) GetNotionalLimit() uint64 { + if x != nil { + return x.NotionalLimit + } + return 0 +} + +func (x *GovernorGetAvailableNotionalByChainResponse_Entry) GetBigTransactionSize() uint64 { + if x != nil { + return x.BigTransactionSize + } + return 0 +} + +type GovernorGetEnqueuedVAAsResponse_Entry struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EmitterChain uint32 `protobuf:"varint,1,opt,name=emitter_chain,json=emitterChain,proto3" json:"emitter_chain,omitempty"` + EmitterAddress string `protobuf:"bytes,2,opt,name=emitter_address,json=emitterAddress,proto3" json:"emitter_address,omitempty"` // human-readable hex-encoded (leading 0x) + Sequence uint64 `protobuf:"varint,3,opt,name=sequence,proto3" json:"sequence,omitempty"` + ReleaseTime uint32 `protobuf:"varint,4,opt,name=release_time,json=releaseTime,proto3" json:"release_time,omitempty"` + NotionalValue uint64 `protobuf:"varint,5,opt,name=notional_value,json=notionalValue,proto3" json:"notional_value,omitempty"` + TxHash string `protobuf:"bytes,6,opt,name=tx_hash,json=txHash,proto3" json:"tx_hash,omitempty"` +} + +func (x *GovernorGetEnqueuedVAAsResponse_Entry) Reset() { + *x = GovernorGetEnqueuedVAAsResponse_Entry{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GovernorGetEnqueuedVAAsResponse_Entry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GovernorGetEnqueuedVAAsResponse_Entry) ProtoMessage() {} + +func (x *GovernorGetEnqueuedVAAsResponse_Entry) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GovernorGetEnqueuedVAAsResponse_Entry.ProtoReflect.Descriptor instead. +func (*GovernorGetEnqueuedVAAsResponse_Entry) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{14, 0} +} + +func (x *GovernorGetEnqueuedVAAsResponse_Entry) GetEmitterChain() uint32 { + if x != nil { + return x.EmitterChain + } + return 0 +} + +func (x *GovernorGetEnqueuedVAAsResponse_Entry) GetEmitterAddress() string { + if x != nil { + return x.EmitterAddress + } + return "" +} + +func (x *GovernorGetEnqueuedVAAsResponse_Entry) GetSequence() uint64 { + if x != nil { + return x.Sequence + } + return 0 +} + +func (x *GovernorGetEnqueuedVAAsResponse_Entry) GetReleaseTime() uint32 { + if x != nil { + return x.ReleaseTime + } + return 0 +} + +func (x *GovernorGetEnqueuedVAAsResponse_Entry) GetNotionalValue() uint64 { + if x != nil { + return x.NotionalValue + } + return 0 +} + +func (x *GovernorGetEnqueuedVAAsResponse_Entry) GetTxHash() string { + if x != nil { + return x.TxHash + } + return "" +} + +type GovernorGetTokenListResponse_Entry struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OriginChainId uint32 `protobuf:"varint,1,opt,name=origin_chain_id,json=originChainId,proto3" json:"origin_chain_id,omitempty"` + OriginAddress string `protobuf:"bytes,2,opt,name=origin_address,json=originAddress,proto3" json:"origin_address,omitempty"` // human-readable hex-encoded (leading 0x) + Price float32 `protobuf:"fixed32,3,opt,name=price,proto3" json:"price,omitempty"` +} + +func (x *GovernorGetTokenListResponse_Entry) Reset() { + *x = GovernorGetTokenListResponse_Entry{} + if protoimpl.UnsafeEnabled { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GovernorGetTokenListResponse_Entry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GovernorGetTokenListResponse_Entry) ProtoMessage() {} + +func (x *GovernorGetTokenListResponse_Entry) ProtoReflect() protoreflect.Message { + mi := &file_publicrpc_v1_publicrpc_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GovernorGetTokenListResponse_Entry.ProtoReflect.Descriptor instead. +func (*GovernorGetTokenListResponse_Entry) Descriptor() ([]byte, []int) { + return file_publicrpc_v1_publicrpc_proto_rawDescGZIP(), []int{18, 0} +} + +func (x *GovernorGetTokenListResponse_Entry) GetOriginChainId() uint32 { + if x != nil { + return x.OriginChainId + } + return 0 +} + +func (x *GovernorGetTokenListResponse_Entry) GetOriginAddress() string { + if x != nil { + return x.OriginAddress + } + return "" +} + +func (x *GovernorGetTokenListResponse_Entry) GetPrice() float32 { + if x != nil { + return x.Price + } + return 0 +} + +var File_publicrpc_v1_publicrpc_proto protoreflect.FileDescriptor + +var file_publicrpc_v1_publicrpc_proto_rawDesc = []byte{ + 0x0a, 0x1c, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x72, 0x70, 0x63, 0x2f, 0x76, 0x31, 0x2f, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x72, 0x70, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x31, 0x1a, 0x16, 0x67, 0x6f, + 0x73, 0x73, 0x69, 0x70, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0x8c, 0x01, 0x0a, 0x09, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x44, + 0x12, 0x3a, 0x0a, 0x0d, 0x65, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x72, 0x70, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x44, 0x52, 0x0c, + 0x65, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x0f, + 0x65, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x65, 0x22, 0x5a, 0x0a, 0x07, 0x42, 0x61, 0x74, 0x63, 0x68, 0x49, 0x44, 0x12, 0x3a, 0x0a, 0x0d, + 0x65, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x72, 0x70, 0x63, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x44, 0x52, 0x0c, 0x65, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x72, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x78, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x22, 0x4d, 0x0a, + 0x13, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x41, 0x41, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, + 0x44, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x22, 0x33, 0x0a, 0x14, + 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x41, 0x41, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x61, 0x61, 0x5f, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x76, 0x61, 0x61, 0x42, 0x79, 0x74, 0x65, + 0x73, 0x22, 0x4c, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x61, + 0x74, 0x63, 0x68, 0x56, 0x41, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, + 0x08, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x49, 0x44, 0x52, 0x07, 0x62, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x22, + 0x43, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x56, 0x41, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x0f, + 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x76, 0x61, 0x61, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x62, 0x61, 0x74, 0x63, 0x68, 0x56, 0x61, 0x61, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x22, 0x1a, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x48, + 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x83, 0x02, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, + 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, + 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2d, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, + 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x1a, 0x9c, 0x01, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x34, 0x0a, 0x16, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x67, 0x75, + 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x14, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x47, 0x75, 0x61, 0x72, 0x64, + 0x69, 0x61, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x70, 0x32, 0x70, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x70, 0x32, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x39, 0x0a, 0x0d, 0x72, + 0x61, 0x77, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x48, + 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x52, 0x0c, 0x72, 0x61, 0x77, 0x48, 0x65, 0x61, + 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x22, 0x1e, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x53, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5d, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x53, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x67, 0x75, 0x61, 0x72, 0x64, + 0x69, 0x61, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x75, 0x61, + 0x72, 0x64, 0x69, 0x61, 0x6e, 0x53, 0x65, 0x74, 0x52, 0x0b, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, + 0x61, 0x6e, 0x53, 0x65, 0x74, 0x22, 0x41, 0x0a, 0x0b, 0x47, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, + 0x6e, 0x53, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x2c, 0x0a, 0x2a, 0x47, 0x6f, 0x76, 0x65, + 0x72, 0x6e, 0x6f, 0x72, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x42, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xc8, 0x02, 0x0a, 0x2b, 0x47, 0x6f, 0x76, 0x65, 0x72, + 0x6e, 0x6f, 0x72, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4e, + 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x42, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x59, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x72, 0x70, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x47, + 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x42, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x1a, 0xbd, 0x01, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x1c, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, + 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x6f, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1a, 0x72, 0x65, + 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x6f, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0d, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, + 0x30, 0x0a, 0x14, 0x62, 0x69, 0x67, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x62, + 0x69, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x69, 0x7a, + 0x65, 0x22, 0x20, 0x0a, 0x1e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x56, 0x41, 0x41, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0xc7, 0x02, 0x0a, 0x1f, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x56, 0x41, 0x41, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x56, 0x41, 0x41, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x1a, 0xd4, 0x01, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x65, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, + 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x65, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, + 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x25, 0x0a, + 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x22, 0x56, 0x0a, + 0x1c, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x49, 0x73, 0x56, 0x41, 0x41, 0x45, 0x6e, + 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, + 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x31, + 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x44, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x49, 0x64, 0x22, 0x40, 0x0a, 0x1d, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, + 0x72, 0x49, 0x73, 0x56, 0x41, 0x41, 0x45, 0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x71, + 0x75, 0x65, 0x75, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x45, + 0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x22, 0x1d, 0x0a, 0x1b, 0x47, 0x6f, 0x76, 0x65, 0x72, + 0x6e, 0x6f, 0x72, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xd8, 0x01, 0x0a, 0x1c, 0x47, 0x6f, 0x76, 0x65, 0x72, + 0x6e, 0x6f, 0x72, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, + 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x1a, 0x6c, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0f, + 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x72, + 0x69, 0x67, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x2a, 0xe8, 0x04, 0x0a, 0x07, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x44, 0x12, 0x18, 0x0a, + 0x14, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x49, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x48, 0x41, 0x49, 0x4e, + 0x5f, 0x49, 0x44, 0x5f, 0x53, 0x4f, 0x4c, 0x41, 0x4e, 0x41, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, + 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x49, 0x44, 0x5f, 0x45, 0x54, 0x48, 0x45, 0x52, 0x45, 0x55, + 0x4d, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x49, 0x44, 0x5f, + 0x54, 0x45, 0x52, 0x52, 0x41, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x48, 0x41, 0x49, 0x4e, + 0x5f, 0x49, 0x44, 0x5f, 0x42, 0x53, 0x43, 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x48, 0x41, + 0x49, 0x4e, 0x5f, 0x49, 0x44, 0x5f, 0x50, 0x4f, 0x4c, 0x59, 0x47, 0x4f, 0x4e, 0x10, 0x05, 0x12, + 0x16, 0x0a, 0x12, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x49, 0x44, 0x5f, 0x41, 0x56, 0x41, 0x4c, + 0x41, 0x4e, 0x43, 0x48, 0x45, 0x10, 0x06, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x48, 0x41, 0x49, 0x4e, + 0x5f, 0x49, 0x44, 0x5f, 0x4f, 0x41, 0x53, 0x49, 0x53, 0x10, 0x07, 0x12, 0x15, 0x0a, 0x11, 0x43, + 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x49, 0x44, 0x5f, 0x41, 0x4c, 0x47, 0x4f, 0x52, 0x41, 0x4e, 0x44, + 0x10, 0x08, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x49, 0x44, 0x5f, 0x41, + 0x55, 0x52, 0x4f, 0x52, 0x41, 0x10, 0x09, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x48, 0x41, 0x49, 0x4e, + 0x5f, 0x49, 0x44, 0x5f, 0x46, 0x41, 0x4e, 0x54, 0x4f, 0x4d, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, + 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x49, 0x44, 0x5f, 0x4b, 0x41, 0x52, 0x55, 0x52, 0x41, 0x10, + 0x0b, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x49, 0x44, 0x5f, 0x41, 0x43, + 0x41, 0x4c, 0x41, 0x10, 0x0c, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x49, + 0x44, 0x5f, 0x4b, 0x4c, 0x41, 0x59, 0x54, 0x4e, 0x10, 0x0d, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x48, + 0x41, 0x49, 0x4e, 0x5f, 0x49, 0x44, 0x5f, 0x43, 0x45, 0x4c, 0x4f, 0x10, 0x0e, 0x12, 0x11, 0x0a, + 0x0d, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x49, 0x44, 0x5f, 0x4e, 0x45, 0x41, 0x52, 0x10, 0x0f, + 0x12, 0x15, 0x0a, 0x11, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x49, 0x44, 0x5f, 0x4d, 0x4f, 0x4f, + 0x4e, 0x42, 0x45, 0x41, 0x4d, 0x10, 0x10, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x48, 0x41, 0x49, 0x4e, + 0x5f, 0x49, 0x44, 0x5f, 0x4e, 0x45, 0x4f, 0x4e, 0x10, 0x11, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x48, + 0x41, 0x49, 0x4e, 0x5f, 0x49, 0x44, 0x5f, 0x54, 0x45, 0x52, 0x52, 0x41, 0x32, 0x10, 0x12, 0x12, + 0x16, 0x0a, 0x12, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x49, 0x44, 0x5f, 0x49, 0x4e, 0x4a, 0x45, + 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x13, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x48, 0x41, 0x49, 0x4e, + 0x5f, 0x49, 0x44, 0x5f, 0x4f, 0x53, 0x4d, 0x4f, 0x53, 0x49, 0x53, 0x10, 0x14, 0x12, 0x10, 0x0a, + 0x0c, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x49, 0x44, 0x5f, 0x53, 0x55, 0x49, 0x10, 0x15, 0x12, + 0x12, 0x0a, 0x0e, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x49, 0x44, 0x5f, 0x41, 0x50, 0x54, 0x4f, + 0x53, 0x10, 0x16, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x49, 0x44, 0x5f, + 0x41, 0x52, 0x42, 0x49, 0x54, 0x52, 0x55, 0x4d, 0x10, 0x17, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x48, + 0x41, 0x49, 0x4e, 0x5f, 0x49, 0x44, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x53, 0x4d, 0x10, + 0x18, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x49, 0x44, 0x5f, 0x47, 0x4e, + 0x4f, 0x53, 0x49, 0x53, 0x10, 0x19, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, + 0x49, 0x44, 0x5f, 0x50, 0x59, 0x54, 0x48, 0x4e, 0x45, 0x54, 0x10, 0x1a, 0x12, 0x1e, 0x0a, 0x19, + 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x49, 0x44, 0x5f, 0x45, 0x54, 0x48, 0x45, 0x52, 0x45, 0x55, + 0x4d, 0x5f, 0x52, 0x4f, 0x50, 0x53, 0x54, 0x45, 0x4e, 0x10, 0x91, 0x4e, 0x32, 0xf5, 0x0a, 0x0a, + 0x10, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x52, 0x50, 0x43, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x7c, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, + 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x72, + 0x70, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, + 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, + 0x0e, 0x2f, 0x76, 0x31, 0x2f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x12, + 0xbb, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x41, 0x41, + 0x12, 0x21, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x41, 0x41, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x72, 0x70, 0x63, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x41, 0x41, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x64, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5e, 0x12, + 0x5c, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x61, 0x2f, + 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x2e, 0x65, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x72, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x7d, 0x2f, 0x7b, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x2f, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x5f, 0x69, 0x64, 0x2e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x7d, 0x12, 0xac, 0x01, + 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x56, 0x41, 0x41, 0x12, 0x26, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x72, 0x70, 0x63, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x56, 0x41, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x42, 0x61, 0x74, 0x63, 0x68, 0x56, 0x41, 0x41, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, 0x2f, 0x76, + 0x31, 0x2f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x76, + 0x61, 0x61, 0x2f, 0x7b, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x2e, 0x65, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x7d, 0x2f, 0x7b, 0x62, 0x61, 0x74, + 0x63, 0x68, 0x5f, 0x69, 0x64, 0x2e, 0x74, 0x78, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x91, 0x01, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, + 0x69, 0x61, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x2a, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x72, + 0x70, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x47, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x72, 0x70, 0x63, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x47, 0x75, 0x61, 0x72, + 0x64, 0x69, 0x61, 0x6e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x75, 0x61, + 0x72, 0x64, 0x69, 0x61, 0x6e, 0x73, 0x65, 0x74, 0x2f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x12, 0xcc, 0x01, 0x0a, 0x23, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x47, 0x65, 0x74, + 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x42, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x38, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, + 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x42, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x72, 0x70, 0x63, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x42, 0x79, + 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x6f, 0x76, 0x65, 0x72, + 0x6e, 0x6f, 0x72, 0x2f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x6f, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x12, + 0x9a, 0x01, 0x0a, 0x17, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x56, 0x41, 0x41, 0x73, 0x12, 0x2c, 0x2e, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, + 0x6e, 0x6f, 0x72, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x56, 0x41, + 0x41, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, + 0x72, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x56, 0x41, 0x41, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, + 0x12, 0x1a, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x2f, 0x65, + 0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x61, 0x73, 0x12, 0xe4, 0x01, 0x0a, + 0x15, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x49, 0x73, 0x56, 0x41, 0x41, 0x45, 0x6e, + 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x12, 0x2a, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x72, + 0x70, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x49, 0x73, + 0x56, 0x41, 0x41, 0x45, 0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x72, 0x70, 0x63, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x49, 0x73, 0x56, 0x41, 0x41, 0x45, + 0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x72, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x6c, 0x12, 0x6a, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x6f, 0x76, + 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x2f, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x61, 0x5f, 0x65, 0x6e, 0x71, + 0x75, 0x65, 0x75, 0x65, 0x64, 0x2f, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, + 0x64, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x7d, + 0x2f, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x2e, 0x65, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x2f, 0x7b, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x2e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x65, 0x7d, 0x12, 0x8e, 0x01, 0x0a, 0x14, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, + 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x29, 0x2e, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6f, 0x76, 0x65, + 0x72, 0x6e, 0x6f, 0x72, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x72, 0x70, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x47, + 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x76, 0x31, + 0x2f, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, + 0x6c, 0x69, 0x73, 0x74, 0x42, 0x47, 0x5a, 0x45, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x75, 0x73, 0x6f, 0x6e, 0x65, 0x2f, 0x77, 0x6f, 0x72, + 0x6d, 0x68, 0x6f, 0x6c, 0x65, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x72, 0x70, 0x63, 0x2f, 0x76, + 0x31, 0x3b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x72, 0x70, 0x63, 0x76, 0x31, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_publicrpc_v1_publicrpc_proto_rawDescOnce sync.Once + file_publicrpc_v1_publicrpc_proto_rawDescData = file_publicrpc_v1_publicrpc_proto_rawDesc +) + +func file_publicrpc_v1_publicrpc_proto_rawDescGZIP() []byte { + file_publicrpc_v1_publicrpc_proto_rawDescOnce.Do(func() { + file_publicrpc_v1_publicrpc_proto_rawDescData = protoimpl.X.CompressGZIP(file_publicrpc_v1_publicrpc_proto_rawDescData) + }) + return file_publicrpc_v1_publicrpc_proto_rawDescData +} + +var file_publicrpc_v1_publicrpc_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_publicrpc_v1_publicrpc_proto_msgTypes = make([]protoimpl.MessageInfo, 23) +var file_publicrpc_v1_publicrpc_proto_goTypes = []interface{}{ + (ChainID)(0), // 0: publicrpc.v1.ChainID + (*MessageID)(nil), // 1: publicrpc.v1.MessageID + (*BatchID)(nil), // 2: publicrpc.v1.BatchID + (*GetSignedVAARequest)(nil), // 3: publicrpc.v1.GetSignedVAARequest + (*GetSignedVAAResponse)(nil), // 4: publicrpc.v1.GetSignedVAAResponse + (*GetSignedBatchVAARequest)(nil), // 5: publicrpc.v1.GetSignedBatchVAARequest + (*GetSignedBatchVAAResponse)(nil), // 6: publicrpc.v1.GetSignedBatchVAAResponse + (*GetLastHeartbeatsRequest)(nil), // 7: publicrpc.v1.GetLastHeartbeatsRequest + (*GetLastHeartbeatsResponse)(nil), // 8: publicrpc.v1.GetLastHeartbeatsResponse + (*GetCurrentGuardianSetRequest)(nil), // 9: publicrpc.v1.GetCurrentGuardianSetRequest + (*GetCurrentGuardianSetResponse)(nil), // 10: publicrpc.v1.GetCurrentGuardianSetResponse + (*GuardianSet)(nil), // 11: publicrpc.v1.GuardianSet + (*GovernorGetAvailableNotionalByChainRequest)(nil), // 12: publicrpc.v1.GovernorGetAvailableNotionalByChainRequest + (*GovernorGetAvailableNotionalByChainResponse)(nil), // 13: publicrpc.v1.GovernorGetAvailableNotionalByChainResponse + (*GovernorGetEnqueuedVAAsRequest)(nil), // 14: publicrpc.v1.GovernorGetEnqueuedVAAsRequest + (*GovernorGetEnqueuedVAAsResponse)(nil), // 15: publicrpc.v1.GovernorGetEnqueuedVAAsResponse + (*GovernorIsVAAEnqueuedRequest)(nil), // 16: publicrpc.v1.GovernorIsVAAEnqueuedRequest + (*GovernorIsVAAEnqueuedResponse)(nil), // 17: publicrpc.v1.GovernorIsVAAEnqueuedResponse + (*GovernorGetTokenListRequest)(nil), // 18: publicrpc.v1.GovernorGetTokenListRequest + (*GovernorGetTokenListResponse)(nil), // 19: publicrpc.v1.GovernorGetTokenListResponse + (*GetLastHeartbeatsResponse_Entry)(nil), // 20: publicrpc.v1.GetLastHeartbeatsResponse.Entry + (*GovernorGetAvailableNotionalByChainResponse_Entry)(nil), // 21: publicrpc.v1.GovernorGetAvailableNotionalByChainResponse.Entry + (*GovernorGetEnqueuedVAAsResponse_Entry)(nil), // 22: publicrpc.v1.GovernorGetEnqueuedVAAsResponse.Entry + (*GovernorGetTokenListResponse_Entry)(nil), // 23: publicrpc.v1.GovernorGetTokenListResponse.Entry + (*v1.Heartbeat)(nil), // 24: gossip.v1.Heartbeat +} +var file_publicrpc_v1_publicrpc_proto_depIdxs = []int32{ + 0, // 0: publicrpc.v1.MessageID.emitter_chain:type_name -> publicrpc.v1.ChainID + 0, // 1: publicrpc.v1.BatchID.emitter_chain:type_name -> publicrpc.v1.ChainID + 1, // 2: publicrpc.v1.GetSignedVAARequest.message_id:type_name -> publicrpc.v1.MessageID + 2, // 3: publicrpc.v1.GetSignedBatchVAARequest.batch_id:type_name -> publicrpc.v1.BatchID + 20, // 4: publicrpc.v1.GetLastHeartbeatsResponse.entries:type_name -> publicrpc.v1.GetLastHeartbeatsResponse.Entry + 11, // 5: publicrpc.v1.GetCurrentGuardianSetResponse.guardian_set:type_name -> publicrpc.v1.GuardianSet + 21, // 6: publicrpc.v1.GovernorGetAvailableNotionalByChainResponse.entries:type_name -> publicrpc.v1.GovernorGetAvailableNotionalByChainResponse.Entry + 22, // 7: publicrpc.v1.GovernorGetEnqueuedVAAsResponse.entries:type_name -> publicrpc.v1.GovernorGetEnqueuedVAAsResponse.Entry + 1, // 8: publicrpc.v1.GovernorIsVAAEnqueuedRequest.message_id:type_name -> publicrpc.v1.MessageID + 23, // 9: publicrpc.v1.GovernorGetTokenListResponse.entries:type_name -> publicrpc.v1.GovernorGetTokenListResponse.Entry + 24, // 10: publicrpc.v1.GetLastHeartbeatsResponse.Entry.raw_heartbeat:type_name -> gossip.v1.Heartbeat + 7, // 11: publicrpc.v1.PublicRPCService.GetLastHeartbeats:input_type -> publicrpc.v1.GetLastHeartbeatsRequest + 3, // 12: publicrpc.v1.PublicRPCService.GetSignedVAA:input_type -> publicrpc.v1.GetSignedVAARequest + 5, // 13: publicrpc.v1.PublicRPCService.GetSignedBatchVAA:input_type -> publicrpc.v1.GetSignedBatchVAARequest + 9, // 14: publicrpc.v1.PublicRPCService.GetCurrentGuardianSet:input_type -> publicrpc.v1.GetCurrentGuardianSetRequest + 12, // 15: publicrpc.v1.PublicRPCService.GovernorGetAvailableNotionalByChain:input_type -> publicrpc.v1.GovernorGetAvailableNotionalByChainRequest + 14, // 16: publicrpc.v1.PublicRPCService.GovernorGetEnqueuedVAAs:input_type -> publicrpc.v1.GovernorGetEnqueuedVAAsRequest + 16, // 17: publicrpc.v1.PublicRPCService.GovernorIsVAAEnqueued:input_type -> publicrpc.v1.GovernorIsVAAEnqueuedRequest + 18, // 18: publicrpc.v1.PublicRPCService.GovernorGetTokenList:input_type -> publicrpc.v1.GovernorGetTokenListRequest + 8, // 19: publicrpc.v1.PublicRPCService.GetLastHeartbeats:output_type -> publicrpc.v1.GetLastHeartbeatsResponse + 4, // 20: publicrpc.v1.PublicRPCService.GetSignedVAA:output_type -> publicrpc.v1.GetSignedVAAResponse + 6, // 21: publicrpc.v1.PublicRPCService.GetSignedBatchVAA:output_type -> publicrpc.v1.GetSignedBatchVAAResponse + 10, // 22: publicrpc.v1.PublicRPCService.GetCurrentGuardianSet:output_type -> publicrpc.v1.GetCurrentGuardianSetResponse + 13, // 23: publicrpc.v1.PublicRPCService.GovernorGetAvailableNotionalByChain:output_type -> publicrpc.v1.GovernorGetAvailableNotionalByChainResponse + 15, // 24: publicrpc.v1.PublicRPCService.GovernorGetEnqueuedVAAs:output_type -> publicrpc.v1.GovernorGetEnqueuedVAAsResponse + 17, // 25: publicrpc.v1.PublicRPCService.GovernorIsVAAEnqueued:output_type -> publicrpc.v1.GovernorIsVAAEnqueuedResponse + 19, // 26: publicrpc.v1.PublicRPCService.GovernorGetTokenList:output_type -> publicrpc.v1.GovernorGetTokenListResponse + 19, // [19:27] is the sub-list for method output_type + 11, // [11:19] is the sub-list for method input_type + 11, // [11:11] is the sub-list for extension type_name + 11, // [11:11] is the sub-list for extension extendee + 0, // [0:11] is the sub-list for field type_name +} + +func init() { file_publicrpc_v1_publicrpc_proto_init() } +func file_publicrpc_v1_publicrpc_proto_init() { + if File_publicrpc_v1_publicrpc_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_publicrpc_v1_publicrpc_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MessageID); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_publicrpc_v1_publicrpc_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchID); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_publicrpc_v1_publicrpc_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSignedVAARequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_publicrpc_v1_publicrpc_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSignedVAAResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_publicrpc_v1_publicrpc_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSignedBatchVAARequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_publicrpc_v1_publicrpc_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSignedBatchVAAResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_publicrpc_v1_publicrpc_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLastHeartbeatsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_publicrpc_v1_publicrpc_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLastHeartbeatsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_publicrpc_v1_publicrpc_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetCurrentGuardianSetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_publicrpc_v1_publicrpc_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetCurrentGuardianSetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_publicrpc_v1_publicrpc_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GuardianSet); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_publicrpc_v1_publicrpc_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GovernorGetAvailableNotionalByChainRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_publicrpc_v1_publicrpc_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GovernorGetAvailableNotionalByChainResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_publicrpc_v1_publicrpc_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GovernorGetEnqueuedVAAsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_publicrpc_v1_publicrpc_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GovernorGetEnqueuedVAAsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_publicrpc_v1_publicrpc_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GovernorIsVAAEnqueuedRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_publicrpc_v1_publicrpc_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GovernorIsVAAEnqueuedResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_publicrpc_v1_publicrpc_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GovernorGetTokenListRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_publicrpc_v1_publicrpc_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GovernorGetTokenListResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_publicrpc_v1_publicrpc_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLastHeartbeatsResponse_Entry); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_publicrpc_v1_publicrpc_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GovernorGetAvailableNotionalByChainResponse_Entry); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_publicrpc_v1_publicrpc_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GovernorGetEnqueuedVAAsResponse_Entry); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_publicrpc_v1_publicrpc_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GovernorGetTokenListResponse_Entry); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_publicrpc_v1_publicrpc_proto_rawDesc, + NumEnums: 1, + NumMessages: 23, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_publicrpc_v1_publicrpc_proto_goTypes, + DependencyIndexes: file_publicrpc_v1_publicrpc_proto_depIdxs, + EnumInfos: file_publicrpc_v1_publicrpc_proto_enumTypes, + MessageInfos: file_publicrpc_v1_publicrpc_proto_msgTypes, + }.Build() + File_publicrpc_v1_publicrpc_proto = out.File + file_publicrpc_v1_publicrpc_proto_rawDesc = nil + file_publicrpc_v1_publicrpc_proto_goTypes = nil + file_publicrpc_v1_publicrpc_proto_depIdxs = nil +} diff --git a/offchain-relayer/relay/proto/publicrpc/v1/publicrpc.pb.gw.go b/offchain-relayer/relay/proto/publicrpc/v1/publicrpc.pb.gw.go new file mode 100644 index 0000000..e2e57a4 --- /dev/null +++ b/offchain-relayer/relay/proto/publicrpc/v1/publicrpc.pb.gw.go @@ -0,0 +1,910 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: publicrpc/v1/publicrpc.proto + +/* +Package publicrpcv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package publicrpcv1 + +import ( + "context" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = metadata.Join + +func request_PublicRPCService_GetLastHeartbeats_0(ctx context.Context, marshaler runtime.Marshaler, client PublicRPCServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetLastHeartbeatsRequest + var metadata runtime.ServerMetadata + + msg, err := client.GetLastHeartbeats(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_PublicRPCService_GetLastHeartbeats_0(ctx context.Context, marshaler runtime.Marshaler, server PublicRPCServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetLastHeartbeatsRequest + var metadata runtime.ServerMetadata + + msg, err := server.GetLastHeartbeats(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_PublicRPCService_GetSignedVAA_0 = &utilities.DoubleArray{Encoding: map[string]int{"message_id": 0, "emitter_chain": 1, "emitter_address": 2, "sequence": 3}, Base: []int{1, 1, 1, 2, 3, 0, 0, 0}, Check: []int{0, 1, 2, 2, 2, 3, 4, 5}} +) + +func request_PublicRPCService_GetSignedVAA_0(ctx context.Context, marshaler runtime.Marshaler, client PublicRPCServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetSignedVAARequest + var metadata runtime.ServerMetadata + + var ( + val string + e int32 + ok bool + err error + _ = err + ) + + val, ok = pathParams["message_id.emitter_chain"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "message_id.emitter_chain") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "message_id.emitter_chain", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "message_id.emitter_chain", err) + } + + e, err = runtime.Enum(val, ChainID_value) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "could not parse path as enum value, parameter: %s, error: %v", "message_id.emitter_chain", err) + } + + protoReq.MessageId.EmitterChain = ChainID(e) + + val, ok = pathParams["message_id.emitter_address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "message_id.emitter_address") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "message_id.emitter_address", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "message_id.emitter_address", err) + } + + val, ok = pathParams["message_id.sequence"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "message_id.sequence") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "message_id.sequence", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "message_id.sequence", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PublicRPCService_GetSignedVAA_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.GetSignedVAA(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_PublicRPCService_GetSignedVAA_0(ctx context.Context, marshaler runtime.Marshaler, server PublicRPCServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetSignedVAARequest + var metadata runtime.ServerMetadata + + var ( + val string + e int32 + ok bool + err error + _ = err + ) + + val, ok = pathParams["message_id.emitter_chain"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "message_id.emitter_chain") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "message_id.emitter_chain", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "message_id.emitter_chain", err) + } + + e, err = runtime.Enum(val, ChainID_value) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "could not parse path as enum value, parameter: %s, error: %v", "message_id.emitter_chain", err) + } + + protoReq.MessageId.EmitterChain = ChainID(e) + + val, ok = pathParams["message_id.emitter_address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "message_id.emitter_address") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "message_id.emitter_address", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "message_id.emitter_address", err) + } + + val, ok = pathParams["message_id.sequence"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "message_id.sequence") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "message_id.sequence", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "message_id.sequence", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PublicRPCService_GetSignedVAA_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.GetSignedVAA(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_PublicRPCService_GetSignedBatchVAA_0 = &utilities.DoubleArray{Encoding: map[string]int{"batch_id": 0, "emitter_chain": 1, "tx_id": 2}, Base: []int{1, 1, 1, 2, 0, 0}, Check: []int{0, 1, 2, 2, 3, 4}} +) + +func request_PublicRPCService_GetSignedBatchVAA_0(ctx context.Context, marshaler runtime.Marshaler, client PublicRPCServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetSignedBatchVAARequest + var metadata runtime.ServerMetadata + + var ( + val string + e int32 + ok bool + err error + _ = err + ) + + val, ok = pathParams["batch_id.emitter_chain"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "batch_id.emitter_chain") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "batch_id.emitter_chain", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "batch_id.emitter_chain", err) + } + + e, err = runtime.Enum(val, ChainID_value) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "could not parse path as enum value, parameter: %s, error: %v", "batch_id.emitter_chain", err) + } + + protoReq.BatchId.EmitterChain = ChainID(e) + + val, ok = pathParams["batch_id.tx_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "batch_id.tx_id") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "batch_id.tx_id", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "batch_id.tx_id", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PublicRPCService_GetSignedBatchVAA_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.GetSignedBatchVAA(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_PublicRPCService_GetSignedBatchVAA_0(ctx context.Context, marshaler runtime.Marshaler, server PublicRPCServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetSignedBatchVAARequest + var metadata runtime.ServerMetadata + + var ( + val string + e int32 + ok bool + err error + _ = err + ) + + val, ok = pathParams["batch_id.emitter_chain"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "batch_id.emitter_chain") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "batch_id.emitter_chain", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "batch_id.emitter_chain", err) + } + + e, err = runtime.Enum(val, ChainID_value) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "could not parse path as enum value, parameter: %s, error: %v", "batch_id.emitter_chain", err) + } + + protoReq.BatchId.EmitterChain = ChainID(e) + + val, ok = pathParams["batch_id.tx_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "batch_id.tx_id") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "batch_id.tx_id", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "batch_id.tx_id", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PublicRPCService_GetSignedBatchVAA_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.GetSignedBatchVAA(ctx, &protoReq) + return msg, metadata, err + +} + +func request_PublicRPCService_GetCurrentGuardianSet_0(ctx context.Context, marshaler runtime.Marshaler, client PublicRPCServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetCurrentGuardianSetRequest + var metadata runtime.ServerMetadata + + msg, err := client.GetCurrentGuardianSet(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_PublicRPCService_GetCurrentGuardianSet_0(ctx context.Context, marshaler runtime.Marshaler, server PublicRPCServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetCurrentGuardianSetRequest + var metadata runtime.ServerMetadata + + msg, err := server.GetCurrentGuardianSet(ctx, &protoReq) + return msg, metadata, err + +} + +func request_PublicRPCService_GovernorGetAvailableNotionalByChain_0(ctx context.Context, marshaler runtime.Marshaler, client PublicRPCServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GovernorGetAvailableNotionalByChainRequest + var metadata runtime.ServerMetadata + + msg, err := client.GovernorGetAvailableNotionalByChain(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_PublicRPCService_GovernorGetAvailableNotionalByChain_0(ctx context.Context, marshaler runtime.Marshaler, server PublicRPCServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GovernorGetAvailableNotionalByChainRequest + var metadata runtime.ServerMetadata + + msg, err := server.GovernorGetAvailableNotionalByChain(ctx, &protoReq) + return msg, metadata, err + +} + +func request_PublicRPCService_GovernorGetEnqueuedVAAs_0(ctx context.Context, marshaler runtime.Marshaler, client PublicRPCServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GovernorGetEnqueuedVAAsRequest + var metadata runtime.ServerMetadata + + msg, err := client.GovernorGetEnqueuedVAAs(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_PublicRPCService_GovernorGetEnqueuedVAAs_0(ctx context.Context, marshaler runtime.Marshaler, server PublicRPCServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GovernorGetEnqueuedVAAsRequest + var metadata runtime.ServerMetadata + + msg, err := server.GovernorGetEnqueuedVAAs(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_PublicRPCService_GovernorIsVAAEnqueued_0 = &utilities.DoubleArray{Encoding: map[string]int{"message_id": 0, "emitter_chain": 1, "emitter_address": 2, "sequence": 3}, Base: []int{1, 1, 1, 2, 3, 0, 0, 0}, Check: []int{0, 1, 2, 2, 2, 3, 4, 5}} +) + +func request_PublicRPCService_GovernorIsVAAEnqueued_0(ctx context.Context, marshaler runtime.Marshaler, client PublicRPCServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GovernorIsVAAEnqueuedRequest + var metadata runtime.ServerMetadata + + var ( + val string + e int32 + ok bool + err error + _ = err + ) + + val, ok = pathParams["message_id.emitter_chain"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "message_id.emitter_chain") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "message_id.emitter_chain", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "message_id.emitter_chain", err) + } + + e, err = runtime.Enum(val, ChainID_value) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "could not parse path as enum value, parameter: %s, error: %v", "message_id.emitter_chain", err) + } + + protoReq.MessageId.EmitterChain = ChainID(e) + + val, ok = pathParams["message_id.emitter_address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "message_id.emitter_address") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "message_id.emitter_address", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "message_id.emitter_address", err) + } + + val, ok = pathParams["message_id.sequence"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "message_id.sequence") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "message_id.sequence", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "message_id.sequence", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PublicRPCService_GovernorIsVAAEnqueued_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.GovernorIsVAAEnqueued(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_PublicRPCService_GovernorIsVAAEnqueued_0(ctx context.Context, marshaler runtime.Marshaler, server PublicRPCServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GovernorIsVAAEnqueuedRequest + var metadata runtime.ServerMetadata + + var ( + val string + e int32 + ok bool + err error + _ = err + ) + + val, ok = pathParams["message_id.emitter_chain"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "message_id.emitter_chain") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "message_id.emitter_chain", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "message_id.emitter_chain", err) + } + + e, err = runtime.Enum(val, ChainID_value) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "could not parse path as enum value, parameter: %s, error: %v", "message_id.emitter_chain", err) + } + + protoReq.MessageId.EmitterChain = ChainID(e) + + val, ok = pathParams["message_id.emitter_address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "message_id.emitter_address") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "message_id.emitter_address", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "message_id.emitter_address", err) + } + + val, ok = pathParams["message_id.sequence"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "message_id.sequence") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "message_id.sequence", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "message_id.sequence", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PublicRPCService_GovernorIsVAAEnqueued_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.GovernorIsVAAEnqueued(ctx, &protoReq) + return msg, metadata, err + +} + +func request_PublicRPCService_GovernorGetTokenList_0(ctx context.Context, marshaler runtime.Marshaler, client PublicRPCServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GovernorGetTokenListRequest + var metadata runtime.ServerMetadata + + msg, err := client.GovernorGetTokenList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_PublicRPCService_GovernorGetTokenList_0(ctx context.Context, marshaler runtime.Marshaler, server PublicRPCServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GovernorGetTokenListRequest + var metadata runtime.ServerMetadata + + msg, err := server.GovernorGetTokenList(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterPublicRPCServiceHandlerServer registers the http handlers for service PublicRPCService to "mux". +// UnaryRPC :call PublicRPCServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterPublicRPCServiceHandlerFromEndpoint instead. +func RegisterPublicRPCServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server PublicRPCServiceServer) error { + + mux.Handle("GET", pattern_PublicRPCService_GetLastHeartbeats_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/publicrpc.v1.PublicRPCService/GetLastHeartbeats", runtime.WithHTTPPathPattern("/v1/heartbeats")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_PublicRPCService_GetLastHeartbeats_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_PublicRPCService_GetLastHeartbeats_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_PublicRPCService_GetSignedVAA_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/publicrpc.v1.PublicRPCService/GetSignedVAA", runtime.WithHTTPPathPattern("/v1/signed_vaa/{message_id.emitter_chain}/{message_id.emitter_address}/{message_id.sequence}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_PublicRPCService_GetSignedVAA_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_PublicRPCService_GetSignedVAA_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_PublicRPCService_GetSignedBatchVAA_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/publicrpc.v1.PublicRPCService/GetSignedBatchVAA", runtime.WithHTTPPathPattern("/v1/signed_batch_vaa/{batch_id.emitter_chain}/{batch_id.tx_id}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_PublicRPCService_GetSignedBatchVAA_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_PublicRPCService_GetSignedBatchVAA_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_PublicRPCService_GetCurrentGuardianSet_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/publicrpc.v1.PublicRPCService/GetCurrentGuardianSet", runtime.WithHTTPPathPattern("/v1/guardianset/current")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_PublicRPCService_GetCurrentGuardianSet_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_PublicRPCService_GetCurrentGuardianSet_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_PublicRPCService_GovernorGetAvailableNotionalByChain_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/publicrpc.v1.PublicRPCService/GovernorGetAvailableNotionalByChain", runtime.WithHTTPPathPattern("/v1/governor/available_notional_by_chain")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_PublicRPCService_GovernorGetAvailableNotionalByChain_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_PublicRPCService_GovernorGetAvailableNotionalByChain_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_PublicRPCService_GovernorGetEnqueuedVAAs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/publicrpc.v1.PublicRPCService/GovernorGetEnqueuedVAAs", runtime.WithHTTPPathPattern("/v1/governor/enqueued_vaas")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_PublicRPCService_GovernorGetEnqueuedVAAs_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_PublicRPCService_GovernorGetEnqueuedVAAs_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_PublicRPCService_GovernorIsVAAEnqueued_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/publicrpc.v1.PublicRPCService/GovernorIsVAAEnqueued", runtime.WithHTTPPathPattern("/v1/governor/is_vaa_enqueued/{message_id.emitter_chain}/{message_id.emitter_address}/{message_id.sequence}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_PublicRPCService_GovernorIsVAAEnqueued_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_PublicRPCService_GovernorIsVAAEnqueued_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_PublicRPCService_GovernorGetTokenList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/publicrpc.v1.PublicRPCService/GovernorGetTokenList", runtime.WithHTTPPathPattern("/v1/governor/token_list")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_PublicRPCService_GovernorGetTokenList_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_PublicRPCService_GovernorGetTokenList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterPublicRPCServiceHandlerFromEndpoint is same as RegisterPublicRPCServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterPublicRPCServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterPublicRPCServiceHandler(ctx, mux, conn) +} + +// RegisterPublicRPCServiceHandler registers the http handlers for service PublicRPCService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterPublicRPCServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterPublicRPCServiceHandlerClient(ctx, mux, NewPublicRPCServiceClient(conn)) +} + +// RegisterPublicRPCServiceHandlerClient registers the http handlers for service PublicRPCService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "PublicRPCServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "PublicRPCServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "PublicRPCServiceClient" to call the correct interceptors. +func RegisterPublicRPCServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client PublicRPCServiceClient) error { + + mux.Handle("GET", pattern_PublicRPCService_GetLastHeartbeats_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req, "/publicrpc.v1.PublicRPCService/GetLastHeartbeats", runtime.WithHTTPPathPattern("/v1/heartbeats")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_PublicRPCService_GetLastHeartbeats_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_PublicRPCService_GetLastHeartbeats_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_PublicRPCService_GetSignedVAA_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req, "/publicrpc.v1.PublicRPCService/GetSignedVAA", runtime.WithHTTPPathPattern("/v1/signed_vaa/{message_id.emitter_chain}/{message_id.emitter_address}/{message_id.sequence}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_PublicRPCService_GetSignedVAA_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_PublicRPCService_GetSignedVAA_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_PublicRPCService_GetSignedBatchVAA_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req, "/publicrpc.v1.PublicRPCService/GetSignedBatchVAA", runtime.WithHTTPPathPattern("/v1/signed_batch_vaa/{batch_id.emitter_chain}/{batch_id.tx_id}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_PublicRPCService_GetSignedBatchVAA_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_PublicRPCService_GetSignedBatchVAA_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_PublicRPCService_GetCurrentGuardianSet_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req, "/publicrpc.v1.PublicRPCService/GetCurrentGuardianSet", runtime.WithHTTPPathPattern("/v1/guardianset/current")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_PublicRPCService_GetCurrentGuardianSet_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_PublicRPCService_GetCurrentGuardianSet_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_PublicRPCService_GovernorGetAvailableNotionalByChain_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req, "/publicrpc.v1.PublicRPCService/GovernorGetAvailableNotionalByChain", runtime.WithHTTPPathPattern("/v1/governor/available_notional_by_chain")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_PublicRPCService_GovernorGetAvailableNotionalByChain_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_PublicRPCService_GovernorGetAvailableNotionalByChain_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_PublicRPCService_GovernorGetEnqueuedVAAs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req, "/publicrpc.v1.PublicRPCService/GovernorGetEnqueuedVAAs", runtime.WithHTTPPathPattern("/v1/governor/enqueued_vaas")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_PublicRPCService_GovernorGetEnqueuedVAAs_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_PublicRPCService_GovernorGetEnqueuedVAAs_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_PublicRPCService_GovernorIsVAAEnqueued_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req, "/publicrpc.v1.PublicRPCService/GovernorIsVAAEnqueued", runtime.WithHTTPPathPattern("/v1/governor/is_vaa_enqueued/{message_id.emitter_chain}/{message_id.emitter_address}/{message_id.sequence}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_PublicRPCService_GovernorIsVAAEnqueued_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_PublicRPCService_GovernorIsVAAEnqueued_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_PublicRPCService_GovernorGetTokenList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req, "/publicrpc.v1.PublicRPCService/GovernorGetTokenList", runtime.WithHTTPPathPattern("/v1/governor/token_list")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_PublicRPCService_GovernorGetTokenList_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_PublicRPCService_GovernorGetTokenList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_PublicRPCService_GetLastHeartbeats_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "heartbeats"}, "")) + + pattern_PublicRPCService_GetSignedVAA_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4}, []string{"v1", "signed_vaa", "message_id.emitter_chain", "message_id.emitter_address", "message_id.sequence"}, "")) + + pattern_PublicRPCService_GetSignedBatchVAA_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "signed_batch_vaa", "batch_id.emitter_chain", "batch_id.tx_id"}, "")) + + pattern_PublicRPCService_GetCurrentGuardianSet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "guardianset", "current"}, "")) + + pattern_PublicRPCService_GovernorGetAvailableNotionalByChain_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "governor", "available_notional_by_chain"}, "")) + + pattern_PublicRPCService_GovernorGetEnqueuedVAAs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "governor", "enqueued_vaas"}, "")) + + pattern_PublicRPCService_GovernorIsVAAEnqueued_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4, 1, 0, 4, 1, 5, 5}, []string{"v1", "governor", "is_vaa_enqueued", "message_id.emitter_chain", "message_id.emitter_address", "message_id.sequence"}, "")) + + pattern_PublicRPCService_GovernorGetTokenList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "governor", "token_list"}, "")) +) + +var ( + forward_PublicRPCService_GetLastHeartbeats_0 = runtime.ForwardResponseMessage + + forward_PublicRPCService_GetSignedVAA_0 = runtime.ForwardResponseMessage + + forward_PublicRPCService_GetSignedBatchVAA_0 = runtime.ForwardResponseMessage + + forward_PublicRPCService_GetCurrentGuardianSet_0 = runtime.ForwardResponseMessage + + forward_PublicRPCService_GovernorGetAvailableNotionalByChain_0 = runtime.ForwardResponseMessage + + forward_PublicRPCService_GovernorGetEnqueuedVAAs_0 = runtime.ForwardResponseMessage + + forward_PublicRPCService_GovernorIsVAAEnqueued_0 = runtime.ForwardResponseMessage + + forward_PublicRPCService_GovernorGetTokenList_0 = runtime.ForwardResponseMessage +) diff --git a/offchain-relayer/relay/proto/publicrpc/v1/publicrpc_grpc.pb.go b/offchain-relayer/relay/proto/publicrpc/v1/publicrpc_grpc.pb.go new file mode 100644 index 0000000..bb5abe2 --- /dev/null +++ b/offchain-relayer/relay/proto/publicrpc/v1/publicrpc_grpc.pb.go @@ -0,0 +1,359 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package publicrpcv1 + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// PublicRPCServiceClient is the client API for PublicRPCService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type PublicRPCServiceClient interface { + // GetLastHeartbeats returns the last heartbeat received for each guardian node in the + // node's active guardian set. Heartbeats received by nodes not in the guardian set are ignored. + // The heartbeat value is null if no heartbeat has yet been received. + GetLastHeartbeats(ctx context.Context, in *GetLastHeartbeatsRequest, opts ...grpc.CallOption) (*GetLastHeartbeatsResponse, error) + GetSignedVAA(ctx context.Context, in *GetSignedVAARequest, opts ...grpc.CallOption) (*GetSignedVAAResponse, error) + GetSignedBatchVAA(ctx context.Context, in *GetSignedBatchVAARequest, opts ...grpc.CallOption) (*GetSignedBatchVAAResponse, error) + GetCurrentGuardianSet(ctx context.Context, in *GetCurrentGuardianSetRequest, opts ...grpc.CallOption) (*GetCurrentGuardianSetResponse, error) + GovernorGetAvailableNotionalByChain(ctx context.Context, in *GovernorGetAvailableNotionalByChainRequest, opts ...grpc.CallOption) (*GovernorGetAvailableNotionalByChainResponse, error) + GovernorGetEnqueuedVAAs(ctx context.Context, in *GovernorGetEnqueuedVAAsRequest, opts ...grpc.CallOption) (*GovernorGetEnqueuedVAAsResponse, error) + GovernorIsVAAEnqueued(ctx context.Context, in *GovernorIsVAAEnqueuedRequest, opts ...grpc.CallOption) (*GovernorIsVAAEnqueuedResponse, error) + GovernorGetTokenList(ctx context.Context, in *GovernorGetTokenListRequest, opts ...grpc.CallOption) (*GovernorGetTokenListResponse, error) +} + +type publicRPCServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewPublicRPCServiceClient(cc grpc.ClientConnInterface) PublicRPCServiceClient { + return &publicRPCServiceClient{cc} +} + +func (c *publicRPCServiceClient) GetLastHeartbeats(ctx context.Context, in *GetLastHeartbeatsRequest, opts ...grpc.CallOption) (*GetLastHeartbeatsResponse, error) { + out := new(GetLastHeartbeatsResponse) + err := c.cc.Invoke(ctx, "/publicrpc.v1.PublicRPCService/GetLastHeartbeats", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *publicRPCServiceClient) GetSignedVAA(ctx context.Context, in *GetSignedVAARequest, opts ...grpc.CallOption) (*GetSignedVAAResponse, error) { + out := new(GetSignedVAAResponse) + err := c.cc.Invoke(ctx, "/publicrpc.v1.PublicRPCService/GetSignedVAA", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *publicRPCServiceClient) GetSignedBatchVAA(ctx context.Context, in *GetSignedBatchVAARequest, opts ...grpc.CallOption) (*GetSignedBatchVAAResponse, error) { + out := new(GetSignedBatchVAAResponse) + err := c.cc.Invoke(ctx, "/publicrpc.v1.PublicRPCService/GetSignedBatchVAA", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *publicRPCServiceClient) GetCurrentGuardianSet(ctx context.Context, in *GetCurrentGuardianSetRequest, opts ...grpc.CallOption) (*GetCurrentGuardianSetResponse, error) { + out := new(GetCurrentGuardianSetResponse) + err := c.cc.Invoke(ctx, "/publicrpc.v1.PublicRPCService/GetCurrentGuardianSet", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *publicRPCServiceClient) GovernorGetAvailableNotionalByChain(ctx context.Context, in *GovernorGetAvailableNotionalByChainRequest, opts ...grpc.CallOption) (*GovernorGetAvailableNotionalByChainResponse, error) { + out := new(GovernorGetAvailableNotionalByChainResponse) + err := c.cc.Invoke(ctx, "/publicrpc.v1.PublicRPCService/GovernorGetAvailableNotionalByChain", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *publicRPCServiceClient) GovernorGetEnqueuedVAAs(ctx context.Context, in *GovernorGetEnqueuedVAAsRequest, opts ...grpc.CallOption) (*GovernorGetEnqueuedVAAsResponse, error) { + out := new(GovernorGetEnqueuedVAAsResponse) + err := c.cc.Invoke(ctx, "/publicrpc.v1.PublicRPCService/GovernorGetEnqueuedVAAs", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *publicRPCServiceClient) GovernorIsVAAEnqueued(ctx context.Context, in *GovernorIsVAAEnqueuedRequest, opts ...grpc.CallOption) (*GovernorIsVAAEnqueuedResponse, error) { + out := new(GovernorIsVAAEnqueuedResponse) + err := c.cc.Invoke(ctx, "/publicrpc.v1.PublicRPCService/GovernorIsVAAEnqueued", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *publicRPCServiceClient) GovernorGetTokenList(ctx context.Context, in *GovernorGetTokenListRequest, opts ...grpc.CallOption) (*GovernorGetTokenListResponse, error) { + out := new(GovernorGetTokenListResponse) + err := c.cc.Invoke(ctx, "/publicrpc.v1.PublicRPCService/GovernorGetTokenList", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// PublicRPCServiceServer is the server API for PublicRPCService service. +// All implementations must embed UnimplementedPublicRPCServiceServer +// for forward compatibility +type PublicRPCServiceServer interface { + // GetLastHeartbeats returns the last heartbeat received for each guardian node in the + // node's active guardian set. Heartbeats received by nodes not in the guardian set are ignored. + // The heartbeat value is null if no heartbeat has yet been received. + GetLastHeartbeats(context.Context, *GetLastHeartbeatsRequest) (*GetLastHeartbeatsResponse, error) + GetSignedVAA(context.Context, *GetSignedVAARequest) (*GetSignedVAAResponse, error) + GetSignedBatchVAA(context.Context, *GetSignedBatchVAARequest) (*GetSignedBatchVAAResponse, error) + GetCurrentGuardianSet(context.Context, *GetCurrentGuardianSetRequest) (*GetCurrentGuardianSetResponse, error) + GovernorGetAvailableNotionalByChain(context.Context, *GovernorGetAvailableNotionalByChainRequest) (*GovernorGetAvailableNotionalByChainResponse, error) + GovernorGetEnqueuedVAAs(context.Context, *GovernorGetEnqueuedVAAsRequest) (*GovernorGetEnqueuedVAAsResponse, error) + GovernorIsVAAEnqueued(context.Context, *GovernorIsVAAEnqueuedRequest) (*GovernorIsVAAEnqueuedResponse, error) + GovernorGetTokenList(context.Context, *GovernorGetTokenListRequest) (*GovernorGetTokenListResponse, error) + mustEmbedUnimplementedPublicRPCServiceServer() +} + +// UnimplementedPublicRPCServiceServer must be embedded to have forward compatible implementations. +type UnimplementedPublicRPCServiceServer struct { +} + +func (UnimplementedPublicRPCServiceServer) GetLastHeartbeats(context.Context, *GetLastHeartbeatsRequest) (*GetLastHeartbeatsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetLastHeartbeats not implemented") +} +func (UnimplementedPublicRPCServiceServer) GetSignedVAA(context.Context, *GetSignedVAARequest) (*GetSignedVAAResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetSignedVAA not implemented") +} +func (UnimplementedPublicRPCServiceServer) GetSignedBatchVAA(context.Context, *GetSignedBatchVAARequest) (*GetSignedBatchVAAResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetSignedBatchVAA not implemented") +} +func (UnimplementedPublicRPCServiceServer) GetCurrentGuardianSet(context.Context, *GetCurrentGuardianSetRequest) (*GetCurrentGuardianSetResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetCurrentGuardianSet not implemented") +} +func (UnimplementedPublicRPCServiceServer) GovernorGetAvailableNotionalByChain(context.Context, *GovernorGetAvailableNotionalByChainRequest) (*GovernorGetAvailableNotionalByChainResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GovernorGetAvailableNotionalByChain not implemented") +} +func (UnimplementedPublicRPCServiceServer) GovernorGetEnqueuedVAAs(context.Context, *GovernorGetEnqueuedVAAsRequest) (*GovernorGetEnqueuedVAAsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GovernorGetEnqueuedVAAs not implemented") +} +func (UnimplementedPublicRPCServiceServer) GovernorIsVAAEnqueued(context.Context, *GovernorIsVAAEnqueuedRequest) (*GovernorIsVAAEnqueuedResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GovernorIsVAAEnqueued not implemented") +} +func (UnimplementedPublicRPCServiceServer) GovernorGetTokenList(context.Context, *GovernorGetTokenListRequest) (*GovernorGetTokenListResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GovernorGetTokenList not implemented") +} +func (UnimplementedPublicRPCServiceServer) mustEmbedUnimplementedPublicRPCServiceServer() {} + +// UnsafePublicRPCServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to PublicRPCServiceServer will +// result in compilation errors. +type UnsafePublicRPCServiceServer interface { + mustEmbedUnimplementedPublicRPCServiceServer() +} + +func RegisterPublicRPCServiceServer(s grpc.ServiceRegistrar, srv PublicRPCServiceServer) { + s.RegisterService(&PublicRPCService_ServiceDesc, srv) +} + +func _PublicRPCService_GetLastHeartbeats_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetLastHeartbeatsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(PublicRPCServiceServer).GetLastHeartbeats(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/publicrpc.v1.PublicRPCService/GetLastHeartbeats", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(PublicRPCServiceServer).GetLastHeartbeats(ctx, req.(*GetLastHeartbeatsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _PublicRPCService_GetSignedVAA_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetSignedVAARequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(PublicRPCServiceServer).GetSignedVAA(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/publicrpc.v1.PublicRPCService/GetSignedVAA", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(PublicRPCServiceServer).GetSignedVAA(ctx, req.(*GetSignedVAARequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _PublicRPCService_GetSignedBatchVAA_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetSignedBatchVAARequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(PublicRPCServiceServer).GetSignedBatchVAA(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/publicrpc.v1.PublicRPCService/GetSignedBatchVAA", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(PublicRPCServiceServer).GetSignedBatchVAA(ctx, req.(*GetSignedBatchVAARequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _PublicRPCService_GetCurrentGuardianSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetCurrentGuardianSetRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(PublicRPCServiceServer).GetCurrentGuardianSet(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/publicrpc.v1.PublicRPCService/GetCurrentGuardianSet", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(PublicRPCServiceServer).GetCurrentGuardianSet(ctx, req.(*GetCurrentGuardianSetRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _PublicRPCService_GovernorGetAvailableNotionalByChain_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GovernorGetAvailableNotionalByChainRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(PublicRPCServiceServer).GovernorGetAvailableNotionalByChain(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/publicrpc.v1.PublicRPCService/GovernorGetAvailableNotionalByChain", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(PublicRPCServiceServer).GovernorGetAvailableNotionalByChain(ctx, req.(*GovernorGetAvailableNotionalByChainRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _PublicRPCService_GovernorGetEnqueuedVAAs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GovernorGetEnqueuedVAAsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(PublicRPCServiceServer).GovernorGetEnqueuedVAAs(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/publicrpc.v1.PublicRPCService/GovernorGetEnqueuedVAAs", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(PublicRPCServiceServer).GovernorGetEnqueuedVAAs(ctx, req.(*GovernorGetEnqueuedVAAsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _PublicRPCService_GovernorIsVAAEnqueued_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GovernorIsVAAEnqueuedRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(PublicRPCServiceServer).GovernorIsVAAEnqueued(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/publicrpc.v1.PublicRPCService/GovernorIsVAAEnqueued", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(PublicRPCServiceServer).GovernorIsVAAEnqueued(ctx, req.(*GovernorIsVAAEnqueuedRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _PublicRPCService_GovernorGetTokenList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GovernorGetTokenListRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(PublicRPCServiceServer).GovernorGetTokenList(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/publicrpc.v1.PublicRPCService/GovernorGetTokenList", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(PublicRPCServiceServer).GovernorGetTokenList(ctx, req.(*GovernorGetTokenListRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// PublicRPCService_ServiceDesc is the grpc.ServiceDesc for PublicRPCService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var PublicRPCService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "publicrpc.v1.PublicRPCService", + HandlerType: (*PublicRPCServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetLastHeartbeats", + Handler: _PublicRPCService_GetLastHeartbeats_Handler, + }, + { + MethodName: "GetSignedVAA", + Handler: _PublicRPCService_GetSignedVAA_Handler, + }, + { + MethodName: "GetSignedBatchVAA", + Handler: _PublicRPCService_GetSignedBatchVAA_Handler, + }, + { + MethodName: "GetCurrentGuardianSet", + Handler: _PublicRPCService_GetCurrentGuardianSet_Handler, + }, + { + MethodName: "GovernorGetAvailableNotionalByChain", + Handler: _PublicRPCService_GovernorGetAvailableNotionalByChain_Handler, + }, + { + MethodName: "GovernorGetEnqueuedVAAs", + Handler: _PublicRPCService_GovernorGetEnqueuedVAAs_Handler, + }, + { + MethodName: "GovernorIsVAAEnqueued", + Handler: _PublicRPCService_GovernorIsVAAEnqueued_Handler, + }, + { + MethodName: "GovernorGetTokenList", + Handler: _PublicRPCService_GovernorGetTokenList_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "publicrpc/v1/publicrpc.proto", +} diff --git a/offchain-relayer/relay/proto/spy/v1/spy.pb.go b/offchain-relayer/relay/proto/spy/v1/spy.pb.go new file mode 100644 index 0000000..532d2c6 --- /dev/null +++ b/offchain-relayer/relay/proto/spy/v1/spy.pb.go @@ -0,0 +1,400 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.1 +// protoc (unknown) +// source: spy/v1/spy.proto + +package spyv1 + +import ( + v1 "github.com/certusone/generic-relayer/offchain-relayer/relay/proto/publicrpc/v1" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// A MessageFilter represents an exact match for an emitter. +type EmitterFilter struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Source chain + ChainId v1.ChainID `protobuf:"varint,1,opt,name=chain_id,json=chainId,proto3,enum=publicrpc.v1.ChainID" json:"chain_id,omitempty"` + // Hex-encoded (without leading 0x) emitter address. + EmitterAddress string `protobuf:"bytes,2,opt,name=emitter_address,json=emitterAddress,proto3" json:"emitter_address,omitempty"` +} + +func (x *EmitterFilter) Reset() { + *x = EmitterFilter{} + if protoimpl.UnsafeEnabled { + mi := &file_spy_v1_spy_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EmitterFilter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EmitterFilter) ProtoMessage() {} + +func (x *EmitterFilter) ProtoReflect() protoreflect.Message { + mi := &file_spy_v1_spy_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EmitterFilter.ProtoReflect.Descriptor instead. +func (*EmitterFilter) Descriptor() ([]byte, []int) { + return file_spy_v1_spy_proto_rawDescGZIP(), []int{0} +} + +func (x *EmitterFilter) GetChainId() v1.ChainID { + if x != nil { + return x.ChainId + } + return v1.ChainID(0) +} + +func (x *EmitterFilter) GetEmitterAddress() string { + if x != nil { + return x.EmitterAddress + } + return "" +} + +type FilterEntry struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Filter: + // *FilterEntry_EmitterFilter + Filter isFilterEntry_Filter `protobuf_oneof:"filter"` +} + +func (x *FilterEntry) Reset() { + *x = FilterEntry{} + if protoimpl.UnsafeEnabled { + mi := &file_spy_v1_spy_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FilterEntry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FilterEntry) ProtoMessage() {} + +func (x *FilterEntry) ProtoReflect() protoreflect.Message { + mi := &file_spy_v1_spy_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FilterEntry.ProtoReflect.Descriptor instead. +func (*FilterEntry) Descriptor() ([]byte, []int) { + return file_spy_v1_spy_proto_rawDescGZIP(), []int{1} +} + +func (m *FilterEntry) GetFilter() isFilterEntry_Filter { + if m != nil { + return m.Filter + } + return nil +} + +func (x *FilterEntry) GetEmitterFilter() *EmitterFilter { + if x, ok := x.GetFilter().(*FilterEntry_EmitterFilter); ok { + return x.EmitterFilter + } + return nil +} + +type isFilterEntry_Filter interface { + isFilterEntry_Filter() +} + +type FilterEntry_EmitterFilter struct { + EmitterFilter *EmitterFilter `protobuf:"bytes,1,opt,name=emitter_filter,json=emitterFilter,proto3,oneof"` +} + +func (*FilterEntry_EmitterFilter) isFilterEntry_Filter() {} + +type SubscribeSignedVAARequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // List of filters to apply to the stream (OR). + // If empty, all messages are streamed. + Filters []*FilterEntry `protobuf:"bytes,1,rep,name=filters,proto3" json:"filters,omitempty"` +} + +func (x *SubscribeSignedVAARequest) Reset() { + *x = SubscribeSignedVAARequest{} + if protoimpl.UnsafeEnabled { + mi := &file_spy_v1_spy_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SubscribeSignedVAARequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubscribeSignedVAARequest) ProtoMessage() {} + +func (x *SubscribeSignedVAARequest) ProtoReflect() protoreflect.Message { + mi := &file_spy_v1_spy_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SubscribeSignedVAARequest.ProtoReflect.Descriptor instead. +func (*SubscribeSignedVAARequest) Descriptor() ([]byte, []int) { + return file_spy_v1_spy_proto_rawDescGZIP(), []int{2} +} + +func (x *SubscribeSignedVAARequest) GetFilters() []*FilterEntry { + if x != nil { + return x.Filters + } + return nil +} + +type SubscribeSignedVAAResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Raw VAA bytes + VaaBytes []byte `protobuf:"bytes,1,opt,name=vaa_bytes,json=vaaBytes,proto3" json:"vaa_bytes,omitempty"` +} + +func (x *SubscribeSignedVAAResponse) Reset() { + *x = SubscribeSignedVAAResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_spy_v1_spy_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SubscribeSignedVAAResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubscribeSignedVAAResponse) ProtoMessage() {} + +func (x *SubscribeSignedVAAResponse) ProtoReflect() protoreflect.Message { + mi := &file_spy_v1_spy_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SubscribeSignedVAAResponse.ProtoReflect.Descriptor instead. +func (*SubscribeSignedVAAResponse) Descriptor() ([]byte, []int) { + return file_spy_v1_spy_proto_rawDescGZIP(), []int{3} +} + +func (x *SubscribeSignedVAAResponse) GetVaaBytes() []byte { + if x != nil { + return x.VaaBytes + } + return nil +} + +var File_spy_v1_spy_proto protoreflect.FileDescriptor + +var file_spy_v1_spy_proto_rawDesc = []byte{ + 0x0a, 0x10, 0x73, 0x70, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x70, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x06, 0x73, 0x70, 0x79, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x72, 0x70, 0x63, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x72, 0x70, 0x63, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6a, 0x0a, 0x0d, 0x45, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x44, + 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x65, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x22, 0x57, 0x0a, 0x0b, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x3e, 0x0a, 0x0e, 0x65, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x5f, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x73, 0x70, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x48, 0x00, 0x52, 0x0d, 0x65, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x42, 0x08, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x4a, 0x0a, 0x19, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x41, + 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, 0x70, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x22, 0x39, 0x0a, 0x1a, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x41, 0x41, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x61, 0x61, 0x5f, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x76, 0x61, 0x61, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x32, 0x94, 0x01, 0x0a, 0x0d, 0x53, 0x70, 0x79, 0x52, 0x50, 0x43, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x12, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x41, 0x41, 0x12, 0x21, 0x2e, 0x73, 0x70, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x56, 0x41, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x73, 0x70, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x41, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x18, 0x2f, 0x76, 0x31, 0x3a, + 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, + 0x5f, 0x76, 0x61, 0x61, 0x3a, 0x01, 0x2a, 0x30, 0x01, 0x42, 0x3b, 0x5a, 0x39, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x75, 0x73, 0x6f, 0x6e, + 0x65, 0x2f, 0x77, 0x6f, 0x72, 0x6d, 0x68, 0x6f, 0x6c, 0x65, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2f, + 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x70, 0x79, 0x2f, 0x76, 0x31, + 0x3b, 0x73, 0x70, 0x79, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_spy_v1_spy_proto_rawDescOnce sync.Once + file_spy_v1_spy_proto_rawDescData = file_spy_v1_spy_proto_rawDesc +) + +func file_spy_v1_spy_proto_rawDescGZIP() []byte { + file_spy_v1_spy_proto_rawDescOnce.Do(func() { + file_spy_v1_spy_proto_rawDescData = protoimpl.X.CompressGZIP(file_spy_v1_spy_proto_rawDescData) + }) + return file_spy_v1_spy_proto_rawDescData +} + +var file_spy_v1_spy_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_spy_v1_spy_proto_goTypes = []interface{}{ + (*EmitterFilter)(nil), // 0: spy.v1.EmitterFilter + (*FilterEntry)(nil), // 1: spy.v1.FilterEntry + (*SubscribeSignedVAARequest)(nil), // 2: spy.v1.SubscribeSignedVAARequest + (*SubscribeSignedVAAResponse)(nil), // 3: spy.v1.SubscribeSignedVAAResponse + (v1.ChainID)(0), // 4: publicrpc.v1.ChainID +} +var file_spy_v1_spy_proto_depIdxs = []int32{ + 4, // 0: spy.v1.EmitterFilter.chain_id:type_name -> publicrpc.v1.ChainID + 0, // 1: spy.v1.FilterEntry.emitter_filter:type_name -> spy.v1.EmitterFilter + 1, // 2: spy.v1.SubscribeSignedVAARequest.filters:type_name -> spy.v1.FilterEntry + 2, // 3: spy.v1.SpyRPCService.SubscribeSignedVAA:input_type -> spy.v1.SubscribeSignedVAARequest + 3, // 4: spy.v1.SpyRPCService.SubscribeSignedVAA:output_type -> spy.v1.SubscribeSignedVAAResponse + 4, // [4:5] is the sub-list for method output_type + 3, // [3:4] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name +} + +func init() { file_spy_v1_spy_proto_init() } +func file_spy_v1_spy_proto_init() { + if File_spy_v1_spy_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_spy_v1_spy_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EmitterFilter); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_spy_v1_spy_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FilterEntry); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_spy_v1_spy_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubscribeSignedVAARequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_spy_v1_spy_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubscribeSignedVAAResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_spy_v1_spy_proto_msgTypes[1].OneofWrappers = []interface{}{ + (*FilterEntry_EmitterFilter)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_spy_v1_spy_proto_rawDesc, + NumEnums: 0, + NumMessages: 4, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_spy_v1_spy_proto_goTypes, + DependencyIndexes: file_spy_v1_spy_proto_depIdxs, + MessageInfos: file_spy_v1_spy_proto_msgTypes, + }.Build() + File_spy_v1_spy_proto = out.File + file_spy_v1_spy_proto_rawDesc = nil + file_spy_v1_spy_proto_goTypes = nil + file_spy_v1_spy_proto_depIdxs = nil +} diff --git a/offchain-relayer/relay/proto/spy/v1/spy.pb.gw.go b/offchain-relayer/relay/proto/spy/v1/spy.pb.gw.go new file mode 100644 index 0000000..aa8ab68 --- /dev/null +++ b/offchain-relayer/relay/proto/spy/v1/spy.pb.gw.go @@ -0,0 +1,142 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: spy/v1/spy.proto + +/* +Package spyv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package spyv1 + +import ( + "context" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = metadata.Join + +func request_SpyRPCService_SubscribeSignedVAA_0(ctx context.Context, marshaler runtime.Marshaler, client SpyRPCServiceClient, req *http.Request, pathParams map[string]string) (SpyRPCService_SubscribeSignedVAAClient, runtime.ServerMetadata, error) { + var protoReq SubscribeSignedVAARequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.SubscribeSignedVAA(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +// RegisterSpyRPCServiceHandlerServer registers the http handlers for service SpyRPCService to "mux". +// UnaryRPC :call SpyRPCServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterSpyRPCServiceHandlerFromEndpoint instead. +func RegisterSpyRPCServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server SpyRPCServiceServer) error { + + mux.Handle("POST", pattern_SpyRPCService_SubscribeSignedVAA_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + return nil +} + +// RegisterSpyRPCServiceHandlerFromEndpoint is same as RegisterSpyRPCServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterSpyRPCServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterSpyRPCServiceHandler(ctx, mux, conn) +} + +// RegisterSpyRPCServiceHandler registers the http handlers for service SpyRPCService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterSpyRPCServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterSpyRPCServiceHandlerClient(ctx, mux, NewSpyRPCServiceClient(conn)) +} + +// RegisterSpyRPCServiceHandlerClient registers the http handlers for service SpyRPCService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "SpyRPCServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "SpyRPCServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "SpyRPCServiceClient" to call the correct interceptors. +func RegisterSpyRPCServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client SpyRPCServiceClient) error { + + mux.Handle("POST", pattern_SpyRPCService_SubscribeSignedVAA_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req, "/spy.v1.SpyRPCService/SubscribeSignedVAA", runtime.WithHTTPPathPattern("/v1:subscribe_signed_vaa")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SpyRPCService_SubscribeSignedVAA_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_SpyRPCService_SubscribeSignedVAA_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_SpyRPCService_SubscribeSignedVAA_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"v1"}, "subscribe_signed_vaa")) +) + +var ( + forward_SpyRPCService_SubscribeSignedVAA_0 = runtime.ForwardResponseStream +) diff --git a/offchain-relayer/relay/proto/spy/v1/spy_grpc.pb.go b/offchain-relayer/relay/proto/spy/v1/spy_grpc.pb.go new file mode 100644 index 0000000..bfb9c69 --- /dev/null +++ b/offchain-relayer/relay/proto/spy/v1/spy_grpc.pb.go @@ -0,0 +1,130 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package spyv1 + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// SpyRPCServiceClient is the client API for SpyRPCService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type SpyRPCServiceClient interface { + // SubscribeSignedVAA returns a stream of signed VAA messages received on the network. + SubscribeSignedVAA(ctx context.Context, in *SubscribeSignedVAARequest, opts ...grpc.CallOption) (SpyRPCService_SubscribeSignedVAAClient, error) +} + +type spyRPCServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewSpyRPCServiceClient(cc grpc.ClientConnInterface) SpyRPCServiceClient { + return &spyRPCServiceClient{cc} +} + +func (c *spyRPCServiceClient) SubscribeSignedVAA(ctx context.Context, in *SubscribeSignedVAARequest, opts ...grpc.CallOption) (SpyRPCService_SubscribeSignedVAAClient, error) { + stream, err := c.cc.NewStream(ctx, &SpyRPCService_ServiceDesc.Streams[0], "/spy.v1.SpyRPCService/SubscribeSignedVAA", opts...) + if err != nil { + return nil, err + } + x := &spyRPCServiceSubscribeSignedVAAClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type SpyRPCService_SubscribeSignedVAAClient interface { + Recv() (*SubscribeSignedVAAResponse, error) + grpc.ClientStream +} + +type spyRPCServiceSubscribeSignedVAAClient struct { + grpc.ClientStream +} + +func (x *spyRPCServiceSubscribeSignedVAAClient) Recv() (*SubscribeSignedVAAResponse, error) { + m := new(SubscribeSignedVAAResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// SpyRPCServiceServer is the server API for SpyRPCService service. +// All implementations must embed UnimplementedSpyRPCServiceServer +// for forward compatibility +type SpyRPCServiceServer interface { + // SubscribeSignedVAA returns a stream of signed VAA messages received on the network. + SubscribeSignedVAA(*SubscribeSignedVAARequest, SpyRPCService_SubscribeSignedVAAServer) error + mustEmbedUnimplementedSpyRPCServiceServer() +} + +// UnimplementedSpyRPCServiceServer must be embedded to have forward compatible implementations. +type UnimplementedSpyRPCServiceServer struct { +} + +func (UnimplementedSpyRPCServiceServer) SubscribeSignedVAA(*SubscribeSignedVAARequest, SpyRPCService_SubscribeSignedVAAServer) error { + return status.Errorf(codes.Unimplemented, "method SubscribeSignedVAA not implemented") +} +func (UnimplementedSpyRPCServiceServer) mustEmbedUnimplementedSpyRPCServiceServer() {} + +// UnsafeSpyRPCServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to SpyRPCServiceServer will +// result in compilation errors. +type UnsafeSpyRPCServiceServer interface { + mustEmbedUnimplementedSpyRPCServiceServer() +} + +func RegisterSpyRPCServiceServer(s grpc.ServiceRegistrar, srv SpyRPCServiceServer) { + s.RegisterService(&SpyRPCService_ServiceDesc, srv) +} + +func _SpyRPCService_SubscribeSignedVAA_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(SubscribeSignedVAARequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(SpyRPCServiceServer).SubscribeSignedVAA(m, &spyRPCServiceSubscribeSignedVAAServer{stream}) +} + +type SpyRPCService_SubscribeSignedVAAServer interface { + Send(*SubscribeSignedVAAResponse) error + grpc.ServerStream +} + +type spyRPCServiceSubscribeSignedVAAServer struct { + grpc.ServerStream +} + +func (x *spyRPCServiceSubscribeSignedVAAServer) Send(m *SubscribeSignedVAAResponse) error { + return x.ServerStream.SendMsg(m) +} + +// SpyRPCService_ServiceDesc is the grpc.ServiceDesc for SpyRPCService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var SpyRPCService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "spy.v1.SpyRPCService", + HandlerType: (*SpyRPCServiceServer)(nil), + Methods: []grpc.MethodDesc{}, + Streams: []grpc.StreamDesc{ + { + StreamName: "SubscribeSignedVAA", + Handler: _SpyRPCService_SubscribeSignedVAA_Handler, + ServerStreams: true, + }, + }, + Metadata: "spy/v1/spy.proto", +} diff --git a/offchain-relayer/relay/relay.go b/offchain-relayer/relay/relay.go new file mode 100644 index 0000000..fba965b --- /dev/null +++ b/offchain-relayer/relay/relay.go @@ -0,0 +1,708 @@ +package relay + +import ( + "context" + "crypto/ecdsa" + "fmt" + "io" + "log" + "math/big" + "net/http" + _ "net/http/pprof" // #nosec G108 we are using a custom router (`router := mux.NewRouter()`) and thus not automatically expose pprof. + "os" + "strconv" + "strings" + + "go.uber.org/zap/zapcore" + + "github.com/gorilla/mux" + "github.com/prometheus/client_golang/prometheus/promhttp" + + spyv1 "github.com/certusone/generic-relayer/offchain-relayer/relay/proto/spy/v1" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + eth_common "github.com/ethereum/go-ethereum/common" + ethcrypto "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" + + ipfslog "github.com/ipfs/go-log/v2" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/spf13/viper" + + "github.com/certusone/wormhole/node/pkg/common" + "github.com/certusone/wormhole/node/pkg/devnet" + + "github.com/certusone/wormhole/node/pkg/readiness" + "github.com/certusone/wormhole/node/pkg/supervisor" + "github.com/wormhole-foundation/wormhole/sdk/vaa" + + "go.uber.org/zap" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + + "github.com/certusone/generic-relayer/offchain-relayer/relay/ethereum/core_relayer" +) + +const TARGET_GAS_LIMIT = 500000 + +// keep the data for each chain together in a struct +type ChainDef struct { + RPCAddr *string + ContractAddr eth_common.Address + WormholeChainID vaa.ChainID + NetworkID *string +} + +// a map of chains supplied as args, so we can lookup an iterate through +type Chains map[vaa.ChainID]*ChainDef + +var ( + dataDir *string + + statusAddr *string + + senderKeyPath *string + // senderKeyMnemonic *string + senderKeyHex *string + + evmRPC *string + evmContract *string + evmWormholeChainID *uint16 + evmNetworkID *string + + evm2RPC *string + evm2Contract *string + evm2WormholeChainID *uint16 + evm2NetworkID *string + + logLevel *string + + unsafeDevMode *bool + testnetMode *bool + nodeName *string + + spyRPC *string + guardianRPC *string +) + +func init() { + statusAddr = RelayCmd.Flags().String("statusAddr", viper.GetString("statusAddr"), "Listen address for status server (disabled if blank)") + + dataDir = RelayCmd.Flags().String("dataDir", viper.GetString("dataDir"), "Data directory") + + senderKeyPath = RelayCmd.Flags().String("senderKeyPath", viper.GetString("senderKeyPath"), "Path to sender key (required)") + // senderKeyMnemonic = RelayCmd.Flags().String("senderKeyMnemonic", "", "Path to sender key (required)") + senderKeyHex = RelayCmd.Flags().String("senderKeyHex", viper.GetString("senderKeyHex"), "Sender private key hex (required)") + + evmRPC = RelayCmd.Flags().String("evmRPC", viper.GetString("evmRPC"), "EVM RPC URL") + evmContract = RelayCmd.Flags().String("evmContract", viper.GetString("evmContract"), "EVM contract address") + evmWormholeChainID = RelayCmd.Flags().Uint16("evmWormholeChainID", viper.GetUint16("evmWormholeChainID"), "Wormhole ChainID") + evmNetworkID = RelayCmd.Flags().String("evmNetworkID", viper.GetString("evmNetworkID"), "The network's ChainID") + + evm2RPC = RelayCmd.Flags().String("evm2RPC", viper.GetString("evm2RPC"), "EVM RPC URL") + evm2Contract = RelayCmd.Flags().String("evm2Contract", viper.GetString("evm2Contract"), "EVM contract address") + evm2WormholeChainID = RelayCmd.Flags().Uint16("evm2WormholeChainID", viper.GetUint16("evm2WormholeChainID"), "Wormhole ChainID") + evm2NetworkID = RelayCmd.Flags().String("evm2NetworkID", viper.GetString("evm2NetworkID"), "The network's ChainID") + + logLevel = RelayCmd.Flags().String("logLevel", viper.GetString("logLevel"), "Logging level (debug, info, warn, error, dpanic, panic, fatal)") + + unsafeDevMode = RelayCmd.Flags().Bool("unsafeDevMode", viper.GetBool("unsafeDevMode"), "Launch node in unsafe, deterministic devnet mode") + testnetMode = RelayCmd.Flags().Bool("testnetMode", viper.GetBool("testnetMode"), "Launch node in testnet mode (enables testnet-only features like Ropsten)") + + nodeName = RelayCmd.Flags().String("nodeName", viper.GetString("nodeName"), "Node name to announce in gossip heartbeats") + + spyRPC = RelayCmd.Flags().String("spyRPC", viper.GetString("spyRPC"), "Listen address of public spy gRPC interface") + + guardianRPC = RelayCmd.Flags().String("guardianRPC", viper.GetString("guardianRPC"), "Adress of public guardian gRPC interface") + +} + +var ( + rootCtx context.Context + rootCtxCancel context.CancelFunc +) + +const ( + spyReadiness readiness.Component = "spyReadiness" +) + +const devwarning = ` + +++++++++++++++++++++++++++++++++++++++++++++++++++ + | NODE IS RUNNING IN INSECURE DEVELOPMENT MODE | + | | + | Do not use --unsafeDevMode in prod. | + +++++++++++++++++++++++++++++++++++++++++++++++++++ + +` + +var RelayCmd = &cobra.Command{ + Use: "relay", + Short: "Run the relayer", + PersistentPreRunE: func(cmd *cobra.Command, args []string) error { + // You can bind cobra and viper in a few locations, but PersistencePreRunE on the root command works well + bindFlags(cmd, viper.GetViper()) + return nil + }, + Run: runRelay, +} + +// Take the values read by viper from the config file ".relay.yaml" and apply them to cmd. +// Bind each cobra flag to its associated viper configuration (config file and environment variable). +func bindFlags(cmd *cobra.Command, v *viper.Viper) { + envPrefix := "RELAY" + cmd.Flags().VisitAll(func(f *pflag.Flag) { + // Environment variables can't have dashes in them, so bind them to their equivalent + // keys with underscores, e.g. --favorite-color to STING_FAVORITE_COLOR + if strings.Contains(f.Name, "-") { + envVarSuffix := strings.ToUpper(strings.ReplaceAll(f.Name, "-", "_")) + v.BindEnv(f.Name, fmt.Sprintf("%s_%s", envPrefix, envVarSuffix)) + } + + // Apply the viper config value to the flag when the flag is not set and viper has a value + if !f.Changed && v.IsSet(f.Name) { + val := v.Get(f.Name) + cmd.Flags().Set(f.Name, fmt.Sprintf("%v", val)) + } + }) +} + +// This variable may be overridden by the -X linker flag to "dev" in which case +// we enforce the --unsafeDevMode flag. Only development binaries/docker images +// are distributed. Production binaries are required to be built from source by +// guardians to reduce risk from a compromised builder. +var Build = "prod" + +func runRelay(cmd *cobra.Command, args []string) { + if Build == "dev" && !*unsafeDevMode { + fmt.Println("This is a development build. --unsafeDevMode must be enabled.") + os.Exit(1) + } + + if *unsafeDevMode { + fmt.Print(devwarning) + } + + if *testnetMode { + common.LockMemory() + common.SetRestrictiveUmask() + } + + // Refuse to run as root in production mode. + if !*unsafeDevMode && os.Geteuid() == 0 { + fmt.Println("can't run as uid 0") + os.Exit(1) + } + + // Set up logging. The go-log zap wrapper that libp2p uses is compatible with our + // usage of zap in supervisor, which is nice. + lvl, err := ipfslog.LevelFromString(*logLevel) + if err != nil { + fmt.Println("Invalid log level") + os.Exit(1) + } + + logger := zap.New(zapcore.NewCore( + consoleEncoder{zapcore.NewConsoleEncoder( + zap.NewDevelopmentEncoderConfig())}, + zapcore.AddSync(zapcore.Lock(os.Stderr)), + zap.NewAtomicLevelAt(zapcore.Level(lvl)))) + + if *unsafeDevMode { + // Use the hostname as nodeName. For production, we don't want to do this to + // prevent accidentally leaking sensitive hostnames. + hostname, err := os.Hostname() + if err != nil { + panic(err) + } + *nodeName = hostname + + // Put node name into the log for development. + logger = logger.Named(*nodeName) + } + + // Override the default go-log config, which uses a magic environment variable. + ipfslog.SetAllLoggers(lvl) + + // Register components for readiness checks. + readiness.RegisterComponent(spyReadiness) + + if *statusAddr != "" { + // Use a custom routing instead of using http.DefaultServeMux directly to avoid accidentally exposing packages + // that register themselves with it by default (like pprof). + router := mux.NewRouter() + + // pprof server. NOT necessarily safe to expose publicly - only enable it in dev mode to avoid exposing it by + // accident. There's benefit to having pprof enabled on production nodes, but we would likely want to expose it + // via a dedicated port listening on localhost, or via the admin UNIX socket. + if *unsafeDevMode { + // Pass requests to http.DefaultServeMux, which pprof automatically registers with as an import side-effect. + router.PathPrefix("/debug/pprof/").Handler(http.DefaultServeMux) + } + + // Simple endpoint exposing node readiness (safe to expose to untrusted clients) + router.HandleFunc("/readyz", readiness.Handler) + + // Prometheus metrics (safe to expose to untrusted clients) + router.Handle("/metrics", promhttp.Handler()) + + go func() { + logger.Info(fmt.Sprintf("status server listening on [::]:%s", *statusAddr)) + // SECURITY: If making changes, ensure that we always do `router := mux.NewRouter()` before this to avoid accidentally exposing pprof + logger.Error("status server crashed", zap.Error(http.ListenAndServe(*statusAddr, router))) + }() + } + + if *senderKeyPath == "" && !*unsafeDevMode { + logger.Fatal("Please specify --senderKeyPath") + } + + if *dataDir == "" && !*unsafeDevMode { + logger.Fatal("Please specify --dataDir") + } + + // first chain + if *evmRPC == "" { + logger.Fatal("Please specify --evmRPC") + } + if *evmContract == "" { + logger.Fatal("Please specify --evmContract") + } + if evmWormholeChainID == nil || *evm2WormholeChainID == 0 { + logger.Fatal("Please specify --evmWormholeChainID") + } + if *evmNetworkID == "" { + logger.Fatal("Please specify --evmNetworkID") + } + + // second + if *evm2RPC == "" { + logger.Fatal("Please specify --evm2RPC") + } + if *evm2Contract == "" { + logger.Fatal("Please specify --evm2Contract") + } + if evm2WormholeChainID == nil || *evm2WormholeChainID == 0 { + logger.Fatal("Please specify --evm2WormholeChainID") + } + if *evm2NetworkID == "" { + logger.Fatal("Please specify --evm2NetworkID") + } + + if *nodeName == "" { + logger.Fatal("Please specify --nodeName") + } + if *spyRPC == "" { + logger.Fatal("Please specify --spyRPC") + } + if *guardianRPC == "" { + logger.Fatal("Please specify --guardianRPC") + } + + // collect the networks into a map indexed by chainID. + + // make a map of the chains that we can relay to. + // key by the ChainID so we can check this map with values from VAAs. + var connectedChains Chains = Chains{} + + // could do this better by making the Cobra args accept an iterable with this info. + + // first chain + var evmChainID vaa.ChainID = vaa.ChainID(*evmWormholeChainID) + connectedChains[evmChainID] = &ChainDef{ + RPCAddr: evmRPC, + ContractAddr: eth_common.HexToAddress(strings.TrimPrefix(*evmContract, "0x")), + WormholeChainID: evmChainID, + NetworkID: evmNetworkID, + } + + // second chain + var evm2ChainID vaa.ChainID = vaa.ChainID(*evm2WormholeChainID) + connectedChains[evm2ChainID] = &ChainDef{ + RPCAddr: evm2RPC, + ContractAddr: eth_common.HexToAddress(strings.TrimPrefix(*evm2Contract, "0x")), + WormholeChainID: evm2ChainID, + NetworkID: evm2NetworkID, + } + + // read the private key passed in. + // start with the deterministic devent key, override it if the user passes one in. + var sk *ecdsa.PrivateKey + + if *unsafeDevMode { + acct := devnet.DeriveAccount(uint(2)) + sk, err = devnet.Wallet().PrivateKey(acct) + if err != nil { + logger.Fatal("failed to derive devnet sender key", zap.Error(err)) + } + } + if *senderKeyHex != "" { + sk, err = ethcrypto.HexToECDSA(*senderKeyHex) + if err != nil { + logger.Fatal("failed transform senderKeyHex to ECDSA", zap.Error(err)) + } + } + if *senderKeyPath != "" { + sk, err = ethcrypto.LoadECDSA(*senderKeyPath) + if err != nil { + logger.Fatal("failed load senderKeyPath.", + zap.String("senderKeyPath", *senderKeyPath), + zap.Error(err)) + } + } + + if sk == nil { + logger.Fatal("no sender key supplied, exiting.") + } + + guardianAddr := ethcrypto.PubkeyToAddress(sk.PublicKey).String() + logger.Info("Loaded guardian key", zap.String( + "address", guardianAddr)) + + // Relay's main lifecycle context. + rootCtx, rootCtxCancel = context.WithCancel(context.Background()) + defer rootCtxCancel() + + // setup channels for passing VAAs around + + // Inbound VAA observations + obsvC := make(chan []byte, 50) + + // Outbound VAA queue + sendC := make(chan []byte) + + // Redirect ipfs logs to plain zap + ipfslog.SetPrimaryCore(logger.Core()) + + // setup the supervisor that will start/watch/reboot the individual parts of the application. + supervisor.New(rootCtx, logger, func(ctx context.Context) error { + + if err := supervisor.Run(ctx, "spywatch", + spyWatcherRunnable(spyRPC, spyReadiness, obsvC)); err != nil { + return err + } + + if err := supervisor.Run(ctx, "inspectVAA", + inspectVAA(obsvC, sendC, connectedChains)); err != nil { + return err + } + + if err := supervisor.Run(ctx, "relayVAA", + relayVAA(sendC, connectedChains, sk)); err != nil { + return err + } + + logger.Info("Started internal services") + + <-ctx.Done() + return nil + }, + // It's safer to crash and restart the process in case we encounter a panic, + // rather than attempting to reschedule the runnable. + supervisor.WithPropagatePanic) + + <-rootCtx.Done() + + logger.Info("root context cancelled, exiting...") +} + +// relayVAA sends the batchVAAs it recieves to the deliver function of the target chain +func relayVAA(sendC chan []byte, networks Chains, senderKey *ecdsa.PrivateKey) supervisor.Runnable { + return func(ctx context.Context) error { + logger := supervisor.Logger(ctx) + + logger.Debug("inspectVAA going to fire off the supervisor.SignalHealthy") + supervisor.Signal(ctx, supervisor.SignalHealthy) + for { + select { + case <-ctx.Done(): + logger.Debug(("inspectVAA recieved cts.Done(), going to return nil")) + return nil + case b := <-sendC: + + // ultimatly calls deliver on the relayer contract + + batchVAA, err := UnmarshalBatch(b) + if err != nil { + // not a batchVAA, continue, break? + logger.Info("failed to UnmarshalBatch, must not be a batchVAA.", zap.Error(err)) + continue + } + + src := batchVAA.Observations[0].Observation.EmitterChain + srcChain := vaa.ChainID(src) + + if _, ok := networks[srcChain]; !ok { + logger.Info("no network config for this source.", zap.String("src_chain", src.String())) + continue + } + srcNetwork := networks[srcChain] + relayerAddr := srcNetwork.ContractAddr + logger.Info("relayerAddr", zap.String("relayer_addr_hex", relayerAddr.String())) + + // find the deliveryVAA among the observations in the batch + var deliveryVAAIndex int = -1 + for i, o := range batchVAA.Observations { + logger.Info("observation ", + zap.Int("index", i), + zap.String("emitter_address_hex", eth_common.BytesToAddress(o.Observation.EmitterAddress[:]).Hex())) + if eth_common.BytesToAddress(o.Observation.EmitterAddress[:]) == relayerAddr { + // this is a batch with a relay VAA + deliveryVAAIndex = i + } + } + logger.Info("deliveryVAAIndex", zap.Int("deliveryVAAIndex", deliveryVAAIndex)) + + if deliveryVAAIndex < 0 { + logger.Info("could not find the deliveryVAAIndex, continuing.") + continue + } else { + logger.Info("found deliveryVAA among the observations", zap.Int("deliveryVAAIndex", deliveryVAAIndex)) + } + + // construct the delivery params + deliveryParams := core_relayer.CoreRelayerStructsTargetDeliveryParameters{ + EncodedVM: b, + DeliveryIndex: uint8(deliveryVAAIndex), + TargetCallGasOverride: uint32(TARGET_GAS_LIMIT), + } + + relayRequestVAA := batchVAA.Observations[deliveryVAAIndex] + + // create the client of the source chain + conn, err := ethclient.Dial(*srcNetwork.RPCAddr) + if err != nil { + logger.Fatal("Failed to connect to the srcNetwork with ethclient: %", zap.Error(err)) + } + + // instantiate the CoreRelayer of the source chain + srcRelayer, err := core_relayer.NewCoreRelayer(srcNetwork.ContractAddr, conn) + if err != nil { + logger.Error("failed getting NewCoreRelayer for source", zap.Error(err)) + continue + } + + // create delivery instructions from the source chain's contract + deliveryInstructions, err := srcRelayer.DecodeDeliveryInstructions(nil, relayRequestVAA.Observation.Payload) + if err != nil { + logger.Error("failed to decode delivery instructions", zap.Error(err)) + } + logger.Debug("Decoded DeliveryInstructions!", + zap.String("from_chain", vaa.ChainID(deliveryInstructions.FromChain).String()), + zap.String("from_address", eth_common.BytesToHash(deliveryInstructions.FromAddress[:]).Hex()), + zap.String("target_chain", vaa.ChainID(deliveryInstructions.TargetChain).String()), + zap.String("target_address", eth_common.BytesToHash(deliveryInstructions.TargetAddress[:]).Hex()), + ) + + destChain := vaa.ChainID(deliveryInstructions.TargetChain) + if _, ok := networks[destChain]; !ok { + // we do not have the network to relay this message + logger.Info("recieved relay request for unsuppported chain, doing nothing", + zap.String("dest_chain", destChain.String())) + continue + } + + // create the client connection to the target chain + destNetwork := networks[destChain] + destConn, err := ethclient.Dial(*destNetwork.RPCAddr) + if err != nil { + logger.Error("failed to connect to target RPC", + zap.String("target_chain", destNetwork.WormholeChainID.String()), + zap.Error(err)) + } + + networkID, err := strconv.Atoi(*destNetwork.NetworkID) + if err != nil { + logger.Fatal("failed to convert destNetwork.NetworkID to int.", zap.Error(err)) + } + networkID64 := int64(networkID) + // create a transactor for the target chain + auth, err := bind.NewKeyedTransactorWithChainID(senderKey, big.NewInt(networkID64)) + if err != nil { + logger.Fatal("failed to create NewKeyedTransactorWithChainID", zap.Error(err)) + } + + // create the contract instance of the target chain + destRelayer, err := core_relayer.NewCoreRelayerTransactor(destNetwork.ContractAddr, destConn) + if err != nil { + logger.Error("failed getting NewCoreRelayer for target", + zap.String("contract_addr", destNetwork.ContractAddr.Hex()), + zap.Error(err)) + continue + } + + // send the transaction to the target chain + tx, err := destRelayer.Deliver(auth, deliveryParams) + if err != nil { + logger.Error("failed delivering to destination", + zap.Error(err)) + continue + } + + logger.Info("successfully relayed VAA!", zap.String("tx_hash", tx.Hash().String())) + + } + } + } +} + +// inpects SignedVAAs and determines if they should be relayed. +func inspectVAA(obsvC chan []byte, sendC chan []byte, networks Chains) supervisor.Runnable { + return func(ctx context.Context) error { + logger := supervisor.Logger(ctx) + + logger.Debug("inspectVAA going to fire off the supervisor.SignalHealthy") + supervisor.Signal(ctx, supervisor.SignalHealthy) + + for { + select { + case <-ctx.Done(): + logger.Debug(("inspectVAA recieved cts.Done(), going to return nil")) + return nil + case b := <-obsvC: + batchVAA, err := UnmarshalBatch(b) + if err != nil { + // this log is too noisy. + // logger.Debug("failed to UnmarshalBatch, must not be a batchVAA.", zap.Error(err)) + continue + } + logger.Info("successfully unmarshaled BatchVAA!") + + src := batchVAA.Observations[0].Observation.EmitterChain + srcChain := vaa.ChainID(src) + + if _, ok := networks[srcChain]; !ok { + logger.Info("no network config for this source.", zap.String("src_chain", src.String())) + continue + } else { + logger.Info("found network config for source", zap.String("src_chain", src.String())) + } + + srcNetwork := networks[srcChain] + relayerAddr := srcNetwork.ContractAddr + logger.Info("relayerAddr", zap.String("relayer_addr_hex", relayerAddr.String())) + + // find the deliveryVAA among the observations in the batch + var deliveryVAAIndex int = -1 + for i, o := range batchVAA.Observations { + logger.Info("observation ", + zap.Int("index", i), + zap.String("emitter_address_hex", eth_common.BytesToAddress(o.Observation.EmitterAddress[:]).Hex())) + if eth_common.BytesToAddress(o.Observation.EmitterAddress[:]) == relayerAddr { + // this is a batch with a relay VAA + deliveryVAAIndex = i + } + } + logger.Info("deliveryVAAIndex", zap.Int("deliveryVAAIndex", deliveryVAAIndex)) + + if deliveryVAAIndex < 0 { + logger.Info("could not find the deliveryVAAIndex, continuing.") + continue + } else { + logger.Info("found deliveryVAA among the observations", zap.Int("deliveryVAAIndex", deliveryVAAIndex)) + } + + relayRequestVAA := batchVAA.Observations[deliveryVAAIndex] + + // create the network client for the source chain + conn, err := ethclient.Dial(*srcNetwork.RPCAddr) + if err != nil { + logger.Fatal("Failed to connect to the srcNetwork with ethclient: %", zap.Error(err)) + } + // instantiate the CoreRelayer contract that produced the VAA + srcRelayer, err := core_relayer.NewCoreRelayer(srcNetwork.ContractAddr, conn) + if err != nil { + logger.Error("failed getting NewCoreRelayer for source", zap.Error(err)) + continue + } + + // create the delivery instructions from the source chain contract + deliveryInstructions, err := srcRelayer.DecodeDeliveryInstructions(nil, relayRequestVAA.Observation.Payload) + if err != nil { + logger.Error("failed to decode delivery instructions", zap.Error(err)) + } + logger.Debug("Decoded DeliveryInstructions!", + zap.String("from_chain", vaa.ChainID(deliveryInstructions.FromChain).String()), + zap.String("from_address", eth_common.BytesToHash(deliveryInstructions.FromAddress[:]).Hex()), + zap.String("target_chain", vaa.ChainID(deliveryInstructions.TargetChain).String()), + zap.String("target_address", eth_common.BytesToHash(deliveryInstructions.TargetAddress[:]).Hex()), + ) + + // check that we have the network connection info for the target chain of this relay request + destChain := vaa.ChainID(deliveryInstructions.TargetChain) + if _, ok := networks[destChain]; !ok { + // we do not have the network to relay this message + logger.Info("recieved relay request for unsuppported chain, doing nothing", + zap.String("dest_chain", destChain.String())) + continue + } + + // the relay VAA looks good, and we verified we have everything we need to relay this VAA, + // send it! + sendC <- b + logger.Info("sent the VAA to sendC.") + + } + } + } +} + +// connects to the guardian's spy and recieves a stream of SignedVAAs, pass them +// along to the obsvC channel. +func spyWatcherRunnable( + spyAddr *string, + readyHandle readiness.Component, + obsvC chan []byte, +) supervisor.Runnable { + return func(ctx context.Context) error { + logger := supervisor.Logger(ctx) + + _, client, err := getSpyRPCServiceClient(ctx, *spyAddr) + if err != nil { + logger.Fatal("failed to getSpyRPCServiceClient", zap.Error(err)) + } + + req := &spyv1.SubscribeSignedVAARequest{Filters: []*spyv1.FilterEntry{}} + stream, err := client.SubscribeSignedVAA(ctx, req) + if err != nil { + logger.Fatal("failed subscribing to SpyRPCClient", zap.Error(err)) + } + + logger.Debug("spyWatcherRunnable going to fire off the supervisor.SignalHealthy") + supervisor.Signal(ctx, supervisor.SignalHealthy) + + logger.Debug("spyWatchRunnable going to fire off 'ready' to the readiness component") + readiness.SetReady(readyHandle) + + for { + // recieve is a blocking call, it will keep recieving/looping until the pipe breaks. + signedVAA, err := stream.Recv() + if err == io.EOF { + // connection has closed. + // probably want to kill the thread so the supervisor will start a new one? + // or does this break do enough (exits the for loop, so nil is returned?) + logger.Info("the SignedVAA stream has closed, err == io.EOF. going to break.") + break + } + if err != nil { + logger.Fatal("SubscribeSignedVAA returned an error", zap.Error(err)) + } + logger.Debug("going to push signedVaa bytes onto the obsvC") + b := signedVAA.VaaBytes + obsvC <- b + } + logger.Debug("spyWatcherRunnable is going to return a value to the supervisor") + return nil + } +} + +func getSpyRPCServiceClient(ctx context.Context, addr string) (*grpc.ClientConn, spyv1.SpyRPCServiceClient, error) { + conn, err := grpc.DialContext(ctx, addr, grpc.WithTransportCredentials(insecure.NewCredentials())) + + if err != nil { + log.Fatalf("failed to connect to %s: %v", addr, err) + } + + c := spyv1.NewSpyRPCServiceClient(conn) + return conn, c, err +} diff --git a/offchain-relayer/relay/utils.go b/offchain-relayer/relay/utils.go new file mode 100644 index 0000000..1abe778 --- /dev/null +++ b/offchain-relayer/relay/utils.go @@ -0,0 +1,954 @@ +package relay + +// +// NOTE: +// this file is structs.go, formally from the guardian codebase, +// now from /sdk/. This file is duplicated here temporarily +// untill the batchVAA changes land on dev.v2. Once the changes land, +// this file can be deleted and replaced with an import. +// +// + +import ( + "bytes" + "crypto/ecdsa" + "encoding/binary" + "encoding/hex" + "fmt" + "io" + "math/big" + "strings" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" +) + +type ( + // VAA is a verifiable action approval of the Wormhole protocol + VAA struct { + // Version of the VAA schema + Version uint8 + // GuardianSetIndex is the index of the guardian set that signed this VAA + GuardianSetIndex uint32 + // SignatureData is the signature of the guardian set + Signatures []*Signature + + // Timestamp when the VAA was created + Timestamp time.Time + // Nonce of the VAA + Nonce uint32 + // Sequence of the VAA + Sequence uint64 + /// ConsistencyLevel of the VAA + ConsistencyLevel uint8 + // EmitterChain the VAA was emitted on + EmitterChain ChainID + // EmitterAddress of the contract that emitted the Message + EmitterAddress Address + // Payload of the message + Payload []byte + } + + BatchVAA struct { + // Version of the VAA schema + Version uint8 + // GuardianSetIndex is the index of the guardian set that signed this VAA + GuardianSetIndex uint32 + // SignatureData is the signature of the guardian set + Signatures []*Signature + + // EmitterChain the VAAs were emitted on + EmitterChain ChainID + + // The chain-native identifier of the transaction that created the batch VAA. + TransactionID common.Hash + + // array of Observation VAA hashes + Hashes []common.Hash + + // Observations in the batch + Observations []*Observation + } + + // ChainID of a Wormhole chain + ChainID uint16 + // Action of a VAA + Action uint8 + + // Address is a Wormhole protocol address, it contains the native chain's address. If the address data type of a + // chain is < 32bytes the value is zero-padded on the left. + Address [32]byte + + // Signature of a single guardian + Signature struct { + // Index of the validator + Index uint8 + // Signature data + Signature SignatureData + } + + SignatureData [65]byte + + Observation struct { + // Index of the observation in a Batch array + Index uint8 + // Signed Observation data + Observation *VAA + } + + TransferPayloadHdr struct { + Type uint8 + Amount *big.Int + OriginAddress Address + OriginChain ChainID + TargetAddress Address + TargetChain ChainID + } +) + +func (a Address) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, a)), nil +} + +func (a Address) String() string { + return hex.EncodeToString(a[:]) +} + +func (a Address) Bytes() []byte { + return a[:] +} + +func (a SignatureData) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, a)), nil +} + +func (a SignatureData) String() string { + return hex.EncodeToString(a[:]) +} + +func (c ChainID) String() string { + switch c { + case ChainIDUnset: + return "unset" + case ChainIDSolana: + return "solana" + case ChainIDEthereum: + return "ethereum" + case ChainIDTerra: + return "terra" + case ChainIDBSC: + return "bsc" + case ChainIDPolygon: + return "polygon" + case ChainIDAvalanche: + return "avalanche" + case ChainIDOasis: + return "oasis" + case ChainIDAurora: + return "aurora" + case ChainIDFantom: + return "fantom" + case ChainIDAlgorand: + return "algorand" + case ChainIDNear: + return "near" + case ChainIDEthereumRopsten: + return "ethereum-ropsten" + case ChainIDKarura: + return "karura" + case ChainIDAcala: + return "acala" + case ChainIDKlaytn: + return "klaytn" + case ChainIDCelo: + return "celo" + case ChainIDMoonbeam: + return "moonbeam" + case ChainIDNeon: + return "neon" + case ChainIDTerra2: + return "terra2" + case ChainIDInjective: + return "injective" + case ChainIDPythNet: + return "pythnet" + default: + return fmt.Sprintf("unknown chain ID: %d", c) + } +} + +func ChainIDFromString(s string) (ChainID, error) { + s = strings.ToLower(s) + + switch s { + case "solana": + return ChainIDSolana, nil + case "ethereum": + return ChainIDEthereum, nil + case "terra": + return ChainIDTerra, nil + case "bsc": + return ChainIDBSC, nil + case "polygon": + return ChainIDPolygon, nil + case "avalanche": + return ChainIDAvalanche, nil + case "oasis": + return ChainIDOasis, nil + case "aurora": + return ChainIDAurora, nil + case "fantom": + return ChainIDFantom, nil + case "algorand": + return ChainIDAlgorand, nil + case "near": + return ChainIDNear, nil + case "ethereum-ropsten": + return ChainIDEthereumRopsten, nil + case "karura": + return ChainIDKarura, nil + case "acala": + return ChainIDAcala, nil + case "klaytn": + return ChainIDKlaytn, nil + case "celo": + return ChainIDCelo, nil + case "moonbeam": + return ChainIDMoonbeam, nil + case "neon": + return ChainIDNeon, nil + case "terra2": + return ChainIDTerra2, nil + case "injective": + return ChainIDInjective, nil + case "pythnet": + return ChainIDPythNet, nil + default: + return ChainIDUnset, fmt.Errorf("unknown chain ID: %s", s) + } +} + +const ( + ChainIDUnset ChainID = 0 + // ChainIDSolana is the ChainID of Solana + ChainIDSolana ChainID = 1 + // ChainIDEthereum is the ChainID of Ethereum + ChainIDEthereum ChainID = 2 + // ChainIDTerra is the ChainID of Terra + ChainIDTerra ChainID = 3 + // ChainIDBSC is the ChainID of Binance Smart Chain + ChainIDBSC ChainID = 4 + // ChainIDPolygon is the ChainID of Polygon + ChainIDPolygon ChainID = 5 + // ChainIDAvalanche is the ChainID of Avalanche + ChainIDAvalanche ChainID = 6 + // ChainIDOasis is the ChainID of Oasis + ChainIDOasis ChainID = 7 + // ChainIDAlgorand is the ChainID of Algorand + ChainIDAlgorand ChainID = 8 + // ChainIDAurora is the ChainID of Aurora + ChainIDAurora ChainID = 9 + // ChainIDFantom is the ChainID of Fantom + ChainIDFantom ChainID = 10 + // ChainIDKarura is the ChainID of Karura + ChainIDKarura ChainID = 11 + // ChainIDAcala is the ChainID of Acala + ChainIDAcala ChainID = 12 + // ChainIDKlaytn is the ChainID of Klaytn + ChainIDKlaytn ChainID = 13 + // ChainIDCelo is the ChainID of Celo + ChainIDCelo ChainID = 14 + // ChainIDNear is the ChainID of Near + ChainIDNear ChainID = 15 + // ChainIDMoonbeam is the ChainID of Moonbeam + ChainIDMoonbeam ChainID = 16 + // ChainIDNeon is the ChainID of Neon + ChainIDNeon ChainID = 17 + // ChainIDTerra2 is the ChainID of Terra 2 + ChainIDTerra2 ChainID = 18 + // ChainIDInjective is the ChainID of Injective + ChainIDInjective ChainID = 19 + // ChainIDPythNet is the ChainID of PythNet + ChainIDPythNet ChainID = 26 + + // ChainIDEthereumRopsten is the ChainID of Ethereum Ropsten + ChainIDEthereumRopsten ChainID = 10001 + + // Minimum VAA size is derrived from the following assumptions: + // HEADER + // - Supported VAA Version (1 byte) + // - Guardian Set Index (4 bytes) + // - Length of Signatures (1 byte) <== assume no signatures + // - Actual Signatures (0 bytes) + // BODY + // - timestamp (4 bytes) + // - nonce (4 bytes) + // - emitter chain (2 bytes) + // - emitter address (32 bytes) + // - sequence (8 bytes) + // - consistency level (1 byte) + // - payload (0 bytes) + // BATCH + // - Length of Observation Hashes (1 byte) <== minimum one + // - Observation Hash (32 bytes) + // - Length of Observations (1 byte) <== minimum one + // - Observation Index (1 byte) + // - Observation Length (1 byte) + // - Observation, aka BODY, aka Headless (51 bytes) + // From Above: + // HEADER: 1 + 4 + 1 + 0 = 6 + // BODY: 4 + 4 + 2 + 32 + 8 + 1 + 0 = 51 + // BATCH: 1 + 32 + 1 + 1 + 1 + 51 = 88 + // + // More details here: https://docs.wormholenetwork.com/wormhole/vaas + minHeadlessVAALength = 51 // HEADER + minVAALength = 57 // HEADER + BODY + minBatchVAALength = 94 // HEADER + BATCH + + SupportedVAAVersion = 0x01 + BatchVAAVersion = 0x02 + + InternalTruncatedPayloadSafetyLimit = 1000 +) + +// Unmarshal deserializes the binary representation of a VAA +// +// WARNING: Unmarshall will truncate payloads at 1000 bytes, this is done mainly to avoid denial of service +// - If you need to access the full payload, consider parsing VAA from Bytes instead of Unmarshal +func Unmarshal(data []byte) (*VAA, error) { + if len(data) < minVAALength { + return nil, fmt.Errorf("VAA is too short") + } + v := &VAA{} + + v.Version = data[0] + if v.Version != SupportedVAAVersion { + return nil, fmt.Errorf("unsupported VAA version: %d", v.Version) + } + + reader := bytes.NewReader(data[1:]) + + if err := binary.Read(reader, binary.BigEndian, &v.GuardianSetIndex); err != nil { + return nil, fmt.Errorf("failed to read guardian set index: %w", err) + } + + lenSignatures, er := reader.ReadByte() + if er != nil { + return nil, fmt.Errorf("failed to read signature length") + } + + v.Signatures = make([]*Signature, lenSignatures) + for i := 0; i < int(lenSignatures); i++ { + index, err := reader.ReadByte() + if err != nil { + return nil, fmt.Errorf("failed to read validator index [%d]", i) + } + + signature := [65]byte{} + if n, err := reader.Read(signature[:]); err != nil || n != 65 { + return nil, fmt.Errorf("failed to read signature [%d]: %w", i, err) + } + + v.Signatures[i] = &Signature{ + Index: index, + Signature: signature, + } + } + + unixSeconds := uint32(0) + if err := binary.Read(reader, binary.BigEndian, &unixSeconds); err != nil { + return nil, fmt.Errorf("failed to read timestamp: %w", err) + } + v.Timestamp = time.Unix(int64(unixSeconds), 0) + + if err := binary.Read(reader, binary.BigEndian, &v.Nonce); err != nil { + return nil, fmt.Errorf("failed to read nonce: %w", err) + } + + if err := binary.Read(reader, binary.BigEndian, &v.EmitterChain); err != nil { + return nil, fmt.Errorf("failed to read emitter chain: %w", err) + } + + emitterAddress := Address{} + if n, err := reader.Read(emitterAddress[:]); err != nil || n != 32 { + return nil, fmt.Errorf("failed to read emitter address [%d]: %w", n, err) + } + v.EmitterAddress = emitterAddress + + if err := binary.Read(reader, binary.BigEndian, &v.Sequence); err != nil { + return nil, fmt.Errorf("failed to read sequence: %w", err) + } + + if err := binary.Read(reader, binary.BigEndian, &v.ConsistencyLevel); err != nil { + return nil, fmt.Errorf("failed to read commitment: %w", err) + } + + payload := make([]byte, InternalTruncatedPayloadSafetyLimit) + n, err := reader.Read(payload) + if err != nil || n == 0 { + return nil, fmt.Errorf("failed to read payload [%d]: %w", n, err) + } + + v.Payload = payload[:n] + + return v, nil +} + +func UnmarshalBatch(data []byte) (*BatchVAA, error) { + if len(data) < minBatchVAALength { + return nil, fmt.Errorf("BatchVAA.Observation is too short") + } + v := &BatchVAA{} + + v.Version = data[0] + if v.Version != BatchVAAVersion { + return nil, fmt.Errorf("unsupported VAA version: %d", v.Version) + } + + reader := bytes.NewReader(data[1:]) + + if err := binary.Read(reader, binary.BigEndian, &v.GuardianSetIndex); err != nil { + return nil, fmt.Errorf("failed to read guardian set index: %w", err) + } + + lenSignatures, er := reader.ReadByte() + if er != nil { + return nil, fmt.Errorf("failed to read signature length") + } + + v.Signatures = make([]*Signature, int(lenSignatures)) + for i := 0; i < int(lenSignatures); i++ { + index, err := reader.ReadByte() + if err != nil { + return nil, fmt.Errorf("failed to read validator index [%d]", i) + } + + signature := [65]byte{} + if n, err := reader.Read(signature[:]); err != nil || n != 65 { + return nil, fmt.Errorf("failed to read signature [%d]: %w", i, err) + } + + v.Signatures[i] = &Signature{ + Index: uint8(index), + Signature: signature, + } + } + + lenHashes, err := reader.ReadByte() + if err != nil { + return nil, fmt.Errorf("failed to read hashes length [%w]", err) + } + v.Hashes = make([]common.Hash, int(lenHashes)) + for i := 0; i < int(lenHashes); i++ { + hash := [32]byte{} + if n, err := reader.Read(hash[:]); err != nil || n != 32 { + return nil, fmt.Errorf("failed to read hash [%d]: %w", i, err) + } + v.Hashes[i] = common.BytesToHash(hash[:]) + } + + lenObservations, err := reader.ReadByte() + if err != nil { + return nil, fmt.Errorf("failed to read observations length: %w", err) + } + + v.Observations = make([]*Observation, int(lenObservations)) + for i := 0; i < int(lenObservations); i++ { + obsvIndex, err := reader.ReadByte() + if err != nil { + return nil, fmt.Errorf("failed to read Observation index [%d]: %w", i, err) + } + + obsvLength := uint32(0) + if err := binary.Read(reader, binary.BigEndian, &obsvLength); err != nil { + return nil, fmt.Errorf("failed to read Observation length: %w", err) + } + + obs := make([]byte, int(obsvLength)) + if n, err := reader.Read(obs[:]); err != nil || n == 0 { + return nil, fmt.Errorf("failed to read Observation bytes [%d]: %w", n, err) + } + + msgPub, err := UnmarshalBatchObservation(obs) + if err != nil { + return nil, fmt.Errorf("failed to unmarshal Observation VAA. %w", err) + } + + v.Observations[i] = &Observation{ + Index: uint8(obsvIndex), + Observation: msgPub, + } + } + + return v, nil +} + +// Unmarshal deserializes the binary representation of an Observation (VAA) +// within a BatchVAA. Different from VAA unmarshaling - no header fields. +func UnmarshalBatchObservation(data []byte) (*VAA, error) { + if len(data) < minHeadlessVAALength { + return nil, fmt.Errorf("BatchVAA.Observation is too short") + } + v := &VAA{} + + reader := bytes.NewReader(data[:]) + + unixSeconds := uint32(0) + if err := binary.Read(reader, binary.BigEndian, &unixSeconds); err != nil { + return nil, fmt.Errorf("failed to read timestamp: %w", err) + } + v.Timestamp = time.Unix(int64(unixSeconds), 0) + + if err := binary.Read(reader, binary.BigEndian, &v.Nonce); err != nil { + return nil, fmt.Errorf("failed to read nonce: %w", err) + } + + if err := binary.Read(reader, binary.BigEndian, &v.EmitterChain); err != nil { + return nil, fmt.Errorf("failed to read emitter chain: %w", err) + } + + emitterAddress := Address{} + if n, err := reader.Read(emitterAddress[:]); err != nil || n != 32 { + return nil, fmt.Errorf("failed to read emitter address [%d]: %w", n, err) + } + v.EmitterAddress = emitterAddress + + if err := binary.Read(reader, binary.BigEndian, &v.Sequence); err != nil { + return nil, fmt.Errorf("failed to read sequence: %w", err) + } + + if err := binary.Read(reader, binary.BigEndian, &v.ConsistencyLevel); err != nil { + return nil, fmt.Errorf("failed to read commitment: %w", err) + } + + payload := make([]byte, InternalTruncatedPayloadSafetyLimit) + n, err := reader.Read(payload) + if err != nil || n == 0 { + return nil, fmt.Errorf("failed to read payload [%d]: %w", n, err) + } + + v.Payload = payload[:n] + + return v, nil +} + +// signingBody returns the binary representation of the data that is relevant for signing and verifying the VAA +func (v *VAA) signingBody() []byte { + return v.serializeBody() +} + +// signingBatchBody returns the binary representation of the data that is relevant for signing and verifying the VAA +func (v *BatchVAA) signingBatchBody() []byte { + buf := new(bytes.Buffer) + + // create the hash array from the Observations of the BatchVAA + hashes := v.ObsvHashArray() + + MustWrite(buf, binary.BigEndian, hashes) + + return buf.Bytes() +} + +// SigningMsg returns the hash of the signing body. This is used for signature generation and verification +func (v *VAA) SigningMsg() common.Hash { + // In order to save space in the solana signature verification instruction, we hash twice so we only need to pass in + // the first hash (32 bytes) vs the full body data. + hash := crypto.Keccak256Hash(crypto.Keccak256Hash(v.signingBody()).Bytes()) + return hash +} + +// SigningBatchMsg returns the hash of the signing body. This is used for signature generation and verification +// this is batchHatch from wormhole.js - already bytes signed again +func (v *BatchVAA) SigningBatchMsg() common.Hash { + // In order to save space in the solana signature verification instruction, we hash twice so we only need to pass in + // the first hash (32 bytes) vs the full body data. + hash := crypto.Keccak256Hash(crypto.Keccak256Hash(v.signingBatchBody()).Bytes()) + return hash +} + +// ObsvHashArray creates an array of hashes of Observation. +// hashes in the array have the index position of their Observation.Index. +func (v *BatchVAA) ObsvHashArray() []common.Hash { + hashes := make([]common.Hash, len(v.Observations)) + for _, msg := range v.Observations { + obsIndex := msg.Index + hashes[obsIndex] = msg.Observation.SigningMsg() + } + + return hashes +} + +// VerifySignatures verifies the signature of the VAA given the signer addresses. +// Returns true if the signatures were verified successfully. +func (v *VAA) VerifySignatures(addresses []common.Address) bool { + if len(addresses) < len(v.Signatures) { + return false + } + + h := v.SigningMsg() + + last_index := -1 + signing_addresses := []common.Address{} + + for _, sig := range v.Signatures { + if int(sig.Index) >= len(addresses) { + return false + } + + // Ensure increasing indexes + if int(sig.Index) <= last_index { + return false + } + last_index = int(sig.Index) + + // Get pubKey to determine who signers address + pubKey, err := crypto.Ecrecover(h.Bytes(), sig.Signature[:]) + if err != nil { + return false + } + addr := common.BytesToAddress(crypto.Keccak256(pubKey[1:])[12:]) + + // Ensure this signer is at the correct positional index + if addr != addresses[sig.Index] { + return false + } + + // Ensure we never see the same signer twice + for _, signing_address := range signing_addresses { + if signing_address == addr { + return false + } + } + signing_addresses = append(signing_addresses, addr) + } + + return true +} + +// VerifyBatchSignatures verifies the signature of the BatchVAA given the signer addresses. +// Returns true if the signatures were verified successfully. +func (v *BatchVAA) VerifyBatchSignatures(addresses []common.Address) bool { + if len(addresses) < len(v.Signatures) { + return false + } + + h := v.SigningBatchMsg() + + last_index := -1 + signing_addresses := []common.Address{} + + for _, sig := range v.Signatures { + if int(sig.Index) >= len(addresses) { + return false + } + + // Ensure increasing indexes + if int(sig.Index) <= last_index { + return false + } + last_index = int(sig.Index) + + // Get pubKey to determine who signers address + pubKey, err := crypto.Ecrecover(h.Bytes(), sig.Signature[:]) + if err != nil { + return false + } + addr := common.BytesToAddress(crypto.Keccak256(pubKey[1:])[12:]) + + // Ensure this signer is at the correct positional index + if addr != addresses[sig.Index] { + return false + } + + // Ensure we never see the same signer twice + for _, signing_address := range signing_addresses { + if signing_address == addr { + return false + } + } + signing_addresses = append(signing_addresses, addr) + } + + return true +} + +// Marshal returns the binary representation of the BatchVAA +func (v *BatchVAA) Marshal() ([]byte, error) { + buf := new(bytes.Buffer) + MustWrite(buf, binary.BigEndian, v.Version) + MustWrite(buf, binary.BigEndian, v.GuardianSetIndex) + + // Write signatures + MustWrite(buf, binary.BigEndian, uint8(len(v.Signatures))) + for _, sig := range v.Signatures { + MustWrite(buf, binary.BigEndian, sig.Index) + buf.Write(sig.Signature[:]) + } + + // Write Body + buf.Write(v.serializeBatchBody()) + + return buf.Bytes(), nil +} + +// Serializes the body of the BatchVAA. +func (v *BatchVAA) serializeBatchBody() []byte { + buf := new(bytes.Buffer) + + hashes := v.ObsvHashArray() + + MustWrite(buf, binary.BigEndian, uint8(len(hashes))) + MustWrite(buf, binary.BigEndian, hashes) + + MustWrite(buf, binary.BigEndian, uint8(len(v.Observations))) + for _, obsv := range v.Observations { + + MustWrite(buf, binary.BigEndian, uint8(obsv.Index)) + + obsvBytes := obsv.Observation.serializeBatchObservationBody() + + lenBytes := len(obsvBytes) + MustWrite(buf, binary.BigEndian, uint32(lenBytes)) + buf.Write(obsvBytes) + } + + return buf.Bytes() +} + +// Marshal returns the binary representation of the VAA +func (v *VAA) Marshal() ([]byte, error) { + buf := new(bytes.Buffer) + MustWrite(buf, binary.BigEndian, v.Version) + MustWrite(buf, binary.BigEndian, v.GuardianSetIndex) + + // Write signatures + MustWrite(buf, binary.BigEndian, uint8(len(v.Signatures))) + for _, sig := range v.Signatures { + MustWrite(buf, binary.BigEndian, sig.Index) + buf.Write(sig.Signature[:]) + } + + // Write Body + buf.Write(v.serializeBody()) + + return buf.Bytes(), nil +} + +// MessageID returns a human-readable emitter_chain/emitter_address/sequence tuple. +func (v *VAA) MessageID() string { + return fmt.Sprintf("%d/%s/%d", v.EmitterChain, v.EmitterAddress, v.Sequence) +} + +// BatchID returns a human-readable emitter_chain/transaction_hex +func (v *BatchVAA) BatchID() string { + return fmt.Sprintf("%d/%s", v.EmitterChain, hex.EncodeToString(v.TransactionID.Bytes())) +} + +// GetTransactionID implements the processor.Batch interface for *BatchVAA. +func (v *BatchVAA) GetTransactionID() common.Hash { + return v.TransactionID +} + +// HexDigest returns the hex-encoded digest. +func (v *VAA) HexDigest() string { + return hex.EncodeToString(v.SigningMsg().Bytes()) +} + +// HexDigest returns the hex-encoded digest. +func (b *BatchVAA) HexDigest() string { + return hex.EncodeToString(b.SigningBatchMsg().Bytes()) +} + +// serializeBatchObservationBody marshals the body of BatchVAA.Observations +func (v *VAA) serializeBatchObservationBody() []byte { + // Marshaling BatchVAA.Observations is the same + // as VAAs, but unmarshaling is different. + // This wrapper function serves as the delebrate entry point. + return v.serializeBody() +} + +/* +SECURITY: Do not change this code! Changing it could result in two different hashes for +the same observation. But xDapps rely on the hash of an observation for replay protection. +*/ +func (v *VAA) serializeBody() []byte { + buf := new(bytes.Buffer) + MustWrite(buf, binary.BigEndian, uint32(v.Timestamp.Unix())) + MustWrite(buf, binary.BigEndian, v.Nonce) + MustWrite(buf, binary.BigEndian, v.EmitterChain) + buf.Write(v.EmitterAddress[:]) + MustWrite(buf, binary.BigEndian, v.Sequence) + MustWrite(buf, binary.BigEndian, v.ConsistencyLevel) + buf.Write(v.Payload) + + return buf.Bytes() +} + +func (v *VAA) AddSignature(key *ecdsa.PrivateKey, index uint8) { + sig, err := crypto.Sign(v.SigningMsg().Bytes(), key) + if err != nil { + panic(err) + } + sigData := [65]byte{} + copy(sigData[:], sig) + + v.Signatures = append(v.Signatures, &Signature{ + Index: index, + Signature: sigData, + }) +} + +// creates signature of BatchVAA.Hashes and adds it to BatchVAA.Signatures. +func (v *BatchVAA) AddSignature(key *ecdsa.PrivateKey, index uint8) { + + sig, err := crypto.Sign(v.SigningBatchMsg().Bytes(), key) + if err != nil { + panic(err) + } + sigData := [65]byte{} + copy(sigData[:], sig) + + v.Signatures = append(v.Signatures, &Signature{ + Index: index, + Signature: sigData, + }) +} + +// NOTE: This function assumes that the caller has verified that the VAA is from the token bridge. +func IsTransfer(payload []byte) bool { + return (len(payload) > 0) && ((payload[0] == 1) || (payload[0] == 3)) +} + +func DecodeTransferPayloadHdr(payload []byte) (*TransferPayloadHdr, error) { + if !IsTransfer(payload) { + return nil, fmt.Errorf("unsupported payload type") + } + + if len(payload) < 101 { + return nil, fmt.Errorf("buffer too short") + } + + p := &TransferPayloadHdr{} + + // Payload type: payload[0] + p.Type = uint8(payload[0]) + + // Amount: payload[1] for 32 + p.Amount = new(big.Int) + p.Amount.SetBytes(payload[1:33]) + + reader := bytes.NewReader(payload[33:]) + + // Origin address: payload[33] for 32 + err := binary.Read(reader, binary.BigEndian, &p.OriginAddress) + if err != nil { + return nil, err + } + + // Origin chain ID: payload[65] for 2 + err = binary.Read(reader, binary.BigEndian, &p.OriginChain) + if err != nil { + return nil, err + } + + // Target address: payload[67] for 32 + err = binary.Read(reader, binary.BigEndian, &p.TargetAddress) + if err != nil { + return nil, err + } + + // Target chain ID: payload[99] for 2 + err = binary.Read(reader, binary.BigEndian, &p.TargetChain) + if err != nil { + return nil, err + } + + return p, nil +} + +// GetEmitterChain implements the processor.Observation interface for *VAA. +func (v *VAA) GetEmitterChain() ChainID { + return v.EmitterChain +} + +// GetEmitterChain implements the processor.Batch interface for *BatchVAA. +func (v *BatchVAA) GetEmitterChain() ChainID { + return v.EmitterChain +} + +// MustWrite calls binary.Write and panics on errors +func MustWrite(w io.Writer, order binary.ByteOrder, data interface{}) { + if err := binary.Write(w, order, data); err != nil { + panic(fmt.Errorf("failed to write binary data: %v", data).Error()) + } +} + +// StringToAddress converts a hex-encoded address into a vaa.Address +func StringToAddress(value string) (Address, error) { + var address Address + + // Make sure we have enough to decode + if len(value) < 2 { + return address, fmt.Errorf("value must be at least 1 byte") + } + + // Trim any preceding "0x" to the address + value = strings.TrimPrefix(value, "0x") + + // Decode the string from hex to binary + res, err := hex.DecodeString(value) + if err != nil { + return address, err + } + + // Make sure we don't have too many bytes + if len(res) > 32 { + return address, fmt.Errorf("value must be no more than 32 bytes") + } + copy(address[32-len(res):], res) + + return address, nil +} + +func BytesToAddress(b []byte) (Address, error) { + var address Address + if len(b) > 32 { + return address, fmt.Errorf("value must be no more than 32 bytes") + } + + copy(address[32-len(b):], b) + return address, nil +} + +// StringToHash converts a hex-encoded string into a common.Hash +func StringToHash(value string) (common.Hash, error) { + var tx common.Hash + + // Make sure we have enough to decode + if len(value) < 2 { + return tx, fmt.Errorf("value must be at least 1 byte") + } + + // Trim any preceding "0x" to the address + value = strings.TrimPrefix(value, "0x") + + res, err := hex.DecodeString(value) + if err != nil { + return tx, err + } + + tx = common.BytesToHash(res) + + return tx, nil +} + +func BytesToHash(b []byte) (common.Hash, error) { + var hash common.Hash + if len(b) > 32 { + return hash, fmt.Errorf("value must be no more than 32 bytes") + } + + hash = common.BytesToHash(b) + return hash, nil +} diff --git a/offchain-relayer/start-relayer.sh b/offchain-relayer/start-relayer.sh new file mode 100755 index 0000000..912761f --- /dev/null +++ b/offchain-relayer/start-relayer.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +set -exuo pipefail + +./get-addresses.sh + +go run main.go relay diff --git a/sdk/src/__tests__/eth-integration.ts b/sdk/src/__tests__/eth-integration.ts index 9b01855..5540031 100644 --- a/sdk/src/__tests__/eth-integration.ts +++ b/sdk/src/__tests__/eth-integration.ts @@ -22,6 +22,7 @@ import { CHAIN_ID_ETH, getSignedBatchVAAWithRetry, tryNativeToUint8Array, + tryNativeToHexString } from "@certusone/wormhole-sdk"; import { NodeHttpTransport } from "@improbable-eng/grpc-web-node-http-transport"; @@ -214,18 +215,18 @@ describe("ETH <> BSC Generic Relayer Integration Test", () => { const storedPayload = await bscRelayerIntegrator.getPayload(targetVm3.hash); if (storedPayload == targetVm3.payload) { isBatchDelivered = true; - - // clear the payload from the mock integration contract - await bscRelayerIntegrator.clearPayload(targetVm3.hash); - const emptyStoredPayload = await bscRelayerIntegrator.getPayload(targetVm3.hash); - expect(emptyStoredPayload).to.equal("0x"); } } // confirm that the remaining payloads are stored in the contract - for (const indexedObservation of parsedBatch.indexedObservations.slice(1)) { + for (const indexedObservation of parsedBatch.indexedObservations) { const vm3 = indexedObservation.vm3; + // skip delivery instructions VM + if (vm3.emitterAddress == "0x"+tryNativeToHexString(ethCoreRelayer.address, CHAIN_ID_ETH)) { + continue; + } + // query the contract to see if the batch was delivered const storedPayload = await bscRelayerIntegrator.getPayload(vm3.hash); expect(storedPayload).to.equal(vm3.payload);