Skip to content

Commit 380408e

Browse files
committed
Fetch native currency from chain API when required
1 parent 2779afc commit 380408e

File tree

2 files changed

+25
-7
lines changed

2 files changed

+25
-7
lines changed

.changeset/forty-donuts-happen.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"thirdweb": patch
3+
---
4+
5+
fetch native currency from chain API if required

packages/thirdweb/src/extensions/erc20/read/getCurrencyMetadata.ts

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1+
import z from "zod";
12
import { isNativeTokenAddress } from "../../../constants/addresses.js";
23
import type { BaseTransactionOptions } from "../../../transaction/types.js";
34
import { name } from "../../common/read/name.js";
45
import { symbol } from "../../common/read/symbol.js";
56
import { 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

Comments
 (0)