1+ import z from "zod" ;
12import { isNativeTokenAddress } from "../../../constants/addresses.js" ;
23import type { BaseTransactionOptions } from "../../../transaction/types.js" ;
34import { name } from "../../common/read/name.js" ;
45import { symbol } from "../../common/read/symbol.js" ;
56import { decimals } from "../__generated__/IERC20/read/decimals.js" ;
67
8+ const NATIVE_CURRENCY_SCHEMA = z . object ( {
9+ name : z . string ( ) . default ( "Ether" ) ,
10+ symbol : z . string ( ) . default ( "ETH" ) ,
11+ decimals : z . number ( ) . default ( 18 ) ,
12+ } ) ;
13+
714/**
815 * @extension ERC20
916 */
@@ -30,13 +37,19 @@ export async function getCurrencyMetadata(
3037) : Promise < GetCurrencyMetadataResult > {
3138 // if the contract is the native token, return the native currency metadata
3239 if ( isNativeTokenAddress ( options . contract . address ) ) {
33- return {
34- decimals : 18 ,
35- name : "Ether" ,
36- symbol : "ETH" ,
37- // overwrite with native currency of the chain if available
38- ...options . contract . chain . nativeCurrency ,
39- } ;
40+ // if the chain definition does not have a native currency, attempt to fetch it from the API
41+ if ( ! options . contract . chain . nativeCurrency ) {
42+ try {
43+ const { getChainMetadata } = await import ( "../../../chains/utils.js" ) ;
44+ const chain = await getChainMetadata ( options . contract . chain ) ;
45+ // return the native currency of the chain
46+ return NATIVE_CURRENCY_SCHEMA . parse ( chain . nativeCurrency ) ;
47+ } catch {
48+ // no-op, fall through to the default values below
49+ }
50+ }
51+
52+ return NATIVE_CURRENCY_SCHEMA . parse ( options . contract . chain . nativeCurrency ) ;
4053 }
4154
4255 try {
0 commit comments