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..642a2444 100644
--- a/source/includes/_changelog.md
+++ b/source/includes/_changelog.md
@@ -1,5 +1,14 @@
# 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
+ - Added support for all queries from the `IBC core connection` 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..15862851
--- /dev/null
+++ b/source/includes/_ibccorechannel.md
@@ -0,0 +1,2546 @@
+# - 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 |
---|
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 |
+
+
+
+
+**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/_ibccoreconnection.md b/source/includes/_ibccoreconnection.md
new file mode 100644
index 00000000..1846e72b
--- /dev/null
+++ b/source/includes/_ibccoreconnection.md
@@ -0,0 +1,1210 @@
+# - IBC Core Connection
+
+Includes all the messages and queries associated to connections from the IBC core connection module
+
+## Connection
+
+Queries an IBC 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.core.network import Network
+
+
+async def main() -> None:
+ network = Network.testnet()
+ client = AsyncClient(network)
+
+ connection_id = "connection-0"
+
+ connection = await client.fetch_ibc_connection(connection_id=connection_id)
+ print(connection)
+
+
+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)
+ }
+
+ connectionId := "connection-0"
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCConnection(ctx, connectionId)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
connection_id | String | Connection unique identifier | Yes |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "connection":{
+ "clientId":"07-tendermint-0",
+ "versions":[
+ {
+ "identifier":"1",
+ "features":[
+ "ORDER_ORDERED",
+ "ORDER_UNORDERED"
+ ]
+ }
+ ],
+ "state":"STATE_OPEN",
+ "counterparty":{
+ "clientId":"07-tendermint-904",
+ "connectionId":"connection-877",
+ "prefix":{
+ "keyPrefix":"aWJj"
+ }
+ },
+ "delayPeriod":"0"
+ },
+ "proofHeight":{
+ "revisionNumber":"888",
+ "revisionHeight":"27778433"
+ },
+ "proof":""
+}
+```
+
+
+Parameter | Type | Description |
---|
connection | ConnectionEnd | Connection associated with the request identifier |
+proof | Byte Array | Merkle proof of existence |
+proof_height | Height | Height at which the proof was retrieved |
+
+
+
+
+**ConnectionEnd**
+
+
+Parameter | Type | Description |
---|
client_id | String | Client associated with this connection |
+versions | Version String | Channel identifier |
+state | State | Current state of the connection end |
+counterparty | Counterparty | Counterparty chain associated with this connection |
+delay_period | Integer | Delay period that must pass before a consensus state can be used for packet-verification NOTE: delay period logic is only implemented by some clients |
+
+
+
+
+**Version**
+
+
+Parameter | Type | Description |
---|
identifier | String | Unique version identifier |
+features | String Array | List of features compatible with the specified identifier |
+
+
+
+
+**State**
+
+
+Code | Name |
---|
0 | STATE_UNINITIALIZED_UNSPECIFIED |
+1 | STATE_INIT |
+2 | STATE_TRYOPEN |
+3 | STATE_OPEN |
+
+
+
+
+**Counterparty**
+
+
+Parameter | Type | Description |
---|
client_id | String | Identifies the client on the counterparty chain associated with a given connection |
+connection_id | String | Identifies the connection end on the counterparty chain associated with a given connection |
+prefix | MarketPrefix | Commitment merkle prefix of the counterparty chain |
+
+
+
+
+**MerklePrefix**
+
+
+Parameter | Type | Description |
---|
key_prefix | Byte Array | Merkle path prefixed to the key |
+
+
+
+
+**Height**
+
+
+Parameter | Type | Description |
---|
revision_number | Integer | The revision that the client is currently on |
+revision_height | Integer | The height within the given revision |
+
+
+
+## Connections
+
+Queries all the IBC connections 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)
+
+ connections = await client.fetch_ibc_connections(pagination=pagination)
+ print(connections)
+
+
+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.FetchIBCConnections(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
+{
+ "connections":[
+ {
+ "id":"connection-10",
+ "clientId":"07-tendermint-12",
+ "versions":[
+ {
+ "identifier":"1",
+ "features":[
+ "ORDER_ORDERED",
+ "ORDER_UNORDERED"
+ ]
+ }
+ ],
+ "state":"STATE_OPEN",
+ "counterparty":{
+ "clientId":"07-tendermint-103",
+ "connectionId":"connection-93",
+ "prefix":{
+ "keyPrefix":"aWJj"
+ }
+ },
+ "delayPeriod":"0"
+ },
+ {
+ "id":"connection-100",
+ "clientId":"07-tendermint-126",
+ "versions":[
+ {
+ "identifier":"1",
+ "features":[
+ "ORDER_ORDERED",
+ "ORDER_UNORDERED"
+ ]
+ }
+ ],
+ "state":"STATE_OPEN",
+ "counterparty":{
+ "clientId":"07-tendermint-168",
+ "connectionId":"connection-118",
+ "prefix":{
+ "keyPrefix":"aWJj"
+ }
+ },
+ "delayPeriod":"0"
+ },
+ {
+ "id":"connection-101",
+ "clientId":"07-tendermint-127",
+ "versions":[
+ {
+ "identifier":"1",
+ "features":[
+ "ORDER_ORDERED",
+ "ORDER_UNORDERED"
+ ]
+ }
+ ],
+ "state":"STATE_OPEN",
+ "counterparty":{
+ "clientId":"07-tendermint-3",
+ "connectionId":"connection-5",
+ "prefix":{
+ "keyPrefix":"aWJj"
+ }
+ },
+ "delayPeriod":"0"
+ },
+ {
+ "id":"connection-102",
+ "clientId":"07-tendermint-128",
+ "versions":[
+ {
+ "identifier":"1",
+ "features":[
+ "ORDER_ORDERED",
+ "ORDER_UNORDERED"
+ ]
+ }
+ ],
+ "state":"STATE_OPEN",
+ "counterparty":{
+ "clientId":"07-tendermint-633",
+ "connectionId":"connection-574",
+ "prefix":{
+ "keyPrefix":"aWJj"
+ }
+ },
+ "delayPeriod":"0"
+ }
+ ],
+ "pagination":{
+ "nextKey":"L2Nvbm5lY3Rpb24tMTAz",
+ "total":"0"
+ },
+ "height":{
+ "revisionNumber":"888",
+ "revisionHeight":"27779944"
+ }
+}
+```
+
+
+Parameter | Type | Description |
---|
connections | IdentifiedConnection Array | Connection associated with the request identifier |
+pagination | PageResponse | Pagination information in the response |
+height | Height | Query block height |
+
+
+
+
+**IdentifiedConnection**
+
+
+Parameter | Type | Description |
---|
id | String | Connection identifier |
+client_id | String | Client associated with this connection |
+versions | Version String | IBC version which can be utilised to determine encodings or protocols for channels or packets utilising this connection |
+state | State | Current state of the connection end |
+counterparty | Counterparty | Counterparty chain associated with this connection |
+delay_period | Integer | Delay period associated with this connection |
+
+
+
+
+**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 |
+
+
+
+
+**Version**
+
+
+Parameter | Type | Description |
---|
identifier | String | Unique version identifier |
+features | String Array | List of features compatible with the specified identifier |
+
+
+
+
+**State**
+
+
+Code | Name |
---|
0 | STATE_UNINITIALIZED_UNSPECIFIED |
+1 | STATE_INIT |
+2 | STATE_TRYOPEN |
+3 | STATE_OPEN |
+
+
+
+
+**Counterparty**
+
+
+Parameter | Type | Description |
---|
client_id | String | Identifies the client on the counterparty chain associated with a given connection |
+connection_id | String | Identifies the connection end on the counterparty chain associated with a given connection |
+prefix | MarketPrefix | Commitment merkle prefix of the counterparty chain |
+
+
+
+
+**MerklePrefix**
+
+
+Parameter | Type | Description |
---|
key_prefix | Byte Array | Merkle path prefixed to the key |
+
+
+
+## ClientConnections
+
+Queries the connection paths associated with a client 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)
+
+ client_id = "07-tendermint-0"
+
+ connections = await client.fetch_ibc_client_connections(client_id=client_id)
+ print(connections)
+
+
+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.FetchIBCClientConnections(ctx, clientId)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
client_id | String | Client identifier associated with a connection | Yes |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "connectionPaths":[
+ "connection-0"
+ ],
+ "proofHeight":{
+ "revisionNumber":"888",
+ "revisionHeight":"27783349"
+ },
+ "proof":""
+}
+```
+
+
+Parameter | Type | Description |
---|
connection_paths | String Array | All the connection paths associated with a client |
+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 |
+
+
+
+## ConnectionClientState
+
+Queries the client state associated with the connection
+
+**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)
+
+ connection_id = "connection-0"
+
+ state = await client.fetch_ibc_connection_client_state(connection_id=connection_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)
+ }
+
+ connectionId := "connection-0"
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCConnectionClientState(ctx, connectionId)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ fmt.Print(res)
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
connection_id | String | Connection identifier | Yes |
+
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "identifiedClientState":{
+ "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
+ }
+ },
+ "proofHeight":{
+ "revisionNumber":"888",
+ "revisionHeight":"27783852"
+ },
+ "proof":""
+}
+```
+
+
+Parameter | Type | Description |
---|
identified_client_state | IdentifiedClientState | Client state associated with the channel |
+proof | Byte Array | Merkle proof of existence |
+proof_height | Height | Height at which the proof was retrieved |
+
+
+
+
+**IdentifiedClientState**
+
+
+Parameter | Type | Description |
---|
client_id | String | Client identifier |
+client_state | Any | Client 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 |
+
+
+
+## ConnectionConsensusState
+
+Queries the consensus state associated with the connection
+
+**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)
+
+ connection_id = "connection-0"
+ revision_number = 0
+ revision_height = 7379538
+
+ state = await client.fetch_ibc_connection_consensus_state(
+ connection_id=connection_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)
+ }
+
+ connectionId := "connection-0"
+ revisionNumber := uint64(0)
+ revisionHeight := uint64(7379538)
+
+ ctx := context.Background()
+
+ res, err := chainClient.FetchIBCConnectionConsensusState(ctx, connectionId, revisionNumber, revisionHeight)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ fmt.Print(res)
+
+}
+```
+
+
+
+Parameter | Type | Description | Required |
---|
connection_id | String | Connection 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":"2022-07-04T10:34:53.874345276Z",
+ "root":{
+ "hash":"viI6JuzZ/kOAh6jIeecglN7Xt+mGQT/PpvAGqGLcVmM="
+ },
+ "nextValidatorsHash":"olPEfP4dzPCC07Oyg/3+6U5/uumw/HmELk2MwpMogSg="
+ },
+ "clientId":"07-tendermint-0",
+ "proofHeight":{
+ "revisionNumber":"888",
+ "revisionHeight":"27784841"
+ },
+ "proof":""
+}
+```
+
+
+Parameter | Type | Description |
---|
consensus_state | Any | Consensus state associated with the channel |
+client_id | String | Client identifier 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 |
+
+
+
+## ConnectionParams
+
+Queries all parameters of the ibc connection 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_connection_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.FetchIBCConnectionParams(ctx)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ str, _ := json.MarshalIndent(res, "", " ")
+ fmt.Print(string(str))
+
+}
+```
+
+
+No parameters
+
+### Response Parameters
+> Response Example:
+
+``` json
+{
+ "params":{
+ "maxExpectedTimePerBlock":"30000000000"
+ }
+}
+```
+
+
+Parameter | Type | Description |
---|
params | Params | Module's parameters |
+
+
+
+
+**Params**
+
+
+Parameter | Type | Description |
---|
max_expected_time_per_block | Integer | Maximum expected time per block (in nanoseconds), used to enforce block delay. This parameter should reflect the largest amount of time that the chain might reasonably take to produce the next block under normal operating conditions. A safe choice is 3-5x the expected time per block |
+
\ 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..4d145877 100644
--- a/source/index.html.md
+++ b/source/index.html.md
@@ -36,9 +36,14 @@ includes:
- derivatives
- spot
- binaryoptions
+ - ibccorechannel
+ - ibccoreclient
+ - ibccoreconnection
+ - ibctransfer
- insurance
- oracle
- staking
+ - tendermint
- tokenfactory
- wasm
- wasmx
@@ -46,7 +51,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/connection/connectionEnd.json b/source/json_tables/chain/ibc/core/connection/connectionEnd.json
new file mode 100644
index 00000000..5bc39a50
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/connection/connectionEnd.json
@@ -0,0 +1,7 @@
+[
+ {"Parameter": "client_id", "Type": "String", "Description": "Client associated with this connection"},
+ {"Parameter": "versions", "Type": "Version String", "Description": "Channel identifier"},
+ {"Parameter": "state", "Type": "State", "Description": "Current state of the connection end"},
+ {"Parameter": "counterparty", "Type": "Counterparty", "Description": "Counterparty chain associated with this connection"},
+ {"Parameter": "delay_period", "Type": "Integer", "Description": "Delay period that must pass before a consensus state can be used for packet-verification NOTE: delay period logic is only implemented by some clients"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/connection/counterparty.json b/source/json_tables/chain/ibc/core/connection/counterparty.json
new file mode 100644
index 00000000..9d723d69
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/connection/counterparty.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "client_id", "Type": "String", "Description": "Identifies the client on the counterparty chain associated with a given connection"},
+ {"Parameter": "connection_id", "Type": "String", "Description": "Identifies the connection end on the counterparty chain associated with a given connection"},
+ {"Parameter": "prefix", "Type": "MarketPrefix", "Description": "Commitment merkle prefix of the counterparty chain"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/connection/identifiedConnection.json b/source/json_tables/chain/ibc/core/connection/identifiedConnection.json
new file mode 100644
index 00000000..d78ec642
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/connection/identifiedConnection.json
@@ -0,0 +1,8 @@
+[
+ {"Parameter": "id", "Type": "String", "Description": "Connection identifier"},
+ {"Parameter": "client_id", "Type": "String", "Description": "Client associated with this connection"},
+ {"Parameter": "versions", "Type": "Version String", "Description": "IBC version which can be utilised to determine encodings or protocols for channels or packets utilising this connection"},
+ {"Parameter": "state", "Type": "State", "Description": "Current state of the connection end"},
+ {"Parameter": "counterparty", "Type": "Counterparty", "Description": "Counterparty chain associated with this connection"},
+ {"Parameter": "delay_period", "Type": "Integer", "Description": "Delay period associated with this connection"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/connection/params.json b/source/json_tables/chain/ibc/core/connection/params.json
new file mode 100644
index 00000000..1f4f0a82
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/connection/params.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "max_expected_time_per_block", "Type": "Integer", "Description": "Maximum expected time per block (in nanoseconds), used to enforce block delay. This parameter should reflect the largest amount of time that the chain might reasonably take to produce the next block under normal operating conditions. A safe choice is 3-5x the expected time per block"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/connection/queryClientConnectionsRequest.json b/source/json_tables/chain/ibc/core/connection/queryClientConnectionsRequest.json
new file mode 100644
index 00000000..a57b0d25
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/connection/queryClientConnectionsRequest.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "client_id", "Type": "String", "Description": "Client identifier associated with a connection", "Required": "Yes"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/connection/queryClientConnectionsResponse.json b/source/json_tables/chain/ibc/core/connection/queryClientConnectionsResponse.json
new file mode 100644
index 00000000..3706bffb
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/connection/queryClientConnectionsResponse.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "connection_paths", "Type": "String Array", "Description": "All the connection paths associated with a client"},
+ {"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/connection/queryConnectionClientStateRequest.json b/source/json_tables/chain/ibc/core/connection/queryConnectionClientStateRequest.json
new file mode 100644
index 00000000..607bb7a4
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/connection/queryConnectionClientStateRequest.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "connection_id", "Type": "String", "Description": "Connection identifier", "Required": "Yes"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/connection/queryConnectionClientStateResponse.json b/source/json_tables/chain/ibc/core/connection/queryConnectionClientStateResponse.json
new file mode 100644
index 00000000..84cfd56f
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/connection/queryConnectionClientStateResponse.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "identified_client_state", "Type": "IdentifiedClientState", "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/connection/queryConnectionConsensusStateRequest.json b/source/json_tables/chain/ibc/core/connection/queryConnectionConsensusStateRequest.json
new file mode 100644
index 00000000..dae3ecd6
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/connection/queryConnectionConsensusStateRequest.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "connection_id", "Type": "String", "Description": "Connection 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/connection/queryConnectionConsensusStateResponse.json b/source/json_tables/chain/ibc/core/connection/queryConnectionConsensusStateResponse.json
new file mode 100644
index 00000000..906bb992
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/connection/queryConnectionConsensusStateResponse.json
@@ -0,0 +1,6 @@
+[
+ {"Parameter": "consensus_state", "Type": "Any", "Description": "Consensus state associated with the channel"},
+ {"Parameter": "client_id", "Type": "String", "Description": "Client identifier 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/connection/queryConnectionParamsResponse.json b/source/json_tables/chain/ibc/core/connection/queryConnectionParamsResponse.json
new file mode 100644
index 00000000..2271813c
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/connection/queryConnectionParamsResponse.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/connection/queryConnectionRequest.json b/source/json_tables/chain/ibc/core/connection/queryConnectionRequest.json
new file mode 100644
index 00000000..7955649f
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/connection/queryConnectionRequest.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "connection_id", "Type": "String", "Description": "Connection unique identifier", "Required": "Yes"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/connection/queryConnectionResponse.json b/source/json_tables/chain/ibc/core/connection/queryConnectionResponse.json
new file mode 100644
index 00000000..ca2ed149
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/connection/queryConnectionResponse.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "connection", "Type": "ConnectionEnd", "Description": "Connection 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/connection/queryConnectionsRequest.json b/source/json_tables/chain/ibc/core/connection/queryConnectionsRequest.json
new file mode 100644
index 00000000..9da294d1
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/connection/queryConnectionsRequest.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/connection/queryConnectionsResponse.json b/source/json_tables/chain/ibc/core/connection/queryConnectionsResponse.json
new file mode 100644
index 00000000..c0ddbb07
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/connection/queryConnectionsResponse.json
@@ -0,0 +1,5 @@
+[
+ {"Parameter": "connections", "Type": "IdentifiedConnection Array", "Description": "Connection associated with the request identifier"},
+ {"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/connection/state.json b/source/json_tables/chain/ibc/core/connection/state.json
new file mode 100644
index 00000000..e9130dde
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/connection/state.json
@@ -0,0 +1,6 @@
+[
+ {"Code": "0", "Name": "STATE_UNINITIALIZED_UNSPECIFIED"},
+ {"Code": "1", "Name": "STATE_INIT"},
+ {"Code": "2", "Name": "STATE_TRYOPEN"},
+ {"Code": "3", "Name": "STATE_OPEN"}
+]
\ No newline at end of file
diff --git a/source/json_tables/chain/ibc/core/connection/version.json b/source/json_tables/chain/ibc/core/connection/version.json
new file mode 100644
index 00000000..e0564e4d
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/connection/version.json
@@ -0,0 +1,4 @@
+[
+ {"Parameter": "identifier", "Type": "String", "Description": "Unique version identifier"},
+ {"Parameter": "features", "Type": "String Array", "Description": "List of features compatible with the specified 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/core/merklePrefix.json b/source/json_tables/chain/ibc/core/merklePrefix.json
new file mode 100644
index 00000000..04744293
--- /dev/null
+++ b/source/json_tables/chain/ibc/core/merklePrefix.json
@@ -0,0 +1,3 @@
+[
+ {"Parameter": "key_prefix", "Type": "Byte Array", "Description": "Merkle path prefixed to the key"}
+]
\ 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