Skip to content

Commit 611b911

Browse files
authored
fix(sdk): normalize scale in warp check for config vs on-chain comparison (#8615)
1 parent c6de4c9 commit 611b911

3 files changed

Lines changed: 58 additions & 0 deletions

File tree

.changeset/quiet-rivers-flow.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@hyperlane-xyz/sdk': patch
3+
---
4+
5+
Normalized scale values in warp route check so plain numbers from config and {numerator, denominator} objects from on-chain reader compare equal during diff.

typescript/sdk/src/token/configUtils.test.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ describe('configUtils', () => {
8585
},
8686
],
8787
},
88+
scale: { numerator: 1n, denominator: 1n },
8889
},
8990
},
9091
{
@@ -109,6 +110,7 @@ describe('configUtils', () => {
109110
address: ADDRESS,
110111
},
111112
},
113+
scale: { numerator: 1n, denominator: 1n },
112114
},
113115
},
114116
{
@@ -131,6 +133,7 @@ describe('configUtils', () => {
131133
address: ADDRESS,
132134
owner: ADDRESS,
133135
},
136+
scale: { numerator: 1n, denominator: 1n },
134137
},
135138
},
136139
{
@@ -182,6 +185,7 @@ describe('configUtils', () => {
182185
owner: 'milk169dcaz397j75tjfpl6ykm23dfrv39dqd58lsag',
183186
type: 'native',
184187
},
188+
scale: { numerator: 1n, denominator: 1n },
185189
},
186190
input: {
187191
bsc: {
@@ -242,6 +246,44 @@ describe('configUtils', () => {
242246
});
243247
}
244248

249+
it('normalizes plain number scale to {numerator, denominator} bigint', () => {
250+
const transformedObj = transformConfigToCheck({
251+
type: TokenType.collateral,
252+
token: ADDRESS,
253+
scale: 1000000000000,
254+
} as any);
255+
256+
expect(transformedObj.scale).to.eql({
257+
numerator: 1000000000000n,
258+
denominator: 1n,
259+
});
260+
});
261+
262+
it('normalizes {number, number} scale to {bigint, bigint}', () => {
263+
const transformedObj = transformConfigToCheck({
264+
type: TokenType.collateral,
265+
token: ADDRESS,
266+
scale: { numerator: 1, denominator: 1000000000000 },
267+
} as any);
268+
269+
expect(transformedObj.scale).to.eql({
270+
numerator: 1n,
271+
denominator: 1000000000000n,
272+
});
273+
});
274+
275+
it('normalizes undefined scale to identity {1n, 1n}', () => {
276+
const transformedObj = transformConfigToCheck({
277+
type: TokenType.collateral,
278+
token: ADDRESS,
279+
} as any);
280+
281+
expect(transformedObj.scale).to.eql({
282+
numerator: 1n,
283+
denominator: 1n,
284+
});
285+
});
286+
245287
it('normalizes LinearFee maxFee/halfAmount so equivalent bps configs compare equal', () => {
246288
const transformedObj = transformConfigToCheck({
247289
type: TokenType.collateral,
@@ -259,6 +301,7 @@ describe('configUtils', () => {
259301
expect(transformedObj).to.eql({
260302
type: TokenType.collateral,
261303
token: ADDRESS,
304+
scale: { numerator: 1n, denominator: 1n },
262305
tokenFee: {
263306
type: TokenFeeType.LinearFee,
264307
owner: ADDRESS,
@@ -286,6 +329,7 @@ describe('configUtils', () => {
286329
expect(transformedObj).to.eql({
287330
type: TokenType.collateral,
288331
token: ADDRESS,
332+
scale: { numerator: 1n, denominator: 1n },
289333
tokenFee: {
290334
type: TokenFeeType.OffchainQuotedLinearFee,
291335
owner: ADDRESS,
@@ -322,6 +366,7 @@ describe('configUtils', () => {
322366
expect(transformedObj).to.eql({
323367
type: TokenType.collateral,
324368
token: ADDRESS,
369+
scale: { numerator: 1n, denominator: 1n },
325370
tokenFee: {
326371
type: TokenFeeType.RoutingFee,
327372
owner: ADDRESS,
@@ -373,6 +418,7 @@ describe('configUtils', () => {
373418
expect(transformedObj).to.eql({
374419
type: TokenType.collateral,
375420
token: ADDRESS,
421+
scale: { numerator: 1n, denominator: 1n },
376422
tokenFee: {
377423
type: TokenFeeType.CrossCollateralRoutingFee,
378424
owner: ADDRESS,
@@ -419,6 +465,7 @@ describe('configUtils', () => {
419465
expect(transformedObj).to.eql({
420466
type: TokenType.collateral,
421467
token: ADDRESS,
468+
scale: { numerator: 1n, denominator: 1n },
422469
tokenFee: {
423470
type: TokenFeeType.CrossCollateralRoutingFee,
424471
owner: ADDRESS,
@@ -458,6 +505,7 @@ describe('configUtils', () => {
458505
expect(transformedObj).to.eql({
459506
type: TokenType.collateral,
460507
token: ADDRESS,
508+
scale: { numerator: 1n, denominator: 1n },
461509
tokenFee: {
462510
type: TokenFeeType.RoutingFee,
463511
owner: ADDRESS,

typescript/sdk/src/token/configUtils.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import {
3535
resolveRouterMapConfig,
3636
} from '../router/types.js';
3737
import { ChainMap } from '../types.js';
38+
import { normalizeScale } from '../utils/decimals.js';
3839
import { WarpCoreConfig } from '../warp/types.js';
3940

4041
import { EvmWarpRouteReader } from './EvmWarpRouteReader.js';
@@ -720,6 +721,10 @@ export function transformConfigToCheck(
720721
);
721722
}
722723

724+
// normalizeScale(undefined) -> {1n,1n}, matching EvmWarpRouteReader.fetchScale's
725+
// identity-collapse so both sides of the diff agree symmetrically.
726+
clonedTokenConfig.scale = normalizeScale(clonedTokenConfig.scale);
727+
723728
return sortArraysInObject(
724729
transformObj(clonedTokenConfig, transformWarpDeployConfigToCheck),
725730
sortArraysInConfigToCheck,

0 commit comments

Comments
 (0)