diff --git a/packages/stargate/src/modules/staking/aminomessages.spec.ts b/packages/stargate/src/modules/staking/aminomessages.spec.ts index ca8699d8..3a229146 100644 --- a/packages/stargate/src/modules/staking/aminomessages.spec.ts +++ b/packages/stargate/src/modules/staking/aminomessages.spec.ts @@ -56,9 +56,9 @@ describe("AminoTypes", () => { details: "...", }, commission: { - rate: "0.2", - maxRate: "0.3", - maxChangeRate: "0.1", + rate: "200000000000000000", // 0.2 + maxRate: "300000000000000000", // 0.3 + maxChangeRate: "100000000000000000", // 0.1 }, minSelfDelegation: "123", delegatorAddress: "cosmos1pkptre7fdkl6gfrzlesjjvhxhlc3r4gmmk8rs6", @@ -85,9 +85,9 @@ describe("AminoTypes", () => { details: "...", }, commission: { - rate: "0.2", - max_rate: "0.3", - max_change_rate: "0.1", + rate: "0.200000000000000000", + max_rate: "0.300000000000000000", + max_change_rate: "0.100000000000000000", }, min_self_delegation: "123", delegator_address: "cosmos1pkptre7fdkl6gfrzlesjjvhxhlc3r4gmmk8rs6", @@ -133,7 +133,7 @@ describe("AminoTypes", () => { securityContact: "Hamburglar", details: "...", }, - commissionRate: "0.2", + commissionRate: "21000000000000000", // 0.021 minSelfDelegation: "123", validatorAddress: "cosmos10dyr9899g6t0pelew4nvf4j5c3jcgv0r73qga5", }; @@ -152,7 +152,7 @@ describe("AminoTypes", () => { security_contact: "Hamburglar", details: "...", }, - commission_rate: "0.2", + commission_rate: "0.021000000000000000", min_self_delegation: "123", validator_address: "cosmos10dyr9899g6t0pelew4nvf4j5c3jcgv0r73qga5", }, @@ -219,9 +219,9 @@ describe("AminoTypes", () => { details: "...", }, commission: { - rate: "0.2", - max_rate: "0.3", - max_change_rate: "0.1", + rate: "0.200000000000000000", + max_rate: "0.300000000000000000", + max_change_rate: "0.100000000000000000", }, min_self_delegation: "123", delegator_address: "cosmos1pkptre7fdkl6gfrzlesjjvhxhlc3r4gmmk8rs6", @@ -243,9 +243,9 @@ describe("AminoTypes", () => { details: "...", }, commission: { - rate: "0.2", - maxRate: "0.3", - maxChangeRate: "0.1", + rate: "200000000000000000", // 0.2 + maxRate: "300000000000000000", // 0.3 + maxChangeRate: "100000000000000000", // 0.1 }, minSelfDelegation: "123", delegatorAddress: "cosmos1pkptre7fdkl6gfrzlesjjvhxhlc3r4gmmk8rs6", @@ -294,7 +294,7 @@ describe("AminoTypes", () => { security_contact: "Hamburglar", details: "...", }, - commission_rate: "0.2", + commission_rate: "0.050000000000000000", // 0.05 min_self_delegation: "123", validator_address: "cosmos10dyr9899g6t0pelew4nvf4j5c3jcgv0r73qga5", }, @@ -308,7 +308,7 @@ describe("AminoTypes", () => { securityContact: "Hamburglar", details: "...", }, - commissionRate: "0.2", + commissionRate: "50000000000000000", // 0.05 minSelfDelegation: "123", validatorAddress: "cosmos10dyr9899g6t0pelew4nvf4j5c3jcgv0r73qga5", }; diff --git a/packages/stargate/src/modules/staking/aminomessages.ts b/packages/stargate/src/modules/staking/aminomessages.ts index 97904b02..9a4723e9 100644 --- a/packages/stargate/src/modules/staking/aminomessages.ts +++ b/packages/stargate/src/modules/staking/aminomessages.ts @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/naming-convention */ import { AminoMsg, Coin, decodeBech32Pubkey, encodeBech32Pubkey } from "@cosmjs/amino"; import { fromBase64, toBase64 } from "@cosmjs/encoding"; +import { Decimal } from "@cosmjs/math"; import { assertDefinedAndNotNull } from "@cosmjs/utils"; import { MsgBeginRedelegate, @@ -28,6 +29,17 @@ interface Description { readonly details: string; } +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; +} + /** Creates a new validator. */ export interface AminoMsgCreateValidator extends AminoMsg { readonly type: "cosmos-sdk/MsgCreateValidator"; @@ -175,9 +187,9 @@ export function createStakingAminoConverters( details: description.details, }, commission: { - rate: commission.rate, - max_rate: commission.maxRate, - max_change_rate: commission.maxChangeRate, + rate: protoDecimalToJson(commission.rate), + max_rate: protoDecimalToJson(commission.maxRate), + max_change_rate: protoDecimalToJson(commission.maxChangeRate), }, min_self_delegation: minSelfDelegation, delegator_address: delegatorAddress, @@ -214,9 +226,9 @@ export function createStakingAminoConverters( details: description.details, }, commission: { - rate: commission.rate, - maxRate: commission.max_rate, - maxChangeRate: commission.max_change_rate, + rate: jsonDecimalToProto(commission.rate), + maxRate: jsonDecimalToProto(commission.max_rate), + maxChangeRate: jsonDecimalToProto(commission.max_change_rate), }, minSelfDelegation: min_self_delegation, delegatorAddress: delegator_address, @@ -266,7 +278,7 @@ export function createStakingAminoConverters( security_contact: description.securityContact, details: description.details, }, - commission_rate: commissionRate, + commission_rate: protoDecimalToJson(commissionRate), min_self_delegation: minSelfDelegation, validator_address: validatorAddress, }; @@ -284,7 +296,7 @@ export function createStakingAminoConverters( securityContact: description.security_contact, details: description.details, }, - commissionRate: commission_rate, + commissionRate: jsonDecimalToProto(commission_rate), minSelfDelegation: min_self_delegation, validatorAddress: validator_address, }),