// PKGPATH: gno.land/r/aib/main package main import ( "time" "gno.land/p/aib/ibc/lightclient/tendermint" tmtesting "gno.land/p/aib/ibc/lightclient/tendermint/testing" "gno.land/p/aib/ibc/types" "gno.land/r/aib/ibc/core" ) // UpdateClient fails on non-adjacent height because trusted valset VP<=1/3 in // commit signatures. func main(cur realm) { // CreateClient and RegisterCounterparty var ( chainID = "atomone-1" height = uint64(2) clientState = tmtesting.NewClientState(chainID, types.NewHeight(1, height)) apphash = tmtesting.Hash("apphash-2") // priv=8a6cAbQSpDbebmcTEhCMPhhr/SkL/2pizo60yzHRkN9Uyk7RHOZm7g4xW+yeJh147/Z4/6HXF6gBwcFNkLsZ/A== val1 = tendermint.NewValidator("9DIBYr64rywKO3Kk6+743xDHcEU=", "VMpO0RzmZu4OMVvsniYdeO/2eP+h1xeoAcHBTZC7Gfw=", 10) // priv=3nat0JSW5OC1AlXBZzlCNxraEo+TEzBRl25OSVd49mvXboFuK2f45zGOzR+Xw9c1zwBmuHRgJgbLC9g3f1aslQ== val2 = tendermint.NewValidator("imYK9DxXfNOyhCng3Yd6gMf6D4A=", "126Bbitn+Ocxjs0fl8PXNc8AZrh0YCYGywvYN39WrJU=", 10) // priv=lDm4YTzPBhuU3D1OlBCnAQuwU75TPgM20QBoqhHcTquNzr60+tlTHeXTxtx7N16PYCfWDw67DQzE821u4GmlBQ== val3 = tendermint.NewValidator("5mrrMH2SmMLQuF8oIWFKdz7f/JM=", "jc6+tPrZUx3l08bcezdej2An1g8Ouw0MxPNtbuBppQU=", 10) // priv=pLHvSa6Y0gYjNXwr5lWaXaZhDmQDqWJy8hU2037VKzmELkkBf2eUJmtWUtSickhrR408CHvfhhZxjJh7XMIhGQ== val4 = tendermint.NewValidator("EW3bbo3ByJ24Q+Mg+SRoEfCUDV8=", "hC5JAX9nlCZrVlLUonJIa0eNPAh734YWcYyYe1zCIRk=", 10) trustedValset = tendermint.NewValset(val1, val2, val3, val4) consensusState = tmtesting.GenConsensusState(time.Now(), apphash, trustedValset.Hash()) ) clientID := core.CreateClient(cross(cur), clientState, consensusState) core.RegisterCounterparty(cross(cur), clientID, [][]byte{[]byte("iavlStoreKey"), []byte("prefix2")}, "07-tendermint-2") // Update clientID with only val1 from trusted validators // NOTE code generated by: // go run -C ./cmd/gen-block-signatures . -apphash-seed=apphash-3 -chainid=atomone-1 -header-time-shift=1 -height=5 -new-validators=2 -privkeys=8a6cAbQSpDbebmcTEhCMPhhr/SkL/2pizo60yzHRkN9Uyk7RHOZm7g4xW+yeJh147/Z4/6HXF6gBwcFNkLsZ/A== { var ( apphash = tmtesting.Hash("apphash-3") // priv=PxtG6dspnQDl/+colVJk+hQ7I2YnrAmksifvpU6K+9lj5XzHQc989GB0qsKeB7AHK3KLGxZNhxePkyIAwQbLSw== val5 = tendermint.NewValidator("F3eB3fOMcxmHSdDPWMpc1ItmJ/8=", "Y+V8x0HPfPRgdKrCngewBytyixsWTYcXj5MiAMEGy0s=", 10) // priv=WUh+Zk10Y2DCt00T8b4dMM53r4n25n1YQ7e8uwk9P2SeJjaHexeabLnrbhaTMsmCgBt0ZyQyAi9WMTzXO5k9IA== val6 = tendermint.NewValidator("snclKMFSS1jnr2BGOrlAyl92sOk=", "niY2h3sXmmy5624WkzLJgoAbdGckMgIvVjE81zuZPSA=", 10) valset = tendermint.NewValset(val1, val5, val6) commitTimestamp = tmtesting.ToTime("2025-09-25T07:55:57.306746166Z") newHeight = uint64(5) newTimestamp = consensusState.Timestamp.Add(time.Minute * time.Duration(1)) nextValset = tendermint.NewValset(val1, val5, val6) trustedHeight = clientState.LatestHeight signatures = []tendermint.CommitSig{ { BlockIDFlag: tendermint.BlockIDFlagCommit, ValidatorAddress: valset.Validators[0].Address, Timestamp: commitTimestamp, Signature: []byte("\x62\xfe\x4e\x31\x2a\x68\x50\x6b\x01\x07\xe3\x12\x88\xae\x6c\xee\xa3\x5a\xf5\xcd\xfb\xd6\x95\x3f\x26\x0b\x00\x6c\x4d\xbd\x91\xc8\x80\xeb\x3f\x94\x71\x75\x65\xa4\x11\x0f\x66\x63\x22\xf8\xe5\x1e\x08\x58\x39\x69\xd0\xf6\x82\x3c\xbf\xdc\xb7\x00\xa3\x4d\x36\x08"), }, { BlockIDFlag: tendermint.BlockIDFlagCommit, ValidatorAddress: valset.Validators[1].Address, Timestamp: commitTimestamp, Signature: []byte("\xec\xa1\x7b\xf9\xa4\xab\x28\x6d\x6c\x17\xd8\x14\x69\xf4\x56\xad\x59\xaa\x24\x59\xae\x74\x60\x4c\x45\x6c\x67\x0b\x78\x28\x57\xc9\x15\xbf\x1f\x7c\xa0\x4b\xa7\x2d\x05\x11\x79\x24\xac\x07\x09\x7a\xe3\xaa\x46\x59\x44\x5f\xa9\x6d\xbc\x22\x24\x3e\xbc\x52\xfb\x0c"), }, { BlockIDFlag: tendermint.BlockIDFlagCommit, ValidatorAddress: valset.Validators[2].Address, Timestamp: commitTimestamp, Signature: []byte("\x58\xac\xfb\x93\x7d\xc6\x83\xd4\xcf\x39\x8b\x4f\x91\xb8\x78\x63\xab\x75\x7f\x1d\xe5\x43\x2a\xb9\x68\x80\xb7\x73\x4d\x84\x59\x2d\x90\xf8\x24\x01\x3c\x6a\xfa\xb6\x7e\x2f\x0e\x3e\x66\x35\x3b\xe2\x2c\xa6\x53\xcc\xc3\xb8\x66\x1a\x54\xf3\xcf\x03\xc7\x8f\x3e\x0d"), }, } msgHeader = tmtesting.NewMsgHeader( chainID, newTimestamp, apphash, newHeight, trustedHeight, valset, nextValset, trustedValset, signatures, ) ) core.UpdateClient(cross(cur), clientID, msgHeader) } } // Error: // check trusted validators VP>13: not enough voting power, got 10, needed >13