Skip to content

Commit 388f960

Browse files
SegfaultdSegfaultFabrice BascoulergueEnguerrand Pinotdependabot[bot]
authored
Added query client for beam. Regenerated proto codecs (#22)
* [SBC-152] Protocol upgrade (#12) * Beam messages integration (#10) * CI/CD pipes improvement, added contributing file * Move types declaration dependencies in production from dev dependencies * Update auto generated docs * 0.3.4 * Add support for ulum base denom * 0.3.5 * Added beam proto generation * Use builtin codecs * Added beam messages, fixed duplicate interface usage * Added editor config (webstorm) * Fixed typo * Removed not relevant test * Fixed codec compilation * Added basic beam test Co-authored-by: Segfault <tyldar@users.noreply.github.com> Co-authored-by: Fabrice Bascoulergue <fabrice@flashgap.com> Co-authored-by: Enguerrand Pinot <enguerrand@baldr.co> * 0.3.6 * Protocol upgrade Co-authored-by: Segfault <tyldar@users.noreply.github.com> Co-authored-by: Fabrice Bascoulergue <fabrice@flashgap.com> Co-authored-by: Enguerrand Pinot <enguerrand@baldr.co> * Bumped version * Fix log parsing for failed transactions * Bump version to 0.4.1 * Bump lodash from 4.17.20 to 4.17.21 (#15) * Bump browserslist from 4.16.3 to 4.16.6 (#14) * Bump version to 0.4.2 * [SBC-170] Reflect protocol upgrades (#18) * Reflect beam protocol upgrade * Added another test for beam review * Reflect protocol upgrade * Fixed messages builder * Fixed test suite * Bump version * Bump jest timeout * Bump timeout * Added missing auto close / expire features * Bump version * Fix ulum to ulum unit conversion * Bump version to 0.4.5 * Added missing beam extension and fixed paths * Added beam open / close unit test * Bump version Co-authored-by: Segfault <tyldar@users.noreply.github.com> Co-authored-by: Fabrice Bascoulergue <fabrice@flashgap.com> Co-authored-by: Enguerrand Pinot <enguerrand@baldr.co> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
1 parent b8fcc9d commit 388f960

File tree

7 files changed

+144
-35
lines changed

7 files changed

+144
-35
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@lum-network/sdk-javascript",
3-
"version": "0.4.5",
3+
"version": "0.4.6",
44
"license": "Apache-2.0",
55
"description": "Javascript SDK library for NodeJS and Web browsers to interact with the Lum Network.",
66
"homepage": "https://github.com/lum-network/sdk-javascript#readme",

src/client/LumClient.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@ import {
1414

1515
import { BaseAccount } from '../codec/cosmos/auth/v1beta1/auth';
1616
import { LumWallet, LumUtils, LumTypes, LumRegistry } from '..';
17+
import { BeamExtension, setupBeamExtension as BeamSetupBeamExtension } from '../extensions';
1718

1819
export class LumClient {
1920
readonly tmClient: Tendermint34Client;
20-
readonly queryClient: StargateQueryClient & AuthExtension & BankExtension & DistributionExtension & StakingExtension;
21+
readonly queryClient: StargateQueryClient & AuthExtension & BankExtension & DistributionExtension & StakingExtension & BeamExtension;
2122
private chainId?: string;
2223

2324
/**
@@ -27,7 +28,14 @@ export class LumClient {
2728
*/
2829
constructor(tmClient: Tendermint34Client) {
2930
this.tmClient = tmClient;
30-
this.queryClient = StargateQueryClient.withExtensions(tmClient, StargateSetupAuthExtension, StargateSetupBankExtension, StargateDistributionExtension, StargateStakingExtension);
31+
this.queryClient = StargateQueryClient.withExtensions(
32+
tmClient,
33+
StargateSetupAuthExtension,
34+
StargateSetupBankExtension,
35+
StargateDistributionExtension,
36+
StargateStakingExtension,
37+
BeamSetupBeamExtension,
38+
);
3139

3240
// Used for debugging while gasWanted, gasUsed and codespace are still waiting to be included in the code lib
3341
// // @ts-ignore

src/codec/chain/beam/beam.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,25 @@ import { Coin } from '../../cosmos/base/v1beta1/coin';
66
export const protobufPackage = 'lum.network.beam';
77

88
export enum BeamState {
9-
OPEN = 0,
10-
CANCELED = 1,
11-
CLOSED = 2,
9+
UNSPECIFIED = 0,
10+
OPEN = 1,
11+
CANCELED = 2,
12+
CLOSED = 3,
1213
UNRECOGNIZED = -1,
1314
}
1415

1516
export function beamStateFromJSON(object: any): BeamState {
1617
switch (object) {
1718
case 0:
19+
case 'UNSPECIFIED':
20+
return BeamState.UNSPECIFIED;
21+
case 1:
1822
case 'OPEN':
1923
return BeamState.OPEN;
20-
case 1:
24+
case 2:
2125
case 'CANCELED':
2226
return BeamState.CANCELED;
23-
case 2:
27+
case 3:
2428
case 'CLOSED':
2529
return BeamState.CLOSED;
2630
case -1:
@@ -32,6 +36,8 @@ export function beamStateFromJSON(object: any): BeamState {
3236

3337
export function beamStateToJSON(object: BeamState): string {
3438
switch (object) {
39+
case BeamState.UNSPECIFIED:
40+
return 'UNSPECIFIED';
3541
case BeamState.OPEN:
3642
return 'OPEN';
3743
case BeamState.CANCELED:

src/codec/chain/beam/query.ts

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ export interface QueryGetBeamRequest {
1111
}
1212

1313
export interface QueryGetBeamResponse {
14-
Beam?: Beam;
14+
beam?: Beam;
1515
}
1616

1717
export interface QueryFetchBeamsRequest {
1818
pagination?: PageRequest;
1919
}
2020

2121
export interface QueryFetchBeamsResponse {
22-
Beam: Beam[];
22+
beams: Beam[];
2323
pagination?: PageResponse;
2424
}
2525

@@ -82,8 +82,8 @@ const baseQueryGetBeamResponse: object = {};
8282

8383
export const QueryGetBeamResponse = {
8484
encode(message: QueryGetBeamResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
85-
if (message.Beam !== undefined) {
86-
Beam.encode(message.Beam, writer.uint32(10).fork()).ldelim();
85+
if (message.beam !== undefined) {
86+
Beam.encode(message.beam, writer.uint32(10).fork()).ldelim();
8787
}
8888
return writer;
8989
},
@@ -96,7 +96,7 @@ export const QueryGetBeamResponse = {
9696
const tag = reader.uint32();
9797
switch (tag >>> 3) {
9898
case 1:
99-
message.Beam = Beam.decode(reader, reader.uint32());
99+
message.beam = Beam.decode(reader, reader.uint32());
100100
break;
101101
default:
102102
reader.skipType(tag & 7);
@@ -108,26 +108,26 @@ export const QueryGetBeamResponse = {
108108

109109
fromJSON(object: any): QueryGetBeamResponse {
110110
const message = { ...baseQueryGetBeamResponse } as QueryGetBeamResponse;
111-
if (object.Beam !== undefined && object.Beam !== null) {
112-
message.Beam = Beam.fromJSON(object.Beam);
111+
if (object.beam !== undefined && object.beam !== null) {
112+
message.beam = Beam.fromJSON(object.beam);
113113
} else {
114-
message.Beam = undefined;
114+
message.beam = undefined;
115115
}
116116
return message;
117117
},
118118

119119
toJSON(message: QueryGetBeamResponse): unknown {
120120
const obj: any = {};
121-
message.Beam !== undefined && (obj.Beam = message.Beam ? Beam.toJSON(message.Beam) : undefined);
121+
message.beam !== undefined && (obj.beam = message.beam ? Beam.toJSON(message.beam) : undefined);
122122
return obj;
123123
},
124124

125125
fromPartial(object: DeepPartial<QueryGetBeamResponse>): QueryGetBeamResponse {
126126
const message = { ...baseQueryGetBeamResponse } as QueryGetBeamResponse;
127-
if (object.Beam !== undefined && object.Beam !== null) {
128-
message.Beam = Beam.fromPartial(object.Beam);
127+
if (object.beam !== undefined && object.beam !== null) {
128+
message.beam = Beam.fromPartial(object.beam);
129129
} else {
130-
message.Beam = undefined;
130+
message.beam = undefined;
131131
}
132132
return message;
133133
},
@@ -192,7 +192,7 @@ const baseQueryFetchBeamsResponse: object = {};
192192

193193
export const QueryFetchBeamsResponse = {
194194
encode(message: QueryFetchBeamsResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
195-
for (const v of message.Beam) {
195+
for (const v of message.beams) {
196196
Beam.encode(v!, writer.uint32(10).fork()).ldelim();
197197
}
198198
if (message.pagination !== undefined) {
@@ -205,12 +205,12 @@ export const QueryFetchBeamsResponse = {
205205
const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input);
206206
let end = length === undefined ? reader.len : reader.pos + length;
207207
const message = { ...baseQueryFetchBeamsResponse } as QueryFetchBeamsResponse;
208-
message.Beam = [];
208+
message.beams = [];
209209
while (reader.pos < end) {
210210
const tag = reader.uint32();
211211
switch (tag >>> 3) {
212212
case 1:
213-
message.Beam.push(Beam.decode(reader, reader.uint32()));
213+
message.beams.push(Beam.decode(reader, reader.uint32()));
214214
break;
215215
case 2:
216216
message.pagination = PageResponse.decode(reader, reader.uint32());
@@ -225,10 +225,10 @@ export const QueryFetchBeamsResponse = {
225225

226226
fromJSON(object: any): QueryFetchBeamsResponse {
227227
const message = { ...baseQueryFetchBeamsResponse } as QueryFetchBeamsResponse;
228-
message.Beam = [];
229-
if (object.Beam !== undefined && object.Beam !== null) {
230-
for (const e of object.Beam) {
231-
message.Beam.push(Beam.fromJSON(e));
228+
message.beams = [];
229+
if (object.beams !== undefined && object.beams !== null) {
230+
for (const e of object.beams) {
231+
message.beams.push(Beam.fromJSON(e));
232232
}
233233
}
234234
if (object.pagination !== undefined && object.pagination !== null) {
@@ -241,21 +241,21 @@ export const QueryFetchBeamsResponse = {
241241

242242
toJSON(message: QueryFetchBeamsResponse): unknown {
243243
const obj: any = {};
244-
if (message.Beam) {
245-
obj.Beam = message.Beam.map((e) => (e ? Beam.toJSON(e) : undefined));
244+
if (message.beams) {
245+
obj.beams = message.beams.map((e) => (e ? Beam.toJSON(e) : undefined));
246246
} else {
247-
obj.Beam = [];
247+
obj.beams = [];
248248
}
249249
message.pagination !== undefined && (obj.pagination = message.pagination ? PageResponse.toJSON(message.pagination) : undefined);
250250
return obj;
251251
},
252252

253253
fromPartial(object: DeepPartial<QueryFetchBeamsResponse>): QueryFetchBeamsResponse {
254254
const message = { ...baseQueryFetchBeamsResponse } as QueryFetchBeamsResponse;
255-
message.Beam = [];
256-
if (object.Beam !== undefined && object.Beam !== null) {
257-
for (const e of object.Beam) {
258-
message.Beam.push(Beam.fromPartial(e));
255+
message.beams = [];
256+
if (object.beams !== undefined && object.beams !== null) {
257+
for (const e of object.beams) {
258+
message.beams.push(Beam.fromPartial(e));
259259
}
260260
}
261261
if (object.pagination !== undefined && object.pagination !== null) {

src/extensions/beam.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { createProtobufRpcClient, QueryClient } from '@cosmjs/stargate';
2+
3+
import { assert } from '@cosmjs/utils';
4+
5+
import { Beam } from '../codec/chain/beam/beam';
6+
import { QueryClientImpl } from '../codec/chain/beam/query';
7+
8+
export interface BeamExtension {
9+
readonly beam: {
10+
readonly get: (id: string) => Promise<Beam>;
11+
readonly fetch: () => Promise<Beam[]>;
12+
};
13+
}
14+
15+
export const setupBeamExtension = (base: QueryClient): BeamExtension => {
16+
const rpc = createProtobufRpcClient(base);
17+
const queryService = new QueryClientImpl(rpc);
18+
19+
return {
20+
beam: {
21+
get: async (id: string) => {
22+
const { beam } = await queryService.Beam({ id });
23+
assert(beam);
24+
return beam;
25+
},
26+
fetch: async () => {
27+
const { beams } = await queryService.Beams({});
28+
assert(beams);
29+
return beams;
30+
},
31+
},
32+
};
33+
};

src/extensions/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './beam';

tests/client.test.ts

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { LumWallet, LumWalletFactory, LumClient, LumUtils, LumConstants, LumRegistry, LumTypes, LumMessages } from '../src';
22
import axios from 'axios';
3-
import { BeamData } from "../src/codec/chain/beam/beam";
3+
import { BeamData, BeamState } from "../src/codec/chain/beam/beam";
44

55
const randomString = (): string => {
66
return Math.random().toString(36).substring(7);
@@ -47,6 +47,67 @@ describe('LumClient', () => {
4747
await expect(clt.disconnect()).resolves.toBeTruthy();
4848
});
4949

50+
it('should open a beam and close it', async () => {
51+
const beamId = randomString();
52+
53+
let acc = await clt.getAccount(w1.getAddress());
54+
expect(acc).toBeTruthy();
55+
56+
const chainId = await clt.getChainId();
57+
const amount: LumTypes.Coin = {
58+
amount: '1',
59+
denom: LumConstants.MicroLumDenom,
60+
};
61+
62+
const fee = {
63+
amount: [{ denom: LumConstants.MicroLumDenom, amount: '1' }],
64+
gas: '100000',
65+
};
66+
67+
// Create the beam
68+
let doc = {
69+
accountNumber: acc.accountNumber,
70+
chainId,
71+
fee: fee,
72+
memo: 'Beam review transaction',
73+
messages: [LumMessages.BuildMsgOpenBeam(beamId, w1.getAddress(), '', amount, 'test', 'lum-network/review', null, 0, 0)],
74+
signers: [
75+
{
76+
accountNumber: acc.accountNumber,
77+
sequence: acc.sequence,
78+
publicKey: w1.getPublicKey(),
79+
},
80+
],
81+
};
82+
83+
const txCreate = await clt.signAndBroadcastTx(w1, doc);
84+
expect(txCreate.deliverTx.code).toBe(0);
85+
const beamAfterCreate = await clt.queryClient.beam.get(beamId);
86+
expect(beamAfterCreate.status).toBe(BeamState.OPEN);
87+
88+
// Update the beam
89+
acc = await clt.getAccount(w1.getAddress());
90+
doc = {
91+
accountNumber: acc.accountNumber,
92+
chainId,
93+
fee: fee,
94+
memo: 'Beam review transaction',
95+
messages: [LumMessages.BuildMsgUpdateBeam(beamId, w1.getAddress(), null, BeamState.CANCELED)],
96+
signers: [
97+
{
98+
accountNumber: acc.accountNumber,
99+
sequence: acc.sequence,
100+
publicKey: w1.getPublicKey(),
101+
},
102+
],
103+
};
104+
105+
const txUpdate = await clt.signAndBroadcastTx(w1, doc);
106+
expect(txUpdate.deliverTx.code).toBe(0);
107+
const beamAfterUpdate = await clt.queryClient.beam.get(beamId);
108+
expect(beamAfterUpdate.status).toBe(BeamState.CANCELED);
109+
});
110+
50111
it('should open a beam review transaction', async () => {
51112
const beamId = randomString();
52113

0 commit comments

Comments
 (0)