Open fmorency opened 1 month ago
I also tried using the MsgSubmitProposalEncoded
as
...
const submitMsg: MsgSubmitProposalEncoded = {
groupPolicyAddress: POA_GROUP_ADDRESS,
title,
summary,
proposers,
exec: Exec.EXEC_UNSPECIFIED,
messages: messages.map((msg) => Any.toProtoMsg(msg)),
metadata: "",
}
const msg = GroupMessageComposer.fromPartial.submitProposal(submitMsg);
const result = await client.signAndBroadcast(signer, [msg], fee);
...
where messages[0]
is, e.g.,
ManifestMessageComposer.encoded.payout({
authority: POA_GROUP_ADDRESS,
payoutPairs: [
{
address: test2Address,
coin: { denom, amount: "1000" },
},
],
});
without luck. I'm getting the following error
TypeError: decoder.toAminoMsg is not a function
196 | }
197 |
> 198 | return decoder.toAminoMsg!(data);
| ^
199 | }
200 | }
201 |
at Function.toAminoMsg (src/codegen/registry.ts:198:20)
at src/codegen/cosmos/group/v1/tx.ts:2870:74
at Array.map (<anonymous>)
at Object.toAmino (src/codegen/cosmos/group/v1/tx.ts:2870:39)
at AminoTypes.toAmino (node_modules/@cosmjs/stargate/src/aminotypes.ts:40:24)
at node_modules/@cosmjs/stargate/src/signingstargateclient.ts:404:56
at Array.map (<anonymous>)
at SigningStargateClient.signAmino (node_modules/@cosmjs/stargate/src/signingstargateclient.ts:404:27)
at SigningStargateClient.signAndBroadcast (node_modules/@cosmjs/stargate/src/signingstargateclient.ts:319:19)
at submitGroupProposal (starship/src/test_helper.ts:105:18)
at submitVoteExecGroupProposal (starship/src/test_helper.ts:162:22)
at Object.<anonymous> (starship/__tests__/manifest.group.test.ts:123:5)
The issue is a Telescope issue but stems from how CosmJS does things in .signAmino
.
// signAmino()
...
const msgs = messages.map((msg) => this.aminoTypes.toAmino(msg));
...
const signedTxBody = {
messages: signed.msgs.map((msg) => this.aminoTypes.fromAmino(msg)),
memo: signed.memo,
timeoutHeight: timeoutHeight,
};
...
The toAmino
and fromAmino
are NOT symmetrical in the case of nested Any
, meaning that converting the Any
from Proto to Amino and back doesn't result in the original Any
.
In MsgSubmitPropoal
, the fromAmino
function performs the following
message.messages = object.messages?.map(e => GlobalDecoderRegistry.fromAminoMsg(e)) || [];
where messages.messages
is an Any[]
. The e
variable is of type AnyAmino
. The call to fromAminoMsg
call the generic fromAminoMsg
method from the registry where the proper decoder is fetched and decoder.fromAminoMsg
is called, effectively calling the proper fromAminoMsg
function from the object concrete type.
At this point, the concrete type of the message is lost because fromAminoMsg
returns a generic object
type which is what gets embedded in the message.messages
field.
This is wrong.
I modified CosmJS so as not to call fromAmino
, i.e.,
const signedTxBody = {
messages,
memo: signed.memo,
timeoutHeight: timeoutHeight,
};
and things started working properly.
Problem
The call to
fromAmino
removes the nested message type indicator in a group proposal, causing an issue when multiple message types contain the same fields.Context
Telescope configuration
The POA module contains MsgRemovePending and MsgRemoveValidator differing only by message name, i.e., the message fields are the same in both messages.
The remove pending validator test creates a
Group Proposal
containing aRemove Pending Validator
message, submits the proposal, vote on it and execute the proposal.Encoding and signing the message using AMINO works fine
The nested message is of the right type. However, the
signedTxBodyEncodedObject
created in thesignAmino
method and broadcasted to the server isNotice that the nested
message
field has no type indicator. This field is created by the call tofromAmino
The message decoded by the server is of type
poa/RemoveValidator
instead ofpoa/RemovePending
causing the signature check to fail. I suspect the lack of type indication in the nested message causes the issue. One is unable to match the type only from the instance.Everything works fine when using the
DIRECT
signer. Everything also works fine using the AMINO signer from themanifestd
CLI.Running the test