diff --git a/.github/workflows/func-tests.yaml b/.github/workflows/func-tests.yaml index 4744316..1d71c14 100644 --- a/.github/workflows/func-tests.yaml +++ b/.github/workflows/func-tests.yaml @@ -71,7 +71,6 @@ jobs: echo -e "Getting Wallets: ${green}OK${nc}" for w in $wallets_list; do accounts=$(ethdo wallet --base-dir "$input_path" accounts --wallet="$w" | tr '\n' ' ') - echo -e "Getting Accounts For [$w]: ${green}OK${nc}" for a in $accounts; do input_key=$(ethdo account --base-dir "$input_path" info --account "$w/$a" | grep -i "$input_grep" | awk '{print $NF}') output_key=$(ethdo account --base-dir "$output_path" info --account "$w/$a" | grep -i "$output_grep" | awk '{print $NF}') @@ -81,7 +80,6 @@ jobs: fi echo -e "Checking Account [$w/$a]: ${green}OK${nc}" done; - echo -e "Checking Wallet [$w]: ${green}OK${nc}" done; env: red: '\033[0;31m' diff --git a/README.MD b/README.MD index 7339069..55b62fb 100644 --- a/README.MD +++ b/README.MD @@ -1,8 +1,9 @@ # Dirk Key Converter (dkc) +![GitHub Workflow Status (with event)](https://img.shields.io/github/actions/workflow/status/p2p-org/dkc/func-tests.yaml) [![Go Report Card](https://goreportcard.com/badge/github.com/p2p-org/dkc)](https://goreportcard.com/report/github.com/p2p-org/dkc) -Transform wallets between [distributed type](https://github.com/wealdtech/go-eth2-wallet-distributed) and [non-deterministic type](https://github.com/wealdtech/go-eth2-wallet-nd). +Convert wallets from [distributed type](https://github.com/wealdtech/go-eth2-wallet-distributed),[non-deterministic type](https://github.com/wealdtech/go-eth2-wallet-nd),[hierarchical deterministic](https://github.com/wealdtech/go-eth2-wallet-hd) to [distributed type](https://github.com/wealdtech/go-eth2-wallet-distributed),[non-deterministic type](https://github.com/wealdtech/go-eth2-wallet-nd) :bangbang: It is highly recommended to refrain from any operations on the validation keys and use the provided script only in critical situations to avoid any ponential risks of slashing. @@ -13,8 +14,8 @@ Transform wallets between [distributed type](https://github.com/wealdtech/go-eth - [Source](#source) - [Usage](#usage) - [Config](#config) - - [Combine](#combine) - - [Split](#split) + - [File Structure](#file structure) + - [Convert](#convert) - [Maintainers](#maintainers) - [Contribute](#contribute) - [License](#license) @@ -38,197 +39,115 @@ go build . `dkc` uses [herumi/bls-eth-go-binary](https://github.com/herumi/bls-eth-go-binary). Some research code of using [herumi/bls-eth-go-binary](https://github.com/herumi/bls-eth-go-binary) in `dkc` is available [here](./research/research.go) -You can also test `dkc` on predefiened inputs [here](.github/workflows/func-tests.yml). +You can test `dkc` on predefiened inputs [here](.github/workflows/func-tests.yml). ### Config -An example config can be found [here](.github/examples/config.yaml) +An example configs for each pair could be found [here](.github/examples/) ```yaml -distributed-wallets: #Distributed-wallets section - path: ./wallet #Path to distributed wallet (Default: None) - passphrases: ./passphrases.txt #Path to file containing passphrases for unlocking/locking accounts (Default: None) - threshold: 2 #Threshlod value (Default: None) - walletname: myDKWallet - peers: #Peers dict, number of peers must be greater than threshold value (Default: None) - 10: old1:9091 - 20: old2:9091 - 30: old3:9091 -nd-wallets: #Non-determenistic-wallets section - path: nd_wallets #Path to non-determenistic wallet (Default: None) - passphrases: ./passphrases.txt #Path to file containing passphrases for unlocking/locking accounts (Default: None) +input: #Input section + store: #Store section + path: ./i_wallet #Location of input wallets + wallet: #Wallet section + type: distributed #Type for input wallet. Valid types are: distributed, non-deterministic,hierarchical deterministic + threshold: 2 #Threshold number. It must be len(peers)/2 < threshold < len(peers) + peers: #Peers section + 10: #Peer ID is used for generating bls participants + name: old1:9091 #Peer name is used for generating bls participants. All wallets for this peer are located in ./i_wallet/old1 + passphrases: #Passphrases section + path: ./peer1.txt #Path to passphrases file(you can use separate passphrases file for each peer) + index: 1 #Password index in passphrases file. If not provided will use all passwords for unlocking wallets and only first password for creating accounts (Default: Using all passwords provided in passphrases file) + 20: + name: old2:9091 + passphrases: + path: ./peer2.txt + index: 1 + 30: + name: old3:9091 + passphrases: + path: ./peer3.txt + index: 1 +output: #Output Wallet Section + store: + path: ./o_wallet + wallet: + type: hierarchical deterministic + passphrases: + path: ./o_passphrases.txt log-level: debug #Log-level (Default: INFO) ``` -### File structure +### File Structure -##### Combine +##### Distributed Wallet -The following is an [example](.github/examples/wallets) file structure if one were to combine threshold keys. `old1`, `old2`, `old3` are each the `base-dir` wallet directory from the dirk instance. `old1`, `old2`, `old3` are each their own wallet directory. +This wallet type can be used as input or output wallet. More information about this wallet type is provided [here]((https://github.com/wealdtech/go-eth2-wallet-distributed) -`ethdo wallet list --base-dir ./wallet` should return nothing. +The following is an [example](.github/examples/distributed-to-nd/distributed) file structure if one were to combine threshold keys. `test1`, `test2`, `test3` are each the `base-dir` wallet directory from the dirk instance. `test1`, `test2`, `test3` are each their own wallet directory. -The subdirectories of `wallet` folder are the actual `ethdo` wallets: +`ethdo wallet list --base-dir ./distributed-to-nd/distributed` should return nothing. -``` -$ ethdo wallet list --base-dir wallets/old1 -9faf1408-839c-4b21-9d15-80d192c2bced -$ ethdo wallet list --base-dir wallets/old2 -ff3918f1-16ef-47bf-83d2-16b5a64c9aa1 -$ ethdo wallet list --base-dir wallets/old3 -dd428711-4681-41d1-ad47-746cc6cfea8f -``` - -It should look like this: +The subdirectories of `wallet` folder are the actual `ethdo` wallets: ``` -wallet -├── old1 -│ └── 9a76c4f3-aa46-4864-b7fd-55681f8afa3b -│ ├── 69e976d2-3c78-44e3-b9a6-45149078723d -│ ├── 85587167-c356-4968-aa36-37464d05640c -│ ├── 9a76c4f3-aa46-4864-b7fd-55681f8afa3b -│ ├── a99d9d83-4afb-4870-8cce-a57c69c6bda2 -│ ├── fd83339a-d36e-4c7a-a30c-0999be075dcb -│ └── index -├── old2 -│ └── 32b277e3-b71a-45ed-b47d-5b6c155b8cf9 -│ ├── 026b1c48-9a1a-49f8-b289-792d79378090 -│ ├── 32b277e3-b71a-45ed-b47d-5b6c155b8cf9 -│ ├── 6880aa1f-e490-4508-868f-f2af3b7f34f7 -│ ├── ab1cc0d8-5447-41bd-b3b5-0c100ae9747a -│ ├── f282e1ff-0364-48e6-a674-26ea18184bf3 -│ └── index -└── old3 - └── 68f2bf6c-4266-49e2-915a-be9946c0882b - ├── 5613693b-1b36-4bac-9b85-d96deeeb8d7c - ├── 5a8c805d-9056-4ded-b9a2-611cdaa99427 - ├── 5ee08d46-70d0-430a-b4ef-f461567c344c - ├── 68f2bf6c-4266-49e2-915a-be9946c0882b - ├── e177e6d7-195a-44a0-b350-7bcf73642253 - └── index +$ ethdo wallet list --base-dir distributed-to-nd/distributed/test1 +Wallet2 +Wallet3 +Wallet1 +$ ethdo wallet list --base-dir distributed-to-nd/distributed/test2 +Wallet2 +Wallet3 +Wallet1 +$ ethdo wallet list --base-dir distributed-to-nd/distributed/test3 +Wallet1 +Wallet2 +Wallet3 ``` -*Importantly, the names of each wallet folder must correspond with the values in `distributed-wallets.peers` defined in the config.* +*Importantly, the names of each wallet folder must correspond with the values in `*.wallet.peers` defined in the config.* The keys within each wallet must also have the same name -``` -cat wallets/old1/56f23183-85e7-4f65-863e-738975f137ad/index | jq -[ - { - "uuid": "37be3c86-5d24-47f3-99b8-83b6ac62e6b7", - "name": "3" - }, - { - "uuid": "54799fa9-3239-4df2-857b-50c5d725cbfe", - "name": "4" - }, - { - "uuid": "5676a9e5-e1de-4eef-9473-8c52c0810ce5", - "name": "1" - }, - { - "uuid": "c153e6f1-2ae2-44fd-9a4b-e91965c8a2a6", - "name": "2" - } -] - -cat wallets/old3/e5dc7bb0-9be2-45a5-b54b-768f4fd105df/index | jq -[ - { - "uuid": "d38d8796-5022-42ea-8495-cd5d67743afc", - "name": "3" - }, - { - "uuid": "0d69229d-cbcc-42eb-b29b-10ae91f28dff", - "name": "4" - }, - { - "uuid": "b043fbf2-f392-4c09-b8ff-319ed8345dc8", - "name": "1" - }, - { - "uuid": "c38ac2af-f5ee-4326-bd03-8572d2449623", - "name": "2" - } -] - -cat wallets/old3/e5dc7bb0-9be2-45a5-b54b-768f4fd105df/index | jq -[ - { - "uuid": "d38d8796-5022-42ea-8495-cd5d67743afc", - "name": "3" - }, - { - "uuid": "0d69229d-cbcc-42eb-b29b-10ae91f28dff", - "name": "4" - }, - { - "uuid": "b043fbf2-f392-4c09-b8ff-319ed8345dc8", - "name": "1" - }, - { - "uuid": "c38ac2af-f5ee-4326-bd03-8572d2449623", - "name": "2" - } -] -``` - All of the keys with corresponding names (ex: `name = 1`) should be the threshold keys corresponding to the same composite public key. -##### Split +##### Hierarchical Deterministic -The following is an example file structure if one were to want to split non-deterministic keys into threshold keys. +This wallet type can be used only ad input wallet. More information about this wallet type is provided [here]((https://github.com/wealdtech/go-eth2-wallet-hd) -``` -nd_wallets -└── 20384d86-bc39-4ac4-a827-3cff41043cbd - ├── 20384d86-bc39-4ac4-a827-3cff41043cbd - ├── 2c2cd425-fa58-43b7-808b-d2ba32d692cc - ├── 5bee4007-73ba-452f-9e53-6d04110dbb7c - ├── 95b9898b-667f-49cd-9097-9da9bf760173 - ├── b9d79ea4-9e15-4f3c-9c63-b67e7965a060 - └── index -``` +The following is an [example](.github/examples/hd-to-distributed/hd) file structure. The `base-dir` wallet directory is `hd-to-distributed/hd` -In this instance, `nd_wallets` is the wallet `base-dir`. ``` -$ ethdo wallet list --base-dir nd_wallets -be7efee0-a219-4fb5-a0b7-a47662320755 +$ ethdo wallet --base-dir hd-to-distributed/hd list +Wallet1 +Wallet3 +Wallet2 ``` -To split up, non-deterministic keys, just put them into the wallet. -``` -nd_wallets -└── 20384d86-bc39-4ac4-a827-3cff41043cbd - ├── 20384d86-bc39-4ac4-a827-3cff41043cbd - ├── 2c2cd425-fa58-43b7-808b-d2ba32d692cc - ├── 5bee4007-73ba-452f-9e53-6d04110dbb7c - ├── 95b9898b-667f-49cd-9097-9da9bf760173 - ├── b9d79ea4-9e15-4f3c-9c63-b67e7965a060 - └── index -``` +##### Non-Deterministic -##### Output Formats +This wallet type can be used as input or output wallet. More information about this wallet type is provided [here]((https://github.com/wealdtech/go-eth2-wallet-nd) -The output file hierarchy is the same as the opposite side's input hierarchy. For example, the format needed to split keys, will be the output format of combined keys. +The following is an [example](.github/examples/nd-to-distributed/nd) file structure. The `base-dir` wallet directory is `hd-to-distributed/nd` -### Combine +``` +$ ethdo wallet --base-dir nd-to-distributed/hd list +Wallet1 +Wallet3 +Wallet2 +``` -Combine [distributed type](https://github.com/wealdtech/go-eth2-wallet-distributed) to [non-deterministic type](https://github.com/wealdtech/go-eth2-wallet-nd). +##### Output Formats -```sh -./dkc combine --config=config.yaml -``` +The output file hierarchy is the same as the opposite side's input hierarchy. -### Split +### Convert -Split [non-deterministic type](https://github.com/wealdtech/go-eth2-wallet-nd) to [distributed type](https://github.com/wealdtech/go-eth2-wallet-distributed) +After preparing config and backuping keys simply run: ```sh -./dkc split --config=config.yaml +./dkc convert --config=config.yaml ``` ## Maintainers diff --git a/config.yaml b/config.yaml index 8a4470a..8c37da7 100644 --- a/config.yaml +++ b/config.yaml @@ -1,6 +1,6 @@ input: store: - path: DISTRIBUTED_WALLETS + path: ./input_distributed_wallet wallet: type: distributed threshold: 2 @@ -8,24 +8,24 @@ input: 10: name: old1:9091 passphrases: - path: ./input_wallet_passphrases.txt + path: ./input_peer1_passphrases.txt index: 1 20: name: old2:9091 passphrases: - path: ./input_wallet_passphrases.txt + path: ./input_peer2_passphrases.txt index: 1 30: name: old3:9091 passphrases: - path: ./input_wallet_passphrases.txt + path: ./input_peer3_passphrases.txt index: 1 output: store: - path: HD_WALLETS + path: ./output_hd_wallet wallet: type: hierarchical deterministic passphrases: - path: ./output_wallet_passphrases.txt + path: ./output_hd_wallet_passphrases.txt log-level: debug diff --git a/go.mod b/go.mod index 428afc7..24be9f3 100644 --- a/go.mod +++ b/go.mod @@ -18,10 +18,16 @@ require ( ) require ( + github.com/alecthomas/gometalinter v3.0.0+incompatible // indirect + github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect github.com/aws/aws-sdk-go v1.48.0 // indirect + github.com/client9/misspell v0.3.4 // indirect github.com/ferranbt/fastssz v0.1.3 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fzipp/gocyclo v0.6.0 // indirect github.com/gofrs/uuid v4.4.0+incompatible // indirect + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect + github.com/gordonklaus/ineffassign v0.1.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect @@ -31,6 +37,8 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/nicksnyder/go-i18n v1.10.1 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.1.0 // indirect github.com/phoreproject/bls v0.0.0-20191211001008-9d5f85bf4a9b // indirect github.com/sagikazarmark/locafero v0.3.0 // indirect @@ -57,8 +65,12 @@ require ( go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.15.0 // indirect + golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect + golang.org/x/mod v0.14.0 // indirect golang.org/x/sys v0.14.0 // indirect golang.org/x/text v0.14.0 // indirect + golang.org/x/tools v0.15.0 // indirect + gopkg.in/alecthomas/kingpin.v3-unstable v3.0.0-20191105091915-95d230a53780 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 8c386bd..d98fcac 100644 --- a/go.sum +++ b/go.sum @@ -38,6 +38,10 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= 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/alecthomas/gometalinter v3.0.0+incompatible h1:e9Zfvfytsw/e6Kd/PYd75wggK+/kX5Xn8IYDUKyc5fU= +github.com/alecthomas/gometalinter v3.0.0+incompatible/go.mod h1:qfIpQGGz3d+NmgyPBqv+LSh50emm1pt72EtcX2vKYQk= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/aws/aws-sdk-go v1.44.261 h1:PcTMX/QVk+P3yh2n34UzuXDF5FS2z5Lse2bt+r3IpU4= github.com/aws/aws-sdk-go v1.44.261/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go v1.48.0 h1:1SeJ8agckRDQvnSCt1dGZYAwUaoD2Ixj6IaXB4LCv8Q= @@ -47,6 +51,7 @@ github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA 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 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 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= @@ -71,6 +76,8 @@ github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4 github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= +github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= 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= @@ -129,6 +136,8 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= @@ -138,6 +147,8 @@ github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ 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/gordonklaus/ineffassign v0.1.0 h1:y2Gd/9I7MdY1oEIt+n+rowjBNDcLQq3RsH5hwJd0f9s= +github.com/gordonklaus/ineffassign v0.1.0/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= 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/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -188,6 +199,11 @@ github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5 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/mmcloughlin/avo v0.0.0-20190318053554-7a0eb66183da/go.mod h1:lf5GMZxA5kz8dnCweJuER5Rmbx6dDu6qvw0fO3uYKK8= +github.com/nicksnyder/go-i18n v1.10.1 h1:isfg77E/aCD7+0lD/D00ebR2MV5vgeQ276WYyDaCRQc= +github.com/nicksnyder/go-i18n v1.10.1/go.mod h1:e4Di5xjP9oTVrC6y3C7C0HoSYXjSbhh/dU0eUV32nB4= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +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.7 h1:muncTPStnKRos5dpVKULv2FVd4bMOhNePj9CjgDb8Us= github.com/pelletier/go-toml/v2 v2.0.7/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= @@ -321,6 +337,7 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de 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= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= @@ -372,6 +389,8 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu 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/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -382,7 +401,10 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 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-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -415,6 +437,7 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= @@ -438,6 +461,7 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= @@ -474,8 +498,10 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/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-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-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -560,7 +586,10 @@ golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/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/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= +golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= 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= @@ -653,6 +682,8 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +gopkg.in/alecthomas/kingpin.v3-unstable v3.0.0-20191105091915-95d230a53780 h1:CEBpW6C191eozfEuWdUmIAHn7lwlLxJ7HVdr2e2Tsrw= +gopkg.in/alecthomas/kingpin.v3-unstable v3.0.0-20191105091915-95d230a53780/go.mod h1:3HH7i1SgMqlzxCcBmUHW657sD4Kvv9sC3HpL3YukzwA= 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 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= @@ -660,6 +691,7 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= 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/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.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=