Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
2425cc5
[SBC-152] Protocol upgrade (#12)
Segfaultd May 18, 2021
8058340
Merge branch 'develop' of github.com:lum-network/sdk-javascript into …
Segfaultd May 18, 2021
ed1985e
Bumped version
Segfaultd May 18, 2021
9cbaf2a
Fix log parsing for failed transactions
Jun 2, 2021
fb3b14b
Bump version to 0.4.1
Jun 2, 2021
bccc9ae
Merge branch 'develop' of github.com:lum-network/sdk-javascript into …
Jun 2, 2021
4cfbbb6
Merge branch 'master' into develop
Jun 2, 2021
3ba57e0
Bump lodash from 4.17.20 to 4.17.21 (#15)
dependabot[bot] Jun 2, 2021
40edff3
Bump browserslist from 4.16.3 to 4.16.6 (#14)
dependabot[bot] Jun 2, 2021
778d616
Bump version to 0.4.2
Jun 2, 2021
6dd51cc
Merge branch 'master' into develop
Jun 2, 2021
cb19991
[SBC-170] Reflect protocol upgrades (#18)
Segfaultd Jun 8, 2021
f7b2ca6
Merge branch 'master' of github.com:lum-network/sdk-javascript into d…
Segfaultd Jun 8, 2021
48b8c2f
Merge branch 'develop' of github.com:lum-network/sdk-javascript into …
Segfaultd Jun 8, 2021
006bd05
Added missing auto close / expire features
Segfaultd Jun 8, 2021
3e0e5a0
Bump version
Segfaultd Jun 8, 2021
9d28b92
Merge branch 'master' into develop
Jun 11, 2021
a5c14b3
Fix ulum to ulum unit conversion
Jun 11, 2021
61e3a55
Bump version to 0.4.5
Jun 11, 2021
622d263
Merge branch 'master' into develop
Jun 11, 2021
188a8e2
Added missing beam extension and fixed paths
Segfaultd Jun 14, 2021
035fb5a
Added beam open / close unit test
Segfaultd Jun 14, 2021
f8b75bf
Bump version
Segfaultd Jun 14, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@lum-network/sdk-javascript",
"version": "0.4.5",
"version": "0.4.6",
"license": "Apache-2.0",
"description": "Javascript SDK library for NodeJS and Web browsers to interact with the Lum Network.",
"homepage": "https://github.com/lum-network/sdk-javascript#readme",
Expand Down
12 changes: 10 additions & 2 deletions src/client/LumClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@ import {

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

export class LumClient {
readonly tmClient: Tendermint34Client;
readonly queryClient: StargateQueryClient & AuthExtension & BankExtension & DistributionExtension & StakingExtension;
readonly queryClient: StargateQueryClient & AuthExtension & BankExtension & DistributionExtension & StakingExtension & BeamExtension;
private chainId?: string;

/**
Expand All @@ -27,7 +28,14 @@ export class LumClient {
*/
constructor(tmClient: Tendermint34Client) {
this.tmClient = tmClient;
this.queryClient = StargateQueryClient.withExtensions(tmClient, StargateSetupAuthExtension, StargateSetupBankExtension, StargateDistributionExtension, StargateStakingExtension);
this.queryClient = StargateQueryClient.withExtensions(
tmClient,
StargateSetupAuthExtension,
StargateSetupBankExtension,
StargateDistributionExtension,
StargateStakingExtension,
BeamSetupBeamExtension,
);

// Used for debugging while gasWanted, gasUsed and codespace are still waiting to be included in the code lib
// // @ts-ignore
Expand Down
16 changes: 11 additions & 5 deletions src/codec/chain/beam/beam.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,25 @@ import { Coin } from '../../cosmos/base/v1beta1/coin';
export const protobufPackage = 'lum.network.beam';

export enum BeamState {
OPEN = 0,
CANCELED = 1,
CLOSED = 2,
UNSPECIFIED = 0,
OPEN = 1,
CANCELED = 2,
CLOSED = 3,
UNRECOGNIZED = -1,
}

export function beamStateFromJSON(object: any): BeamState {
switch (object) {
case 0:
case 'UNSPECIFIED':
return BeamState.UNSPECIFIED;
case 1:
case 'OPEN':
return BeamState.OPEN;
case 1:
case 2:
case 'CANCELED':
return BeamState.CANCELED;
case 2:
case 3:
case 'CLOSED':
return BeamState.CLOSED;
case -1:
Expand All @@ -32,6 +36,8 @@ export function beamStateFromJSON(object: any): BeamState {

export function beamStateToJSON(object: BeamState): string {
switch (object) {
case BeamState.UNSPECIFIED:
return 'UNSPECIFIED';
case BeamState.OPEN:
return 'OPEN';
case BeamState.CANCELED:
Expand Down
52 changes: 26 additions & 26 deletions src/codec/chain/beam/query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ export interface QueryGetBeamRequest {
}

export interface QueryGetBeamResponse {
Beam?: Beam;
beam?: Beam;
}

export interface QueryFetchBeamsRequest {
pagination?: PageRequest;
}

export interface QueryFetchBeamsResponse {
Beam: Beam[];
beams: Beam[];
pagination?: PageResponse;
}

Expand Down Expand Up @@ -82,8 +82,8 @@ const baseQueryGetBeamResponse: object = {};

export const QueryGetBeamResponse = {
encode(message: QueryGetBeamResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
if (message.Beam !== undefined) {
Beam.encode(message.Beam, writer.uint32(10).fork()).ldelim();
if (message.beam !== undefined) {
Beam.encode(message.beam, writer.uint32(10).fork()).ldelim();
}
return writer;
},
Expand All @@ -96,7 +96,7 @@ export const QueryGetBeamResponse = {
const tag = reader.uint32();
switch (tag >>> 3) {
case 1:
message.Beam = Beam.decode(reader, reader.uint32());
message.beam = Beam.decode(reader, reader.uint32());
break;
default:
reader.skipType(tag & 7);
Expand All @@ -108,26 +108,26 @@ export const QueryGetBeamResponse = {

fromJSON(object: any): QueryGetBeamResponse {
const message = { ...baseQueryGetBeamResponse } as QueryGetBeamResponse;
if (object.Beam !== undefined && object.Beam !== null) {
message.Beam = Beam.fromJSON(object.Beam);
if (object.beam !== undefined && object.beam !== null) {
message.beam = Beam.fromJSON(object.beam);
} else {
message.Beam = undefined;
message.beam = undefined;
}
return message;
},

toJSON(message: QueryGetBeamResponse): unknown {
const obj: any = {};
message.Beam !== undefined && (obj.Beam = message.Beam ? Beam.toJSON(message.Beam) : undefined);
message.beam !== undefined && (obj.beam = message.beam ? Beam.toJSON(message.beam) : undefined);
return obj;
},

fromPartial(object: DeepPartial<QueryGetBeamResponse>): QueryGetBeamResponse {
const message = { ...baseQueryGetBeamResponse } as QueryGetBeamResponse;
if (object.Beam !== undefined && object.Beam !== null) {
message.Beam = Beam.fromPartial(object.Beam);
if (object.beam !== undefined && object.beam !== null) {
message.beam = Beam.fromPartial(object.beam);
} else {
message.Beam = undefined;
message.beam = undefined;
}
return message;
},
Expand Down Expand Up @@ -192,7 +192,7 @@ const baseQueryFetchBeamsResponse: object = {};

export const QueryFetchBeamsResponse = {
encode(message: QueryFetchBeamsResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
for (const v of message.Beam) {
for (const v of message.beams) {
Beam.encode(v!, writer.uint32(10).fork()).ldelim();
}
if (message.pagination !== undefined) {
Expand All @@ -205,12 +205,12 @@ export const QueryFetchBeamsResponse = {
const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = { ...baseQueryFetchBeamsResponse } as QueryFetchBeamsResponse;
message.Beam = [];
message.beams = [];
while (reader.pos < end) {
const tag = reader.uint32();
switch (tag >>> 3) {
case 1:
message.Beam.push(Beam.decode(reader, reader.uint32()));
message.beams.push(Beam.decode(reader, reader.uint32()));
break;
case 2:
message.pagination = PageResponse.decode(reader, reader.uint32());
Expand All @@ -225,10 +225,10 @@ export const QueryFetchBeamsResponse = {

fromJSON(object: any): QueryFetchBeamsResponse {
const message = { ...baseQueryFetchBeamsResponse } as QueryFetchBeamsResponse;
message.Beam = [];
if (object.Beam !== undefined && object.Beam !== null) {
for (const e of object.Beam) {
message.Beam.push(Beam.fromJSON(e));
message.beams = [];
if (object.beams !== undefined && object.beams !== null) {
for (const e of object.beams) {
message.beams.push(Beam.fromJSON(e));
}
}
if (object.pagination !== undefined && object.pagination !== null) {
Expand All @@ -241,21 +241,21 @@ export const QueryFetchBeamsResponse = {

toJSON(message: QueryFetchBeamsResponse): unknown {
const obj: any = {};
if (message.Beam) {
obj.Beam = message.Beam.map((e) => (e ? Beam.toJSON(e) : undefined));
if (message.beams) {
obj.beams = message.beams.map((e) => (e ? Beam.toJSON(e) : undefined));
} else {
obj.Beam = [];
obj.beams = [];
}
message.pagination !== undefined && (obj.pagination = message.pagination ? PageResponse.toJSON(message.pagination) : undefined);
return obj;
},

fromPartial(object: DeepPartial<QueryFetchBeamsResponse>): QueryFetchBeamsResponse {
const message = { ...baseQueryFetchBeamsResponse } as QueryFetchBeamsResponse;
message.Beam = [];
if (object.Beam !== undefined && object.Beam !== null) {
for (const e of object.Beam) {
message.Beam.push(Beam.fromPartial(e));
message.beams = [];
if (object.beams !== undefined && object.beams !== null) {
for (const e of object.beams) {
message.beams.push(Beam.fromPartial(e));
}
}
if (object.pagination !== undefined && object.pagination !== null) {
Expand Down
33 changes: 33 additions & 0 deletions src/extensions/beam.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { createProtobufRpcClient, QueryClient } from '@cosmjs/stargate';

import { assert } from '@cosmjs/utils';

import { Beam } from '../codec/chain/beam/beam';
import { QueryClientImpl } from '../codec/chain/beam/query';

export interface BeamExtension {
readonly beam: {
readonly get: (id: string) => Promise<Beam>;
readonly fetch: () => Promise<Beam[]>;
};
}

export const setupBeamExtension = (base: QueryClient): BeamExtension => {
const rpc = createProtobufRpcClient(base);
const queryService = new QueryClientImpl(rpc);

return {
beam: {
get: async (id: string) => {
const { beam } = await queryService.Beam({ id });
assert(beam);
return beam;
},
fetch: async () => {
const { beams } = await queryService.Beams({});
assert(beams);
return beams;
},
},
};
};
1 change: 1 addition & 0 deletions src/extensions/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './beam';
63 changes: 62 additions & 1 deletion tests/client.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { LumWallet, LumWalletFactory, LumClient, LumUtils, LumConstants, LumRegistry, LumTypes, LumMessages } from '../src';
import axios from 'axios';
import { BeamData } from "../src/codec/chain/beam/beam";
import { BeamData, BeamState } from "../src/codec/chain/beam/beam";

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

it('should open a beam and close it', async () => {
const beamId = randomString();

let acc = await clt.getAccount(w1.getAddress());
expect(acc).toBeTruthy();

const chainId = await clt.getChainId();
const amount: LumTypes.Coin = {
amount: '1',
denom: LumConstants.MicroLumDenom,
};

const fee = {
amount: [{ denom: LumConstants.MicroLumDenom, amount: '1' }],
gas: '100000',
};

// Create the beam
let doc = {
accountNumber: acc.accountNumber,
chainId,
fee: fee,
memo: 'Beam review transaction',
messages: [LumMessages.BuildMsgOpenBeam(beamId, w1.getAddress(), '', amount, 'test', 'lum-network/review', null, 0, 0)],
signers: [
{
accountNumber: acc.accountNumber,
sequence: acc.sequence,
publicKey: w1.getPublicKey(),
},
],
};

const txCreate = await clt.signAndBroadcastTx(w1, doc);
expect(txCreate.deliverTx.code).toBe(0);
const beamAfterCreate = await clt.queryClient.beam.get(beamId);
expect(beamAfterCreate.status).toBe(BeamState.OPEN);

// Update the beam
acc = await clt.getAccount(w1.getAddress());
doc = {
accountNumber: acc.accountNumber,
chainId,
fee: fee,
memo: 'Beam review transaction',
messages: [LumMessages.BuildMsgUpdateBeam(beamId, w1.getAddress(), null, BeamState.CANCELED)],
signers: [
{
accountNumber: acc.accountNumber,
sequence: acc.sequence,
publicKey: w1.getPublicKey(),
},
],
};

const txUpdate = await clt.signAndBroadcastTx(w1, doc);
expect(txUpdate.deliverTx.code).toBe(0);
const beamAfterUpdate = await clt.queryClient.beam.get(beamId);
expect(beamAfterUpdate.status).toBe(BeamState.CANCELED);
});

it('should open a beam review transaction', async () => {
const beamId = randomString();

Expand Down