Helpers & monitoring

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