diff --git a/packages/demo-protobuf/package.json b/packages/demo-protobuf/package.json index b1736fb098..4d835b30fa 100644 --- a/packages/demo-protobuf/package.json +++ b/packages/demo-protobuf/package.json @@ -41,6 +41,7 @@ "protobufjs": "~6.9.0" }, "devDependencies": { + "@cosmjs/encoding": "^0.20.0", "@cosmjs/utils": "^0.20.0" } } diff --git a/packages/demo-protobuf/src/msgs.spec.ts b/packages/demo-protobuf/src/msgs.spec.ts new file mode 100644 index 0000000000..e30c979964 --- /dev/null +++ b/packages/demo-protobuf/src/msgs.spec.ts @@ -0,0 +1,37 @@ +/* eslint-disable @typescript-eslint/camelcase */ +import { fromHex } from "@cosmjs/encoding"; + +import { cosmos_sdk as cosmosSdk } from "./generated/codecimpl"; +import { Coin, MsgSend } from "./msgs"; + +describe("msgs", () => { + it("encodes decorated MsgSend equally to static code", () => { + const alice = fromHex("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); + const bob = fromHex("BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"); + const amount = [ + new Coin({ denom: "utoken", amount: "123" }), + new Coin({ denom: "ustake", amount: "654" }), + ]; + const donation = new MsgSend({ from_address: alice, to_address: bob, amount }); + + const expected = cosmosSdk.x.bank.v1.MsgSend.encode( + cosmosSdk.x.bank.v1.MsgSend.create({ + fromAddress: alice, + toAddress: bob, + amount: [ + cosmosSdk.v1.Coin.create({ + denom: "utoken", + amount: "123", + }), + cosmosSdk.v1.Coin.create({ + denom: "ustake", + amount: "654", + }), + ], + }), + ).finish(); + + const encoded = MsgSend.encode(donation).finish(); + expect(encoded).toEqual(expected); + }); +}); diff --git a/packages/demo-protobuf/src/msgs.ts b/packages/demo-protobuf/src/msgs.ts new file mode 100644 index 0000000000..87a4712884 --- /dev/null +++ b/packages/demo-protobuf/src/msgs.ts @@ -0,0 +1,27 @@ +import { Message } from "protobufjs"; + +import { cosmosField, cosmosMessage } from "./decorator"; +import { Registry } from "./registry"; + +export const defaultRegistry = new Registry(); + +@cosmosMessage(defaultRegistry, "/cosmos.Coin") +export class Coin extends Message<{}> { + @cosmosField.string(1) + public readonly denom?: string; + + @cosmosField.string(2) + public readonly amount?: string; +} + +@cosmosMessage(defaultRegistry, "/cosmos.bank.MsgSend") +export class MsgSend extends Message<{}> { + @cosmosField.bytes(1) + public readonly from_address?: Uint8Array; + + @cosmosField.bytes(2) + public readonly to_address?: Uint8Array; + + @cosmosField.repeatedNested(3, Coin) + public readonly amount?: readonly Coin[]; +} diff --git a/packages/demo-protobuf/types/msgs.d.ts b/packages/demo-protobuf/types/msgs.d.ts new file mode 100644 index 0000000000..59cea8508d --- /dev/null +++ b/packages/demo-protobuf/types/msgs.d.ts @@ -0,0 +1,12 @@ +import { Message } from "protobufjs"; +import { Registry } from "./registry"; +export declare const defaultRegistry: Registry; +export declare class Coin extends Message<{}> { + readonly denom?: string; + readonly amount?: string; +} +export declare class MsgSend extends Message<{}> { + readonly from_address?: Uint8Array; + readonly to_address?: Uint8Array; + readonly amount?: readonly Coin[]; +}