diff --git a/source/includes/_account.md b/source/includes/_account.md index e0fa3117..30d4afac 100644 --- a/source/includes/_account.md +++ b/source/includes/_account.md @@ -194,6 +194,7 @@ func main() {
+ **Coin** @@ -225,6 +226,7 @@ gas fee: 0.0000660495 INJ
+ **TxResponse** @@ -244,6 +246,7 @@ gas fee: 0.0000660495 INJ
+ **ABCIMessageLog** @@ -253,6 +256,7 @@ gas fee: 0.0000660495 INJ
+ **Event** @@ -261,6 +265,7 @@ gas fee: 0.0000660495 INJ
+ **StringEvent** @@ -269,6 +274,7 @@ gas fee: 0.0000660495 INJ
+ **EventAttribute** @@ -278,6 +284,7 @@ gas fee: 0.0000660495 INJ
+ **Attribute** @@ -475,6 +482,7 @@ func main() {
+ **Coin** @@ -506,6 +514,7 @@ gas fee: 0.000064803 INJ
+ **TxResponse** @@ -525,6 +534,7 @@ gas fee: 0.000064803 INJ
+ **ABCIMessageLog** @@ -534,6 +544,7 @@ gas fee: 0.000064803 INJ
+ **Event** @@ -542,6 +553,7 @@ gas fee: 0.000064803 INJ
+ **StringEvent** @@ -550,6 +562,7 @@ gas fee: 0.000064803 INJ
+ **EventAttribute** @@ -559,6 +572,7 @@ gas fee: 0.000064803 INJ
+ **Attribute** @@ -766,6 +780,7 @@ func main() {
+ **Coin** @@ -797,6 +812,7 @@ gas fee: 0.0000610515 INJ
+ **TxResponse** @@ -816,6 +832,7 @@ gas fee: 0.0000610515 INJ
+ **ABCIMessageLog** @@ -825,6 +842,7 @@ gas fee: 0.0000610515 INJ
+ **Event** @@ -833,6 +851,7 @@ gas fee: 0.0000610515 INJ
+ **StringEvent** @@ -841,6 +860,7 @@ gas fee: 0.0000610515 INJ
+ **EventAttribute** @@ -850,6 +870,7 @@ gas fee: 0.0000610515 INJ
+ **Attribute** @@ -1057,6 +1078,7 @@ func main() {
+ **Coin** @@ -1088,6 +1110,7 @@ gas fee: 0.0000611985 INJ
+ **TxResponse** @@ -1107,6 +1130,7 @@ gas fee: 0.0000611985 INJ
+ **ABCIMessageLog** @@ -1116,6 +1140,7 @@ gas fee: 0.0000611985 INJ
+ **Event** @@ -1124,6 +1149,7 @@ gas fee: 0.0000611985 INJ
+ **StringEvent** @@ -1132,6 +1158,7 @@ gas fee: 0.0000611985 INJ
+ **EventAttribute** @@ -1141,6 +1168,7 @@ gas fee: 0.0000611985 INJ
+ **Attribute** diff --git a/source/includes/_binaryoptions.md b/source/includes/_binaryoptions.md index 09a50208..fdf8a92a 100644 --- a/source/includes/_binaryoptions.md +++ b/source/includes/_binaryoptions.md @@ -133,6 +133,7 @@ func main() {
+ **BinaryOptionsMarket** @@ -156,6 +157,7 @@ func main() {
+ **OracleType** @@ -378,6 +380,7 @@ func main() {
+ **OracleType** @@ -407,6 +410,7 @@ func main() {
+ **TxResponse** @@ -426,6 +430,7 @@ func main() {
+ **ABCIMessageLog** @@ -435,6 +440,7 @@ func main() {
+ **Event** @@ -443,6 +449,7 @@ func main() {
+ **StringEvent** @@ -451,6 +458,7 @@ func main() {
+ **EventAttribute** @@ -460,6 +468,7 @@ func main() {
+ **Attribute** @@ -591,6 +600,7 @@ if __name__ == "__main__":
+ **DerivativeOrder** @@ -602,6 +612,7 @@ if __name__ == "__main__":
+ **OrderInfo** @@ -613,6 +624,7 @@ if __name__ == "__main__":
+ **OrderType** @@ -653,6 +665,7 @@ gas fee: 0.0000606245 INJ
+ **TxResponse** @@ -672,6 +685,7 @@ gas fee: 0.0000606245 INJ
+ **ABCIMessageLog** @@ -681,6 +695,7 @@ gas fee: 0.0000606245 INJ
+ **Event** @@ -689,6 +704,7 @@ gas fee: 0.0000606245 INJ
+ **StringEvent** @@ -697,6 +713,7 @@ gas fee: 0.0000606245 INJ
+ **EventAttribute** @@ -706,6 +723,7 @@ gas fee: 0.0000606245 INJ
+ **Attribute** @@ -832,6 +850,7 @@ if __name__ == "__main__":
+ **DerivativeOrder** @@ -843,6 +862,7 @@ if __name__ == "__main__":
+ **OrderInfo** @@ -854,6 +874,7 @@ if __name__ == "__main__":
+ **OrderType** @@ -894,6 +915,7 @@ gas fee: 0.0000539515 INJ
+ **TxResponse** @@ -913,6 +935,7 @@ gas fee: 0.0000539515 INJ
+ **ABCIMessageLog** @@ -922,6 +945,7 @@ gas fee: 0.0000539515 INJ
+ **Event** @@ -930,6 +954,7 @@ gas fee: 0.0000539515 INJ
+ **StringEvent** @@ -938,6 +963,7 @@ gas fee: 0.0000539515 INJ
+ **EventAttribute** @@ -947,6 +973,7 @@ gas fee: 0.0000539515 INJ
+ **Attribute** @@ -1066,6 +1093,7 @@ if __name__ == "__main__":
+ **OrderMask** @@ -1100,6 +1128,7 @@ gas fee: 0.0000556515 INJ
+ **TxResponse** @@ -1119,6 +1148,7 @@ gas fee: 0.0000556515 INJ
+ **ABCIMessageLog** @@ -1128,6 +1158,7 @@ gas fee: 0.0000556515 INJ
+ **Event** @@ -1136,6 +1167,7 @@ gas fee: 0.0000556515 INJ
+ **StringEvent** @@ -1144,6 +1176,7 @@ gas fee: 0.0000556515 INJ
+ **EventAttribute** @@ -1153,6 +1186,7 @@ gas fee: 0.0000556515 INJ
+ **Attribute** @@ -1281,6 +1315,7 @@ if __name__ == "__main__":
+ **MarketStatus** @@ -1312,6 +1347,7 @@ gas fee: 0.0000556515 INJ
+ **TxResponse** @@ -1331,6 +1367,7 @@ gas fee: 0.0000556515 INJ
+ **ABCIMessageLog** @@ -1340,6 +1377,7 @@ gas fee: 0.0000556515 INJ
+ **Event** @@ -1348,6 +1386,7 @@ gas fee: 0.0000556515 INJ
+ **StringEvent** @@ -1356,6 +1395,7 @@ gas fee: 0.0000556515 INJ
+ **EventAttribute** @@ -1365,6 +1405,7 @@ gas fee: 0.0000556515 INJ
+ **Attribute** @@ -1748,6 +1789,7 @@ func main() {
+ **OrderData** @@ -1759,6 +1801,7 @@ func main() {
+ **SpotOrder** @@ -1769,6 +1812,7 @@ func main() {
+ **DerivativeOrder** @@ -1780,6 +1824,7 @@ func main() {
+ **OrderMask** @@ -1794,6 +1839,7 @@ func main() {
+ **OrderInfo** @@ -1805,6 +1851,7 @@ func main() {
+ **OrderType** @@ -1858,6 +1905,7 @@ gas fee: 0.000329546 INJ
+ **TxResponse** @@ -1877,6 +1925,7 @@ gas fee: 0.000329546 INJ
+ **ABCIMessageLog** @@ -1886,6 +1935,7 @@ gas fee: 0.000329546 INJ
+ **Event** @@ -1894,6 +1944,7 @@ gas fee: 0.000329546 INJ
+ **StringEvent** @@ -1902,6 +1953,7 @@ gas fee: 0.000329546 INJ
+ **EventAttribute** @@ -1911,6 +1963,7 @@ gas fee: 0.000329546 INJ
+ **Attribute** diff --git a/source/includes/_chainexchange.md b/source/includes/_chainexchange.md index 02a2c26f..0dd1d07f 100644 --- a/source/includes/_chainexchange.md +++ b/source/includes/_chainexchange.md @@ -133,6 +133,7 @@ func main() {
+ **Subaccount** @@ -183,6 +184,7 @@ func main() {
+ **Deposit** @@ -339,6 +341,7 @@ func main() {
+ **Deposit** @@ -478,6 +481,7 @@ No parameters
+ **Balance** @@ -487,6 +491,7 @@ No parameters
+ **Deposit** @@ -671,6 +676,7 @@ func main() {
+ **MarketVolume** @@ -679,6 +685,7 @@ func main() {
+ **VolumeRecord** @@ -856,6 +863,7 @@ func main() {
+ **AggregateAccountVolumeRecord** @@ -864,6 +872,7 @@ func main() {
+ **MarketVolume** @@ -872,6 +881,7 @@ func main() {
+ **VolumeRecord** @@ -1014,6 +1024,7 @@ func main() {
+ **VolumeRecord** @@ -1161,6 +1172,7 @@ func main() {
+ **MarketVolume** @@ -1169,6 +1181,7 @@ func main() {
+ **VolumeRecord** @@ -1444,6 +1457,7 @@ func main() {
+ **DenomDecimals** @@ -1607,6 +1621,7 @@ func main() {
+ **SubaccountOrderData** @@ -1615,6 +1630,7 @@ func main() {
+ **SubaccountOrder** @@ -1940,6 +1956,7 @@ func main() {
+ **SubaccountOrderbookMetadataWithMarket** @@ -1949,6 +1966,7 @@ func main() {
+ **SubaccountOrderbookMetadata** @@ -2403,6 +2421,7 @@ No parameters
+ **TradingRewardCampaignInfo** @@ -2413,6 +2432,7 @@ No parameters
+ **CampaignRewardPool** @@ -2421,6 +2441,7 @@ No parameters
+ **TradingRewardCampaignBoostInfo** @@ -2431,6 +2452,7 @@ No parameters
+ **PointsMultiplier** @@ -2588,6 +2610,7 @@ func main() {
+ **FeeDiscountTierInfo** @@ -2598,6 +2621,7 @@ func main() {
+ **FeeDiscountTierTTL** @@ -2796,6 +2820,7 @@ No parameters
+ **FeeDiscountSchedule** @@ -2807,6 +2832,7 @@ No parameters
+ **FeeDiscountTierInfo** @@ -3061,6 +3087,7 @@ func main() {
+ **BalanceMismatch** @@ -3213,6 +3240,7 @@ No parameters
+ **BalanceWithMarginHold** @@ -3385,6 +3413,7 @@ No parameters
+ **TierStatistic** @@ -3804,6 +3833,7 @@ func main() {
+ **TradeRecords** @@ -3812,6 +3842,7 @@ func main() {
+ **TradeRecord** @@ -4232,6 +4263,7 @@ func main() {
+ **TradeHistoryOptions** @@ -4280,6 +4312,7 @@ func main() {
+ **MetadataStatistics** @@ -4295,6 +4328,7 @@ func main() {
+ **TradeRecord** @@ -4626,6 +4660,7 @@ func main() {
+ **TxResponse** @@ -4645,6 +4680,7 @@ func main() {
+ **ABCIMessageLog** @@ -4654,6 +4690,7 @@ func main() {
+ **Event** @@ -4662,6 +4699,7 @@ func main() {
+ **StringEvent** @@ -4670,6 +4708,7 @@ func main() {
+ **EventAttribute** @@ -4679,6 +4718,7 @@ func main() {
+ **Attribute** diff --git a/source/includes/_changelog.md b/source/includes/_changelog.md index 95b9934d..dd4c5044 100644 --- a/source/includes/_changelog.md +++ b/source/includes/_changelog.md @@ -1,5 +1,13 @@ # Change Log +## 9999-99-99 +- Updated the API documentation to include all queries and messages for the `tendermint` module +- Python SDK v1.6.0 + - Added support for all queries from the `tendermint` module + - Added support for all queries from the `IBC transfer` module + - Added support for all queries from the `IBC core channel` module + - Added support for all queries from the `IBC core client` module + ## 2024-03-08 - Updated the API documentation to include all queries and messages for the `distribution` and `chain exchange` modules - Python SDK v1.4.0 diff --git a/source/includes/_derivatives.md b/source/includes/_derivatives.md index b84f22dd..e43203fe 100644 --- a/source/includes/_derivatives.md +++ b/source/includes/_derivatives.md @@ -297,6 +297,7 @@ func main() {
+ **Level** @@ -455,6 +456,7 @@ func main() {
+ **TrimmedDerivativeLimitOrder** @@ -614,6 +616,7 @@ func main() {
+ **TrimmedDerivativeLimitOrder** @@ -779,6 +782,7 @@ func main() {
+ **TrimmedDerivativeLimitOrder** @@ -941,6 +945,7 @@ func main() {
+ **TrimmedDerivativeLimitOrder** @@ -1125,6 +1130,7 @@ func main() {
+ **FullDerivativeMarket** @@ -1135,6 +1141,7 @@ func main() {
+ **DerivativeMarket** @@ -1157,6 +1164,7 @@ func main() {
+ **OracleType** @@ -1175,6 +1183,7 @@ func main() {
+ **MarketStatus** @@ -1186,6 +1195,7 @@ func main() {
+ **PerpetualMarketState** @@ -1194,6 +1204,7 @@ func main() {
+ **PerpetualMarketInfo** @@ -1205,6 +1216,7 @@ func main() {
+ **PerpetualMarketFunding** @@ -1214,6 +1226,7 @@ func main() {
+ **ExpiryFuturesMarketInfo** @@ -1390,6 +1403,7 @@ func main() {
+ **FullDerivativeMarket** @@ -1400,6 +1414,7 @@ func main() {
+ **DerivativeMarket** @@ -1422,6 +1437,7 @@ func main() {
+ **OracleType** @@ -1440,6 +1456,7 @@ func main() {
+ **MarketStatus** @@ -1451,6 +1468,7 @@ func main() {
+ **PerpetualMarketState** @@ -1459,6 +1477,7 @@ func main() {
+ **PerpetualMarketInfo** @@ -1470,6 +1489,7 @@ func main() {
+ **PerpetualMarketFunding** @@ -1479,6 +1499,7 @@ func main() {
+ **ExpiryFuturesMarketInfo** @@ -1771,6 +1792,7 @@ No parameters
+ **DerivativePosition** @@ -1780,6 +1802,7 @@ No parameters
+ **Position** @@ -1993,6 +2016,7 @@ func main() {
+ **DerivativePosition** @@ -2002,6 +2026,7 @@ func main() {
+ **Position** @@ -2168,6 +2193,7 @@ func main() {
+ **Position** @@ -2333,6 +2359,7 @@ func main() {
+ **EffectivePosition** @@ -2480,6 +2507,7 @@ func main() {
+ **PerpetualMarketInfo** @@ -2620,6 +2648,7 @@ func main() {
+ **ExpiryFuturesMarketInfo** @@ -2766,6 +2795,7 @@ func main() {
+ **PerpetualMarketFunding** @@ -2925,6 +2955,7 @@ func main() {
+ **TrimmedDerivativeConditionalOrder** @@ -3141,6 +3172,7 @@ func main() {
+ **OracleType** @@ -3170,6 +3202,7 @@ func main() {
+ **TxResponse** @@ -3189,6 +3222,7 @@ func main() {
+ **ABCIMessageLog** @@ -3198,6 +3232,7 @@ func main() {
+ **Event** @@ -3206,6 +3241,7 @@ func main() {
+ **StringEvent** @@ -3214,6 +3250,7 @@ func main() {
+ **EventAttribute** @@ -3223,6 +3260,7 @@ func main() {
+ **Attribute** @@ -3437,6 +3475,7 @@ func main() {
+ **OracleType** @@ -3466,6 +3505,7 @@ func main() {
+ **TxResponse** @@ -3485,6 +3525,7 @@ func main() {
+ **ABCIMessageLog** @@ -3494,6 +3535,7 @@ func main() {
+ **Event** @@ -3502,6 +3544,7 @@ func main() {
+ **StringEvent** @@ -3510,6 +3553,7 @@ func main() {
+ **EventAttribute** @@ -3519,6 +3563,7 @@ func main() {
+ **Attribute** @@ -3786,6 +3831,7 @@ func main() {
+ **DerivativeOrder** @@ -3797,6 +3843,7 @@ func main() {
+ **OrderInfo** @@ -3808,6 +3855,7 @@ func main() {
+ **OrderType** @@ -3853,6 +3901,7 @@ gas fee: 0.0000857195 INJ
+ **TxResponse** @@ -3872,6 +3921,7 @@ gas fee: 0.0000857195 INJ
+ **ABCIMessageLog** @@ -3881,6 +3931,7 @@ gas fee: 0.0000857195 INJ
+ **Event** @@ -3889,6 +3940,7 @@ gas fee: 0.0000857195 INJ
+ **StringEvent** @@ -3897,6 +3949,7 @@ gas fee: 0.0000857195 INJ
+ **EventAttribute** @@ -3906,6 +3959,7 @@ gas fee: 0.0000857195 INJ
+ **Attribute** @@ -4175,6 +4229,7 @@ func main() {
+ **DerivativeOrder** @@ -4186,6 +4241,7 @@ func main() {
+ **OrderInfo** @@ -4197,6 +4253,7 @@ func main() {
+ **OrderType** @@ -4242,6 +4299,7 @@ gas fee: 0.000069981 INJ
+ **TxResponse** @@ -4261,6 +4319,7 @@ gas fee: 0.000069981 INJ
+ **ABCIMessageLog** @@ -4270,6 +4329,7 @@ gas fee: 0.000069981 INJ
+ **Event** @@ -4278,6 +4338,7 @@ gas fee: 0.000069981 INJ
+ **StringEvent** @@ -4286,6 +4347,7 @@ gas fee: 0.000069981 INJ
+ **EventAttribute** @@ -4295,6 +4357,7 @@ gas fee: 0.000069981 INJ
+ **Attribute** @@ -4501,6 +4564,7 @@ func main() {
+ **OrderMask** @@ -4543,6 +4607,7 @@ gas fee: 0.0000706865 INJ
+ **TxResponse** @@ -4562,6 +4627,7 @@ gas fee: 0.0000706865 INJ
+ **ABCIMessageLog** @@ -4571,6 +4637,7 @@ gas fee: 0.0000706865 INJ
+ **Event** @@ -4579,6 +4646,7 @@ gas fee: 0.0000706865 INJ
+ **StringEvent** @@ -4587,6 +4655,7 @@ gas fee: 0.0000706865 INJ
+ **EventAttribute** @@ -4596,6 +4665,7 @@ gas fee: 0.0000706865 INJ
+ **Attribute** @@ -4979,6 +5049,7 @@ func main() {
+ **OrderData** @@ -4990,6 +5061,7 @@ func main() {
+ **SpotOrder** @@ -5000,6 +5072,7 @@ func main() {
+ **DerivativeOrder** @@ -5011,6 +5084,7 @@ func main() {
+ **OrderMask** @@ -5025,6 +5099,7 @@ func main() {
+ **OrderInfo** @@ -5036,6 +5111,7 @@ func main() {
+ **OrderType** @@ -5089,6 +5165,7 @@ gas fee: 0.000329546 INJ
+ **TxResponse** @@ -5108,6 +5185,7 @@ gas fee: 0.000329546 INJ
+ **ABCIMessageLog** @@ -5117,6 +5195,7 @@ gas fee: 0.000329546 INJ
+ **Event** @@ -5125,6 +5204,7 @@ gas fee: 0.000329546 INJ
+ **StringEvent** @@ -5133,6 +5213,7 @@ gas fee: 0.000329546 INJ
+ **EventAttribute** @@ -5142,6 +5223,7 @@ gas fee: 0.000329546 INJ
+ **Attribute** @@ -5403,6 +5485,7 @@ func main() {
+ **DerivativeOrder** @@ -5414,6 +5497,7 @@ func main() {
+ **OrderInfo** @@ -5425,6 +5509,7 @@ func main() {
+ **OrderType** @@ -5455,6 +5540,7 @@ func main() {
+ **TxResponse** @@ -5474,6 +5560,7 @@ func main() {
+ **ABCIMessageLog** @@ -5483,6 +5570,7 @@ func main() {
+ **Event** @@ -5491,6 +5579,7 @@ func main() {
+ **StringEvent** @@ -5499,6 +5588,7 @@ func main() {
+ **EventAttribute** @@ -5508,6 +5598,7 @@ func main() {
+ **Attribute** @@ -5743,6 +5834,7 @@ gas fee: 0.000066807 INJ
+ **TxResponse** @@ -5762,6 +5854,7 @@ gas fee: 0.000066807 INJ
+ **ABCIMessageLog** @@ -5771,6 +5864,7 @@ gas fee: 0.000066807 INJ
+ **Event** @@ -5779,6 +5873,7 @@ gas fee: 0.000066807 INJ
+ **StringEvent** @@ -5787,6 +5882,7 @@ gas fee: 0.000066807 INJ
+ **EventAttribute** @@ -5796,6 +5892,7 @@ gas fee: 0.000066807 INJ
+ **Attribute** diff --git a/source/includes/_ibccorechannel.md b/source/includes/_ibccorechannel.md new file mode 100644 index 00000000..f1bb688f --- /dev/null +++ b/source/includes/_ibccorechannel.md @@ -0,0 +1,2544 @@ +# - IBC Core Channel + +Includes all the messages and queries associated to channels from the IBC core channel module + +## Channel + +Queries an IBC Channel + +**IP rate limit group:** `chain` + +### Request Parameters +> Request Example: + + + +```py +import asyncio + +from google.protobuf import symbol_database + +from pyinjective.async_client import AsyncClient +from pyinjective.core.network import Network + + +async def main() -> None: + network = Network.testnet() + client = AsyncClient(network) + + port_id = "transfer" + channel_id = "channel-126" + + channel = await client.fetch_ibc_channel(port_id=port_id, channel_id=channel_id) + print(channel) + + +if __name__ == "__main__": + symbol_db = symbol_database.Default() + asyncio.get_event_loop().run_until_complete(main()) +``` + + + + +```go +package main + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/InjectiveLabs/sdk-go/client" + + chainclient "github.com/InjectiveLabs/sdk-go/client/chain" + "github.com/InjectiveLabs/sdk-go/client/common" + rpchttp "github.com/cometbft/cometbft/rpc/client/http" + + "os" +) + +func main() { + network := common.LoadNetwork("testnet", "lb") + tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket") + if err != nil { + panic(err) + } + + senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring( + os.Getenv("HOME")+"/.injectived", + "injectived", + "file", + "inj-user", + "12345678", + "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided + false, + ) + + if err != nil { + panic(err) + } + + clientCtx, err := chainclient.NewClientContext( + network.ChainId, + senderAddress.String(), + cosmosKeyring, + ) + + if err != nil { + panic(err) + } + + clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient) + + chainClient, err := chainclient.NewChainClient( + clientCtx, + network, + common.OptionGasPrices(client.DefaultGasPriceWithDenom), + ) + + if err != nil { + panic(err) + } + + portId := "transfer" + channelId := "channel-126" + ctx := context.Background() + + res, err := chainClient.FetchIBCChannel(ctx, portId, channelId) + if err != nil { + fmt.Println(err) + } + + str, _ := json.MarshalIndent(res, "", " ") + fmt.Print(string(str)) + +} +``` + + + + +
ParameterTypeDescriptionRequired
port_idStringPort unique identifierYes
channel_idStringChannel unique identifierYes
+ + +### 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":"" +} +``` + + + + +
ParameterTypeDescription
channelChannelChannel details
proofByte ArrayMerkle proof of existence
proof_heightHeightHeight at which the proof was retrieved
+ + +
+ +**Channel** + + + + +
ParameterTypeDescription
channelChannelChannel details
proofByte ArrayMerkle proof of existence
proof_heightHeightHeight at which the proof was retrieved
+ + +
+ +**State** + + + + + + +
CodeName
0STATE_UNINITIALIZED_UNSPECIFIED
1STATE_INIT
2STATE_TRYOPEN
3STATE_OPEN
4STATE_CLOSED
+ + +
+ +**Order** + + + + +
CodeName
0ORDER_NONE_UNSPECIFIED
1ORDER_UNORDERED
2ORDER_ORDERED
+ + +
+ +**Counterparty** + + + +
ParameterTypeDescription
port_idStringPort on the counterparty chain which owns the other end of the channel
channel_idStringChannel end on the counterparty chain
+ + +
+ +**Height** + + + +
ParameterTypeDescription
revision_numberIntegerThe revision that the client is currently on
revision_heightIntegerThe 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)) + +} +``` + + + +
ParameterTypeDescriptionRequired
paginationPageRequestThe optional pagination for the requestNo
+ + +
+ +**PageRequest** + + + + + + +
ParameterTypeDescriptionRequired
keyByte ArrayKey is a value returned in PageResponse.next_key to begin querying the next page most efficiently. Only one of offset or key should be setNo
offsetIntegerNumeric offset that can be used when key is unavailable. It is less efficient than using key. Only one of offset or key should be setNo
limitIntegerTotal number of results to be returned in the result pageNo
count_totalBooleanSet 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 setNo
reverseBooleanReverse is set to true if results are to be returned in the descending orderNo
+ + +### 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" + } +} +``` + + + + +
ParameterTypeDescription
channelsIdentifiedChannel ArrayList of channels
paginationPageResponsePagination information in the response
heightHeightQuery block height
+ + +
+ +**IdentifiedChannel** + + + + + + + + +
ParameterTypeDescription
stateStateCurrent state of the channel end
orderingOrderWhether the channel is ordered or unordered
counterpartyCounterpartyCounterparty channel end
connection_hopsString ArrayList of connection identifiers, in order, along which packets sent on this channel will travel
versionStringOpaque channel version, which is agreed upon during the handshake
port_idStringPort identifier
channel_idStringChannel identifier
+ + +
+ +**State** + + + + + + +
CodeName
0STATE_UNINITIALIZED_UNSPECIFIED
1STATE_INIT
2STATE_TRYOPEN
3STATE_OPEN
4STATE_CLOSED
+ + +
+ +**Order** + + + + +
CodeName
0ORDER_NONE_UNSPECIFIED
1ORDER_UNORDERED
2ORDER_ORDERED
+ + +
+ +**Counterparty** + + + +
ParameterTypeDescription
port_idStringPort on the counterparty chain which owns the other end of the channel
channel_idStringChannel end on the counterparty chain
+ + +
+ +**PageResponse** + + + +
ParameterTypeDescription
next_keyByte ArrayThe key to be passed to PageRequest.key to query the next page most efficiently. It will be empty if there are no more results.
totalIntegerTotal number of results available if PageRequest.count_total was set, its value is undefined otherwise
+ + +
+ +**Height** + + + +
ParameterTypeDescription
revision_numberIntegerThe revision that the client is currently on
revision_heightIntegerThe 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)) + +} +``` + + + + +
ParameterTypeDescriptionRequired
connectionStringConnection unique identifierYes
paginationPageRequestThe optional pagination for the requestNo
+ + +
+ +**PageRequest** + + + + + + +
ParameterTypeDescriptionRequired
keyByte ArrayKey is a value returned in PageResponse.next_key to begin querying the next page most efficiently. Only one of offset or key should be setNo
offsetIntegerNumeric offset that can be used when key is unavailable. It is less efficient than using key. Only one of offset or key should be setNo
limitIntegerTotal number of results to be returned in the result pageNo
count_totalBooleanSet 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 setNo
reverseBooleanReverse is set to true if results are to be returned in the descending orderNo
+ + +### 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" + } +} +``` + + + + +
ParameterTypeDescription
channelsIdentifiedChannel ArrayList of channels
paginationPageResponsePagination information in the response
heightHeightQuery block height
+ + +
+ +**IdentifiedChannel** + + + + + + + + +
ParameterTypeDescription
stateStateCurrent state of the channel end
orderingOrderWhether the channel is ordered or unordered
counterpartyCounterpartyCounterparty channel end
connection_hopsString ArrayList of connection identifiers, in order, along which packets sent on this channel will travel
versionStringOpaque channel version, which is agreed upon during the handshake
port_idStringPort identifier
channel_idStringChannel identifier
+ + +
+ +**State** + + + + + + +
CodeName
0STATE_UNINITIALIZED_UNSPECIFIED
1STATE_INIT
2STATE_TRYOPEN
3STATE_OPEN
4STATE_CLOSED
+ + +
+ +**Order** + + + + +
CodeName
0ORDER_NONE_UNSPECIFIED
1ORDER_UNORDERED
2ORDER_ORDERED
+ + +
+ +**Counterparty** + + + +
ParameterTypeDescription
port_idStringPort on the counterparty chain which owns the other end of the channel
channel_idStringChannel end on the counterparty chain
+ + +
+ +**PageResponse** + + + +
ParameterTypeDescription
next_keyByte ArrayThe key to be passed to PageRequest.key to query the next page most efficiently. It will be empty if there are no more results.
totalIntegerTotal number of results available if PageRequest.count_total was set, its value is undefined otherwise
+ + +
+ +**Height** + + + +
ParameterTypeDescription
revision_numberIntegerThe revision that the client is currently on
revision_heightIntegerThe 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) + +} +``` + + + + +
ParameterTypeDescriptionRequired
port_idStringPort unique identifierYes
channel_idStringChannel unique identifierYes
+ + +### 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":"" +} +``` + + + + +
ParameterTypeDescription
identified_client_stateIdentifiedChannelClient state associated with the channel
proofByte ArrayMerkle proof of existence
proof_heightHeightHeight at which the proof was retrieved
+ + +
+ +**IdentifiedChannel** + + + + + + + + +
ParameterTypeDescription
stateStateCurrent state of the channel end
orderingOrderWhether the channel is ordered or unordered
counterpartyCounterpartyCounterparty channel end
connection_hopsString ArrayList of connection identifiers, in order, along which packets sent on this channel will travel
versionStringOpaque channel version, which is agreed upon during the handshake
port_idStringPort identifier
channel_idStringChannel identifier
+ + +
+ +**State** + + + + + + +
CodeName
0STATE_UNINITIALIZED_UNSPECIFIED
1STATE_INIT
2STATE_TRYOPEN
3STATE_OPEN
4STATE_CLOSED
+ + +
+ +**Order** + + + + +
CodeName
0ORDER_NONE_UNSPECIFIED
1ORDER_UNORDERED
2ORDER_ORDERED
+ + +
+ +**Counterparty** + + + +
ParameterTypeDescription
port_idStringPort on the counterparty chain which owns the other end of the channel
channel_idStringChannel end on the counterparty chain
+ + +
+ +**Height** + + + +
ParameterTypeDescription
revision_numberIntegerThe revision that the client is currently on
revision_heightIntegerThe 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) + +} +``` + + + + + + +
ParameterTypeDescriptionRequired
port_idStringPort unique identifierYes
channel_idStringChannel unique identifierYes
revision_numberIntegerRevision number of the consensus stateYes
revision_heightIntegerRevision height of the consensus stateYes
+ + +### 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":"" +} +``` + + + + + +
ParameterTypeDescription
consensus_stateAnyConsensus state associated with the channel
client_idStringClient ID associated with the consensus state
proofByte ArrayMerkle proof of existence
proof_heightHeightHeight at which the proof was retrieved
+ + +
+ +**Height** + + + +
ParameterTypeDescription
revision_numberIntegerThe revision that the client is currently on
revision_heightIntegerThe 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)) + +} +``` + + + + + +
ParameterTypeDescriptionRequired
port_idStringPort unique identifierYes
channel_idStringChannel unique identifierYes
sequenceIntegerPacket sequenceYes
+ + +### Response Parameters +> Response Example: + +``` json +{ + "commitment":"bIKl7JAqoA1IGSDDlb0McwW2A/A77Jpph0yt87BnCO4=", + "proofHeight":{ + "revisionNumber":"888", + "revisionHeight":"26836334" + }, + "proof":"" +} +``` + + + + +
ParameterTypeDescription
commitmentByte ArrayPacket associated with the request fields
proofByte ArrayMerkle proof of existence
proof_heightHeightHeight at which the proof was retrieved
+ + +
+ +**Height** + + + +
ParameterTypeDescription
revision_numberIntegerThe revision that the client is currently on
revision_heightIntegerThe 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)) + +} +``` + + + + + +
ParameterTypeDescriptionRequired
port_idStringPort unique identifierYes
channel_idStringChannel unique identifierYes
paginationPageRequestThe optional pagination for the requestNo
+ + +### 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" + } +} +``` + + + + +
ParameterTypeDescription
commitmentsPacketState ArrayCommitments information
paginationPageResponsePagination information in the response
heightHeightQuery block height
+ + +
+ +**PacketState** + + + + + +
ParameterTypeDescription
port_idStringPort identifier
channel_idStringChannel identifier
sequenceIntegerPacket sequence
dataByte ArrayEmbedded data that represents packet state
+ + +
+ +**PageResponse** + + + +
ParameterTypeDescription
next_keyByte ArrayThe key to be passed to PageRequest.key to query the next page most efficiently. It will be empty if there are no more results.
totalIntegerTotal number of results available if PageRequest.count_total was set, its value is undefined otherwise
+ + +
+ +**Height** + + + +
ParameterTypeDescription
revision_numberIntegerThe revision that the client is currently on
revision_heightIntegerThe 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)) + +} +``` + + + + + +
ParameterTypeDescriptionRequired
port_idStringPort unique identifierYes
channel_idStringChannel unique identifierYes
sequenceIntegerPacket sequenceYes
+ + +### Response Parameters +> Response Example: + +``` json +{ + "received":true, + "proofHeight":{ + "revisionNumber":"888", + "revisionHeight":"27058834" + }, + "proof":"" +} +``` + + + + +
ParameterTypeDescription
receivedBooleanSuccess flag to mark if the receipt exists
proofByte ArrayMerkle proof of existence
proof_heightHeightHeight at which the proof was retrieved
+ + +
+ +**Height** + + + +
ParameterTypeDescription
revision_numberIntegerThe revision that the client is currently on
revision_heightIntegerThe 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)) + +} +``` + + + + + +
ParameterTypeDescriptionRequired
port_idStringPort unique identifierYes
channel_idStringChannel unique identifierYes
sequenceIntegerPacket sequenceYes
+ + +### Response Parameters +> Response Example: + +``` json +{ + "acknowledgement":"CPdVftUYJv4Y2EUSvyTsdQAe268hI6R333KgqfNkCnw=", + "proofHeight":{ + "revisionNumber":"888", + "revisionHeight":"27065978" + }, + "proof":"" +} +``` + + + + +
ParameterTypeDescription
acknowledgementByte ArraySuccess flag to mark if the receipt exists
proofByte ArrayMerkle proof of existence
proof_heightHeightHeight at which the proof was retrieved
+ + +
+ +**Height** + + + +
ParameterTypeDescription
revision_numberIntegerThe revision that the client is currently on
revision_heightIntegerThe 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)) + +} +``` + + + + + + +
ParameterTypeDescriptionRequired
port_idStringPort unique identifierYes
channel_idStringChannel unique identifierYes
paginationPageRequestThe optional pagination for the requestNo
packet_commitment_sequencesInteger ArrayList of packet sequencesNo
+ + +
+ +**PageRequest** + + + + + + +
ParameterTypeDescriptionRequired
keyByte ArrayKey is a value returned in PageResponse.next_key to begin querying the next page most efficiently. Only one of offset or key should be setNo
offsetIntegerNumeric offset that can be used when key is unavailable. It is less efficient than using key. Only one of offset or key should be setNo
limitIntegerTotal number of results to be returned in the result pageNo
count_totalBooleanSet 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 setNo
reverseBooleanReverse is set to true if results are to be returned in the descending orderNo
+ + +### 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" + } +} +``` + + + + +
ParameterTypeDescription
acknowledgementsPacketState ArrayAcknowledgements details
paginationPageResponsePagination information in the response
heightHeightQuery block height
+ + +**PacketState** + + + + + +
ParameterTypeDescription
port_idStringPort identifier
channel_idStringChannel identifier
sequenceIntegerPacket sequence
dataByte ArrayEmbedded data that represents packet state
+ + +
+ +**PageResponse** + + + +
ParameterTypeDescription
next_keyByte ArrayThe key to be passed to PageRequest.key to query the next page most efficiently. It will be empty if there are no more results.
totalIntegerTotal number of results available if PageRequest.count_total was set, its value is undefined otherwise
+ + +
+ +**Height** + + + +
ParameterTypeDescription
revision_numberIntegerThe revision that the client is currently on
revision_heightIntegerThe 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)) + +} +``` + + + + + +
ParameterTypeDescriptionRequired
port_idStringPort unique identifierYes
channel_idStringChannel unique identifierYes
packet_commitment_sequencesInteger ArrayList of packet sequencesNo
+ + +### Response Parameters +> Response Example: + +``` json +{ + "height":{ + "revisionNumber":"888", + "revisionHeight":"27067282" + }, + "sequences":[ + + ] +} +``` + + + +
ParameterTypeDescription
sequencesInteger ArrayList of unreceived packet sequences
heightHeightQuery block height
+ + +
+ +**Height** + + + +
ParameterTypeDescription
revision_numberIntegerThe revision that the client is currently on
revision_heightIntegerThe 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)) + +} +``` + + + + + +
ParameterTypeDescriptionRequired
port_idStringPort unique identifierYes
channel_idStringChannel unique identifierYes
packet_ack_sequencesInteger ArrayList of acknowledgement sequencesNo
+ + +### Response Parameters +> Response Example: + +``` json +{ + "height":{ + "revisionNumber":"888", + "revisionHeight":"27067653" + }, + "sequences":[ + + ] +} +``` + + + +
ParameterTypeDescription
sequencesInteger ArrayList of unreceived packet sequences
heightHeightQuery block height
+ + +
+ +**Height** + + + +
ParameterTypeDescription
revision_numberIntegerThe revision that the client is currently on
revision_heightIntegerThe 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)) + +} +``` + + + + +
ParameterTypeDescriptionRequired
port_idStringPort unique identifierYes
channel_idStringChannel unique identifierYes
+ + +### Response Parameters +> Response Example: + +``` json +{ + "nextSequenceReceive":"1", + "proofHeight":{ + "revisionNumber":"888", + "revisionHeight":"27067952" + }, + "proof":"" +} +``` + + + + +
ParameterTypeDescription
next_sequence_receiveIntegerNext sequence receive number
proofByte ArrayMerkle proof of existence
proof_heightHeightHeight at which the proof was retrieved
+ + +
+ +**Height** + + + +
ParameterTypeDescription
revision_numberIntegerThe revision that the client is currently on
revision_heightIntegerThe 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) + +} +``` + + + +
ParameterTypeDescriptionRequired
client_idStringClient state unique identifierYes
+ + +### 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":"" +} +``` + + + + +
ParameterTypeDescription
client_stateAnyClient state associated with the request identifier
proofByte ArrayMerkle proof of existence
proof_heightHeightHeight at which the proof was retrieved
+ + +
+ +**Height** + + + +
ParameterTypeDescription
revision_numberIntegerThe revision that the client is currently on
revision_heightIntegerThe 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) + +} +``` + + + +
ParameterTypeDescriptionRequired
paginationPageRequestThe optional pagination for the requestNo
+ + +### 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" + } +} +``` + + + +
ParameterTypeDescription
client_statesIdentifiedClientState ArrayClient state associated with the request identifier
paginationPageResponsePagination information in the response
+ + +
+ +**IdentifiedClientState** + + + +
ParameterTypeDescription
client_idStringClient identifier
client_stateAnyClient 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) + +} +``` + + + + + + +
ParameterTypeDescriptionRequired
client_idStringClient identifierYes
revision_numberIntegerConsensus state revision numberYes
client_idIntegerConsensus state revision heightYes
latest_heightBooleanOverrrides the height field and queries the latest stored ConsensusStateNo
+ + +### 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":"" +} +``` + + + + +
ParameterTypeDescription
consensus_stateAnyClient state associated with the request identifier
proofByte ArrayMerkle proof of existence
proof_heightHeightHeight at which the proof was retrieved
+ + +
+ +**Height** + + + +
ParameterTypeDescription
revision_numberIntegerThe revision that the client is currently on
revision_heightIntegerThe 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) + +} +``` + + + + +
ParameterTypeDescriptionRequired
client_idStringClient identifierYes
paginationPageRequestThe optional pagination for the requestNo
+ + +### 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" + } +} +``` + + + +
ParameterTypeDescription
consensus_statesConsensusStateWithHeight ArrayConsensus states associated with the identifier
paginationPageResponsePagination information in the response
+ + +
+ +**ConsensusStateWithHeight** + + + +
ParameterTypeDescription
heightHeightConsensus state height
consensus_stateAnyConsensus state
+ + +
+ +**Height** + + + +
ParameterTypeDescription
revision_numberIntegerThe revision that the client is currently on
revision_heightIntegerThe 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) + +} +``` + + + + +
ParameterTypeDescriptionRequired
client_idStringClient identifierYes
paginationPageRequestThe optional pagination for the requestNo
+ + +### 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" + } +} +``` + + + +
ParameterTypeDescription
consensus_state_heightsHeight ArrayConsensus state heights
paginationPageResponsePagination information in the response
+ + +
+ +**Height** + + + +
ParameterTypeDescription
revision_numberIntegerThe revision that the client is currently on
revision_heightIntegerThe 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)) + +} +``` + + + +
ParameterTypeDescriptionRequired
client_idStringClient unique identifierYes
+ + +### Response Parameters +> Response Example: + +``` json +{ + "status":"Expired" +} +``` + + +
ParameterTypeDescription
statusStringClient 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" + ] + } +} +``` + + +
ParameterTypeDescription
paramsparamsModule's parameters
+ + +
+ +**Params** + + +
ParameterTypeDescription
allowed_clientsString ArrayAllowed_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 + +``` + + +
ParameterTypeDescription
upgraded_client_stateAnyClient 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 + +``` + + +
ParameterTypeDescription
upgraded_consensus_stateAnyConsensus state associated with the request identifier
+ \ No newline at end of file diff --git a/source/includes/_ibctransfer.md b/source/includes/_ibctransfer.md new file mode 100644 index 00000000..529baae7 --- /dev/null +++ b/source/includes/_ibctransfer.md @@ -0,0 +1,1019 @@ +# - IBC Transfer + +Includes all the messages and queries associated to transfers from the IBC transfer module + +## DenomTrace + +Queries a denomination trace information + +**IP rate limit group:** `chain` + +### Request Parameters +> Request Example: + + + +```py +import asyncio +from hashlib import sha256 + +from google.protobuf import symbol_database + +from pyinjective.async_client import AsyncClient +from pyinjective.core.network import Network + + +async def main() -> None: + network = Network.testnet() + client = AsyncClient(network) + + path = "transfer/channel-126" + base_denom = "uluna" + full_path = f"{path}/{base_denom}" + path_hash = sha256(full_path.encode()).hexdigest() + trace_hash = f"ibc/{path_hash}" + + denom_trace = await client.fetch_denom_trace(hash=trace_hash) + print(denom_trace) + + +if __name__ == "__main__": + symbol_db = symbol_database.Default() + asyncio.get_event_loop().run_until_complete(main()) +``` + + + + +```go +package main + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + + "github.com/InjectiveLabs/sdk-go/client" + + chainclient "github.com/InjectiveLabs/sdk-go/client/chain" + "github.com/InjectiveLabs/sdk-go/client/common" + rpchttp "github.com/cometbft/cometbft/rpc/client/http" + + "os" +) + +func main() { + network := common.LoadNetwork("testnet", "lb") + tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket") + if err != nil { + panic(err) + } + + senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring( + os.Getenv("HOME")+"/.injectived", + "injectived", + "file", + "inj-user", + "12345678", + "5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided + false, + ) + + if err != nil { + panic(err) + } + + clientCtx, err := chainclient.NewClientContext( + network.ChainId, + senderAddress.String(), + cosmosKeyring, + ) + + if err != nil { + panic(err) + } + + clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient) + + chainClient, err := chainclient.NewChainClient( + clientCtx, + network, + common.OptionGasPrices(client.DefaultGasPriceWithDenom), + ) + + if err != nil { + panic(err) + } + + denomTrace := types.DenomTrace{ + Path: "transfer/channel-126", + BaseDenom: "uluna", + } + ctx := context.Background() + + res, err := chainClient.FetchDenomTrace(ctx, denomTrace.Hash().String()) + if err != nil { + fmt.Println(err) + } + + str, _ := json.MarshalIndent(res, "", " ") + fmt.Print(string(str)) + +} +``` + + + +
ParameterTypeDescriptionRequired
hashStringThe denom trace hashYes
+ + +### Response Parameters +> Response Example: + +``` json +{ + "denomTrace":{ + "path":"transfer/channel-126", + "baseDenom":"uluna" + } +} +``` + + +
ParameterTypeDescription
denom_traceDenomTraceDenom trace information
+ + +
+ +**DenomTrace** + + + +
ParameterTypeDescription
pathStringPath is the port and channel
base_denomStringThe 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)) + +} +``` + + + +
ParameterTypeDescriptionRequired
paginationPageRequestThe optional pagination for the requestNo
+ + +
+ +**PageRequest** + + + + + + +
ParameterTypeDescriptionRequired
keyByte ArrayKey is a value returned in PageResponse.next_key to begin querying the next page most efficiently. Only one of offset or key should be setNo
offsetIntegerNumeric offset that can be used when key is unavailable. It is less efficient than using key. Only one of offset or key should be setNo
limitIntegerTotal number of results to be returned in the result pageNo
count_totalBooleanSet 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 setNo
reverseBooleanReverse is set to true if results are to be returned in the descending orderNo
+ + +### 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" + } +} +``` + + + +
ParameterTypeDescription
denom_tracesDenomTrace ArrayDenom traces information
paginationPageResponsePagination information in the response
+ + +
+ +**PageResponse** + + + +
ParameterTypeDescription
next_keyByte ArrayThe key to be passed to PageRequest.key to query the next page most efficiently. It will be empty if there are no more results.
totalIntegerTotal 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)) + +} +``` + + + +
ParameterTypeDescriptionRequired
traceStringThe denomination trace ([port_id]/[channel_id])+/[denom]Yes
+ + +### Response Parameters +> Response Example: + +``` json +{ + "hash":"97498452BF27CC90656FD7D6EFDA287FA2BFFFF3E84691C84CB9E0451F6DF0A4" +} +``` + + +
ParameterTypeDescription
hashStringHash (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)) + +} +``` + + + + +
ParameterTypeDescriptionRequired
port_idStringThe unique port identifierYes
channel_idStringThe unique channel identifierYes
+ + +### Response Parameters +> Response Example: + +``` json +{ + "escrowAddress":"inj1w8ent9jwwqy2d5s8grq6muk2hqa6kj2863m3mg" +} +``` + + +
ParameterTypeDescription
escrow_addressStringThe 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)) + +} +``` + + + +
ParameterTypeDescriptionRequired
denomStringToken denomYes
+ + +### Response Parameters +> Response Example: + +``` json +{ + "amount":{ + "denom":"uluna", + "amount":"0" + } +} +``` + + +
ParameterTypeDescription
amountCoinAmount of token in the escrow
+ + +
+ +**Coin** + + + +
ParameterTypeDescriptionRequired
denomStringThe token denomYes
amountStringThe amount of tokensYes
+ + + +## 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)) +} +``` + + + + + + + + + + +
ParameterTypeDescription
source_portStringThe port on which the packet will be sent
source_channelStringThe channel by which the packet will be sent
tokenCoinThe tokens to be transferred
senderStringThe sender address
receiverStringThe recipient address on the destination chain
timeout_heightHeightTimeout height relative to the current block height. The timeout is disabled when set to 0
timeout_timestampIntegerTimeout timestamp in absolute nanoseconds since unix epoch. The timeout is disabled when set to 0
memoStringOptional memo
+ + +
+ +**Coin** + + + +
ParameterTypeDescriptionRequired
denomStringThe token denomYes
amountStringThe amount of tokensYes
+ + +
+ +**Height** + + + +
ParameterTypeDescription
revision_numberIntegerThe revision that the client is currently on
revision_heightIntegerThe height within the given revision
+ + +### Response Parameters +> Response Example: + +``` json +``` + + +
ParamterTypeDescription
tx_responseTxResponseTransaction details
+ + +
+ +**TxResponse** + + + + + + + + + + + + + + +
ParameterTypeDescription
heightIntegerThe block height
tx_hashStringTransaction hash
codespaceStringNamespace for the code
codeIntegerResponse code (zero for success, non-zero for errors)
dataStringBytes, if any
raw_logStringThe output of the application's logger (raw string)
logsABCIMessageLog ArrayThe output of the application's logger (typed)
infoStringAdditional information
gas_wantedIntegerAmount of gas requested for the transaction
gas_usedIntegerAmount of gas consumed by the transaction
txAnyThe request transaction bytes
timestampStringTime 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
eventsEvent ArrayEvents 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** + + + + +
ParameterTypeDescription
msg_indexIntegerThe message index
logStringThe log message
eventsStringEvent ArrayEvent objects that were emitted during the execution
+ + +
+ +**Event** + + + +
ParameterTypeDescription
typeStringEvent type
attributesEventAttribute ArrayAll event object details
+ + +
+ +**StringEvent** + + + +
ParameterTypeDescription
typeStringEvent type
attributesAttribute ArrayEvent data
+ + +
+ +**EventAttribute** + + + + +
ParameterTypeDescription
keyStringAttribute key
valueStringAttribute value
indexBooleanIf attribute is indexed
+ + +
+ +**Attribute** + + + +
ParameterTypeDescription
keyStringAttribute key
valueStringAttribute 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":"" + } +} +``` + + + +
ParameterTypeDescription
default_node_infoDefaultNodeInfoNode information
application_versionVersionInfoNode version information
+ + +
+ +**DefaultNodeInfo** + + + + + + + + + +
ParameterTypeDescription
protocol_versionProtocolVersionProtocol version information
default_nod_idStringNode identifier
listen_addrStringURI of the node's listening endpoint
networkStringThe chain network name
versionStringThe version number
channelsBytesChannels information
monikerString
otherDefaultNodeInfoOtherExtra node information
+ + +
+ +**ProtocolVersion** + + + + +
ParameterTypeDescription
p2pInteger
blockInteger
appInteger
+ + +
+ +**DefaultNodeInfoOther** + + + +
ParameterTypeDescription
tx_indexStringTX indexing status (on/off)
rpc_addressStringURI for RPC connections
+ + +
+ +**VersionInfo** + + + + + + + + + +
ParameterTypeDescription
nameStringThe chain name
app_nameStringApplication name
versionStringApplication version
git_commitStringGit commit hash
build_tagsStringApplication build tags
go_versionStringGoLang version used to compile the application
build_depsModule ArrayApplication dependencies
cosmos_sdk_versionStringCosmos SDK version used by the application
+ + +
+ +**Module** + + + + +
ParameterTypeDescription
pathStringModule path
versionStringModule version
sumStringChecksum
+ + + +## 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 +} +``` + + +
ParameterTypeDescription
syncingBooleanSyncing 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 + } + } +} +``` + + + +
ParameterTypeDescription
block_idBlockIDBlock identifier
sdk_blockBlockBlock details
+ + +
+ +**BlockID** + + + +
ParameterTypeDescription
hashBytesBlock hash
part_set_headerPartSetHeader
+ + +
+ +**PartSetHeader** + + + +
ParameterTypeDescription
totalInteger
hashBytes
+ + +
+ +**Block** + + + + + +
ParameterTypeDescription
headerHeaderHeader information
dataDataBlock data
evidenceEvidenceList
last_commitCommit
+ + +
+ +**Header** + + + + + + + + + + + + + + + +
ParameterTypeDescription
versionConsensus
chain_idStringChain identifier
heightIntegerBlock height
timeTimeBlock time
last_block_idBlockIDPrevious block identifier
last_commit_hashBytesLast commit hash
data_hashBytesBlock data hash
validators_hashBytesValidators information hash
next_validators_hashBytesValidators information hash
consensus_hashBytesConsensus information hash
app_hashBytesApplication hash
last_result_hashBytesLast result hash
evidence_hashBytesEvidence data hash
proposer_addressStringBlock proposer's address
+ + +
+ +**Consensus** + + + + + + + + + + + + + + + +
ParameterTypeDescription
versionConsensus
chain_idStringChain identifier
heightIntegerBlock height
timeTimeBlock time
last_block_idBlockIDPrevious block identifier
last_commit_hashBytesLast commit hash
data_hashBytesBlock data hash
validators_hashBytesValidators information hash
next_validators_hashBytesValidators information hash
consensus_hashBytesConsensus information hash
app_hashBytesApplication hash
last_result_hashBytesLast result hash
evidence_hashBytesEvidence data hash
proposer_addressStringBlock proposer's address
+ + +
+ +**Data** + + +
ParameterTypeDescription
txsByte ArrayTxs 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** + + +
ParameterTypeDescription
evidenceEvidence ArrayBlock evidence
+ + +
+ +**Evidence** + + +
ParameterTypeDescription
sumisEvidence_SumValid types for 'sum' are Evidence_DuplicateVoteEvidence and Evidence_LightClientAttackEvidence
+ + +
+ +**Commit** + + + + + +
ParameterTypeDescription
heightIntegerBlock height
roundIntegerConsensus round
block_idBlockIDBlock identifier
signaturesCommitSig ArraySigantures
+ + +
+ +**CommitSig** + + + + + +
ParameterTypeDescription
block_id_flagBlockIDFlagBlock height
validator_addressBytesValidator address
timestampTimeBlock time
signatureBytesBlock signature
+ + +
+ +**BlockIDFlag** + + + + + +
CodeName
0BLOCK_ID_FLAG_UNKNOWN
1BLOCK_ID_FLAG_ABSENT
2BLOCK_ID_FLAG_COMMIT
3BLOCK_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)) + +} +``` + + + + +
ParameterTypeDescription
block_idBlockIDBlock identifier
sdk_blockBlockBlock 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 + } + } +} +``` + + + +
ParameterTypeDescription
block_idBlockIDBlock identifier
sdk_blockBlockBlock details
+ + +
+ +**BlockID** + + + +
ParameterTypeDescription
hashBytesBlock hash
part_set_headerPartSetHeader
+ + +
+ +**PartSetHeader** + + + +
ParameterTypeDescription
totalInteger
hashBytes
+ + +
+ +**Block** + + + + + +
ParameterTypeDescription
headerHeaderHeader information
dataDataBlock data
evidenceEvidenceList
last_commitCommit
+ + +
+ +**Header** + + + + + + + + + + + + + + + +
ParameterTypeDescription
versionConsensus
chain_idStringChain identifier
heightIntegerBlock height
timeTimeBlock time
last_block_idBlockIDPrevious block identifier
last_commit_hashBytesLast commit hash
data_hashBytesBlock data hash
validators_hashBytesValidators information hash
next_validators_hashBytesValidators information hash
consensus_hashBytesConsensus information hash
app_hashBytesApplication hash
last_result_hashBytesLast result hash
evidence_hashBytesEvidence data hash
proposer_addressStringBlock proposer's address
+ + +
+ +**Consensus** + + + + + + + + + + + + + + + +
ParameterTypeDescription
versionConsensus
chain_idStringChain identifier
heightIntegerBlock height
timeTimeBlock time
last_block_idBlockIDPrevious block identifier
last_commit_hashBytesLast commit hash
data_hashBytesBlock data hash
validators_hashBytesValidators information hash
next_validators_hashBytesValidators information hash
consensus_hashBytesConsensus information hash
app_hashBytesApplication hash
last_result_hashBytesLast result hash
evidence_hashBytesEvidence data hash
proposer_addressStringBlock proposer's address
+ + +
+ +**Data** + + +
ParameterTypeDescription
txsByte ArrayTxs 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** + + +
ParameterTypeDescription
evidenceEvidence ArrayBlock evidence
+ + +
+ +**Evidence** + + +
ParameterTypeDescription
sumisEvidence_SumValid types for 'sum' are Evidence_DuplicateVoteEvidence and Evidence_LightClientAttackEvidence
+ + +
+ +**Commit** + + + + + +
ParameterTypeDescription
heightIntegerBlock height
roundIntegerConsensus round
block_idBlockIDBlock identifier
signaturesCommitSig ArraySigantures
+ + +
+ +**CommitSig** + + + + + +
ParameterTypeDescription
block_id_flagBlockIDFlagBlock height
validator_addressBytesValidator address
timestampTimeBlock time
signatureBytesBlock signature
+ + +
+ +**BlockIDFlag** + + + + + +
CodeName
0BLOCK_ID_FLAG_UNKNOWN
1BLOCK_ID_FLAG_ABSENT
2BLOCK_ID_FLAG_COMMIT
3BLOCK_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":"" + } +} +``` + + + + +
ParameterTypeDescription
block_heightIntegerBlock height
validatorsValidator ArrayList of validators
paginationPageResponsePagination information in the response
+ + +
+ +**Validator** + + + + + +
ParameterTypeDescription
addressStringValidator's address
pub_keyAnyValidator's public key
voting_powerIntegerValidator's voting power
proposer_priorityInteger
+ + +
+ +**PageResponse** + + + +
ParameterTypeDescription
next_keyByte ArrayThe key to be passed to PageRequest.key to query the next page most efficiently. It will be empty if there are no more results.
totalIntegerTotal 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()) + +} +``` + + + + +
ParameterTypeDescriptionRequired
heightIntegerBlock heightYes
paginationPageRequestThe optional pagination for the requestNo
+ + +
+ +**PageRequest** + + + + + + +
ParameterTypeDescriptionRequired
keyByte ArrayKey is a value returned in PageResponse.next_key to begin querying the next page most efficiently. Only one of offset or key should be setNo
offsetIntegerNumeric offset that can be used when key is unavailable. It is less efficient than using key. Only one of offset or key should be setNo
limitIntegerTotal number of results to be returned in the result pageNo
count_totalBooleanSet 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 setNo
reverseBooleanReverse is set to true if results are to be returned in the descending orderNo
+ + + +### 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":"" + } +} +``` + + + + +
ParameterTypeDescription
block_heightIntegerBlock height
validatorsValidator ArrayList of validators
paginationPageResponsePagination information in the response
+ + +
+ +**Validator** + + + + + +
ParameterTypeDescription
addressStringValidator's address
pub_keyAnyValidator's public key
voting_powerIntegerValidator's voting power
proposer_priorityInteger
+ + +
+ +**PageResponse** + + + +
ParameterTypeDescription
next_keyByte ArrayThe key to be passed to PageRequest.key to query the next page most efficiently. It will be empty if there are no more results.
totalIntegerTotal 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: + + + + + +
ParameterTypeDescriptionRequired
dataBytesQuery dataNo
pathStringQuery pathYes
haightIntegerBlock heightNo
proveBooleanNo
+ + +### Response Parameters +> Response Example: + +``` json + +``` + + + + + + + + + + +
ParameterTypeDescription
codeIntegerQuery result code (zero: success, non-zero: error
logString
infoString
indexInteger
keyBytes
valueBytes
proof_opsProofOps
heightIntegerBlock height
codespaceString
+ + +
+ +**ProofOps** + + +
ParameterTypeDescription
opsProofOp Array
+ + +
+ +**ProofOp** + + + + +
ParameterTypeDescription
typeString
keyBytes
dataBytes
+ diff --git a/source/index.html.md b/source/index.html.md index 76cd85f0..e8198d00 100644 --- a/source/index.html.md +++ b/source/index.html.md @@ -36,9 +36,13 @@ includes: - derivatives - spot - binaryoptions + - ibccorechannel + - ibccoreclient + - ibctransfer - insurance - oracle - staking + - tendermint - tokenfactory - wasm - wasmx @@ -46,7 +50,6 @@ includes: - healthapi - glossary - faq - # - chronosrpc - errors search: true diff --git a/source/json_tables/chain/ibc/core/channel/channel.json b/source/json_tables/chain/ibc/core/channel/channel.json new file mode 100644 index 00000000..a8181b4d --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/channel.json @@ -0,0 +1,7 @@ +[ + {"Parameter": "state", "Type": "State", "Description": "Current state of the channel end"}, + {"Parameter": "ordering", "Type": "Order", "Description": "Whether the channel is ordered or unordered"}, + {"Parameter": "counterparty", "Type": "Counterparty", "Description": "Counterparty channel end"}, + {"Parameter": "connection_hops", "Type": "String Array", "Description": "List of connection identifiers, in order, along which packets sent on this channel will travel"}, + {"Parameter": "version", "Type": "String", "Description": "Opaque channel version, which is agreed upon during the handshake"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/counterparty.json b/source/json_tables/chain/ibc/core/channel/counterparty.json new file mode 100644 index 00000000..4228bff5 --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/counterparty.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "port_id", "Type": "String", "Description": "Port on the counterparty chain which owns the other end of the channel"}, + {"Parameter": "channel_id", "Type": "String", "Description": "Channel end on the counterparty chain"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/identifiedChannel.json b/source/json_tables/chain/ibc/core/channel/identifiedChannel.json new file mode 100644 index 00000000..ef3c9bb8 --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/identifiedChannel.json @@ -0,0 +1,9 @@ +[ + {"Parameter": "state", "Type": "State", "Description": "Current state of the channel end"}, + {"Parameter": "ordering", "Type": "Order", "Description": "Whether the channel is ordered or unordered"}, + {"Parameter": "counterparty", "Type": "Counterparty", "Description": "Counterparty channel end"}, + {"Parameter": "connection_hops", "Type": "String Array", "Description": "List of connection identifiers, in order, along which packets sent on this channel will travel"}, + {"Parameter": "version", "Type": "String", "Description": "Opaque channel version, which is agreed upon during the handshake"}, + {"Parameter": "port_id", "Type": "String", "Description": "Port identifier"}, + {"Parameter": "channel_id", "Type": "String", "Description": "Channel identifier"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/order.json b/source/json_tables/chain/ibc/core/channel/order.json new file mode 100644 index 00000000..a1c3d3ea --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/order.json @@ -0,0 +1,5 @@ +[ + {"Code": "0", "Name": "ORDER_NONE_UNSPECIFIED"}, + {"Code": "1", "Name": "ORDER_UNORDERED"}, + {"Code": "2", "Name": "ORDER_ORDERED"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/packetState.json b/source/json_tables/chain/ibc/core/channel/packetState.json new file mode 100644 index 00000000..76cec0ee --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/packetState.json @@ -0,0 +1,6 @@ +[ + {"Parameter": "port_id", "Type": "String", "Description": "Port identifier"}, + {"Parameter": "channel_id", "Type": "String", "Description": "Channel identifier"}, + {"Parameter": "sequence", "Type": "Integer", "Description": "Packet sequence"}, + {"Parameter": "data", "Type": "Byte Array", "Description": "Embedded data that represents packet state"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryChannelClientStateRequest.json b/source/json_tables/chain/ibc/core/channel/queryChannelClientStateRequest.json new file mode 100644 index 00000000..2a57e58d --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryChannelClientStateRequest.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "port_id", "Type": "String", "Description": "Port unique identifier", "Required": "Yes"}, + {"Parameter": "channel_id", "Type": "String", "Description": "Channel unique identifier", "Required": "Yes"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryChannelClientStateResponse.json b/source/json_tables/chain/ibc/core/channel/queryChannelClientStateResponse.json new file mode 100644 index 00000000..4b74ab4f --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryChannelClientStateResponse.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "identified_client_state", "Type": "IdentifiedChannel", "Description": "Client state associated with the channel"}, + {"Parameter": "proof", "Type": "Byte Array", "Description": "Merkle proof of existence"}, + {"Parameter": "proof_height", "Type": "Height", "Description": "Height at which the proof was retrieved"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryChannelConsensusStateRequest.json b/source/json_tables/chain/ibc/core/channel/queryChannelConsensusStateRequest.json new file mode 100644 index 00000000..a289ff2e --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryChannelConsensusStateRequest.json @@ -0,0 +1,6 @@ +[ + {"Parameter": "port_id", "Type": "String", "Description": "Port unique identifier", "Required": "Yes"}, + {"Parameter": "channel_id", "Type": "String", "Description": "Channel unique identifier", "Required": "Yes"}, + {"Parameter": "revision_number", "Type": "Integer", "Description": "Revision number of the consensus state", "Required": "Yes"}, + {"Parameter": "revision_height", "Type": "Integer", "Description": "Revision height of the consensus state", "Required": "Yes"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryChannelConsensusStateResponse.json b/source/json_tables/chain/ibc/core/channel/queryChannelConsensusStateResponse.json new file mode 100644 index 00000000..a0106ae2 --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryChannelConsensusStateResponse.json @@ -0,0 +1,6 @@ +[ + {"Parameter": "consensus_state", "Type": "Any", "Description": "Consensus state associated with the channel"}, + {"Parameter": "client_id", "Type": "String", "Description": "Client ID associated with the consensus state"}, + {"Parameter": "proof", "Type": "Byte Array", "Description": "Merkle proof of existence"}, + {"Parameter": "proof_height", "Type": "Height", "Description": "Height at which the proof was retrieved"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryChannelRequest.json b/source/json_tables/chain/ibc/core/channel/queryChannelRequest.json new file mode 100644 index 00000000..2a57e58d --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryChannelRequest.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "port_id", "Type": "String", "Description": "Port unique identifier", "Required": "Yes"}, + {"Parameter": "channel_id", "Type": "String", "Description": "Channel unique identifier", "Required": "Yes"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryChannelResponse.json b/source/json_tables/chain/ibc/core/channel/queryChannelResponse.json new file mode 100644 index 00000000..915d7e0c --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryChannelResponse.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "channel", "Type": "Channel", "Description": "Channel details"}, + {"Parameter": "proof", "Type": "Byte Array", "Description": "Merkle proof of existence"}, + {"Parameter": "proof_height", "Type": "Height", "Description": "Height at which the proof was retrieved"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryChannelsRequest.json b/source/json_tables/chain/ibc/core/channel/queryChannelsRequest.json new file mode 100644 index 00000000..9da294d1 --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryChannelsRequest.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "pagination", "Type": "PageRequest", "Description": "The optional pagination for the request", "Required": "No"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryChannelsResponse.json b/source/json_tables/chain/ibc/core/channel/queryChannelsResponse.json new file mode 100644 index 00000000..d518ebf5 --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryChannelsResponse.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "channels", "Type": "IdentifiedChannel Array", "Description": "List of channels"}, + {"Parameter": "pagination", "Type": "PageResponse", "Description": "Pagination information in the response"}, + {"Parameter": "height", "Type": "Height", "Description": "Query block height"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryConnectionChannelsRequest.json b/source/json_tables/chain/ibc/core/channel/queryConnectionChannelsRequest.json new file mode 100644 index 00000000..c14b0a65 --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryConnectionChannelsRequest.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "connection", "Type": "String", "Description": "Connection unique identifier", "Required": "Yes"}, + {"Parameter": "pagination", "Type": "PageRequest", "Description": "The optional pagination for the request", "Required": "No"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryConnectionChannelsResponse.json b/source/json_tables/chain/ibc/core/channel/queryConnectionChannelsResponse.json new file mode 100644 index 00000000..d518ebf5 --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryConnectionChannelsResponse.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "channels", "Type": "IdentifiedChannel Array", "Description": "List of channels"}, + {"Parameter": "pagination", "Type": "PageResponse", "Description": "Pagination information in the response"}, + {"Parameter": "height", "Type": "Height", "Description": "Query block height"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryNextSequenceReceiveRequest.json b/source/json_tables/chain/ibc/core/channel/queryNextSequenceReceiveRequest.json new file mode 100644 index 00000000..2a57e58d --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryNextSequenceReceiveRequest.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "port_id", "Type": "String", "Description": "Port unique identifier", "Required": "Yes"}, + {"Parameter": "channel_id", "Type": "String", "Description": "Channel unique identifier", "Required": "Yes"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryNextSequenceReceiveResponse.json b/source/json_tables/chain/ibc/core/channel/queryNextSequenceReceiveResponse.json new file mode 100644 index 00000000..7298d44c --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryNextSequenceReceiveResponse.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "next_sequence_receive", "Type": "Integer", "Description": "Next sequence receive number"}, + {"Parameter": "proof", "Type": "Byte Array", "Description": "Merkle proof of existence"}, + {"Parameter": "proof_height", "Type": "Height", "Description": "Height at which the proof was retrieved"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementRequest.json b/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementRequest.json new file mode 100644 index 00000000..0cf6b279 --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementRequest.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "port_id", "Type": "String", "Description": "Port unique identifier", "Required": "Yes"}, + {"Parameter": "channel_id", "Type": "String", "Description": "Channel unique identifier", "Required": "Yes"}, + {"Parameter": "sequence", "Type": "Integer", "Description": "Packet sequence", "Required": "Yes"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementResponse.json b/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementResponse.json new file mode 100644 index 00000000..af953b0b --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementResponse.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "acknowledgement", "Type": "Byte Array", "Description": "Success flag to mark if the receipt exists"}, + {"Parameter": "proof", "Type": "Byte Array", "Description": "Merkle proof of existence"}, + {"Parameter": "proof_height", "Type": "Height", "Description": "Height at which the proof was retrieved"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementsRequest.json b/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementsRequest.json new file mode 100644 index 00000000..e3186a0e --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementsRequest.json @@ -0,0 +1,6 @@ +[ + {"Parameter": "port_id", "Type": "String", "Description": "Port unique identifier", "Required": "Yes"}, + {"Parameter": "channel_id", "Type": "String", "Description": "Channel unique identifier", "Required": "Yes"}, + {"Parameter": "pagination", "Type": "PageRequest", "Description": "The optional pagination for the request", "Required": "No"}, + {"Parameter": "packet_commitment_sequences", "Type": "Integer Array", "Description": "List of packet sequences", "Required": "No"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementsResponse.json b/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementsResponse.json new file mode 100644 index 00000000..e4254ce5 --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryPacketAcknowledgementsResponse.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "acknowledgements", "Type": "PacketState Array", "Description": "Acknowledgements details"}, + {"Parameter": "pagination", "Type": "PageResponse", "Description": "Pagination information in the response"}, + {"Parameter": "height", "Type": "Height", "Description": "Query block height"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentRequest.json b/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentRequest.json new file mode 100644 index 00000000..0cf6b279 --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentRequest.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "port_id", "Type": "String", "Description": "Port unique identifier", "Required": "Yes"}, + {"Parameter": "channel_id", "Type": "String", "Description": "Channel unique identifier", "Required": "Yes"}, + {"Parameter": "sequence", "Type": "Integer", "Description": "Packet sequence", "Required": "Yes"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentResponse.json b/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentResponse.json new file mode 100644 index 00000000..b9b2ab40 --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentResponse.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "commitment", "Type": "Byte Array", "Description": "Packet associated with the request fields"}, + {"Parameter": "proof", "Type": "Byte Array", "Description": "Merkle proof of existence"}, + {"Parameter": "proof_height", "Type": "Height", "Description": "Height at which the proof was retrieved"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentsRequest.json b/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentsRequest.json new file mode 100644 index 00000000..d47dfe9e --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentsRequest.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "port_id", "Type": "String", "Description": "Port unique identifier", "Required": "Yes"}, + {"Parameter": "channel_id", "Type": "String", "Description": "Channel unique identifier", "Required": "Yes"}, + {"Parameter": "pagination", "Type": "PageRequest", "Description": "The optional pagination for the request", "Required": "No"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentsResponse.json b/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentsResponse.json new file mode 100644 index 00000000..d373c70b --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryPacketCommitmentsResponse.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "commitments", "Type": "PacketState Array", "Description": "Commitments information"}, + {"Parameter": "pagination", "Type": "PageResponse", "Description": "Pagination information in the response"}, + {"Parameter": "height", "Type": "Height", "Description": "Query block height"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryPacketReceiptRequest.json b/source/json_tables/chain/ibc/core/channel/queryPacketReceiptRequest.json new file mode 100644 index 00000000..0cf6b279 --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryPacketReceiptRequest.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "port_id", "Type": "String", "Description": "Port unique identifier", "Required": "Yes"}, + {"Parameter": "channel_id", "Type": "String", "Description": "Channel unique identifier", "Required": "Yes"}, + {"Parameter": "sequence", "Type": "Integer", "Description": "Packet sequence", "Required": "Yes"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryPacketReceiptResponse.json b/source/json_tables/chain/ibc/core/channel/queryPacketReceiptResponse.json new file mode 100644 index 00000000..f27c918f --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryPacketReceiptResponse.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "received", "Type": "Boolean", "Description": "Success flag to mark if the receipt exists"}, + {"Parameter": "proof", "Type": "Byte Array", "Description": "Merkle proof of existence"}, + {"Parameter": "proof_height", "Type": "Height", "Description": "Height at which the proof was retrieved"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryUnreceivedAcksRequest.json b/source/json_tables/chain/ibc/core/channel/queryUnreceivedAcksRequest.json new file mode 100644 index 00000000..9cd86f55 --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryUnreceivedAcksRequest.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "port_id", "Type": "String", "Description": "Port unique identifier", "Required": "Yes"}, + {"Parameter": "channel_id", "Type": "String", "Description": "Channel unique identifier", "Required": "Yes"}, + {"Parameter": "packet_ack_sequences", "Type": "Integer Array", "Description": "List of acknowledgement sequences", "Required": "No"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryUnreceivedAcksResponse.json b/source/json_tables/chain/ibc/core/channel/queryUnreceivedAcksResponse.json new file mode 100644 index 00000000..53e3d720 --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryUnreceivedAcksResponse.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "sequences", "Type": "Integer Array", "Description": "List of unreceived packet sequences"}, + {"Parameter": "height", "Type": "Height", "Description": "Query block height"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryUnreceivedPacketsRequest.json b/source/json_tables/chain/ibc/core/channel/queryUnreceivedPacketsRequest.json new file mode 100644 index 00000000..a4a275f6 --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryUnreceivedPacketsRequest.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "port_id", "Type": "String", "Description": "Port unique identifier", "Required": "Yes"}, + {"Parameter": "channel_id", "Type": "String", "Description": "Channel unique identifier", "Required": "Yes"}, + {"Parameter": "packet_commitment_sequences", "Type": "Integer Array", "Description": "List of packet sequences", "Required": "No"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/queryUnreceivedPacketsResponse.json b/source/json_tables/chain/ibc/core/channel/queryUnreceivedPacketsResponse.json new file mode 100644 index 00000000..53e3d720 --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/queryUnreceivedPacketsResponse.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "sequences", "Type": "Integer Array", "Description": "List of unreceived packet sequences"}, + {"Parameter": "height", "Type": "Height", "Description": "Query block height"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/channel/state.json b/source/json_tables/chain/ibc/core/channel/state.json new file mode 100644 index 00000000..8896ee70 --- /dev/null +++ b/source/json_tables/chain/ibc/core/channel/state.json @@ -0,0 +1,7 @@ +[ + {"Code": "0", "Name": "STATE_UNINITIALIZED_UNSPECIFIED"}, + {"Code": "1", "Name": "STATE_INIT"}, + {"Code": "2", "Name": "STATE_TRYOPEN"}, + {"Code": "3", "Name": "STATE_OPEN"}, + {"Code": "4", "Name": "STATE_CLOSED"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/client/consensusStateWithHeight.json b/source/json_tables/chain/ibc/core/client/consensusStateWithHeight.json new file mode 100644 index 00000000..6931aff1 --- /dev/null +++ b/source/json_tables/chain/ibc/core/client/consensusStateWithHeight.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "height", "Type": "Height", "Description": "Consensus state height"}, + {"Parameter": "consensus_state", "Type": "Any", "Description": "Consensus state"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/client/identifiedClientState.json b/source/json_tables/chain/ibc/core/client/identifiedClientState.json new file mode 100644 index 00000000..6b6e737f --- /dev/null +++ b/source/json_tables/chain/ibc/core/client/identifiedClientState.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "client_id", "Type": "String", "Description": "Client identifier"}, + {"Parameter": "client_state", "Type": "Any", "Description": "Client state"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/client/params.json b/source/json_tables/chain/ibc/core/client/params.json new file mode 100644 index 00000000..31c14807 --- /dev/null +++ b/source/json_tables/chain/ibc/core/client/params.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "allowed_clients", "Type": "String Array", "Description": "Allowed_clients defines the list of allowed client state types which can be created and interacted with. If a client type is removed from the allowed clients list, usage of this client will be disabled until it is added again to the list"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/client/queryClientParamsResponse.json b/source/json_tables/chain/ibc/core/client/queryClientParamsResponse.json new file mode 100644 index 00000000..973f011e --- /dev/null +++ b/source/json_tables/chain/ibc/core/client/queryClientParamsResponse.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "params", "Type": "params", "Description": "Module's parameters"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/client/queryClientStateRequest.json b/source/json_tables/chain/ibc/core/client/queryClientStateRequest.json new file mode 100644 index 00000000..486be60e --- /dev/null +++ b/source/json_tables/chain/ibc/core/client/queryClientStateRequest.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "client_id", "Type": "String", "Description": "Client state unique identifier", "Required": "Yes"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/client/queryClientStateResponse.json b/source/json_tables/chain/ibc/core/client/queryClientStateResponse.json new file mode 100644 index 00000000..9ef3661e --- /dev/null +++ b/source/json_tables/chain/ibc/core/client/queryClientStateResponse.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "client_state", "Type": "Any", "Description": "Client state associated with the request identifier"}, + {"Parameter": "proof", "Type": "Byte Array", "Description": "Merkle proof of existence"}, + {"Parameter": "proof_height", "Type": "Height", "Description": "Height at which the proof was retrieved"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/client/queryClientStatesRequest.json b/source/json_tables/chain/ibc/core/client/queryClientStatesRequest.json new file mode 100644 index 00000000..9da294d1 --- /dev/null +++ b/source/json_tables/chain/ibc/core/client/queryClientStatesRequest.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "pagination", "Type": "PageRequest", "Description": "The optional pagination for the request", "Required": "No"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/client/queryClientStatesResponse.json b/source/json_tables/chain/ibc/core/client/queryClientStatesResponse.json new file mode 100644 index 00000000..7d0d42d8 --- /dev/null +++ b/source/json_tables/chain/ibc/core/client/queryClientStatesResponse.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "client_states", "Type": "IdentifiedClientState Array", "Description": "Client state associated with the request identifier"}, + {"Parameter": "pagination", "Type": "PageResponse", "Description": "Pagination information in the response"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/client/queryClientStatusRequest.json b/source/json_tables/chain/ibc/core/client/queryClientStatusRequest.json new file mode 100644 index 00000000..77a27792 --- /dev/null +++ b/source/json_tables/chain/ibc/core/client/queryClientStatusRequest.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "client_id", "Type": "String", "Description": "Client unique identifier", "Required": "Yes"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/client/queryClientStatusResponse.json b/source/json_tables/chain/ibc/core/client/queryClientStatusResponse.json new file mode 100644 index 00000000..51ea3f45 --- /dev/null +++ b/source/json_tables/chain/ibc/core/client/queryClientStatusResponse.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "status", "Type": "String", "Description": "Client status"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/client/queryConsensusStateHeightsRequest.json b/source/json_tables/chain/ibc/core/client/queryConsensusStateHeightsRequest.json new file mode 100644 index 00000000..99fe4f32 --- /dev/null +++ b/source/json_tables/chain/ibc/core/client/queryConsensusStateHeightsRequest.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "client_id", "Type": "String", "Description": "Client identifier", "Required": "Yes"}, + {"Parameter": "pagination", "Type": "PageRequest", "Description": "The optional pagination for the request", "Required": "No"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/client/queryConsensusStateHeightsResponse.json b/source/json_tables/chain/ibc/core/client/queryConsensusStateHeightsResponse.json new file mode 100644 index 00000000..25cb1581 --- /dev/null +++ b/source/json_tables/chain/ibc/core/client/queryConsensusStateHeightsResponse.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "consensus_state_heights", "Type": "Height Array", "Description": "Consensus state heights"}, + {"Parameter": "pagination", "Type": "PageResponse", "Description": "Pagination information in the response"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/client/queryConsensusStateRequest.json b/source/json_tables/chain/ibc/core/client/queryConsensusStateRequest.json new file mode 100644 index 00000000..ca0076b7 --- /dev/null +++ b/source/json_tables/chain/ibc/core/client/queryConsensusStateRequest.json @@ -0,0 +1,6 @@ +[ + {"Parameter": "client_id", "Type": "String", "Description": "Client identifier", "Required": "Yes"}, + {"Parameter": "revision_number", "Type": "Integer", "Description": "Consensus state revision number", "Required": "Yes"}, + {"Parameter": "client_id", "Type": "Integer", "Description": "Consensus state revision height", "Required": "Yes"}, + {"Parameter": "latest_height", "Type": "Boolean", "Description": "Overrrides the height field and queries the latest stored ConsensusState", "Required": "No"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/client/queryConsensusStateResponse.json b/source/json_tables/chain/ibc/core/client/queryConsensusStateResponse.json new file mode 100644 index 00000000..f4b7bdf0 --- /dev/null +++ b/source/json_tables/chain/ibc/core/client/queryConsensusStateResponse.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "consensus_state", "Type": "Any", "Description": "Client state associated with the request identifier"}, + {"Parameter": "proof", "Type": "Byte Array", "Description": "Merkle proof of existence"}, + {"Parameter": "proof_height", "Type": "Height", "Description": "Height at which the proof was retrieved"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/client/queryConsensusStatesRequest.json b/source/json_tables/chain/ibc/core/client/queryConsensusStatesRequest.json new file mode 100644 index 00000000..99fe4f32 --- /dev/null +++ b/source/json_tables/chain/ibc/core/client/queryConsensusStatesRequest.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "client_id", "Type": "String", "Description": "Client identifier", "Required": "Yes"}, + {"Parameter": "pagination", "Type": "PageRequest", "Description": "The optional pagination for the request", "Required": "No"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/client/queryConsensusStatesResponse.json b/source/json_tables/chain/ibc/core/client/queryConsensusStatesResponse.json new file mode 100644 index 00000000..639cef2e --- /dev/null +++ b/source/json_tables/chain/ibc/core/client/queryConsensusStatesResponse.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "consensus_states", "Type": "ConsensusStateWithHeight Array", "Description": "Consensus states associated with the identifier"}, + {"Parameter": "pagination", "Type": "PageResponse", "Description": "Pagination information in the response"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/client/queryUpgradedClientStateResponse.json b/source/json_tables/chain/ibc/core/client/queryUpgradedClientStateResponse.json new file mode 100644 index 00000000..99567127 --- /dev/null +++ b/source/json_tables/chain/ibc/core/client/queryUpgradedClientStateResponse.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "upgraded_client_state", "Type": "Any", "Description": "Client state associated with the request identifier"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/client/queryUpgradedConsensusStateResponse.json b/source/json_tables/chain/ibc/core/client/queryUpgradedConsensusStateResponse.json new file mode 100644 index 00000000..948ae7ab --- /dev/null +++ b/source/json_tables/chain/ibc/core/client/queryUpgradedConsensusStateResponse.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "upgraded_consensus_state", "Type": "Any", "Description": "Consensus state associated with the request identifier"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/core/height.json b/source/json_tables/chain/ibc/core/height.json new file mode 100644 index 00000000..452877d6 --- /dev/null +++ b/source/json_tables/chain/ibc/core/height.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "revision_number", "Type": "Integer", "Description": "The revision that the client is currently on"}, + {"Parameter": "revision_height", "Type": "Integer", "Description": "The height within the given revision"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/transfer/denomTrace.json b/source/json_tables/chain/ibc/transfer/denomTrace.json new file mode 100644 index 00000000..c78692d1 --- /dev/null +++ b/source/json_tables/chain/ibc/transfer/denomTrace.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "path", "Type": "String", "Description": "Path is the port and channel"}, + {"Parameter": "base_denom", "Type": "String", "Description": "The token denom"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/transfer/msgTransfer.json b/source/json_tables/chain/ibc/transfer/msgTransfer.json new file mode 100644 index 00000000..2480e848 --- /dev/null +++ b/source/json_tables/chain/ibc/transfer/msgTransfer.json @@ -0,0 +1,10 @@ +[ + {"Parameter": "source_port", "Type": "String", "Description": "The port on which the packet will be sent"}, + {"Parameter": "source_channel", "Type": "String", "Description": "The channel by which the packet will be sent"}, + {"Parameter": "token", "Type": "Coin", "Description": "The tokens to be transferred"}, + {"Parameter": "sender", "Type": "String", "Description": "The sender address"}, + {"Parameter": "receiver", "Type": "String", "Description": "The recipient address on the destination chain"}, + {"Parameter": "timeout_height", "Type": "Height", "Description": "Timeout height relative to the current block height. The timeout is disabled when set to 0"}, + {"Parameter": "timeout_timestamp", "Type": "Integer", "Description": "Timeout timestamp in absolute nanoseconds since unix epoch. The timeout is disabled when set to 0"}, + {"Parameter": "memo", "Type": "String", "Description": "Optional memo"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/transfer/queryDenomHashRequest.json b/source/json_tables/chain/ibc/transfer/queryDenomHashRequest.json new file mode 100644 index 00000000..ce0e4376 --- /dev/null +++ b/source/json_tables/chain/ibc/transfer/queryDenomHashRequest.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "trace", "Type": "String", "Description": "The denomination trace ([port_id]/[channel_id])+/[denom]", "Required": "Yes"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/transfer/queryDenomHashResponse.json b/source/json_tables/chain/ibc/transfer/queryDenomHashResponse.json new file mode 100644 index 00000000..78b747d3 --- /dev/null +++ b/source/json_tables/chain/ibc/transfer/queryDenomHashResponse.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "hash", "Type": "String", "Description": "Hash (in hex format) of the denomination trace information"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/transfer/queryDenomTraceRequest.json b/source/json_tables/chain/ibc/transfer/queryDenomTraceRequest.json new file mode 100644 index 00000000..bbaede68 --- /dev/null +++ b/source/json_tables/chain/ibc/transfer/queryDenomTraceRequest.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "hash", "Type": "String", "Description": "The denom trace hash", "Required": "Yes"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/transfer/queryDenomTraceResponse.json b/source/json_tables/chain/ibc/transfer/queryDenomTraceResponse.json new file mode 100644 index 00000000..dab3d692 --- /dev/null +++ b/source/json_tables/chain/ibc/transfer/queryDenomTraceResponse.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "denom_trace", "Type": "DenomTrace", "Description": "Denom trace information"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/transfer/queryDenomTracesRequest.json b/source/json_tables/chain/ibc/transfer/queryDenomTracesRequest.json new file mode 100644 index 00000000..9da294d1 --- /dev/null +++ b/source/json_tables/chain/ibc/transfer/queryDenomTracesRequest.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "pagination", "Type": "PageRequest", "Description": "The optional pagination for the request", "Required": "No"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/transfer/queryDenomTracesResponse.json b/source/json_tables/chain/ibc/transfer/queryDenomTracesResponse.json new file mode 100644 index 00000000..031cdcda --- /dev/null +++ b/source/json_tables/chain/ibc/transfer/queryDenomTracesResponse.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "denom_traces", "Type": "DenomTrace Array", "Description": "Denom traces information"}, + {"Parameter": "pagination", "Type": "PageResponse", "Description": "Pagination information in the response"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/transfer/queryEscrowAddressRequest.json b/source/json_tables/chain/ibc/transfer/queryEscrowAddressRequest.json new file mode 100644 index 00000000..929fc40c --- /dev/null +++ b/source/json_tables/chain/ibc/transfer/queryEscrowAddressRequest.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "port_id", "Type": "String", "Description": "The unique port identifier", "Required": "Yes"}, + {"Parameter": "channel_id", "Type": "String", "Description": "The unique channel identifier", "Required": "Yes"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/transfer/queryEscrowAddressResponse.json b/source/json_tables/chain/ibc/transfer/queryEscrowAddressResponse.json new file mode 100644 index 00000000..ebab83a1 --- /dev/null +++ b/source/json_tables/chain/ibc/transfer/queryEscrowAddressResponse.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "escrow_address", "Type": "String", "Description": "The escrow account address"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/transfer/queryTotalEscrowForDenomRequest.json b/source/json_tables/chain/ibc/transfer/queryTotalEscrowForDenomRequest.json new file mode 100644 index 00000000..deec1dcc --- /dev/null +++ b/source/json_tables/chain/ibc/transfer/queryTotalEscrowForDenomRequest.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "denom", "Type": "String", "Description": "Token denom", "Required": "Yes"} +] \ No newline at end of file diff --git a/source/json_tables/chain/ibc/transfer/queryTotalEscrowForDenomResponse.json b/source/json_tables/chain/ibc/transfer/queryTotalEscrowForDenomResponse.json new file mode 100644 index 00000000..e293f519 --- /dev/null +++ b/source/json_tables/chain/ibc/transfer/queryTotalEscrowForDenomResponse.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "amount", "Type": "Coin", "Description": "Amount of token in the escrow"} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/abciQueryRequest.json b/source/json_tables/chain/tendermint/abciQueryRequest.json new file mode 100644 index 00000000..fec3c0c8 --- /dev/null +++ b/source/json_tables/chain/tendermint/abciQueryRequest.json @@ -0,0 +1,6 @@ +[ + {"Parameter": "data", "Type": "Bytes", "Description": "Query data", "Required": "No"}, + {"Parameter": "path", "Type": "String", "Description": "Query path", "Required": "Yes"}, + {"Parameter": "haight", "Type": "Integer", "Description": "Block height", "Required": "No"}, + {"Parameter": "prove", "Type": "Boolean", "Description": "", "Required": "No"} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/abciQueryResponse.json b/source/json_tables/chain/tendermint/abciQueryResponse.json new file mode 100644 index 00000000..f73f93c0 --- /dev/null +++ b/source/json_tables/chain/tendermint/abciQueryResponse.json @@ -0,0 +1,11 @@ +[ + {"Parameter": "code", "Type": "Integer", "Description": "Query result code (zero: success, non-zero: error"}, + {"Parameter": "log", "Type": "String", "Description": ""}, + {"Parameter": "info", "Type": "String", "Description": ""}, + {"Parameter": "index", "Type": "Integer", "Description": ""}, + {"Parameter": "key", "Type": "Bytes", "Description": ""}, + {"Parameter": "value", "Type": "Bytes", "Description": ""}, + {"Parameter": "proof_ops", "Type": "ProofOps", "Description": ""}, + {"Parameter": "height", "Type": "Integer", "Description": "Block height"}, + {"Parameter": "codespace", "Type": "String", "Description": ""} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/block.json b/source/json_tables/chain/tendermint/block.json new file mode 100644 index 00000000..f5f04ae2 --- /dev/null +++ b/source/json_tables/chain/tendermint/block.json @@ -0,0 +1,6 @@ +[ + {"Parameter": "header", "Type": "Header", "Description": "Header information"}, + {"Parameter": "data", "Type": "Data", "Description": "Block data"}, + {"Parameter": "evidence", "Type": "EvidenceList", "Description": ""}, + {"Parameter": "last_commit", "Type": "Commit", "Description": ""} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/blockID.json b/source/json_tables/chain/tendermint/blockID.json new file mode 100644 index 00000000..e4a6d109 --- /dev/null +++ b/source/json_tables/chain/tendermint/blockID.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "hash", "Type": "Bytes", "Description": "Block hash"}, + {"Parameter": "part_set_header", "Type": "PartSetHeader", "Description": ""} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/blockIDFlag.json b/source/json_tables/chain/tendermint/blockIDFlag.json new file mode 100644 index 00000000..614a3ad9 --- /dev/null +++ b/source/json_tables/chain/tendermint/blockIDFlag.json @@ -0,0 +1,6 @@ +[ + {"Code": "0", "Name": "BLOCK_ID_FLAG_UNKNOWN"}, + {"Code": "1", "Name": "BLOCK_ID_FLAG_ABSENT"}, + {"Code": "2", "Name": "BLOCK_ID_FLAG_COMMIT"}, + {"Code": "3", "Name": "BLOCK_ID_FLAG_NIL"} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/commit.json b/source/json_tables/chain/tendermint/commit.json new file mode 100644 index 00000000..6ce8184b --- /dev/null +++ b/source/json_tables/chain/tendermint/commit.json @@ -0,0 +1,6 @@ +[ + {"Parameter": "height", "Type": "Integer", "Description": "Block height"}, + {"Parameter": "round", "Type": "Integer", "Description": "Consensus round"}, + {"Parameter": "block_id", "Type": "BlockID", "Description": "Block identifier"}, + {"Parameter": "signatures", "Type": "CommitSig Array", "Description": "Sigantures"} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/commitSig.json b/source/json_tables/chain/tendermint/commitSig.json new file mode 100644 index 00000000..31107bab --- /dev/null +++ b/source/json_tables/chain/tendermint/commitSig.json @@ -0,0 +1,6 @@ +[ + {"Parameter": "block_id_flag", "Type": "BlockIDFlag", "Description": "Block height"}, + {"Parameter": "validator_address", "Type": "Bytes", "Description": "Validator address"}, + {"Parameter": "timestamp", "Type": "Time", "Description": "Block time"}, + {"Parameter": "signature", "Type": "Bytes", "Description": "Block signature"} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/consensus.json b/source/json_tables/chain/tendermint/consensus.json new file mode 100644 index 00000000..91a5e695 --- /dev/null +++ b/source/json_tables/chain/tendermint/consensus.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "block", "Type": "Integer", "Description": ""}, + {"Parameter": "app", "Type": "Integer", "Description": ""} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/data.json b/source/json_tables/chain/tendermint/data.json new file mode 100644 index 00000000..94b278fd --- /dev/null +++ b/source/json_tables/chain/tendermint/data.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "txs", "Type": "Byte Array", "Description": "Txs that will be applied by state @ block.Height+1. NOTE: not all txs here are valid. We're just agreeing on the order first. This means that block.AppHash does not include these txs."} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/defaultNodeInfo.json b/source/json_tables/chain/tendermint/defaultNodeInfo.json new file mode 100644 index 00000000..10cb5cde --- /dev/null +++ b/source/json_tables/chain/tendermint/defaultNodeInfo.json @@ -0,0 +1,10 @@ +[ + {"Parameter": "protocol_version", "Type": "ProtocolVersion", "Description": "Protocol version information"}, + {"Parameter": "default_nod_id", "Type": "String", "Description": "Node identifier"}, + {"Parameter": "listen_addr", "Type": "String", "Description": "URI of the node's listening endpoint"}, + {"Parameter": "network", "Type": "String", "Description": "The chain network name"}, + {"Parameter": "version", "Type": "String", "Description": "The version number"}, + {"Parameter": "channels", "Type": "Bytes", "Description": "Channels information"}, + {"Parameter": "moniker", "Type": "String", "Description": ""}, + {"Parameter": "other", "Type": "DefaultNodeInfoOther", "Description": "Extra node information"} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/defaultNodeInfoOther.json b/source/json_tables/chain/tendermint/defaultNodeInfoOther.json new file mode 100644 index 00000000..f3b58931 --- /dev/null +++ b/source/json_tables/chain/tendermint/defaultNodeInfoOther.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "tx_index", "Type": "String", "Description": "TX indexing status (on/off)"}, + {"Parameter": "rpc_address", "Type": "String", "Description": "URI for RPC connections"} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/evidence.json b/source/json_tables/chain/tendermint/evidence.json new file mode 100644 index 00000000..55055422 --- /dev/null +++ b/source/json_tables/chain/tendermint/evidence.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "sum", "Type": "isEvidence_Sum", "Description": "Valid types for 'sum' are Evidence_DuplicateVoteEvidence and Evidence_LightClientAttackEvidence"} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/evidenceList.json b/source/json_tables/chain/tendermint/evidenceList.json new file mode 100644 index 00000000..19e28976 --- /dev/null +++ b/source/json_tables/chain/tendermint/evidenceList.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "evidence", "Type": "Evidence Array", "Description": "Block evidence"} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/getBlockByHeightRequest.json b/source/json_tables/chain/tendermint/getBlockByHeightRequest.json new file mode 100644 index 00000000..4bde65be --- /dev/null +++ b/source/json_tables/chain/tendermint/getBlockByHeightRequest.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "height", "Type": "Integer", "Description": "Block height", "Required": "Yes"} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/getBlockByHeightResponse.json b/source/json_tables/chain/tendermint/getBlockByHeightResponse.json new file mode 100644 index 00000000..518ddbeb --- /dev/null +++ b/source/json_tables/chain/tendermint/getBlockByHeightResponse.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "block_id", "Type": "BlockID", "Description": "Block identifier"}, + {"Parameter": "sdk_block", "Type": "Block", "Description": "Block details"} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/getLatestBlockResponse.json b/source/json_tables/chain/tendermint/getLatestBlockResponse.json new file mode 100644 index 00000000..518ddbeb --- /dev/null +++ b/source/json_tables/chain/tendermint/getLatestBlockResponse.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "block_id", "Type": "BlockID", "Description": "Block identifier"}, + {"Parameter": "sdk_block", "Type": "Block", "Description": "Block details"} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/getLatestValidatorSetResponse.json b/source/json_tables/chain/tendermint/getLatestValidatorSetResponse.json new file mode 100644 index 00000000..45dbe73d --- /dev/null +++ b/source/json_tables/chain/tendermint/getLatestValidatorSetResponse.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "block_height", "Type": "Integer", "Description": "Block height"}, + {"Parameter": "validators", "Type": "Validator Array", "Description": "List of validators"}, + {"Parameter": "pagination", "Type": "PageResponse", "Description": "Pagination information in the response"} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/getNodeInfoResponse.json b/source/json_tables/chain/tendermint/getNodeInfoResponse.json new file mode 100644 index 00000000..8bbba07b --- /dev/null +++ b/source/json_tables/chain/tendermint/getNodeInfoResponse.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "default_node_info", "Type": "DefaultNodeInfo", "Description": "Node information"}, + {"Parameter": "application_version", "Type": "VersionInfo", "Description": "Node version information"} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/getSyncingResponse.json b/source/json_tables/chain/tendermint/getSyncingResponse.json new file mode 100644 index 00000000..e27b5544 --- /dev/null +++ b/source/json_tables/chain/tendermint/getSyncingResponse.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "syncing", "Type": "Boolean", "Description": "Syncing status"} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/getValidatorSetByHeightRequest.json b/source/json_tables/chain/tendermint/getValidatorSetByHeightRequest.json new file mode 100644 index 00000000..25dba463 --- /dev/null +++ b/source/json_tables/chain/tendermint/getValidatorSetByHeightRequest.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "height", "Type": "Integer", "Description": "Block height", "Required": "Yes"}, + {"Parameter": "pagination", "Type": "PageRequest", "Description": "The optional pagination for the request", "Required": "No"} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/getValidatorSetByHeightResponse.json b/source/json_tables/chain/tendermint/getValidatorSetByHeightResponse.json new file mode 100644 index 00000000..45dbe73d --- /dev/null +++ b/source/json_tables/chain/tendermint/getValidatorSetByHeightResponse.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "block_height", "Type": "Integer", "Description": "Block height"}, + {"Parameter": "validators", "Type": "Validator Array", "Description": "List of validators"}, + {"Parameter": "pagination", "Type": "PageResponse", "Description": "Pagination information in the response"} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/header.json b/source/json_tables/chain/tendermint/header.json new file mode 100644 index 00000000..b1a3bcc3 --- /dev/null +++ b/source/json_tables/chain/tendermint/header.json @@ -0,0 +1,16 @@ +[ + {"Parameter": "version", "Type": "Consensus", "Description": ""}, + {"Parameter": "chain_id", "Type": "String", "Description": "Chain identifier"}, + {"Parameter": "height", "Type": "Integer", "Description": "Block height"}, + {"Parameter": "time", "Type": "Time", "Description": "Block time"}, + {"Parameter": "last_block_id", "Type": "BlockID", "Description": "Previous block identifier"}, + {"Parameter": "last_commit_hash", "Type": "Bytes", "Description": "Last commit hash"}, + {"Parameter": "data_hash", "Type": "Bytes", "Description": "Block data hash"}, + {"Parameter": "validators_hash", "Type": "Bytes", "Description": "Validators information hash"}, + {"Parameter": "next_validators_hash", "Type": "Bytes", "Description": "Validators information hash"}, + {"Parameter": "consensus_hash", "Type": "Bytes", "Description": "Consensus information hash"}, + {"Parameter": "app_hash", "Type": "Bytes", "Description": "Application hash"}, + {"Parameter": "last_result_hash", "Type": "Bytes", "Description": "Last result hash"}, + {"Parameter": "evidence_hash", "Type": "Bytes", "Description": "Evidence data hash"}, + {"Parameter": "proposer_address", "Type": "String", "Description": "Block proposer's address"} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/module.json b/source/json_tables/chain/tendermint/module.json new file mode 100644 index 00000000..c172e38b --- /dev/null +++ b/source/json_tables/chain/tendermint/module.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "path", "Type": "String", "Description": "Module path"}, + {"Parameter": "version", "Type": "String", "Description": "Module version"}, + {"Parameter": "sum", "Type": "String", "Description": "Checksum"} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/partSetHeader.json b/source/json_tables/chain/tendermint/partSetHeader.json new file mode 100644 index 00000000..5d363ecb --- /dev/null +++ b/source/json_tables/chain/tendermint/partSetHeader.json @@ -0,0 +1,4 @@ +[ + {"Parameter": "total", "Type": "Integer", "Description": ""}, + {"Parameter": "hash", "Type": "Bytes", "Description": ""} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/proofOp.json b/source/json_tables/chain/tendermint/proofOp.json new file mode 100644 index 00000000..74f049f3 --- /dev/null +++ b/source/json_tables/chain/tendermint/proofOp.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "type", "Type": "String", "Description": ""}, + {"Parameter": "key", "Type": "Bytes", "Description": ""}, + {"Parameter": "data", "Type": "Bytes", "Description": ""} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/proofOps.json b/source/json_tables/chain/tendermint/proofOps.json new file mode 100644 index 00000000..7ca18025 --- /dev/null +++ b/source/json_tables/chain/tendermint/proofOps.json @@ -0,0 +1,3 @@ +[ + {"Parameter": "ops", "Type": "ProofOp Array", "Description": ""} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/protocolVersion.json b/source/json_tables/chain/tendermint/protocolVersion.json new file mode 100644 index 00000000..b7a88458 --- /dev/null +++ b/source/json_tables/chain/tendermint/protocolVersion.json @@ -0,0 +1,5 @@ +[ + {"Parameter": "p2p", "Type": "Integer", "Description": ""}, + {"Parameter": "block", "Type": "Integer", "Description": ""}, + {"Parameter": "app", "Type": "Integer", "Description": ""} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/validator.json b/source/json_tables/chain/tendermint/validator.json new file mode 100644 index 00000000..bbc221a7 --- /dev/null +++ b/source/json_tables/chain/tendermint/validator.json @@ -0,0 +1,6 @@ +[ + {"Parameter": "address", "Type": "String", "Description": "Validator's address"}, + {"Parameter": "pub_key", "Type": "Any", "Description": "Validator's public key"}, + {"Parameter": "voting_power", "Type": "Integer", "Description": "Validator's voting power"}, + {"Parameter": "proposer_priority", "Type": "Integer", "Description": ""} +] \ No newline at end of file diff --git a/source/json_tables/chain/tendermint/versionInfo.json b/source/json_tables/chain/tendermint/versionInfo.json new file mode 100644 index 00000000..7cca363a --- /dev/null +++ b/source/json_tables/chain/tendermint/versionInfo.json @@ -0,0 +1,10 @@ +[ + {"Parameter": "name", "Type": "String", "Description": "The chain name"}, + {"Parameter": "app_name", "Type": "String", "Description": "Application name"}, + {"Parameter": "version", "Type": "String", "Description": "Application version"}, + {"Parameter": "git_commit", "Type": "String", "Description": "Git commit hash"}, + {"Parameter": "build_tags", "Type": "String", "Description": "Application build tags"}, + {"Parameter": "go_version", "Type": "String", "Description": "GoLang version used to compile the application"}, + {"Parameter": "build_deps", "Type": "Module Array", "Description": "Application dependencies"}, + {"Parameter": "cosmos_sdk_version", "Type": "String", "Description": "Cosmos SDK version used by the application"} +] \ No newline at end of file