From 1e4122f8d39681dd1a97c16126d0255dcdfe87fb Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 23 Jun 2020 15:14:31 +0200 Subject: [PATCH 1/3] Add repeatedNested --- packages/demo-protobuf/src/decorator.ts | 5 ++++- packages/demo-protobuf/types/decorator.d.ts | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/demo-protobuf/src/decorator.ts b/packages/demo-protobuf/src/decorator.ts index 02f08ab8..43a88dd7 100644 --- a/packages/demo-protobuf/src/decorator.ts +++ b/packages/demo-protobuf/src/decorator.ts @@ -29,6 +29,9 @@ export const cosmosField = { int64: (id: number): FieldDecorator => Field.d(id, "int64"), uint64: (id: number): FieldDecorator => Field.d(id, "uint64"), - repeatedString: (id: number): FieldDecorator => Field.d(id, "string", "repeated"), nested: (id: number, ctor: Constructor>): FieldDecorator => Field.d(id, ctor), + + repeatedString: (id: number): FieldDecorator => Field.d(id, "string", "repeated"), + repeatedNested: (id: number, ctor: Constructor>): FieldDecorator => + Field.d(id, ctor, "repeated"), }; diff --git a/packages/demo-protobuf/types/decorator.d.ts b/packages/demo-protobuf/types/decorator.d.ts index 68f9655c..9a5d8591 100644 --- a/packages/demo-protobuf/types/decorator.d.ts +++ b/packages/demo-protobuf/types/decorator.d.ts @@ -11,6 +11,7 @@ export declare const cosmosField: { bytes: (id: number) => FieldDecorator; int64: (id: number) => FieldDecorator; uint64: (id: number) => FieldDecorator; - repeatedString: (id: number) => FieldDecorator; nested: (id: number, ctor: Constructor>) => FieldDecorator; + repeatedString: (id: number) => FieldDecorator; + repeatedNested: (id: number, ctor: Constructor>) => FieldDecorator; }; From d1a069e94e8e6268c8ae8bcc28a78183e8558434 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 23 Jun 2020 15:15:33 +0200 Subject: [PATCH 2/3] Implement MsgSend using decorators --- packages/demo-protobuf/package.json | 1 + packages/demo-protobuf/src/msgs.spec.ts | 37 +++++++++++++++++++++++++ packages/demo-protobuf/src/msgs.ts | 27 ++++++++++++++++++ packages/demo-protobuf/types/msgs.d.ts | 12 ++++++++ 4 files changed, 77 insertions(+) create mode 100644 packages/demo-protobuf/src/msgs.spec.ts create mode 100644 packages/demo-protobuf/src/msgs.ts create mode 100644 packages/demo-protobuf/types/msgs.d.ts diff --git a/packages/demo-protobuf/package.json b/packages/demo-protobuf/package.json index b1736fb0..4d835b30 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 00000000..e30c9799 --- /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 00000000..87a47128 --- /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 00000000..59cea850 --- /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[]; +} From 38e32c618cfb08220a8ffc6a3bee431b5f9891c5 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 23 Jun 2020 16:20:29 +0200 Subject: [PATCH 3/3] Rename nested -> message in decorator --- packages/demo-protobuf/src/decorator.spec.ts | 2 +- packages/demo-protobuf/src/decorator.ts | 4 ++-- packages/demo-protobuf/src/msgs.ts | 2 +- packages/demo-protobuf/types/decorator.d.ts | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/demo-protobuf/src/decorator.spec.ts b/packages/demo-protobuf/src/decorator.spec.ts index 190d1cb0..40f072bd 100644 --- a/packages/demo-protobuf/src/decorator.spec.ts +++ b/packages/demo-protobuf/src/decorator.spec.ts @@ -38,7 +38,7 @@ describe("decorator demo", () => { @cosmosField.repeatedString(6) public readonly listDemo?: readonly string[]; - @cosmosField.nested(7, MsgNestedDemo) + @cosmosField.message(7, MsgNestedDemo) public readonly nestedDemo?: MsgNestedDemo; } diff --git a/packages/demo-protobuf/src/decorator.ts b/packages/demo-protobuf/src/decorator.ts index 43a88dd7..2e48339b 100644 --- a/packages/demo-protobuf/src/decorator.ts +++ b/packages/demo-protobuf/src/decorator.ts @@ -29,9 +29,9 @@ export const cosmosField = { int64: (id: number): FieldDecorator => Field.d(id, "int64"), uint64: (id: number): FieldDecorator => Field.d(id, "uint64"), - nested: (id: number, ctor: Constructor>): FieldDecorator => Field.d(id, ctor), + message: (id: number, ctor: Constructor>): FieldDecorator => Field.d(id, ctor), repeatedString: (id: number): FieldDecorator => Field.d(id, "string", "repeated"), - repeatedNested: (id: number, ctor: Constructor>): FieldDecorator => + repeatedMessage: (id: number, ctor: Constructor>): FieldDecorator => Field.d(id, ctor, "repeated"), }; diff --git a/packages/demo-protobuf/src/msgs.ts b/packages/demo-protobuf/src/msgs.ts index 87a47128..d62c0a50 100644 --- a/packages/demo-protobuf/src/msgs.ts +++ b/packages/demo-protobuf/src/msgs.ts @@ -22,6 +22,6 @@ export class MsgSend extends Message<{}> { @cosmosField.bytes(2) public readonly to_address?: Uint8Array; - @cosmosField.repeatedNested(3, Coin) + @cosmosField.repeatedMessage(3, Coin) public readonly amount?: readonly Coin[]; } diff --git a/packages/demo-protobuf/types/decorator.d.ts b/packages/demo-protobuf/types/decorator.d.ts index 9a5d8591..e5077fa7 100644 --- a/packages/demo-protobuf/types/decorator.d.ts +++ b/packages/demo-protobuf/types/decorator.d.ts @@ -11,7 +11,7 @@ export declare const cosmosField: { bytes: (id: number) => FieldDecorator; int64: (id: number) => FieldDecorator; uint64: (id: number) => FieldDecorator; - nested: (id: number, ctor: Constructor>) => FieldDecorator; + message: (id: number, ctor: Constructor>) => FieldDecorator; repeatedString: (id: number) => FieldDecorator; - repeatedNested: (id: number, ctor: Constructor>) => FieldDecorator; + repeatedMessage: (id: number, ctor: Constructor>) => FieldDecorator; };