diff --git a/source/includes/_account.md b/source/includes/_account.md
index e0fa3117..30d4afac 100644
--- a/source/includes/_account.md
+++ b/source/includes/_account.md
@@ -194,6 +194,7 @@ func main() {
+
**Coin**
@@ -225,6 +226,7 @@ gas fee: 0.0000660495 INJ
+
**TxResponse**
@@ -244,6 +246,7 @@ gas fee: 0.0000660495 INJ
+
**ABCIMessageLog**
@@ -253,6 +256,7 @@ gas fee: 0.0000660495 INJ
+
**Event**
@@ -261,6 +265,7 @@ gas fee: 0.0000660495 INJ
+
**StringEvent**
@@ -269,6 +274,7 @@ gas fee: 0.0000660495 INJ
+
**EventAttribute**
@@ -278,6 +284,7 @@ gas fee: 0.0000660495 INJ
+
**Attribute**
@@ -475,6 +482,7 @@ func main() {
+
**Coin**
@@ -506,6 +514,7 @@ gas fee: 0.000064803 INJ
+
**TxResponse**
@@ -525,6 +534,7 @@ gas fee: 0.000064803 INJ
+
**ABCIMessageLog**
@@ -534,6 +544,7 @@ gas fee: 0.000064803 INJ
+
**Event**
@@ -542,6 +553,7 @@ gas fee: 0.000064803 INJ
+
**StringEvent**
@@ -550,6 +562,7 @@ gas fee: 0.000064803 INJ
+
**EventAttribute**
@@ -559,6 +572,7 @@ gas fee: 0.000064803 INJ
+
**Attribute**
@@ -766,6 +780,7 @@ func main() {
+
**Coin**
@@ -797,6 +812,7 @@ gas fee: 0.0000610515 INJ
+
**TxResponse**
@@ -816,6 +832,7 @@ gas fee: 0.0000610515 INJ
+
**ABCIMessageLog**
@@ -825,6 +842,7 @@ gas fee: 0.0000610515 INJ
+
**Event**
@@ -833,6 +851,7 @@ gas fee: 0.0000610515 INJ
+
**StringEvent**
@@ -841,6 +860,7 @@ gas fee: 0.0000610515 INJ
+
**EventAttribute**
@@ -850,6 +870,7 @@ gas fee: 0.0000610515 INJ
+
**Attribute**
@@ -1057,6 +1078,7 @@ func main() {
+
**Coin**
@@ -1088,6 +1110,7 @@ gas fee: 0.0000611985 INJ
+
**TxResponse**
@@ -1107,6 +1130,7 @@ gas fee: 0.0000611985 INJ
+
**ABCIMessageLog**
@@ -1116,6 +1140,7 @@ gas fee: 0.0000611985 INJ
+
**Event**
@@ -1124,6 +1149,7 @@ gas fee: 0.0000611985 INJ
+
**StringEvent**
@@ -1132,6 +1158,7 @@ gas fee: 0.0000611985 INJ
+
**EventAttribute**
@@ -1141,6 +1168,7 @@ gas fee: 0.0000611985 INJ
+
**Attribute**
diff --git a/source/includes/_binaryoptions.md b/source/includes/_binaryoptions.md
index 09a50208..fdf8a92a 100644
--- a/source/includes/_binaryoptions.md
+++ b/source/includes/_binaryoptions.md
@@ -133,6 +133,7 @@ func main() {
+
**BinaryOptionsMarket**
@@ -156,6 +157,7 @@ func main() {
+
**OracleType**
@@ -378,6 +380,7 @@ func main() {
+
**OracleType**
@@ -407,6 +410,7 @@ func main() {
+
**TxResponse**
@@ -426,6 +430,7 @@ func main() {
+
**ABCIMessageLog**
@@ -435,6 +440,7 @@ func main() {
+
**Event**
@@ -443,6 +449,7 @@ func main() {
+
**StringEvent**
@@ -451,6 +458,7 @@ func main() {
+
**EventAttribute**
@@ -460,6 +468,7 @@ func main() {
+
**Attribute**
@@ -591,6 +600,7 @@ if __name__ == "__main__":
+
**DerivativeOrder**
@@ -602,6 +612,7 @@ if __name__ == "__main__":
+
**OrderInfo**
@@ -613,6 +624,7 @@ if __name__ == "__main__":
+
**OrderType**
@@ -653,6 +665,7 @@ gas fee: 0.0000606245 INJ
+
**TxResponse**
@@ -672,6 +685,7 @@ gas fee: 0.0000606245 INJ
+
**ABCIMessageLog**
@@ -681,6 +695,7 @@ gas fee: 0.0000606245 INJ
+
**Event**
@@ -689,6 +704,7 @@ gas fee: 0.0000606245 INJ
+
**StringEvent**
@@ -697,6 +713,7 @@ gas fee: 0.0000606245 INJ
+
**EventAttribute**
@@ -706,6 +723,7 @@ gas fee: 0.0000606245 INJ
+
**Attribute**
@@ -832,6 +850,7 @@ if __name__ == "__main__":
+
**DerivativeOrder**
@@ -843,6 +862,7 @@ if __name__ == "__main__":
+
**OrderInfo**
@@ -854,6 +874,7 @@ if __name__ == "__main__":
+
**OrderType**
@@ -894,6 +915,7 @@ gas fee: 0.0000539515 INJ
+
**TxResponse**
@@ -913,6 +935,7 @@ gas fee: 0.0000539515 INJ
+
**ABCIMessageLog**
@@ -922,6 +945,7 @@ gas fee: 0.0000539515 INJ
+
**Event**
@@ -930,6 +954,7 @@ gas fee: 0.0000539515 INJ
+
**StringEvent**
@@ -938,6 +963,7 @@ gas fee: 0.0000539515 INJ
+
**EventAttribute**
@@ -947,6 +973,7 @@ gas fee: 0.0000539515 INJ
+
**Attribute**
@@ -1066,6 +1093,7 @@ if __name__ == "__main__":
+
**OrderMask**
@@ -1100,6 +1128,7 @@ gas fee: 0.0000556515 INJ
+
**TxResponse**
@@ -1119,6 +1148,7 @@ gas fee: 0.0000556515 INJ
+
**ABCIMessageLog**
@@ -1128,6 +1158,7 @@ gas fee: 0.0000556515 INJ
+
**Event**
@@ -1136,6 +1167,7 @@ gas fee: 0.0000556515 INJ
+
**StringEvent**
@@ -1144,6 +1176,7 @@ gas fee: 0.0000556515 INJ
+
**EventAttribute**
@@ -1153,6 +1186,7 @@ gas fee: 0.0000556515 INJ
+
**Attribute**
@@ -1281,6 +1315,7 @@ if __name__ == "__main__":
+
**MarketStatus**
@@ -1312,6 +1347,7 @@ gas fee: 0.0000556515 INJ
+
**TxResponse**
@@ -1331,6 +1367,7 @@ gas fee: 0.0000556515 INJ
+
**ABCIMessageLog**
@@ -1340,6 +1377,7 @@ gas fee: 0.0000556515 INJ
+
**Event**
@@ -1348,6 +1386,7 @@ gas fee: 0.0000556515 INJ
+
**StringEvent**
@@ -1356,6 +1395,7 @@ gas fee: 0.0000556515 INJ
+
**EventAttribute**
@@ -1365,6 +1405,7 @@ gas fee: 0.0000556515 INJ
+
**Attribute**
@@ -1748,6 +1789,7 @@ func main() {
+
**OrderData**
@@ -1759,6 +1801,7 @@ func main() {
+
**SpotOrder**
@@ -1769,6 +1812,7 @@ func main() {
+
**DerivativeOrder**
@@ -1780,6 +1824,7 @@ func main() {
+
**OrderMask**
@@ -1794,6 +1839,7 @@ func main() {
+
**OrderInfo**
@@ -1805,6 +1851,7 @@ func main() {
+
**OrderType**
@@ -1858,6 +1905,7 @@ gas fee: 0.000329546 INJ
+
**TxResponse**
@@ -1877,6 +1925,7 @@ gas fee: 0.000329546 INJ
+
**ABCIMessageLog**
@@ -1886,6 +1935,7 @@ gas fee: 0.000329546 INJ
+
**Event**
@@ -1894,6 +1944,7 @@ gas fee: 0.000329546 INJ
+
**StringEvent**
@@ -1902,6 +1953,7 @@ gas fee: 0.000329546 INJ
+
**EventAttribute**
@@ -1911,6 +1963,7 @@ gas fee: 0.000329546 INJ
+
**Attribute**
diff --git a/source/includes/_chainexchange.md b/source/includes/_chainexchange.md
index 02a2c26f..0dd1d07f 100644
--- a/source/includes/_chainexchange.md
+++ b/source/includes/_chainexchange.md
@@ -133,6 +133,7 @@ func main() {
+
**Subaccount**
@@ -183,6 +184,7 @@ func main() {
+
**Deposit**
@@ -339,6 +341,7 @@ func main() {
+
**Deposit**
@@ -478,6 +481,7 @@ No parameters
+
**Balance**
@@ -487,6 +491,7 @@ No parameters
+
**Deposit**
@@ -671,6 +676,7 @@ func main() {
+
**MarketVolume**
@@ -679,6 +685,7 @@ func main() {
+
**VolumeRecord**
@@ -856,6 +863,7 @@ func main() {
+
**AggregateAccountVolumeRecord**
@@ -864,6 +872,7 @@ func main() {
+
**MarketVolume**
@@ -872,6 +881,7 @@ func main() {
+
**VolumeRecord**
@@ -1014,6 +1024,7 @@ func main() {
+
**VolumeRecord**
@@ -1161,6 +1172,7 @@ func main() {
+
**MarketVolume**
@@ -1169,6 +1181,7 @@ func main() {
+
**VolumeRecord**
@@ -1444,6 +1457,7 @@ func main() {
+
**DenomDecimals**
@@ -1607,6 +1621,7 @@ func main() {
+
**SubaccountOrderData**
@@ -1615,6 +1630,7 @@ func main() {
+
**SubaccountOrder**
@@ -1940,6 +1956,7 @@ func main() {
+
**SubaccountOrderbookMetadataWithMarket**
@@ -1949,6 +1966,7 @@ func main() {
+
**SubaccountOrderbookMetadata**
@@ -2403,6 +2421,7 @@ No parameters
+
**TradingRewardCampaignInfo**
@@ -2413,6 +2432,7 @@ No parameters
+
**CampaignRewardPool**
@@ -2421,6 +2441,7 @@ No parameters
+
**TradingRewardCampaignBoostInfo**
@@ -2431,6 +2452,7 @@ No parameters
+
**PointsMultiplier**
@@ -2588,6 +2610,7 @@ func main() {
+
**FeeDiscountTierInfo**
@@ -2598,6 +2621,7 @@ func main() {
+
**FeeDiscountTierTTL**
@@ -2796,6 +2820,7 @@ No parameters
+
**FeeDiscountSchedule**
@@ -2807,6 +2832,7 @@ No parameters
+
**FeeDiscountTierInfo**
@@ -3061,6 +3087,7 @@ func main() {
+
**BalanceMismatch**
@@ -3213,6 +3240,7 @@ No parameters
+
**BalanceWithMarginHold**
@@ -3385,6 +3413,7 @@ No parameters
+
**TierStatistic**
@@ -3804,6 +3833,7 @@ func main() {
+
**TradeRecords**
@@ -3812,6 +3842,7 @@ func main() {
+
**TradeRecord**
@@ -4232,6 +4263,7 @@ func main() {
+
**TradeHistoryOptions**
@@ -4280,6 +4312,7 @@ func main() {
+
**MetadataStatistics**
@@ -4295,6 +4328,7 @@ func main() {
+
**TradeRecord**
@@ -4626,6 +4660,7 @@ func main() {
+
**TxResponse**
@@ -4645,6 +4680,7 @@ func main() {
+
**ABCIMessageLog**
@@ -4654,6 +4690,7 @@ func main() {
+
**Event**
@@ -4662,6 +4699,7 @@ func main() {
+
**StringEvent**
@@ -4670,6 +4708,7 @@ func main() {
+
**EventAttribute**
@@ -4679,6 +4718,7 @@ func main() {
+
**Attribute**
diff --git a/source/includes/_changelog.md b/source/includes/_changelog.md
index 95b9934d..dd4c5044 100644
--- a/source/includes/_changelog.md
+++ b/source/includes/_changelog.md
@@ -1,5 +1,13 @@
# Change Log
+## 9999-99-99
+- Updated the API documentation to include all queries and messages for the `tendermint` module
+- Python SDK v1.6.0
+ - Added support for all queries from the `tendermint` module
+ - Added support for all queries from the `IBC transfer` module
+ - Added support for all queries from the `IBC core channel` module
+ - Added support for all queries from the `IBC core client` module
+
## 2024-03-08
- Updated the API documentation to include all queries and messages for the `distribution` and `chain exchange` modules
- Python SDK v1.4.0
diff --git a/source/includes/_derivatives.md b/source/includes/_derivatives.md
index b84f22dd..e43203fe 100644
--- a/source/includes/_derivatives.md
+++ b/source/includes/_derivatives.md
@@ -297,6 +297,7 @@ func main() {
+
**Level**
@@ -455,6 +456,7 @@ func main() {
+
**TrimmedDerivativeLimitOrder**
@@ -614,6 +616,7 @@ func main() {
+
**TrimmedDerivativeLimitOrder**
@@ -779,6 +782,7 @@ func main() {
+
**TrimmedDerivativeLimitOrder**
@@ -941,6 +945,7 @@ func main() {
+
**TrimmedDerivativeLimitOrder**
@@ -1125,6 +1130,7 @@ func main() {
+
**FullDerivativeMarket**
@@ -1135,6 +1141,7 @@ func main() {
+
**DerivativeMarket**
@@ -1157,6 +1164,7 @@ func main() {
+
**OracleType**
@@ -1175,6 +1183,7 @@ func main() {
+
**MarketStatus**
@@ -1186,6 +1195,7 @@ func main() {
+
**PerpetualMarketState**
@@ -1194,6 +1204,7 @@ func main() {
+
**PerpetualMarketInfo**
@@ -1205,6 +1216,7 @@ func main() {
+
**PerpetualMarketFunding**
@@ -1214,6 +1226,7 @@ func main() {
+
**ExpiryFuturesMarketInfo**
@@ -1390,6 +1403,7 @@ func main() {
+
**FullDerivativeMarket**
@@ -1400,6 +1414,7 @@ func main() {
+
**DerivativeMarket**
@@ -1422,6 +1437,7 @@ func main() {
+
**OracleType**
@@ -1440,6 +1456,7 @@ func main() {
+
**MarketStatus**
@@ -1451,6 +1468,7 @@ func main() {
+
**PerpetualMarketState**
@@ -1459,6 +1477,7 @@ func main() {
+
**PerpetualMarketInfo**
@@ -1470,6 +1489,7 @@ func main() {
+
**PerpetualMarketFunding**
@@ -1479,6 +1499,7 @@ func main() {
+
**ExpiryFuturesMarketInfo**
@@ -1771,6 +1792,7 @@ No parameters
+
**DerivativePosition**
@@ -1780,6 +1802,7 @@ No parameters
+
**Position**
@@ -1993,6 +2016,7 @@ func main() {
+
**DerivativePosition**
@@ -2002,6 +2026,7 @@ func main() {
+
**Position**
@@ -2168,6 +2193,7 @@ func main() {
+
**Position**
@@ -2333,6 +2359,7 @@ func main() {
+
**EffectivePosition**
@@ -2480,6 +2507,7 @@ func main() {
+
**PerpetualMarketInfo**
@@ -2620,6 +2648,7 @@ func main() {
+
**ExpiryFuturesMarketInfo**
@@ -2766,6 +2795,7 @@ func main() {
+
**PerpetualMarketFunding**
@@ -2925,6 +2955,7 @@ func main() {
+
**TrimmedDerivativeConditionalOrder**
@@ -3141,6 +3172,7 @@ func main() {
+
**OracleType**
@@ -3170,6 +3202,7 @@ func main() {
+
**TxResponse**
@@ -3189,6 +3222,7 @@ func main() {
+
**ABCIMessageLog**
@@ -3198,6 +3232,7 @@ func main() {
+
**Event**
@@ -3206,6 +3241,7 @@ func main() {
+
**StringEvent**
@@ -3214,6 +3250,7 @@ func main() {
+
**EventAttribute**
@@ -3223,6 +3260,7 @@ func main() {
+
**Attribute**
@@ -3437,6 +3475,7 @@ func main() {
+
**OracleType**
@@ -3466,6 +3505,7 @@ func main() {
+
**TxResponse**
@@ -3485,6 +3525,7 @@ func main() {
+
**ABCIMessageLog**
@@ -3494,6 +3535,7 @@ func main() {
+
**Event**
@@ -3502,6 +3544,7 @@ func main() {
+
**StringEvent**
@@ -3510,6 +3553,7 @@ func main() {
+
**EventAttribute**
@@ -3519,6 +3563,7 @@ func main() {
+
**Attribute**
@@ -3786,6 +3831,7 @@ func main() {
+
**DerivativeOrder**
@@ -3797,6 +3843,7 @@ func main() {
+
**OrderInfo**
@@ -3808,6 +3855,7 @@ func main() {
+
**OrderType**
@@ -3853,6 +3901,7 @@ gas fee: 0.0000857195 INJ
+
**TxResponse**
@@ -3872,6 +3921,7 @@ gas fee: 0.0000857195 INJ
+
**ABCIMessageLog**
@@ -3881,6 +3931,7 @@ gas fee: 0.0000857195 INJ
+
**Event**
@@ -3889,6 +3940,7 @@ gas fee: 0.0000857195 INJ
+
**StringEvent**
@@ -3897,6 +3949,7 @@ gas fee: 0.0000857195 INJ
+
**EventAttribute**
@@ -3906,6 +3959,7 @@ gas fee: 0.0000857195 INJ
+
**Attribute**
@@ -4175,6 +4229,7 @@ func main() {
+
**DerivativeOrder**
@@ -4186,6 +4241,7 @@ func main() {
+
**OrderInfo**
@@ -4197,6 +4253,7 @@ func main() {
+
**OrderType**
@@ -4242,6 +4299,7 @@ gas fee: 0.000069981 INJ
+
**TxResponse**
@@ -4261,6 +4319,7 @@ gas fee: 0.000069981 INJ
+
**ABCIMessageLog**
@@ -4270,6 +4329,7 @@ gas fee: 0.000069981 INJ
+
**Event**
@@ -4278,6 +4338,7 @@ gas fee: 0.000069981 INJ
+
**StringEvent**
@@ -4286,6 +4347,7 @@ gas fee: 0.000069981 INJ
+
**EventAttribute**
@@ -4295,6 +4357,7 @@ gas fee: 0.000069981 INJ
+
**Attribute**
@@ -4501,6 +4564,7 @@ func main() {
+
**OrderMask**
@@ -4543,6 +4607,7 @@ gas fee: 0.0000706865 INJ
+
**TxResponse**
@@ -4562,6 +4627,7 @@ gas fee: 0.0000706865 INJ
+
**ABCIMessageLog**
@@ -4571,6 +4637,7 @@ gas fee: 0.0000706865 INJ
+
**Event**
@@ -4579,6 +4646,7 @@ gas fee: 0.0000706865 INJ
+
**StringEvent**
@@ -4587,6 +4655,7 @@ gas fee: 0.0000706865 INJ
+
**EventAttribute**
@@ -4596,6 +4665,7 @@ gas fee: 0.0000706865 INJ
+
**Attribute**
@@ -4979,6 +5049,7 @@ func main() {
+
**OrderData**
@@ -4990,6 +5061,7 @@ func main() {
+
**SpotOrder**
@@ -5000,6 +5072,7 @@ func main() {
+
**DerivativeOrder**
@@ -5011,6 +5084,7 @@ func main() {
+
**OrderMask**
@@ -5025,6 +5099,7 @@ func main() {
+
**OrderInfo**
@@ -5036,6 +5111,7 @@ func main() {
+
**OrderType**
@@ -5089,6 +5165,7 @@ gas fee: 0.000329546 INJ
+
**TxResponse**
@@ -5108,6 +5185,7 @@ gas fee: 0.000329546 INJ
+
**ABCIMessageLog**
@@ -5117,6 +5195,7 @@ gas fee: 0.000329546 INJ
+
**Event**
@@ -5125,6 +5204,7 @@ gas fee: 0.000329546 INJ
+
**StringEvent**
@@ -5133,6 +5213,7 @@ gas fee: 0.000329546 INJ
+
**EventAttribute**
@@ -5142,6 +5223,7 @@ gas fee: 0.000329546 INJ
+
**Attribute**
@@ -5403,6 +5485,7 @@ func main() {
+
**DerivativeOrder**
@@ -5414,6 +5497,7 @@ func main() {
+
**OrderInfo**
@@ -5425,6 +5509,7 @@ func main() {
+
**OrderType**
@@ -5455,6 +5540,7 @@ func main() {
+
**TxResponse**
@@ -5474,6 +5560,7 @@ func main() {
+
**ABCIMessageLog**
@@ -5483,6 +5570,7 @@ func main() {
+
**Event**
@@ -5491,6 +5579,7 @@ func main() {
+
**StringEvent**
@@ -5499,6 +5588,7 @@ func main() {
+
**EventAttribute**
@@ -5508,6 +5598,7 @@ func main() {
+
**Attribute**
@@ -5743,6 +5834,7 @@ gas fee: 0.000066807 INJ
+
**TxResponse**
@@ -5762,6 +5854,7 @@ gas fee: 0.000066807 INJ
+
**ABCIMessageLog**
@@ -5771,6 +5864,7 @@ gas fee: 0.000066807 INJ
+
**Event**
@@ -5779,6 +5873,7 @@ gas fee: 0.000066807 INJ
+
**StringEvent**
@@ -5787,6 +5882,7 @@ gas fee: 0.000066807 INJ
+
**EventAttribute**
@@ -5796,6 +5892,7 @@ gas fee: 0.000066807 INJ
+
**Attribute**
diff --git a/source/includes/_ibccorechannel.md b/source/includes/_ibccorechannel.md
new file mode 100644
index 00000000..f1bb688f
--- /dev/null
+++ b/source/includes/_ibccorechannel.md
@@ -0,0 +1,2544 @@
+# - IBC Core Channel
+
+Includes all the messages and queries associated to channels from the IBC core channel module
+
+## Channel
+
+Queries an IBC Channel
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ port_id = "transfer"
+ channel_id = "channel-126"
+
+ channel = await client.fetch_ibc_channel(port_id=port_id, channel_id=channel_id)
+ print(channel)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ portId := "transfer"
+ channelId := "channel-126"
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCChannel(ctx, portId, channelId)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+
+
Parameter | Type | Description | Required |
---|
port_id | String | Port unique identifier | Yes |
+channel_id | String | Channel unique identifier | Yes |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "channel":{
+ "state":"STATE_OPEN",
+ "ordering":"ORDER_UNORDERED",
+ "counterparty":{
+ "portId":"transfer",
+ "channelId":"channel-352"
+ },
+ "connectionHops":[
+ "connection-173"
+ ],
+ "version":"ics20-1"
+ },
+ "proofHeight":{
+ "revisionNumber":"888",
+ "revisionHeight":"26820151"
+ },
+ "proof":""
+}
+```
+
+
+Parameter | Type | Description |
---|
channel | Channel | Channel details |
+proof | Byte Array | Merkle proof of existence |
+proof_height | Height | Height at which the proof was retrieved |
+
+
+
+
+**Channel**
+
+
+Parameter | Type | Description |
---|
channel | Channel | Channel details |
+proof | Byte Array | Merkle proof of existence |
+proof_height | Height | Height at which the proof was retrieved |
+
+
+
+
+**State**
+
+
+Code | Name |
---|
0 | STATE_UNINITIALIZED_UNSPECIFIED |
+1 | STATE_INIT |
+2 | STATE_TRYOPEN |
+3 | STATE_OPEN |
+4 | STATE_CLOSED |
+
+
+
+
+**Order**
+
+
+Code | Name |
---|
0 | ORDER_NONE_UNSPECIFIED |
+1 | ORDER_UNORDERED |
+2 | ORDER_ORDERED |
+
+
+
+
+**Counterparty**
+
+
+Parameter | Type | Description |
---|
port_id | String | Port on the counterparty chain which owns the other end of the channel |
+channel_id | String | Channel end on the counterparty chain |
+
+
+
+
+**Height**
+
+
+Parameter | Type | Description |
---|
revision_number | Integer | The revision that the client is currently on |
+revision_height | Integer | The height within the given revision |
+
+
+
+## Channels
+
+Queries all the IBC channels of a chain
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.client.model.pagination import PaginationOption
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ pagination = PaginationOption(skip=2, limit=4)
+
+ channels = await client.fetch_ibc_channels(pagination=pagination)
+ print(channels)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "github.com/cosmos/cosmos-sdk/types/query"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ pagination := query.PageRequest{Offset: 2, Limit: 4}
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCChannels(ctx, &pagination)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
pagination | PageRequest | The optional pagination for the request | No |
+
+
+
+
+**PageRequest**
+
+
+Parameter | Type | Description | Required |
---|
key | Byte Array | Key is a value returned in PageResponse.next_key to begin querying the next page most efficiently. Only one of offset or key should be set | No |
+offset | Integer | Numeric offset that can be used when key is unavailable. It is less efficient than using key. Only one of offset or key should be set | No |
+limit | Integer | Total number of results to be returned in the result page | No |
+count_total | Boolean | Set to true to indicate that the result set should include a count of the total number of items available for pagination in UIs. It is only respected when offset is used. It is ignored when key is set | No |
+reverse | Boolean | Reverse is set to true if results are to be returned in the descending order | No |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "channels":[
+ {
+ "state":"STATE_OPEN",
+ "ordering":"ORDER_ORDERED",
+ "counterparty":{
+ "portId":"icacontroller-sweep-inj",
+ "channelId":"channel-19"
+ },
+ "connectionHops":[
+ "connection-182"
+ ],
+ "version":"{\"version\":\"ics27-1\",\"controller_connection_id\":\"connection-9\",\"host_connection_id\":\"connection-182\",\"address\":\"inj1v0es67dxtlmzmauhr3krk058sp9cvt6e2hvmys2g8pjnpj30fezq93qp07\",\"encoding\":\"proto3\",\"tx_type\":\"sdk_multi_msg\"}",
+ "portId":"icahost",
+ "channelId":"channel-134"
+ },
+ {
+ "state":"STATE_CLOSED",
+ "ordering":"ORDER_ORDERED",
+ "counterparty":{
+ "portId":"icacontroller-delegation-inj",
+ "channelId":"channel-20"
+ },
+ "connectionHops":[
+ "connection-182"
+ ],
+ "version":"{\"version\":\"ics27-1\",\"controller_connection_id\":\"connection-9\",\"host_connection_id\":\"connection-182\",\"address\":\"inj1urqc59ft3hl75mxhru4848xusu5rhpghz48zdfypyuu923w2gzyqm8y02d\",\"encoding\":\"proto3\",\"tx_type\":\"sdk_multi_msg\"}",
+ "portId":"icahost",
+ "channelId":"channel-136"
+ },
+ {
+ "state":"STATE_OPEN",
+ "ordering":"ORDER_ORDERED",
+ "counterparty":{
+ "portId":"icacontroller-sweep-inj",
+ "channelId":"channel-21"
+ },
+ "connectionHops":[
+ "connection-185"
+ ],
+ "version":"{\"version\":\"ics27-1\",\"controller_connection_id\":\"connection-3\",\"host_connection_id\":\"connection-185\",\"address\":\"inj1s58qfzwjduykz6emh936v8uxytvck4cf0lkvpuerh2qwt6jkaj9qh9cl7x\",\"encoding\":\"proto3\",\"tx_type\":\"sdk_multi_msg\"}",
+ "portId":"icahost",
+ "channelId":"channel-182"
+ },
+ {
+ "state":"STATE_OPEN",
+ "ordering":"ORDER_ORDERED",
+ "counterparty":{
+ "portId":"icacontroller-reward-inj",
+ "channelId":"channel-20"
+ },
+ "connectionHops":[
+ "connection-185"
+ ],
+ "version":"{\"version\":\"ics27-1\",\"controller_connection_id\":\"connection-3\",\"host_connection_id\":\"connection-185\",\"address\":\"inj1k3cdwxqkjmmjn62tesyumlynj0n5ap2k9ysnyn56zar4uns09a5qvy575s\",\"encoding\":\"proto3\",\"tx_type\":\"sdk_multi_msg\"}",
+ "portId":"icahost",
+ "channelId":"channel-183"
+ }
+ ],
+ "pagination":{
+ "nextKey":"L3BvcnRzL2ljYWhvc3QvY2hhbm5lbHMvY2hhbm5lbC0xODQ=",
+ "total":"0"
+ },
+ "height":{
+ "revisionNumber":"888",
+ "revisionHeight":"26823064"
+ }
+}
+```
+
+
+Parameter | Type | Description |
---|
channels | IdentifiedChannel Array | List of channels |
+pagination | PageResponse | Pagination information in the response |
+height | Height | Query block height |
+
+
+
+
+**IdentifiedChannel**
+
+
+Parameter | Type | Description |
---|
state | State | Current state of the channel end |
+ordering | Order | Whether the channel is ordered or unordered |
+counterparty | Counterparty | Counterparty channel end |
+connection_hops | String Array | List of connection identifiers, in order, along which packets sent on this channel will travel |
+version | String | Opaque channel version, which is agreed upon during the handshake |
+port_id | String | Port identifier |
+channel_id | String | Channel identifier |
+
+
+
+
+**State**
+
+
+Code | Name |
---|
0 | STATE_UNINITIALIZED_UNSPECIFIED |
+1 | STATE_INIT |
+2 | STATE_TRYOPEN |
+3 | STATE_OPEN |
+4 | STATE_CLOSED |
+
+
+
+
+**Order**
+
+
+Code | Name |
---|
0 | ORDER_NONE_UNSPECIFIED |
+1 | ORDER_UNORDERED |
+2 | ORDER_ORDERED |
+
+
+
+
+**Counterparty**
+
+
+Parameter | Type | Description |
---|
port_id | String | Port on the counterparty chain which owns the other end of the channel |
+channel_id | String | Channel end on the counterparty chain |
+
+
+
+
+**PageResponse**
+
+
+Parameter | Type | Description |
---|
next_key | Byte Array | The key to be passed to PageRequest.key to query the next page most efficiently. It will be empty if there are no more results. |
+total | Integer | Total number of results available if PageRequest.count_total was set, its value is undefined otherwise |
+
+
+
+
+**Height**
+
+
+Parameter | Type | Description |
---|
revision_number | Integer | The revision that the client is currently on |
+revision_height | Integer | The height within the given revision |
+
+
+
+## ConnectionChannels
+
+Queries all the channels associated with a connection end
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.client.model.pagination import PaginationOption
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ connection = "connection-182"
+ pagination = PaginationOption(skip=2, limit=4)
+
+ channels = await client.fetch_ibc_connection_channels(connection=connection, pagination=pagination)
+ print(channels)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "github.com/cosmos/cosmos-sdk/types/query"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ connection := "connection-182"
+ pagination := query.PageRequest{Offset: 2, Limit: 4}
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCConnectionChannels(ctx, connection, &pagination)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
connection | String | Connection unique identifier | Yes |
+pagination | PageRequest | The optional pagination for the request | No |
+
+
+
+
+**PageRequest**
+
+
+Parameter | Type | Description | Required |
---|
key | Byte Array | Key is a value returned in PageResponse.next_key to begin querying the next page most efficiently. Only one of offset or key should be set | No |
+offset | Integer | Numeric offset that can be used when key is unavailable. It is less efficient than using key. Only one of offset or key should be set | No |
+limit | Integer | Total number of results to be returned in the result page | No |
+count_total | Boolean | Set to true to indicate that the result set should include a count of the total number of items available for pagination in UIs. It is only respected when offset is used. It is ignored when key is set | No |
+reverse | Boolean | Reverse is set to true if results are to be returned in the descending order | No |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "channels":[
+ {
+ "state":"STATE_CLOSED",
+ "ordering":"ORDER_ORDERED",
+ "counterparty":{
+ "portId":"icacontroller-delegation-inj",
+ "channelId":"channel-17"
+ },
+ "connectionHops":[
+ "connection-182"
+ ],
+ "version":"{\"version\":\"ics27-1\",\"controller_connection_id\":\"connection-9\",\"host_connection_id\":\"connection-182\",\"address\":\"inj1urqc59ft3hl75mxhru4848xusu5rhpghz48zdfypyuu923w2gzyqm8y02d\",\"encoding\":\"proto3\",\"tx_type\":\"sdk_multi_msg\"}",
+ "portId":"icahost",
+ "channelId":"channel-132"
+ },
+ {
+ "state":"STATE_OPEN",
+ "ordering":"ORDER_ORDERED",
+ "counterparty":{
+ "portId":"icacontroller-reward-inj",
+ "channelId":"channel-18"
+ },
+ "connectionHops":[
+ "connection-182"
+ ],
+ "version":"{\"version\":\"ics27-1\",\"controller_connection_id\":\"connection-9\",\"host_connection_id\":\"connection-182\",\"address\":\"inj1mn3p9d2aw02mdrkfhleefmvr70skrx39mlkkc4f5rnewlc5aux3qs37nt6\",\"encoding\":\"proto3\",\"tx_type\":\"sdk_multi_msg\"}",
+ "portId":"icahost",
+ "channelId":"channel-133"
+ },
+ {
+ "state":"STATE_OPEN",
+ "ordering":"ORDER_ORDERED",
+ "counterparty":{
+ "portId":"icacontroller-sweep-inj",
+ "channelId":"channel-19"
+ },
+ "connectionHops":[
+ "connection-182"
+ ],
+ "version":"{\"version\":\"ics27-1\",\"controller_connection_id\":\"connection-9\",\"host_connection_id\":\"connection-182\",\"address\":\"inj1v0es67dxtlmzmauhr3krk058sp9cvt6e2hvmys2g8pjnpj30fezq93qp07\",\"encoding\":\"proto3\",\"tx_type\":\"sdk_multi_msg\"}",
+ "portId":"icahost",
+ "channelId":"channel-134"
+ },
+ {
+ "state":"STATE_CLOSED",
+ "ordering":"ORDER_ORDERED",
+ "counterparty":{
+ "portId":"icacontroller-delegation-inj",
+ "channelId":"channel-20"
+ },
+ "connectionHops":[
+ "connection-182"
+ ],
+ "version":"{\"version\":\"ics27-1\",\"controller_connection_id\":\"connection-9\",\"host_connection_id\":\"connection-182\",\"address\":\"inj1urqc59ft3hl75mxhru4848xusu5rhpghz48zdfypyuu923w2gzyqm8y02d\",\"encoding\":\"proto3\",\"tx_type\":\"sdk_multi_msg\"}",
+ "portId":"icahost",
+ "channelId":"channel-136"
+ },
+ {
+ "state":"STATE_OPEN",
+ "ordering":"ORDER_UNORDERED",
+ "counterparty":{
+ "portId":"transfer",
+ "channelId":"channel-16"
+ },
+ "connectionHops":[
+ "connection-182"
+ ],
+ "version":"ics20-1",
+ "portId":"transfer",
+ "channelId":"channel-131"
+ }
+ ],
+ "pagination":{
+ "nextKey":"",
+ "total":"0"
+ },
+ "height":{
+ "revisionNumber":"888",
+ "revisionHeight":"26832162"
+ }
+}
+```
+
+
+Parameter | Type | Description |
---|
channels | IdentifiedChannel Array | List of channels |
+pagination | PageResponse | Pagination information in the response |
+height | Height | Query block height |
+
+
+
+
+**IdentifiedChannel**
+
+
+Parameter | Type | Description |
---|
state | State | Current state of the channel end |
+ordering | Order | Whether the channel is ordered or unordered |
+counterparty | Counterparty | Counterparty channel end |
+connection_hops | String Array | List of connection identifiers, in order, along which packets sent on this channel will travel |
+version | String | Opaque channel version, which is agreed upon during the handshake |
+port_id | String | Port identifier |
+channel_id | String | Channel identifier |
+
+
+
+
+**State**
+
+
+Code | Name |
---|
0 | STATE_UNINITIALIZED_UNSPECIFIED |
+1 | STATE_INIT |
+2 | STATE_TRYOPEN |
+3 | STATE_OPEN |
+4 | STATE_CLOSED |
+
+
+
+
+**Order**
+
+
+Code | Name |
---|
0 | ORDER_NONE_UNSPECIFIED |
+1 | ORDER_UNORDERED |
+2 | ORDER_ORDERED |
+
+
+
+
+**Counterparty**
+
+
+Parameter | Type | Description |
---|
port_id | String | Port on the counterparty chain which owns the other end of the channel |
+channel_id | String | Channel end on the counterparty chain |
+
+
+
+
+**PageResponse**
+
+
+Parameter | Type | Description |
---|
next_key | Byte Array | The key to be passed to PageRequest.key to query the next page most efficiently. It will be empty if there are no more results. |
+total | Integer | Total number of results available if PageRequest.count_total was set, its value is undefined otherwise |
+
+
+
+
+**Height**
+
+
+Parameter | Type | Description |
---|
revision_number | Integer | The revision that the client is currently on |
+revision_height | Integer | The height within the given revision |
+
+
+
+## ChannelClientState
+
+Queries the client state for the channel associated with the provided channel identifiers
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ port_id = "transfer"
+ channel_id = "channel-126"
+
+ state = await client.fetch_ibc_channel_client_state(port_id=port_id, channel_id=channel_id)
+ print(state)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ portId := "transfer"
+ channelId := "channel-126"
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCChannelClientState(ctx, portId, channelId)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ fmt.Print(res)
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
port_id | String | Port unique identifier | Yes |
+channel_id | String | Channel unique identifier | Yes |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "identifiedClientState":{
+ "clientId":"07-tendermint-179",
+ "clientState":{
+ "@type":"/ibc.lightclients.tendermint.v1.ClientState",
+ "chainId":"pisco-1",
+ "trustLevel":{
+ "numerator":"1",
+ "denominator":"3"
+ },
+ "trustingPeriod":"288000s",
+ "unbondingPeriod":"432000s",
+ "maxClockDrift":"40s",
+ "frozenHeight":{
+ "revisionNumber":"0",
+ "revisionHeight":"0"
+ },
+ "latestHeight":{
+ "revisionNumber":"1",
+ "revisionHeight":"7990906"
+ },
+ "proofSpecs":[
+ {
+ "leafSpec":{
+ "hash":"SHA256",
+ "prehashValue":"SHA256",
+ "length":"VAR_PROTO",
+ "prefix":"AA==",
+ "prehashKey":"NO_HASH"
+ },
+ "innerSpec":{
+ "childOrder":[
+ 0,
+ 1
+ ],
+ "childSize":33,
+ "minPrefixLength":4,
+ "maxPrefixLength":12,
+ "hash":"SHA256",
+ "emptyChild":""
+ },
+ "maxDepth":0,
+ "minDepth":0,
+ "prehashKeyBeforeComparison":false
+ },
+ {
+ "leafSpec":{
+ "hash":"SHA256",
+ "prehashValue":"SHA256",
+ "length":"VAR_PROTO",
+ "prefix":"AA==",
+ "prehashKey":"NO_HASH"
+ },
+ "innerSpec":{
+ "childOrder":[
+ 0,
+ 1
+ ],
+ "childSize":32,
+ "minPrefixLength":1,
+ "maxPrefixLength":1,
+ "hash":"SHA256",
+ "emptyChild":""
+ },
+ "maxDepth":0,
+ "minDepth":0,
+ "prehashKeyBeforeComparison":false
+ }
+ ],
+ "upgradePath":[
+ "upgrade",
+ "upgradedIBCState"
+ ],
+ "allowUpdateAfterExpiry":true,
+ "allowUpdateAfterMisbehaviour":true
+ }
+ },
+ "proofHeight":{
+ "revisionNumber":"888",
+ "revisionHeight":"26834667"
+ },
+ "proof":""
+}
+```
+
+
+Parameter | Type | Description |
---|
identified_client_state | IdentifiedChannel | Client state associated with the channel |
+proof | Byte Array | Merkle proof of existence |
+proof_height | Height | Height at which the proof was retrieved |
+
+
+
+
+**IdentifiedChannel**
+
+
+Parameter | Type | Description |
---|
state | State | Current state of the channel end |
+ordering | Order | Whether the channel is ordered or unordered |
+counterparty | Counterparty | Counterparty channel end |
+connection_hops | String Array | List of connection identifiers, in order, along which packets sent on this channel will travel |
+version | String | Opaque channel version, which is agreed upon during the handshake |
+port_id | String | Port identifier |
+channel_id | String | Channel identifier |
+
+
+
+
+**State**
+
+
+Code | Name |
---|
0 | STATE_UNINITIALIZED_UNSPECIFIED |
+1 | STATE_INIT |
+2 | STATE_TRYOPEN |
+3 | STATE_OPEN |
+4 | STATE_CLOSED |
+
+
+
+
+**Order**
+
+
+Code | Name |
---|
0 | ORDER_NONE_UNSPECIFIED |
+1 | ORDER_UNORDERED |
+2 | ORDER_ORDERED |
+
+
+
+
+**Counterparty**
+
+
+Parameter | Type | Description |
---|
port_id | String | Port on the counterparty chain which owns the other end of the channel |
+channel_id | String | Channel end on the counterparty chain |
+
+
+
+
+**Height**
+
+
+Parameter | Type | Description |
---|
revision_number | Integer | The revision that the client is currently on |
+revision_height | Integer | The height within the given revision |
+
+
+
+## ChannelConsensusState
+
+Queries the client state for the channel associated with the provided channel identifiers
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ port_id = "transfer"
+ channel_id = "channel-126"
+ revision_number = 1
+ revision_height = 7990906
+
+ state = await client.fetch_ibc_channel_consensus_state(
+ port_id=port_id, channel_id=channel_id, revision_number=revision_number, revision_height=revision_height
+ )
+ print(state)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ portId := "transfer"
+ channelId := "channel-126"
+ revisionNumber := uint64(1)
+ revisionHeight := uint64(7990906)
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCChannelConsensusState(ctx, portId, channelId, revisionNumber, revisionHeight)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ fmt.Print(res)
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
port_id | String | Port unique identifier | Yes |
+channel_id | String | Channel unique identifier | Yes |
+revision_number | Integer | Revision number of the consensus state | Yes |
+revision_height | Integer | Revision height of the consensus state | Yes |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "consensusState":{
+ "@type":"/ibc.lightclients.tendermint.v1.ConsensusState",
+ "timestamp":"2023-10-21T14:57:23.344911848Z",
+ "root":{
+ "hash":"89ggv/9AgSoyCBZ0ohhBSMI0LX+ZYe24VdUOA1x6i6I="
+ },
+ "nextValidatorsHash":"8DzvA/mMhLfz2C0qSK5+YtbfTopxfFpKm4kApB/u10Y="
+ },
+ "clientId":"07-tendermint-179",
+ "proofHeight":{
+ "revisionNumber":"888",
+ "revisionHeight":"26835676"
+ },
+ "proof":""
+}
+```
+
+
+Parameter | Type | Description |
---|
consensus_state | Any | Consensus state associated with the channel |
+client_id | String | Client ID associated with the consensus state |
+proof | Byte Array | Merkle proof of existence |
+proof_height | Height | Height at which the proof was retrieved |
+
+
+
+
+**Height**
+
+
+Parameter | Type | Description |
---|
revision_number | Integer | The revision that the client is currently on |
+revision_height | Integer | The height within the given revision |
+
+
+
+## PacketCommitment
+
+Queries a stored packet commitment hash
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ port_id = "transfer"
+ channel_id = "channel-126"
+ sequence = 1
+
+ commitment = await client.fetch_ibc_packet_commitment(port_id=port_id, channel_id=channel_id, sequence=sequence)
+ print(commitment)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ portId := "transfer"
+ channelId := "channel-126"
+ sequence := uint64(1)
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCPacketCommitment(ctx, portId, channelId, sequence)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
port_id | String | Port unique identifier | Yes |
+channel_id | String | Channel unique identifier | Yes |
+sequence | Integer | Packet sequence | Yes |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "commitment":"bIKl7JAqoA1IGSDDlb0McwW2A/A77Jpph0yt87BnCO4=",
+ "proofHeight":{
+ "revisionNumber":"888",
+ "revisionHeight":"26836334"
+ },
+ "proof":""
+}
+```
+
+
+Parameter | Type | Description |
---|
commitment | Byte Array | Packet associated with the request fields |
+proof | Byte Array | Merkle proof of existence |
+proof_height | Height | Height at which the proof was retrieved |
+
+
+
+
+**Height**
+
+
+Parameter | Type | Description |
---|
revision_number | Integer | The revision that the client is currently on |
+revision_height | Integer | The height within the given revision |
+
+
+
+## PacketCommitments
+
+Returns all the packet commitments hashes associated with a channel
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.client.model.pagination import PaginationOption
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ port_id = "transfer"
+ channel_id = "channel-126"
+ pagination = PaginationOption(skip=2, limit=4)
+
+ commitment = await client.fetch_ibc_packet_commitments(
+ port_id=port_id,
+ channel_id=channel_id,
+ pagination=pagination,
+ )
+ print(commitment)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "github.com/cosmos/cosmos-sdk/types/query"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ portId := "transfer"
+ channelId := "channel-126"
+ pagination := query.PageRequest{Offset: 2, Limit: 4}
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCPacketCommitments(ctx, portId, channelId, &pagination)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
port_id | String | Port unique identifier | Yes |
+channel_id | String | Channel unique identifier | Yes |
+pagination | PageRequest | The optional pagination for the request | No |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "commitments":[
+ {
+ "portId":"transfer",
+ "channelId":"channel-126",
+ "sequence":"100",
+ "data":"CMcjhUhXioc12WQEv+SVK7pdCdBei9Zw2MNyKm64aII="
+ },
+ {
+ "portId":"transfer",
+ "channelId":"channel-126",
+ "sequence":"101",
+ "data":"hUdJyOfw9Y4X6IqtcZNwOy9vvkir2SK6MGlhqn6gF7w="
+ },
+ {
+ "portId":"transfer",
+ "channelId":"channel-126",
+ "sequence":"102",
+ "data":"pi3qUxhzyDrgmrTHMu+9AW3vEsGBl1W6YUsEgi/UCwo="
+ },
+ {
+ "portId":"transfer",
+ "channelId":"channel-126",
+ "sequence":"103",
+ "data":"eDSZipO0vWlCEzM5sS2DNL254KBMSMH5JZn0u5ccIIs="
+ }
+ ],
+ "pagination":{
+ "nextKey":"LzEwNA==",
+ "total":"0"
+ },
+ "height":{
+ "revisionNumber":"888",
+ "revisionHeight":"26836728"
+ }
+}
+```
+
+
+Parameter | Type | Description |
---|
commitments | PacketState Array | Commitments information |
+pagination | PageResponse | Pagination information in the response |
+height | Height | Query block height |
+
+
+
+
+**PacketState**
+
+
+Parameter | Type | Description |
---|
port_id | String | Port identifier |
+channel_id | String | Channel identifier |
+sequence | Integer | Packet sequence |
+data | Byte Array | Embedded data that represents packet state |
+
+
+
+
+**PageResponse**
+
+
+Parameter | Type | Description |
---|
next_key | Byte Array | The key to be passed to PageRequest.key to query the next page most efficiently. It will be empty if there are no more results. |
+total | Integer | Total number of results available if PageRequest.count_total was set, its value is undefined otherwise |
+
+
+
+
+**Height**
+
+
+Parameter | Type | Description |
---|
revision_number | Integer | The revision that the client is currently on |
+revision_height | Integer | The height within the given revision |
+
+
+
+## PacketReceipt
+
+Queries if a given packet sequence has been received on the queried chain
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ port_id = "transfer"
+ channel_id = "channel-126"
+ sequence = 1
+
+ receipt = await client.fetch_ibc_packet_receipt(port_id=port_id, channel_id=channel_id, sequence=sequence)
+ print(receipt)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ portId := "transfer"
+ channelId := "channel-126"
+ sequence := uint64(1)
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCPacketReceipt(ctx, portId, channelId, sequence)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
port_id | String | Port unique identifier | Yes |
+channel_id | String | Channel unique identifier | Yes |
+sequence | Integer | Packet sequence | Yes |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "received":true,
+ "proofHeight":{
+ "revisionNumber":"888",
+ "revisionHeight":"27058834"
+ },
+ "proof":""
+}
+```
+
+
+Parameter | Type | Description |
---|
received | Boolean | Success flag to mark if the receipt exists |
+proof | Byte Array | Merkle proof of existence |
+proof_height | Height | Height at which the proof was retrieved |
+
+
+
+
+**Height**
+
+
+Parameter | Type | Description |
---|
revision_number | Integer | The revision that the client is currently on |
+revision_height | Integer | The height within the given revision |
+
+
+
+## PacketAcknowledgement
+
+Queries a stored packet acknowledgement hash
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ port_id = "transfer"
+ channel_id = "channel-126"
+ sequence = 1
+
+ acknowledgement = await client.fetch_ibc_packet_acknowledgement(
+ port_id=port_id, channel_id=channel_id, sequence=sequence
+ )
+ print(acknowledgement)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ portId := "transfer"
+ channelId := "channel-126"
+ sequence := uint64(1)
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCPacketAcknowledgement(ctx, portId, channelId, sequence)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
port_id | String | Port unique identifier | Yes |
+channel_id | String | Channel unique identifier | Yes |
+sequence | Integer | Packet sequence | Yes |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "acknowledgement":"CPdVftUYJv4Y2EUSvyTsdQAe268hI6R333KgqfNkCnw=",
+ "proofHeight":{
+ "revisionNumber":"888",
+ "revisionHeight":"27065978"
+ },
+ "proof":""
+}
+```
+
+
+Parameter | Type | Description |
---|
acknowledgement | Byte Array | Success flag to mark if the receipt exists |
+proof | Byte Array | Merkle proof of existence |
+proof_height | Height | Height at which the proof was retrieved |
+
+
+
+
+**Height**
+
+
+Parameter | Type | Description |
---|
revision_number | Integer | The revision that the client is currently on |
+revision_height | Integer | The height within the given revision |
+
+
+
+## PacketAcknowledgements
+
+Returns all the packet acknowledgements associated with a channel
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.client.model.pagination import PaginationOption
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ port_id = "transfer"
+ channel_id = "channel-126"
+ sequences = [1, 2]
+ pagination = PaginationOption(skip=2, limit=4)
+
+ acknowledgements = await client.fetch_ibc_packet_acknowledgements(
+ port_id=port_id,
+ channel_id=channel_id,
+ packet_commitment_sequences=sequences,
+ pagination=pagination,
+ )
+ print(acknowledgements)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "github.com/cosmos/cosmos-sdk/types/query"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ portId := "transfer"
+ channelId := "channel-126"
+ sequences := []uint64{1, 2}
+ pagination := query.PageRequest{Offset: 2, Limit: 4}
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCPacketAcknowledgements(ctx, portId, channelId, sequences, &pagination)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
port_id | String | Port unique identifier | Yes |
+channel_id | String | Channel unique identifier | Yes |
+pagination | PageRequest | The optional pagination for the request | No |
+packet_commitment_sequences | Integer Array | List of packet sequences | No |
+
+
+
+
+**PageRequest**
+
+
+Parameter | Type | Description | Required |
---|
key | Byte Array | Key is a value returned in PageResponse.next_key to begin querying the next page most efficiently. Only one of offset or key should be set | No |
+offset | Integer | Numeric offset that can be used when key is unavailable. It is less efficient than using key. Only one of offset or key should be set | No |
+limit | Integer | Total number of results to be returned in the result page | No |
+count_total | Boolean | Set to true to indicate that the result set should include a count of the total number of items available for pagination in UIs. It is only respected when offset is used. It is ignored when key is set | No |
+reverse | Boolean | Reverse is set to true if results are to be returned in the descending order | No |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "acknowledgements":[
+ {
+ "portId":"transfer",
+ "channelId":"channel-126",
+ "sequence":"1",
+ "data":"CPdVftUYJv4Y2EUSvyTsdQAe268hI6R333KgqfNkCnw="
+ },
+ {
+ "portId":"transfer",
+ "channelId":"channel-126",
+ "sequence":"2",
+ "data":"CPdVftUYJv4Y2EUSvyTsdQAe268hI6R333KgqfNkCnw="
+ }
+ ],
+ "height":{
+ "revisionNumber":"888",
+ "revisionHeight":"27066401"
+ }
+}
+```
+
+
+Parameter | Type | Description |
---|
acknowledgements | PacketState Array | Acknowledgements details |
+pagination | PageResponse | Pagination information in the response |
+height | Height | Query block height |
+
+
+**PacketState**
+
+
+Parameter | Type | Description |
---|
port_id | String | Port identifier |
+channel_id | String | Channel identifier |
+sequence | Integer | Packet sequence |
+data | Byte Array | Embedded data that represents packet state |
+
+
+
+
+**PageResponse**
+
+
+Parameter | Type | Description |
---|
next_key | Byte Array | The key to be passed to PageRequest.key to query the next page most efficiently. It will be empty if there are no more results. |
+total | Integer | Total number of results available if PageRequest.count_total was set, its value is undefined otherwise |
+
+
+
+
+**Height**
+
+
+Parameter | Type | Description |
---|
revision_number | Integer | The revision that the client is currently on |
+revision_height | Integer | The height within the given revision |
+
+
+
+## UnreceivedPackets
+
+Returns all the unreceived IBC packets associated with a channel and sequences
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ port_id = "transfer"
+ channel_id = "channel-126"
+ sequences = [1, 2]
+
+ packets = await client.fetch_ibc_unreceived_packets(
+ port_id=port_id, channel_id=channel_id, packet_commitment_sequences=sequences
+ )
+ print(packets)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ portId := "transfer"
+ channelId := "channel-126"
+ sequences := []uint64{1, 2}
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCUnreceivedPackets(ctx, portId, channelId, sequences)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
port_id | String | Port unique identifier | Yes |
+channel_id | String | Channel unique identifier | Yes |
+packet_commitment_sequences | Integer Array | List of packet sequences | No |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "height":{
+ "revisionNumber":"888",
+ "revisionHeight":"27067282"
+ },
+ "sequences":[
+
+ ]
+}
+```
+
+
+Parameter | Type | Description |
---|
sequences | Integer Array | List of unreceived packet sequences |
+height | Height | Query block height |
+
+
+
+
+**Height**
+
+
+Parameter | Type | Description |
---|
revision_number | Integer | The revision that the client is currently on |
+revision_height | Integer | The height within the given revision |
+
+
+
+## UnreceivedAcks
+
+Returns all the unreceived IBC acknowledgements associated with a channel and sequences
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ port_id = "transfer"
+ channel_id = "channel-126"
+
+ acks = await client.fetch_ibc_unreceived_acks(
+ port_id=port_id,
+ channel_id=channel_id,
+ )
+ print(acks)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ portId := "transfer"
+ channelId := "channel-126"
+ sequences := []uint64{1, 2}
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCUnreceivedAcks(ctx, portId, channelId, sequences)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
port_id | String | Port unique identifier | Yes |
+channel_id | String | Channel unique identifier | Yes |
+packet_ack_sequences | Integer Array | List of acknowledgement sequences | No |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "height":{
+ "revisionNumber":"888",
+ "revisionHeight":"27067653"
+ },
+ "sequences":[
+
+ ]
+}
+```
+
+
+Parameter | Type | Description |
---|
sequences | Integer Array | List of unreceived packet sequences |
+height | Height | Query block height |
+
+
+
+
+**Height**
+
+
+Parameter | Type | Description |
---|
revision_number | Integer | The revision that the client is currently on |
+revision_height | Integer | The height within the given revision |
+
+
+
+## NextSequenceReceive
+
+Returns the next receive sequence for a given channel
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ port_id = "transfer"
+ channel_id = "channel-126"
+
+ sequence = await client.fetch_next_sequence_receive(
+ port_id=port_id,
+ channel_id=channel_id,
+ )
+ print(sequence)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ portId := "transfer"
+ channelId := "channel-126"
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCNextSequenceReceive(ctx, portId, channelId)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
port_id | String | Port unique identifier | Yes |
+channel_id | String | Channel unique identifier | Yes |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "nextSequenceReceive":"1",
+ "proofHeight":{
+ "revisionNumber":"888",
+ "revisionHeight":"27067952"
+ },
+ "proof":""
+}
+```
+
+
+Parameter | Type | Description |
---|
next_sequence_receive | Integer | Next sequence receive number |
+proof | Byte Array | Merkle proof of existence |
+proof_height | Height | Height at which the proof was retrieved |
+
+
+
+
+**Height**
+
+
+Parameter | Type | Description |
---|
revision_number | Integer | The revision that the client is currently on |
+revision_height | Integer | The height within the given revision |
+
diff --git a/source/includes/_ibccoreclient.md b/source/includes/_ibccoreclient.md
new file mode 100644
index 00000000..70aa0a6e
--- /dev/null
+++ b/source/includes/_ibccoreclient.md
@@ -0,0 +1,1960 @@
+# - IBC Core Client
+
+Includes all the messages and queries associated to clients and consensus from the IBC core client module
+
+## ClientState
+
+Queries an IBC light client
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ client_id = "07-tendermint-0"
+
+ state = await client.fetch_ibc_client_state(client_id=client_id)
+ print(state)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientId := "07-tendermint-0"
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCClientState(ctx, clientId)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ fmt.Print(res)
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
client_id | String | Client state unique identifier | Yes |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "clientState":{
+ "@type":"/ibc.lightclients.tendermint.v1.ClientState",
+ "chainId":"band-laozi-testnet4",
+ "trustLevel":{
+ "numerator":"1",
+ "denominator":"3"
+ },
+ "trustingPeriod":"1209600s",
+ "unbondingPeriod":"1814400s",
+ "maxClockDrift":"20s",
+ "frozenHeight":{
+ "revisionNumber":"0",
+ "revisionHeight":"0"
+ },
+ "latestHeight":{
+ "revisionHeight":"7379538",
+ "revisionNumber":"0"
+ },
+ "proofSpecs":[
+ {
+ "leafSpec":{
+ "hash":"SHA256",
+ "prehashValue":"SHA256",
+ "length":"VAR_PROTO",
+ "prefix":"AA==",
+ "prehashKey":"NO_HASH"
+ },
+ "innerSpec":{
+ "childOrder":[
+ 0,
+ 1
+ ],
+ "childSize":33,
+ "minPrefixLength":4,
+ "maxPrefixLength":12,
+ "hash":"SHA256",
+ "emptyChild":""
+ },
+ "maxDepth":0,
+ "minDepth":0,
+ "prehashKeyBeforeComparison":false
+ },
+ {
+ "leafSpec":{
+ "hash":"SHA256",
+ "prehashValue":"SHA256",
+ "length":"VAR_PROTO",
+ "prefix":"AA==",
+ "prehashKey":"NO_HASH"
+ },
+ "innerSpec":{
+ "childOrder":[
+ 0,
+ 1
+ ],
+ "childSize":32,
+ "minPrefixLength":1,
+ "maxPrefixLength":1,
+ "hash":"SHA256",
+ "emptyChild":""
+ },
+ "maxDepth":0,
+ "minDepth":0,
+ "prehashKeyBeforeComparison":false
+ }
+ ],
+ "upgradePath":[
+ "upgrade",
+ "upgradedIBCState"
+ ],
+ "allowUpdateAfterExpiry":true,
+ "allowUpdateAfterMisbehaviour":true
+ },
+ "proofHeight":{
+ "revisionNumber":"888",
+ "revisionHeight":"27527237"
+ },
+ "proof":""
+}
+```
+
+
+Parameter | Type | Description |
---|
client_state | Any | Client state associated with the request identifier |
+proof | Byte Array | Merkle proof of existence |
+proof_height | Height | Height at which the proof was retrieved |
+
+
+
+
+**Height**
+
+
+Parameter | Type | Description |
---|
revision_number | Integer | The revision that the client is currently on |
+revision_height | Integer | The height within the given revision |
+
+
+
+## ClientStates
+
+Queries all the IBC light clients of a chain
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.client.model.pagination import PaginationOption
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ pagination = PaginationOption(skip=2, limit=4)
+
+ states = await client.fetch_ibc_client_states(pagination=pagination)
+ print(states)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/cosmos/cosmos-sdk/types/query"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ pagination := query.PageRequest{Offset: 2, Limit: 4}
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCClientStates(ctx, &pagination)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ fmt.Print(res)
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
pagination | PageRequest | The optional pagination for the request | No |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "clientStates":[
+ {
+ "clientId":"07-tendermint-0",
+ "clientState":{
+ "@type":"/ibc.lightclients.tendermint.v1.ClientState",
+ "chainId":"band-laozi-testnet4",
+ "trustLevel":{
+ "numerator":"1",
+ "denominator":"3"
+ },
+ "trustingPeriod":"1209600s",
+ "unbondingPeriod":"1814400s",
+ "maxClockDrift":"20s",
+ "frozenHeight":{
+ "revisionNumber":"0",
+ "revisionHeight":"0"
+ },
+ "latestHeight":{
+ "revisionHeight":"7379538",
+ "revisionNumber":"0"
+ },
+ "proofSpecs":[
+ {
+ "leafSpec":{
+ "hash":"SHA256",
+ "prehashValue":"SHA256",
+ "length":"VAR_PROTO",
+ "prefix":"AA==",
+ "prehashKey":"NO_HASH"
+ },
+ "innerSpec":{
+ "childOrder":[
+ 0,
+ 1
+ ],
+ "childSize":33,
+ "minPrefixLength":4,
+ "maxPrefixLength":12,
+ "hash":"SHA256",
+ "emptyChild":""
+ },
+ "maxDepth":0,
+ "minDepth":0,
+ "prehashKeyBeforeComparison":false
+ },
+ {
+ "leafSpec":{
+ "hash":"SHA256",
+ "prehashValue":"SHA256",
+ "length":"VAR_PROTO",
+ "prefix":"AA==",
+ "prehashKey":"NO_HASH"
+ },
+ "innerSpec":{
+ "childOrder":[
+ 0,
+ 1
+ ],
+ "childSize":32,
+ "minPrefixLength":1,
+ "maxPrefixLength":1,
+ "hash":"SHA256",
+ "emptyChild":""
+ },
+ "maxDepth":0,
+ "minDepth":0,
+ "prehashKeyBeforeComparison":false
+ }
+ ],
+ "upgradePath":[
+ "upgrade",
+ "upgradedIBCState"
+ ],
+ "allowUpdateAfterExpiry":true,
+ "allowUpdateAfterMisbehaviour":true
+ }
+ },
+ {
+ "clientId":"07-tendermint-1",
+ "clientState":{
+ "@type":"/ibc.lightclients.tendermint.v1.ClientState",
+ "chainId":"band-laozi-testnet4",
+ "trustLevel":{
+ "numerator":"1",
+ "denominator":"3"
+ },
+ "trustingPeriod":"1209600s",
+ "unbondingPeriod":"1814400s",
+ "maxClockDrift":"20s",
+ "frozenHeight":{
+ "revisionNumber":"0",
+ "revisionHeight":"0"
+ },
+ "latestHeight":{
+ "revisionHeight":"7692651",
+ "revisionNumber":"0"
+ },
+ "proofSpecs":[
+ {
+ "leafSpec":{
+ "hash":"SHA256",
+ "prehashValue":"SHA256",
+ "length":"VAR_PROTO",
+ "prefix":"AA==",
+ "prehashKey":"NO_HASH"
+ },
+ "innerSpec":{
+ "childOrder":[
+ 0,
+ 1
+ ],
+ "childSize":33,
+ "minPrefixLength":4,
+ "maxPrefixLength":12,
+ "hash":"SHA256",
+ "emptyChild":""
+ },
+ "maxDepth":0,
+ "minDepth":0,
+ "prehashKeyBeforeComparison":false
+ },
+ {
+ "leafSpec":{
+ "hash":"SHA256",
+ "prehashValue":"SHA256",
+ "length":"VAR_PROTO",
+ "prefix":"AA==",
+ "prehashKey":"NO_HASH"
+ },
+ "innerSpec":{
+ "childOrder":[
+ 0,
+ 1
+ ],
+ "childSize":32,
+ "minPrefixLength":1,
+ "maxPrefixLength":1,
+ "hash":"SHA256",
+ "emptyChild":""
+ },
+ "maxDepth":0,
+ "minDepth":0,
+ "prehashKeyBeforeComparison":false
+ }
+ ],
+ "upgradePath":[
+ "upgrade",
+ "upgradedIBCState"
+ ],
+ "allowUpdateAfterExpiry":true,
+ "allowUpdateAfterMisbehaviour":true
+ }
+ },
+ {
+ "clientId":"07-tendermint-10",
+ "clientState":{
+ "@type":"/ibc.lightclients.tendermint.v1.ClientState",
+ "chainId":"pisco-1",
+ "trustLevel":{
+ "numerator":"1",
+ "denominator":"3"
+ },
+ "trustingPeriod":"345600s",
+ "unbondingPeriod":"432000s",
+ "maxClockDrift":"50s",
+ "frozenHeight":{
+ "revisionNumber":"0",
+ "revisionHeight":"0"
+ },
+ "latestHeight":{
+ "revisionNumber":"1",
+ "revisionHeight":"2304261"
+ },
+ "proofSpecs":[
+ {
+ "leafSpec":{
+ "hash":"SHA256",
+ "prehashValue":"SHA256",
+ "length":"VAR_PROTO",
+ "prefix":"AA==",
+ "prehashKey":"NO_HASH"
+ },
+ "innerSpec":{
+ "childOrder":[
+ 0,
+ 1
+ ],
+ "childSize":33,
+ "minPrefixLength":4,
+ "maxPrefixLength":12,
+ "hash":"SHA256",
+ "emptyChild":""
+ },
+ "maxDepth":0,
+ "minDepth":0,
+ "prehashKeyBeforeComparison":false
+ },
+ {
+ "leafSpec":{
+ "hash":"SHA256",
+ "prehashValue":"SHA256",
+ "length":"VAR_PROTO",
+ "prefix":"AA==",
+ "prehashKey":"NO_HASH"
+ },
+ "innerSpec":{
+ "childOrder":[
+ 0,
+ 1
+ ],
+ "childSize":32,
+ "minPrefixLength":1,
+ "maxPrefixLength":1,
+ "hash":"SHA256",
+ "emptyChild":""
+ },
+ "maxDepth":0,
+ "minDepth":0,
+ "prehashKeyBeforeComparison":false
+ }
+ ],
+ "upgradePath":[
+ "upgrade",
+ "upgradedIBCState"
+ ],
+ "allowUpdateAfterExpiry":true,
+ "allowUpdateAfterMisbehaviour":true
+ }
+ },
+ {
+ "clientId":"07-tendermint-100",
+ "clientState":{
+ "@type":"/ibc.lightclients.tendermint.v1.ClientState",
+ "chainId":"osmo-test-4",
+ "trustLevel":{
+ "numerator":"1",
+ "denominator":"3"
+ },
+ "trustingPeriod":"806400s",
+ "unbondingPeriod":"1209600s",
+ "maxClockDrift":"20s",
+ "frozenHeight":{
+ "revisionNumber":"0",
+ "revisionHeight":"0"
+ },
+ "latestHeight":{
+ "revisionNumber":"4",
+ "revisionHeight":"10356505"
+ },
+ "proofSpecs":[
+ {
+ "leafSpec":{
+ "hash":"SHA256",
+ "prehashValue":"SHA256",
+ "length":"VAR_PROTO",
+ "prefix":"AA==",
+ "prehashKey":"NO_HASH"
+ },
+ "innerSpec":{
+ "childOrder":[
+ 0,
+ 1
+ ],
+ "childSize":33,
+ "minPrefixLength":4,
+ "maxPrefixLength":12,
+ "hash":"SHA256",
+ "emptyChild":""
+ },
+ "maxDepth":0,
+ "minDepth":0,
+ "prehashKeyBeforeComparison":false
+ },
+ {
+ "leafSpec":{
+ "hash":"SHA256",
+ "prehashValue":"SHA256",
+ "length":"VAR_PROTO",
+ "prefix":"AA==",
+ "prehashKey":"NO_HASH"
+ },
+ "innerSpec":{
+ "childOrder":[
+ 0,
+ 1
+ ],
+ "childSize":32,
+ "minPrefixLength":1,
+ "maxPrefixLength":1,
+ "hash":"SHA256",
+ "emptyChild":""
+ },
+ "maxDepth":0,
+ "minDepth":0,
+ "prehashKeyBeforeComparison":false
+ }
+ ],
+ "upgradePath":[
+ "upgrade",
+ "upgradedIBCState"
+ ],
+ "allowUpdateAfterExpiry":true,
+ "allowUpdateAfterMisbehaviour":true
+ }
+ },
+ {
+ "clientId":"07-tendermint-101",
+ "clientState":{
+ "@type":"/ibc.lightclients.tendermint.v1.ClientState",
+ "chainId":"osmo-test-4",
+ "trustLevel":{
+ "numerator":"1",
+ "denominator":"3"
+ },
+ "trustingPeriod":"806400s",
+ "unbondingPeriod":"1209600s",
+ "maxClockDrift":"20s",
+ "frozenHeight":{
+ "revisionNumber":"0",
+ "revisionHeight":"0"
+ },
+ "latestHeight":{
+ "revisionNumber":"4",
+ "revisionHeight":"10356847"
+ },
+ "proofSpecs":[
+ {
+ "leafSpec":{
+ "hash":"SHA256",
+ "prehashValue":"SHA256",
+ "length":"VAR_PROTO",
+ "prefix":"AA==",
+ "prehashKey":"NO_HASH"
+ },
+ "innerSpec":{
+ "childOrder":[
+ 0,
+ 1
+ ],
+ "childSize":33,
+ "minPrefixLength":4,
+ "maxPrefixLength":12,
+ "hash":"SHA256",
+ "emptyChild":""
+ },
+ "maxDepth":0,
+ "minDepth":0,
+ "prehashKeyBeforeComparison":false
+ },
+ {
+ "leafSpec":{
+ "hash":"SHA256",
+ "prehashValue":"SHA256",
+ "length":"VAR_PROTO",
+ "prefix":"AA==",
+ "prehashKey":"NO_HASH"
+ },
+ "innerSpec":{
+ "childOrder":[
+ 0,
+ 1
+ ],
+ "childSize":32,
+ "minPrefixLength":1,
+ "maxPrefixLength":1,
+ "hash":"SHA256",
+ "emptyChild":""
+ },
+ "maxDepth":0,
+ "minDepth":0,
+ "prehashKeyBeforeComparison":false
+ }
+ ],
+ "upgradePath":[
+ "upgrade",
+ "upgradedIBCState"
+ ],
+ "allowUpdateAfterExpiry":true,
+ "allowUpdateAfterMisbehaviour":true
+ }
+ },
+ {
+ "clientId":"07-tendermint-102",
+ "clientState":{
+ "@type":"/ibc.lightclients.tendermint.v1.ClientState",
+ "chainId":"osmo-test-4",
+ "trustLevel":{
+ "numerator":"1",
+ "denominator":"3"
+ },
+ "trustingPeriod":"806400s",
+ "unbondingPeriod":"1209600s",
+ "maxClockDrift":"20s",
+ "frozenHeight":{
+ "revisionNumber":"0",
+ "revisionHeight":"0"
+ },
+ "latestHeight":{
+ "revisionNumber":"4",
+ "revisionHeight":"10357322"
+ },
+ "proofSpecs":[
+ {
+ "leafSpec":{
+ "hash":"SHA256",
+ "prehashValue":"SHA256",
+ "length":"VAR_PROTO",
+ "prefix":"AA==",
+ "prehashKey":"NO_HASH"
+ },
+ "innerSpec":{
+ "childOrder":[
+ 0,
+ 1
+ ],
+ "childSize":33,
+ "minPrefixLength":4,
+ "maxPrefixLength":12,
+ "hash":"SHA256",
+ "emptyChild":""
+ },
+ "maxDepth":0,
+ "minDepth":0,
+ "prehashKeyBeforeComparison":false
+ },
+ {
+ "leafSpec":{
+ "hash":"SHA256",
+ "prehashValue":"SHA256",
+ "length":"VAR_PROTO",
+ "prefix":"AA==",
+ "prehashKey":"NO_HASH"
+ },
+ "innerSpec":{
+ "childOrder":[
+ 0,
+ 1
+ ],
+ "childSize":32,
+ "minPrefixLength":1,
+ "maxPrefixLength":1,
+ "hash":"SHA256",
+ "emptyChild":""
+ },
+ "maxDepth":0,
+ "minDepth":0,
+ "prehashKeyBeforeComparison":false
+ }
+ ],
+ "upgradePath":[
+ "upgrade",
+ "upgradedIBCState"
+ ],
+ "allowUpdateAfterExpiry":true,
+ "allowUpdateAfterMisbehaviour":true
+ }
+ },
+ {
+ "clientId":"07-tendermint-103",
+ "clientState":{
+ "@type":"/ibc.lightclients.tendermint.v1.ClientState",
+ "chainId":"galileo-3",
+ "trustLevel":{
+ "numerator":"1",
+ "denominator":"3"
+ },
+ "trustingPeriod":"604800s",
+ "unbondingPeriod":"1814400s",
+ "maxClockDrift":"30s",
+ "frozenHeight":{
+ "revisionNumber":"0",
+ "revisionHeight":"0"
+ },
+ "latestHeight":{
+ "revisionNumber":"3",
+ "revisionHeight":"2848767"
+ },
+ "proofSpecs":[
+ {
+ "leafSpec":{
+ "hash":"SHA256",
+ "prehashValue":"SHA256",
+ "length":"VAR_PROTO",
+ "prefix":"AA==",
+ "prehashKey":"NO_HASH"
+ },
+ "innerSpec":{
+ "childOrder":[
+ 0,
+ 1
+ ],
+ "childSize":33,
+ "minPrefixLength":4,
+ "maxPrefixLength":12,
+ "hash":"SHA256",
+ "emptyChild":""
+ },
+ "maxDepth":0,
+ "minDepth":0,
+ "prehashKeyBeforeComparison":false
+ },
+ {
+ "leafSpec":{
+ "hash":"SHA256",
+ "prehashValue":"SHA256",
+ "length":"VAR_PROTO",
+ "prefix":"AA==",
+ "prehashKey":"NO_HASH"
+ },
+ "innerSpec":{
+ "childOrder":[
+ 0,
+ 1
+ ],
+ "childSize":32,
+ "minPrefixLength":1,
+ "maxPrefixLength":1,
+ "hash":"SHA256",
+ "emptyChild":""
+ },
+ "maxDepth":0,
+ "minDepth":0,
+ "prehashKeyBeforeComparison":false
+ }
+ ],
+ "upgradePath":[
+ "upgrade",
+ "upgradedIBCState"
+ ],
+ "allowUpdateAfterExpiry":true,
+ "allowUpdateAfterMisbehaviour":true
+ }
+ }
+ ],
+ "pagination":{
+ "nextKey":"LzA3LXRlbmRlcm1pbnQtMTAzL2NsaWVudFN0YXRl",
+ "total":"0"
+ }
+}
+```
+
+
+Parameter | Type | Description |
---|
client_states | IdentifiedClientState Array | Client state associated with the request identifier |
+pagination | PageResponse | Pagination information in the response |
+
+
+
+
+**IdentifiedClientState**
+
+
+Parameter | Type | Description |
---|
client_id | String | Client identifier |
+client_state | Any | Client state |
+
+
+
+## ConsensusState
+
+Queries a consensus state associated with a client state at a given height
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ client_id = "07-tendermint-0"
+ revision_number = 0
+ revision_height = 7379538
+
+ state = await client.fetch_ibc_consensus_state(
+ client_id=client_id, revision_number=revision_number, revision_height=revision_height
+ )
+ print(state)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientId := "07-tendermint-0"
+ revisionNumber := uint64(0)
+ revisionHeight := uint64(7379538)
+ latestHeight := false
+
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCConsensusState(ctx, clientId, revisionNumber, revisionHeight, latestHeight)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ fmt.Print(res)
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
client_id | String | Client identifier | Yes |
+revision_number | Integer | Consensus state revision number | Yes |
+client_id | Integer | Consensus state revision height | Yes |
+latest_height | Boolean | Overrrides the height field and queries the latest stored ConsensusState | No |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "consensusState":{
+ "@type":"/ibc.lightclients.tendermint.v1.ConsensusState",
+ "timestamp":"2022-07-04T10:34:53.874345276Z",
+ "root":{
+ "hash":"viI6JuzZ/kOAh6jIeecglN7Xt+mGQT/PpvAGqGLcVmM="
+ },
+ "nextValidatorsHash":"olPEfP4dzPCC07Oyg/3+6U5/uumw/HmELk2MwpMogSg="
+ },
+ "proofHeight":{
+ "revisionNumber":"888",
+ "revisionHeight":"27531028"
+ },
+ "proof":""
+}
+```
+
+
+Parameter | Type | Description |
---|
consensus_state | Any | Client state associated with the request identifier |
+proof | Byte Array | Merkle proof of existence |
+proof_height | Height | Height at which the proof was retrieved |
+
+
+
+
+**Height**
+
+
+Parameter | Type | Description |
---|
revision_number | Integer | The revision that the client is currently on |
+revision_height | Integer | The height within the given revision |
+
+
+
+## ConsensusStates
+
+Queries all the consensus state associated with a given client
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.client.model.pagination import PaginationOption
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ client_id = "07-tendermint-0"
+ pagination = PaginationOption(skip=2, limit=4)
+
+ states = await client.fetch_ibc_consensus_states(client_id=client_id, pagination=pagination)
+ print(states)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/cosmos/cosmos-sdk/types/query"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientId := "07-tendermint-0"
+ pagination := query.PageRequest{Offset: 2, Limit: 4}
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCConsensusStates(ctx, clientId, &pagination)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ fmt.Print(res)
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
client_id | String | Client identifier | Yes |
+pagination | PageRequest | The optional pagination for the request | No |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "consensusStates":[
+ {
+ "height":{
+ "revisionHeight":"7379500",
+ "revisionNumber":"0"
+ },
+ "consensusState":{
+ "@type":"/ibc.lightclients.tendermint.v1.ConsensusState",
+ "timestamp":"2022-07-04T10:32:23.232327085Z",
+ "root":{
+ "hash":"PlwKOemX6GQh/sGlPzvT89sRijeZa0pUK+sjvASu/5s="
+ },
+ "nextValidatorsHash":"olPEfP4dzPCC07Oyg/3+6U5/uumw/HmELk2MwpMogSg="
+ }
+ },
+ {
+ "height":{
+ "revisionHeight":"7379506",
+ "revisionNumber":"0"
+ },
+ "consensusState":{
+ "@type":"/ibc.lightclients.tendermint.v1.ConsensusState",
+ "timestamp":"2022-07-04T10:32:46.188675417Z",
+ "root":{
+ "hash":"LTmLr8YzxO/yfajKO1RrnZeTK3JUMrvYcm/IZyi0XeY="
+ },
+ "nextValidatorsHash":"olPEfP4dzPCC07Oyg/3+6U5/uumw/HmELk2MwpMogSg="
+ }
+ },
+ {
+ "height":{
+ "revisionHeight":"7379521",
+ "revisionNumber":"0"
+ },
+ "consensusState":{
+ "@type":"/ibc.lightclients.tendermint.v1.ConsensusState",
+ "timestamp":"2022-07-04T10:33:46.953207174Z",
+ "root":{
+ "hash":"lyXb+gmcyDOcHL35Zppqv10y0irbqlnsllERaOEb9R4="
+ },
+ "nextValidatorsHash":"olPEfP4dzPCC07Oyg/3+6U5/uumw/HmELk2MwpMogSg="
+ }
+ },
+ {
+ "height":{
+ "revisionHeight":"7379538",
+ "revisionNumber":"0"
+ },
+ "consensusState":{
+ "@type":"/ibc.lightclients.tendermint.v1.ConsensusState",
+ "timestamp":"2022-07-04T10:34:53.874345276Z",
+ "root":{
+ "hash":"viI6JuzZ/kOAh6jIeecglN7Xt+mGQT/PpvAGqGLcVmM="
+ },
+ "nextValidatorsHash":"olPEfP4dzPCC07Oyg/3+6U5/uumw/HmELk2MwpMogSg="
+ }
+ }
+ ],
+ "pagination":{
+ "nextKey":"",
+ "total":"0"
+ }
+}
+```
+
+
+Parameter | Type | Description |
---|
consensus_states | ConsensusStateWithHeight Array | Consensus states associated with the identifier |
+pagination | PageResponse | Pagination information in the response |
+
+
+
+
+**ConsensusStateWithHeight**
+
+
+Parameter | Type | Description |
---|
height | Height | Consensus state height |
+consensus_state | Any | Consensus state |
+
+
+
+
+**Height**
+
+
+Parameter | Type | Description |
---|
revision_number | Integer | The revision that the client is currently on |
+revision_height | Integer | The height within the given revision |
+
+
+
+## ConsensusStateHeights
+
+Queries the height of every consensus states associated with a given client
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.client.model.pagination import PaginationOption
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ client_id = "07-tendermint-0"
+ pagination = PaginationOption(skip=2, limit=4)
+
+ states = await client.fetch_ibc_consensus_state_heights(client_id=client_id, pagination=pagination)
+ print(states)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/cosmos/cosmos-sdk/types/query"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientId := "07-tendermint-0"
+ pagination := query.PageRequest{Offset: 2, Limit: 4}
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCConsensusStateHeights(ctx, clientId, &pagination)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ fmt.Print(res)
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
client_id | String | Client identifier | Yes |
+pagination | PageRequest | The optional pagination for the request | No |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "consensusStateHeights":[
+ {
+ "revisionHeight":"7379500",
+ "revisionNumber":"0"
+ },
+ {
+ "revisionHeight":"7379506",
+ "revisionNumber":"0"
+ },
+ {
+ "revisionHeight":"7379521",
+ "revisionNumber":"0"
+ },
+ {
+ "revisionHeight":"7379538",
+ "revisionNumber":"0"
+ }
+ ],
+ "pagination":{
+ "nextKey":"",
+ "total":"0"
+ }
+}
+```
+
+
+Parameter | Type | Description |
---|
consensus_state_heights | Height Array | Consensus state heights |
+pagination | PageResponse | Pagination information in the response |
+
+
+
+
+**Height**
+
+
+Parameter | Type | Description |
---|
revision_number | Integer | The revision that the client is currently on |
+revision_height | Integer | The height within the given revision |
+
+
+
+## ClientStatus
+
+Queries the status of an IBC client
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ client_id = "07-tendermint-0"
+
+ state = await client.fetch_ibc_client_status(client_id=client_id)
+ print(state)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientId := "07-tendermint-0"
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCClientStatus(ctx, clientId)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
client_id | String | Client unique identifier | Yes |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "status":"Expired"
+}
+```
+
+
+Parameter | Type | Description |
---|
status | String | Client status |
+
+
+
+## ClientParams
+
+Queries all parameters of the ibc client submodule
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ params = await client.fetch_ibc_client_params()
+ print(params)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCClientParams(ctx)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+No parameters
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "params":{
+ "allowedClients":[
+ "06-solomachine",
+ "07-tendermint"
+ ]
+ }
+}
+```
+
+
+Parameter | Type | Description |
---|
params | params | Module's parameters |
+
+
+
+
+**Params**
+
+
+Parameter | Type | Description |
---|
allowed_clients | String Array | Allowed_clients defines the list of allowed client state types which can be created and interacted with. If a client type is removed from the allowed clients list, usage of this client will be disabled until it is added again to the list |
+
+
+
+## UpgradedClientState
+
+Queries an Upgraded IBC light client
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ state = await client.fetch_ibc_upgraded_client_state()
+ print(state)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCUpgradedClientState(ctx)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+No parameters
+
+### Response Parameters
+> Response Example:
+
+``` json
+
+```
+
+
+Parameter | Type | Description |
---|
upgraded_client_state | Any | Client state associated with the request identifier |
+
+
+
+## UpgradedConsensusState
+
+Queries an Upgraded IBC consensus state
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ state = await client.fetch_ibc_upgraded_consensus_state()
+ print(state)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCUpgradedConsensusState(ctx)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+No parameters
+
+### Response Parameters
+> Response Example:
+
+``` json
+
+```
+
+
+Parameter | Type | Description |
---|
upgraded_consensus_state | Any | Consensus state associated with the request identifier |
+
\ No newline at end of file
diff --git a/source/includes/_ibctransfer.md b/source/includes/_ibctransfer.md
new file mode 100644
index 00000000..529baae7
--- /dev/null
+++ b/source/includes/_ibctransfer.md
@@ -0,0 +1,1019 @@
+# - IBC Transfer
+
+Includes all the messages and queries associated to transfers from the IBC transfer module
+
+## DenomTrace
+
+Queries a denomination trace information
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+from hashlib import sha256
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ path = "transfer/channel-126"
+ base_denom = "uluna"
+ full_path = f"{path}/{base_denom}"
+ path_hash = sha256(full_path.encode()).hexdigest()
+ trace_hash = f"ibc/{path_hash}"
+
+ denom_trace = await client.fetch_denom_trace(hash=trace_hash)
+ print(denom_trace)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ denomTrace := types.DenomTrace{
+ Path: "transfer/channel-126",
+ BaseDenom: "uluna",
+ }
+ ctx := context.Background()
+
+ res, err := chainClient.FetchDenomTrace(ctx, denomTrace.Hash().String())
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
hash | String | The denom trace hash | Yes |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "denomTrace":{
+ "path":"transfer/channel-126",
+ "baseDenom":"uluna"
+ }
+}
+```
+
+
+Parameter | Type | Description |
---|
denom_trace | DenomTrace | Denom trace information |
+
+
+
+
+**DenomTrace**
+
+
+Parameter | Type | Description |
---|
path | String | Path is the port and channel |
+base_denom | String | The token denom |
+
+
+
+## DenomTraces
+
+Queries all denomination traces
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.client.model.pagination import PaginationOption
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ pagination = PaginationOption(skip=2, limit=4)
+
+ denom_traces = await client.fetch_denom_traces(pagination=pagination)
+ print(denom_traces)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+ "github.com/cosmos/cosmos-sdk/types/query"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ pagination := query.PageRequest{Offset: 2, Limit: 4}
+ ctx := context.Background()
+
+ res, err := chainClient.FetchDenomTraces(ctx, &pagination)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
pagination | PageRequest | The optional pagination for the request | No |
+
+
+
+
+**PageRequest**
+
+
+Parameter | Type | Description | Required |
---|
key | Byte Array | Key is a value returned in PageResponse.next_key to begin querying the next page most efficiently. Only one of offset or key should be set | No |
+offset | Integer | Numeric offset that can be used when key is unavailable. It is less efficient than using key. Only one of offset or key should be set | No |
+limit | Integer | Total number of results to be returned in the result page | No |
+count_total | Boolean | Set to true to indicate that the result set should include a count of the total number of items available for pagination in UIs. It is only respected when offset is used. It is ignored when key is set | No |
+reverse | Boolean | Reverse is set to true if results are to be returned in the descending order | No |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "denomTraces":[
+ {
+ "path":"transfer/channel-160",
+ "baseDenom":"uatom"
+ },
+ {
+ "path":"transfer/channel-2",
+ "baseDenom":"uphoton"
+ },
+ {
+ "path":"transfer/channel-43",
+ "baseDenom":"uandr"
+ },
+ {
+ "path":"transfer/channel-6",
+ "baseDenom":"cw20:terra167dsqkh2alurx997wmycw9ydkyu54gyswe3ygmrs4lwume3vmwks8ruqnv"
+ }
+ ],
+ "pagination":{
+ "nextKey":"WZNnsWM6uaj4vFpbpqm1M+3mVbhdRvmgClPl/2jiXlc=",
+ "total":"0"
+ }
+}
+```
+
+
+Parameter | Type | Description |
---|
denom_traces | DenomTrace Array | Denom traces information |
+pagination | PageResponse | Pagination information in the response |
+
+
+
+
+**PageResponse**
+
+
+Parameter | Type | Description |
---|
next_key | Byte Array | The key to be passed to PageRequest.key to query the next page most efficiently. It will be empty if there are no more results. |
+total | Integer | Total number of results available if PageRequest.count_total was set, its value is undefined otherwise |
+
+
+
+## DenomHash
+
+Queries a denomination hash information
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ path = "transfer/channel-126"
+ base_denom = "uluna"
+ full_path = f"{path}/{base_denom}"
+
+ denom_hash = await client.fetch_denom_hash(trace=full_path)
+ print(denom_hash)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ path := "transfer/channel-126"
+ baseDenom := "uluna"
+ fullPath := fmt.Sprintf("%s/%s", path, baseDenom)
+ ctx := context.Background()
+
+ res, err := chainClient.FetchDenomHash(ctx, fullPath)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
trace | String | The denomination trace ([port_id]/[channel_id])+/[denom] | Yes |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "hash":"97498452BF27CC90656FD7D6EFDA287FA2BFFFF3E84691C84CB9E0451F6DF0A4"
+}
+```
+
+
+Parameter | Type | Description |
---|
hash | String | Hash (in hex format) of the denomination trace information |
+
+
+
+## EscrowAddress
+
+Returns the escrow address for a particular port and channel id
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ port_id = "transfer"
+ channel_id = "channel-126"
+
+ escrow_address = await client.fetch_escrow_address(port_id=port_id, channel_id=channel_id)
+ print(escrow_address)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ portId := "transfer"
+ channelId := "channel-126"
+ ctx := context.Background()
+
+ res, err := chainClient.FetchEscrowAddress(ctx, portId, channelId)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
port_id | String | The unique port identifier | Yes |
+channel_id | String | The unique channel identifier | Yes |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "escrowAddress":"inj1w8ent9jwwqy2d5s8grq6muk2hqa6kj2863m3mg"
+}
+```
+
+
+Parameter | Type | Description |
---|
escrow_address | String | The escrow account address |
+
+
+
+## TotalEscrowForDenom
+
+Returns the total amount of tokens in escrow based on the denom
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ base_denom = "uluna"
+
+ escrow = await client.fetch_total_escrow_for_denom(denom=base_denom)
+ print(escrow)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+
+ "os"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ baseDenom := "uluna"
+ ctx := context.Background()
+
+ res, err := chainClient.FetchTotalEscrowForDenom(ctx, baseDenom)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
denom | String | Token denom | Yes |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "amount":{
+ "denom":"uluna",
+ "amount":"0"
+ }
+}
+```
+
+
+Parameter | Type | Description |
---|
amount | Coin | Amount of token in the escrow |
+
+
+
+
+**Coin**
+
+
+Parameter | Type | Description | Required |
---|
denom | String | The token denom | Yes |
+amount | String | The amount of tokens | Yes |
+
+
+
+## MsgTransfer
+
+Defines a msg to transfer fungible tokens (i.e Coins) between ICS20 enabled chains. See ICS Spec here: ICS Spec
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+import os
+from decimal import Decimal
+
+import dotenv
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.broadcaster import MsgBroadcasterWithPk
+from pyinjective.core.network import Network
+from pyinjective.wallet import PrivateKey
+
+
+async def main() -> None:
+ dotenv.load_dotenv()
+ configured_private_key = os.getenv("INJECTIVE_PRIVATE_KEY")
+
+ # select network: local, testnet, mainnet
+ network = Network.testnet()
+
+ # initialize grpc client
+ client = AsyncClient(network)
+ await client.initialize_tokens_from_chain_denoms()
+ composer = await client.composer()
+ await client.sync_timeout_height()
+
+ message_broadcaster = MsgBroadcasterWithPk.new_using_simulation(
+ network=network,
+ private_key=configured_private_key,
+ )
+
+ # load account
+ priv_key = PrivateKey.from_hex(configured_private_key)
+ pub_key = priv_key.to_public_key()
+ address = pub_key.to_address()
+ await client.fetch_account(address.to_acc_bech32())
+
+ source_port = "transfer"
+ source_channel = "channel-126"
+ token_amount = composer.create_coin_amount(amount=Decimal("0.1"), token_name="INJ")
+ sender = address.to_acc_bech32()
+ receiver = "inj1hkhdaj2a2clmq5jq6mspsggqs32vynpk228q3r"
+ timeout_height = 10
+
+ # prepare tx msg
+ message = composer.msg_ibc_transfer(
+ source_port=source_port,
+ source_channel=source_channel,
+ token_amount=token_amount,
+ sender=sender,
+ receiver=receiver,
+ timeout_height=timeout_height,
+ )
+
+ # broadcast the transaction
+ result = await message_broadcaster.broadcast([message])
+ print("---Transaction Response---")
+ print(result)
+
+
+if __name__ == "__main__":
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "encoding/json"
+ "fmt"
+ "os"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+ sdktypes "github.com/cosmos/cosmos-sdk/types"
+ ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
+ ibccoretypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ // initialize grpc client
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+ if err != nil {
+ panic(err)
+ }
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ sourcePort := "transfer"
+ sourceChannel := "channel-126"
+ coin := sdktypes.Coin{
+ Denom: "inj", Amount: sdktypes.NewInt(1000000000000000000), // 1 INJ
+ }
+ sender := senderAddress.String()
+ receiver := "inj1hkhdaj2a2clmq5jq6mspsggqs32vynpk228q3r"
+ timeoutHeight := ibccoretypes.Height{RevisionNumber: 10, RevisionHeight: 10}
+
+ msg := &ibctransfertypes.MsgTransfer{
+ SourcePort: sourcePort,
+ SourceChannel: sourceChannel,
+ Token: coin,
+ Sender: sender,
+ Receiver: receiver,
+ TimeoutHeight: timeoutHeight,
+ }
+
+ //AsyncBroadcastMsg, SyncBroadcastMsg, QueueBroadcastMsg
+ response, err := chainClient.AsyncBroadcastMsg(msg)
+
+ if err != nil {
+ panic(err)
+ }
+
+ str, _ := json.MarshalIndent(response, "", " ")
+ fmt.Print(string(str))
+}
+```
+
+
+
+Parameter | Type | Description |
---|
source_port | String | The port on which the packet will be sent |
+source_channel | String | The channel by which the packet will be sent |
+token | Coin | The tokens to be transferred |
+sender | String | The sender address |
+receiver | String | The recipient address on the destination chain |
+timeout_height | Height | Timeout height relative to the current block height. The timeout is disabled when set to 0 |
+timeout_timestamp | Integer | Timeout timestamp in absolute nanoseconds since unix epoch. The timeout is disabled when set to 0 |
+memo | String | Optional memo |
+
+
+
+
+**Coin**
+
+
+Parameter | Type | Description | Required |
---|
denom | String | The token denom | Yes |
+amount | String | The amount of tokens | Yes |
+
+
+
+
+**Height**
+
+
+Parameter | Type | Description |
---|
revision_number | Integer | The revision that the client is currently on |
+revision_height | Integer | The height within the given revision |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+```
+
+
+Paramter | Type | Description |
---|
tx_response | TxResponse | Transaction details |
+
+
+
+
+**TxResponse**
+
+
+Parameter | Type | Description |
---|
height | Integer | The block height |
+tx_hash | String | Transaction hash |
+codespace | String | Namespace for the code |
+code | Integer | Response code (zero for success, non-zero for errors) |
+data | String | Bytes, if any |
+raw_log | String | The output of the application's logger (raw string) |
+logs | ABCIMessageLog Array | The output of the application's logger (typed) |
+info | String | Additional information |
+gas_wanted | Integer | Amount of gas requested for the transaction |
+gas_used | Integer | Amount of gas consumed by the transaction |
+tx | Any | The request transaction bytes |
+timestamp | String | Time of the previous block. For heights > 1, it's the weighted median of the timestamps of the valid votes in the block.LastCommit. For height == 1, it's genesis time |
+events | Event Array | Events defines all the events emitted by processing a transaction. Note, these events include those emitted by processing all the messages and those emitted from the ante. Whereas Logs contains the events, with additional metadata, emitted only by processing the messages. |
+
+
+
+
+**ABCIMessageLog**
+
+
+Parameter | Type | Description |
---|
msg_index | Integer | The message index |
+log | String | The log message |
+events | StringEvent Array | Event objects that were emitted during the execution |
+
+
+
+
+**Event**
+
+
+Parameter | Type | Description |
---|
type | String | Event type |
+attributes | EventAttribute Array | All event object details |
+
+
+
+
+**StringEvent**
+
+
+Parameter | Type | Description |
---|
type | String | Event type |
+attributes | Attribute Array | Event data |
+
+
+
+
+**EventAttribute**
+
+
+Parameter | Type | Description |
---|
key | String | Attribute key |
+value | String | Attribute value |
+index | Boolean | If attribute is indexed |
+
+
+
+
+**Attribute**
+
+
+Parameter | Type | Description |
---|
key | String | Attribute key |
+value | String | Attribute value |
+
\ No newline at end of file
diff --git a/source/includes/_spot.md b/source/includes/_spot.md
index b29130b6..88a82640 100644
--- a/source/includes/_spot.md
+++ b/source/includes/_spot.md
@@ -149,6 +149,7 @@ func main() {
+
**SpotMarket**
@@ -165,6 +166,7 @@ func main() {
+
**MarketStatus**
@@ -318,6 +320,7 @@ func main() {
+
**SpotMarket**
@@ -334,6 +337,7 @@ func main() {
+
**MarketStatus**
@@ -502,6 +506,7 @@ func main() {
+
**FullSpotMarket**
@@ -510,6 +515,7 @@ func main() {
+
**SpotMarket**
@@ -526,6 +532,7 @@ func main() {
+
**MarketStatus**
@@ -537,6 +544,7 @@ func main() {
+
**MidPriceAndTOB**
@@ -698,6 +706,7 @@ func main() {
+
**FullSpotMarket**
@@ -706,6 +715,7 @@ func main() {
+
**SpotMarket**
@@ -722,6 +732,7 @@ func main() {
+
**MarketStatus**
@@ -733,6 +744,7 @@ func main() {
+
**MidPriceAndTOB**
@@ -876,6 +888,7 @@ func main() {
+
**OrderSide**
@@ -911,6 +924,7 @@ func main() {
+
**Level**
@@ -1096,6 +1110,7 @@ func main() {
+
**TrimmedSpotLimitOrder**
@@ -1302,6 +1317,7 @@ func main() {
+
**TrimmedSpotLimitOrder**
@@ -1472,6 +1488,7 @@ func main() {
+
**TrimmedSpotLimitOrder**
@@ -1633,6 +1650,7 @@ func main() {
+
**TrimmedSpotLimitOrder**
@@ -1973,6 +1991,7 @@ func main() {
+
**TxResponse**
@@ -1992,6 +2011,7 @@ func main() {
+
**ABCIMessageLog**
@@ -2001,6 +2021,7 @@ func main() {
+
**Event**
@@ -2009,6 +2030,7 @@ func main() {
+
**StringEvent**
@@ -2017,6 +2039,7 @@ func main() {
+
**EventAttribute**
@@ -2026,6 +2049,7 @@ func main() {
+
**Attribute**
@@ -2293,6 +2317,7 @@ func main() {
+
**SpotOrder**
@@ -2303,6 +2328,7 @@ func main() {
+
**OrderInfo**
@@ -2314,6 +2340,7 @@ func main() {
+
**OrderType**
@@ -2359,6 +2386,7 @@ gas fee: 0.000064956 INJ
+
**TxResponse**
@@ -2378,6 +2406,7 @@ gas fee: 0.000064956 INJ
+
**ABCIMessageLog**
@@ -2387,6 +2416,7 @@ gas fee: 0.000064956 INJ
+
**Event**
@@ -2395,6 +2425,7 @@ gas fee: 0.000064956 INJ
+
**StringEvent**
@@ -2403,6 +2434,7 @@ gas fee: 0.000064956 INJ
+
**EventAttribute**
@@ -2412,6 +2444,7 @@ gas fee: 0.000064956 INJ
+
**Attribute**
@@ -2676,6 +2709,7 @@ func main() {
+
**SpotOrder**
@@ -2686,6 +2720,7 @@ func main() {
+
**OrderInfo**
@@ -2697,6 +2732,7 @@ func main() {
+
**OrderType**
@@ -2742,6 +2778,7 @@ gas fee: 0.000065298 INJ
+
**TxResponse**
@@ -2761,6 +2798,7 @@ gas fee: 0.000065298 INJ
+
**ABCIMessageLog**
@@ -2770,6 +2808,7 @@ gas fee: 0.000065298 INJ
+
**Event**
@@ -2778,6 +2817,7 @@ gas fee: 0.000065298 INJ
+
**StringEvent**
@@ -2786,6 +2826,7 @@ gas fee: 0.000065298 INJ
+
**EventAttribute**
@@ -2795,6 +2836,7 @@ gas fee: 0.000065298 INJ
+
**Attribute**
@@ -3022,6 +3064,7 @@ gas fee: 0.0000636815 INJ
+
**TxResponse**
@@ -3041,6 +3084,7 @@ gas fee: 0.0000636815 INJ
+
**ABCIMessageLog**
@@ -3050,6 +3094,7 @@ gas fee: 0.0000636815 INJ
+
**Event**
@@ -3058,6 +3103,7 @@ gas fee: 0.0000636815 INJ
+
**StringEvent**
@@ -3066,6 +3112,7 @@ gas fee: 0.0000636815 INJ
+
**EventAttribute**
@@ -3075,6 +3122,7 @@ gas fee: 0.0000636815 INJ
+
**Attribute**
@@ -3458,6 +3506,7 @@ func main() {
+
**OrderData**
@@ -3469,6 +3518,7 @@ func main() {
+
**SpotOrder**
@@ -3479,6 +3529,7 @@ func main() {
+
**DerivativeOrder**
@@ -3490,6 +3541,7 @@ func main() {
+
**OrderMask**
@@ -3504,6 +3556,7 @@ func main() {
+
**OrderInfo**
@@ -3515,6 +3568,7 @@ func main() {
+
**OrderType**
@@ -3568,6 +3622,7 @@ gas fee: 0.000329546 INJ
+
**TxResponse**
@@ -3587,6 +3642,7 @@ gas fee: 0.000329546 INJ
+
**ABCIMessageLog**
@@ -3596,6 +3652,7 @@ gas fee: 0.000329546 INJ
+
**Event**
@@ -3604,6 +3661,7 @@ gas fee: 0.000329546 INJ
+
**StringEvent**
@@ -3612,6 +3670,7 @@ gas fee: 0.000329546 INJ
+
**EventAttribute**
@@ -3621,6 +3680,7 @@ gas fee: 0.000329546 INJ
+
**Attribute**
diff --git a/source/includes/_staking.md b/source/includes/_staking.md
index 5190abc1..54a582da 100644
--- a/source/includes/_staking.md
+++ b/source/includes/_staking.md
@@ -140,6 +140,7 @@ func main() {
+
**DecCoin**
@@ -280,6 +281,7 @@ func main() {
+
**ValidatorOutstandingRewards**
@@ -287,6 +289,7 @@ func main() {
+
**DecCoin**
@@ -427,6 +430,7 @@ func main() {
+
**ValidatorAccumulatedCommission**
@@ -434,6 +438,7 @@ func main() {
+
**DecCoin**
@@ -565,6 +570,7 @@ func main() {
+
**PageRequest**
@@ -588,6 +594,7 @@ func main() {
+
**ValidatorSlashEvent**
@@ -596,6 +603,7 @@ func main() {
+
**PageResponse**
@@ -739,6 +747,7 @@ func main() {
+
**DecCoin**
@@ -915,6 +924,7 @@ func main() {
+
**DelegationDelegatorReward**
@@ -923,6 +933,7 @@ func main() {
+
**DecCoin**
@@ -1317,6 +1328,7 @@ No parameters
+
**DecCoin**
@@ -1484,6 +1496,7 @@ func main() {
+
**TxResponse**
@@ -1503,6 +1516,7 @@ func main() {
+
**ABCIMessageLog**
@@ -1512,6 +1526,7 @@ func main() {
+
**Event**
@@ -1520,6 +1535,7 @@ func main() {
+
**StringEvent**
@@ -1528,6 +1544,7 @@ func main() {
+
**EventAttribute**
@@ -1537,6 +1554,7 @@ func main() {
+
**Attribute**
@@ -1722,6 +1740,7 @@ gas fee: 0.000097523 INJ
+
**TxResponse**
@@ -1741,6 +1760,7 @@ gas fee: 0.000097523 INJ
+
**ABCIMessageLog**
@@ -1750,6 +1770,7 @@ gas fee: 0.000097523 INJ
+
**Event**
@@ -1758,6 +1779,7 @@ gas fee: 0.000097523 INJ
+
**StringEvent**
@@ -1766,6 +1788,7 @@ gas fee: 0.000097523 INJ
+
**EventAttribute**
@@ -1775,6 +1798,7 @@ gas fee: 0.000097523 INJ
+
**Attribute**
@@ -1939,6 +1963,7 @@ func main() {
+
**TxResponse**
@@ -1958,6 +1983,7 @@ func main() {
+
**ABCIMessageLog**
@@ -1967,6 +1993,7 @@ func main() {
+
**Event**
@@ -1975,6 +2002,7 @@ func main() {
+
**StringEvent**
@@ -1983,6 +2011,7 @@ func main() {
+
**EventAttribute**
@@ -1992,6 +2021,7 @@ func main() {
+
**Attribute**
@@ -2150,6 +2180,7 @@ func main() {
+
**Coin**
@@ -2169,6 +2200,7 @@ func main() {
+
**TxResponse**
@@ -2188,6 +2220,7 @@ func main() {
+
**ABCIMessageLog**
@@ -2197,6 +2230,7 @@ func main() {
+
**Event**
@@ -2205,6 +2239,7 @@ func main() {
+
**StringEvent**
@@ -2213,6 +2248,7 @@ func main() {
+
**EventAttribute**
@@ -2222,6 +2258,7 @@ func main() {
+
**Attribute**
@@ -2424,6 +2461,7 @@ func main() {
+
**Coin**
@@ -2455,6 +2493,7 @@ gas fee: 0.000103923 INJ
+
**TxResponse**
@@ -2474,6 +2513,7 @@ gas fee: 0.000103923 INJ
+
**ABCIMessageLog**
@@ -2483,6 +2523,7 @@ gas fee: 0.000103923 INJ
+
**Event**
@@ -2491,6 +2532,7 @@ gas fee: 0.000103923 INJ
+
**StringEvent**
@@ -2499,6 +2541,7 @@ gas fee: 0.000103923 INJ
+
**EventAttribute**
@@ -2508,6 +2551,7 @@ gas fee: 0.000103923 INJ
+
**Attribute**
diff --git a/source/includes/_tendermint.md b/source/includes/_tendermint.md
new file mode 100644
index 00000000..b8bbb6ac
--- /dev/null
+++ b/source/includes/_tendermint.md
@@ -0,0 +1,1637 @@
+# - Tendermint
+
+Cosmos Tendermint module
+
+## GetNodeInfo
+
+Gets the current node info
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ node_info = await client.fetch_node_info()
+ print(node_info)
+
+
+if __name__ == "__main__":
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "os"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ ctx := context.Background()
+
+ res, err := chainClient.FetchNodeInfo(ctx)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+No parameters
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "defaultNodeInfo":{
+ "protocolVersion":{
+ "p2p":"8",
+ "block":"11",
+ "app":"0"
+ },
+ "defaultNodeId":"53c19e8ba2deb109ba8d09dd41ae82bbddd74467",
+ "listenAddr":"tcp://0.0.0.0:26656",
+ "network":"injective-888",
+ "version":"0.37.1",
+ "channels":"QCAhIiMwOGBhAA==",
+ "moniker":"injective",
+ "other":{
+ "txIndex":"on",
+ "rpcAddress":"tcp://0.0.0.0:26657"
+ }
+ },
+ "applicationVersion":{
+ "name":"injective",
+ "appName":"injectived",
+ "gitCommit":"1f0a39381",
+ "goVersion":"go version go1.19.13 linux/amd64",
+ "buildDeps":[
+ {
+ "path":"cloud.google.com/go",
+ "version":"v0.110.4",
+ "sum":"h1:1JYyxKMN9hd5dR2MYTPWkGUgcoxVVhg0LKNKEo0qvmk="
+ },
+ {
+ "path":"cloud.google.com/go/compute/metadata",
+ "version":"v0.2.3",
+ "sum":"h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY="
+ }
+ ],
+ "cosmosSdkVersion":"v0.47.5",
+ "version":"",
+ "buildTags":""
+ }
+}
+```
+
+
+Parameter | Type | Description |
---|
default_node_info | DefaultNodeInfo | Node information |
+application_version | VersionInfo | Node version information |
+
+
+
+
+**DefaultNodeInfo**
+
+
+Parameter | Type | Description |
---|
protocol_version | ProtocolVersion | Protocol version information |
+default_nod_id | String | Node identifier |
+listen_addr | String | URI of the node's listening endpoint |
+network | String | The chain network name |
+version | String | The version number |
+channels | Bytes | Channels information |
+moniker | String | |
+other | DefaultNodeInfoOther | Extra node information |
+
+
+
+
+**ProtocolVersion**
+
+
+Parameter | Type | Description |
---|
p2p | Integer | |
+block | Integer | |
+app | Integer | |
+
+
+
+
+**DefaultNodeInfoOther**
+
+
+Parameter | Type | Description |
---|
tx_index | String | TX indexing status (on/off) |
+rpc_address | String | URI for RPC connections |
+
+
+
+
+**VersionInfo**
+
+
+Parameter | Type | Description |
---|
name | String | The chain name |
+app_name | String | Application name |
+version | String | Application version |
+git_commit | String | Git commit hash |
+build_tags | String | Application build tags |
+go_version | String | GoLang version used to compile the application |
+build_deps | Module Array | Application dependencies |
+cosmos_sdk_version | String | Cosmos SDK version used by the application |
+
+
+
+
+**Module**
+
+
+Parameter | Type | Description |
---|
path | String | Module path |
+version | String | Module version |
+sum | String | Checksum |
+
+
+
+## GetSyncing
+
+Returns the node's syncing status
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ syncing = await client.fetch_syncing()
+ print(syncing)
+
+
+if __name__ == "__main__":
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "os"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ ctx := context.Background()
+
+ res, err := chainClient.FetchSyncing(ctx)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+No parameters
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "syncing":false
+}
+```
+
+
+Parameter | Type | Description |
---|
syncing | Boolean | Syncing status |
+
+
+
+## GetLatestBlock
+
+Get the latest block
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ latest_block = await client.fetch_latest_block()
+ print(latest_block)
+
+
+if __name__ == "__main__":
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "os"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ ctx := context.Background()
+
+ res, err := chainClient.FetchLatestBlock(ctx)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+No parameters
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "blockId":{
+ "hash":"bCxPpTR4INvkmf3kAVYi1KhwzX0ySxQuhc8xBBFNmAo=",
+ "partSetHeader":{
+ "total":1,
+ "hash":"6zGn+fBW1y4cpyos4g/tVNQdqS03D/jr/B68SYVvcbQ="
+ }
+ },
+ "block":{
+ "header":{
+ "version":{
+ "block":"11",
+ "app":"0"
+ },
+ "chainId":"injective-888",
+ "height":"23197636",
+ "time":"2024-03-14T17:39:19.050602Z",
+ "lastBlockId":{
+ "hash":"SglGvXqUCRelE9NtLBiJ0EIBBxTXmztat4fVrYagYlM=",
+ "partSetHeader":{
+ "total":1,
+ "hash":"AsAE1Sdl69RqHqaseeRn3U6N43gG9T710HUjXJi6fyw="
+ }
+ },
+ "lastCommitHash":"EBSqUY4fpGLr2FmmcYsFa01H0PDWQLVuKslws5Un9zU=",
+ "dataHash":"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
+ "validatorsHash":"G0AQ0vfNXTLF7UcNXSvk6ZJRWFo09hadwJSm7haFV6I=",
+ "nextValidatorsHash":"G0AQ0vfNXTLF7UcNXSvk6ZJRWFo09hadwJSm7haFV6I=",
+ "consensusHash":"5bupI5wNP5Z/jvh5UG/269+5QPiQTXKRNRpGHwCqrU0=",
+ "appHash":"UoJN/dwHiiDytgSt3xHcb9zkcP8eFZ+qFZWWclQ6SYg=",
+ "lastResultsHash":"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
+ "evidenceHash":"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
+ "proposerAddress":"M5HjW2EATgO+uI+h2rRES5E7174="
+ },
+ "data":{
+ "txs":[
+
+ ]
+ },
+ "evidence":{
+ "evidence":[
+
+ ]
+ },
+ "lastCommit":{
+ "height":"23197635",
+ "blockId":{
+ "hash":"SglGvXqUCRelE9NtLBiJ0EIBBxTXmztat4fVrYagYlM=",
+ "partSetHeader":{
+ "total":1,
+ "hash":"AsAE1Sdl69RqHqaseeRn3U6N43gG9T710HUjXJi6fyw="
+ }
+ },
+ "signatures":[
+ {
+ "blockIdFlag":"BLOCK_ID_FLAG_ABSENT",
+ "timestamp":"0001-01-01T00:00:00Z",
+ "validatorAddress":"",
+ "signature":""
+ },
+ {
+ "blockIdFlag":"BLOCK_ID_FLAG_COMMIT",
+ "validatorAddress":"ObUXYdS8jfTSNPonUBFPJkft7eA=",
+ "timestamp":"2024-03-14T17:39:19.050602Z",
+ "signature":"3ZdA7LqXq4Hj5olf1XKusJ6NHCBkqjpty9pgmsxKyzSG0VL8Uf+Ro0NDuZo8jK4qfLsuctCte3rdGV6lG/cKAA=="
+ },
+ {
+ "blockIdFlag":"BLOCK_ID_FLAG_COMMIT",
+ "validatorAddress":"M5HjW2EATgO+uI+h2rRES5E7174=",
+ "timestamp":"2024-03-14T17:39:19.044716221Z",
+ "signature":"u8QVTQO/QZhNSzAwVCR3bGLUzryi9E+3jQ2COcHi46GfU0SpWOPNBvdbOHsEkRx6EKh0P0acB/hOnDE5JPp5AA=="
+ },
+ {
+ "blockIdFlag":"BLOCK_ID_FLAG_COMMIT",
+ "validatorAddress":"y8ctJ4QpJ0S7ZTVY7RTE4z1hS2c=",
+ "timestamp":"2024-03-14T17:39:19.051153172Z",
+ "signature":"0R/H5GkdKJszELjxfwX9qQlr5nuANTQYN9aTTDvKkUqJDoXW3OwbQPHtegKJlVKU8BT80D2Glng+SnQMO3JSCA=="
+ }
+ ],
+ "round":0
+ }
+ },
+ "sdkBlock":{
+ "header":{
+ "version":{
+ "block":"11",
+ "app":"0"
+ },
+ "chainId":"injective-888",
+ "height":"23197636",
+ "time":"2024-03-14T17:39:19.050602Z",
+ "lastBlockId":{
+ "hash":"SglGvXqUCRelE9NtLBiJ0EIBBxTXmztat4fVrYagYlM=",
+ "partSetHeader":{
+ "total":1,
+ "hash":"AsAE1Sdl69RqHqaseeRn3U6N43gG9T710HUjXJi6fyw="
+ }
+ },
+ "lastCommitHash":"EBSqUY4fpGLr2FmmcYsFa01H0PDWQLVuKslws5Un9zU=",
+ "dataHash":"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
+ "validatorsHash":"G0AQ0vfNXTLF7UcNXSvk6ZJRWFo09hadwJSm7haFV6I=",
+ "nextValidatorsHash":"G0AQ0vfNXTLF7UcNXSvk6ZJRWFo09hadwJSm7haFV6I=",
+ "consensusHash":"5bupI5wNP5Z/jvh5UG/269+5QPiQTXKRNRpGHwCqrU0=",
+ "appHash":"UoJN/dwHiiDytgSt3xHcb9zkcP8eFZ+qFZWWclQ6SYg=",
+ "lastResultsHash":"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
+ "evidenceHash":"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
+ "proposerAddress":"injvalcons1xwg7xkmpqp8q804c37sa4dzyfwgnh4a74ll9pz"
+ },
+ "data":{
+ "txs":[
+
+ ]
+ },
+ "evidence":{
+ "evidence":[
+
+ ]
+ },
+ "lastCommit":{
+ "height":"23197635",
+ "blockId":{
+ "hash":"SglGvXqUCRelE9NtLBiJ0EIBBxTXmztat4fVrYagYlM=",
+ "partSetHeader":{
+ "total":1,
+ "hash":"AsAE1Sdl69RqHqaseeRn3U6N43gG9T710HUjXJi6fyw="
+ }
+ },
+ "signatures":[
+ {
+ "blockIdFlag":"BLOCK_ID_FLAG_ABSENT",
+ "timestamp":"0001-01-01T00:00:00Z",
+ "validatorAddress":"",
+ "signature":""
+ },
+ {
+ "blockIdFlag":"BLOCK_ID_FLAG_COMMIT",
+ "validatorAddress":"ObUXYdS8jfTSNPonUBFPJkft7eA=",
+ "timestamp":"2024-03-14T17:39:19.050602Z",
+ "signature":"3ZdA7LqXq4Hj5olf1XKusJ6NHCBkqjpty9pgmsxKyzSG0VL8Uf+Ro0NDuZo8jK4qfLsuctCte3rdGV6lG/cKAA=="
+ },
+ {
+ "blockIdFlag":"BLOCK_ID_FLAG_COMMIT",
+ "validatorAddress":"M5HjW2EATgO+uI+h2rRES5E7174=",
+ "timestamp":"2024-03-14T17:39:19.044716221Z",
+ "signature":"u8QVTQO/QZhNSzAwVCR3bGLUzryi9E+3jQ2COcHi46GfU0SpWOPNBvdbOHsEkRx6EKh0P0acB/hOnDE5JPp5AA=="
+ },
+ {
+ "blockIdFlag":"BLOCK_ID_FLAG_COMMIT",
+ "validatorAddress":"y8ctJ4QpJ0S7ZTVY7RTE4z1hS2c=",
+ "timestamp":"2024-03-14T17:39:19.051153172Z",
+ "signature":"0R/H5GkdKJszELjxfwX9qQlr5nuANTQYN9aTTDvKkUqJDoXW3OwbQPHtegKJlVKU8BT80D2Glng+SnQMO3JSCA=="
+ }
+ ],
+ "round":0
+ }
+ }
+}
+```
+
+
+Parameter | Type | Description |
---|
block_id | BlockID | Block identifier |
+sdk_block | Block | Block details |
+
+
+
+
+**BlockID**
+
+
+Parameter | Type | Description |
---|
hash | Bytes | Block hash |
+part_set_header | PartSetHeader | |
+
+
+
+
+**PartSetHeader**
+
+
+Parameter | Type | Description |
---|
total | Integer | |
+hash | Bytes | |
+
+
+
+
+**Block**
+
+
+Parameter | Type | Description |
---|
header | Header | Header information |
+data | Data | Block data |
+evidence | EvidenceList | |
+last_commit | Commit | |
+
+
+
+
+**Header**
+
+
+Parameter | Type | Description |
---|
version | Consensus | |
+chain_id | String | Chain identifier |
+height | Integer | Block height |
+time | Time | Block time |
+last_block_id | BlockID | Previous block identifier |
+last_commit_hash | Bytes | Last commit hash |
+data_hash | Bytes | Block data hash |
+validators_hash | Bytes | Validators information hash |
+next_validators_hash | Bytes | Validators information hash |
+consensus_hash | Bytes | Consensus information hash |
+app_hash | Bytes | Application hash |
+last_result_hash | Bytes | Last result hash |
+evidence_hash | Bytes | Evidence data hash |
+proposer_address | String | Block proposer's address |
+
+
+
+
+**Consensus**
+
+
+Parameter | Type | Description |
---|
version | Consensus | |
+chain_id | String | Chain identifier |
+height | Integer | Block height |
+time | Time | Block time |
+last_block_id | BlockID | Previous block identifier |
+last_commit_hash | Bytes | Last commit hash |
+data_hash | Bytes | Block data hash |
+validators_hash | Bytes | Validators information hash |
+next_validators_hash | Bytes | Validators information hash |
+consensus_hash | Bytes | Consensus information hash |
+app_hash | Bytes | Application hash |
+last_result_hash | Bytes | Last result hash |
+evidence_hash | Bytes | Evidence data hash |
+proposer_address | String | Block proposer's address |
+
+
+
+
+**Data**
+
+
+Parameter | Type | Description |
---|
txs | Byte Array | Txs that will be applied by state @ block.Height+1. NOTE: not all txs here are valid. We're just agreeing on the order first. This means that block.AppHash does not include these txs. |
+
+
+
+
+**EvidenceList**
+
+
+Parameter | Type | Description |
---|
evidence | Evidence Array | Block evidence |
+
+
+
+
+**Evidence**
+
+
+Parameter | Type | Description |
---|
sum | isEvidence_Sum | Valid types for 'sum' are Evidence_DuplicateVoteEvidence and Evidence_LightClientAttackEvidence |
+
+
+
+
+**Commit**
+
+
+Parameter | Type | Description |
---|
height | Integer | Block height |
+round | Integer | Consensus round |
+block_id | BlockID | Block identifier |
+signatures | CommitSig Array | Sigantures |
+
+
+
+
+**CommitSig**
+
+
+Parameter | Type | Description |
---|
block_id_flag | BlockIDFlag | Block height |
+validator_address | Bytes | Validator address |
+timestamp | Time | Block time |
+signature | Bytes | Block signature |
+
+
+
+
+**BlockIDFlag**
+
+
+Code | Name |
---|
0 | BLOCK_ID_FLAG_UNKNOWN |
+1 | BLOCK_ID_FLAG_ABSENT |
+2 | BLOCK_ID_FLAG_COMMIT |
+3 | BLOCK_ID_FLAG_NIL |
+
+
+
+## GetBlockByHeight
+
+Get the block for a given height
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ block = await client.fetch_block_by_height(height=15793860)
+ print(block)
+
+
+if __name__ == "__main__":
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "os"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ ctx := context.Background()
+
+ height := int64(23040174)
+ res, err := chainClient.FetchBlockByHeight(ctx, height)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+
+Parameter | Type | Description |
---|
block_id | BlockID | Block identifier |
+sdk_block | Block | Block details |
+
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "blockId":{
+ "hash":"MNF+X0DQFIsnEJAzyTxHMD8vZChOpW4rQeSnRKBiJ1Y=",
+ "partSetHeader":{
+ "total":1,
+ "hash":"Fqg81sOmF9dqH8lORXGat/mOFyqh52/lSHvsehg9OWk="
+ }
+ },
+ "block":{
+ "header":{
+ "version":{
+ "block":"11",
+ "app":"0"
+ },
+ "chainId":"injective-888",
+ "height":"15793860",
+ "time":"2023-09-07T03:59:36.393462082Z",
+ "lastBlockId":{
+ "hash":"RRhRSiIf1E08mJAtACM4J1RFSVJ96eR0PBVuoD7rb2c=",
+ "partSetHeader":{
+ "total":1,
+ "hash":"SeO5JkVtLUrhegd0rwDatDbvS5PQf/0Yvn+BmL1MOko="
+ }
+ },
+ "lastCommitHash":"rNxjhSihfCPkPMak9qPlmUYeXRc0weFu1nmmKMUPLAQ=",
+ "dataHash":"1RjS2VAhrWt2lLnVLozfeI7oAi7PoDILROzeheXN5H0=",
+ "validatorsHash":"6lDaVNHY4DtceWtHsVS7SdR8XuPSATqQ7qNKWIxcnhg=",
+ "nextValidatorsHash":"6lDaVNHY4DtceWtHsVS7SdR8XuPSATqQ7qNKWIxcnhg=",
+ "consensusHash":"ItjUyLlUnqkCxmoaGPck+PeXC45MXx6zsLXxtOHeBTE=",
+ "appHash":"Sv2MdUKQxwE/glEI8c8RFQKmc4HSyKO7j3sAqySultQ=",
+ "lastResultsHash":"Le4RmI//Wh43Mq6ro+VMWn7ZbVZRw3HXUAQILODtag8=",
+ "evidenceHash":"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
+ "proposerAddress":"ObUXYdS8jfTSNPonUBFPJkft7eA="
+ },
+ "data":{
+ "txs":[
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajF3bGY1NzdtbHd0eW01N3Njem1semtsN2tjdDAycXNsZHN4Z2p2NxIqaW5qMXIyNDh5c3IyeTQwcW0yazgzMHZhbnF4bm02dmNtbGhxcnVtczJlGhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajF3bGY1NzdtbHd0eW01N3Njem1semtsN2tjdDAycXNsZHN4Z2p2NxIqaW5qMXIyNDh5c3IyeTQwcW0yazgzMHZhbnF4bm02dmNtbGhxcnVtczJlGj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMXdsZjU3N21sd3R5bTU3c2N6bWx6a2w3a2N0MDJxc2xkc3hnanY3EippbmoxcjI0OHlzcjJ5NDBxbTJrODMwdmFucXhubTZ2Y21saHFydW1zMmUaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajF3bGY1NzdtbHd0eW01N3Njem1semtsN2tjdDAycXNsZHN4Z2p2NxIqaW5qMXIyNDh5c3IyeTQwcW0yazgzMHZhbnF4bm02dmNtbGhxcnVtczJlGkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMXdsZjU3N21sd3R5bTU3c2N6bWx6a2w3a2N0MDJxc2xkc3hnanY3EippbmoxcjI0OHlzcjJ5NDBxbTJrODMwdmFucXhubTZ2Y21saHFydW1zMmUaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajF3bGY1NzdtbHd0eW01N3Njem1semtsN2tjdDAycXNsZHN4Z2p2NxIqaW5qMXIyNDh5c3IyeTQwcW0yazgzMHZhbnF4bm02dmNtbGhxcnVtczJlGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajF3bGY1NzdtbHd0eW01N3Njem1semtsN2tjdDAycXNsZHN4Z2p2NxIqaW5qMXIyNDh5c3IyeTQwcW0yazgzMHZhbnF4bm02dmNtbGhxcnVtczJlGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajF3bGY1NzdtbHd0eW01N3Njem1semtsN2tjdDAycXNsZHN4Z2p2NxIqaW5qMXIyNDh5c3IyeTQwcW0yazgzMHZhbnF4bm02dmNtbGhxcnVtczJlGkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJz+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohAjr+rkaXrlMyQvUjnSB+viWNMY4CU7VHptUN/MxDVEOVEgQKAggBGLymARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkCHh6hdDRsHw1dfkRZkwLOmP7uNT6RSwNJPIBf8dg1bsnLtzAhpBlAd1nF1V7oWvAvoZ/gVoiNVdzjCWYYcUB/s",
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajFwMmh2N2Z6NnY3ZTk5c3dramZhNjllcmhjaGNkeGgya3l4cWp6axIqaW5qMWN6dGw4aDU4bDh6Y3YyM2xtMHpyOGg4cnlzdTVoeGNmZ2Q1MHl1GhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajFwMmh2N2Z6NnY3ZTk5c3dramZhNjllcmhjaGNkeGgya3l4cWp6axIqaW5qMWN6dGw4aDU4bDh6Y3YyM2xtMHpyOGg4cnlzdTVoeGNmZ2Q1MHl1Gj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMXAyaHY3Zno2djdlOTlzd2tqZmE2OWVyaGNoY2R4aDJreXhxanprEippbmoxY3p0bDhoNThsOHpjdjIzbG0wenI4aDhyeXN1NWh4Y2ZnZDUweXUaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajFwMmh2N2Z6NnY3ZTk5c3dramZhNjllcmhjaGNkeGgya3l4cWp6axIqaW5qMWN6dGw4aDU4bDh6Y3YyM2xtMHpyOGg4cnlzdTVoeGNmZ2Q1MHl1GkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMXAyaHY3Zno2djdlOTlzd2tqZmE2OWVyaGNoY2R4aDJreXhxanprEippbmoxY3p0bDhoNThsOHpjdjIzbG0wenI4aDhyeXN1NWh4Y2ZnZDUweXUaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFwMmh2N2Z6NnY3ZTk5c3dramZhNjllcmhjaGNkeGgya3l4cWp6axIqaW5qMWN6dGw4aDU4bDh6Y3YyM2xtMHpyOGg4cnlzdTVoeGNmZ2Q1MHl1GkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFwMmh2N2Z6NnY3ZTk5c3dramZhNjllcmhjaGNkeGgya3l4cWp6axIqaW5qMWN6dGw4aDU4bDh6Y3YyM2xtMHpyOGg4cnlzdTVoeGNmZ2Q1MHl1GkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajFwMmh2N2Z6NnY3ZTk5c3dramZhNjllcmhjaGNkeGgya3l4cWp6axIqaW5qMWN6dGw4aDU4bDh6Y3YyM2xtMHpyOGg4cnlzdTVoeGNmZ2Q1MHl1GkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJz+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohA3SZsAXlR9pzcFHog/kjOFSR1EiYHVqNOnWpNWiq7NcuEgQKAggBGNmNARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkA0yE1i3DE6GGITZpVWhESrrYNgKdPRPYKCAnz9QcAdEkwOLHJ9HgOz2Ok9NhjFN5akpyxZTKRGTFX11//hT3Wd",
+ "CugFCrgECjgvaW5qZWN0aXZlLmV4Y2hhbmdlLnYxYmV0YTEuTXNnUHJpdmlsZWdlZEV4ZWN1dGVDb250cmFjdBL7AwoqaW5qMWV6dGttMzZ5NmMzZTZ6bXI0aGc0Zzc3YTZ3eWoweGMwZDVneDV2EngxMDIwMDAwMDAwIGZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3VzZGMsIDExMDAgcGVnZ3kweDg3YUIzQjRDODY2MWUwN0Q2MzcyMzYxMjExQjk2ZWQ0RGMzNkIxQjUaKmluajE3cTdkczB5aDdoaHR1c2ZmN2d6OGE1a3gydXd4cnV0dGx4dXI5NiKmAnsiYXJncyI6eyJtc2ciOnsic3Vic2NyaWJlIjp7fX0sInRyYWRlcl9zdWJhY2NvdW50X2lkIjoiMHhjODk3NmRjNzQ0ZDYyMzlkMGI2M2FkZDE1NDdiZGRkMzg5Mjc5YjBmMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwidmF1bHRfc3ViYWNjb3VudF9pZCI6IjB4ZjAzY2Q4M2M5N2Y1ZWViZTQxMjlmMjA0N2VkMmM2NTcxYzYxZjE2YjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMyJ9LCJuYW1lIjoiVmF1bHRTdWJzY3JpYmUiLCJvcmlnaW4iOiJpbmoxZXp0a20zNnk2YzNlNnptcjRoZzRnNzdhNnd5ajB4YzBkNWd4NXYifRjp/cMH+j+kAQovL2luamVjdGl2ZS50eXBlcy52MWJldGExLkV4dGVuc2lvbk9wdGlvbnNXZWIzVHgScQgFEippbmoxN2drdWV0OGY2cHNzeGQ4bnljbTNxcjlkOXk2OTlydXB2NjM5N3oaQS7bNDH7L/B112pVzWT5OTygLht+2aFCIbvRfdlbaJqFAEXaPzWWgHCwBc4C3bCN22c8OHvjiS4ExPfg9EKkTKgAEn4KXgpUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohAp46ZxDpNDxsP5gvCZkCc84ZllP7P7q0tL57X7fN0WOcEgQKAgh/GGYSHAoWCgNpbmoSDzM2Mjg2MjUwMDAwMDAwMBDdpSwaQXHoIQ/X5yai6B0reASgAArSShjzpxprthDLEyr+zX7GR07Hr+r8UmZftLbafrcZfRX2UwFw8Q8pHaMINsSjckgb",
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajE5dXE4Z2Rta3hxZnJnaHRlazQ5d2E4azJmOGhobTN4ZTZ2OXZ4eBIqaW5qMXc5cnY1dTM1NWtlMDdjamY0d2cwd2EyY3ZhdG1keWNkaDZud2czGhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajE5dXE4Z2Rta3hxZnJnaHRlazQ5d2E4azJmOGhobTN4ZTZ2OXZ4eBIqaW5qMXc5cnY1dTM1NWtlMDdjamY0d2cwd2EyY3ZhdG1keWNkaDZud2czGj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMTl1cThnZG1reHFmcmdodGVrNDl3YThrMmY4aGhtM3hlNnY5dnh4EippbmoxdzlydjV1MzU1a2UwN2NqZjR3ZzB3YTJjdmF0bWR5Y2RoNm53ZzMaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajE5dXE4Z2Rta3hxZnJnaHRlazQ5d2E4azJmOGhobTN4ZTZ2OXZ4eBIqaW5qMXc5cnY1dTM1NWtlMDdjamY0d2cwd2EyY3ZhdG1keWNkaDZud2czGkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMTl1cThnZG1reHFmcmdodGVrNDl3YThrMmY4aGhtM3hlNnY5dnh4EippbmoxdzlydjV1MzU1a2UwN2NqZjR3ZzB3YTJjdmF0bWR5Y2RoNm53ZzMaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajE5dXE4Z2Rta3hxZnJnaHRlazQ5d2E4azJmOGhobTN4ZTZ2OXZ4eBIqaW5qMXc5cnY1dTM1NWtlMDdjamY0d2cwd2EyY3ZhdG1keWNkaDZud2czGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajE5dXE4Z2Rta3hxZnJnaHRlazQ5d2E4azJmOGhobTN4ZTZ2OXZ4eBIqaW5qMXc5cnY1dTM1NWtlMDdjamY0d2cwd2EyY3ZhdG1keWNkaDZud2czGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajE5dXE4Z2Rta3hxZnJnaHRlazQ5d2E4azJmOGhobTN4ZTZ2OXZ4eBIqaW5qMXc5cnY1dTM1NWtlMDdjamY0d2cwd2EyY3ZhdG1keWNkaDZud2czGkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJ3+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohA9YRhWDK9v8bR+HRAI7OzzTaeuCFfDffiIO9zTWhbk4cEgQKAggBGMmeARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkBAcshkCtJATtQYYHVorDRUSOGQ7gR1bLp17ZXO5S5aTmB+pRc+/uz8cY3zfP28wpZE4BFa40sSn+vsN7YDc0Ne",
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajFocXJzbWZsdjc2dDB3MGZxcm16d3p4dHhxdWUzNG12MzRtc3h2bRIqaW5qMXVsMjM1c2ZwZm55bWNnOGdodXQ5OHV3c251NjlsbnpuYTN6ZGpkGhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajFocXJzbWZsdjc2dDB3MGZxcm16d3p4dHhxdWUzNG12MzRtc3h2bRIqaW5qMXVsMjM1c2ZwZm55bWNnOGdodXQ5OHV3c251NjlsbnpuYTN6ZGpkGj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMWhxcnNtZmx2NzZ0MHcwZnFybXp3enh0eHF1ZTM0bXYzNG1zeHZtEippbmoxdWwyMzVzZnBmbnltY2c4Z2h1dDk4dXdzbnU2OWxuem5hM3pkamQaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajFocXJzbWZsdjc2dDB3MGZxcm16d3p4dHhxdWUzNG12MzRtc3h2bRIqaW5qMXVsMjM1c2ZwZm55bWNnOGdodXQ5OHV3c251NjlsbnpuYTN6ZGpkGkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMWhxcnNtZmx2NzZ0MHcwZnFybXp3enh0eHF1ZTM0bXYzNG1zeHZtEippbmoxdWwyMzVzZnBmbnltY2c4Z2h1dDk4dXdzbnU2OWxuem5hM3pkamQaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFocXJzbWZsdjc2dDB3MGZxcm16d3p4dHhxdWUzNG12MzRtc3h2bRIqaW5qMXVsMjM1c2ZwZm55bWNnOGdodXQ5OHV3c251NjlsbnpuYTN6ZGpkGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFocXJzbWZsdjc2dDB3MGZxcm16d3p4dHhxdWUzNG12MzRtc3h2bRIqaW5qMXVsMjM1c2ZwZm55bWNnOGdodXQ5OHV3c251NjlsbnpuYTN6ZGpkGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajFocXJzbWZsdjc2dDB3MGZxcm16d3p4dHhxdWUzNG12MzRtc3h2bRIqaW5qMXVsMjM1c2ZwZm55bWNnOGdodXQ5OHV3c251NjlsbnpuYTN6ZGpkGkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJ3+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohAimG00m9nDJwqtOiErp8o619mH/3VcEADzWzSqGpnGdIEgQKAggBGLuRARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkCnWeua6pt6p7Te8JuofcIaJWaZEhgiOuFqskm9sjQ9yi5qJkOEQXCmCRFCS5uYBpk0/1tuwYXJwtro9GdxHJMI",
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajFnMG04cTNrZHczMzNzeHEyOXc3bmMzNm1mZmN2aDgwZ3ZjZDM5ZBIqaW5qMW45d2ZoN2E2Y2cydWdneWdhZDlhZGxqODNhNHl3ZHp1dmhybXB2GhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajFnMG04cTNrZHczMzNzeHEyOXc3bmMzNm1mZmN2aDgwZ3ZjZDM5ZBIqaW5qMW45d2ZoN2E2Y2cydWdneWdhZDlhZGxqODNhNHl3ZHp1dmhybXB2Gj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMWcwbThxM2tkdzMzM3N4cTI5dzduYzM2bWZmY3ZoODBndmNkMzlkEippbmoxbjl3Zmg3YTZjZzJ1Z2d5Z2FkOWFkbGo4M2E0eXdkenV2aHJtcHYaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajFnMG04cTNrZHczMzNzeHEyOXc3bmMzNm1mZmN2aDgwZ3ZjZDM5ZBIqaW5qMW45d2ZoN2E2Y2cydWdneWdhZDlhZGxqODNhNHl3ZHp1dmhybXB2GkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMWcwbThxM2tkdzMzM3N4cTI5dzduYzM2bWZmY3ZoODBndmNkMzlkEippbmoxbjl3Zmg3YTZjZzJ1Z2d5Z2FkOWFkbGo4M2E0eXdkenV2aHJtcHYaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFnMG04cTNrZHczMzNzeHEyOXc3bmMzNm1mZmN2aDgwZ3ZjZDM5ZBIqaW5qMW45d2ZoN2E2Y2cydWdneWdhZDlhZGxqODNhNHl3ZHp1dmhybXB2GkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFnMG04cTNrZHczMzNzeHEyOXc3bmMzNm1mZmN2aDgwZ3ZjZDM5ZBIqaW5qMW45d2ZoN2E2Y2cydWdneWdhZDlhZGxqODNhNHl3ZHp1dmhybXB2GkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajFnMG04cTNrZHczMzNzeHEyOXc3bmMzNm1mZmN2aDgwZ3ZjZDM5ZBIqaW5qMW45d2ZoN2E2Y2cydWdneWdhZDlhZGxqODNhNHl3ZHp1dmhybXB2GkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJ3+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohAhKZIyozzEpDEuAl3ypUW3R3JoD7AtBIAujqq4wwPfVdEgQKAggBGOufARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkDMNT7feu38IDUKGBHpWaoydtomgYQZjGPXjj7pb8fEj0MshAm2XfDad53SLdLeKmsXMjQ5cXyYyH15EwUxDYSU",
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajFueHpoZTk0Z3NjOWpzeXVjM3dxa3Vuanl2czhwNGVtZTBndTRrZRIqaW5qMWxxa2dyZGxoeXFreTN3ZzZybW54ZGo1a3d0ZXI3NGUydWowbWZmGhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajFueHpoZTk0Z3NjOWpzeXVjM3dxa3Vuanl2czhwNGVtZTBndTRrZRIqaW5qMWxxa2dyZGxoeXFreTN3ZzZybW54ZGo1a3d0ZXI3NGUydWowbWZmGj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMW54emhlOTRnc2M5anN5dWMzd3FrdW5qeXZzOHA0ZW1lMGd1NGtlEippbmoxbHFrZ3JkbGh5cWt5M3dnNnJtbnhkajVrd3Rlcjc0ZTJ1ajBtZmYaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajFueHpoZTk0Z3NjOWpzeXVjM3dxa3Vuanl2czhwNGVtZTBndTRrZRIqaW5qMWxxa2dyZGxoeXFreTN3ZzZybW54ZGo1a3d0ZXI3NGUydWowbWZmGkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMW54emhlOTRnc2M5anN5dWMzd3FrdW5qeXZzOHA0ZW1lMGd1NGtlEippbmoxbHFrZ3JkbGh5cWt5M3dnNnJtbnhkajVrd3Rlcjc0ZTJ1ajBtZmYaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFueHpoZTk0Z3NjOWpzeXVjM3dxa3Vuanl2czhwNGVtZTBndTRrZRIqaW5qMWxxa2dyZGxoeXFreTN3ZzZybW54ZGo1a3d0ZXI3NGUydWowbWZmGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFueHpoZTk0Z3NjOWpzeXVjM3dxa3Vuanl2czhwNGVtZTBndTRrZRIqaW5qMWxxa2dyZGxoeXFreTN3ZzZybW54ZGo1a3d0ZXI3NGUydWowbWZmGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajFueHpoZTk0Z3NjOWpzeXVjM3dxa3Vuanl2czhwNGVtZTBndTRrZRIqaW5qMWxxa2dyZGxoeXFreTN3ZzZybW54ZGo1a3d0ZXI3NGUydWowbWZmGkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJ3+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohAxg89Ih7H74zbkYrMXXb55tjKWTQJQ3D2Sk00p5Y0/ZEEgQKAggBGIqVARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkCo/7pJIihg01V2zd+y3WH++KyVIB4m7WC9DAHPRzJIAghGLVJkAJjzGWTHrIGlh7CIira+E0UeSdy1Ag4GMBfS",
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajE5Y2hlY3h3enVmZjA5Zm02NmM1MDN4MnJtZmowa3l6emZoM2Z0ZhIqaW5qMWt0djIyYXp2dDVoOG5xejQ4d25ocXNqOTZ1bGU0eHgwZGF3N2pqGhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajE5Y2hlY3h3enVmZjA5Zm02NmM1MDN4MnJtZmowa3l6emZoM2Z0ZhIqaW5qMWt0djIyYXp2dDVoOG5xejQ4d25ocXNqOTZ1bGU0eHgwZGF3N2pqGj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMTljaGVjeHd6dWZmMDlmbTY2YzUwM3gycm1majBreXp6ZmgzZnRmEippbmoxa3R2MjJhenZ0NWg4bnF6NDh3bmhxc2o5NnVsZTR4eDBkYXc3amoaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajE5Y2hlY3h3enVmZjA5Zm02NmM1MDN4MnJtZmowa3l6emZoM2Z0ZhIqaW5qMWt0djIyYXp2dDVoOG5xejQ4d25ocXNqOTZ1bGU0eHgwZGF3N2pqGkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMTljaGVjeHd6dWZmMDlmbTY2YzUwM3gycm1majBreXp6ZmgzZnRmEippbmoxa3R2MjJhenZ0NWg4bnF6NDh3bmhxc2o5NnVsZTR4eDBkYXc3amoaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajE5Y2hlY3h3enVmZjA5Zm02NmM1MDN4MnJtZmowa3l6emZoM2Z0ZhIqaW5qMWt0djIyYXp2dDVoOG5xejQ4d25ocXNqOTZ1bGU0eHgwZGF3N2pqGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajE5Y2hlY3h3enVmZjA5Zm02NmM1MDN4MnJtZmowa3l6emZoM2Z0ZhIqaW5qMWt0djIyYXp2dDVoOG5xejQ4d25ocXNqOTZ1bGU0eHgwZGF3N2pqGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajE5Y2hlY3h3enVmZjA5Zm02NmM1MDN4MnJtZmowa3l6emZoM2Z0ZhIqaW5qMWt0djIyYXp2dDVoOG5xejQ4d25ocXNqOTZ1bGU0eHgwZGF3N2pqGkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJ3+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohAgVaAkMOV5+9OJP2xYw3tKy3aU3SiAIummY3gRAIGDj/EgQKAggBGOihARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkBSSP+Fx12//aSYEjjLjr5gl5X4jOUktkOREMTfArsWVxl4Xl7cyV3f7kYAF7kBbQQqrgMerHsc9KePhRVoXB0k",
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajFwMzBra2w2dXh5YWhtOGhmMGVkOGY0MDJmNjdhMmo5eHJjNDJ5ZhIqaW5qMXo1ZzRwYXA3YThoaHhhYXkycG5md2czYXduNWRxcDVyNHN2OGthGhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajFwMzBra2w2dXh5YWhtOGhmMGVkOGY0MDJmNjdhMmo5eHJjNDJ5ZhIqaW5qMXo1ZzRwYXA3YThoaHhhYXkycG5md2czYXduNWRxcDVyNHN2OGthGj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMXAzMGtrbDZ1eHlhaG04aGYwZWQ4ZjQwMmY2N2Eyajl4cmM0MnlmEippbmoxejVnNHBhcDdhOGhoeGFheTJwbmZ3ZzNhd241ZHFwNXI0c3Y4a2EaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajFwMzBra2w2dXh5YWhtOGhmMGVkOGY0MDJmNjdhMmo5eHJjNDJ5ZhIqaW5qMXo1ZzRwYXA3YThoaHhhYXkycG5md2czYXduNWRxcDVyNHN2OGthGkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMXAzMGtrbDZ1eHlhaG04aGYwZWQ4ZjQwMmY2N2Eyajl4cmM0MnlmEippbmoxejVnNHBhcDdhOGhoeGFheTJwbmZ3ZzNhd241ZHFwNXI0c3Y4a2EaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFwMzBra2w2dXh5YWhtOGhmMGVkOGY0MDJmNjdhMmo5eHJjNDJ5ZhIqaW5qMXo1ZzRwYXA3YThoaHhhYXkycG5md2czYXduNWRxcDVyNHN2OGthGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFwMzBra2w2dXh5YWhtOGhmMGVkOGY0MDJmNjdhMmo5eHJjNDJ5ZhIqaW5qMXo1ZzRwYXA3YThoaHhhYXkycG5md2czYXduNWRxcDVyNHN2OGthGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajFwMzBra2w2dXh5YWhtOGhmMGVkOGY0MDJmNjdhMmo5eHJjNDJ5ZhIqaW5qMXo1ZzRwYXA3YThoaHhhYXkycG5md2czYXduNWRxcDVyNHN2OGthGkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJ3+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohAl0obf7huaZwDxwoKhqdWfwakrBU8rFlrc/Ihiquc4P5EgQKAggBGIOAARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkCGyhKBN8mu+4qID3ZzBPskvusEorT6TXytayPg3k6UpGMaLx38dXS9wmX2yrLrn4G67rihS/fKVCG2yMhdwk4y",
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajE0dDVmOTRtNWZnNHY2ZHJzNHFxa2QzZDczM3k2c3MwbGp5eXFsbRIqaW5qMWhtOXVobWhrZHRyeXd6MG1xazh2YTQwMmUzdWQweXBqbHFmcjNqGhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajE0dDVmOTRtNWZnNHY2ZHJzNHFxa2QzZDczM3k2c3MwbGp5eXFsbRIqaW5qMWhtOXVobWhrZHRyeXd6MG1xazh2YTQwMmUzdWQweXBqbHFmcjNqGj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMTR0NWY5NG01Zmc0djZkcnM0cXFrZDNkNzMzeTZzczBsanl5cWxtEippbmoxaG05dWhtaGtkdHJ5d3owbXFrOHZhNDAyZTN1ZDB5cGpscWZyM2oaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajE0dDVmOTRtNWZnNHY2ZHJzNHFxa2QzZDczM3k2c3MwbGp5eXFsbRIqaW5qMWhtOXVobWhrZHRyeXd6MG1xazh2YTQwMmUzdWQweXBqbHFmcjNqGkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMTR0NWY5NG01Zmc0djZkcnM0cXFrZDNkNzMzeTZzczBsanl5cWxtEippbmoxaG05dWhtaGtkdHJ5d3owbXFrOHZhNDAyZTN1ZDB5cGpscWZyM2oaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajE0dDVmOTRtNWZnNHY2ZHJzNHFxa2QzZDczM3k2c3MwbGp5eXFsbRIqaW5qMWhtOXVobWhrZHRyeXd6MG1xazh2YTQwMmUzdWQweXBqbHFmcjNqGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajE0dDVmOTRtNWZnNHY2ZHJzNHFxa2QzZDczM3k2c3MwbGp5eXFsbRIqaW5qMWhtOXVobWhrZHRyeXd6MG1xazh2YTQwMmUzdWQweXBqbHFmcjNqGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajE0dDVmOTRtNWZnNHY2ZHJzNHFxa2QzZDczM3k2c3MwbGp5eXFsbRIqaW5qMWhtOXVobWhrZHRyeXd6MG1xazh2YTQwMmUzdWQweXBqbHFmcjNqGkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJ3+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohA4fTy5A+DmuZfsXgjM48ntVqTXlOBW287TjXr91D0VGREgQKAggBGLuVARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkBdYIUr7S8ky4p9g+WWi2Ef8Cnq9W5eRsQ6Q6YNcnr0rhzy6lgo31o9tJg6XB0ZHtaJb00qBdU8/igNmfhEZXqk",
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajFhNHc5OXo0cWdxY2Q2bDZ1NGRqZnlsY3VjdDUzZHVxa3VxbnI1ZBIqaW5qMTUyNmszNmNrM2xodm1yZzhzeXlhODd0eTY5dXBsOHl6enJrNWZxGhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajFhNHc5OXo0cWdxY2Q2bDZ1NGRqZnlsY3VjdDUzZHVxa3VxbnI1ZBIqaW5qMTUyNmszNmNrM2xodm1yZzhzeXlhODd0eTY5dXBsOHl6enJrNWZxGj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMWE0dzk5ejRxZ3FjZDZsNnU0ZGpmeWxjdWN0NTNkdXFrdXFucjVkEippbmoxNTI2azM2Y2szbGh2bXJnOHN5eWE4N3R5Njl1cGw4eXp6cms1ZnEaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajFhNHc5OXo0cWdxY2Q2bDZ1NGRqZnlsY3VjdDUzZHVxa3VxbnI1ZBIqaW5qMTUyNmszNmNrM2xodm1yZzhzeXlhODd0eTY5dXBsOHl6enJrNWZxGkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMWE0dzk5ejRxZ3FjZDZsNnU0ZGpmeWxjdWN0NTNkdXFrdXFucjVkEippbmoxNTI2azM2Y2szbGh2bXJnOHN5eWE4N3R5Njl1cGw4eXp6cms1ZnEaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFhNHc5OXo0cWdxY2Q2bDZ1NGRqZnlsY3VjdDUzZHVxa3VxbnI1ZBIqaW5qMTUyNmszNmNrM2xodm1yZzhzeXlhODd0eTY5dXBsOHl6enJrNWZxGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFhNHc5OXo0cWdxY2Q2bDZ1NGRqZnlsY3VjdDUzZHVxa3VxbnI1ZBIqaW5qMTUyNmszNmNrM2xodm1yZzhzeXlhODd0eTY5dXBsOHl6enJrNWZxGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajFhNHc5OXo0cWdxY2Q2bDZ1NGRqZnlsY3VjdDUzZHVxa3VxbnI1ZBIqaW5qMTUyNmszNmNrM2xodm1yZzhzeXlhODd0eTY5dXBsOHl6enJrNWZxGkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJ3+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohArGVpE2Qtw7Pq625UTe8FZfqFAGc7IaBTZYPusGkLfnlEgQKAggBGMmAARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkDk8e2Du8ReB4Jz73ZkpdaWHIBSo5x0XtILIMecnJzbQ3TykogSC6OQ+tWOCFQp9mUhff++iCbVpFwAx08k+zYS",
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajFnZHZ0ZGtsdjNxZzQzM3Z1bjlqYXBhZGFucjk2MHgwdTI0cWtxbBIqaW5qMWFlYTRtOGZhcnc5ZHI5Y204N2FnN2QwejZtY2ZwMm54bnYyOGE3GhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajFnZHZ0ZGtsdjNxZzQzM3Z1bjlqYXBhZGFucjk2MHgwdTI0cWtxbBIqaW5qMWFlYTRtOGZhcnc5ZHI5Y204N2FnN2QwejZtY2ZwMm54bnYyOGE3Gj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMWdkdnRka2x2M3FnNDMzdnVuOWphcGFkYW5yOTYweDB1MjRxa3FsEippbmoxYWVhNG04ZmFydzlkcjljbTg3YWc3ZDB6Nm1jZnAybnhudjI4YTcaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajFnZHZ0ZGtsdjNxZzQzM3Z1bjlqYXBhZGFucjk2MHgwdTI0cWtxbBIqaW5qMWFlYTRtOGZhcnc5ZHI5Y204N2FnN2QwejZtY2ZwMm54bnYyOGE3GkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMWdkdnRka2x2M3FnNDMzdnVuOWphcGFkYW5yOTYweDB1MjRxa3FsEippbmoxYWVhNG04ZmFydzlkcjljbTg3YWc3ZDB6Nm1jZnAybnhudjI4YTcaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFnZHZ0ZGtsdjNxZzQzM3Z1bjlqYXBhZGFucjk2MHgwdTI0cWtxbBIqaW5qMWFlYTRtOGZhcnc5ZHI5Y204N2FnN2QwejZtY2ZwMm54bnYyOGE3GkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFnZHZ0ZGtsdjNxZzQzM3Z1bjlqYXBhZGFucjk2MHgwdTI0cWtxbBIqaW5qMWFlYTRtOGZhcnc5ZHI5Y204N2FnN2QwejZtY2ZwMm54bnYyOGE3GkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajFnZHZ0ZGtsdjNxZzQzM3Z1bjlqYXBhZGFucjk2MHgwdTI0cWtxbBIqaW5qMWFlYTRtOGZhcnc5ZHI5Y204N2FnN2QwejZtY2ZwMm54bnYyOGE3GkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJ3+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohAz+Zjrtxo20HOm1w4l5I57H9MAmt+87msPR5/1R/D1McEgQKAggBGMSqARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkDhGCp0+Crr0dfoCZrTb5otuTMtIxxTj9tWfxrfN7cnBTEgKFXVDlsXbay4Wlxz4QBVX4Fb6gtUgQbtDrazOEj9",
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajFobm1kbGVhdHR1N3RldHU2ZWt3dzlybTBjbTAzZXpnNWpsdHJxehIqaW5qMW02M3U1eWtzYWdzc2o3d2N4Zmw1czd0NHU4N2s3MGpmeW5uazJqGhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajFobm1kbGVhdHR1N3RldHU2ZWt3dzlybTBjbTAzZXpnNWpsdHJxehIqaW5qMW02M3U1eWtzYWdzc2o3d2N4Zmw1czd0NHU4N2s3MGpmeW5uazJqGj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMWhubWRsZWF0dHU3dGV0dTZla3d3OXJtMGNtMDNlemc1amx0cnF6EippbmoxbTYzdTV5a3NhZ3Nzajd3Y3hmbDVzN3Q0dTg3azcwamZ5bm5rMmoaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajFobm1kbGVhdHR1N3RldHU2ZWt3dzlybTBjbTAzZXpnNWpsdHJxehIqaW5qMW02M3U1eWtzYWdzc2o3d2N4Zmw1czd0NHU4N2s3MGpmeW5uazJqGkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMWhubWRsZWF0dHU3dGV0dTZla3d3OXJtMGNtMDNlemc1amx0cnF6EippbmoxbTYzdTV5a3NhZ3Nzajd3Y3hmbDVzN3Q0dTg3azcwamZ5bm5rMmoaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFobm1kbGVhdHR1N3RldHU2ZWt3dzlybTBjbTAzZXpnNWpsdHJxehIqaW5qMW02M3U1eWtzYWdzc2o3d2N4Zmw1czd0NHU4N2s3MGpmeW5uazJqGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFobm1kbGVhdHR1N3RldHU2ZWt3dzlybTBjbTAzZXpnNWpsdHJxehIqaW5qMW02M3U1eWtzYWdzc2o3d2N4Zmw1czd0NHU4N2s3MGpmeW5uazJqGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajFobm1kbGVhdHR1N3RldHU2ZWt3dzlybTBjbTAzZXpnNWpsdHJxehIqaW5qMW02M3U1eWtzYWdzc2o3d2N4Zmw1czd0NHU4N2s3MGpmeW5uazJqGkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJ3+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohA+OlGuxc2hUmrU+iVLb2MDnHy6W4exQyJrbMie9/Sv27EgQKAggBGJqQARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkBTfe9A/RDSoHQCDunT60QgdtBrz3eIGvIgLEISRMAh/2w3+A9UB5SoDNGZNUfpNsxZyyq2Emi6pXuVpFzUCjI5"
+ ]
+ },
+ "evidence":{
+ "evidence":[
+
+ ]
+ },
+ "lastCommit":{
+ "height":"15793859",
+ "blockId":{
+ "hash":"RRhRSiIf1E08mJAtACM4J1RFSVJ96eR0PBVuoD7rb2c=",
+ "partSetHeader":{
+ "total":1,
+ "hash":"SeO5JkVtLUrhegd0rwDatDbvS5PQf/0Yvn+BmL1MOko="
+ }
+ },
+ "signatures":[
+ {
+ "blockIdFlag":"BLOCK_ID_FLAG_COMMIT",
+ "validatorAddress":"y8ctJ4QpJ0S7ZTVY7RTE4z1hS2c=",
+ "timestamp":"2023-09-07T03:59:36.496584825Z",
+ "signature":"AxnPc5AEa6jizZuKhXUAkNi4vic6miF9emyAx+uSMco7oKVwoXGDJ6L0wneNGYOqpKkMVMQm4hcnWgDBjiBLAA=="
+ },
+ {
+ "blockIdFlag":"BLOCK_ID_FLAG_COMMIT",
+ "validatorAddress":"M5HjW2EATgO+uI+h2rRES5E7174=",
+ "timestamp":"2023-09-07T03:59:36.293269404Z",
+ "signature":"mjODCd7P7xHo6Gn+6Qi6/u+FI72noRs9/vcbvpiqz7Hr5hRNhk2a2Jj2tw59GC6cURd2Q6c/CdZhXHgVqzMdAg=="
+ },
+ {
+ "blockIdFlag":"BLOCK_ID_FLAG_COMMIT",
+ "validatorAddress":"Nv8cuLE25L4mgnBx8shCmG68xfc=",
+ "timestamp":"2023-09-07T03:59:36.393462082Z",
+ "signature":"NyTk5W6WLxEbouVJ7LxSwV88FnH/CtmXkr6JczPqEehdrymqrGqT02OJLutGVsBmrPEkMhwa2BegkqvmPLJrBQ=="
+ },
+ {
+ "blockIdFlag":"BLOCK_ID_FLAG_COMMIT",
+ "validatorAddress":"ObUXYdS8jfTSNPonUBFPJkft7eA=",
+ "timestamp":"2023-09-07T03:59:36.296674286Z",
+ "signature":"OAwmf7pEjsXbwIWMD5HbzWiae6OAn0ME49FbXaRLvKIYKWSDKv9f0gprsgRJznOdj60SontlntwmvV+23MV6DQ=="
+ }
+ ],
+ "round":0
+ }
+ },
+ "sdkBlock":{
+ "header":{
+ "version":{
+ "block":"11",
+ "app":"0"
+ },
+ "chainId":"injective-888",
+ "height":"15793860",
+ "time":"2023-09-07T03:59:36.393462082Z",
+ "lastBlockId":{
+ "hash":"RRhRSiIf1E08mJAtACM4J1RFSVJ96eR0PBVuoD7rb2c=",
+ "partSetHeader":{
+ "total":1,
+ "hash":"SeO5JkVtLUrhegd0rwDatDbvS5PQf/0Yvn+BmL1MOko="
+ }
+ },
+ "lastCommitHash":"rNxjhSihfCPkPMak9qPlmUYeXRc0weFu1nmmKMUPLAQ=",
+ "dataHash":"1RjS2VAhrWt2lLnVLozfeI7oAi7PoDILROzeheXN5H0=",
+ "validatorsHash":"6lDaVNHY4DtceWtHsVS7SdR8XuPSATqQ7qNKWIxcnhg=",
+ "nextValidatorsHash":"6lDaVNHY4DtceWtHsVS7SdR8XuPSATqQ7qNKWIxcnhg=",
+ "consensusHash":"ItjUyLlUnqkCxmoaGPck+PeXC45MXx6zsLXxtOHeBTE=",
+ "appHash":"Sv2MdUKQxwE/glEI8c8RFQKmc4HSyKO7j3sAqySultQ=",
+ "lastResultsHash":"Le4RmI//Wh43Mq6ro+VMWn7ZbVZRw3HXUAQILODtag8=",
+ "evidenceHash":"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
+ "proposerAddress":"injvalcons18x63wcw5hjxlf535lgn4qy20yer7mm0qedu0la"
+ },
+ "data":{
+ "txs":[
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajF3bGY1NzdtbHd0eW01N3Njem1semtsN2tjdDAycXNsZHN4Z2p2NxIqaW5qMXIyNDh5c3IyeTQwcW0yazgzMHZhbnF4bm02dmNtbGhxcnVtczJlGhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajF3bGY1NzdtbHd0eW01N3Njem1semtsN2tjdDAycXNsZHN4Z2p2NxIqaW5qMXIyNDh5c3IyeTQwcW0yazgzMHZhbnF4bm02dmNtbGhxcnVtczJlGj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMXdsZjU3N21sd3R5bTU3c2N6bWx6a2w3a2N0MDJxc2xkc3hnanY3EippbmoxcjI0OHlzcjJ5NDBxbTJrODMwdmFucXhubTZ2Y21saHFydW1zMmUaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajF3bGY1NzdtbHd0eW01N3Njem1semtsN2tjdDAycXNsZHN4Z2p2NxIqaW5qMXIyNDh5c3IyeTQwcW0yazgzMHZhbnF4bm02dmNtbGhxcnVtczJlGkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMXdsZjU3N21sd3R5bTU3c2N6bWx6a2w3a2N0MDJxc2xkc3hnanY3EippbmoxcjI0OHlzcjJ5NDBxbTJrODMwdmFucXhubTZ2Y21saHFydW1zMmUaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajF3bGY1NzdtbHd0eW01N3Njem1semtsN2tjdDAycXNsZHN4Z2p2NxIqaW5qMXIyNDh5c3IyeTQwcW0yazgzMHZhbnF4bm02dmNtbGhxcnVtczJlGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajF3bGY1NzdtbHd0eW01N3Njem1semtsN2tjdDAycXNsZHN4Z2p2NxIqaW5qMXIyNDh5c3IyeTQwcW0yazgzMHZhbnF4bm02dmNtbGhxcnVtczJlGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajF3bGY1NzdtbHd0eW01N3Njem1semtsN2tjdDAycXNsZHN4Z2p2NxIqaW5qMXIyNDh5c3IyeTQwcW0yazgzMHZhbnF4bm02dmNtbGhxcnVtczJlGkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJz+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohAjr+rkaXrlMyQvUjnSB+viWNMY4CU7VHptUN/MxDVEOVEgQKAggBGLymARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkCHh6hdDRsHw1dfkRZkwLOmP7uNT6RSwNJPIBf8dg1bsnLtzAhpBlAd1nF1V7oWvAvoZ/gVoiNVdzjCWYYcUB/s",
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajFwMmh2N2Z6NnY3ZTk5c3dramZhNjllcmhjaGNkeGgya3l4cWp6axIqaW5qMWN6dGw4aDU4bDh6Y3YyM2xtMHpyOGg4cnlzdTVoeGNmZ2Q1MHl1GhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajFwMmh2N2Z6NnY3ZTk5c3dramZhNjllcmhjaGNkeGgya3l4cWp6axIqaW5qMWN6dGw4aDU4bDh6Y3YyM2xtMHpyOGg4cnlzdTVoeGNmZ2Q1MHl1Gj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMXAyaHY3Zno2djdlOTlzd2tqZmE2OWVyaGNoY2R4aDJreXhxanprEippbmoxY3p0bDhoNThsOHpjdjIzbG0wenI4aDhyeXN1NWh4Y2ZnZDUweXUaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajFwMmh2N2Z6NnY3ZTk5c3dramZhNjllcmhjaGNkeGgya3l4cWp6axIqaW5qMWN6dGw4aDU4bDh6Y3YyM2xtMHpyOGg4cnlzdTVoeGNmZ2Q1MHl1GkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMXAyaHY3Zno2djdlOTlzd2tqZmE2OWVyaGNoY2R4aDJreXhxanprEippbmoxY3p0bDhoNThsOHpjdjIzbG0wenI4aDhyeXN1NWh4Y2ZnZDUweXUaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFwMmh2N2Z6NnY3ZTk5c3dramZhNjllcmhjaGNkeGgya3l4cWp6axIqaW5qMWN6dGw4aDU4bDh6Y3YyM2xtMHpyOGg4cnlzdTVoeGNmZ2Q1MHl1GkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFwMmh2N2Z6NnY3ZTk5c3dramZhNjllcmhjaGNkeGgya3l4cWp6axIqaW5qMWN6dGw4aDU4bDh6Y3YyM2xtMHpyOGg4cnlzdTVoeGNmZ2Q1MHl1GkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajFwMmh2N2Z6NnY3ZTk5c3dramZhNjllcmhjaGNkeGgya3l4cWp6axIqaW5qMWN6dGw4aDU4bDh6Y3YyM2xtMHpyOGg4cnlzdTVoeGNmZ2Q1MHl1GkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJz+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohA3SZsAXlR9pzcFHog/kjOFSR1EiYHVqNOnWpNWiq7NcuEgQKAggBGNmNARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkA0yE1i3DE6GGITZpVWhESrrYNgKdPRPYKCAnz9QcAdEkwOLHJ9HgOz2Ok9NhjFN5akpyxZTKRGTFX11//hT3Wd",
+ "CugFCrgECjgvaW5qZWN0aXZlLmV4Y2hhbmdlLnYxYmV0YTEuTXNnUHJpdmlsZWdlZEV4ZWN1dGVDb250cmFjdBL7AwoqaW5qMWV6dGttMzZ5NmMzZTZ6bXI0aGc0Zzc3YTZ3eWoweGMwZDVneDV2EngxMDIwMDAwMDAwIGZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3VzZGMsIDExMDAgcGVnZ3kweDg3YUIzQjRDODY2MWUwN0Q2MzcyMzYxMjExQjk2ZWQ0RGMzNkIxQjUaKmluajE3cTdkczB5aDdoaHR1c2ZmN2d6OGE1a3gydXd4cnV0dGx4dXI5NiKmAnsiYXJncyI6eyJtc2ciOnsic3Vic2NyaWJlIjp7fX0sInRyYWRlcl9zdWJhY2NvdW50X2lkIjoiMHhjODk3NmRjNzQ0ZDYyMzlkMGI2M2FkZDE1NDdiZGRkMzg5Mjc5YjBmMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwidmF1bHRfc3ViYWNjb3VudF9pZCI6IjB4ZjAzY2Q4M2M5N2Y1ZWViZTQxMjlmMjA0N2VkMmM2NTcxYzYxZjE2YjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMyJ9LCJuYW1lIjoiVmF1bHRTdWJzY3JpYmUiLCJvcmlnaW4iOiJpbmoxZXp0a20zNnk2YzNlNnptcjRoZzRnNzdhNnd5ajB4YzBkNWd4NXYifRjp/cMH+j+kAQovL2luamVjdGl2ZS50eXBlcy52MWJldGExLkV4dGVuc2lvbk9wdGlvbnNXZWIzVHgScQgFEippbmoxN2drdWV0OGY2cHNzeGQ4bnljbTNxcjlkOXk2OTlydXB2NjM5N3oaQS7bNDH7L/B112pVzWT5OTygLht+2aFCIbvRfdlbaJqFAEXaPzWWgHCwBc4C3bCN22c8OHvjiS4ExPfg9EKkTKgAEn4KXgpUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohAp46ZxDpNDxsP5gvCZkCc84ZllP7P7q0tL57X7fN0WOcEgQKAgh/GGYSHAoWCgNpbmoSDzM2Mjg2MjUwMDAwMDAwMBDdpSwaQXHoIQ/X5yai6B0reASgAArSShjzpxprthDLEyr+zX7GR07Hr+r8UmZftLbafrcZfRX2UwFw8Q8pHaMINsSjckgb",
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajE5dXE4Z2Rta3hxZnJnaHRlazQ5d2E4azJmOGhobTN4ZTZ2OXZ4eBIqaW5qMXc5cnY1dTM1NWtlMDdjamY0d2cwd2EyY3ZhdG1keWNkaDZud2czGhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajE5dXE4Z2Rta3hxZnJnaHRlazQ5d2E4azJmOGhobTN4ZTZ2OXZ4eBIqaW5qMXc5cnY1dTM1NWtlMDdjamY0d2cwd2EyY3ZhdG1keWNkaDZud2czGj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMTl1cThnZG1reHFmcmdodGVrNDl3YThrMmY4aGhtM3hlNnY5dnh4EippbmoxdzlydjV1MzU1a2UwN2NqZjR3ZzB3YTJjdmF0bWR5Y2RoNm53ZzMaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajE5dXE4Z2Rta3hxZnJnaHRlazQ5d2E4azJmOGhobTN4ZTZ2OXZ4eBIqaW5qMXc5cnY1dTM1NWtlMDdjamY0d2cwd2EyY3ZhdG1keWNkaDZud2czGkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMTl1cThnZG1reHFmcmdodGVrNDl3YThrMmY4aGhtM3hlNnY5dnh4EippbmoxdzlydjV1MzU1a2UwN2NqZjR3ZzB3YTJjdmF0bWR5Y2RoNm53ZzMaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajE5dXE4Z2Rta3hxZnJnaHRlazQ5d2E4azJmOGhobTN4ZTZ2OXZ4eBIqaW5qMXc5cnY1dTM1NWtlMDdjamY0d2cwd2EyY3ZhdG1keWNkaDZud2czGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajE5dXE4Z2Rta3hxZnJnaHRlazQ5d2E4azJmOGhobTN4ZTZ2OXZ4eBIqaW5qMXc5cnY1dTM1NWtlMDdjamY0d2cwd2EyY3ZhdG1keWNkaDZud2czGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajE5dXE4Z2Rta3hxZnJnaHRlazQ5d2E4azJmOGhobTN4ZTZ2OXZ4eBIqaW5qMXc5cnY1dTM1NWtlMDdjamY0d2cwd2EyY3ZhdG1keWNkaDZud2czGkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJ3+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohA9YRhWDK9v8bR+HRAI7OzzTaeuCFfDffiIO9zTWhbk4cEgQKAggBGMmeARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkBAcshkCtJATtQYYHVorDRUSOGQ7gR1bLp17ZXO5S5aTmB+pRc+/uz8cY3zfP28wpZE4BFa40sSn+vsN7YDc0Ne",
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajFocXJzbWZsdjc2dDB3MGZxcm16d3p4dHhxdWUzNG12MzRtc3h2bRIqaW5qMXVsMjM1c2ZwZm55bWNnOGdodXQ5OHV3c251NjlsbnpuYTN6ZGpkGhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajFocXJzbWZsdjc2dDB3MGZxcm16d3p4dHhxdWUzNG12MzRtc3h2bRIqaW5qMXVsMjM1c2ZwZm55bWNnOGdodXQ5OHV3c251NjlsbnpuYTN6ZGpkGj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMWhxcnNtZmx2NzZ0MHcwZnFybXp3enh0eHF1ZTM0bXYzNG1zeHZtEippbmoxdWwyMzVzZnBmbnltY2c4Z2h1dDk4dXdzbnU2OWxuem5hM3pkamQaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajFocXJzbWZsdjc2dDB3MGZxcm16d3p4dHhxdWUzNG12MzRtc3h2bRIqaW5qMXVsMjM1c2ZwZm55bWNnOGdodXQ5OHV3c251NjlsbnpuYTN6ZGpkGkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMWhxcnNtZmx2NzZ0MHcwZnFybXp3enh0eHF1ZTM0bXYzNG1zeHZtEippbmoxdWwyMzVzZnBmbnltY2c4Z2h1dDk4dXdzbnU2OWxuem5hM3pkamQaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFocXJzbWZsdjc2dDB3MGZxcm16d3p4dHhxdWUzNG12MzRtc3h2bRIqaW5qMXVsMjM1c2ZwZm55bWNnOGdodXQ5OHV3c251NjlsbnpuYTN6ZGpkGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFocXJzbWZsdjc2dDB3MGZxcm16d3p4dHhxdWUzNG12MzRtc3h2bRIqaW5qMXVsMjM1c2ZwZm55bWNnOGdodXQ5OHV3c251NjlsbnpuYTN6ZGpkGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajFocXJzbWZsdjc2dDB3MGZxcm16d3p4dHhxdWUzNG12MzRtc3h2bRIqaW5qMXVsMjM1c2ZwZm55bWNnOGdodXQ5OHV3c251NjlsbnpuYTN6ZGpkGkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJ3+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohAimG00m9nDJwqtOiErp8o619mH/3VcEADzWzSqGpnGdIEgQKAggBGLuRARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkCnWeua6pt6p7Te8JuofcIaJWaZEhgiOuFqskm9sjQ9yi5qJkOEQXCmCRFCS5uYBpk0/1tuwYXJwtro9GdxHJMI",
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajFnMG04cTNrZHczMzNzeHEyOXc3bmMzNm1mZmN2aDgwZ3ZjZDM5ZBIqaW5qMW45d2ZoN2E2Y2cydWdneWdhZDlhZGxqODNhNHl3ZHp1dmhybXB2GhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajFnMG04cTNrZHczMzNzeHEyOXc3bmMzNm1mZmN2aDgwZ3ZjZDM5ZBIqaW5qMW45d2ZoN2E2Y2cydWdneWdhZDlhZGxqODNhNHl3ZHp1dmhybXB2Gj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMWcwbThxM2tkdzMzM3N4cTI5dzduYzM2bWZmY3ZoODBndmNkMzlkEippbmoxbjl3Zmg3YTZjZzJ1Z2d5Z2FkOWFkbGo4M2E0eXdkenV2aHJtcHYaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajFnMG04cTNrZHczMzNzeHEyOXc3bmMzNm1mZmN2aDgwZ3ZjZDM5ZBIqaW5qMW45d2ZoN2E2Y2cydWdneWdhZDlhZGxqODNhNHl3ZHp1dmhybXB2GkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMWcwbThxM2tkdzMzM3N4cTI5dzduYzM2bWZmY3ZoODBndmNkMzlkEippbmoxbjl3Zmg3YTZjZzJ1Z2d5Z2FkOWFkbGo4M2E0eXdkenV2aHJtcHYaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFnMG04cTNrZHczMzNzeHEyOXc3bmMzNm1mZmN2aDgwZ3ZjZDM5ZBIqaW5qMW45d2ZoN2E2Y2cydWdneWdhZDlhZGxqODNhNHl3ZHp1dmhybXB2GkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFnMG04cTNrZHczMzNzeHEyOXc3bmMzNm1mZmN2aDgwZ3ZjZDM5ZBIqaW5qMW45d2ZoN2E2Y2cydWdneWdhZDlhZGxqODNhNHl3ZHp1dmhybXB2GkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajFnMG04cTNrZHczMzNzeHEyOXc3bmMzNm1mZmN2aDgwZ3ZjZDM5ZBIqaW5qMW45d2ZoN2E2Y2cydWdneWdhZDlhZGxqODNhNHl3ZHp1dmhybXB2GkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJ3+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohAhKZIyozzEpDEuAl3ypUW3R3JoD7AtBIAujqq4wwPfVdEgQKAggBGOufARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkDMNT7feu38IDUKGBHpWaoydtomgYQZjGPXjj7pb8fEj0MshAm2XfDad53SLdLeKmsXMjQ5cXyYyH15EwUxDYSU",
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajFueHpoZTk0Z3NjOWpzeXVjM3dxa3Vuanl2czhwNGVtZTBndTRrZRIqaW5qMWxxa2dyZGxoeXFreTN3ZzZybW54ZGo1a3d0ZXI3NGUydWowbWZmGhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajFueHpoZTk0Z3NjOWpzeXVjM3dxa3Vuanl2czhwNGVtZTBndTRrZRIqaW5qMWxxa2dyZGxoeXFreTN3ZzZybW54ZGo1a3d0ZXI3NGUydWowbWZmGj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMW54emhlOTRnc2M5anN5dWMzd3FrdW5qeXZzOHA0ZW1lMGd1NGtlEippbmoxbHFrZ3JkbGh5cWt5M3dnNnJtbnhkajVrd3Rlcjc0ZTJ1ajBtZmYaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajFueHpoZTk0Z3NjOWpzeXVjM3dxa3Vuanl2czhwNGVtZTBndTRrZRIqaW5qMWxxa2dyZGxoeXFreTN3ZzZybW54ZGo1a3d0ZXI3NGUydWowbWZmGkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMW54emhlOTRnc2M5anN5dWMzd3FrdW5qeXZzOHA0ZW1lMGd1NGtlEippbmoxbHFrZ3JkbGh5cWt5M3dnNnJtbnhkajVrd3Rlcjc0ZTJ1ajBtZmYaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFueHpoZTk0Z3NjOWpzeXVjM3dxa3Vuanl2czhwNGVtZTBndTRrZRIqaW5qMWxxa2dyZGxoeXFreTN3ZzZybW54ZGo1a3d0ZXI3NGUydWowbWZmGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFueHpoZTk0Z3NjOWpzeXVjM3dxa3Vuanl2czhwNGVtZTBndTRrZRIqaW5qMWxxa2dyZGxoeXFreTN3ZzZybW54ZGo1a3d0ZXI3NGUydWowbWZmGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajFueHpoZTk0Z3NjOWpzeXVjM3dxa3Vuanl2czhwNGVtZTBndTRrZRIqaW5qMWxxa2dyZGxoeXFreTN3ZzZybW54ZGo1a3d0ZXI3NGUydWowbWZmGkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJ3+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohAxg89Ih7H74zbkYrMXXb55tjKWTQJQ3D2Sk00p5Y0/ZEEgQKAggBGIqVARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkCo/7pJIihg01V2zd+y3WH++KyVIB4m7WC9DAHPRzJIAghGLVJkAJjzGWTHrIGlh7CIira+E0UeSdy1Ag4GMBfS",
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajE5Y2hlY3h3enVmZjA5Zm02NmM1MDN4MnJtZmowa3l6emZoM2Z0ZhIqaW5qMWt0djIyYXp2dDVoOG5xejQ4d25ocXNqOTZ1bGU0eHgwZGF3N2pqGhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajE5Y2hlY3h3enVmZjA5Zm02NmM1MDN4MnJtZmowa3l6emZoM2Z0ZhIqaW5qMWt0djIyYXp2dDVoOG5xejQ4d25ocXNqOTZ1bGU0eHgwZGF3N2pqGj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMTljaGVjeHd6dWZmMDlmbTY2YzUwM3gycm1majBreXp6ZmgzZnRmEippbmoxa3R2MjJhenZ0NWg4bnF6NDh3bmhxc2o5NnVsZTR4eDBkYXc3amoaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajE5Y2hlY3h3enVmZjA5Zm02NmM1MDN4MnJtZmowa3l6emZoM2Z0ZhIqaW5qMWt0djIyYXp2dDVoOG5xejQ4d25ocXNqOTZ1bGU0eHgwZGF3N2pqGkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMTljaGVjeHd6dWZmMDlmbTY2YzUwM3gycm1majBreXp6ZmgzZnRmEippbmoxa3R2MjJhenZ0NWg4bnF6NDh3bmhxc2o5NnVsZTR4eDBkYXc3amoaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajE5Y2hlY3h3enVmZjA5Zm02NmM1MDN4MnJtZmowa3l6emZoM2Z0ZhIqaW5qMWt0djIyYXp2dDVoOG5xejQ4d25ocXNqOTZ1bGU0eHgwZGF3N2pqGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajE5Y2hlY3h3enVmZjA5Zm02NmM1MDN4MnJtZmowa3l6emZoM2Z0ZhIqaW5qMWt0djIyYXp2dDVoOG5xejQ4d25ocXNqOTZ1bGU0eHgwZGF3N2pqGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajE5Y2hlY3h3enVmZjA5Zm02NmM1MDN4MnJtZmowa3l6emZoM2Z0ZhIqaW5qMWt0djIyYXp2dDVoOG5xejQ4d25ocXNqOTZ1bGU0eHgwZGF3N2pqGkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJ3+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohAgVaAkMOV5+9OJP2xYw3tKy3aU3SiAIummY3gRAIGDj/EgQKAggBGOihARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkBSSP+Fx12//aSYEjjLjr5gl5X4jOUktkOREMTfArsWVxl4Xl7cyV3f7kYAF7kBbQQqrgMerHsc9KePhRVoXB0k",
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajFwMzBra2w2dXh5YWhtOGhmMGVkOGY0MDJmNjdhMmo5eHJjNDJ5ZhIqaW5qMXo1ZzRwYXA3YThoaHhhYXkycG5md2czYXduNWRxcDVyNHN2OGthGhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajFwMzBra2w2dXh5YWhtOGhmMGVkOGY0MDJmNjdhMmo5eHJjNDJ5ZhIqaW5qMXo1ZzRwYXA3YThoaHhhYXkycG5md2czYXduNWRxcDVyNHN2OGthGj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMXAzMGtrbDZ1eHlhaG04aGYwZWQ4ZjQwMmY2N2Eyajl4cmM0MnlmEippbmoxejVnNHBhcDdhOGhoeGFheTJwbmZ3ZzNhd241ZHFwNXI0c3Y4a2EaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajFwMzBra2w2dXh5YWhtOGhmMGVkOGY0MDJmNjdhMmo5eHJjNDJ5ZhIqaW5qMXo1ZzRwYXA3YThoaHhhYXkycG5md2czYXduNWRxcDVyNHN2OGthGkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMXAzMGtrbDZ1eHlhaG04aGYwZWQ4ZjQwMmY2N2Eyajl4cmM0MnlmEippbmoxejVnNHBhcDdhOGhoeGFheTJwbmZ3ZzNhd241ZHFwNXI0c3Y4a2EaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFwMzBra2w2dXh5YWhtOGhmMGVkOGY0MDJmNjdhMmo5eHJjNDJ5ZhIqaW5qMXo1ZzRwYXA3YThoaHhhYXkycG5md2czYXduNWRxcDVyNHN2OGthGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFwMzBra2w2dXh5YWhtOGhmMGVkOGY0MDJmNjdhMmo5eHJjNDJ5ZhIqaW5qMXo1ZzRwYXA3YThoaHhhYXkycG5md2czYXduNWRxcDVyNHN2OGthGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajFwMzBra2w2dXh5YWhtOGhmMGVkOGY0MDJmNjdhMmo5eHJjNDJ5ZhIqaW5qMXo1ZzRwYXA3YThoaHhhYXkycG5md2czYXduNWRxcDVyNHN2OGthGkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJ3+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohAl0obf7huaZwDxwoKhqdWfwakrBU8rFlrc/Ihiquc4P5EgQKAggBGIOAARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkCGyhKBN8mu+4qID3ZzBPskvusEorT6TXytayPg3k6UpGMaLx38dXS9wmX2yrLrn4G67rihS/fKVCG2yMhdwk4y",
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajE0dDVmOTRtNWZnNHY2ZHJzNHFxa2QzZDczM3k2c3MwbGp5eXFsbRIqaW5qMWhtOXVobWhrZHRyeXd6MG1xazh2YTQwMmUzdWQweXBqbHFmcjNqGhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajE0dDVmOTRtNWZnNHY2ZHJzNHFxa2QzZDczM3k2c3MwbGp5eXFsbRIqaW5qMWhtOXVobWhrZHRyeXd6MG1xazh2YTQwMmUzdWQweXBqbHFmcjNqGj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMTR0NWY5NG01Zmc0djZkcnM0cXFrZDNkNzMzeTZzczBsanl5cWxtEippbmoxaG05dWhtaGtkdHJ5d3owbXFrOHZhNDAyZTN1ZDB5cGpscWZyM2oaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajE0dDVmOTRtNWZnNHY2ZHJzNHFxa2QzZDczM3k2c3MwbGp5eXFsbRIqaW5qMWhtOXVobWhrZHRyeXd6MG1xazh2YTQwMmUzdWQweXBqbHFmcjNqGkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMTR0NWY5NG01Zmc0djZkcnM0cXFrZDNkNzMzeTZzczBsanl5cWxtEippbmoxaG05dWhtaGtkdHJ5d3owbXFrOHZhNDAyZTN1ZDB5cGpscWZyM2oaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajE0dDVmOTRtNWZnNHY2ZHJzNHFxa2QzZDczM3k2c3MwbGp5eXFsbRIqaW5qMWhtOXVobWhrZHRyeXd6MG1xazh2YTQwMmUzdWQweXBqbHFmcjNqGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajE0dDVmOTRtNWZnNHY2ZHJzNHFxa2QzZDczM3k2c3MwbGp5eXFsbRIqaW5qMWhtOXVobWhrZHRyeXd6MG1xazh2YTQwMmUzdWQweXBqbHFmcjNqGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajE0dDVmOTRtNWZnNHY2ZHJzNHFxa2QzZDczM3k2c3MwbGp5eXFsbRIqaW5qMWhtOXVobWhrZHRyeXd6MG1xazh2YTQwMmUzdWQweXBqbHFmcjNqGkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJ3+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohA4fTy5A+DmuZfsXgjM48ntVqTXlOBW287TjXr91D0VGREgQKAggBGLuVARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkBdYIUr7S8ky4p9g+WWi2Ef8Cnq9W5eRsQ6Q6YNcnr0rhzy6lgo31o9tJg6XB0ZHtaJb00qBdU8/igNmfhEZXqk",
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajFhNHc5OXo0cWdxY2Q2bDZ1NGRqZnlsY3VjdDUzZHVxa3VxbnI1ZBIqaW5qMTUyNmszNmNrM2xodm1yZzhzeXlhODd0eTY5dXBsOHl6enJrNWZxGhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajFhNHc5OXo0cWdxY2Q2bDZ1NGRqZnlsY3VjdDUzZHVxa3VxbnI1ZBIqaW5qMTUyNmszNmNrM2xodm1yZzhzeXlhODd0eTY5dXBsOHl6enJrNWZxGj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMWE0dzk5ejRxZ3FjZDZsNnU0ZGpmeWxjdWN0NTNkdXFrdXFucjVkEippbmoxNTI2azM2Y2szbGh2bXJnOHN5eWE4N3R5Njl1cGw4eXp6cms1ZnEaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajFhNHc5OXo0cWdxY2Q2bDZ1NGRqZnlsY3VjdDUzZHVxa3VxbnI1ZBIqaW5qMTUyNmszNmNrM2xodm1yZzhzeXlhODd0eTY5dXBsOHl6enJrNWZxGkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMWE0dzk5ejRxZ3FjZDZsNnU0ZGpmeWxjdWN0NTNkdXFrdXFucjVkEippbmoxNTI2azM2Y2szbGh2bXJnOHN5eWE4N3R5Njl1cGw4eXp6cms1ZnEaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFhNHc5OXo0cWdxY2Q2bDZ1NGRqZnlsY3VjdDUzZHVxa3VxbnI1ZBIqaW5qMTUyNmszNmNrM2xodm1yZzhzeXlhODd0eTY5dXBsOHl6enJrNWZxGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFhNHc5OXo0cWdxY2Q2bDZ1NGRqZnlsY3VjdDUzZHVxa3VxbnI1ZBIqaW5qMTUyNmszNmNrM2xodm1yZzhzeXlhODd0eTY5dXBsOHl6enJrNWZxGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajFhNHc5OXo0cWdxY2Q2bDZ1NGRqZnlsY3VjdDUzZHVxa3VxbnI1ZBIqaW5qMTUyNmszNmNrM2xodm1yZzhzeXlhODd0eTY5dXBsOHl6enJrNWZxGkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJ3+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohArGVpE2Qtw7Pq625UTe8FZfqFAGc7IaBTZYPusGkLfnlEgQKAggBGMmAARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkDk8e2Du8ReB4Jz73ZkpdaWHIBSo5x0XtILIMecnJzbQ3TykogSC6OQ+tWOCFQp9mUhff++iCbVpFwAx08k+zYS",
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajFnZHZ0ZGtsdjNxZzQzM3Z1bjlqYXBhZGFucjk2MHgwdTI0cWtxbBIqaW5qMWFlYTRtOGZhcnc5ZHI5Y204N2FnN2QwejZtY2ZwMm54bnYyOGE3GhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajFnZHZ0ZGtsdjNxZzQzM3Z1bjlqYXBhZGFucjk2MHgwdTI0cWtxbBIqaW5qMWFlYTRtOGZhcnc5ZHI5Y204N2FnN2QwejZtY2ZwMm54bnYyOGE3Gj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMWdkdnRka2x2M3FnNDMzdnVuOWphcGFkYW5yOTYweDB1MjRxa3FsEippbmoxYWVhNG04ZmFydzlkcjljbTg3YWc3ZDB6Nm1jZnAybnhudjI4YTcaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajFnZHZ0ZGtsdjNxZzQzM3Z1bjlqYXBhZGFucjk2MHgwdTI0cWtxbBIqaW5qMWFlYTRtOGZhcnc5ZHI5Y204N2FnN2QwejZtY2ZwMm54bnYyOGE3GkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMWdkdnRka2x2M3FnNDMzdnVuOWphcGFkYW5yOTYweDB1MjRxa3FsEippbmoxYWVhNG04ZmFydzlkcjljbTg3YWc3ZDB6Nm1jZnAybnhudjI4YTcaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFnZHZ0ZGtsdjNxZzQzM3Z1bjlqYXBhZGFucjk2MHgwdTI0cWtxbBIqaW5qMWFlYTRtOGZhcnc5ZHI5Y204N2FnN2QwejZtY2ZwMm54bnYyOGE3GkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFnZHZ0ZGtsdjNxZzQzM3Z1bjlqYXBhZGFucjk2MHgwdTI0cWtxbBIqaW5qMWFlYTRtOGZhcnc5ZHI5Y204N2FnN2QwejZtY2ZwMm54bnYyOGE3GkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajFnZHZ0ZGtsdjNxZzQzM3Z1bjlqYXBhZGFucjk2MHgwdTI0cWtxbBIqaW5qMWFlYTRtOGZhcnc5ZHI5Y204N2FnN2QwejZtY2ZwMm54bnYyOGE3GkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJ3+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohAz+Zjrtxo20HOm1w4l5I57H9MAmt+87msPR5/1R/D1McEgQKAggBGMSqARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkDhGCp0+Crr0dfoCZrTb5otuTMtIxxTj9tWfxrfN7cnBTEgKFXVDlsXbay4Wlxz4QBVX4Fb6gtUgQbtDrazOEj9",
+ "CvMLCpUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEnUKKmluajFobm1kbGVhdHR1N3RldHU2ZWt3dzlybTBjbTAzZXpnNWpsdHJxehIqaW5qMW02M3U1eWtzYWdzc2o3d2N4Zmw1czd0NHU4N2s3MGpmeW5uazJqGhsKA2luahIUMTAwMDAwMDAwMDAwMDAwMDAwMDAKuQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSmAEKKmluajFobm1kbGVhdHR1N3RldHU2ZWt3dzlybTBjbTAzZXpnNWpsdHJxehIqaW5qMW02M3U1eWtzYWdzc2o3d2N4Zmw1czd0NHU4N2s3MGpmeW5uazJqGj4KL3BlZ2d5MHg4N2FCM0I0Qzg2NjFlMDdENjM3MjM2MTIxMUI5NmVkNERjMzZCMUI1EgsxMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMWhubWRsZWF0dHU3dGV0dTZla3d3OXJtMGNtMDNlemc1amx0cnF6EippbmoxbTYzdTV5a3NhZ3Nzajd3Y3hmbDVzN3Q0dTg3azcwamZ5bm5rMmoaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvdXNkYxILMTAwMDAwMDAwMDAKxQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSpAEKKmluajFobm1kbGVhdHR1N3RldHU2ZWt3dzlybTBjbTAzZXpnNWpsdHJxehIqaW5qMW02M3U1eWtzYWdzc2o3d2N4Zmw1czd0NHU4N2s3MGpmeW5uazJqGkoKL3BlZ2d5MHg0NEMyMWFmQWFGMjBjMjcwRUJiRjU5MTRDZmMzYjUwMjIxNzNGRUI3EhcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMArBAQocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBKgAQoqaW5qMWhubWRsZWF0dHU3dGV0dTZla3d3OXJtMGNtMDNlemc1amx0cnF6EippbmoxbTYzdTV5a3NhZ3Nzajd3Y3hmbDVzN3Q0dTg3azcwamZ5bm5rMmoaRgo3ZmFjdG9yeS9pbmoxN3Z5dGR3cWN6cXo3Mmo2NXNhdWtwbHJrdGQ0Z3lmbWU1YWdmNmMvYWF2ZRILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFobm1kbGVhdHR1N3RldHU2ZWt3dzlybTBjbTAzZXpnNWpsdHJxehIqaW5qMW02M3U1eWtzYWdzc2o3d2N4Zmw1czd0NHU4N2s3MGpmeW5uazJqGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2NydhILMTAwMDAwMDAwMDAKwAEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSnwEKKmluajFobm1kbGVhdHR1N3RldHU2ZWt3dzlybTBjbTAzZXpnNWpsdHJxehIqaW5qMW02M3U1eWtzYWdzc2o3d2N4Zmw1czd0NHU4N2s3MGpmeW5uazJqGkUKNmZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL2N2eBILMTAwMDAwMDAwMDAKwQEKHC9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQSoAEKKmluajFobm1kbGVhdHR1N3RldHU2ZWt3dzlybTBjbTAzZXpnNWpsdHJxehIqaW5qMW02M3U1eWtzYWdzc2o3d2N4Zmw1czd0NHU4N2s3MGpmeW5uazJqGkYKN2ZhY3RvcnkvaW5qMTd2eXRkd3FjenF6NzJqNjVzYXVrcGxya3RkNGd5Zm1lNWFnZjZjL3NoaWISCzEwMDAwMDAwMDAwGJ3+wwcSggEKYApUCi0vaW5qZWN0aXZlLmNyeXB0by52MWJldGExLmV0aHNlY3AyNTZrMS5QdWJLZXkSIwohA+OlGuxc2hUmrU+iVLb2MDnHy6W4exQyJrbMie9/Sv27EgQKAggBGJqQARIeChcKA2luahIQMTYwMDAwMDAwMDAwMDAwMBCAqMMBGkBTfe9A/RDSoHQCDunT60QgdtBrz3eIGvIgLEISRMAh/2w3+A9UB5SoDNGZNUfpNsxZyyq2Emi6pXuVpFzUCjI5"
+ ]
+ },
+ "evidence":{
+ "evidence":[
+
+ ]
+ },
+ "lastCommit":{
+ "height":"15793859",
+ "blockId":{
+ "hash":"RRhRSiIf1E08mJAtACM4J1RFSVJ96eR0PBVuoD7rb2c=",
+ "partSetHeader":{
+ "total":1,
+ "hash":"SeO5JkVtLUrhegd0rwDatDbvS5PQf/0Yvn+BmL1MOko="
+ }
+ },
+ "signatures":[
+ {
+ "blockIdFlag":"BLOCK_ID_FLAG_COMMIT",
+ "validatorAddress":"y8ctJ4QpJ0S7ZTVY7RTE4z1hS2c=",
+ "timestamp":"2023-09-07T03:59:36.496584825Z",
+ "signature":"AxnPc5AEa6jizZuKhXUAkNi4vic6miF9emyAx+uSMco7oKVwoXGDJ6L0wneNGYOqpKkMVMQm4hcnWgDBjiBLAA=="
+ },
+ {
+ "blockIdFlag":"BLOCK_ID_FLAG_COMMIT",
+ "validatorAddress":"M5HjW2EATgO+uI+h2rRES5E7174=",
+ "timestamp":"2023-09-07T03:59:36.293269404Z",
+ "signature":"mjODCd7P7xHo6Gn+6Qi6/u+FI72noRs9/vcbvpiqz7Hr5hRNhk2a2Jj2tw59GC6cURd2Q6c/CdZhXHgVqzMdAg=="
+ },
+ {
+ "blockIdFlag":"BLOCK_ID_FLAG_COMMIT",
+ "validatorAddress":"Nv8cuLE25L4mgnBx8shCmG68xfc=",
+ "timestamp":"2023-09-07T03:59:36.393462082Z",
+ "signature":"NyTk5W6WLxEbouVJ7LxSwV88FnH/CtmXkr6JczPqEehdrymqrGqT02OJLutGVsBmrPEkMhwa2BegkqvmPLJrBQ=="
+ },
+ {
+ "blockIdFlag":"BLOCK_ID_FLAG_COMMIT",
+ "validatorAddress":"ObUXYdS8jfTSNPonUBFPJkft7eA=",
+ "timestamp":"2023-09-07T03:59:36.296674286Z",
+ "signature":"OAwmf7pEjsXbwIWMD5HbzWiae6OAn0ME49FbXaRLvKIYKWSDKv9f0gprsgRJznOdj60SontlntwmvV+23MV6DQ=="
+ }
+ ],
+ "round":0
+ }
+ }
+}
+```
+
+
+Parameter | Type | Description |
---|
block_id | BlockID | Block identifier |
+sdk_block | Block | Block details |
+
+
+
+
+**BlockID**
+
+
+Parameter | Type | Description |
---|
hash | Bytes | Block hash |
+part_set_header | PartSetHeader | |
+
+
+
+
+**PartSetHeader**
+
+
+Parameter | Type | Description |
---|
total | Integer | |
+hash | Bytes | |
+
+
+
+
+**Block**
+
+
+Parameter | Type | Description |
---|
header | Header | Header information |
+data | Data | Block data |
+evidence | EvidenceList | |
+last_commit | Commit | |
+
+
+
+
+**Header**
+
+
+Parameter | Type | Description |
---|
version | Consensus | |
+chain_id | String | Chain identifier |
+height | Integer | Block height |
+time | Time | Block time |
+last_block_id | BlockID | Previous block identifier |
+last_commit_hash | Bytes | Last commit hash |
+data_hash | Bytes | Block data hash |
+validators_hash | Bytes | Validators information hash |
+next_validators_hash | Bytes | Validators information hash |
+consensus_hash | Bytes | Consensus information hash |
+app_hash | Bytes | Application hash |
+last_result_hash | Bytes | Last result hash |
+evidence_hash | Bytes | Evidence data hash |
+proposer_address | String | Block proposer's address |
+
+
+
+
+**Consensus**
+
+
+Parameter | Type | Description |
---|
version | Consensus | |
+chain_id | String | Chain identifier |
+height | Integer | Block height |
+time | Time | Block time |
+last_block_id | BlockID | Previous block identifier |
+last_commit_hash | Bytes | Last commit hash |
+data_hash | Bytes | Block data hash |
+validators_hash | Bytes | Validators information hash |
+next_validators_hash | Bytes | Validators information hash |
+consensus_hash | Bytes | Consensus information hash |
+app_hash | Bytes | Application hash |
+last_result_hash | Bytes | Last result hash |
+evidence_hash | Bytes | Evidence data hash |
+proposer_address | String | Block proposer's address |
+
+
+
+
+**Data**
+
+
+Parameter | Type | Description |
---|
txs | Byte Array | Txs that will be applied by state @ block.Height+1. NOTE: not all txs here are valid. We're just agreeing on the order first. This means that block.AppHash does not include these txs. |
+
+
+
+
+**EvidenceList**
+
+
+Parameter | Type | Description |
---|
evidence | Evidence Array | Block evidence |
+
+
+
+
+**Evidence**
+
+
+Parameter | Type | Description |
---|
sum | isEvidence_Sum | Valid types for 'sum' are Evidence_DuplicateVoteEvidence and Evidence_LightClientAttackEvidence |
+
+
+
+
+**Commit**
+
+
+Parameter | Type | Description |
---|
height | Integer | Block height |
+round | Integer | Consensus round |
+block_id | BlockID | Block identifier |
+signatures | CommitSig Array | Sigantures |
+
+
+
+
+**CommitSig**
+
+
+Parameter | Type | Description |
---|
block_id_flag | BlockIDFlag | Block height |
+validator_address | Bytes | Validator address |
+timestamp | Time | Block time |
+signature | Bytes | Block signature |
+
+
+
+
+**BlockIDFlag**
+
+
+Code | Name |
---|
0 | BLOCK_ID_FLAG_UNKNOWN |
+1 | BLOCK_ID_FLAG_ABSENT |
+2 | BLOCK_ID_FLAG_COMMIT |
+3 | BLOCK_ID_FLAG_NIL |
+
+
+
+## GetLatestValidatorSet
+
+Get the latest validator-set
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ validator_set = await client.fetch_latest_validator_set()
+ print(validator_set)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "fmt"
+
+ "os"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ ctx := context.Background()
+
+ res, err := chainClient.FetchLatestValidatorSet(ctx)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ fmt.Print(res.String())
+
+}
+```
+
+
+No parameters
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "blockHeight":"23201498",
+ "validators":[
+ {
+ "address":"injvalcons1xml3ew93xmjtuf5zwpcl9jzznphte30hvdre9a",
+ "pubKey":{
+ "@type":"/cosmos.crypto.ed25519.PubKey",
+ "key":"Bi/7vbVB1uj/zz40/aozZOvVBFkV6hLqqxBIQr5kSc4="
+ },
+ "votingPower":"200001152291153",
+ "proposerPriority":"234447499678197"
+ },
+ {
+ "address":"injvalcons18x63wcw5hjxlf535lgn4qy20yer7mm0qedu0la",
+ "pubKey":{
+ "@type":"/cosmos.crypto.ed25519.PubKey",
+ "key":"WlL4lTR+iTbd0rn3xP6oH0juOnGRZ+Hh73Oj6/Lt/Wg="
+ },
+ "votingPower":"200000153326260",
+ "proposerPriority":"-270628320740096"
+ },
+ {
+ "address":"injvalcons1xwg7xkmpqp8q804c37sa4dzyfwgnh4a74ll9pz",
+ "pubKey":{
+ "@type":"/cosmos.crypto.ed25519.PubKey",
+ "key":"Puku/I45dAZ4wKeN+rbYKnmuUUA7Yh7/TrKX3ZoTmk4="
+ },
+ "votingPower":"199859452893177",
+ "proposerPriority":"-192489141052575"
+ },
+ {
+ "address":"injvalcons1e0rj6fuy9yn5fwm9x4vw69xyuv7kzjm8rvw5r3",
+ "pubKey":{
+ "@type":"/cosmos.crypto.ed25519.PubKey",
+ "key":"1mF7OEpB9A60O0e+64pICbqS/nN8VnsVfoySMEW2w1Q="
+ },
+ "votingPower":"199826816954736",
+ "proposerPriority":"228669962114476"
+ }
+ ],
+ "pagination":{
+ "total":"4",
+ "nextKey":""
+ }
+}
+```
+
+
+Parameter | Type | Description |
---|
block_height | Integer | Block height |
+validators | Validator Array | List of validators |
+pagination | PageResponse | Pagination information in the response |
+
+
+
+
+**Validator**
+
+
+Parameter | Type | Description |
---|
address | String | Validator's address |
+pub_key | Any | Validator's public key |
+voting_power | Integer | Validator's voting power |
+proposer_priority | Integer | |
+
+
+
+
+**PageResponse**
+
+
+Parameter | Type | Description |
---|
next_key | Byte Array | The key to be passed to PageRequest.key to query the next page most efficiently. It will be empty if there are no more results. |
+total | Integer | Total number of results available if PageRequest.count_total was set, its value is undefined otherwise |
+
+
+
+## GetValidatorSetByHeight
+
+Get the validator-set at a given height
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+
+```py
+import asyncio
+
+from google.protobuf import symbol_database
+
+from pyinjective.async_client import AsyncClient
+from pyinjective.client.model.pagination import PaginationOption
+from pyinjective.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ pagination = PaginationOption(skip=2, limit=4)
+
+ validator_set = await client.fetch_validator_set_by_height(height=23040174, pagination=pagination)
+ print(validator_set)
+
+
+if __name__ == "__main__":
+ symbol_db = symbol_database.Default()
+ asyncio.get_event_loop().run_until_complete(main())
+```
+
+
+
+
+```go
+package main
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/cosmos/cosmos-sdk/types/query"
+
+ "os"
+
+ "github.com/InjectiveLabs/sdk-go/client"
+ chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
+ "github.com/InjectiveLabs/sdk-go/client/common"
+ rpchttp "github.com/cometbft/cometbft/rpc/client/http"
+)
+
+func main() {
+ network := common.LoadNetwork("testnet", "lb")
+ tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
+ if err != nil {
+ panic(err)
+ }
+
+ senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
+ os.Getenv("HOME")+"/.injectived",
+ "injectived",
+ "file",
+ "inj-user",
+ "12345678",
+ "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
+ false,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx, err := chainclient.NewClientContext(
+ network.ChainId,
+ senderAddress.String(),
+ cosmosKeyring,
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
+
+ chainClient, err := chainclient.NewChainClient(
+ clientCtx,
+ network,
+ common.OptionGasPrices(client.DefaultGasPriceWithDenom),
+ )
+
+ if err != nil {
+ panic(err)
+ }
+
+ ctx := context.Background()
+
+ height := int64(23040174)
+ pagination := query.PageRequest{Offset: 2, Limit: 10}
+ res, err := chainClient.FetchValidatorSetByHeight(ctx, height, &pagination)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ fmt.Print(res.String())
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
height | Integer | Block height | Yes |
+pagination | PageRequest | The optional pagination for the request | No |
+
+
+
+
+**PageRequest**
+
+
+Parameter | Type | Description | Required |
---|
key | Byte Array | Key is a value returned in PageResponse.next_key to begin querying the next page most efficiently. Only one of offset or key should be set | No |
+offset | Integer | Numeric offset that can be used when key is unavailable. It is less efficient than using key. Only one of offset or key should be set | No |
+limit | Integer | Total number of results to be returned in the result page | No |
+count_total | Boolean | Set to true to indicate that the result set should include a count of the total number of items available for pagination in UIs. It is only respected when offset is used. It is ignored when key is set | No |
+reverse | Boolean | Reverse is set to true if results are to be returned in the descending order | No |
+
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "blockHeight":"23040174",
+ "validators":[
+ {
+ "address":"injvalcons1xml3ew93xmjtuf5zwpcl9jzznphte30hvdre9a",
+ "pubKey":{
+ "@type":"/cosmos.crypto.ed25519.PubKey",
+ "key":"Bi/7vbVB1uj/zz40/aozZOvVBFkV6hLqqxBIQr5kSc4="
+ },
+ "votingPower":"200001152291142",
+ "proposerPriority":"-117113073985972"
+ },
+ {
+ "address":"injvalcons18x63wcw5hjxlf535lgn4qy20yer7mm0qedu0la",
+ "pubKey":{
+ "@type":"/cosmos.crypto.ed25519.PubKey",
+ "key":"WlL4lTR+iTbd0rn3xP6oH0juOnGRZ+Hh73Oj6/Lt/Wg="
+ },
+ "votingPower":"200000153326249",
+ "proposerPriority":"-30678774375098"
+ },
+ {
+ "address":"injvalcons1xwg7xkmpqp8q804c37sa4dzyfwgnh4a74ll9pz",
+ "pubKey":{
+ "@type":"/cosmos.crypto.ed25519.PubKey",
+ "key":"Puku/I45dAZ4wKeN+rbYKnmuUUA7Yh7/TrKX3ZoTmk4="
+ },
+ "votingPower":"199859452893172",
+ "proposerPriority":"358858430481236"
+ },
+ {
+ "address":"injvalcons1e0rj6fuy9yn5fwm9x4vw69xyuv7kzjm8rvw5r3",
+ "pubKey":{
+ "@type":"/cosmos.crypto.ed25519.PubKey",
+ "key":"1mF7OEpB9A60O0e+64pICbqS/nN8VnsVfoySMEW2w1Q="
+ },
+ "votingPower":"199826816954540",
+ "proposerPriority":"504834849146021"
+ }
+ ],
+ "pagination":{
+ "total":"7",
+ "nextKey":""
+ }
+}
+```
+
+
+Parameter | Type | Description |
---|
block_height | Integer | Block height |
+validators | Validator Array | List of validators |
+pagination | PageResponse | Pagination information in the response |
+
+
+
+
+**Validator**
+
+
+Parameter | Type | Description |
---|
address | String | Validator's address |
+pub_key | Any | Validator's public key |
+voting_power | Integer | Validator's voting power |
+proposer_priority | Integer | |
+
+
+
+
+**PageResponse**
+
+
+Parameter | Type | Description |
---|
next_key | Byte Array | The key to be passed to PageRequest.key to query the next page most efficiently. It will be empty if there are no more results. |
+total | Integer | Total number of results available if PageRequest.count_total was set, its value is undefined otherwise |
+
+
+
+## ABCIQuery
+
+Defines a query handler that supports ABCI queries directly to the application, bypassing Tendermint completely. The ABCI query must contain a valid and supported path, including app, custom, p2p, and store.
+
+**IP rate limit group:** `chain`
+
+### Request Parameters
+> Request Example:
+
+
+Parameter | Type | Description | Required |
---|
data | Bytes | Query data | No |
+path | String | Query path | Yes |
+haight | Integer | Block height | No |
+prove | Boolean | | No |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+
+```
+
+
+Parameter | Type | Description |
---|
code | Integer | Query result code (zero: success, non-zero: error |
+log | String | |
+info | String | |
+index | Integer | |
+key | Bytes | |
+value | Bytes | |
+proof_ops | ProofOps | |
+height | Integer | Block height |
+codespace | String | |
+
+
+
+
+**ProofOps**
+
+
+Parameter | Type | Description |
---|
ops | ProofOp Array | |
+
+
+
+
+**ProofOp**
+
+
+Parameter | Type | Description |
---|
type | String | |
+key | Bytes | |
+data | Bytes | |
+
diff --git a/source/index.html.md b/source/index.html.md
index 76cd85f0..e8198d00 100644
--- a/source/index.html.md
+++ b/source/index.html.md
@@ -36,9 +36,13 @@ includes:
- derivatives
- spot
- binaryoptions
+ - ibccorechannel
+ - ibccoreclient
+ - ibctransfer
- insurance
- oracle
- staking
+ - tendermint
- tokenfactory
- wasm
- wasmx
@@ -46,7 +50,6 @@ includes:
- healthapi
- glossary
- faq
- # - chronosrpc
- errors
search: true
diff --git a/source/json_tables/chain/ibc/core/channel/channel.json b/source/json_tables/chain/ibc/core/channel/channel.json
new file mode 100644
index 00000000..a8181b4d
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/channel.json
@@ -0,0 +1,7 @@
+[
+ {"Parameter": "state", "Type": "State", "Description": "Current state of the channel end"},
+ {"Parameter": "ordering", "Type": "Order", "Description": "Whether the channel is ordered or unordered"},
+ {"Parameter": "counterparty", "Type": "Counterparty", "Description": "Counterparty channel end"},
+ {"Parameter": "connection_hops", "Type": "String Array", "Description": "List of connection identifiers, in order, along which packets sent on this channel will travel"},
+ {"Parameter": "version", "Type": "String", "Description": "Opaque channel version, which is agreed upon during the handshake"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/counterparty.json b/source/json_tables/chain/ibc/core/channel/counterparty.json
new file mode 100644
index 00000000..4228bff5
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/counterparty.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "port_id", "Type": "String", "Description": "Port on the counterparty chain which owns the other end of the channel"},
+ {"Parameter": "channel_id", "Type": "String", "Description": "Channel end on the counterparty chain"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/identifiedChannel.json b/source/json_tables/chain/ibc/core/channel/identifiedChannel.json
new file mode 100644
index 00000000..ef3c9bb8
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/identifiedChannel.json
@@ -0,0 +1,9 @@
+[
+ {"Parameter": "state", "Type": "State", "Description": "Current state of the channel end"},
+ {"Parameter": "ordering", "Type": "Order", "Description": "Whether the channel is ordered or unordered"},
+ {"Parameter": "counterparty", "Type": "Counterparty", "Description": "Counterparty channel end"},
+ {"Parameter": "connection_hops", "Type": "String Array", "Description": "List of connection identifiers, in order, along which packets sent on this channel will travel"},
+ {"Parameter": "version", "Type": "String", "Description": "Opaque channel version, which is agreed upon during the handshake"},
+ {"Parameter": "port_id", "Type": "String", "Description": "Port identifier"},
+ {"Parameter": "channel_id", "Type": "String", "Description": "Channel identifier"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/order.json b/source/json_tables/chain/ibc/core/channel/order.json
new file mode 100644
index 00000000..a1c3d3ea
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/order.json
@@ -0,0 +1,5 @@
+[
+ {"Code": "0", "Name": "ORDER_NONE_UNSPECIFIED"},
+ {"Code": "1", "Name": "ORDER_UNORDERED"},
+ {"Code": "2", "Name": "ORDER_ORDERED"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/packetState.json b/source/json_tables/chain/ibc/core/channel/packetState.json
new file mode 100644
index 00000000..76cec0ee
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/packetState.json
@@ -0,0 +1,6 @@
+[
+ {"Parameter": "port_id", "Type": "String", "Description": "Port identifier"},
+ {"Parameter": "channel_id", "Type": "String", "Description": "Channel identifier"},
+ {"Parameter": "sequence", "Type": "Integer", "Description": "Packet sequence"},
+ {"Parameter": "data", "Type": "Byte Array", "Description": "Embedded data that represents packet state"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryChannelClientStateRequest.json b/source/json_tables/chain/ibc/core/channel/queryChannelClientStateRequest.json
new file mode 100644
index 00000000..2a57e58d
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryChannelClientStateRequest.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "port_id", "Type": "String", "Description": "Port unique identifier", "Required": "Yes"},
+ {"Parameter": "channel_id", "Type": "String", "Description": "Channel unique identifier", "Required": "Yes"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryChannelClientStateResponse.json b/source/json_tables/chain/ibc/core/channel/queryChannelClientStateResponse.json
new file mode 100644
index 00000000..4b74ab4f
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryChannelClientStateResponse.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "identified_client_state", "Type": "IdentifiedChannel", "Description": "Client state associated with the channel"},
+ {"Parameter": "proof", "Type": "Byte Array", "Description": "Merkle proof of existence"},
+ {"Parameter": "proof_height", "Type": "Height", "Description": "Height at which the proof was retrieved"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryChannelConsensusStateRequest.json b/source/json_tables/chain/ibc/core/channel/queryChannelConsensusStateRequest.json
new file mode 100644
index 00000000..a289ff2e
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryChannelConsensusStateRequest.json
@@ -0,0 +1,6 @@
+[
+ {"Parameter": "port_id", "Type": "String", "Description": "Port unique identifier", "Required": "Yes"},
+ {"Parameter": "channel_id", "Type": "String", "Description": "Channel unique identifier", "Required": "Yes"},
+ {"Parameter": "revision_number", "Type": "Integer", "Description": "Revision number of the consensus state", "Required": "Yes"},
+ {"Parameter": "revision_height", "Type": "Integer", "Description": "Revision height of the consensus state", "Required": "Yes"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryChannelConsensusStateResponse.json b/source/json_tables/chain/ibc/core/channel/queryChannelConsensusStateResponse.json
new file mode 100644
index 00000000..a0106ae2
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryChannelConsensusStateResponse.json
@@ -0,0 +1,6 @@
+[
+ {"Parameter": "consensus_state", "Type": "Any", "Description": "Consensus state associated with the channel"},
+ {"Parameter": "client_id", "Type": "String", "Description": "Client ID associated with the consensus state"},
+ {"Parameter": "proof", "Type": "Byte Array", "Description": "Merkle proof of existence"},
+ {"Parameter": "proof_height", "Type": "Height", "Description": "Height at which the proof was retrieved"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryChannelRequest.json b/source/json_tables/chain/ibc/core/channel/queryChannelRequest.json
new file mode 100644
index 00000000..2a57e58d
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryChannelRequest.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "port_id", "Type": "String", "Description": "Port unique identifier", "Required": "Yes"},
+ {"Parameter": "channel_id", "Type": "String", "Description": "Channel unique identifier", "Required": "Yes"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryChannelResponse.json b/source/json_tables/chain/ibc/core/channel/queryChannelResponse.json
new file mode 100644
index 00000000..915d7e0c
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryChannelResponse.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "channel", "Type": "Channel", "Description": "Channel details"},
+ {"Parameter": "proof", "Type": "Byte Array", "Description": "Merkle proof of existence"},
+ {"Parameter": "proof_height", "Type": "Height", "Description": "Height at which the proof was retrieved"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryChannelsRequest.json b/source/json_tables/chain/ibc/core/channel/queryChannelsRequest.json
new file mode 100644
index 00000000..9da294d1
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryChannelsRequest.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "pagination", "Type": "PageRequest", "Description": "The optional pagination for the request", "Required": "No"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryChannelsResponse.json b/source/json_tables/chain/ibc/core/channel/queryChannelsResponse.json
new file mode 100644
index 00000000..d518ebf5
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryChannelsResponse.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "channels", "Type": "IdentifiedChannel Array", "Description": "List of channels"},
+ {"Parameter": "pagination", "Type": "PageResponse", "Description": "Pagination information in the response"},
+ {"Parameter": "height", "Type": "Height", "Description": "Query block height"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryConnectionChannelsRequest.json b/source/json_tables/chain/ibc/core/channel/queryConnectionChannelsRequest.json
new file mode 100644
index 00000000..c14b0a65
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryConnectionChannelsRequest.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "connection", "Type": "String", "Description": "Connection unique identifier", "Required": "Yes"},
+ {"Parameter": "pagination", "Type": "PageRequest", "Description": "The optional pagination for the request", "Required": "No"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryConnectionChannelsResponse.json b/source/json_tables/chain/ibc/core/channel/queryConnectionChannelsResponse.json
new file mode 100644
index 00000000..d518ebf5
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryConnectionChannelsResponse.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "channels", "Type": "IdentifiedChannel Array", "Description": "List of channels"},
+ {"Parameter": "pagination", "Type": "PageResponse", "Description": "Pagination information in the response"},
+ {"Parameter": "height", "Type": "Height", "Description": "Query block height"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryNextSequenceReceiveRequest.json b/source/json_tables/chain/ibc/core/channel/queryNextSequenceReceiveRequest.json
new file mode 100644
index 00000000..2a57e58d
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryNextSequenceReceiveRequest.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "port_id", "Type": "String", "Description": "Port unique identifier", "Required": "Yes"},
+ {"Parameter": "channel_id", "Type": "String", "Description": "Channel unique identifier", "Required": "Yes"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryNextSequenceReceiveResponse.json b/source/json_tables/chain/ibc/core/channel/queryNextSequenceReceiveResponse.json
new file mode 100644
index 00000000..7298d44c
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryNextSequenceReceiveResponse.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "next_sequence_receive", "Type": "Integer", "Description": "Next sequence receive number"},
+ {"Parameter": "proof", "Type": "Byte Array", "Description": "Merkle proof of existence"},
+ {"Parameter": "proof_height", "Type": "Height", "Description": "Height at which the proof was retrieved"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementRequest.json b/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementRequest.json
new file mode 100644
index 00000000..0cf6b279
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementRequest.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "port_id", "Type": "String", "Description": "Port unique identifier", "Required": "Yes"},
+ {"Parameter": "channel_id", "Type": "String", "Description": "Channel unique identifier", "Required": "Yes"},
+ {"Parameter": "sequence", "Type": "Integer", "Description": "Packet sequence", "Required": "Yes"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementResponse.json b/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementResponse.json
new file mode 100644
index 00000000..af953b0b
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementResponse.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "acknowledgement", "Type": "Byte Array", "Description": "Success flag to mark if the receipt exists"},
+ {"Parameter": "proof", "Type": "Byte Array", "Description": "Merkle proof of existence"},
+ {"Parameter": "proof_height", "Type": "Height", "Description": "Height at which the proof was retrieved"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementsRequest.json b/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementsRequest.json
new file mode 100644
index 00000000..e3186a0e
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementsRequest.json
@@ -0,0 +1,6 @@
+[
+ {"Parameter": "port_id", "Type": "String", "Description": "Port unique identifier", "Required": "Yes"},
+ {"Parameter": "channel_id", "Type": "String", "Description": "Channel unique identifier", "Required": "Yes"},
+ {"Parameter": "pagination", "Type": "PageRequest", "Description": "The optional pagination for the request", "Required": "No"},
+ {"Parameter": "packet_commitment_sequences", "Type": "Integer Array", "Description": "List of packet sequences", "Required": "No"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementsResponse.json b/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementsResponse.json
new file mode 100644
index 00000000..e4254ce5
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementsResponse.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "acknowledgements", "Type": "PacketState Array", "Description": "Acknowledgements details"},
+ {"Parameter": "pagination", "Type": "PageResponse", "Description": "Pagination information in the response"},
+ {"Parameter": "height", "Type": "Height", "Description": "Query block height"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentRequest.json b/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentRequest.json
new file mode 100644
index 00000000..0cf6b279
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentRequest.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "port_id", "Type": "String", "Description": "Port unique identifier", "Required": "Yes"},
+ {"Parameter": "channel_id", "Type": "String", "Description": "Channel unique identifier", "Required": "Yes"},
+ {"Parameter": "sequence", "Type": "Integer", "Description": "Packet sequence", "Required": "Yes"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentResponse.json b/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentResponse.json
new file mode 100644
index 00000000..b9b2ab40
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentResponse.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "commitment", "Type": "Byte Array", "Description": "Packet associated with the request fields"},
+ {"Parameter": "proof", "Type": "Byte Array", "Description": "Merkle proof of existence"},
+ {"Parameter": "proof_height", "Type": "Height", "Description": "Height at which the proof was retrieved"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentsRequest.json b/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentsRequest.json
new file mode 100644
index 00000000..d47dfe9e
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentsRequest.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "port_id", "Type": "String", "Description": "Port unique identifier", "Required": "Yes"},
+ {"Parameter": "channel_id", "Type": "String", "Description": "Channel unique identifier", "Required": "Yes"},
+ {"Parameter": "pagination", "Type": "PageRequest", "Description": "The optional pagination for the request", "Required": "No"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentsResponse.json b/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentsResponse.json
new file mode 100644
index 00000000..d373c70b
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentsResponse.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "commitments", "Type": "PacketState Array", "Description": "Commitments information"},
+ {"Parameter": "pagination", "Type": "PageResponse", "Description": "Pagination information in the response"},
+ {"Parameter": "height", "Type": "Height", "Description": "Query block height"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryPacketReceiptRequest.json b/source/json_tables/chain/ibc/core/channel/queryPacketReceiptRequest.json
new file mode 100644
index 00000000..0cf6b279
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryPacketReceiptRequest.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "port_id", "Type": "String", "Description": "Port unique identifier", "Required": "Yes"},
+ {"Parameter": "channel_id", "Type": "String", "Description": "Channel unique identifier", "Required": "Yes"},
+ {"Parameter": "sequence", "Type": "Integer", "Description": "Packet sequence", "Required": "Yes"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryPacketReceiptResponse.json b/source/json_tables/chain/ibc/core/channel/queryPacketReceiptResponse.json
new file mode 100644
index 00000000..f27c918f
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryPacketReceiptResponse.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "received", "Type": "Boolean", "Description": "Success flag to mark if the receipt exists"},
+ {"Parameter": "proof", "Type": "Byte Array", "Description": "Merkle proof of existence"},
+ {"Parameter": "proof_height", "Type": "Height", "Description": "Height at which the proof was retrieved"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryUnreceivedAcksRequest.json b/source/json_tables/chain/ibc/core/channel/queryUnreceivedAcksRequest.json
new file mode 100644
index 00000000..9cd86f55
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryUnreceivedAcksRequest.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "port_id", "Type": "String", "Description": "Port unique identifier", "Required": "Yes"},
+ {"Parameter": "channel_id", "Type": "String", "Description": "Channel unique identifier", "Required": "Yes"},
+ {"Parameter": "packet_ack_sequences", "Type": "Integer Array", "Description": "List of acknowledgement sequences", "Required": "No"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryUnreceivedAcksResponse.json b/source/json_tables/chain/ibc/core/channel/queryUnreceivedAcksResponse.json
new file mode 100644
index 00000000..53e3d720
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryUnreceivedAcksResponse.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "sequences", "Type": "Integer Array", "Description": "List of unreceived packet sequences"},
+ {"Parameter": "height", "Type": "Height", "Description": "Query block height"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryUnreceivedPacketsRequest.json b/source/json_tables/chain/ibc/core/channel/queryUnreceivedPacketsRequest.json
new file mode 100644
index 00000000..a4a275f6
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryUnreceivedPacketsRequest.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "port_id", "Type": "String", "Description": "Port unique identifier", "Required": "Yes"},
+ {"Parameter": "channel_id", "Type": "String", "Description": "Channel unique identifier", "Required": "Yes"},
+ {"Parameter": "packet_commitment_sequences", "Type": "Integer Array", "Description": "List of packet sequences", "Required": "No"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/queryUnreceivedPacketsResponse.json b/source/json_tables/chain/ibc/core/channel/queryUnreceivedPacketsResponse.json
new file mode 100644
index 00000000..53e3d720
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/queryUnreceivedPacketsResponse.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "sequences", "Type": "Integer Array", "Description": "List of unreceived packet sequences"},
+ {"Parameter": "height", "Type": "Height", "Description": "Query block height"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/channel/state.json b/source/json_tables/chain/ibc/core/channel/state.json
new file mode 100644
index 00000000..8896ee70
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/channel/state.json
@@ -0,0 +1,7 @@
+[
+ {"Code": "0", "Name": "STATE_UNINITIALIZED_UNSPECIFIED"},
+ {"Code": "1", "Name": "STATE_INIT"},
+ {"Code": "2", "Name": "STATE_TRYOPEN"},
+ {"Code": "3", "Name": "STATE_OPEN"},
+ {"Code": "4", "Name": "STATE_CLOSED"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/client/consensusStateWithHeight.json b/source/json_tables/chain/ibc/core/client/consensusStateWithHeight.json
new file mode 100644
index 00000000..6931aff1
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/client/consensusStateWithHeight.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "height", "Type": "Height", "Description": "Consensus state height"},
+ {"Parameter": "consensus_state", "Type": "Any", "Description": "Consensus state"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/client/identifiedClientState.json b/source/json_tables/chain/ibc/core/client/identifiedClientState.json
new file mode 100644
index 00000000..6b6e737f
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/client/identifiedClientState.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "client_id", "Type": "String", "Description": "Client identifier"},
+ {"Parameter": "client_state", "Type": "Any", "Description": "Client state"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/client/params.json b/source/json_tables/chain/ibc/core/client/params.json
new file mode 100644
index 00000000..31c14807
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/client/params.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "allowed_clients", "Type": "String Array", "Description": "Allowed_clients defines the list of allowed client state types which can be created and interacted with. If a client type is removed from the allowed clients list, usage of this client will be disabled until it is added again to the list"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/client/queryClientParamsResponse.json b/source/json_tables/chain/ibc/core/client/queryClientParamsResponse.json
new file mode 100644
index 00000000..973f011e
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/client/queryClientParamsResponse.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "params", "Type": "params", "Description": "Module's parameters"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/client/queryClientStateRequest.json b/source/json_tables/chain/ibc/core/client/queryClientStateRequest.json
new file mode 100644
index 00000000..486be60e
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/client/queryClientStateRequest.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "client_id", "Type": "String", "Description": "Client state unique identifier", "Required": "Yes"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/client/queryClientStateResponse.json b/source/json_tables/chain/ibc/core/client/queryClientStateResponse.json
new file mode 100644
index 00000000..9ef3661e
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/client/queryClientStateResponse.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "client_state", "Type": "Any", "Description": "Client state associated with the request identifier"},
+ {"Parameter": "proof", "Type": "Byte Array", "Description": "Merkle proof of existence"},
+ {"Parameter": "proof_height", "Type": "Height", "Description": "Height at which the proof was retrieved"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/client/queryClientStatesRequest.json b/source/json_tables/chain/ibc/core/client/queryClientStatesRequest.json
new file mode 100644
index 00000000..9da294d1
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/client/queryClientStatesRequest.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "pagination", "Type": "PageRequest", "Description": "The optional pagination for the request", "Required": "No"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/client/queryClientStatesResponse.json b/source/json_tables/chain/ibc/core/client/queryClientStatesResponse.json
new file mode 100644
index 00000000..7d0d42d8
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/client/queryClientStatesResponse.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "client_states", "Type": "IdentifiedClientState Array", "Description": "Client state associated with the request identifier"},
+ {"Parameter": "pagination", "Type": "PageResponse", "Description": "Pagination information in the response"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/client/queryClientStatusRequest.json b/source/json_tables/chain/ibc/core/client/queryClientStatusRequest.json
new file mode 100644
index 00000000..77a27792
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/client/queryClientStatusRequest.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "client_id", "Type": "String", "Description": "Client unique identifier", "Required": "Yes"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/client/queryClientStatusResponse.json b/source/json_tables/chain/ibc/core/client/queryClientStatusResponse.json
new file mode 100644
index 00000000..51ea3f45
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/client/queryClientStatusResponse.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "status", "Type": "String", "Description": "Client status"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/client/queryConsensusStateHeightsRequest.json b/source/json_tables/chain/ibc/core/client/queryConsensusStateHeightsRequest.json
new file mode 100644
index 00000000..99fe4f32
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/client/queryConsensusStateHeightsRequest.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "client_id", "Type": "String", "Description": "Client identifier", "Required": "Yes"},
+ {"Parameter": "pagination", "Type": "PageRequest", "Description": "The optional pagination for the request", "Required": "No"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/client/queryConsensusStateHeightsResponse.json b/source/json_tables/chain/ibc/core/client/queryConsensusStateHeightsResponse.json
new file mode 100644
index 00000000..25cb1581
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/client/queryConsensusStateHeightsResponse.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "consensus_state_heights", "Type": "Height Array", "Description": "Consensus state heights"},
+ {"Parameter": "pagination", "Type": "PageResponse", "Description": "Pagination information in the response"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/client/queryConsensusStateRequest.json b/source/json_tables/chain/ibc/core/client/queryConsensusStateRequest.json
new file mode 100644
index 00000000..ca0076b7
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/client/queryConsensusStateRequest.json
@@ -0,0 +1,6 @@
+[
+ {"Parameter": "client_id", "Type": "String", "Description": "Client identifier", "Required": "Yes"},
+ {"Parameter": "revision_number", "Type": "Integer", "Description": "Consensus state revision number", "Required": "Yes"},
+ {"Parameter": "client_id", "Type": "Integer", "Description": "Consensus state revision height", "Required": "Yes"},
+ {"Parameter": "latest_height", "Type": "Boolean", "Description": "Overrrides the height field and queries the latest stored ConsensusState", "Required": "No"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/client/queryConsensusStateResponse.json b/source/json_tables/chain/ibc/core/client/queryConsensusStateResponse.json
new file mode 100644
index 00000000..f4b7bdf0
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/client/queryConsensusStateResponse.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "consensus_state", "Type": "Any", "Description": "Client state associated with the request identifier"},
+ {"Parameter": "proof", "Type": "Byte Array", "Description": "Merkle proof of existence"},
+ {"Parameter": "proof_height", "Type": "Height", "Description": "Height at which the proof was retrieved"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/client/queryConsensusStatesRequest.json b/source/json_tables/chain/ibc/core/client/queryConsensusStatesRequest.json
new file mode 100644
index 00000000..99fe4f32
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/client/queryConsensusStatesRequest.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "client_id", "Type": "String", "Description": "Client identifier", "Required": "Yes"},
+ {"Parameter": "pagination", "Type": "PageRequest", "Description": "The optional pagination for the request", "Required": "No"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/client/queryConsensusStatesResponse.json b/source/json_tables/chain/ibc/core/client/queryConsensusStatesResponse.json
new file mode 100644
index 00000000..639cef2e
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/client/queryConsensusStatesResponse.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "consensus_states", "Type": "ConsensusStateWithHeight Array", "Description": "Consensus states associated with the identifier"},
+ {"Parameter": "pagination", "Type": "PageResponse", "Description": "Pagination information in the response"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/client/queryUpgradedClientStateResponse.json b/source/json_tables/chain/ibc/core/client/queryUpgradedClientStateResponse.json
new file mode 100644
index 00000000..99567127
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/client/queryUpgradedClientStateResponse.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "upgraded_client_state", "Type": "Any", "Description": "Client state associated with the request identifier"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/client/queryUpgradedConsensusStateResponse.json b/source/json_tables/chain/ibc/core/client/queryUpgradedConsensusStateResponse.json
new file mode 100644
index 00000000..948ae7ab
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/client/queryUpgradedConsensusStateResponse.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "upgraded_consensus_state", "Type": "Any", "Description": "Consensus state associated with the request identifier"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/height.json b/source/json_tables/chain/ibc/core/height.json
new file mode 100644
index 00000000..452877d6
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/height.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "revision_number", "Type": "Integer", "Description": "The revision that the client is currently on"},
+ {"Parameter": "revision_height", "Type": "Integer", "Description": "The height within the given revision"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/transfer/denomTrace.json b/source/json_tables/chain/ibc/transfer/denomTrace.json
new file mode 100644
index 00000000..c78692d1
--- /dev/null
+++ b/source/json_tables/chain/ibc/transfer/denomTrace.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "path", "Type": "String", "Description": "Path is the port and channel"},
+ {"Parameter": "base_denom", "Type": "String", "Description": "The token denom"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/transfer/msgTransfer.json b/source/json_tables/chain/ibc/transfer/msgTransfer.json
new file mode 100644
index 00000000..2480e848
--- /dev/null
+++ b/source/json_tables/chain/ibc/transfer/msgTransfer.json
@@ -0,0 +1,10 @@
+[
+ {"Parameter": "source_port", "Type": "String", "Description": "The port on which the packet will be sent"},
+ {"Parameter": "source_channel", "Type": "String", "Description": "The channel by which the packet will be sent"},
+ {"Parameter": "token", "Type": "Coin", "Description": "The tokens to be transferred"},
+ {"Parameter": "sender", "Type": "String", "Description": "The sender address"},
+ {"Parameter": "receiver", "Type": "String", "Description": "The recipient address on the destination chain"},
+ {"Parameter": "timeout_height", "Type": "Height", "Description": "Timeout height relative to the current block height. The timeout is disabled when set to 0"},
+ {"Parameter": "timeout_timestamp", "Type": "Integer", "Description": "Timeout timestamp in absolute nanoseconds since unix epoch. The timeout is disabled when set to 0"},
+ {"Parameter": "memo", "Type": "String", "Description": "Optional memo"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/transfer/queryDenomHashRequest.json b/source/json_tables/chain/ibc/transfer/queryDenomHashRequest.json
new file mode 100644
index 00000000..ce0e4376
--- /dev/null
+++ b/source/json_tables/chain/ibc/transfer/queryDenomHashRequest.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "trace", "Type": "String", "Description": "The denomination trace ([port_id]/[channel_id])+/[denom]", "Required": "Yes"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/transfer/queryDenomHashResponse.json b/source/json_tables/chain/ibc/transfer/queryDenomHashResponse.json
new file mode 100644
index 00000000..78b747d3
--- /dev/null
+++ b/source/json_tables/chain/ibc/transfer/queryDenomHashResponse.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "hash", "Type": "String", "Description": "Hash (in hex format) of the denomination trace information"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/transfer/queryDenomTraceRequest.json b/source/json_tables/chain/ibc/transfer/queryDenomTraceRequest.json
new file mode 100644
index 00000000..bbaede68
--- /dev/null
+++ b/source/json_tables/chain/ibc/transfer/queryDenomTraceRequest.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "hash", "Type": "String", "Description": "The denom trace hash", "Required": "Yes"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/transfer/queryDenomTraceResponse.json b/source/json_tables/chain/ibc/transfer/queryDenomTraceResponse.json
new file mode 100644
index 00000000..dab3d692
--- /dev/null
+++ b/source/json_tables/chain/ibc/transfer/queryDenomTraceResponse.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "denom_trace", "Type": "DenomTrace", "Description": "Denom trace information"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/transfer/queryDenomTracesRequest.json b/source/json_tables/chain/ibc/transfer/queryDenomTracesRequest.json
new file mode 100644
index 00000000..9da294d1
--- /dev/null
+++ b/source/json_tables/chain/ibc/transfer/queryDenomTracesRequest.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "pagination", "Type": "PageRequest", "Description": "The optional pagination for the request", "Required": "No"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/transfer/queryDenomTracesResponse.json b/source/json_tables/chain/ibc/transfer/queryDenomTracesResponse.json
new file mode 100644
index 00000000..031cdcda
--- /dev/null
+++ b/source/json_tables/chain/ibc/transfer/queryDenomTracesResponse.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "denom_traces", "Type": "DenomTrace Array", "Description": "Denom traces information"},
+ {"Parameter": "pagination", "Type": "PageResponse", "Description": "Pagination information in the response"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/transfer/queryEscrowAddressRequest.json b/source/json_tables/chain/ibc/transfer/queryEscrowAddressRequest.json
new file mode 100644
index 00000000..929fc40c
--- /dev/null
+++ b/source/json_tables/chain/ibc/transfer/queryEscrowAddressRequest.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "port_id", "Type": "String", "Description": "The unique port identifier", "Required": "Yes"},
+ {"Parameter": "channel_id", "Type": "String", "Description": "The unique channel identifier", "Required": "Yes"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/transfer/queryEscrowAddressResponse.json b/source/json_tables/chain/ibc/transfer/queryEscrowAddressResponse.json
new file mode 100644
index 00000000..ebab83a1
--- /dev/null
+++ b/source/json_tables/chain/ibc/transfer/queryEscrowAddressResponse.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "escrow_address", "Type": "String", "Description": "The escrow account address"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/transfer/queryTotalEscrowForDenomRequest.json b/source/json_tables/chain/ibc/transfer/queryTotalEscrowForDenomRequest.json
new file mode 100644
index 00000000..deec1dcc
--- /dev/null
+++ b/source/json_tables/chain/ibc/transfer/queryTotalEscrowForDenomRequest.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "denom", "Type": "String", "Description": "Token denom", "Required": "Yes"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/transfer/queryTotalEscrowForDenomResponse.json b/source/json_tables/chain/ibc/transfer/queryTotalEscrowForDenomResponse.json
new file mode 100644
index 00000000..e293f519
--- /dev/null
+++ b/source/json_tables/chain/ibc/transfer/queryTotalEscrowForDenomResponse.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "amount", "Type": "Coin", "Description": "Amount of token in the escrow"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/abciQueryRequest.json b/source/json_tables/chain/tendermint/abciQueryRequest.json
new file mode 100644
index 00000000..fec3c0c8
--- /dev/null
+++ b/source/json_tables/chain/tendermint/abciQueryRequest.json
@@ -0,0 +1,6 @@
+[
+ {"Parameter": "data", "Type": "Bytes", "Description": "Query data", "Required": "No"},
+ {"Parameter": "path", "Type": "String", "Description": "Query path", "Required": "Yes"},
+ {"Parameter": "haight", "Type": "Integer", "Description": "Block height", "Required": "No"},
+ {"Parameter": "prove", "Type": "Boolean", "Description": "", "Required": "No"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/abciQueryResponse.json b/source/json_tables/chain/tendermint/abciQueryResponse.json
new file mode 100644
index 00000000..f73f93c0
--- /dev/null
+++ b/source/json_tables/chain/tendermint/abciQueryResponse.json
@@ -0,0 +1,11 @@
+[
+ {"Parameter": "code", "Type": "Integer", "Description": "Query result code (zero: success, non-zero: error"},
+ {"Parameter": "log", "Type": "String", "Description": ""},
+ {"Parameter": "info", "Type": "String", "Description": ""},
+ {"Parameter": "index", "Type": "Integer", "Description": ""},
+ {"Parameter": "key", "Type": "Bytes", "Description": ""},
+ {"Parameter": "value", "Type": "Bytes", "Description": ""},
+ {"Parameter": "proof_ops", "Type": "ProofOps", "Description": ""},
+ {"Parameter": "height", "Type": "Integer", "Description": "Block height"},
+ {"Parameter": "codespace", "Type": "String", "Description": ""}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/block.json b/source/json_tables/chain/tendermint/block.json
new file mode 100644
index 00000000..f5f04ae2
--- /dev/null
+++ b/source/json_tables/chain/tendermint/block.json
@@ -0,0 +1,6 @@
+[
+ {"Parameter": "header", "Type": "Header", "Description": "Header information"},
+ {"Parameter": "data", "Type": "Data", "Description": "Block data"},
+ {"Parameter": "evidence", "Type": "EvidenceList", "Description": ""},
+ {"Parameter": "last_commit", "Type": "Commit", "Description": ""}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/blockID.json b/source/json_tables/chain/tendermint/blockID.json
new file mode 100644
index 00000000..e4a6d109
--- /dev/null
+++ b/source/json_tables/chain/tendermint/blockID.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "hash", "Type": "Bytes", "Description": "Block hash"},
+ {"Parameter": "part_set_header", "Type": "PartSetHeader", "Description": ""}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/blockIDFlag.json b/source/json_tables/chain/tendermint/blockIDFlag.json
new file mode 100644
index 00000000..614a3ad9
--- /dev/null
+++ b/source/json_tables/chain/tendermint/blockIDFlag.json
@@ -0,0 +1,6 @@
+[
+ {"Code": "0", "Name": "BLOCK_ID_FLAG_UNKNOWN"},
+ {"Code": "1", "Name": "BLOCK_ID_FLAG_ABSENT"},
+ {"Code": "2", "Name": "BLOCK_ID_FLAG_COMMIT"},
+ {"Code": "3", "Name": "BLOCK_ID_FLAG_NIL"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/commit.json b/source/json_tables/chain/tendermint/commit.json
new file mode 100644
index 00000000..6ce8184b
--- /dev/null
+++ b/source/json_tables/chain/tendermint/commit.json
@@ -0,0 +1,6 @@
+[
+ {"Parameter": "height", "Type": "Integer", "Description": "Block height"},
+ {"Parameter": "round", "Type": "Integer", "Description": "Consensus round"},
+ {"Parameter": "block_id", "Type": "BlockID", "Description": "Block identifier"},
+ {"Parameter": "signatures", "Type": "CommitSig Array", "Description": "Sigantures"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/commitSig.json b/source/json_tables/chain/tendermint/commitSig.json
new file mode 100644
index 00000000..31107bab
--- /dev/null
+++ b/source/json_tables/chain/tendermint/commitSig.json
@@ -0,0 +1,6 @@
+[
+ {"Parameter": "block_id_flag", "Type": "BlockIDFlag", "Description": "Block height"},
+ {"Parameter": "validator_address", "Type": "Bytes", "Description": "Validator address"},
+ {"Parameter": "timestamp", "Type": "Time", "Description": "Block time"},
+ {"Parameter": "signature", "Type": "Bytes", "Description": "Block signature"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/consensus.json b/source/json_tables/chain/tendermint/consensus.json
new file mode 100644
index 00000000..91a5e695
--- /dev/null
+++ b/source/json_tables/chain/tendermint/consensus.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "block", "Type": "Integer", "Description": ""},
+ {"Parameter": "app", "Type": "Integer", "Description": ""}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/data.json b/source/json_tables/chain/tendermint/data.json
new file mode 100644
index 00000000..94b278fd
--- /dev/null
+++ b/source/json_tables/chain/tendermint/data.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "txs", "Type": "Byte Array", "Description": "Txs that will be applied by state @ block.Height+1. NOTE: not all txs here are valid. We're just agreeing on the order first. This means that block.AppHash does not include these txs."}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/defaultNodeInfo.json b/source/json_tables/chain/tendermint/defaultNodeInfo.json
new file mode 100644
index 00000000..10cb5cde
--- /dev/null
+++ b/source/json_tables/chain/tendermint/defaultNodeInfo.json
@@ -0,0 +1,10 @@
+[
+ {"Parameter": "protocol_version", "Type": "ProtocolVersion", "Description": "Protocol version information"},
+ {"Parameter": "default_nod_id", "Type": "String", "Description": "Node identifier"},
+ {"Parameter": "listen_addr", "Type": "String", "Description": "URI of the node's listening endpoint"},
+ {"Parameter": "network", "Type": "String", "Description": "The chain network name"},
+ {"Parameter": "version", "Type": "String", "Description": "The version number"},
+ {"Parameter": "channels", "Type": "Bytes", "Description": "Channels information"},
+ {"Parameter": "moniker", "Type": "String", "Description": ""},
+ {"Parameter": "other", "Type": "DefaultNodeInfoOther", "Description": "Extra node information"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/defaultNodeInfoOther.json b/source/json_tables/chain/tendermint/defaultNodeInfoOther.json
new file mode 100644
index 00000000..f3b58931
--- /dev/null
+++ b/source/json_tables/chain/tendermint/defaultNodeInfoOther.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "tx_index", "Type": "String", "Description": "TX indexing status (on/off)"},
+ {"Parameter": "rpc_address", "Type": "String", "Description": "URI for RPC connections"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/evidence.json b/source/json_tables/chain/tendermint/evidence.json
new file mode 100644
index 00000000..55055422
--- /dev/null
+++ b/source/json_tables/chain/tendermint/evidence.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "sum", "Type": "isEvidence_Sum", "Description": "Valid types for 'sum' are Evidence_DuplicateVoteEvidence and Evidence_LightClientAttackEvidence"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/evidenceList.json b/source/json_tables/chain/tendermint/evidenceList.json
new file mode 100644
index 00000000..19e28976
--- /dev/null
+++ b/source/json_tables/chain/tendermint/evidenceList.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "evidence", "Type": "Evidence Array", "Description": "Block evidence"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/getBlockByHeightRequest.json b/source/json_tables/chain/tendermint/getBlockByHeightRequest.json
new file mode 100644
index 00000000..4bde65be
--- /dev/null
+++ b/source/json_tables/chain/tendermint/getBlockByHeightRequest.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "height", "Type": "Integer", "Description": "Block height", "Required": "Yes"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/getBlockByHeightResponse.json b/source/json_tables/chain/tendermint/getBlockByHeightResponse.json
new file mode 100644
index 00000000..518ddbeb
--- /dev/null
+++ b/source/json_tables/chain/tendermint/getBlockByHeightResponse.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "block_id", "Type": "BlockID", "Description": "Block identifier"},
+ {"Parameter": "sdk_block", "Type": "Block", "Description": "Block details"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/getLatestBlockResponse.json b/source/json_tables/chain/tendermint/getLatestBlockResponse.json
new file mode 100644
index 00000000..518ddbeb
--- /dev/null
+++ b/source/json_tables/chain/tendermint/getLatestBlockResponse.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "block_id", "Type": "BlockID", "Description": "Block identifier"},
+ {"Parameter": "sdk_block", "Type": "Block", "Description": "Block details"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/getLatestValidatorSetResponse.json b/source/json_tables/chain/tendermint/getLatestValidatorSetResponse.json
new file mode 100644
index 00000000..45dbe73d
--- /dev/null
+++ b/source/json_tables/chain/tendermint/getLatestValidatorSetResponse.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "block_height", "Type": "Integer", "Description": "Block height"},
+ {"Parameter": "validators", "Type": "Validator Array", "Description": "List of validators"},
+ {"Parameter": "pagination", "Type": "PageResponse", "Description": "Pagination information in the response"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/getNodeInfoResponse.json b/source/json_tables/chain/tendermint/getNodeInfoResponse.json
new file mode 100644
index 00000000..8bbba07b
--- /dev/null
+++ b/source/json_tables/chain/tendermint/getNodeInfoResponse.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "default_node_info", "Type": "DefaultNodeInfo", "Description": "Node information"},
+ {"Parameter": "application_version", "Type": "VersionInfo", "Description": "Node version information"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/getSyncingResponse.json b/source/json_tables/chain/tendermint/getSyncingResponse.json
new file mode 100644
index 00000000..e27b5544
--- /dev/null
+++ b/source/json_tables/chain/tendermint/getSyncingResponse.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "syncing", "Type": "Boolean", "Description": "Syncing status"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/getValidatorSetByHeightRequest.json b/source/json_tables/chain/tendermint/getValidatorSetByHeightRequest.json
new file mode 100644
index 00000000..25dba463
--- /dev/null
+++ b/source/json_tables/chain/tendermint/getValidatorSetByHeightRequest.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "height", "Type": "Integer", "Description": "Block height", "Required": "Yes"},
+ {"Parameter": "pagination", "Type": "PageRequest", "Description": "The optional pagination for the request", "Required": "No"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/getValidatorSetByHeightResponse.json b/source/json_tables/chain/tendermint/getValidatorSetByHeightResponse.json
new file mode 100644
index 00000000..45dbe73d
--- /dev/null
+++ b/source/json_tables/chain/tendermint/getValidatorSetByHeightResponse.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "block_height", "Type": "Integer", "Description": "Block height"},
+ {"Parameter": "validators", "Type": "Validator Array", "Description": "List of validators"},
+ {"Parameter": "pagination", "Type": "PageResponse", "Description": "Pagination information in the response"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/header.json b/source/json_tables/chain/tendermint/header.json
new file mode 100644
index 00000000..b1a3bcc3
--- /dev/null
+++ b/source/json_tables/chain/tendermint/header.json
@@ -0,0 +1,16 @@
+[
+ {"Parameter": "version", "Type": "Consensus", "Description": ""},
+ {"Parameter": "chain_id", "Type": "String", "Description": "Chain identifier"},
+ {"Parameter": "height", "Type": "Integer", "Description": "Block height"},
+ {"Parameter": "time", "Type": "Time", "Description": "Block time"},
+ {"Parameter": "last_block_id", "Type": "BlockID", "Description": "Previous block identifier"},
+ {"Parameter": "last_commit_hash", "Type": "Bytes", "Description": "Last commit hash"},
+ {"Parameter": "data_hash", "Type": "Bytes", "Description": "Block data hash"},
+ {"Parameter": "validators_hash", "Type": "Bytes", "Description": "Validators information hash"},
+ {"Parameter": "next_validators_hash", "Type": "Bytes", "Description": "Validators information hash"},
+ {"Parameter": "consensus_hash", "Type": "Bytes", "Description": "Consensus information hash"},
+ {"Parameter": "app_hash", "Type": "Bytes", "Description": "Application hash"},
+ {"Parameter": "last_result_hash", "Type": "Bytes", "Description": "Last result hash"},
+ {"Parameter": "evidence_hash", "Type": "Bytes", "Description": "Evidence data hash"},
+ {"Parameter": "proposer_address", "Type": "String", "Description": "Block proposer's address"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/module.json b/source/json_tables/chain/tendermint/module.json
new file mode 100644
index 00000000..c172e38b
--- /dev/null
+++ b/source/json_tables/chain/tendermint/module.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "path", "Type": "String", "Description": "Module path"},
+ {"Parameter": "version", "Type": "String", "Description": "Module version"},
+ {"Parameter": "sum", "Type": "String", "Description": "Checksum"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/partSetHeader.json b/source/json_tables/chain/tendermint/partSetHeader.json
new file mode 100644
index 00000000..5d363ecb
--- /dev/null
+++ b/source/json_tables/chain/tendermint/partSetHeader.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "total", "Type": "Integer", "Description": ""},
+ {"Parameter": "hash", "Type": "Bytes", "Description": ""}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/proofOp.json b/source/json_tables/chain/tendermint/proofOp.json
new file mode 100644
index 00000000..74f049f3
--- /dev/null
+++ b/source/json_tables/chain/tendermint/proofOp.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "type", "Type": "String", "Description": ""},
+ {"Parameter": "key", "Type": "Bytes", "Description": ""},
+ {"Parameter": "data", "Type": "Bytes", "Description": ""}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/proofOps.json b/source/json_tables/chain/tendermint/proofOps.json
new file mode 100644
index 00000000..7ca18025
--- /dev/null
+++ b/source/json_tables/chain/tendermint/proofOps.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "ops", "Type": "ProofOp Array", "Description": ""}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/protocolVersion.json b/source/json_tables/chain/tendermint/protocolVersion.json
new file mode 100644
index 00000000..b7a88458
--- /dev/null
+++ b/source/json_tables/chain/tendermint/protocolVersion.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "p2p", "Type": "Integer", "Description": ""},
+ {"Parameter": "block", "Type": "Integer", "Description": ""},
+ {"Parameter": "app", "Type": "Integer", "Description": ""}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/validator.json b/source/json_tables/chain/tendermint/validator.json
new file mode 100644
index 00000000..bbc221a7
--- /dev/null
+++ b/source/json_tables/chain/tendermint/validator.json
@@ -0,0 +1,6 @@
+[
+ {"Parameter": "address", "Type": "String", "Description": "Validator's address"},
+ {"Parameter": "pub_key", "Type": "Any", "Description": "Validator's public key"},
+ {"Parameter": "voting_power", "Type": "Integer", "Description": "Validator's voting power"},
+ {"Parameter": "proposer_priority", "Type": "Integer", "Description": ""}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/tendermint/versionInfo.json b/source/json_tables/chain/tendermint/versionInfo.json
new file mode 100644
index 00000000..7cca363a
--- /dev/null
+++ b/source/json_tables/chain/tendermint/versionInfo.json
@@ -0,0 +1,10 @@
+[
+ {"Parameter": "name", "Type": "String", "Description": "The chain name"},
+ {"Parameter": "app_name", "Type": "String", "Description": "Application name"},
+ {"Parameter": "version", "Type": "String", "Description": "Application version"},
+ {"Parameter": "git_commit", "Type": "String", "Description": "Git commit hash"},
+ {"Parameter": "build_tags", "Type": "String", "Description": "Application build tags"},
+ {"Parameter": "go_version", "Type": "String", "Description": "GoLang version used to compile the application"},
+ {"Parameter": "build_deps", "Type": "Module Array", "Description": "Application dependencies"},
+ {"Parameter": "cosmos_sdk_version", "Type": "String", "Description": "Cosmos SDK version used by the application"}
+]
\ No newline at end of file