This page contains some helpers to use as an example when you try to troubleshoot using the API.
1. Taurus-EXPLORER
1.1 Explorer connectivity
- Validate network connectivity
tg-validatord
->tg-proxyd
->Explorers
- No authentication
curl "https://int-validator-core-crdb.t-bx.io/rjpyber72n6brsdzksotivcm33mw78q4/api/rest/v1/health/blocksd/connectivity" -H "accept: application/json" -H "Content-Type: application/json" | jq .
# {
# "health": {
# "tenantId": "1",
# "componentName": "tg-validatord",
# "componentId": "d32d3002-e4d0-4736-bd02-def1d652e542",
# "group": "blocksd",
# "healthCheck": "connectivity",
# "status": "success",
# "report": {
# "name": "connectivity",
# "status": "success",
# "duration": "168.82975ms"
# },
# "lastUpdateDate": "2020-02-26T07:39:35.215967Z",
# "validUntilDate": "2020-02-26T07:45:35.215967Z"
# }
# }
1.2 Explorer get balances
- Validate network connectivity
tg-validatord
->tg-proxyd
->Explorers
- Validate authentication by issuing a real busniess query
curl "https://int-validator-core-crdb.t-bx.io/rjpyber72n6brsdzksotivcm33mw78q4/api/rest/v1/health/blocksd/getbalance" -H "accept: application/json" -H "Content-Type: application/json" | jq .
# {
# "health": {
# "tenantId": "1",
# "componentName": "tg-validatord",
# "componentId": "d32d3002-e4d0-4736-bd02-def1d652e542",
# "group": "blocksd",
# "healthCheck": "getbalance",
# "status": "success",
# "report": {
# "name": "getbalance",
# "status": "success",
# "duration": "6.841373189s",
# "results": {
# "BCH": "success",
# "BSV": "success",
# "BTC": "success",
# "ETC": "success",
# "ETH": "success",
# "LTC": "success",
# "NEO": "success",
# "XLM": "success",
# "XRP": "success"
# }
# },
# "lastUpdateDate": "2020-02-26T07:44:41.862963Z",
# "validUntilDate": "2020-02-26T07:50:41.862963Z"
# }
# }
1.3 Explorer get fees
- Validate network connectivity
tg-validatord
->tg-proxyd
->Explorers
- Validate authentication by issuing a real busniess query
curl "https://int-validator-core-crdb.t-bx.io/rjpyber72n6brsdzksotivcm33mw78q4/api/rest/v1/health/blocksd/getfees" -H "accept: application/json" -H "Content-Type: application/json" | jq .
# {
# "health": {
# "tenantId": "1",
# "componentName": "tg-validatord",
# "componentId": "d32d3002-e4d0-4736-bd02-def1d652e542",
# "group": "blocksd",
# "healthCheck": "getfees",
# "status": "success",
# "report": {
# "name": "getfees",
# "status": "success",
# "duration": "2.981380824s",
# "results": {
# "BCH": "success",
# "BSV": "success",
# "BTC": "success",
# "ETC": "success",
# "ETH": "success",
# "LTC": "success",
# "NEO": "success",
# "XLM": "success",
# "XRP": "success"
# }
# },
# "lastUpdateDate": "2020-02-26T07:49:37.990769Z",
# "validUntilDate": "2020-02-26T07:55:37.990769Z"
# }
# }
2. Exchanges
2.1 Exchanges connectivity
- Validate network connectivity
tg-validatord
->tg-proxyd
->Exchanges
- No authentication
curl "https://int-validator-core-crdb.t-bx.io/rjpyber72n6brsdzksotivcm33mw78q4/api/rest/v1/health/exchanges/connectivity" -H "accept: application/json" -H "Content-Type: application/json" | jq .
# {
# "health": {
# "tenantId": "1",
# "componentName": "tg-validatord",
# "componentId": "d32d3002-e4d0-4736-bd02-def1d652e542",
# "group": "exchanges",
# "healthCheck": "connectivity",
# "status": "success",
# "report": {
# "name": "connectivity",
# "status": "success",
# "duration": "878.742646ms",
# "results": {
# "bitfinex": "success",
# "bitstamp": "success",
# "coinbase": "success",
# "coinbase-prime": "success",
# "coinbase-pro": "success",
# "kraken": "success"
# }
# },
# "lastUpdateDate": "2020-02-26T07:54:35.917377Z",
# "validUntilDate": "2020-02-26T08:00:35.917377Z"
# }
# }
2.2 Exchanges get balances
- Validate network connectivity
tg-validatord
->tg-proxyd
->Exchanges
- Validate secret within the HSM and API settings by issuing a real busniess query
curl "https://int-validator-core-crdb.t-bx.io/rjpyber72n6brsdzksotivcm33mw78q4/api/rest/v1/health/exchanges/getbalances" -H "accept: application/json" -H "Content-Type: application/json" | jq .
# {
# "health": {
# "tenantId": "1",
# "componentName": "tg-validatord",
# "componentId": "69431fcf-9122-4b2f-9e2f-e1a81b22e925",
# "group": "exchanges",
# "healthCheck": "getbalances",
# "status": "success",
# "report": {
# "name": "getbalances",
# "status": "success",
# "duration": "1.840217332s",
# "results": {
# "bitfinex": "success",
# "bitstamp": "success",
# "coinbase": "success",
# "coinbase-prime": "success",
# "coinbase-pro": "success",
# "kraken": "success"
# }
# },
# "lastUpdateDate": "2020-02-26T12:33:57.880516Z",
# "validUntilDate": "2020-02-26T12:39:57.880516Z"
# }
# }
3. HSM
3.1 HSM status
- Validate network connectivity
tg-validatord
->tg-vaultd
->HSM
curl "https://int-validator-core-crdb.t-bx.io/rjpyber72n6brsdzksotivcm33mw78q4/api/rest/v1/health/hsm/status" -H "accept: application/json" -H "Content-Type: application/json" | jq .
{
"health": {
"tenantId": "1",
"componentName": "tg-validatord",
"componentId": "24a73ad4-1acd-4f52-b4bb-2814d45f0159",
"group": "hsm",
"healthCheck": "status",
"status": "success",
"report": {
"name": "status",
"status": "success",
"duration": "57.967086ms"
},
"lastUpdateDate": "2020-02-26T12:46:02.143Z",
"validUntilDate": "2020-02-26T12:52:02.143Z"
}
}
3.2 All healthchecks at once
curl "https://int-validator-core-crdb.t-bx.io/rjpyber72n6brsdzksotivcm33mw78q4/api/rest/v1/health/all" -H "accept: application/json" -H "Content-Type: application/json" | jq .
# {
# "components": {
# "69431fcf-9122-4b2f-9e2f-e1a81b22e925": {
# "groups": {
# "blocksd": {
# "healthChecks": [
# {
# "tenantId": "1",
# "componentName": "tg-validatord",
# "componentId": "69431fcf-9122-4b2f-9e2f-e1a81b22e925",
# "group": "blocksd",
# "healthCheck": "connectivity",
# "status": "success",
# "report": {
# "name": "connectivity",
# "status": "success",
# "duration": "363.820605ms"
# },
# "lastUpdateDate": "2020-02-26T13:03:56.381501Z",
# "validUntilDate": "2020-02-26T13:09:56.381501Z"
# },
# {
# "tenantId": "1",
# "componentName": "tg-validatord",
# "componentId": "69431fcf-9122-4b2f-9e2f-e1a81b22e925",
# "group": "blocksd",
# "healthCheck": "getbalance",
# "status": "success",
# "report": {
# "name": "getbalance",
# "status": "success",
# "duration": "3.846308404s",
# "results": {
# "BCH": "success",
# "BSV": "success",
# "BTC": "success",
# "ETC": "success",
# "ETH": "success",
# "LTC": "success",
# "NEO": "success",
# "XLM": "success",
# "XRP": "success"
# }
# },
# "lastUpdateDate": "2020-02-26T13:03:59.891468Z",
# "validUntilDate": "2020-02-26T13:09:59.891468Z"
# },
# {
# "tenantId": "1",
# "componentName": "tg-validatord",
# "componentId": "69431fcf-9122-4b2f-9e2f-e1a81b22e925",
# "group": "blocksd",
# "healthCheck": "getfees",
# "status": "success",
# "report": {
# "name": "getfees",
# "status": "success",
# "duration": "1.52993246s",
# "results": {
# "BCH": "success",
# "BSV": "success",
# "BTC": "success",
# "ETC": "success",
# "ETH": "success",
# "LTC": "success",
# "NEO": "success",
# "XLM": "success",
# "XRP": "success"
# }
# },
# "lastUpdateDate": "2020-02-26T13:03:57.573781Z",
# "validUntilDate": "2020-02-26T13:09:57.573781Z"
# }
# ]
# },
# "exchanges": {
# "healthChecks": [
# {
# "tenantId": "1",
# "componentName": "tg-validatord",
# "componentId": "69431fcf-9122-4b2f-9e2f-e1a81b22e925",
# "group": "exchanges",
# "healthCheck": "connectivity",
# "status": "success",
# "report": {
# "name": "connectivity",
# "status": "success",
# "duration": "947.125484ms",
# "results": {
# "bitfinex": "success",
# "bitstamp": "success",
# "coinbase": "success",
# "coinbase-prime": "success",
# "coinbase-pro": "success",
# "kraken": "success"
# }
# },
# "lastUpdateDate": "2020-02-26T13:03:56.996581Z",
# "validUntilDate": "2020-02-26T13:09:56.996581Z"
# },
# {
# "tenantId": "1",
# "componentName": "tg-validatord",
# "componentId": "69431fcf-9122-4b2f-9e2f-e1a81b22e925",
# "group": "exchanges",
# "healthCheck": "getbalances",
# "status": "success",
# "report": {
# "name": "getbalances",
# "status": "success",
# "duration": "7.341551146s",
# "results": {
# "bitfinex": "success",
# "bitstamp": "success",
# "coinbase": "success",
# "coinbase-prime": "success",
# "coinbase-pro": "success",
# "kraken": "success"
# }
# },
# "lastUpdateDate": "2020-02-26T13:04:03.358945Z",
# "validUntilDate": "2020-02-26T13:10:03.358945Z"
# }
# ]
# },
# "hsm": {
# "healthChecks": [
# {
# "tenantId": "1",
# "componentName": "tg-validatord",
# "componentId": "69431fcf-9122-4b2f-9e2f-e1a81b22e925",
# "group": "hsm",
# "healthCheck": "status",
# "status": "failure",
# "report": {
# "name": "status",
# "status": "failure",
# "duration": "3.478921ms",
# "error": "rpc error: code = Unimplemented desc = unknown service tgvaultd.StatusService"
# },
# "lastUpdateDate": "2020-02-26T13:03:56.016787Z",
# "validUntilDate": "2020-02-26T13:09:56.016787Z"
# }
# ]
# }
# }
# },
# "d2ad5e68-64f0-4951-af5f-df5dabd5bc5c": {
# "groups": {
# "blocksd": {
# "healthChecks": [
# {
# "tenantId": "1",
# "componentName": "tg-validatord",
# "componentId": "d2ad5e68-64f0-4951-af5f-df5dabd5bc5c",
# "group": "blocksd",
# "healthCheck": "connectivity",
# "status": "success",
# "report": {
# "name": "connectivity",
# "status": "success",
# "duration": "756.639117ms"
# },
# "lastUpdateDate": "2020-02-26T13:04:15.774029Z",
# "validUntilDate": "2020-02-26T13:10:15.774029Z"
# },
# {
# "tenantId": "1",
# "componentName": "tg-validatord",
# "componentId": "d2ad5e68-64f0-4951-af5f-df5dabd5bc5c",
# "group": "blocksd",
# "healthCheck": "getbalance",
# "status": "success",
# "report": {
# "name": "getbalance",
# "status": "success",
# "duration": "6.843317934s",
# "results": {
# "BCH": "success",
# "BSV": "success",
# "BTC": "success",
# "ETC": "success",
# "ETH": "success",
# "LTC": "success",
# "NEO": "success",
# "XLM": "success",
# "XRP": "success"
# }
# },
# "lastUpdateDate": "2020-02-26T13:04:21.853091Z",
# "validUntilDate": "2020-02-26T13:10:21.853091Z"
# },
# {
# "tenantId": "1",
# "componentName": "tg-validatord",
# "componentId": "d2ad5e68-64f0-4951-af5f-df5dabd5bc5c",
# "group": "blocksd",
# "healthCheck": "getfees",
# "status": "success",
# "report": {
# "name": "getfees",
# "status": "success",
# "duration": "4.871957053s",
# "results": {
# "BCH": "success",
# "BSV": "success",
# "BTC": "success",
# "ETC": "success",
# "ETH": "success",
# "LTC": "success",
# "NEO": "success",
# "XLM": "success",
# "XRP": "success"
# }
# },
# "lastUpdateDate": "2020-02-26T13:04:19.910705Z",
# "validUntilDate": "2020-02-26T13:10:19.910705Z"
# }
# ]
# },
# "exchanges": {
# "healthChecks": [
# {
# "tenantId": "1",
# "componentName": "tg-validatord",
# "componentId": "d2ad5e68-64f0-4951-af5f-df5dabd5bc5c",
# "group": "exchanges",
# "healthCheck": "connectivity",
# "status": "success",
# "report": {
# "name": "connectivity",
# "status": "success",
# "duration": "943.639588ms",
# "results": {
# "bitfinex": "success",
# "bitstamp": "success",
# "coinbase": "success",
# "coinbase-prime": "success",
# "coinbase-pro": "success",
# "kraken": "success"
# }
# },
# "lastUpdateDate": "2020-02-26T13:04:15.987857Z",
# "validUntilDate": "2020-02-26T13:10:15.987857Z"
# },
# {
# "tenantId": "1",
# "componentName": "tg-validatord",
# "componentId": "d2ad5e68-64f0-4951-af5f-df5dabd5bc5c",
# "group": "exchanges",
# "healthCheck": "getbalances",
# "status": "success",
# "report": {
# "name": "getbalances",
# "status": "success",
# "duration": "4.319401552s",
# "results": {
# "bitfinex": "success",
# "bitstamp": "success",
# "coinbase": "success",
# "coinbase-prime": "success",
# "coinbase-pro": "success",
# "kraken": "success"
# }
# },
# "lastUpdateDate": "2020-02-26T13:04:19.331153Z",
# "validUntilDate": "2020-02-26T13:10:19.331153Z"
# }
# ]
# },
# "hsm": {
# "healthChecks": [
# {
# "tenantId": "1",
# "componentName": "tg-validatord",
# "componentId": "d2ad5e68-64f0-4951-af5f-df5dabd5bc5c",
# "group": "hsm",
# "healthCheck": "status",
# "status": "failure",
# "report": {
# "name": "status",
# "status": "failure",
# "duration": "922.354µs",
# "error": "rpc error: code = Unimplemented desc = unknown service tgvaultd.StatusService"
# },
# "lastUpdateDate": "2020-02-26T13:04:15.044891Z",
# "validUntilDate": "2020-02-26T13:10:15.044891Z"
# }
# ]
# }
# }
# }
# }
# }
4. API
4.1 Authenticate
curl -X POST "https://int-validator-core-crdb.t-bx.io/rjpyber72n6brsdzksotivcm33mw78q4/api/rest/v1/authentication/token" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"email\": \"[email protected]\", \"password\": \"XXXX\"}"
#{"result":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTEsImV4dGVybmFsVXNlcklEIjoidGVhbTFAYmFuay5jb20iLCJ0ZW5hbnRJRCI6MSwiZmlyc3RuYW1lIjoiSm9obiIsImxhc3RuYW1lIjoiVDEiLCJyb2xlcyI6WyJyZXF1ZXN0Y3JlYXRvciIsInJlcXVlc3RhcHByb3ZlciJdLCJlbWFpbCI6InRlYW0xQGJhbmsuY29tIiwiZXhwIjoxNTgyMjAwMTQwLCJpYXQiOjE1ODIxMTM3NDB9.S88CqMcBVKMIEbFstNmUaWnp9QcyfYaIfTAyedinudw"}
export AUTH="Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTEsImV4dGVybmFsVXNlcklEIjoidGVhbTFAYmFuay5jb20iLCJ0ZW5hbnRJRCI6MSwiZmlyc3RuYW1lIjoiSm9obiIsImxhc3RuYW1lIjoiVDEiLCJyb2xlcyI6WyJyZXF1ZXN0Y3JlYXRvciIsInJlcXVlc3RhcHByb3ZlciJdLCJlbWFpbCI6InRlYW0xQGJhbmsuY29tIiwiZXhwIjoxNTgyMjY1MTY0LCJpYXQiOjE1ODIxNzg3NjR9.G0HL5XTy_yinun1LIW9g9cy66_FXdufomZbrG3VmAA0"
4.2 Get BTC nostro wallet
curl -H 'Accept: application/json' -H "$AUTH" https://int-validator-core-crdb.t-bx.io/rjpyber72n6brsdzksotivcm33mw78q4/api/rest/v1/wallets/info | jq '.result[] | select(.seed == "btc" and .name == "nostro")'
4.3 Get all addresses from a currencies
curl -H 'Accept: application/json' -H "$AUTH" https://int-validator-core-crdb.t-bx.io/rjpyber72n6brsdzksotivcm33mw78q4/api/rest/v1/addresses?currency=BTC | jq '.result[] | select(.seed="BTC")'
4.4 Get rules and decode the proto
curl "https://int-validator-core-crdb.t-bx.io/rjpyber72n6brsdzksotivcm33mw78q4/api/rest/v1/rules" -H "accept: application/json" -H "Content-Type: application/json" -H "$AUTH" | jq .result.rulesContainer
#"CtMBChljaHJpc3RvcGhlQHRhdXJ1c2dyb3VwLmNoErEBLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFTEpoRVVOTExIZ0k4TGlXSmFlSkdwYUJmZHZnbwpZeUtzalNGeVRNeEVDUi9FKzFxcHpEbE5OdWc3aERQZ0JQcFozWitVOFFXamFLQjRNcmJqMi9rSW1RPT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tGgIABArOAQoUc3VwZXJhZG1pbjFAYmFuay5jb20SsgEtLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLQpNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVNMk50emFGaG03eElSM092V3E1Y2hXMy9HRXZXCkwrM3Vxb0U2bEVKMTNlV2J1bHhzUC81aDM2VkNxWURJR04vMHdEZVd3TFlkcHU1SGhTWFdoeENzQ0E9PQotLS0tLUVORCBQVUJMSUMgS0VZLS0tLS0KGgEDCs4BChRzdXBlcmFkbWluMkBiYW5rLmNvbRKyAS0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tCk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVk5ekd1Z3pOTElmcFp1YVVyenl3RWgvOFpkdFgKNElJdUlwREhMdkozNmdsRmpmeHhTWmRPRzZ5SEtGRmxRaDFHWDNPQ0ZaeEhlK3hlT0dCSkhCZ3JhQT09Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQoaAQMKzgEKFHN1cGVyYWRtaW4zQGJhbmsuY29tErIBLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFVjJ6RUR2WmpKL3FSK1FoMXIwc0tOY2kzOXc3OQpCMDBOZzVNR2c0d1JNN0FoOXByMUdia2dyS0lVZjRrYUhQanJQVmFRS0lSOHpEVTNqZ20wbFd4ZUhBPT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tChoBAwrIAQoOdGVhbTFAYmFuay5jb20SsQEtLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLQpNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVMSmhFVU5MTEhnSThMaVdKYWVKR3BhQmZkdmdvCll5S3NqU0Z5VE14RUNSL0UrMXFwekRsTk51ZzdoRFBnQlBwWjNaK1U4UVdqYUtCNE1yYmoyL2tJbVE9PQotLS0tLUVORCBQVUJMSUMgS0VZLS0tLS0aAgQACscBCg50ZWFtMkBiYW5rLmNvbRKxAS0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tCk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTRVQW8rR054dzR0RXFkbVREaTZ2Mk1acTJ1ZzgKYWpXOC9NbnFKL1FkNGJuaVB5RHZJVHJTRVpVeVA5VHZZcGtMQWJnL0FDeGNSL3lBNmxCRWd0RTYwUT09Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLRoBAArHAQoOdGVhbTNAYmFuay5jb20SsQEtLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLQpNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVIaml3VThDd3hQUEYrU3hiVFZPbTdaMW5kOVA2Cm1UYkZDMkZZVVlpU2xBSndmRTd3b003QkFPZzZiOFcweTBKSUpBYyt0MTZWN3pPTVd6c0ZWbWVlNmc9PQotLS0tLUVORCBQVUJMSUMgS0VZLS0tLS0aAQAK1wEKHXZhbGlkYXRvci1jb3JlQHRhdXJ1c2dyb3VwLmNoErEBLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFWVBYSUI0bXRxeTBBTHVFS2RZQWZRcFdtc0t1NgpEbTVhMDVkY1JVRlc1MkpHazBNNzdlc2FvSHNpSHVHODlxRnF5ZkZJLzJQZjRTL2hMbkhCR1dNbVJnPT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tGgIBAhIoCgdfX2dyb3VwEh12YWxpZGF0b3ItY29yZUB0YXVydXNncm91cC5jaBInCgZyZXZpZXcSHXZhbGlkYXRvci1jb3JlQHRhdXJ1c2dyb3VwLmNoEjIKBXRlYW0xEhljaHJpc3RvcGhlQHRhdXJ1c2dyb3VwLmNoEg50ZWFtMUBiYW5rLmNv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"
# Raw decode
echo -n "CtMBChljaHJpc3RvcGhlQHRhdXJ1c2dyb3VwLmNoErEBLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFTEpoRVVOTExIZ0k4TGlXSmFlSkdwYUJmZHZnbwpZeUtzalNGeVRNeEVDUi9FKzFxcHpEbE5OdWc3aERQZ0JQcFozWitVOFFXamFLQjRNcmJqMi9rSW1RPT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tGgIABArOAQoUc3VwZXJhZG1pbjFAYmFuay5jb20SsgEtLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLQpNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVNMk50emFGaG03eElSM092V3E1Y2hXMy9HRXZXCkwrM3Vxb0U2bEVKMTNlV2J1bHhzUC81aDM2VkNxWURJR04vMHdEZVd3TFlkcHU1SGhTWFdoeENzQ0E9PQotLS0tLUVORCBQVUJMSUMgS0VZLS0tLS0KGgEDCs4BChRzdXBlcmFkbWluMkBiYW5rLmNvbRKyAS0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tCk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVk5ekd1Z3pOTElmcFp1YVVyenl3RWgvOFpkdFgKNElJdUlwREhMdkozNmdsRmpmeHhTWmRPRzZ5SEtGRmxRaDFHWDNPQ0ZaeEhlK3hlT0dCSkhCZ3JhQT09Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQoaAQMKzgEKFHN1cGVyYWRtaW4zQGJhbmsuY29tErIBLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFVjJ6RUR2WmpKL3FSK1FoMXIwc0tOY2kzOXc3OQpCMDBOZzVNR2c0d1JNN0FoOXByMUdia2dyS0lVZjRrYUhQanJQVmFRS0lSOHpEVTNqZ20wbFd4ZUhBPT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tChoBAwrIAQoOdGVhbTFAYmFuay5jb20SsQEtLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLQpNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVMSmhFVU5MTEhnSThMaVdKYWVKR3BhQmZkdmdvCll5S3NqU0Z5VE14RUNSL0UrMXFwekRsTk51ZzdoRFBnQlBwWjNaK1U4UVdqYUtCNE1yYmoyL2tJbVE9PQotLS0tLUVORCBQVUJMSUMgS0VZLS0tLS0aAgQACscBCg50ZWFtMkBiYW5rLmNvbRKxAS0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tCk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTRVQW8rR054dzR0RXFkbVREaTZ2Mk1acTJ1ZzgKYWpXOC9NbnFKL1FkNGJuaVB5RHZJVHJTRVpVeVA5VHZZcGtMQWJnL0FDeGNSL3lBNmxCRWd0RTYwUT09Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLRoBAArHAQoOdGVhbTNAYmFuay5jb20SsQEtLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLQpNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVIaml3VThDd3hQUEYrU3hiVFZPbTdaMW5kOVA2Cm1UYkZDMkZZVVlpU2xBSndmRTd3b003QkFPZzZiOFcweTBKSUpBYyt0MTZWN3pPTVd6c0ZWbWVlNmc9PQotLS0tLUVORCBQVUJMSUMgS0VZLS0tLS0aAQAK1wEKHXZhbGlkYXRvci1jb3JlQHRhdXJ1c2dyb3VwLmNoErEBLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFWVBYSUI0bXRxeTBBTHVFS2RZQWZRcFdtc0t1NgpEbTVhMDVkY1JVRlc1MkpHazBNNzdlc2FvSHNpSHVHODlxRnF5ZkZJLzJQZjRTL2hMbkhCR1dNbVJnPT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tGgIBAhIoCgdfX2dyb3VwEh12YWxpZGF0b3ItY29yZUB0YXVydXNncm91cC5jaBInCgZyZXZpZXcSHXZhbGlkYXRvci1jb3JlQHRhdXJ1c2dyb3VwLmNoEjIKBXRlYW0xEhljaHJpc3RvcGhlQHRhdXJ1c2dyb3VwLmNoEg50ZWFtMUBiYW5rLmNv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" | base64 -d | protoc --decode_raw
#Using proto file
echo -n "CtMBChljaHJpc3RvcGhlQHRhdXJ1c2dyb3VwLmNoErEBLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFTEpoRVVOTExIZ0k4TGlXSmFlSkdwYUJmZHZnbwpZeUtzalNGeVRNeEVDUi9FKzFxcHpEbE5OdWc3aERQZ0JQcFozWitVOFFXamFLQjRNcmJqMi9rSW1RPT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tGgIABArOAQoUc3VwZXJhZG1pbjFAYmFuay5jb20SsgEtLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLQpNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVNMk50emFGaG03eElSM092V3E1Y2hXMy9HRXZXCkwrM3Vxb0U2bEVKMTNlV2J1bHhzUC81aDM2VkNxWURJR04vMHdEZVd3TFlkcHU1SGhTWFdoeENzQ0E9PQotLS0tLUVORCBQVUJMSUMgS0VZLS0tLS0KGgEDCs4BChRzdXBlcmFkbWluMkBiYW5rLmNvbRKyAS0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tCk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVk5ekd1Z3pOTElmcFp1YVVyenl3RWgvOFpkdFgKNElJdUlwREhMdkozNmdsRmpmeHhTWmRPRzZ5SEtGRmxRaDFHWDNPQ0ZaeEhlK3hlT0dCSkhCZ3JhQT09Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQoaAQMKzgEKFHN1cGVyYWRtaW4zQGJhbmsuY29tErIBLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFVjJ6RUR2WmpKL3FSK1FoMXIwc0tOY2kzOXc3OQpCMDBOZzVNR2c0d1JNN0FoOXByMUdia2dyS0lVZjRrYUhQanJQVmFRS0lSOHpEVTNqZ20wbFd4ZUhBPT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tChoBAwrIAQoOdGVhbTFAYmFuay5jb20SsQEtLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLQpNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVMSmhFVU5MTEhnSThMaVdKYWVKR3BhQmZkdmdvCll5S3NqU0Z5VE14RUNSL0UrMXFwekRsTk51ZzdoRFBnQlBwWjNaK1U4UVdqYUtCNE1yYmoyL2tJbVE9PQotLS0tLUVORCBQVUJMSUMgS0VZLS0tLS0aAgQACscBCg50ZWFtMkBiYW5rLmNvbRKxAS0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tCk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTRVQW8rR054dzR0RXFkbVREaTZ2Mk1acTJ1ZzgKYWpXOC9NbnFKL1FkNGJuaVB5RHZJVHJTRVpVeVA5VHZZcGtMQWJnL0FDeGNSL3lBNmxCRWd0RTYwUT09Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLRoBAArHAQoOdGVhbTNAYmFuay5jb20SsQEtLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLQpNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVIaml3VThDd3hQUEYrU3hiVFZPbTdaMW5kOVA2Cm1UYkZDMkZZVVlpU2xBSndmRTd3b003QkFPZzZiOFcweTBKSUpBYyt0MTZWN3pPTVd6c0ZWbWVlNmc9PQotLS0tLUVORCBQVUJMSUMgS0VZLS0tLS0aAQAK1wEKHXZhbGlkYXRvci1jb3JlQHRhdXJ1c2dyb3VwLmNoErEBLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFWVBYSUI0bXRxeTBBTHVFS2RZQWZRcFdtc0t1NgpEbTVhMDVkY1JVRlc1MkpHazBNNzdlc2FvSHNpSHVHODlxRnF5ZkZJLzJQZjRTL2hMbkhCR1dNbVJnPT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tGgIBAhIoCgdfX2dyb3VwEh12YWxpZGF0b3ItY29yZUB0YXVydXNncm91cC5jaBInCgZyZXZpZXcSHXZhbGlkYXRvci1jb3JlQHRhdXJ1c2dyb3VwLmNoEjIKBXRlYW0xEhljaHJpc3RvcGhlQHRhdXJ1c2dyb3VwLmNoEg50ZWFtMUBiYW5rLmNv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" | base64 -d | protoc --decode tgvalidatord.Rules rule.proto