feat: update validation of GasPrice.fromString to allow using ibc denoms as gas denom
This commit is contained in:
parent
55477b5392
commit
643bf25a8a
@ -30,6 +30,11 @@ describe("GasPrice", () => {
|
||||
"0.14ucoin2": { amount: "0.14", denom: "ucoin2" },
|
||||
// eslint-disable-next-line @typescript-eslint/naming-convention
|
||||
"0.14FOOBAR": { amount: "0.14", denom: "FOOBAR" },
|
||||
"0.01ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2":
|
||||
{
|
||||
amount: "0.01",
|
||||
denom: "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2",
|
||||
},
|
||||
};
|
||||
for (const [input, expected] of Object.entries(inputs)) {
|
||||
const gasPrice = GasPrice.fromString(input);
|
||||
@ -46,16 +51,16 @@ describe("GasPrice", () => {
|
||||
expect(() => GasPrice.fromString("234")).toThrowError(/Invalid gas price string/i);
|
||||
expect(() => GasPrice.fromString("-234tkn")).toThrowError(/Invalid gas price string/i);
|
||||
// Checks details of <denom>
|
||||
expect(() => GasPrice.fromString("234t")).toThrowError(/denom must be between 3 and 128 characters/i);
|
||||
expect(() => GasPrice.fromString("234tt")).toThrowError(/denom must be between 3 and 128 characters/i);
|
||||
expect(() => GasPrice.fromString("234t")).toThrowError(/Invalid gas price string/i);
|
||||
expect(() => GasPrice.fromString("234tt")).toThrowError(/Invalid gas price string/i);
|
||||
expect(() =>
|
||||
GasPrice.fromString(
|
||||
"234ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt",
|
||||
),
|
||||
).toThrowError(/denom must be between 3 and 128 characters/i);
|
||||
).toThrowError(/Invalid gas price string/i);
|
||||
// Checks details of <amount>
|
||||
expect(() => GasPrice.fromString("3.utkn")).toThrowError(/Fractional part missing/i);
|
||||
expect(() => GasPrice.fromString("..utkn")).toThrowError(/More than one separator found/i);
|
||||
expect(() => GasPrice.fromString("3.utkn")).toThrowError(/Invalid gas price string/i);
|
||||
expect(() => GasPrice.fromString("..utkn")).toThrowError(/Invalid gas price string/i);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@ -2,18 +2,6 @@ import { StdFee } from "@cosmjs/amino";
|
||||
import { Decimal, Uint53 } from "@cosmjs/math";
|
||||
import { coins } from "@cosmjs/proto-signing";
|
||||
|
||||
/**
|
||||
* Denom checker for the Cosmos SDK 0.42 denom pattern
|
||||
* (https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/types/coin.go#L599-L601).
|
||||
*
|
||||
* This is like a regexp but with helpful error messages.
|
||||
*/
|
||||
function checkDenom(denom: string): void {
|
||||
if (denom.length < 3 || denom.length > 128) {
|
||||
throw new Error("Denom must be between 3 and 128 characters");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A gas price, i.e. the price of a single unit of gas. This is typically a fraction of
|
||||
* the smallest fee token unit, such as 0.012utoken.
|
||||
@ -37,12 +25,11 @@ export class GasPrice {
|
||||
*/
|
||||
public static fromString(gasPrice: string): GasPrice {
|
||||
// Use Decimal.fromUserInput and checkDenom for detailed checks and helpful error messages
|
||||
const matchResult = gasPrice.match(/^([0-9.]+)([a-z][a-z0-9]*)$/i);
|
||||
const matchResult = gasPrice.match(/^(\d+(?:\.\d+)?|\.\d+)([a-zA-Z][a-zA-Z0-9/:._-]{2,127})$/i);
|
||||
if (!matchResult) {
|
||||
throw new Error("Invalid gas price string");
|
||||
}
|
||||
const [_, amount, denom] = matchResult;
|
||||
checkDenom(denom);
|
||||
const fractionalDigits = 18;
|
||||
const decimalAmount = Decimal.fromUserInput(amount, fractionalDigits);
|
||||
return new GasPrice(decimalAmount, denom);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user