@@ -1091,11 +1091,16 @@ export class EvmERC20WarpRouteReader extends EvmRouterReader {
10911091 * for contracts >= 11.0.0, otherwise reads legacy scale value.
10921092 *
10931093 * @param tokenRouterAddress - The address of the TokenRouter contract.
1094- * @returns The scale as either a number (for old contracts or when denominator is 1) or an object with numerator/denominator.
1094+ * @returns The scale as either a number/string (for old contracts or when denominator is 1) or an object with numerator/denominator.
10951095 */
10961096 async fetchScale (
10971097 tokenRouterAddress : Address ,
1098- ) : Promise < number | { numerator : number ; denominator : number } | undefined > {
1098+ ) : Promise <
1099+ | number
1100+ | string
1101+ | { numerator : number | string ; denominator : number | string }
1102+ | undefined
1103+ > {
10991104 const packageVersion = await this . fetchPackageVersion ( tokenRouterAddress ) ;
11001105 const hasScaleFractionInterface =
11011106 compareVersions ( packageVersion , SCALE_FRACTION_VERSION ) >= 0 ;
@@ -1105,21 +1110,32 @@ export class EvmERC20WarpRouteReader extends EvmRouterReader {
11051110 this . provider ,
11061111 ) ;
11071112
1113+ // Helper to safely convert BigNumber to number or string
1114+ // Uses string representation for values > Number.MAX_SAFE_INTEGER
1115+ const safeToNumberOrString = ( bn : BigNumber ) : number | string => {
1116+ try {
1117+ return bn . toNumber ( ) ;
1118+ } catch {
1119+ // Value exceeds Number.MAX_SAFE_INTEGER, return as string
1120+ return bn . toString ( ) ;
1121+ }
1122+ } ;
1123+
11081124 if ( hasScaleFractionInterface ) {
11091125 // Read new format (scaleNumerator and scaleDenominator)
11101126 const [ numerator , denominator ] = await Promise . all ( [
11111127 tokenRouter . scaleNumerator ( ) ,
11121128 tokenRouter . scaleDenominator ( ) ,
11131129 ] ) ;
11141130
1115- // If denominator is 1, return as a simple number for backward compatibility
1131+ // If denominator is 1, return as a simple number/string for backward compatibility
11161132 if ( denominator . eq ( 1 ) ) {
1117- return numerator . toNumber ( ) ;
1133+ return safeToNumberOrString ( numerator ) ;
11181134 }
11191135
11201136 return {
1121- numerator : numerator . toNumber ( ) ,
1122- denominator : denominator . toNumber ( ) ,
1137+ numerator : safeToNumberOrString ( numerator ) ,
1138+ denominator : safeToNumberOrString ( denominator ) ,
11231139 } ;
11241140 } else {
11251141 // Read old format (single scale value) using low-level call
@@ -1133,7 +1149,7 @@ export class EvmERC20WarpRouteReader extends EvmRouterReader {
11331149 this . provider ,
11341150 ) ;
11351151 const scale = await legacyContract . scale ( ) ;
1136- return scale . toNumber ( ) ;
1152+ return safeToNumberOrString ( scale ) ;
11371153 }
11381154 }
11391155
0 commit comments