Skip to content

Commit

Permalink
Feature/ledger support (#49)
Browse files Browse the repository at this point in the history
* reset

* added create staker amino type

* added amino registry for pool module

* added amino types for stakers module

* added amino types for delegation module

* added amino types of bundles module

* added remaining amino types

* refactored pool amino types

* refactored amino registry

* fixed ledger for Keplr

* added gov v1 support
  • Loading branch information
troykessler committed Jun 2, 2023
1 parent 3243489 commit 770fbfb
Show file tree
Hide file tree
Showing 16 changed files with 436 additions and 1,076 deletions.
12 changes: 6 additions & 6 deletions common/sdk/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,12 @@
"lint:fix": "eslint --fix . --ignore-path ../../.eslintignore --ext ts --ext tsx --ext js --ext jsx"
},
"dependencies": {
"@cosmjs/amino": "0.28.3",
"@cosmjs/crypto": "0.27.1",
"@cosmjs/encoding": "0.27.1",
"@cosmjs/proto-signing": "0.28.0",
"@cosmjs/stargate": "0.28.0",
"@cosmjs/tendermint-rpc": "0.28.0",
"@cosmjs/amino": "^0.30.1",
"@cosmjs/crypto": "^0.30.1",
"@cosmjs/encoding": "^0.30.1",
"@cosmjs/proto-signing": "^0.30.1",
"@cosmjs/stargate": "^0.30.1",
"@cosmjs/tendermint-rpc": "^0.30.1",
"@cosmostation/extension-client": "^0.0.6",
"@keplr-wallet/cosmos": "^0.11.38",
"@kyvejs/types": "1.0.0",
Expand Down
89 changes: 89 additions & 0 deletions common/sdk/src/amino/bundles.amino.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
import { AminoConverters } from "@cosmjs/stargate";
import {
MsgSubmitBundleProposal,
MsgVoteBundleProposal,
MsgClaimUploaderRole,
MsgSkipUploaderRole,
} from "@kyvejs/types/client/kyve/bundles/v1beta1/tx";
import { isNotEmpty } from "../utils";

export const createBundlesAminoConverters = (): AminoConverters => {
return {
"/kyve.bundles.v1beta1.MsgSubmitBundleProposal": {
aminoType: "kyve/bundles/MsgSubmitBundleProposal",
toAmino: (msg: MsgSubmitBundleProposal) => ({
creator: msg.creator,
staker: msg.staker,
...(isNotEmpty(msg.pool_id) && { pool_id: msg.pool_id }),
...(isNotEmpty(msg.storage_id) && { storage_id: msg.storage_id }),
...(isNotEmpty(msg.data_size) && { data_size: msg.data_size }),
...(isNotEmpty(msg.data_hash) && { data_hash: msg.data_hash }),
...(isNotEmpty(msg.from_index) && { from_index: msg.from_index }),
...(isNotEmpty(msg.bundle_size) && { bundle_size: msg.bundle_size }),
...(isNotEmpty(msg.from_key) && { from_key: msg.from_key }),
...(isNotEmpty(msg.to_key) && { to_key: msg.to_key }),
...(isNotEmpty(msg.bundle_summary) && {
bundle_summary: msg.bundle_summary,
}),
}),
fromAmino: (msg): MsgSubmitBundleProposal => ({
creator: msg.creator,
staker: msg.staker,
pool_id: msg.pool_id,
storage_id: msg.storage_id,
data_size: msg.data_size,
data_hash: msg.data_hash,
from_index: msg.from_index,
bundle_size: msg.bundle_size,
from_key: msg.from_key,
to_key: msg.to_key,
bundle_summary: msg.bundle_summary,
}),
},
"/kyve.bundles.v1beta1.MsgVoteBundleProposal": {
aminoType: "kyve/bundles/MsgVoteBundleProposal",
toAmino: (msg: MsgVoteBundleProposal) => ({
creator: msg.creator,
staker: msg.staker,
...(isNotEmpty(msg.pool_id) && { pool_id: msg.pool_id }),
...(isNotEmpty(msg.storage_id) && { storage_id: msg.storage_id }),
vote: msg.vote,
}),
fromAmino: (msg): MsgVoteBundleProposal => ({
creator: msg.creator,
staker: msg.staker,
pool_id: msg.pool_id,
storage_id: msg.storage_id,
vote: msg.vote,
}),
},
"/kyve.bundles.v1beta1.MsgClaimUploaderRole": {
aminoType: "kyve/bundles/MsgClaimUploaderRole",
toAmino: (msg: MsgClaimUploaderRole) => ({
creator: msg.creator,
staker: msg.staker,
...(isNotEmpty(msg.pool_id) && { pool_id: msg.pool_id }),
}),
fromAmino: (msg): MsgClaimUploaderRole => ({
creator: msg.creator,
staker: msg.staker,
pool_id: msg.pool_id,
}),
},
"/kyve.bundles.v1beta1.MsgSkipUploaderRole": {
aminoType: "kyve/bundles/MsgSkipUploaderRole",
toAmino: (msg: MsgSkipUploaderRole) => ({
creator: msg.creator,
staker: msg.staker,
...(isNotEmpty(msg.pool_id) && { pool_id: msg.pool_id }),
...(isNotEmpty(msg.from_index) && { from_index: msg.from_index }),
}),
fromAmino: (msg): MsgSkipUploaderRole => ({
creator: msg.creator,
staker: msg.staker,
pool_id: msg.pool_id,
from_index: msg.from_index,
}),
},
};
};
65 changes: 65 additions & 0 deletions common/sdk/src/amino/delegation.amino.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import { AminoConverters } from "@cosmjs/stargate";
import {
MsgDelegate,
MsgWithdrawRewards,
MsgRedelegate,
MsgUndelegate,
} from "@kyvejs/types/client/kyve/delegation/v1beta1/tx";
import { isNotEmpty } from "../utils";

export const createDelegationAminoConverters = (): AminoConverters => {
return {
"/kyve.delegation.v1beta1.MsgDelegate": {
aminoType: "kyve/delegation/MsgDelegate",
toAmino: (msg: MsgDelegate) => ({
creator: msg.creator,
staker: msg.staker,
...(isNotEmpty(msg.amount) && { amount: msg.amount }),
}),
fromAmino: (msg): MsgDelegate => ({
creator: msg.creator,
staker: msg.staker,
amount: msg.amount,
}),
},
"/kyve.delegation.v1beta1.MsgWithdrawRewards": {
aminoType: "kyve/delegation/MsgWithdrawRewards",
toAmino: (msg: MsgWithdrawRewards) => ({
creator: msg.creator,
staker: msg.staker,
}),
fromAmino: (msg): MsgWithdrawRewards => ({
creator: msg.creator,
staker: msg.staker,
}),
},
"/kyve.delegation.v1beta1.MsgRedelegate": {
aminoType: "kyve/delegation/MsgRedelegate",
toAmino: (msg: MsgRedelegate) => ({
creator: msg.creator,
from_staker: msg.from_staker,
to_staker: msg.to_staker,
...(isNotEmpty(msg.amount) && { amount: msg.amount }),
}),
fromAmino: (msg): MsgRedelegate => ({
creator: msg.creator,
from_staker: msg.from_staker,
to_staker: msg.to_staker,
amount: msg.amount,
}),
},
"/kyve.delegation.v1beta1.MsgUndelegate": {
aminoType: "kyve/delegation/MsgUndelegate",
toAmino: (msg: MsgUndelegate) => ({
creator: msg.creator,
staker: msg.staker,
...(isNotEmpty(msg.amount) && { amount: msg.amount }),
}),
fromAmino: (msg): MsgUndelegate => ({
creator: msg.creator,
staker: msg.staker,
amount: msg.amount,
}),
},
};
};
23 changes: 23 additions & 0 deletions common/sdk/src/amino/gov.v1.amino.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { AminoConverters } from "@cosmjs/stargate";
import { MsgVote } from "@kyvejs/types/client/cosmos/gov/v1/tx";
import { isNotEmpty } from "../utils";

export const createGovV1AminoConverters = (): AminoConverters => {
return {
"/cosmos.gov.v1.MsgVote": {
aminoType: "cosmos-sdk/v1/MsgVote",
toAmino: (msg: MsgVote) => ({
proposal_id: msg.proposal_id,
voter: msg.voter,
option: msg.option,
...(isNotEmpty(msg.metadata) && { metadata: msg.metadata }),
}),
fromAmino: (msg): MsgVote => ({
proposal_id: msg.proposal_id,
voter: msg.voter,
option: msg.option,
metadata: msg.metadata,
}),
},
};
};
5 changes: 5 additions & 0 deletions common/sdk/src/amino/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export * from "./gov.v1.amino";
export * from "./pool.amino";
export * from "./stakers.amino";
export * from "./delegation.amino";
export * from "./bundles.amino";
37 changes: 37 additions & 0 deletions common/sdk/src/amino/pool.amino.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { AminoConverters } from "@cosmjs/stargate";
import {
MsgFundPool,
MsgDefundPool,
} from "@kyvejs/types/client/kyve/pool/v1beta1/tx";
import { isNotEmpty } from "../utils";

export const createPoolAminoConverters = (): AminoConverters => {
return {
"/kyve.pool.v1beta1.MsgFundPool": {
aminoType: "kyve/pool/MsgFundPool",
toAmino: (msg: MsgFundPool) => ({
creator: msg.creator,
...(isNotEmpty(msg.id) && { id: msg.id }),
...(isNotEmpty(msg.amount) && { amount: msg.amount }),
}),
fromAmino: (msg): MsgFundPool => ({
creator: msg.creator,
id: msg.id,
amount: msg.amount,
}),
},
"/kyve.pool.v1beta1.MsgDefundPool": {
aminoType: "kyve/pool/MsgDefundPool",
toAmino: (msg: MsgDefundPool) => ({
creator: msg.creator,
...(isNotEmpty(msg.id) && { id: msg.id }),
...(isNotEmpty(msg.amount) && { amount: msg.amount }),
}),
fromAmino: (msg): MsgDefundPool => ({
creator: msg.creator,
id: msg.id,
amount: msg.amount,
}),
},
};
};
97 changes: 97 additions & 0 deletions common/sdk/src/amino/stakers.amino.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
import { AminoConverters } from "@cosmjs/stargate";
import { Decimal } from "@cosmjs/math";
import {
MsgCreateStaker,
MsgUpdateMetadata,
MsgJoinPool,
MsgUpdateCommission,
MsgLeavePool,
} from "@kyvejs/types/client/kyve/stakers/v1beta1/tx";
import { isNotEmpty } from "../utils";

function protoDecimalToJson(decimal: string): string {
const parsed = Decimal.fromAtomics(decimal, 18);
const [whole, fractional] = parsed.toString().split(".");
return `${whole}.${(fractional ?? "").padEnd(18, "0")}`;
}

function jsonDecimalToProto(decimal: string): string {
const parsed = Decimal.fromUserInput(decimal, 18);
return parsed.atomics;
}

export const createStakersAminoConverters = (): AminoConverters => {
return {
"/kyve.stakers.v1beta1.MsgCreateStaker": {
aminoType: "kyve/stakers/MsgCreateStaker",
toAmino: (msg: MsgCreateStaker) => ({
creator: msg.creator,
...(isNotEmpty(msg.amount) && { amount: msg.amount }),
commission: protoDecimalToJson(msg.commission),
}),
fromAmino: (msg): MsgCreateStaker => ({
creator: msg.creator,
amount: msg.amount,
commission: jsonDecimalToProto(msg.commission),
}),
},
"/kyve.stakers.v1beta1.MsgUpdateMetadata": {
aminoType: "kyve/stakers/MsgUpdateMetadata",
toAmino: (msg: MsgUpdateMetadata) => ({
creator: msg.creator,
...(isNotEmpty(msg.moniker) && { moniker: msg.moniker }),
...(isNotEmpty(msg.website) && { website: msg.website }),
...(isNotEmpty(msg.identity) && { identity: msg.identity }),
...(isNotEmpty(msg.security_contact) && {
security_contact: msg.security_contact,
}),
...(isNotEmpty(msg.details) && { details: msg.details }),
}),
fromAmino: (msg): MsgUpdateMetadata => ({
creator: msg.creator,
moniker: msg.moniker,
website: msg.website,
identity: msg.identity,
security_contact: msg.security_contact,
details: msg.details,
}),
},
"/kyve.stakers.v1beta1.MsgJoinPool": {
aminoType: "kyve/stakers/MsgJoinPool",
toAmino: (msg: MsgJoinPool) => ({
creator: msg.creator,
...(isNotEmpty(msg.pool_id) && { pool_id: msg.pool_id }),
valaddress: msg.valaddress,
...(isNotEmpty(msg.amount) && { amount: msg.amount }),
}),
fromAmino: (msg): MsgJoinPool => ({
creator: msg.creator,
pool_id: msg.pool_id,
valaddress: msg.valaddress,
amount: msg.amount,
}),
},
"/kyve.stakers.v1beta1.MsgUpdateCommission": {
aminoType: "kyve/stakers/MsgUpdateCommission",
toAmino: (msg: MsgUpdateCommission) => ({
creator: msg.creator,
commission: protoDecimalToJson(msg.commission),
}),
fromAmino: (msg): MsgUpdateCommission => ({
creator: msg.creator,
commission: jsonDecimalToProto(msg.commission),
}),
},
"/kyve.stakers.v1beta1.MsgLeavePool": {
aminoType: "kyve/stakers/MsgLeavePool",
toAmino: (msg: MsgLeavePool) => ({
creator: msg.creator,
...(isNotEmpty(msg.pool_id) && { pool_id: msg.pool_id }),
}),
fromAmino: (msg): MsgLeavePool => ({
creator: msg.creator,
pool_id: msg.pool_id,
}),
},
};
};
19 changes: 18 additions & 1 deletion common/sdk/src/clients/full-client.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,21 @@
import { OfflineAminoSigner } from "@cosmjs/amino/build/signer";
import { OfflineSigner, Registry } from "@cosmjs/proto-signing";
import { GasPrice, SigningStargateClient } from "@cosmjs/stargate";
import { AminoTypes, GasPrice, SigningStargateClient } from "@cosmjs/stargate";

import { IConfig } from "../constants";
import * as KyveRegistryTx from "../registry/tx.registry";
import KyveClient from "./rpc-client/client";
import KyveWebClient from "./rpc-client/web.client";

import {
createPoolAminoConverters,
createStakersAminoConverters,
createDelegationAminoConverters,
createBundlesAminoConverters,
createGovV1AminoConverters,
} from "../amino";
import { createDefaultAminoConverters } from "@cosmjs/stargate";

export async function getSigningKyveClient(
config: IConfig,
signer: OfflineSigner,
Expand Down Expand Up @@ -36,6 +45,14 @@ export async function getSigningKyveClient(
await SigningStargateClient.connectWithSigner(config.rpc, signer, {
registry,
gasPrice,
aminoTypes: new AminoTypes({
...createDefaultAminoConverters(),
...createGovV1AminoConverters(),
...createPoolAminoConverters(),
...createStakersAminoConverters(),
...createDelegationAminoConverters(),
...createBundlesAminoConverters(),
}),
});

const [account] = await signer.getAccounts();
Expand Down
1 change: 1 addition & 0 deletions common/sdk/src/utils/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const isNotEmpty = (val: string): boolean => !!val && val !== "0";
2 changes: 1 addition & 1 deletion common/types/scripts/proto-gen.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
rm -rf temp
mkdir temp
KYVE_CHAIN_REPO="git@github.com:KYVENetwork/chain.git"
KYVE_CHAIN_VERSION="v1.1.0"
KYVE_CHAIN_VERSION="v1.2.0"
git -C ./temp clone -b ${KYVE_CHAIN_VERSION} --single-branch ${KYVE_CHAIN_REPO}
rm -rf ./src/client
rm -rf ./src/lcd
Expand Down
Loading

0 comments on commit 770fbfb

Please sign in to comment.