Fix decimal handling for Amino JSON of MsgCreateValidator and MsgEditValidator

This commit is contained in:
Simon Warta 2022-10-13 13:49:30 +02:00
parent e92534dcbf
commit dbd54f9e24
2 changed files with 36 additions and 24 deletions

View File

@ -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",
};

View File

@ -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,
}),