@pancakeswap/swap-sdk-evm 1.2.2 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants.d.ts +18 -25
- package/dist/constants.d.ts.map +1 -1
- package/dist/entities/native.d.ts +19 -0
- package/dist/entities/native.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +66 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +63 -7
- package/dist/index.mjs.map +1 -1
- package/dist/resolveNativeCurrency.d.ts +47 -0
- package/dist/resolveNativeCurrency.d.ts.map +1 -0
- package/package.json +2 -2
package/dist/constants.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ChainId } from '@pancakeswap/chains';
|
|
1
2
|
import { Percent } from '@pancakeswap/swap-sdk-core';
|
|
2
3
|
import { ERC20Token } from './entities/erc20Token';
|
|
3
4
|
export declare const ZERO_PERCENT: Percent;
|
|
@@ -32,29 +33,16 @@ export declare const WBNB: {
|
|
|
32
33
|
5611: ERC20Token;
|
|
33
34
|
204: ERC20Token;
|
|
34
35
|
};
|
|
35
|
-
export declare const WNATIVE:
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
59140: ERC20Token;
|
|
46
|
-
5611: ERC20Token;
|
|
47
|
-
204: ERC20Token;
|
|
48
|
-
8453: ERC20Token;
|
|
49
|
-
84531: ERC20Token;
|
|
50
|
-
534351: ERC20Token;
|
|
51
|
-
11155111: ERC20Token;
|
|
52
|
-
421614: ERC20Token;
|
|
53
|
-
84532: ERC20Token;
|
|
54
|
-
143: ERC20Token;
|
|
55
|
-
10143: ERC20Token;
|
|
56
|
-
4663: ERC20Token;
|
|
57
|
-
};
|
|
36
|
+
export declare const WNATIVE: Partial<Record<ChainId, ERC20Token>>;
|
|
37
|
+
/**
|
|
38
|
+
* The ERC-20 a chain's native currency wraps into.
|
|
39
|
+
*
|
|
40
|
+
* Not every EVM chain has one: on Arc the native USDC already satisfies IERC20, so
|
|
41
|
+
* nothing wraps it and the chain is absent here. Read it through
|
|
42
|
+
* {@link getWrappedNative} rather than indexing directly, so the missing case has to
|
|
43
|
+
* be handled instead of blowing up at the first property access.
|
|
44
|
+
*/
|
|
45
|
+
export declare const getWrappedNative: (chainId: ChainId) => ERC20Token | undefined;
|
|
58
46
|
export declare const NATIVE: {
|
|
59
47
|
1: {
|
|
60
48
|
readonly name: "Ether";
|
|
@@ -67,7 +55,7 @@ export declare const NATIVE: {
|
|
|
67
55
|
decimals: number;
|
|
68
56
|
};
|
|
69
57
|
56: {
|
|
70
|
-
readonly name: "
|
|
58
|
+
readonly name: "BNB Chain Native Token";
|
|
71
59
|
readonly symbol: "BNB";
|
|
72
60
|
readonly decimals: 18;
|
|
73
61
|
};
|
|
@@ -107,7 +95,7 @@ export declare const NATIVE: {
|
|
|
107
95
|
readonly decimals: 18;
|
|
108
96
|
};
|
|
109
97
|
204: {
|
|
110
|
-
readonly name: "
|
|
98
|
+
readonly name: "BNB Chain Native Token";
|
|
111
99
|
readonly symbol: "BNB";
|
|
112
100
|
readonly decimals: 18;
|
|
113
101
|
};
|
|
@@ -161,5 +149,10 @@ export declare const NATIVE: {
|
|
|
161
149
|
readonly symbol: "ETH";
|
|
162
150
|
readonly decimals: 18;
|
|
163
151
|
};
|
|
152
|
+
5042: {
|
|
153
|
+
name: string;
|
|
154
|
+
symbol: string;
|
|
155
|
+
decimals: number;
|
|
156
|
+
};
|
|
164
157
|
};
|
|
165
158
|
//# sourceMappingURL=constants.d.ts.map
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAElD,eAAO,MAAM,YAAY,SAAmB,CAAA;AAC5C,eAAO,MAAM,mBAAmB,SAAmB,CAAA;AAEnD,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;CAyKjB,CAAA;AAED,eAAO,MAAM,IAAI;;;;;;CAyChB,CAAA;AAED,eAAO,MAAM,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAsBxD,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,YAAa,OAAO,KAAG,UAAU,GAAG,SAA6B,CAAA;AAU9F,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmElB,CAAA"}
|
|
@@ -12,7 +12,26 @@ export declare class Native extends NativeCurrency {
|
|
|
12
12
|
});
|
|
13
13
|
get wrapped(): Token;
|
|
14
14
|
private static cache;
|
|
15
|
+
/**
|
|
16
|
+
* The chain's RPC-native currency.
|
|
17
|
+
*
|
|
18
|
+
* On a chain that wraps nothing, this instance is a hazard rather than a convenience: its
|
|
19
|
+
* `wrapped` getter throws, and the repo has ~900 unguarded `.wrapped` reads, so one leaking
|
|
20
|
+
* into the UI takes a page down somewhere far from where it was created. Those chains are
|
|
21
|
+
* meant to go through `resolveNativeCurrency`, which hands back the ERC-20 they declare.
|
|
22
|
+
*
|
|
23
|
+
* Constructing one anyway is therefore almost always a mistake, and this fails loudly at the
|
|
24
|
+
* point of construction — where it can be traced — rather than five frames deep in a getter
|
|
25
|
+
* on an unrelated screen. Only outside production: a wrong page beats a blank one, and the
|
|
26
|
+
* existing behaviour is what ships today.
|
|
27
|
+
*
|
|
28
|
+
* Gas and balance arithmetic genuinely needs the RPC native and its decimals. Those call
|
|
29
|
+
* sites use {@link getRpcNative}, which is greppable, so they read as a deliberate whitelist
|
|
30
|
+
* instead of disappearing into the same 81 anonymous `Native.onChain` calls.
|
|
31
|
+
*/
|
|
15
32
|
static onChain(chainId: number): Native;
|
|
33
|
+
/** @internal shared by `onChain` and `getRpcNative` — the actual construction. */
|
|
34
|
+
static rpcNative(chainId: number): Native;
|
|
16
35
|
equals(other: Currency): boolean;
|
|
17
36
|
}
|
|
18
37
|
//# sourceMappingURL=native.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/entities/native.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/entities/native.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAI5E;;;GAGG;AACH,qBAAa,MAAO,SAAQ,cAAc;IACxC,SAAS,aAAa,EACpB,OAAO,EACP,QAAQ,EACR,IAAI,EACJ,MAAM,GACP,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;QAChB,MAAM,EAAE,MAAM,CAAA;QACd,IAAI,EAAE,MAAM,CAAA;KACb;IAID,IAAW,OAAO,IAAI,KAAK,CAI1B;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAoC;IAExD;;;;;;;;;;;;;;;;OAgBG;WACW,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAW9C,kFAAkF;WACpE,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAUzC,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;CAGxC"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,uBAAuB,CAAA;AACrC,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA;AACvB,cAAc,kBAAkB,CAAA;AAChC,cAAc,OAAO,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,uBAAuB,CAAA;AACrC,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA;AACvB,cAAc,kBAAkB,CAAA;AAChC,cAAc,OAAO,CAAA;AACrB,cAAc,yBAAyB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -195,7 +195,7 @@ var WETH9 = {
|
|
|
195
195
|
),
|
|
196
196
|
[chains.ChainId.ROBINHOOD]: new ERC20Token(
|
|
197
197
|
chains.ChainId.ROBINHOOD,
|
|
198
|
-
|
|
198
|
+
"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73",
|
|
199
199
|
18,
|
|
200
200
|
"WETH",
|
|
201
201
|
"Wrapped Ether",
|
|
@@ -267,9 +267,10 @@ var WNATIVE = {
|
|
|
267
267
|
[chains.ChainId.MONAD_TESTNET]: WETH9[chains.ChainId.MONAD_TESTNET],
|
|
268
268
|
[chains.ChainId.ROBINHOOD]: WETH9[chains.ChainId.ROBINHOOD]
|
|
269
269
|
};
|
|
270
|
+
var getWrappedNative = (chainId) => WNATIVE[chainId];
|
|
270
271
|
var ETHER = { name: "Ether", symbol: "ETH", decimals: 18 };
|
|
271
272
|
var BNB = {
|
|
272
|
-
name: "
|
|
273
|
+
name: "BNB Chain Native Token",
|
|
273
274
|
symbol: "BNB",
|
|
274
275
|
decimals: 18
|
|
275
276
|
};
|
|
@@ -278,7 +279,7 @@ var NATIVE = {
|
|
|
278
279
|
[chains.ChainId.GOERLI]: { name: "Goerli Ether", symbol: "GOR", decimals: 18 },
|
|
279
280
|
[chains.ChainId.BSC]: BNB,
|
|
280
281
|
[chains.ChainId.BSC_TESTNET]: {
|
|
281
|
-
name: "
|
|
282
|
+
name: "BNB Chain Native Token",
|
|
282
283
|
symbol: "tBNB",
|
|
283
284
|
decimals: 18
|
|
284
285
|
},
|
|
@@ -294,7 +295,7 @@ var NATIVE = {
|
|
|
294
295
|
[chains.ChainId.LINEA_TESTNET]: ETHER,
|
|
295
296
|
[chains.ChainId.OPBNB]: BNB,
|
|
296
297
|
[chains.ChainId.OPBNB_TESTNET]: {
|
|
297
|
-
name: "
|
|
298
|
+
name: "BNB Chain Native Token",
|
|
298
299
|
symbol: "tBNB",
|
|
299
300
|
decimals: 18
|
|
300
301
|
},
|
|
@@ -326,7 +327,11 @@ var NATIVE = {
|
|
|
326
327
|
symbol: "MON",
|
|
327
328
|
decimals: 18
|
|
328
329
|
},
|
|
329
|
-
[chains.ChainId.ROBINHOOD]: ETHER
|
|
330
|
+
[chains.ChainId.ROBINHOOD]: ETHER,
|
|
331
|
+
// Arc settles gas in USDC. The RPC reports it with 18 decimals; the 6-decimal
|
|
332
|
+
// ERC-20 view of the same balance lives in the chain config's gasTokenOverride.
|
|
333
|
+
// There is deliberately no WNATIVE entry — nothing wraps native USDC.
|
|
334
|
+
[chains.ChainId.ARC]: { name: "USD Coin", symbol: "USDC", decimals: 18 }
|
|
330
335
|
};
|
|
331
336
|
var _Native = class extends swapSdkCore.NativeCurrency {
|
|
332
337
|
constructor({
|
|
@@ -342,7 +347,33 @@ var _Native = class extends swapSdkCore.NativeCurrency {
|
|
|
342
347
|
invariant2__default.default(!!wnative, "WRAPPED");
|
|
343
348
|
return wnative;
|
|
344
349
|
}
|
|
350
|
+
/**
|
|
351
|
+
* The chain's RPC-native currency.
|
|
352
|
+
*
|
|
353
|
+
* On a chain that wraps nothing, this instance is a hazard rather than a convenience: its
|
|
354
|
+
* `wrapped` getter throws, and the repo has ~900 unguarded `.wrapped` reads, so one leaking
|
|
355
|
+
* into the UI takes a page down somewhere far from where it was created. Those chains are
|
|
356
|
+
* meant to go through `resolveNativeCurrency`, which hands back the ERC-20 they declare.
|
|
357
|
+
*
|
|
358
|
+
* Constructing one anyway is therefore almost always a mistake, and this fails loudly at the
|
|
359
|
+
* point of construction — where it can be traced — rather than five frames deep in a getter
|
|
360
|
+
* on an unrelated screen. Only outside production: a wrong page beats a blank one, and the
|
|
361
|
+
* existing behaviour is what ships today.
|
|
362
|
+
*
|
|
363
|
+
* Gas and balance arithmetic genuinely needs the RPC native and its decimals. Those call
|
|
364
|
+
* sites use {@link getRpcNative}, which is greppable, so they read as a deliberate whitelist
|
|
365
|
+
* instead of disappearing into the same 81 anonymous `Native.onChain` calls.
|
|
366
|
+
*/
|
|
345
367
|
static onChain(chainId) {
|
|
368
|
+
if (process.env.NODE_ENV !== "production" && chains.getChainConfig(chainId)?.gasTokenOverride) {
|
|
369
|
+
throw new Error(
|
|
370
|
+
`Native.onChain(${chainId}): this chain settles gas in an ERC-20 and wraps nothing, so a native currency here has no .wrapped and will throw wherever it is read. Use resolveNativeCurrency(chainId) for the product's base asset, or getRpcNative(chainId) if you really need raw gas/balance decimals.`
|
|
371
|
+
);
|
|
372
|
+
}
|
|
373
|
+
return _Native.rpcNative(chainId);
|
|
374
|
+
}
|
|
375
|
+
/** @internal shared by `onChain` and `getRpcNative` — the actual construction. */
|
|
376
|
+
static rpcNative(chainId) {
|
|
346
377
|
if (chainId in this.cache) {
|
|
347
378
|
return this.cache[chainId];
|
|
348
379
|
}
|
|
@@ -705,6 +736,31 @@ async function fetchScaledUIAmountMetadata(client, address, chainId) {
|
|
|
705
736
|
});
|
|
706
737
|
return parseScaledUIAmountReads(results, dialect);
|
|
707
738
|
}
|
|
739
|
+
var cache = /* @__PURE__ */ new Map();
|
|
740
|
+
function resolveNativeCurrency(chainId) {
|
|
741
|
+
const cached = cache.get(chainId);
|
|
742
|
+
if (cached)
|
|
743
|
+
return cached;
|
|
744
|
+
const gasToken = chains.getChainConfig(chainId)?.gasTokenOverride;
|
|
745
|
+
const resolved = gasToken ? new ERC20Token(chainId, gasToken.address, gasToken.decimals, gasToken.symbol, gasToken.name) : Native.onChain(chainId);
|
|
746
|
+
cache.set(chainId, resolved);
|
|
747
|
+
return resolved;
|
|
748
|
+
}
|
|
749
|
+
function hasErc20GasToken(chainId) {
|
|
750
|
+
return Boolean(chains.getChainConfig(chainId)?.gasTokenOverride);
|
|
751
|
+
}
|
|
752
|
+
function getRpcNative(chainId) {
|
|
753
|
+
return Native.rpcNative(chainId);
|
|
754
|
+
}
|
|
755
|
+
function tryGetRpcNative(chainId) {
|
|
756
|
+
if (!chainId)
|
|
757
|
+
return void 0;
|
|
758
|
+
try {
|
|
759
|
+
return Native.rpcNative(chainId);
|
|
760
|
+
} catch {
|
|
761
|
+
return void 0;
|
|
762
|
+
}
|
|
763
|
+
}
|
|
708
764
|
|
|
709
765
|
Object.defineProperty(exports, 'SCALED_UI_DENOMINATOR', {
|
|
710
766
|
enumerable: true,
|
|
@@ -752,6 +808,9 @@ exports.erc165Abi = erc165Abi;
|
|
|
752
808
|
exports.erc20Abi = erc20Abi;
|
|
753
809
|
exports.fetchScaledUIAmountMetadata = fetchScaledUIAmountMetadata;
|
|
754
810
|
exports.getB20Variant = getB20Variant;
|
|
811
|
+
exports.getRpcNative = getRpcNative;
|
|
812
|
+
exports.getWrappedNative = getWrappedNative;
|
|
813
|
+
exports.hasErc20GasToken = hasErc20GasToken;
|
|
755
814
|
exports.isB20Address = isB20Address;
|
|
756
815
|
exports.isB20AssetAddress = isB20AssetAddress;
|
|
757
816
|
exports.isB20AssetToken = isB20AssetToken;
|
|
@@ -759,8 +818,10 @@ exports.isB20SupportedChainId = isB20SupportedChainId;
|
|
|
759
818
|
exports.matchB20RevertError = matchB20RevertError;
|
|
760
819
|
exports.parseScaledUIAmountReads = parseScaledUIAmountReads;
|
|
761
820
|
exports.probeIsScaledUIAmount = probeIsScaledUIAmount;
|
|
821
|
+
exports.resolveNativeCurrency = resolveNativeCurrency;
|
|
762
822
|
exports.resolveScaledUIDialect = resolveScaledUIDialect;
|
|
763
823
|
exports.scaledUIAmountAbi = scaledUIAmountAbi;
|
|
824
|
+
exports.tryGetRpcNative = tryGetRpcNative;
|
|
764
825
|
exports.validateAndParseAddress = validateAndParseAddress;
|
|
765
826
|
//# sourceMappingURL=out.js.map
|
|
766
827
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/entities/erc20Token.ts","../src/utils.ts","../src/entities/native.ts","../src/abis/ERC20.ts","../src/abis/ERC165.ts","../src/abis/ScaledUIAmount.ts","../src/abis/B20.ts","../src/ether.ts","../src/scaledUIAmount.ts","../src/b20.ts"],"names":["invariant","NativeCurrency","ChainId","B20Variant","SCALED_UI_DENOMINATOR"],"mappings":"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","sourcesContent":["import { ChainId, robinhoodChainConfig } from '@pancakeswap/chains'\nimport { Percent } from '@pancakeswap/swap-sdk-core'\n\nimport { ERC20Token } from './entities/erc20Token'\n\nexport const ZERO_PERCENT = new Percent('0')\nexport const ONE_HUNDRED_PERCENT = new Percent('1')\n\nexport const WETH9 = {\n [ChainId.ETHEREUM]: new ERC20Token(\n ChainId.ETHEREUM,\n '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.GOERLI]: new ERC20Token(\n ChainId.GOERLI,\n '0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.BSC]: new ERC20Token(\n ChainId.BSC,\n '0x2170Ed0880ac9A755fd29B2688956BD959F933F8',\n 18,\n 'ETH',\n 'Binance-Peg Ethereum Token',\n 'https://ethereum.org',\n ),\n [ChainId.BSC_TESTNET]: new ERC20Token(\n ChainId.BSC,\n '0xE7bCB9e341D546b66a46298f4893f5650a56e99E',\n 18,\n 'ETH',\n 'ETH',\n 'https://ethereum.org',\n ),\n [ChainId.ARBITRUM_ONE]: new ERC20Token(\n ChainId.ARBITRUM_ONE,\n '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.ARBITRUM_GOERLI]: new ERC20Token(\n ChainId.ARBITRUM_GOERLI,\n '0xEe01c0CD76354C383B8c7B4e65EA88D00B06f36f',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.ZKSYNC]: new ERC20Token(\n ChainId.ZKSYNC,\n '0x5AEa5775959fBC2557Cc8789bC1bf90A239D9a91',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.ZKSYNC_TESTNET]: new ERC20Token(\n ChainId.ZKSYNC_TESTNET,\n '0x02968DB286f24cB18bB5b24903eC8eBFAcf591C0',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.LINEA]: new ERC20Token(\n ChainId.LINEA,\n '0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.LINEA_TESTNET]: new ERC20Token(\n ChainId.LINEA_TESTNET,\n '0x2C1b868d6596a18e32E61B901E4060C872647b6C',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.OPBNB_TESTNET]: new ERC20Token(\n ChainId.OPBNB_TESTNET,\n '0x584f7b986d9942B0859a1E6921efA5342A673d04',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.OPBNB]: new ERC20Token(\n ChainId.OPBNB,\n '0xE7798f023fC62146e8Aa1b36Da45fb70855a77Ea',\n 18,\n 'ETH',\n 'Binance-Peg Ethereum Token',\n 'https://ethereum.org',\n ),\n [ChainId.BASE]: new ERC20Token(\n ChainId.BASE,\n '0x4200000000000000000000000000000000000006',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.BASE_TESTNET]: new ERC20Token(\n ChainId.BASE_TESTNET,\n '0x4200000000000000000000000000000000000006',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.SCROLL_SEPOLIA]: new ERC20Token(\n ChainId.SCROLL_SEPOLIA,\n '0x5300000000000000000000000000000000000004',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.SEPOLIA]: new ERC20Token(\n ChainId.SEPOLIA,\n '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.ARBITRUM_SEPOLIA]: new ERC20Token(\n ChainId.ARBITRUM_SEPOLIA,\n '0x1bdc540dEB9Ed1fA29964DeEcCc524A8f5e2198e',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.BASE_SEPOLIA]: new ERC20Token(\n ChainId.BASE_SEPOLIA,\n '0x4200000000000000000000000000000000000006',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.MONAD_MAINNET]: new ERC20Token(\n ChainId.MONAD_MAINNET,\n '0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A',\n 18,\n 'WMON',\n 'Wrapped Monad',\n 'https://www.monad.xyz/',\n ),\n [ChainId.MONAD_TESTNET]: new ERC20Token(\n ChainId.MONAD_TESTNET,\n '0x760AfE86e5de5fa0Ee542fc7B7B713e1c5425701',\n 18,\n 'WMON',\n 'Wrapped Monad',\n 'https://www.monad.xyz/',\n ),\n [ChainId.ROBINHOOD]: new ERC20Token(\n ChainId.ROBINHOOD,\n robinhoodChainConfig.tokens.wrappedNative,\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n}\n\nexport const WBNB = {\n [ChainId.ETHEREUM]: new ERC20Token(\n ChainId.ETHEREUM,\n '0x418D75f65a02b3D53B2418FB8E1fe493759c7605',\n 18,\n 'WBNB',\n 'Wrapped BNB',\n 'https://www.binance.org',\n ),\n [ChainId.BSC]: new ERC20Token(\n ChainId.BSC,\n '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c',\n 18,\n 'WBNB',\n 'Wrapped BNB',\n 'https://www.binance.org',\n ),\n [ChainId.BSC_TESTNET]: new ERC20Token(\n ChainId.BSC_TESTNET,\n '0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd',\n 18,\n 'WBNB',\n 'Wrapped BNB',\n 'https://www.binance.org',\n ),\n [ChainId.OPBNB_TESTNET]: new ERC20Token(\n ChainId.OPBNB_TESTNET,\n '0x4200000000000000000000000000000000000006',\n 18,\n 'WBNB',\n 'Wrapped BNB',\n 'https://www.binance.org',\n ),\n [ChainId.OPBNB]: new ERC20Token(\n ChainId.OPBNB,\n '0x4200000000000000000000000000000000000006',\n 18,\n 'WBNB',\n 'Wrapped BNB',\n 'https://www.binance.org',\n ),\n}\n\nexport const WNATIVE = {\n [ChainId.ETHEREUM]: WETH9[ChainId.ETHEREUM],\n [ChainId.GOERLI]: WETH9[ChainId.GOERLI],\n [ChainId.BSC]: WBNB[ChainId.BSC],\n [ChainId.BSC_TESTNET]: WBNB[ChainId.BSC_TESTNET],\n [ChainId.ARBITRUM_ONE]: WETH9[ChainId.ARBITRUM_ONE],\n [ChainId.ARBITRUM_GOERLI]: WETH9[ChainId.ARBITRUM_GOERLI],\n [ChainId.ZKSYNC]: WETH9[ChainId.ZKSYNC],\n [ChainId.ZKSYNC_TESTNET]: WETH9[ChainId.ZKSYNC_TESTNET],\n [ChainId.LINEA]: WETH9[ChainId.LINEA],\n [ChainId.LINEA_TESTNET]: WETH9[ChainId.LINEA_TESTNET],\n [ChainId.OPBNB_TESTNET]: WBNB[ChainId.OPBNB_TESTNET],\n [ChainId.OPBNB]: WBNB[ChainId.OPBNB],\n [ChainId.BASE]: WETH9[ChainId.BASE],\n [ChainId.BASE_TESTNET]: WETH9[ChainId.BASE_TESTNET],\n [ChainId.SCROLL_SEPOLIA]: WETH9[ChainId.SCROLL_SEPOLIA],\n [ChainId.SEPOLIA]: WETH9[ChainId.SEPOLIA],\n [ChainId.ARBITRUM_SEPOLIA]: WETH9[ChainId.ARBITRUM_SEPOLIA],\n [ChainId.BASE_SEPOLIA]: WETH9[ChainId.BASE_SEPOLIA],\n [ChainId.MONAD_MAINNET]: WETH9[ChainId.MONAD_MAINNET],\n [ChainId.MONAD_TESTNET]: WETH9[ChainId.MONAD_TESTNET],\n [ChainId.ROBINHOOD]: WETH9[ChainId.ROBINHOOD],\n} satisfies Partial<Record<ChainId, ERC20Token>>\n\nconst ETHER = { name: 'Ether', symbol: 'ETH', decimals: 18 } as const\n\nconst BNB = {\n name: 'Binance Chain',\n symbol: 'BNB',\n decimals: 18,\n} as const\n\nexport const NATIVE = {\n [ChainId.ETHEREUM]: ETHER,\n [ChainId.GOERLI]: { name: 'Goerli Ether', symbol: 'GOR', decimals: 18 },\n [ChainId.BSC]: BNB,\n [ChainId.BSC_TESTNET]: {\n name: 'Binance Chain',\n symbol: 'tBNB',\n decimals: 18,\n },\n [ChainId.ARBITRUM_ONE]: ETHER,\n [ChainId.ARBITRUM_GOERLI]: {\n name: 'Arbitrum Goerli Ether',\n symbol: 'AGOR',\n decimals: 18,\n },\n [ChainId.ZKSYNC]: ETHER,\n [ChainId.ZKSYNC_TESTNET]: ETHER,\n [ChainId.LINEA]: ETHER,\n [ChainId.LINEA_TESTNET]: ETHER,\n [ChainId.OPBNB]: BNB,\n [ChainId.OPBNB_TESTNET]: {\n name: 'Binance Chain',\n symbol: 'tBNB',\n decimals: 18,\n },\n [ChainId.BASE]: ETHER,\n [ChainId.BASE_TESTNET]: ETHER,\n [ChainId.SCROLL_SEPOLIA]: ETHER,\n [ChainId.SEPOLIA]: {\n name: 'Sepolia Ether',\n symbol: 'SEP',\n decimals: 18,\n },\n [ChainId.ARBITRUM_SEPOLIA]: {\n name: 'Arbitrum Sepolia Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n [ChainId.BASE_SEPOLIA]: {\n name: 'Sepolia Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n [ChainId.MONAD_MAINNET]: {\n name: 'Monad',\n symbol: 'MON',\n decimals: 18,\n },\n [ChainId.MONAD_TESTNET]: {\n name: 'Monad Testnet Ether',\n symbol: 'MON',\n decimals: 18,\n },\n [ChainId.ROBINHOOD]: ETHER,\n} satisfies Partial<\n Record<\n ChainId,\n {\n name: string\n symbol: string\n decimals: number\n }\n >\n>\n","import { Token } from '@pancakeswap/swap-sdk-core'\nimport { Address } from 'viem'\n\nimport { validateAndParseAddress } from '../utils'\n\n// /**\n// * Represents an ERC20 token with a unique address and some metadata.\n// */\nexport class ERC20Token extends Token {\n public constructor(\n chainId: number,\n address: Address,\n decimals: number,\n symbol: string,\n name?: string,\n projectLink?: string,\n ) {\n super(chainId, validateAndParseAddress(address), decimals, symbol, name, projectLink)\n }\n}\n","import { type Address, getAddress } from 'viem'\nimport invariant from 'tiny-invariant'\nimport warning from 'tiny-warning'\n\n// warns if addresses are not checksummed\n// eslint-disable-next-line consistent-return\nexport function validateAndParseAddress(address: string): Address {\n try {\n const checksummedAddress = getAddress(address)\n warning(address === checksummedAddress, `${address} is not checksummed.`)\n return checksummedAddress\n } catch (error) {\n invariant(false, `${address} is not a valid address.`)\n }\n}\n","import invariant from 'tiny-invariant'\nimport { Currency, Token, NativeCurrency } from '@pancakeswap/swap-sdk-core'\n\nimport { WNATIVE, NATIVE } from '../constants'\n\n/**\n *\n * Native is the main usage of a 'native' currency, i.e. for BSC mainnet and all testnets\n */\nexport class Native extends NativeCurrency {\n protected constructor({\n chainId,\n decimals,\n name,\n symbol,\n }: {\n chainId: number\n decimals: number\n symbol: string\n name: string\n }) {\n super(chainId, decimals, symbol, name)\n }\n\n public get wrapped(): Token {\n const wnative = WNATIVE[this.chainId as keyof typeof WNATIVE]\n invariant(!!wnative, 'WRAPPED')\n return wnative\n }\n\n private static cache: { [chainId: number]: Native } = {}\n\n public static onChain(chainId: number): Native {\n if (chainId in this.cache) {\n return this.cache[chainId]\n }\n invariant(!!NATIVE[chainId as keyof typeof NATIVE], 'NATIVE_CURRENCY')\n const { decimals, name, symbol } = NATIVE[chainId as keyof typeof WNATIVE]\n // eslint-disable-next-line no-return-assign\n return (this.cache[chainId] = new Native({ chainId, decimals, symbol, name }))\n }\n\n public equals(other: Currency): boolean {\n return other.isNative && other.chainId === this.chainId\n }\n}\n","export const erc20Abi = [\n {\n constant: true,\n inputs: [],\n name: 'decimals',\n outputs: [{ name: '', type: 'uint8' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [{ name: '', type: 'address' }],\n name: 'balanceOf',\n outputs: [{ name: '', type: 'uint256' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n] as const\n","/**\n * Minimal ERC-165 ABI fragment — just the `supportsInterface(bytes4)` view.\n * Used to probe whether a contract advertises support for a given interface ID.\n */\nexport const erc165Abi = [\n {\n type: 'function',\n name: 'supportsInterface',\n inputs: [{ name: 'interfaceId', type: 'bytes4' }],\n outputs: [{ type: 'bool' }],\n stateMutability: 'view',\n },\n] as const\n","/**\n * ERC-8056 (Scaled UI Amount) ABI fragments.\n *\n * Based on the `IScaledUIAmount` interface from the BNB Chain partner integration doc\n * v1.0 (8 Apr 2026). The spec itself is in Draft as of Oct 2025; these fragments are\n * pinned against the concrete implementation Binance is deploying for Stock Tokens.\n *\n * Spec: https://eips.ethereum.org/EIPS/eip-8056\n *\n * Notes:\n * - `newUIMultiplier` and `effectiveAt` are optional getters in the spec. Real\n * implementations may or may not expose them — reads must use `allowFailure: true`.\n * - `totalSupplyUI()` does NOT exist on Binance Stock Tokens per the partner doc FAQ;\n * compute as `toUIAmount(totalSupply())` instead.\n * - All on-chain helpers (`toUIAmount`, `fromUIAmount`, `balanceOfUI`) match the\n * contract's rounding exactly; prefer them over JS math when available.\n */\nexport const scaledUIAmountAbi = [\n // ─── Core required interface (ERC-165 ID: 0xa60bf13d) ───\n {\n type: 'function',\n name: 'uiMultiplier',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'toUIAmount',\n inputs: [{ name: 'rawAmount', type: 'uint256' }],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'fromUIAmount',\n inputs: [{ name: 'uiAmount', type: 'uint256' }],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n\n // ─── Balances extension (ERC-165 ID: 0xd890fd71) ───\n {\n type: 'function',\n name: 'balanceOfUI',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n\n // ─── Pending-change getters (optional in spec; common in implementations) ───\n {\n type: 'function',\n name: 'newUIMultiplier',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'effectiveAt',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n\n // ─── Events ───\n // Both timestamps required per BNB doc §4.1\n {\n type: 'event',\n name: 'UIMultiplierUpdated',\n inputs: [\n { name: 'oldMultiplier', type: 'uint256', indexed: false },\n { name: 'newMultiplier', type: 'uint256', indexed: false },\n { name: 'setAtTimestamp', type: 'uint256', indexed: false },\n { name: 'effectiveAtTimestamp', type: 'uint256', indexed: false },\n ],\n },\n // Optional event — emits raw + UI in one record (lets activity history show both\n // without re-deriving from the current multiplier)\n {\n type: 'event',\n name: 'TransferWithUIAmount',\n inputs: [\n { name: 'from', type: 'address', indexed: true },\n { name: 'to', type: 'address', indexed: true },\n { name: 'amount', type: 'uint256', indexed: false },\n { name: 'uiAmount', type: 'uint256', indexed: false },\n ],\n },\n] as const\n","/**\n * Base B20 Asset ABI fragments (Coinbase's `IB20Asset`).\n *\n * B20's ASSET variant has the same cosmetic display multiplier as ERC-8056, under different names.\n * Probed on Base mainnet 2026-07-28: `multiplier()` / `WAD_PRECISION()` / `toScaledBalance()` work;\n * `uiMultiplier()`, the pending getters and ALL of `supportsInterface()` revert. ERC-8056\n * conformance exists in base-std (PR #173) but is not deployed.\n *\n * https://docs.base.org/base-chain/specs/upgrades/beryl/b20\n */\nexport const b20AssetAbi = [\n {\n type: 'function',\n name: 'multiplier',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'WAD_PRECISION',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n\n // B20 does NOT claim the ERC-8056 Conversion extension id (0x57854fc3) — it keeps these native\n // names unaliased, so detect them by ABI, never by `supportsInterface`.\n {\n type: 'function',\n name: 'toScaledBalance',\n inputs: [{ name: 'rawBalance', type: 'uint256' }],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'toRawBalance',\n inputs: [{ name: 'scaledBalance', type: 'uint256' }],\n outputs: [{ name: 'rawBalance', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'scaledBalanceOf',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n\n // Post-#173 shapes, verbatim from base-std. The DEPLOYED precompile predates them and the\n // Coinbase doc calls its event `MultiplierUpdated` with an unverified arg list — probe the real\n // topic0 before indexing multiplier history.\n {\n type: 'event',\n name: 'UIMultiplierUpdated',\n inputs: [\n { name: 'oldMultiplier', type: 'uint256', indexed: false },\n { name: 'newMultiplier', type: 'uint256', indexed: false },\n { name: 'effectiveAtTimestamp', type: 'uint256', indexed: false },\n ],\n },\n {\n type: 'event',\n name: 'MultiplierUpdateCancelled',\n inputs: [\n { name: 'cancelledMultiplier', type: 'uint256', indexed: false },\n { name: 'cancelledEffectiveAt', type: 'uint256', indexed: false },\n ],\n },\n] as const\n","import invariant from 'tiny-invariant'\nimport { Currency, NativeCurrency, Token } from '@pancakeswap/swap-sdk-core'\nimport { ChainId } from '@pancakeswap/chains'\n\nimport { WETH9 } from './constants'\n\n/**\n * Ether is the main usage of a 'native' currency, i.e. for Ethereum mainnet and all testnets\n */\nexport class Ether extends NativeCurrency {\n protected constructor(chainId: number) {\n super(chainId, 18, 'ETH', 'Ether')\n }\n\n public get wrapped(): Token {\n const weth9 = WETH9[this.chainId as ChainId.ETHEREUM | ChainId.GOERLI]\n\n invariant(!!weth9, 'WRAPPED')\n\n return weth9\n }\n\n private static _etherCache: { [chainId: number]: Ether } = {}\n\n public static onChain(chainId: number): Ether {\n if (!this._etherCache[chainId]) {\n this._etherCache[chainId] = new Ether(chainId)\n }\n\n return this._etherCache[chainId]\n }\n\n public equals(other: Currency): boolean {\n return other.isNative && other.chainId === this.chainId\n }\n}\n","// EVM-side ScaledUI utilities — detection, read planning, and metadata parsing.\n// Pure functions, no React; the app layer wires react-query + caching on top.\n//\n// Two dialects expose the same display-multiplier concept: `erc8056` (`uiMultiplier()` + ERC-165)\n// and `b20` (Base's native standard: `multiplier()`, no ERC-165 — see ./b20). Both produce the same\n// ScaledUIAmountMetadata, and the math is identical (1e18 == B20's WAD_PRECISION()).\n//\n// `buildScaledUIAmountReads` + `parseScaledUIAmountReads` are the shared plan/parse pair used by\n// BOTH the fetcher below and the app's useScaledUIAmountMetadata hook, so the two can't drift.\n\nimport { SCALED_UI_DENOMINATOR } from '@pancakeswap/swap-sdk-core'\nimport type { Address, PublicClient } from 'viem'\nimport { b20AssetAbi } from './abis/B20'\nimport { erc165Abi } from './abis/ERC165'\nimport { scaledUIAmountAbi } from './abis/ScaledUIAmount'\nimport { isB20AssetToken } from './b20'\n\n/** ERC-8056 ERC-165 ids. B20 claims none of them — its `supportsInterface` reverts outright. */\nexport const SCALED_UI_AMOUNT_INTERFACE_ID = '0xa60bf13d' as const\nexport const SCALED_UI_AMOUNT_BALANCES_INTERFACE_ID = '0xd890fd71' as const\n\nexport type ScaledUIDialect = 'erc8056' | 'b20'\n\nexport type ScaledUIAmountReadFn = 'uiMultiplier' | 'multiplier' | 'newUIMultiplier' | 'effectiveAt'\n\ninterface ScaledUIDialectSpec {\n /** Ordered candidates for the active multiplier; first success wins. */\n multiplierFns: readonly ScaledUIAmountReadFn[]\n /** Optional in ERC-8056 and absent on B20 pre-#173, so reads use `allowFailure`. */\n pendingFns: readonly ScaledUIAmountReadFn[]\n}\n\nconst DIALECTS: Record<ScaledUIDialect, ScaledUIDialectSpec> = {\n erc8056: {\n // Deliberately no `multiplier()` fallback: it's a generic name that leverage/rebasing tokens\n // use for unrelated values, so reading it off an arbitrary token would corrupt displayed\n // amounts. Safe in the b20 dialect only because that's gated on a verified B20 address.\n multiplierFns: ['uiMultiplier'],\n pendingFns: ['newUIMultiplier', 'effectiveAt'],\n },\n b20: {\n // `multiplier()` first — the only getter that resolves today. `uiMultiplier()` is kept for\n // forward-compat: it starts working as an alias once base-std #173 reaches mainnet.\n multiplierFns: ['multiplier', 'uiMultiplier'],\n pendingFns: ['newUIMultiplier', 'effectiveAt'],\n },\n}\n\nconst ABI_BY_FN = {\n uiMultiplier: scaledUIAmountAbi,\n newUIMultiplier: scaledUIAmountAbi,\n effectiveAt: scaledUIAmountAbi,\n multiplier: b20AssetAbi,\n} as const satisfies Record<ScaledUIAmountReadFn, unknown>\n\n/** A conventional ERC-8056 token deployed on Base still gets the `erc8056` dialect. */\nexport function resolveScaledUIDialect(chainId?: number, address?: string | null): ScaledUIDialect {\n return isB20AssetToken(chainId, address) ? 'b20' : 'erc8056'\n}\n\nexport interface ScaledUIAmountRead {\n address: Address\n abi: (typeof ABI_BY_FN)[ScaledUIAmountReadFn]\n functionName: ScaledUIAmountReadFn\n chainId?: number\n}\n\n/** Shape shared by viem `multicall` and wagmi `useReadContracts` result entries. */\nexport interface ScaledUIAmountReadResult {\n status: 'success' | 'failure'\n result?: unknown\n}\n\n/** Positional — `parseScaledUIAmountReads` must be called with the same dialect. */\nexport function buildScaledUIAmountReads(params: {\n address: Address\n chainId?: number\n dialect: ScaledUIDialect\n}): ScaledUIAmountRead[] {\n const { address, chainId, dialect } = params\n const spec = DIALECTS[dialect]\n return [...spec.multiplierFns, ...spec.pendingFns].map((functionName) => ({\n address,\n abi: ABI_BY_FN[functionName],\n functionName,\n ...(chainId === undefined ? {} : { chainId }),\n }))\n}\n\nconst asBigInt = (entry: ScaledUIAmountReadResult | undefined): bigint | undefined =>\n entry?.status === 'success' && typeof entry.result === 'bigint' ? entry.result : undefined\n\n/**\n * Live ScaledUI metadata for a token. Consumers should treat `{ enabled: false, multiplier: 1e18 }`\n * as the identity case and early-out from any scaling logic.\n */\nexport type ScaledUIAmountMetadata = {\n enabled: boolean\n /** 18-decimal fixed point. Defaults to `1e18` (identity). */\n multiplier: bigint\n newMultiplier?: bigint\n /** Unix seconds. */\n effectiveAt?: number\n}\n\n/** Returned for non-scaled tokens and on any read failure; behaves like a normal ERC-20. */\nexport const IDENTITY_SCALED_UI_AMOUNT_METADATA: ScaledUIAmountMetadata = {\n enabled: false,\n multiplier: SCALED_UI_DENOMINATOR,\n}\n\nexport function parseScaledUIAmountReads(\n results: readonly ScaledUIAmountReadResult[],\n dialect: ScaledUIDialect,\n): ScaledUIAmountMetadata {\n const spec = DIALECTS[dialect]\n const multiplierCount = spec.multiplierFns.length\n\n let multiplier: bigint | undefined\n for (let i = 0; i < multiplierCount; i++) {\n const candidate = asBigInt(results[i])\n // Zero is invalid in both standards, but a buggy contract could return it — letting it through\n // would collapse displayed amounts to zero and divide-by-zero on parse.\n if (candidate !== undefined && candidate !== 0n) {\n multiplier = candidate\n break\n }\n }\n if (multiplier === undefined) return IDENTITY_SCALED_UI_AMOUNT_METADATA\n\n const pendingIndex = (fn: ScaledUIAmountReadFn) => {\n const offset = spec.pendingFns.indexOf(fn)\n return offset === -1 ? -1 : multiplierCount + offset\n }\n\n const newMultiplier = asBigInt(results[pendingIndex('newUIMultiplier')])\n const effectiveAtRaw = asBigInt(results[pendingIndex('effectiveAt')])\n const effectiveAt = effectiveAtRaw !== undefined ? Number(effectiveAtRaw) : undefined\n\n // B20 post-#173 MIRRORS `uiMultiplier()` when nothing is scheduled, so the `!==` is load-bearing.\n const hasPending =\n newMultiplier !== undefined && effectiveAt !== undefined && newMultiplier !== multiplier && effectiveAt > 0\n\n return hasPending ? { enabled: true, multiplier, newMultiplier, effectiveAt } : { enabled: true, multiplier }\n}\n\n/**\n * A perf gate, not a correctness gate — `fetchScaledUIAmountMetadata` falls back to identity anyway\n * if the reads revert. Callers cache both outcomes (asymmetric TTL in IndexedDB).\n */\nexport async function probeIsScaledUIAmount(\n client: PublicClient,\n address: Address,\n chainId?: number,\n): Promise<boolean> {\n // B20 reverts on `supportsInterface` for every id, so ERC-165 can never detect it.\n if (isB20AssetToken(chainId ?? client.chain?.id, address)) return true\n\n try {\n const result = await client.readContract({\n address,\n abi: erc165Abi,\n functionName: 'supportsInterface',\n args: [SCALED_UI_AMOUNT_INTERFACE_ID],\n })\n return Boolean(result)\n } catch {\n return false\n }\n}\n\n/** Safe against any contract — won't throw. */\nexport async function fetchScaledUIAmountMetadata(\n client: PublicClient,\n address: Address,\n chainId?: number,\n): Promise<ScaledUIAmountMetadata> {\n const dialect = resolveScaledUIDialect(chainId ?? client.chain?.id, address)\n const results = await client.multicall({\n contracts: buildScaledUIAmountReads({ address, dialect }),\n allowFailure: true,\n })\n return parseScaledUIAmountReads(results as readonly ScaledUIAmountReadResult[], dialect)\n}\n\nexport {\n SCALED_UI_DENOMINATOR,\n SCALED_UI_MULTIPLIER_DECIMALS,\n fromScaledUIAmount,\n isIdentityScaledUIMultiplier,\n toScaledUIAmount,\n} from '@pancakeswap/swap-sdk-core'\n","/**\n * Base B20 — extension module for the scaled-UI subsystem.\n *\n * Owns everything B20-specific: address recognition, precompile addresses, revert decoding.\n * Nothing outside this file and its ABI sibling needs to know B20 exists.\n *\n * Detection is by address prefix, not ERC-165: `supportsInterface` REVERTS on live B20 tokens for\n * every id including ERC-165's own, so the probe could only ever answer \"no\". Addresses are\n * self-describing instead — `[10-byte prefix][1-byte variant][9-byte keccak(deployer, salt)]` —\n * so the variant is recoverable with zero RPC.\n *\n * https://docs.base.org/base-chain/specs/upgrades/beryl/b20\n */\nimport { ChainId } from '@pancakeswap/chains'\nimport type { Address } from 'viem'\n\n/** Detection is gated on these so a `0xb2000…` vanity address elsewhere can't be mistaken for B20. */\nexport const B20_SUPPORTED_CHAIN_IDS = [ChainId.BASE, ChainId.BASE_SEPOLIA] as const\n\nexport type B20SupportedChainId = (typeof B20_SUPPORTED_CHAIN_IDS)[number]\n\n/** The 10-byte prefix shared by every B20 token, lowercase, without `0x`. */\nexport const B20_ADDRESS_PREFIX = 'b2000000000000000000' as const\n\n/** Encoded in address byte `[10]`. */\nexport enum B20Variant {\n ASSET = 0,\n STABLECOIN = 1,\n}\n\nexport const B20_FACTORY_ADDRESS = '0xB20f000000000000000000000000000000000000' as const\nexport const B20_ACTIVATION_REGISTRY_ADDRESS = '0x8453000000000000000000000000000000000001' as const\nexport const B20_POLICY_REGISTRY_ADDRESS = '0x8453000000000000000000000000000000000002' as const\n\nconst HEX_ADDRESS_LENGTH = 40\nconst VARIANT_NIBBLE_START = B20_ADDRESS_PREFIX.length\nconst VARIANT_NIBBLE_END = VARIANT_NIBBLE_START + 2\n\nconst stripHexPrefix = (address: string): string =>\n (address.startsWith('0x') || address.startsWith('0X') ? address.slice(2) : address).toLowerCase()\n\nexport function isB20SupportedChainId(chainId?: number): chainId is B20SupportedChainId {\n return B20_SUPPORTED_CHAIN_IDS.includes(chainId as B20SupportedChainId)\n}\n\n/** Chain-agnostic. Verified equivalent to the factory's own `isB20()` over 24 cases. */\nexport function isB20Address(address?: string | null): boolean {\n if (!address) return false\n const hex = stripHexPrefix(address)\n return hex.length === HEX_ADDRESS_LENGTH && hex.startsWith(B20_ADDRESS_PREFIX)\n}\n\nexport function getB20Variant(address?: string | null): B20Variant | undefined {\n if (!isB20Address(address)) return undefined\n switch (stripHexPrefix(address!).slice(VARIANT_NIBBLE_START, VARIANT_NIBBLE_END)) {\n case '00':\n return B20Variant.ASSET\n case '01':\n return B20Variant.STABLECOIN\n default:\n // A future variant we don't model. Treat as not-B20 rather than guess at its behaviour.\n return undefined\n }\n}\n\n/** Only the ASSET variant carries a multiplier, so a B20 stablecoin must not be treated as scaled. */\nexport function isB20AssetToken(chainId?: number, address?: string | null): boolean {\n return isB20SupportedChainId(chainId) && getB20Variant(address) === B20Variant.ASSET\n}\n\nexport const isB20AssetAddress = (chainId: number | undefined, address: Address | undefined): boolean =>\n isB20AssetToken(chainId, address)\n\n/* //////////////////////////////////////////////////////////////\n REVERT DECODING\n////////////////////////////////////////////////////////////// */\n\n/**\n * B20 raises ABI-encoded custom errors, and a swap reverts through the router — whose ABI doesn't\n * declare them — so viem can't name them and only the bare 4-byte selector survives. Matching it is\n * the only reliable hook. `PausableFeature` is an enum, hence `uint8`. Verified against `IB20.sol`.\n */\nexport const B20_ERROR_SELECTORS = {\n '0xa43fec12': 'PolicyForbids', // (bytes32 policyScope, uint64 policyId)\n '0xfd8c4245': 'ContractPaused', // (PausableFeature feature)\n '0xcccad523': 'PolicyNotFound', // (uint64 policyId)\n '0xcdd98a4a': 'UnsupportedPolicyType', // (bytes32 policyScope)\n '0xf58f733a': 'SupplyCapExceeded', // ()\n '0x6f12f3dc': 'InvalidMultiplier', // ()\n} as const\n\nexport type B20ErrorName = (typeof B20_ERROR_SELECTORS)[keyof typeof B20_ERROR_SELECTORS]\n\nexport const B20_PAUSABLE_FEATURES = ['TRANSFER', 'MINT', 'BURN'] as const\nexport type B20PausableFeature = (typeof B20_PAUSABLE_FEATURES)[number]\n\nexport type B20RevertMatch = {\n name: B20ErrorName\n /** Only for `ContractPaused`, when the revert data carried a decodable feature. */\n feature?: B20PausableFeature\n}\n\nconst SELECTOR_PATTERN = /0x[0-9a-fA-F]{8}/g\n\n/**\n * Scan an error payload for a known B20 custom error. Takes a flattened string so it stays\n * dependency-free; returns `undefined` so callers keep their generic handling.\n */\nexport function matchB20RevertError(input?: string | null): B20RevertMatch | undefined {\n if (!input) return undefined\n const matches = input.match(SELECTOR_PATTERN)\n if (!matches) return undefined\n\n for (const candidate of matches) {\n const name = B20_ERROR_SELECTORS[candidate.toLowerCase() as keyof typeof B20_ERROR_SELECTORS]\n if (!name) continue\n if (name !== 'ContractPaused') return { name }\n\n // The feature is the single 32-byte word after the selector, present only if we got full data.\n const dataMatch = input.match(new RegExp(`${candidate}([0-9a-fA-F]{64})`, 'i'))\n const featureIndex = dataMatch ? Number.parseInt(dataMatch[1], 16) : Number.NaN\n const feature = B20_PAUSABLE_FEATURES[featureIndex]\n return feature ? { name, feature } : { name }\n }\n\n return undefined\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/entities/erc20Token.ts","../src/utils.ts","../src/entities/native.ts","../src/abis/ERC20.ts","../src/abis/ERC165.ts","../src/abis/ScaledUIAmount.ts","../src/abis/B20.ts","../src/ether.ts","../src/scaledUIAmount.ts","../src/b20.ts","../src/resolveNativeCurrency.ts"],"names":["invariant","NativeCurrency","ChainId","B20Variant","SCALED_UI_DENOMINATOR","getChainConfig"],"mappings":"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","sourcesContent":["import { ChainId } from '@pancakeswap/chains'\nimport { Percent } from '@pancakeswap/swap-sdk-core'\n\nimport { ERC20Token } from './entities/erc20Token'\n\nexport const ZERO_PERCENT = new Percent('0')\nexport const ONE_HUNDRED_PERCENT = new Percent('1')\n\nexport const WETH9 = {\n [ChainId.ETHEREUM]: new ERC20Token(\n ChainId.ETHEREUM,\n '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.GOERLI]: new ERC20Token(\n ChainId.GOERLI,\n '0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.BSC]: new ERC20Token(\n ChainId.BSC,\n '0x2170Ed0880ac9A755fd29B2688956BD959F933F8',\n 18,\n 'ETH',\n 'Binance-Peg Ethereum Token',\n 'https://ethereum.org',\n ),\n [ChainId.BSC_TESTNET]: new ERC20Token(\n ChainId.BSC,\n '0xE7bCB9e341D546b66a46298f4893f5650a56e99E',\n 18,\n 'ETH',\n 'ETH',\n 'https://ethereum.org',\n ),\n [ChainId.ARBITRUM_ONE]: new ERC20Token(\n ChainId.ARBITRUM_ONE,\n '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.ARBITRUM_GOERLI]: new ERC20Token(\n ChainId.ARBITRUM_GOERLI,\n '0xEe01c0CD76354C383B8c7B4e65EA88D00B06f36f',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.ZKSYNC]: new ERC20Token(\n ChainId.ZKSYNC,\n '0x5AEa5775959fBC2557Cc8789bC1bf90A239D9a91',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.ZKSYNC_TESTNET]: new ERC20Token(\n ChainId.ZKSYNC_TESTNET,\n '0x02968DB286f24cB18bB5b24903eC8eBFAcf591C0',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.LINEA]: new ERC20Token(\n ChainId.LINEA,\n '0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.LINEA_TESTNET]: new ERC20Token(\n ChainId.LINEA_TESTNET,\n '0x2C1b868d6596a18e32E61B901E4060C872647b6C',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.OPBNB_TESTNET]: new ERC20Token(\n ChainId.OPBNB_TESTNET,\n '0x584f7b986d9942B0859a1E6921efA5342A673d04',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.OPBNB]: new ERC20Token(\n ChainId.OPBNB,\n '0xE7798f023fC62146e8Aa1b36Da45fb70855a77Ea',\n 18,\n 'ETH',\n 'Binance-Peg Ethereum Token',\n 'https://ethereum.org',\n ),\n [ChainId.BASE]: new ERC20Token(\n ChainId.BASE,\n '0x4200000000000000000000000000000000000006',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.BASE_TESTNET]: new ERC20Token(\n ChainId.BASE_TESTNET,\n '0x4200000000000000000000000000000000000006',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.SCROLL_SEPOLIA]: new ERC20Token(\n ChainId.SCROLL_SEPOLIA,\n '0x5300000000000000000000000000000000000004',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.SEPOLIA]: new ERC20Token(\n ChainId.SEPOLIA,\n '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.ARBITRUM_SEPOLIA]: new ERC20Token(\n ChainId.ARBITRUM_SEPOLIA,\n '0x1bdc540dEB9Ed1fA29964DeEcCc524A8f5e2198e',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.BASE_SEPOLIA]: new ERC20Token(\n ChainId.BASE_SEPOLIA,\n '0x4200000000000000000000000000000000000006',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.MONAD_MAINNET]: new ERC20Token(\n ChainId.MONAD_MAINNET,\n '0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A',\n 18,\n 'WMON',\n 'Wrapped Monad',\n 'https://www.monad.xyz/',\n ),\n [ChainId.MONAD_TESTNET]: new ERC20Token(\n ChainId.MONAD_TESTNET,\n '0x760AfE86e5de5fa0Ee542fc7B7B713e1c5425701',\n 18,\n 'WMON',\n 'Wrapped Monad',\n 'https://www.monad.xyz/',\n ),\n [ChainId.ROBINHOOD]: new ERC20Token(\n ChainId.ROBINHOOD,\n '0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n}\n\nexport const WBNB = {\n [ChainId.ETHEREUM]: new ERC20Token(\n ChainId.ETHEREUM,\n '0x418D75f65a02b3D53B2418FB8E1fe493759c7605',\n 18,\n 'WBNB',\n 'Wrapped BNB',\n 'https://www.binance.org',\n ),\n [ChainId.BSC]: new ERC20Token(\n ChainId.BSC,\n '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c',\n 18,\n 'WBNB',\n 'Wrapped BNB',\n 'https://www.binance.org',\n ),\n [ChainId.BSC_TESTNET]: new ERC20Token(\n ChainId.BSC_TESTNET,\n '0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd',\n 18,\n 'WBNB',\n 'Wrapped BNB',\n 'https://www.binance.org',\n ),\n [ChainId.OPBNB_TESTNET]: new ERC20Token(\n ChainId.OPBNB_TESTNET,\n '0x4200000000000000000000000000000000000006',\n 18,\n 'WBNB',\n 'Wrapped BNB',\n 'https://www.binance.org',\n ),\n [ChainId.OPBNB]: new ERC20Token(\n ChainId.OPBNB,\n '0x4200000000000000000000000000000000000006',\n 18,\n 'WBNB',\n 'Wrapped BNB',\n 'https://www.binance.org',\n ),\n}\n\nexport const WNATIVE: Partial<Record<ChainId, ERC20Token>> = {\n [ChainId.ETHEREUM]: WETH9[ChainId.ETHEREUM],\n [ChainId.GOERLI]: WETH9[ChainId.GOERLI],\n [ChainId.BSC]: WBNB[ChainId.BSC],\n [ChainId.BSC_TESTNET]: WBNB[ChainId.BSC_TESTNET],\n [ChainId.ARBITRUM_ONE]: WETH9[ChainId.ARBITRUM_ONE],\n [ChainId.ARBITRUM_GOERLI]: WETH9[ChainId.ARBITRUM_GOERLI],\n [ChainId.ZKSYNC]: WETH9[ChainId.ZKSYNC],\n [ChainId.ZKSYNC_TESTNET]: WETH9[ChainId.ZKSYNC_TESTNET],\n [ChainId.LINEA]: WETH9[ChainId.LINEA],\n [ChainId.LINEA_TESTNET]: WETH9[ChainId.LINEA_TESTNET],\n [ChainId.OPBNB_TESTNET]: WBNB[ChainId.OPBNB_TESTNET],\n [ChainId.OPBNB]: WBNB[ChainId.OPBNB],\n [ChainId.BASE]: WETH9[ChainId.BASE],\n [ChainId.BASE_TESTNET]: WETH9[ChainId.BASE_TESTNET],\n [ChainId.SCROLL_SEPOLIA]: WETH9[ChainId.SCROLL_SEPOLIA],\n [ChainId.SEPOLIA]: WETH9[ChainId.SEPOLIA],\n [ChainId.ARBITRUM_SEPOLIA]: WETH9[ChainId.ARBITRUM_SEPOLIA],\n [ChainId.BASE_SEPOLIA]: WETH9[ChainId.BASE_SEPOLIA],\n [ChainId.MONAD_MAINNET]: WETH9[ChainId.MONAD_MAINNET],\n [ChainId.MONAD_TESTNET]: WETH9[ChainId.MONAD_TESTNET],\n [ChainId.ROBINHOOD]: WETH9[ChainId.ROBINHOOD],\n}\n\n/**\n * The ERC-20 a chain's native currency wraps into.\n *\n * Not every EVM chain has one: on Arc the native USDC already satisfies IERC20, so\n * nothing wraps it and the chain is absent here. Read it through\n * {@link getWrappedNative} rather than indexing directly, so the missing case has to\n * be handled instead of blowing up at the first property access.\n */\nexport const getWrappedNative = (chainId: ChainId): ERC20Token | undefined => WNATIVE[chainId]\n\nconst ETHER = { name: 'Ether', symbol: 'ETH', decimals: 18 } as const\n\nconst BNB = {\n name: 'BNB Chain Native Token',\n symbol: 'BNB',\n decimals: 18,\n} as const\n\nexport const NATIVE = {\n [ChainId.ETHEREUM]: ETHER,\n [ChainId.GOERLI]: { name: 'Goerli Ether', symbol: 'GOR', decimals: 18 },\n [ChainId.BSC]: BNB,\n [ChainId.BSC_TESTNET]: {\n name: 'BNB Chain Native Token',\n symbol: 'tBNB',\n decimals: 18,\n },\n [ChainId.ARBITRUM_ONE]: ETHER,\n [ChainId.ARBITRUM_GOERLI]: {\n name: 'Arbitrum Goerli Ether',\n symbol: 'AGOR',\n decimals: 18,\n },\n [ChainId.ZKSYNC]: ETHER,\n [ChainId.ZKSYNC_TESTNET]: ETHER,\n [ChainId.LINEA]: ETHER,\n [ChainId.LINEA_TESTNET]: ETHER,\n [ChainId.OPBNB]: BNB,\n [ChainId.OPBNB_TESTNET]: {\n name: 'BNB Chain Native Token',\n symbol: 'tBNB',\n decimals: 18,\n },\n [ChainId.BASE]: ETHER,\n [ChainId.BASE_TESTNET]: ETHER,\n [ChainId.SCROLL_SEPOLIA]: ETHER,\n [ChainId.SEPOLIA]: {\n name: 'Sepolia Ether',\n symbol: 'SEP',\n decimals: 18,\n },\n [ChainId.ARBITRUM_SEPOLIA]: {\n name: 'Arbitrum Sepolia Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n [ChainId.BASE_SEPOLIA]: {\n name: 'Sepolia Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n [ChainId.MONAD_MAINNET]: {\n name: 'Monad',\n symbol: 'MON',\n decimals: 18,\n },\n [ChainId.MONAD_TESTNET]: {\n name: 'Monad Testnet Ether',\n symbol: 'MON',\n decimals: 18,\n },\n [ChainId.ROBINHOOD]: ETHER,\n // Arc settles gas in USDC. The RPC reports it with 18 decimals; the 6-decimal\n // ERC-20 view of the same balance lives in the chain config's gasTokenOverride.\n // There is deliberately no WNATIVE entry — nothing wraps native USDC.\n [ChainId.ARC]: { name: 'USD Coin', symbol: 'USDC', decimals: 18 },\n} satisfies Partial<\n Record<\n ChainId,\n {\n name: string\n symbol: string\n decimals: number\n }\n >\n>\n","import { Token } from '@pancakeswap/swap-sdk-core'\nimport { Address } from 'viem'\n\nimport { validateAndParseAddress } from '../utils'\n\n// /**\n// * Represents an ERC20 token with a unique address and some metadata.\n// */\nexport class ERC20Token extends Token {\n public constructor(\n chainId: number,\n address: Address,\n decimals: number,\n symbol: string,\n name?: string,\n projectLink?: string,\n ) {\n super(chainId, validateAndParseAddress(address), decimals, symbol, name, projectLink)\n }\n}\n","import { type Address, getAddress } from 'viem'\nimport invariant from 'tiny-invariant'\nimport warning from 'tiny-warning'\n\n// warns if addresses are not checksummed\n// eslint-disable-next-line consistent-return\nexport function validateAndParseAddress(address: string): Address {\n try {\n const checksummedAddress = getAddress(address)\n warning(address === checksummedAddress, `${address} is not checksummed.`)\n return checksummedAddress\n } catch (error) {\n invariant(false, `${address} is not a valid address.`)\n }\n}\n","import { ChainId, getChainConfig } from '@pancakeswap/chains'\nimport invariant from 'tiny-invariant'\nimport { Currency, Token, NativeCurrency } from '@pancakeswap/swap-sdk-core'\n\nimport { WNATIVE, NATIVE } from '../constants'\n\n/**\n *\n * Native is the main usage of a 'native' currency, i.e. for BSC mainnet and all testnets\n */\nexport class Native extends NativeCurrency {\n protected constructor({\n chainId,\n decimals,\n name,\n symbol,\n }: {\n chainId: number\n decimals: number\n symbol: string\n name: string\n }) {\n super(chainId, decimals, symbol, name)\n }\n\n public get wrapped(): Token {\n const wnative = WNATIVE[this.chainId as keyof typeof WNATIVE]\n invariant(!!wnative, 'WRAPPED')\n return wnative\n }\n\n private static cache: { [chainId: number]: Native } = {}\n\n /**\n * The chain's RPC-native currency.\n *\n * On a chain that wraps nothing, this instance is a hazard rather than a convenience: its\n * `wrapped` getter throws, and the repo has ~900 unguarded `.wrapped` reads, so one leaking\n * into the UI takes a page down somewhere far from where it was created. Those chains are\n * meant to go through `resolveNativeCurrency`, which hands back the ERC-20 they declare.\n *\n * Constructing one anyway is therefore almost always a mistake, and this fails loudly at the\n * point of construction — where it can be traced — rather than five frames deep in a getter\n * on an unrelated screen. Only outside production: a wrong page beats a blank one, and the\n * existing behaviour is what ships today.\n *\n * Gas and balance arithmetic genuinely needs the RPC native and its decimals. Those call\n * sites use {@link getRpcNative}, which is greppable, so they read as a deliberate whitelist\n * instead of disappearing into the same 81 anonymous `Native.onChain` calls.\n */\n public static onChain(chainId: number): Native {\n if (process.env.NODE_ENV !== 'production' && getChainConfig(chainId as ChainId)?.gasTokenOverride) {\n throw new Error(\n `Native.onChain(${chainId}): this chain settles gas in an ERC-20 and wraps nothing, so a native ` +\n `currency here has no .wrapped and will throw wherever it is read. Use resolveNativeCurrency(chainId) ` +\n `for the product's base asset, or getRpcNative(chainId) if you really need raw gas/balance decimals.`,\n )\n }\n return Native.rpcNative(chainId)\n }\n\n /** @internal shared by `onChain` and `getRpcNative` — the actual construction. */\n public static rpcNative(chainId: number): Native {\n if (chainId in this.cache) {\n return this.cache[chainId]\n }\n invariant(!!NATIVE[chainId as keyof typeof NATIVE], 'NATIVE_CURRENCY')\n const { decimals, name, symbol } = NATIVE[chainId as keyof typeof WNATIVE]\n // eslint-disable-next-line no-return-assign\n return (this.cache[chainId] = new Native({ chainId, decimals, symbol, name }))\n }\n\n public equals(other: Currency): boolean {\n return other.isNative && other.chainId === this.chainId\n }\n}\n","export const erc20Abi = [\n {\n constant: true,\n inputs: [],\n name: 'decimals',\n outputs: [{ name: '', type: 'uint8' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [{ name: '', type: 'address' }],\n name: 'balanceOf',\n outputs: [{ name: '', type: 'uint256' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n] as const\n","/**\n * Minimal ERC-165 ABI fragment — just the `supportsInterface(bytes4)` view.\n * Used to probe whether a contract advertises support for a given interface ID.\n */\nexport const erc165Abi = [\n {\n type: 'function',\n name: 'supportsInterface',\n inputs: [{ name: 'interfaceId', type: 'bytes4' }],\n outputs: [{ type: 'bool' }],\n stateMutability: 'view',\n },\n] as const\n","/**\n * ERC-8056 (Scaled UI Amount) ABI fragments.\n *\n * Based on the `IScaledUIAmount` interface from the BNB Chain partner integration doc\n * v1.0 (8 Apr 2026). The spec itself is in Draft as of Oct 2025; these fragments are\n * pinned against the concrete implementation Binance is deploying for Stock Tokens.\n *\n * Spec: https://eips.ethereum.org/EIPS/eip-8056\n *\n * Notes:\n * - `newUIMultiplier` and `effectiveAt` are optional getters in the spec. Real\n * implementations may or may not expose them — reads must use `allowFailure: true`.\n * - `totalSupplyUI()` does NOT exist on Binance Stock Tokens per the partner doc FAQ;\n * compute as `toUIAmount(totalSupply())` instead.\n * - All on-chain helpers (`toUIAmount`, `fromUIAmount`, `balanceOfUI`) match the\n * contract's rounding exactly; prefer them over JS math when available.\n */\nexport const scaledUIAmountAbi = [\n // ─── Core required interface (ERC-165 ID: 0xa60bf13d) ───\n {\n type: 'function',\n name: 'uiMultiplier',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'toUIAmount',\n inputs: [{ name: 'rawAmount', type: 'uint256' }],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'fromUIAmount',\n inputs: [{ name: 'uiAmount', type: 'uint256' }],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n\n // ─── Balances extension (ERC-165 ID: 0xd890fd71) ───\n {\n type: 'function',\n name: 'balanceOfUI',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n\n // ─── Pending-change getters (optional in spec; common in implementations) ───\n {\n type: 'function',\n name: 'newUIMultiplier',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'effectiveAt',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n\n // ─── Events ───\n // Both timestamps required per BNB doc §4.1\n {\n type: 'event',\n name: 'UIMultiplierUpdated',\n inputs: [\n { name: 'oldMultiplier', type: 'uint256', indexed: false },\n { name: 'newMultiplier', type: 'uint256', indexed: false },\n { name: 'setAtTimestamp', type: 'uint256', indexed: false },\n { name: 'effectiveAtTimestamp', type: 'uint256', indexed: false },\n ],\n },\n // Optional event — emits raw + UI in one record (lets activity history show both\n // without re-deriving from the current multiplier)\n {\n type: 'event',\n name: 'TransferWithUIAmount',\n inputs: [\n { name: 'from', type: 'address', indexed: true },\n { name: 'to', type: 'address', indexed: true },\n { name: 'amount', type: 'uint256', indexed: false },\n { name: 'uiAmount', type: 'uint256', indexed: false },\n ],\n },\n] as const\n","/**\n * Base B20 Asset ABI fragments (Coinbase's `IB20Asset`).\n *\n * B20's ASSET variant has the same cosmetic display multiplier as ERC-8056, under different names.\n * Probed on Base mainnet 2026-07-28: `multiplier()` / `WAD_PRECISION()` / `toScaledBalance()` work;\n * `uiMultiplier()`, the pending getters and ALL of `supportsInterface()` revert. ERC-8056\n * conformance exists in base-std (PR #173) but is not deployed.\n *\n * https://docs.base.org/base-chain/specs/upgrades/beryl/b20\n */\nexport const b20AssetAbi = [\n {\n type: 'function',\n name: 'multiplier',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'WAD_PRECISION',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n\n // B20 does NOT claim the ERC-8056 Conversion extension id (0x57854fc3) — it keeps these native\n // names unaliased, so detect them by ABI, never by `supportsInterface`.\n {\n type: 'function',\n name: 'toScaledBalance',\n inputs: [{ name: 'rawBalance', type: 'uint256' }],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'toRawBalance',\n inputs: [{ name: 'scaledBalance', type: 'uint256' }],\n outputs: [{ name: 'rawBalance', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'scaledBalanceOf',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n\n // Post-#173 shapes, verbatim from base-std. The DEPLOYED precompile predates them and the\n // Coinbase doc calls its event `MultiplierUpdated` with an unverified arg list — probe the real\n // topic0 before indexing multiplier history.\n {\n type: 'event',\n name: 'UIMultiplierUpdated',\n inputs: [\n { name: 'oldMultiplier', type: 'uint256', indexed: false },\n { name: 'newMultiplier', type: 'uint256', indexed: false },\n { name: 'effectiveAtTimestamp', type: 'uint256', indexed: false },\n ],\n },\n {\n type: 'event',\n name: 'MultiplierUpdateCancelled',\n inputs: [\n { name: 'cancelledMultiplier', type: 'uint256', indexed: false },\n { name: 'cancelledEffectiveAt', type: 'uint256', indexed: false },\n ],\n },\n] as const\n","import invariant from 'tiny-invariant'\nimport { Currency, NativeCurrency, Token } from '@pancakeswap/swap-sdk-core'\nimport { ChainId } from '@pancakeswap/chains'\n\nimport { WETH9 } from './constants'\n\n/**\n * Ether is the main usage of a 'native' currency, i.e. for Ethereum mainnet and all testnets\n */\nexport class Ether extends NativeCurrency {\n protected constructor(chainId: number) {\n super(chainId, 18, 'ETH', 'Ether')\n }\n\n public get wrapped(): Token {\n const weth9 = WETH9[this.chainId as ChainId.ETHEREUM | ChainId.GOERLI]\n\n invariant(!!weth9, 'WRAPPED')\n\n return weth9\n }\n\n private static _etherCache: { [chainId: number]: Ether } = {}\n\n public static onChain(chainId: number): Ether {\n if (!this._etherCache[chainId]) {\n this._etherCache[chainId] = new Ether(chainId)\n }\n\n return this._etherCache[chainId]\n }\n\n public equals(other: Currency): boolean {\n return other.isNative && other.chainId === this.chainId\n }\n}\n","// EVM-side ScaledUI utilities — detection, read planning, and metadata parsing.\n// Pure functions, no React; the app layer wires react-query + caching on top.\n//\n// Two dialects expose the same display-multiplier concept: `erc8056` (`uiMultiplier()` + ERC-165)\n// and `b20` (Base's native standard: `multiplier()`, no ERC-165 — see ./b20). Both produce the same\n// ScaledUIAmountMetadata, and the math is identical (1e18 == B20's WAD_PRECISION()).\n//\n// `buildScaledUIAmountReads` + `parseScaledUIAmountReads` are the shared plan/parse pair used by\n// BOTH the fetcher below and the app's useScaledUIAmountMetadata hook, so the two can't drift.\n\nimport { SCALED_UI_DENOMINATOR } from '@pancakeswap/swap-sdk-core'\nimport type { Address, PublicClient } from 'viem'\nimport { b20AssetAbi } from './abis/B20'\nimport { erc165Abi } from './abis/ERC165'\nimport { scaledUIAmountAbi } from './abis/ScaledUIAmount'\nimport { isB20AssetToken } from './b20'\n\n/** ERC-8056 ERC-165 ids. B20 claims none of them — its `supportsInterface` reverts outright. */\nexport const SCALED_UI_AMOUNT_INTERFACE_ID = '0xa60bf13d' as const\nexport const SCALED_UI_AMOUNT_BALANCES_INTERFACE_ID = '0xd890fd71' as const\n\nexport type ScaledUIDialect = 'erc8056' | 'b20'\n\nexport type ScaledUIAmountReadFn = 'uiMultiplier' | 'multiplier' | 'newUIMultiplier' | 'effectiveAt'\n\ninterface ScaledUIDialectSpec {\n /** Ordered candidates for the active multiplier; first success wins. */\n multiplierFns: readonly ScaledUIAmountReadFn[]\n /** Optional in ERC-8056 and absent on B20 pre-#173, so reads use `allowFailure`. */\n pendingFns: readonly ScaledUIAmountReadFn[]\n}\n\nconst DIALECTS: Record<ScaledUIDialect, ScaledUIDialectSpec> = {\n erc8056: {\n // Deliberately no `multiplier()` fallback: it's a generic name that leverage/rebasing tokens\n // use for unrelated values, so reading it off an arbitrary token would corrupt displayed\n // amounts. Safe in the b20 dialect only because that's gated on a verified B20 address.\n multiplierFns: ['uiMultiplier'],\n pendingFns: ['newUIMultiplier', 'effectiveAt'],\n },\n b20: {\n // `multiplier()` first — the only getter that resolves today. `uiMultiplier()` is kept for\n // forward-compat: it starts working as an alias once base-std #173 reaches mainnet.\n multiplierFns: ['multiplier', 'uiMultiplier'],\n pendingFns: ['newUIMultiplier', 'effectiveAt'],\n },\n}\n\nconst ABI_BY_FN = {\n uiMultiplier: scaledUIAmountAbi,\n newUIMultiplier: scaledUIAmountAbi,\n effectiveAt: scaledUIAmountAbi,\n multiplier: b20AssetAbi,\n} as const satisfies Record<ScaledUIAmountReadFn, unknown>\n\n/** A conventional ERC-8056 token deployed on Base still gets the `erc8056` dialect. */\nexport function resolveScaledUIDialect(chainId?: number, address?: string | null): ScaledUIDialect {\n return isB20AssetToken(chainId, address) ? 'b20' : 'erc8056'\n}\n\nexport interface ScaledUIAmountRead {\n address: Address\n abi: (typeof ABI_BY_FN)[ScaledUIAmountReadFn]\n functionName: ScaledUIAmountReadFn\n chainId?: number\n}\n\n/** Shape shared by viem `multicall` and wagmi `useReadContracts` result entries. */\nexport interface ScaledUIAmountReadResult {\n status: 'success' | 'failure'\n result?: unknown\n}\n\n/** Positional — `parseScaledUIAmountReads` must be called with the same dialect. */\nexport function buildScaledUIAmountReads(params: {\n address: Address\n chainId?: number\n dialect: ScaledUIDialect\n}): ScaledUIAmountRead[] {\n const { address, chainId, dialect } = params\n const spec = DIALECTS[dialect]\n return [...spec.multiplierFns, ...spec.pendingFns].map((functionName) => ({\n address,\n abi: ABI_BY_FN[functionName],\n functionName,\n ...(chainId === undefined ? {} : { chainId }),\n }))\n}\n\nconst asBigInt = (entry: ScaledUIAmountReadResult | undefined): bigint | undefined =>\n entry?.status === 'success' && typeof entry.result === 'bigint' ? entry.result : undefined\n\n/**\n * Live ScaledUI metadata for a token. Consumers should treat `{ enabled: false, multiplier: 1e18 }`\n * as the identity case and early-out from any scaling logic.\n */\nexport type ScaledUIAmountMetadata = {\n enabled: boolean\n /** 18-decimal fixed point. Defaults to `1e18` (identity). */\n multiplier: bigint\n newMultiplier?: bigint\n /** Unix seconds. */\n effectiveAt?: number\n}\n\n/** Returned for non-scaled tokens and on any read failure; behaves like a normal ERC-20. */\nexport const IDENTITY_SCALED_UI_AMOUNT_METADATA: ScaledUIAmountMetadata = {\n enabled: false,\n multiplier: SCALED_UI_DENOMINATOR,\n}\n\nexport function parseScaledUIAmountReads(\n results: readonly ScaledUIAmountReadResult[],\n dialect: ScaledUIDialect,\n): ScaledUIAmountMetadata {\n const spec = DIALECTS[dialect]\n const multiplierCount = spec.multiplierFns.length\n\n let multiplier: bigint | undefined\n for (let i = 0; i < multiplierCount; i++) {\n const candidate = asBigInt(results[i])\n // Zero is invalid in both standards, but a buggy contract could return it — letting it through\n // would collapse displayed amounts to zero and divide-by-zero on parse.\n if (candidate !== undefined && candidate !== 0n) {\n multiplier = candidate\n break\n }\n }\n if (multiplier === undefined) return IDENTITY_SCALED_UI_AMOUNT_METADATA\n\n const pendingIndex = (fn: ScaledUIAmountReadFn) => {\n const offset = spec.pendingFns.indexOf(fn)\n return offset === -1 ? -1 : multiplierCount + offset\n }\n\n const newMultiplier = asBigInt(results[pendingIndex('newUIMultiplier')])\n const effectiveAtRaw = asBigInt(results[pendingIndex('effectiveAt')])\n const effectiveAt = effectiveAtRaw !== undefined ? Number(effectiveAtRaw) : undefined\n\n // B20 post-#173 MIRRORS `uiMultiplier()` when nothing is scheduled, so the `!==` is load-bearing.\n const hasPending =\n newMultiplier !== undefined && effectiveAt !== undefined && newMultiplier !== multiplier && effectiveAt > 0\n\n return hasPending ? { enabled: true, multiplier, newMultiplier, effectiveAt } : { enabled: true, multiplier }\n}\n\n/**\n * A perf gate, not a correctness gate — `fetchScaledUIAmountMetadata` falls back to identity anyway\n * if the reads revert. Callers cache both outcomes (asymmetric TTL in IndexedDB).\n */\nexport async function probeIsScaledUIAmount(\n client: PublicClient,\n address: Address,\n chainId?: number,\n): Promise<boolean> {\n // B20 reverts on `supportsInterface` for every id, so ERC-165 can never detect it.\n if (isB20AssetToken(chainId ?? client.chain?.id, address)) return true\n\n try {\n const result = await client.readContract({\n address,\n abi: erc165Abi,\n functionName: 'supportsInterface',\n args: [SCALED_UI_AMOUNT_INTERFACE_ID],\n })\n return Boolean(result)\n } catch {\n return false\n }\n}\n\n/** Safe against any contract — won't throw. */\nexport async function fetchScaledUIAmountMetadata(\n client: PublicClient,\n address: Address,\n chainId?: number,\n): Promise<ScaledUIAmountMetadata> {\n const dialect = resolveScaledUIDialect(chainId ?? client.chain?.id, address)\n const results = await client.multicall({\n contracts: buildScaledUIAmountReads({ address, dialect }),\n allowFailure: true,\n })\n return parseScaledUIAmountReads(results as readonly ScaledUIAmountReadResult[], dialect)\n}\n\nexport {\n SCALED_UI_DENOMINATOR,\n SCALED_UI_MULTIPLIER_DECIMALS,\n fromScaledUIAmount,\n isIdentityScaledUIMultiplier,\n toScaledUIAmount,\n} from '@pancakeswap/swap-sdk-core'\n","/**\n * Base B20 — extension module for the scaled-UI subsystem.\n *\n * Owns everything B20-specific: address recognition, precompile addresses, revert decoding.\n * Nothing outside this file and its ABI sibling needs to know B20 exists.\n *\n * Detection is by address prefix, not ERC-165: `supportsInterface` REVERTS on live B20 tokens for\n * every id including ERC-165's own, so the probe could only ever answer \"no\". Addresses are\n * self-describing instead — `[10-byte prefix][1-byte variant][9-byte keccak(deployer, salt)]` —\n * so the variant is recoverable with zero RPC.\n *\n * https://docs.base.org/base-chain/specs/upgrades/beryl/b20\n */\nimport { ChainId } from '@pancakeswap/chains'\nimport type { Address } from 'viem'\n\n/** Detection is gated on these so a `0xb2000…` vanity address elsewhere can't be mistaken for B20. */\nexport const B20_SUPPORTED_CHAIN_IDS = [ChainId.BASE, ChainId.BASE_SEPOLIA] as const\n\nexport type B20SupportedChainId = (typeof B20_SUPPORTED_CHAIN_IDS)[number]\n\n/** The 10-byte prefix shared by every B20 token, lowercase, without `0x`. */\nexport const B20_ADDRESS_PREFIX = 'b2000000000000000000' as const\n\n/** Encoded in address byte `[10]`. */\nexport enum B20Variant {\n ASSET = 0,\n STABLECOIN = 1,\n}\n\nexport const B20_FACTORY_ADDRESS = '0xB20f000000000000000000000000000000000000' as const\nexport const B20_ACTIVATION_REGISTRY_ADDRESS = '0x8453000000000000000000000000000000000001' as const\nexport const B20_POLICY_REGISTRY_ADDRESS = '0x8453000000000000000000000000000000000002' as const\n\nconst HEX_ADDRESS_LENGTH = 40\nconst VARIANT_NIBBLE_START = B20_ADDRESS_PREFIX.length\nconst VARIANT_NIBBLE_END = VARIANT_NIBBLE_START + 2\n\nconst stripHexPrefix = (address: string): string =>\n (address.startsWith('0x') || address.startsWith('0X') ? address.slice(2) : address).toLowerCase()\n\nexport function isB20SupportedChainId(chainId?: number): chainId is B20SupportedChainId {\n return B20_SUPPORTED_CHAIN_IDS.includes(chainId as B20SupportedChainId)\n}\n\n/** Chain-agnostic. Verified equivalent to the factory's own `isB20()` over 24 cases. */\nexport function isB20Address(address?: string | null): boolean {\n if (!address) return false\n const hex = stripHexPrefix(address)\n return hex.length === HEX_ADDRESS_LENGTH && hex.startsWith(B20_ADDRESS_PREFIX)\n}\n\nexport function getB20Variant(address?: string | null): B20Variant | undefined {\n if (!isB20Address(address)) return undefined\n switch (stripHexPrefix(address!).slice(VARIANT_NIBBLE_START, VARIANT_NIBBLE_END)) {\n case '00':\n return B20Variant.ASSET\n case '01':\n return B20Variant.STABLECOIN\n default:\n // A future variant we don't model. Treat as not-B20 rather than guess at its behaviour.\n return undefined\n }\n}\n\n/** Only the ASSET variant carries a multiplier, so a B20 stablecoin must not be treated as scaled. */\nexport function isB20AssetToken(chainId?: number, address?: string | null): boolean {\n return isB20SupportedChainId(chainId) && getB20Variant(address) === B20Variant.ASSET\n}\n\nexport const isB20AssetAddress = (chainId: number | undefined, address: Address | undefined): boolean =>\n isB20AssetToken(chainId, address)\n\n/* //////////////////////////////////////////////////////////////\n REVERT DECODING\n////////////////////////////////////////////////////////////// */\n\n/**\n * B20 raises ABI-encoded custom errors, and a swap reverts through the router — whose ABI doesn't\n * declare them — so viem can't name them and only the bare 4-byte selector survives. Matching it is\n * the only reliable hook. `PausableFeature` is an enum, hence `uint8`. Verified against `IB20.sol`.\n */\nexport const B20_ERROR_SELECTORS = {\n '0xa43fec12': 'PolicyForbids', // (bytes32 policyScope, uint64 policyId)\n '0xfd8c4245': 'ContractPaused', // (PausableFeature feature)\n '0xcccad523': 'PolicyNotFound', // (uint64 policyId)\n '0xcdd98a4a': 'UnsupportedPolicyType', // (bytes32 policyScope)\n '0xf58f733a': 'SupplyCapExceeded', // ()\n '0x6f12f3dc': 'InvalidMultiplier', // ()\n} as const\n\nexport type B20ErrorName = (typeof B20_ERROR_SELECTORS)[keyof typeof B20_ERROR_SELECTORS]\n\nexport const B20_PAUSABLE_FEATURES = ['TRANSFER', 'MINT', 'BURN'] as const\nexport type B20PausableFeature = (typeof B20_PAUSABLE_FEATURES)[number]\n\nexport type B20RevertMatch = {\n name: B20ErrorName\n /** Only for `ContractPaused`, when the revert data carried a decodable feature. */\n feature?: B20PausableFeature\n}\n\nconst SELECTOR_PATTERN = /0x[0-9a-fA-F]{8}/g\n\n/**\n * Scan an error payload for a known B20 custom error. Takes a flattened string so it stays\n * dependency-free; returns `undefined` so callers keep their generic handling.\n */\nexport function matchB20RevertError(input?: string | null): B20RevertMatch | undefined {\n if (!input) return undefined\n const matches = input.match(SELECTOR_PATTERN)\n if (!matches) return undefined\n\n for (const candidate of matches) {\n const name = B20_ERROR_SELECTORS[candidate.toLowerCase() as keyof typeof B20_ERROR_SELECTORS]\n if (!name) continue\n if (name !== 'ContractPaused') return { name }\n\n // The feature is the single 32-byte word after the selector, present only if we got full data.\n const dataMatch = input.match(new RegExp(`${candidate}([0-9a-fA-F]{64})`, 'i'))\n const featureIndex = dataMatch ? Number.parseInt(dataMatch[1], 16) : Number.NaN\n const feature = B20_PAUSABLE_FEATURES[featureIndex]\n return feature ? { name, feature } : { name }\n }\n\n return undefined\n}\n","import { ChainId, getChainConfig } from '@pancakeswap/chains'\nimport type { Currency } from '@pancakeswap/swap-sdk-core'\nimport { Native } from './entities/native'\nimport { ERC20Token } from './entities/erc20Token'\n\nconst cache = new Map<number, Currency>()\n\n/**\n * The currency the product should treat as a chain's base asset.\n *\n * On nearly every chain that is the RPC native, and this returns `Native.onChain(chainId)`\n * unchanged. The exception is a chain that settles gas in an ordinary ERC-20: Arc's native\n * USDC already satisfies IERC20, so nothing wraps it and `wrappedNativeCurrency` is null,\n * which makes a native `Currency` there a liability — `.wrapped` throws, and roughly a\n * hundred call sites read it without asking.\n *\n * Rather than patch each of those, the app simply never materialises such a native: this\n * returns the ERC-20 the chain declares for the same balance (`gasTokenOverride`), which is\n * also what its pools are keyed by and what a user means when they name the asset.\n *\n * NOT for gas arithmetic. `eth_getBalance`, gasPrice and gasLimit are denominated in the RPC\n * native's decimals, and on Arc that is 18 against the ERC-20's 6 — measured on chain, the two\n * views of one balance differ by exactly 1e12. Anything converting a raw wei figure must keep\n * using `NATIVE[chainId]` / `Native.onChain` and rescale explicitly.\n */\nexport function resolveNativeCurrency(chainId: number): Currency {\n const cached = cache.get(chainId)\n if (cached) return cached\n\n const gasToken = getChainConfig(chainId as ChainId)?.gasTokenOverride\n const resolved: Currency = gasToken\n ? new ERC20Token(chainId, gasToken.address as `0x${string}`, gasToken.decimals, gasToken.symbol, gasToken.name)\n : Native.onChain(chainId)\n\n cache.set(chainId, resolved)\n return resolved\n}\n\n/**\n * True when the chain's base asset is an ERC-20 rather than an unwrappable native, i.e. when\n * {@link resolveNativeCurrency} returns something that is not `isNative`.\n */\nexport function hasErc20GasToken(chainId: number): boolean {\n return Boolean(getChainConfig(chainId as ChainId)?.gasTokenOverride)\n}\n\n/**\n * The RPC-native currency, for the places that genuinely need it.\n *\n * `eth_getBalance`, `gasPrice`, `gasLimit` and anything else denominated in wei are in the\n * chain's native decimals, which on a chain with a differently-scaled ERC-20 base asset is not\n * the same scale as {@link resolveNativeCurrency} — Arc's two views of one balance were measured\n * 1e12 apart. Those raw figures must be paired with this, never with the product base asset.\n *\n * This exists so the handful of legitimate uses are greppable and reviewable, rather than\n * indistinguishable from an accidental `Native.onChain`.\n */\nexport function getRpcNative(chainId: number): Native {\n return Native.rpcNative(chainId)\n}\n\n/**\n * `getRpcNative` for a chain id that may not be an EVM chain at all.\n *\n * `Native.rpcNative` asserts `NATIVE[chainId]` exists, so handing it a non-EVM id (Solana) throws\n * `Invariant failed`. Hooks that read a native balance run on whatever chain the page happens to\n * be on, so they need to ask rather than assert.\n */\nexport function tryGetRpcNative(chainId?: number): Native | undefined {\n if (!chainId) return undefined\n try {\n return Native.rpcNative(chainId)\n } catch {\n return undefined\n }\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ChainId,
|
|
1
|
+
import { ChainId, getChainConfig } from '@pancakeswap/chains';
|
|
2
2
|
import { Percent, Token, SCALED_UI_DENOMINATOR, NativeCurrency } from '@pancakeswap/swap-sdk-core';
|
|
3
3
|
export { SCALED_UI_DENOMINATOR, SCALED_UI_MULTIPLIER_DECIMALS, fromScaledUIAmount, isIdentityScaledUIMultiplier, toScaledUIAmount } from '@pancakeswap/swap-sdk-core';
|
|
4
4
|
import { getAddress } from 'viem';
|
|
@@ -189,7 +189,7 @@ var WETH9 = {
|
|
|
189
189
|
),
|
|
190
190
|
[ChainId.ROBINHOOD]: new ERC20Token(
|
|
191
191
|
ChainId.ROBINHOOD,
|
|
192
|
-
|
|
192
|
+
"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73",
|
|
193
193
|
18,
|
|
194
194
|
"WETH",
|
|
195
195
|
"Wrapped Ether",
|
|
@@ -261,9 +261,10 @@ var WNATIVE = {
|
|
|
261
261
|
[ChainId.MONAD_TESTNET]: WETH9[ChainId.MONAD_TESTNET],
|
|
262
262
|
[ChainId.ROBINHOOD]: WETH9[ChainId.ROBINHOOD]
|
|
263
263
|
};
|
|
264
|
+
var getWrappedNative = (chainId) => WNATIVE[chainId];
|
|
264
265
|
var ETHER = { name: "Ether", symbol: "ETH", decimals: 18 };
|
|
265
266
|
var BNB = {
|
|
266
|
-
name: "
|
|
267
|
+
name: "BNB Chain Native Token",
|
|
267
268
|
symbol: "BNB",
|
|
268
269
|
decimals: 18
|
|
269
270
|
};
|
|
@@ -272,7 +273,7 @@ var NATIVE = {
|
|
|
272
273
|
[ChainId.GOERLI]: { name: "Goerli Ether", symbol: "GOR", decimals: 18 },
|
|
273
274
|
[ChainId.BSC]: BNB,
|
|
274
275
|
[ChainId.BSC_TESTNET]: {
|
|
275
|
-
name: "
|
|
276
|
+
name: "BNB Chain Native Token",
|
|
276
277
|
symbol: "tBNB",
|
|
277
278
|
decimals: 18
|
|
278
279
|
},
|
|
@@ -288,7 +289,7 @@ var NATIVE = {
|
|
|
288
289
|
[ChainId.LINEA_TESTNET]: ETHER,
|
|
289
290
|
[ChainId.OPBNB]: BNB,
|
|
290
291
|
[ChainId.OPBNB_TESTNET]: {
|
|
291
|
-
name: "
|
|
292
|
+
name: "BNB Chain Native Token",
|
|
292
293
|
symbol: "tBNB",
|
|
293
294
|
decimals: 18
|
|
294
295
|
},
|
|
@@ -320,7 +321,11 @@ var NATIVE = {
|
|
|
320
321
|
symbol: "MON",
|
|
321
322
|
decimals: 18
|
|
322
323
|
},
|
|
323
|
-
[ChainId.ROBINHOOD]: ETHER
|
|
324
|
+
[ChainId.ROBINHOOD]: ETHER,
|
|
325
|
+
// Arc settles gas in USDC. The RPC reports it with 18 decimals; the 6-decimal
|
|
326
|
+
// ERC-20 view of the same balance lives in the chain config's gasTokenOverride.
|
|
327
|
+
// There is deliberately no WNATIVE entry — nothing wraps native USDC.
|
|
328
|
+
[ChainId.ARC]: { name: "USD Coin", symbol: "USDC", decimals: 18 }
|
|
324
329
|
};
|
|
325
330
|
var _Native = class extends NativeCurrency {
|
|
326
331
|
constructor({
|
|
@@ -336,7 +341,33 @@ var _Native = class extends NativeCurrency {
|
|
|
336
341
|
invariant2(!!wnative, "WRAPPED");
|
|
337
342
|
return wnative;
|
|
338
343
|
}
|
|
344
|
+
/**
|
|
345
|
+
* The chain's RPC-native currency.
|
|
346
|
+
*
|
|
347
|
+
* On a chain that wraps nothing, this instance is a hazard rather than a convenience: its
|
|
348
|
+
* `wrapped` getter throws, and the repo has ~900 unguarded `.wrapped` reads, so one leaking
|
|
349
|
+
* into the UI takes a page down somewhere far from where it was created. Those chains are
|
|
350
|
+
* meant to go through `resolveNativeCurrency`, which hands back the ERC-20 they declare.
|
|
351
|
+
*
|
|
352
|
+
* Constructing one anyway is therefore almost always a mistake, and this fails loudly at the
|
|
353
|
+
* point of construction — where it can be traced — rather than five frames deep in a getter
|
|
354
|
+
* on an unrelated screen. Only outside production: a wrong page beats a blank one, and the
|
|
355
|
+
* existing behaviour is what ships today.
|
|
356
|
+
*
|
|
357
|
+
* Gas and balance arithmetic genuinely needs the RPC native and its decimals. Those call
|
|
358
|
+
* sites use {@link getRpcNative}, which is greppable, so they read as a deliberate whitelist
|
|
359
|
+
* instead of disappearing into the same 81 anonymous `Native.onChain` calls.
|
|
360
|
+
*/
|
|
339
361
|
static onChain(chainId) {
|
|
362
|
+
if (process.env.NODE_ENV !== "production" && getChainConfig(chainId)?.gasTokenOverride) {
|
|
363
|
+
throw new Error(
|
|
364
|
+
`Native.onChain(${chainId}): this chain settles gas in an ERC-20 and wraps nothing, so a native currency here has no .wrapped and will throw wherever it is read. Use resolveNativeCurrency(chainId) for the product's base asset, or getRpcNative(chainId) if you really need raw gas/balance decimals.`
|
|
365
|
+
);
|
|
366
|
+
}
|
|
367
|
+
return _Native.rpcNative(chainId);
|
|
368
|
+
}
|
|
369
|
+
/** @internal shared by `onChain` and `getRpcNative` — the actual construction. */
|
|
370
|
+
static rpcNative(chainId) {
|
|
340
371
|
if (chainId in this.cache) {
|
|
341
372
|
return this.cache[chainId];
|
|
342
373
|
}
|
|
@@ -699,7 +730,32 @@ async function fetchScaledUIAmountMetadata(client, address, chainId) {
|
|
|
699
730
|
});
|
|
700
731
|
return parseScaledUIAmountReads(results, dialect);
|
|
701
732
|
}
|
|
733
|
+
var cache = /* @__PURE__ */ new Map();
|
|
734
|
+
function resolveNativeCurrency(chainId) {
|
|
735
|
+
const cached = cache.get(chainId);
|
|
736
|
+
if (cached)
|
|
737
|
+
return cached;
|
|
738
|
+
const gasToken = getChainConfig(chainId)?.gasTokenOverride;
|
|
739
|
+
const resolved = gasToken ? new ERC20Token(chainId, gasToken.address, gasToken.decimals, gasToken.symbol, gasToken.name) : Native.onChain(chainId);
|
|
740
|
+
cache.set(chainId, resolved);
|
|
741
|
+
return resolved;
|
|
742
|
+
}
|
|
743
|
+
function hasErc20GasToken(chainId) {
|
|
744
|
+
return Boolean(getChainConfig(chainId)?.gasTokenOverride);
|
|
745
|
+
}
|
|
746
|
+
function getRpcNative(chainId) {
|
|
747
|
+
return Native.rpcNative(chainId);
|
|
748
|
+
}
|
|
749
|
+
function tryGetRpcNative(chainId) {
|
|
750
|
+
if (!chainId)
|
|
751
|
+
return void 0;
|
|
752
|
+
try {
|
|
753
|
+
return Native.rpcNative(chainId);
|
|
754
|
+
} catch {
|
|
755
|
+
return void 0;
|
|
756
|
+
}
|
|
757
|
+
}
|
|
702
758
|
|
|
703
|
-
export { B20Variant, B20_ACTIVATION_REGISTRY_ADDRESS, B20_ADDRESS_PREFIX, B20_ERROR_SELECTORS, B20_FACTORY_ADDRESS, B20_PAUSABLE_FEATURES, B20_POLICY_REGISTRY_ADDRESS, B20_SUPPORTED_CHAIN_IDS, ERC20Token, Ether, IDENTITY_SCALED_UI_AMOUNT_METADATA, NATIVE, Native, ONE_HUNDRED_PERCENT, SCALED_UI_AMOUNT_BALANCES_INTERFACE_ID, SCALED_UI_AMOUNT_INTERFACE_ID, WBNB, WETH9, WNATIVE, ZERO_PERCENT, b20AssetAbi, buildScaledUIAmountReads, erc165Abi, erc20Abi, fetchScaledUIAmountMetadata, getB20Variant, isB20Address, isB20AssetAddress, isB20AssetToken, isB20SupportedChainId, matchB20RevertError, parseScaledUIAmountReads, probeIsScaledUIAmount, resolveScaledUIDialect, scaledUIAmountAbi, validateAndParseAddress };
|
|
759
|
+
export { B20Variant, B20_ACTIVATION_REGISTRY_ADDRESS, B20_ADDRESS_PREFIX, B20_ERROR_SELECTORS, B20_FACTORY_ADDRESS, B20_PAUSABLE_FEATURES, B20_POLICY_REGISTRY_ADDRESS, B20_SUPPORTED_CHAIN_IDS, ERC20Token, Ether, IDENTITY_SCALED_UI_AMOUNT_METADATA, NATIVE, Native, ONE_HUNDRED_PERCENT, SCALED_UI_AMOUNT_BALANCES_INTERFACE_ID, SCALED_UI_AMOUNT_INTERFACE_ID, WBNB, WETH9, WNATIVE, ZERO_PERCENT, b20AssetAbi, buildScaledUIAmountReads, erc165Abi, erc20Abi, fetchScaledUIAmountMetadata, getB20Variant, getRpcNative, getWrappedNative, hasErc20GasToken, isB20Address, isB20AssetAddress, isB20AssetToken, isB20SupportedChainId, matchB20RevertError, parseScaledUIAmountReads, probeIsScaledUIAmount, resolveNativeCurrency, resolveScaledUIDialect, scaledUIAmountAbi, tryGetRpcNative, validateAndParseAddress };
|
|
704
760
|
//# sourceMappingURL=out.js.map
|
|
705
761
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/entities/erc20Token.ts","../src/utils.ts","../src/entities/native.ts","../src/abis/ERC20.ts","../src/abis/ERC165.ts","../src/abis/ScaledUIAmount.ts","../src/abis/B20.ts","../src/ether.ts","../src/scaledUIAmount.ts","../src/b20.ts"],"names":["invariant","NativeCurrency","ChainId","B20Variant","SCALED_UI_DENOMINATOR"],"mappings":"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","sourcesContent":["import { ChainId, robinhoodChainConfig } from '@pancakeswap/chains'\nimport { Percent } from '@pancakeswap/swap-sdk-core'\n\nimport { ERC20Token } from './entities/erc20Token'\n\nexport const ZERO_PERCENT = new Percent('0')\nexport const ONE_HUNDRED_PERCENT = new Percent('1')\n\nexport const WETH9 = {\n [ChainId.ETHEREUM]: new ERC20Token(\n ChainId.ETHEREUM,\n '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.GOERLI]: new ERC20Token(\n ChainId.GOERLI,\n '0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.BSC]: new ERC20Token(\n ChainId.BSC,\n '0x2170Ed0880ac9A755fd29B2688956BD959F933F8',\n 18,\n 'ETH',\n 'Binance-Peg Ethereum Token',\n 'https://ethereum.org',\n ),\n [ChainId.BSC_TESTNET]: new ERC20Token(\n ChainId.BSC,\n '0xE7bCB9e341D546b66a46298f4893f5650a56e99E',\n 18,\n 'ETH',\n 'ETH',\n 'https://ethereum.org',\n ),\n [ChainId.ARBITRUM_ONE]: new ERC20Token(\n ChainId.ARBITRUM_ONE,\n '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.ARBITRUM_GOERLI]: new ERC20Token(\n ChainId.ARBITRUM_GOERLI,\n '0xEe01c0CD76354C383B8c7B4e65EA88D00B06f36f',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.ZKSYNC]: new ERC20Token(\n ChainId.ZKSYNC,\n '0x5AEa5775959fBC2557Cc8789bC1bf90A239D9a91',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.ZKSYNC_TESTNET]: new ERC20Token(\n ChainId.ZKSYNC_TESTNET,\n '0x02968DB286f24cB18bB5b24903eC8eBFAcf591C0',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.LINEA]: new ERC20Token(\n ChainId.LINEA,\n '0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.LINEA_TESTNET]: new ERC20Token(\n ChainId.LINEA_TESTNET,\n '0x2C1b868d6596a18e32E61B901E4060C872647b6C',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.OPBNB_TESTNET]: new ERC20Token(\n ChainId.OPBNB_TESTNET,\n '0x584f7b986d9942B0859a1E6921efA5342A673d04',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.OPBNB]: new ERC20Token(\n ChainId.OPBNB,\n '0xE7798f023fC62146e8Aa1b36Da45fb70855a77Ea',\n 18,\n 'ETH',\n 'Binance-Peg Ethereum Token',\n 'https://ethereum.org',\n ),\n [ChainId.BASE]: new ERC20Token(\n ChainId.BASE,\n '0x4200000000000000000000000000000000000006',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.BASE_TESTNET]: new ERC20Token(\n ChainId.BASE_TESTNET,\n '0x4200000000000000000000000000000000000006',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.SCROLL_SEPOLIA]: new ERC20Token(\n ChainId.SCROLL_SEPOLIA,\n '0x5300000000000000000000000000000000000004',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.SEPOLIA]: new ERC20Token(\n ChainId.SEPOLIA,\n '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.ARBITRUM_SEPOLIA]: new ERC20Token(\n ChainId.ARBITRUM_SEPOLIA,\n '0x1bdc540dEB9Ed1fA29964DeEcCc524A8f5e2198e',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.BASE_SEPOLIA]: new ERC20Token(\n ChainId.BASE_SEPOLIA,\n '0x4200000000000000000000000000000000000006',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.MONAD_MAINNET]: new ERC20Token(\n ChainId.MONAD_MAINNET,\n '0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A',\n 18,\n 'WMON',\n 'Wrapped Monad',\n 'https://www.monad.xyz/',\n ),\n [ChainId.MONAD_TESTNET]: new ERC20Token(\n ChainId.MONAD_TESTNET,\n '0x760AfE86e5de5fa0Ee542fc7B7B713e1c5425701',\n 18,\n 'WMON',\n 'Wrapped Monad',\n 'https://www.monad.xyz/',\n ),\n [ChainId.ROBINHOOD]: new ERC20Token(\n ChainId.ROBINHOOD,\n robinhoodChainConfig.tokens.wrappedNative,\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n}\n\nexport const WBNB = {\n [ChainId.ETHEREUM]: new ERC20Token(\n ChainId.ETHEREUM,\n '0x418D75f65a02b3D53B2418FB8E1fe493759c7605',\n 18,\n 'WBNB',\n 'Wrapped BNB',\n 'https://www.binance.org',\n ),\n [ChainId.BSC]: new ERC20Token(\n ChainId.BSC,\n '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c',\n 18,\n 'WBNB',\n 'Wrapped BNB',\n 'https://www.binance.org',\n ),\n [ChainId.BSC_TESTNET]: new ERC20Token(\n ChainId.BSC_TESTNET,\n '0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd',\n 18,\n 'WBNB',\n 'Wrapped BNB',\n 'https://www.binance.org',\n ),\n [ChainId.OPBNB_TESTNET]: new ERC20Token(\n ChainId.OPBNB_TESTNET,\n '0x4200000000000000000000000000000000000006',\n 18,\n 'WBNB',\n 'Wrapped BNB',\n 'https://www.binance.org',\n ),\n [ChainId.OPBNB]: new ERC20Token(\n ChainId.OPBNB,\n '0x4200000000000000000000000000000000000006',\n 18,\n 'WBNB',\n 'Wrapped BNB',\n 'https://www.binance.org',\n ),\n}\n\nexport const WNATIVE = {\n [ChainId.ETHEREUM]: WETH9[ChainId.ETHEREUM],\n [ChainId.GOERLI]: WETH9[ChainId.GOERLI],\n [ChainId.BSC]: WBNB[ChainId.BSC],\n [ChainId.BSC_TESTNET]: WBNB[ChainId.BSC_TESTNET],\n [ChainId.ARBITRUM_ONE]: WETH9[ChainId.ARBITRUM_ONE],\n [ChainId.ARBITRUM_GOERLI]: WETH9[ChainId.ARBITRUM_GOERLI],\n [ChainId.ZKSYNC]: WETH9[ChainId.ZKSYNC],\n [ChainId.ZKSYNC_TESTNET]: WETH9[ChainId.ZKSYNC_TESTNET],\n [ChainId.LINEA]: WETH9[ChainId.LINEA],\n [ChainId.LINEA_TESTNET]: WETH9[ChainId.LINEA_TESTNET],\n [ChainId.OPBNB_TESTNET]: WBNB[ChainId.OPBNB_TESTNET],\n [ChainId.OPBNB]: WBNB[ChainId.OPBNB],\n [ChainId.BASE]: WETH9[ChainId.BASE],\n [ChainId.BASE_TESTNET]: WETH9[ChainId.BASE_TESTNET],\n [ChainId.SCROLL_SEPOLIA]: WETH9[ChainId.SCROLL_SEPOLIA],\n [ChainId.SEPOLIA]: WETH9[ChainId.SEPOLIA],\n [ChainId.ARBITRUM_SEPOLIA]: WETH9[ChainId.ARBITRUM_SEPOLIA],\n [ChainId.BASE_SEPOLIA]: WETH9[ChainId.BASE_SEPOLIA],\n [ChainId.MONAD_MAINNET]: WETH9[ChainId.MONAD_MAINNET],\n [ChainId.MONAD_TESTNET]: WETH9[ChainId.MONAD_TESTNET],\n [ChainId.ROBINHOOD]: WETH9[ChainId.ROBINHOOD],\n} satisfies Partial<Record<ChainId, ERC20Token>>\n\nconst ETHER = { name: 'Ether', symbol: 'ETH', decimals: 18 } as const\n\nconst BNB = {\n name: 'Binance Chain',\n symbol: 'BNB',\n decimals: 18,\n} as const\n\nexport const NATIVE = {\n [ChainId.ETHEREUM]: ETHER,\n [ChainId.GOERLI]: { name: 'Goerli Ether', symbol: 'GOR', decimals: 18 },\n [ChainId.BSC]: BNB,\n [ChainId.BSC_TESTNET]: {\n name: 'Binance Chain',\n symbol: 'tBNB',\n decimals: 18,\n },\n [ChainId.ARBITRUM_ONE]: ETHER,\n [ChainId.ARBITRUM_GOERLI]: {\n name: 'Arbitrum Goerli Ether',\n symbol: 'AGOR',\n decimals: 18,\n },\n [ChainId.ZKSYNC]: ETHER,\n [ChainId.ZKSYNC_TESTNET]: ETHER,\n [ChainId.LINEA]: ETHER,\n [ChainId.LINEA_TESTNET]: ETHER,\n [ChainId.OPBNB]: BNB,\n [ChainId.OPBNB_TESTNET]: {\n name: 'Binance Chain',\n symbol: 'tBNB',\n decimals: 18,\n },\n [ChainId.BASE]: ETHER,\n [ChainId.BASE_TESTNET]: ETHER,\n [ChainId.SCROLL_SEPOLIA]: ETHER,\n [ChainId.SEPOLIA]: {\n name: 'Sepolia Ether',\n symbol: 'SEP',\n decimals: 18,\n },\n [ChainId.ARBITRUM_SEPOLIA]: {\n name: 'Arbitrum Sepolia Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n [ChainId.BASE_SEPOLIA]: {\n name: 'Sepolia Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n [ChainId.MONAD_MAINNET]: {\n name: 'Monad',\n symbol: 'MON',\n decimals: 18,\n },\n [ChainId.MONAD_TESTNET]: {\n name: 'Monad Testnet Ether',\n symbol: 'MON',\n decimals: 18,\n },\n [ChainId.ROBINHOOD]: ETHER,\n} satisfies Partial<\n Record<\n ChainId,\n {\n name: string\n symbol: string\n decimals: number\n }\n >\n>\n","import { Token } from '@pancakeswap/swap-sdk-core'\nimport { Address } from 'viem'\n\nimport { validateAndParseAddress } from '../utils'\n\n// /**\n// * Represents an ERC20 token with a unique address and some metadata.\n// */\nexport class ERC20Token extends Token {\n public constructor(\n chainId: number,\n address: Address,\n decimals: number,\n symbol: string,\n name?: string,\n projectLink?: string,\n ) {\n super(chainId, validateAndParseAddress(address), decimals, symbol, name, projectLink)\n }\n}\n","import { type Address, getAddress } from 'viem'\nimport invariant from 'tiny-invariant'\nimport warning from 'tiny-warning'\n\n// warns if addresses are not checksummed\n// eslint-disable-next-line consistent-return\nexport function validateAndParseAddress(address: string): Address {\n try {\n const checksummedAddress = getAddress(address)\n warning(address === checksummedAddress, `${address} is not checksummed.`)\n return checksummedAddress\n } catch (error) {\n invariant(false, `${address} is not a valid address.`)\n }\n}\n","import invariant from 'tiny-invariant'\nimport { Currency, Token, NativeCurrency } from '@pancakeswap/swap-sdk-core'\n\nimport { WNATIVE, NATIVE } from '../constants'\n\n/**\n *\n * Native is the main usage of a 'native' currency, i.e. for BSC mainnet and all testnets\n */\nexport class Native extends NativeCurrency {\n protected constructor({\n chainId,\n decimals,\n name,\n symbol,\n }: {\n chainId: number\n decimals: number\n symbol: string\n name: string\n }) {\n super(chainId, decimals, symbol, name)\n }\n\n public get wrapped(): Token {\n const wnative = WNATIVE[this.chainId as keyof typeof WNATIVE]\n invariant(!!wnative, 'WRAPPED')\n return wnative\n }\n\n private static cache: { [chainId: number]: Native } = {}\n\n public static onChain(chainId: number): Native {\n if (chainId in this.cache) {\n return this.cache[chainId]\n }\n invariant(!!NATIVE[chainId as keyof typeof NATIVE], 'NATIVE_CURRENCY')\n const { decimals, name, symbol } = NATIVE[chainId as keyof typeof WNATIVE]\n // eslint-disable-next-line no-return-assign\n return (this.cache[chainId] = new Native({ chainId, decimals, symbol, name }))\n }\n\n public equals(other: Currency): boolean {\n return other.isNative && other.chainId === this.chainId\n }\n}\n","export const erc20Abi = [\n {\n constant: true,\n inputs: [],\n name: 'decimals',\n outputs: [{ name: '', type: 'uint8' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [{ name: '', type: 'address' }],\n name: 'balanceOf',\n outputs: [{ name: '', type: 'uint256' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n] as const\n","/**\n * Minimal ERC-165 ABI fragment — just the `supportsInterface(bytes4)` view.\n * Used to probe whether a contract advertises support for a given interface ID.\n */\nexport const erc165Abi = [\n {\n type: 'function',\n name: 'supportsInterface',\n inputs: [{ name: 'interfaceId', type: 'bytes4' }],\n outputs: [{ type: 'bool' }],\n stateMutability: 'view',\n },\n] as const\n","/**\n * ERC-8056 (Scaled UI Amount) ABI fragments.\n *\n * Based on the `IScaledUIAmount` interface from the BNB Chain partner integration doc\n * v1.0 (8 Apr 2026). The spec itself is in Draft as of Oct 2025; these fragments are\n * pinned against the concrete implementation Binance is deploying for Stock Tokens.\n *\n * Spec: https://eips.ethereum.org/EIPS/eip-8056\n *\n * Notes:\n * - `newUIMultiplier` and `effectiveAt` are optional getters in the spec. Real\n * implementations may or may not expose them — reads must use `allowFailure: true`.\n * - `totalSupplyUI()` does NOT exist on Binance Stock Tokens per the partner doc FAQ;\n * compute as `toUIAmount(totalSupply())` instead.\n * - All on-chain helpers (`toUIAmount`, `fromUIAmount`, `balanceOfUI`) match the\n * contract's rounding exactly; prefer them over JS math when available.\n */\nexport const scaledUIAmountAbi = [\n // ─── Core required interface (ERC-165 ID: 0xa60bf13d) ───\n {\n type: 'function',\n name: 'uiMultiplier',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'toUIAmount',\n inputs: [{ name: 'rawAmount', type: 'uint256' }],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'fromUIAmount',\n inputs: [{ name: 'uiAmount', type: 'uint256' }],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n\n // ─── Balances extension (ERC-165 ID: 0xd890fd71) ───\n {\n type: 'function',\n name: 'balanceOfUI',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n\n // ─── Pending-change getters (optional in spec; common in implementations) ───\n {\n type: 'function',\n name: 'newUIMultiplier',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'effectiveAt',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n\n // ─── Events ───\n // Both timestamps required per BNB doc §4.1\n {\n type: 'event',\n name: 'UIMultiplierUpdated',\n inputs: [\n { name: 'oldMultiplier', type: 'uint256', indexed: false },\n { name: 'newMultiplier', type: 'uint256', indexed: false },\n { name: 'setAtTimestamp', type: 'uint256', indexed: false },\n { name: 'effectiveAtTimestamp', type: 'uint256', indexed: false },\n ],\n },\n // Optional event — emits raw + UI in one record (lets activity history show both\n // without re-deriving from the current multiplier)\n {\n type: 'event',\n name: 'TransferWithUIAmount',\n inputs: [\n { name: 'from', type: 'address', indexed: true },\n { name: 'to', type: 'address', indexed: true },\n { name: 'amount', type: 'uint256', indexed: false },\n { name: 'uiAmount', type: 'uint256', indexed: false },\n ],\n },\n] as const\n","/**\n * Base B20 Asset ABI fragments (Coinbase's `IB20Asset`).\n *\n * B20's ASSET variant has the same cosmetic display multiplier as ERC-8056, under different names.\n * Probed on Base mainnet 2026-07-28: `multiplier()` / `WAD_PRECISION()` / `toScaledBalance()` work;\n * `uiMultiplier()`, the pending getters and ALL of `supportsInterface()` revert. ERC-8056\n * conformance exists in base-std (PR #173) but is not deployed.\n *\n * https://docs.base.org/base-chain/specs/upgrades/beryl/b20\n */\nexport const b20AssetAbi = [\n {\n type: 'function',\n name: 'multiplier',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'WAD_PRECISION',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n\n // B20 does NOT claim the ERC-8056 Conversion extension id (0x57854fc3) — it keeps these native\n // names unaliased, so detect them by ABI, never by `supportsInterface`.\n {\n type: 'function',\n name: 'toScaledBalance',\n inputs: [{ name: 'rawBalance', type: 'uint256' }],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'toRawBalance',\n inputs: [{ name: 'scaledBalance', type: 'uint256' }],\n outputs: [{ name: 'rawBalance', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'scaledBalanceOf',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n\n // Post-#173 shapes, verbatim from base-std. The DEPLOYED precompile predates them and the\n // Coinbase doc calls its event `MultiplierUpdated` with an unverified arg list — probe the real\n // topic0 before indexing multiplier history.\n {\n type: 'event',\n name: 'UIMultiplierUpdated',\n inputs: [\n { name: 'oldMultiplier', type: 'uint256', indexed: false },\n { name: 'newMultiplier', type: 'uint256', indexed: false },\n { name: 'effectiveAtTimestamp', type: 'uint256', indexed: false },\n ],\n },\n {\n type: 'event',\n name: 'MultiplierUpdateCancelled',\n inputs: [\n { name: 'cancelledMultiplier', type: 'uint256', indexed: false },\n { name: 'cancelledEffectiveAt', type: 'uint256', indexed: false },\n ],\n },\n] as const\n","import invariant from 'tiny-invariant'\nimport { Currency, NativeCurrency, Token } from '@pancakeswap/swap-sdk-core'\nimport { ChainId } from '@pancakeswap/chains'\n\nimport { WETH9 } from './constants'\n\n/**\n * Ether is the main usage of a 'native' currency, i.e. for Ethereum mainnet and all testnets\n */\nexport class Ether extends NativeCurrency {\n protected constructor(chainId: number) {\n super(chainId, 18, 'ETH', 'Ether')\n }\n\n public get wrapped(): Token {\n const weth9 = WETH9[this.chainId as ChainId.ETHEREUM | ChainId.GOERLI]\n\n invariant(!!weth9, 'WRAPPED')\n\n return weth9\n }\n\n private static _etherCache: { [chainId: number]: Ether } = {}\n\n public static onChain(chainId: number): Ether {\n if (!this._etherCache[chainId]) {\n this._etherCache[chainId] = new Ether(chainId)\n }\n\n return this._etherCache[chainId]\n }\n\n public equals(other: Currency): boolean {\n return other.isNative && other.chainId === this.chainId\n }\n}\n","// EVM-side ScaledUI utilities — detection, read planning, and metadata parsing.\n// Pure functions, no React; the app layer wires react-query + caching on top.\n//\n// Two dialects expose the same display-multiplier concept: `erc8056` (`uiMultiplier()` + ERC-165)\n// and `b20` (Base's native standard: `multiplier()`, no ERC-165 — see ./b20). Both produce the same\n// ScaledUIAmountMetadata, and the math is identical (1e18 == B20's WAD_PRECISION()).\n//\n// `buildScaledUIAmountReads` + `parseScaledUIAmountReads` are the shared plan/parse pair used by\n// BOTH the fetcher below and the app's useScaledUIAmountMetadata hook, so the two can't drift.\n\nimport { SCALED_UI_DENOMINATOR } from '@pancakeswap/swap-sdk-core'\nimport type { Address, PublicClient } from 'viem'\nimport { b20AssetAbi } from './abis/B20'\nimport { erc165Abi } from './abis/ERC165'\nimport { scaledUIAmountAbi } from './abis/ScaledUIAmount'\nimport { isB20AssetToken } from './b20'\n\n/** ERC-8056 ERC-165 ids. B20 claims none of them — its `supportsInterface` reverts outright. */\nexport const SCALED_UI_AMOUNT_INTERFACE_ID = '0xa60bf13d' as const\nexport const SCALED_UI_AMOUNT_BALANCES_INTERFACE_ID = '0xd890fd71' as const\n\nexport type ScaledUIDialect = 'erc8056' | 'b20'\n\nexport type ScaledUIAmountReadFn = 'uiMultiplier' | 'multiplier' | 'newUIMultiplier' | 'effectiveAt'\n\ninterface ScaledUIDialectSpec {\n /** Ordered candidates for the active multiplier; first success wins. */\n multiplierFns: readonly ScaledUIAmountReadFn[]\n /** Optional in ERC-8056 and absent on B20 pre-#173, so reads use `allowFailure`. */\n pendingFns: readonly ScaledUIAmountReadFn[]\n}\n\nconst DIALECTS: Record<ScaledUIDialect, ScaledUIDialectSpec> = {\n erc8056: {\n // Deliberately no `multiplier()` fallback: it's a generic name that leverage/rebasing tokens\n // use for unrelated values, so reading it off an arbitrary token would corrupt displayed\n // amounts. Safe in the b20 dialect only because that's gated on a verified B20 address.\n multiplierFns: ['uiMultiplier'],\n pendingFns: ['newUIMultiplier', 'effectiveAt'],\n },\n b20: {\n // `multiplier()` first — the only getter that resolves today. `uiMultiplier()` is kept for\n // forward-compat: it starts working as an alias once base-std #173 reaches mainnet.\n multiplierFns: ['multiplier', 'uiMultiplier'],\n pendingFns: ['newUIMultiplier', 'effectiveAt'],\n },\n}\n\nconst ABI_BY_FN = {\n uiMultiplier: scaledUIAmountAbi,\n newUIMultiplier: scaledUIAmountAbi,\n effectiveAt: scaledUIAmountAbi,\n multiplier: b20AssetAbi,\n} as const satisfies Record<ScaledUIAmountReadFn, unknown>\n\n/** A conventional ERC-8056 token deployed on Base still gets the `erc8056` dialect. */\nexport function resolveScaledUIDialect(chainId?: number, address?: string | null): ScaledUIDialect {\n return isB20AssetToken(chainId, address) ? 'b20' : 'erc8056'\n}\n\nexport interface ScaledUIAmountRead {\n address: Address\n abi: (typeof ABI_BY_FN)[ScaledUIAmountReadFn]\n functionName: ScaledUIAmountReadFn\n chainId?: number\n}\n\n/** Shape shared by viem `multicall` and wagmi `useReadContracts` result entries. */\nexport interface ScaledUIAmountReadResult {\n status: 'success' | 'failure'\n result?: unknown\n}\n\n/** Positional — `parseScaledUIAmountReads` must be called with the same dialect. */\nexport function buildScaledUIAmountReads(params: {\n address: Address\n chainId?: number\n dialect: ScaledUIDialect\n}): ScaledUIAmountRead[] {\n const { address, chainId, dialect } = params\n const spec = DIALECTS[dialect]\n return [...spec.multiplierFns, ...spec.pendingFns].map((functionName) => ({\n address,\n abi: ABI_BY_FN[functionName],\n functionName,\n ...(chainId === undefined ? {} : { chainId }),\n }))\n}\n\nconst asBigInt = (entry: ScaledUIAmountReadResult | undefined): bigint | undefined =>\n entry?.status === 'success' && typeof entry.result === 'bigint' ? entry.result : undefined\n\n/**\n * Live ScaledUI metadata for a token. Consumers should treat `{ enabled: false, multiplier: 1e18 }`\n * as the identity case and early-out from any scaling logic.\n */\nexport type ScaledUIAmountMetadata = {\n enabled: boolean\n /** 18-decimal fixed point. Defaults to `1e18` (identity). */\n multiplier: bigint\n newMultiplier?: bigint\n /** Unix seconds. */\n effectiveAt?: number\n}\n\n/** Returned for non-scaled tokens and on any read failure; behaves like a normal ERC-20. */\nexport const IDENTITY_SCALED_UI_AMOUNT_METADATA: ScaledUIAmountMetadata = {\n enabled: false,\n multiplier: SCALED_UI_DENOMINATOR,\n}\n\nexport function parseScaledUIAmountReads(\n results: readonly ScaledUIAmountReadResult[],\n dialect: ScaledUIDialect,\n): ScaledUIAmountMetadata {\n const spec = DIALECTS[dialect]\n const multiplierCount = spec.multiplierFns.length\n\n let multiplier: bigint | undefined\n for (let i = 0; i < multiplierCount; i++) {\n const candidate = asBigInt(results[i])\n // Zero is invalid in both standards, but a buggy contract could return it — letting it through\n // would collapse displayed amounts to zero and divide-by-zero on parse.\n if (candidate !== undefined && candidate !== 0n) {\n multiplier = candidate\n break\n }\n }\n if (multiplier === undefined) return IDENTITY_SCALED_UI_AMOUNT_METADATA\n\n const pendingIndex = (fn: ScaledUIAmountReadFn) => {\n const offset = spec.pendingFns.indexOf(fn)\n return offset === -1 ? -1 : multiplierCount + offset\n }\n\n const newMultiplier = asBigInt(results[pendingIndex('newUIMultiplier')])\n const effectiveAtRaw = asBigInt(results[pendingIndex('effectiveAt')])\n const effectiveAt = effectiveAtRaw !== undefined ? Number(effectiveAtRaw) : undefined\n\n // B20 post-#173 MIRRORS `uiMultiplier()` when nothing is scheduled, so the `!==` is load-bearing.\n const hasPending =\n newMultiplier !== undefined && effectiveAt !== undefined && newMultiplier !== multiplier && effectiveAt > 0\n\n return hasPending ? { enabled: true, multiplier, newMultiplier, effectiveAt } : { enabled: true, multiplier }\n}\n\n/**\n * A perf gate, not a correctness gate — `fetchScaledUIAmountMetadata` falls back to identity anyway\n * if the reads revert. Callers cache both outcomes (asymmetric TTL in IndexedDB).\n */\nexport async function probeIsScaledUIAmount(\n client: PublicClient,\n address: Address,\n chainId?: number,\n): Promise<boolean> {\n // B20 reverts on `supportsInterface` for every id, so ERC-165 can never detect it.\n if (isB20AssetToken(chainId ?? client.chain?.id, address)) return true\n\n try {\n const result = await client.readContract({\n address,\n abi: erc165Abi,\n functionName: 'supportsInterface',\n args: [SCALED_UI_AMOUNT_INTERFACE_ID],\n })\n return Boolean(result)\n } catch {\n return false\n }\n}\n\n/** Safe against any contract — won't throw. */\nexport async function fetchScaledUIAmountMetadata(\n client: PublicClient,\n address: Address,\n chainId?: number,\n): Promise<ScaledUIAmountMetadata> {\n const dialect = resolveScaledUIDialect(chainId ?? client.chain?.id, address)\n const results = await client.multicall({\n contracts: buildScaledUIAmountReads({ address, dialect }),\n allowFailure: true,\n })\n return parseScaledUIAmountReads(results as readonly ScaledUIAmountReadResult[], dialect)\n}\n\nexport {\n SCALED_UI_DENOMINATOR,\n SCALED_UI_MULTIPLIER_DECIMALS,\n fromScaledUIAmount,\n isIdentityScaledUIMultiplier,\n toScaledUIAmount,\n} from '@pancakeswap/swap-sdk-core'\n","/**\n * Base B20 — extension module for the scaled-UI subsystem.\n *\n * Owns everything B20-specific: address recognition, precompile addresses, revert decoding.\n * Nothing outside this file and its ABI sibling needs to know B20 exists.\n *\n * Detection is by address prefix, not ERC-165: `supportsInterface` REVERTS on live B20 tokens for\n * every id including ERC-165's own, so the probe could only ever answer \"no\". Addresses are\n * self-describing instead — `[10-byte prefix][1-byte variant][9-byte keccak(deployer, salt)]` —\n * so the variant is recoverable with zero RPC.\n *\n * https://docs.base.org/base-chain/specs/upgrades/beryl/b20\n */\nimport { ChainId } from '@pancakeswap/chains'\nimport type { Address } from 'viem'\n\n/** Detection is gated on these so a `0xb2000…` vanity address elsewhere can't be mistaken for B20. */\nexport const B20_SUPPORTED_CHAIN_IDS = [ChainId.BASE, ChainId.BASE_SEPOLIA] as const\n\nexport type B20SupportedChainId = (typeof B20_SUPPORTED_CHAIN_IDS)[number]\n\n/** The 10-byte prefix shared by every B20 token, lowercase, without `0x`. */\nexport const B20_ADDRESS_PREFIX = 'b2000000000000000000' as const\n\n/** Encoded in address byte `[10]`. */\nexport enum B20Variant {\n ASSET = 0,\n STABLECOIN = 1,\n}\n\nexport const B20_FACTORY_ADDRESS = '0xB20f000000000000000000000000000000000000' as const\nexport const B20_ACTIVATION_REGISTRY_ADDRESS = '0x8453000000000000000000000000000000000001' as const\nexport const B20_POLICY_REGISTRY_ADDRESS = '0x8453000000000000000000000000000000000002' as const\n\nconst HEX_ADDRESS_LENGTH = 40\nconst VARIANT_NIBBLE_START = B20_ADDRESS_PREFIX.length\nconst VARIANT_NIBBLE_END = VARIANT_NIBBLE_START + 2\n\nconst stripHexPrefix = (address: string): string =>\n (address.startsWith('0x') || address.startsWith('0X') ? address.slice(2) : address).toLowerCase()\n\nexport function isB20SupportedChainId(chainId?: number): chainId is B20SupportedChainId {\n return B20_SUPPORTED_CHAIN_IDS.includes(chainId as B20SupportedChainId)\n}\n\n/** Chain-agnostic. Verified equivalent to the factory's own `isB20()` over 24 cases. */\nexport function isB20Address(address?: string | null): boolean {\n if (!address) return false\n const hex = stripHexPrefix(address)\n return hex.length === HEX_ADDRESS_LENGTH && hex.startsWith(B20_ADDRESS_PREFIX)\n}\n\nexport function getB20Variant(address?: string | null): B20Variant | undefined {\n if (!isB20Address(address)) return undefined\n switch (stripHexPrefix(address!).slice(VARIANT_NIBBLE_START, VARIANT_NIBBLE_END)) {\n case '00':\n return B20Variant.ASSET\n case '01':\n return B20Variant.STABLECOIN\n default:\n // A future variant we don't model. Treat as not-B20 rather than guess at its behaviour.\n return undefined\n }\n}\n\n/** Only the ASSET variant carries a multiplier, so a B20 stablecoin must not be treated as scaled. */\nexport function isB20AssetToken(chainId?: number, address?: string | null): boolean {\n return isB20SupportedChainId(chainId) && getB20Variant(address) === B20Variant.ASSET\n}\n\nexport const isB20AssetAddress = (chainId: number | undefined, address: Address | undefined): boolean =>\n isB20AssetToken(chainId, address)\n\n/* //////////////////////////////////////////////////////////////\n REVERT DECODING\n////////////////////////////////////////////////////////////// */\n\n/**\n * B20 raises ABI-encoded custom errors, and a swap reverts through the router — whose ABI doesn't\n * declare them — so viem can't name them and only the bare 4-byte selector survives. Matching it is\n * the only reliable hook. `PausableFeature` is an enum, hence `uint8`. Verified against `IB20.sol`.\n */\nexport const B20_ERROR_SELECTORS = {\n '0xa43fec12': 'PolicyForbids', // (bytes32 policyScope, uint64 policyId)\n '0xfd8c4245': 'ContractPaused', // (PausableFeature feature)\n '0xcccad523': 'PolicyNotFound', // (uint64 policyId)\n '0xcdd98a4a': 'UnsupportedPolicyType', // (bytes32 policyScope)\n '0xf58f733a': 'SupplyCapExceeded', // ()\n '0x6f12f3dc': 'InvalidMultiplier', // ()\n} as const\n\nexport type B20ErrorName = (typeof B20_ERROR_SELECTORS)[keyof typeof B20_ERROR_SELECTORS]\n\nexport const B20_PAUSABLE_FEATURES = ['TRANSFER', 'MINT', 'BURN'] as const\nexport type B20PausableFeature = (typeof B20_PAUSABLE_FEATURES)[number]\n\nexport type B20RevertMatch = {\n name: B20ErrorName\n /** Only for `ContractPaused`, when the revert data carried a decodable feature. */\n feature?: B20PausableFeature\n}\n\nconst SELECTOR_PATTERN = /0x[0-9a-fA-F]{8}/g\n\n/**\n * Scan an error payload for a known B20 custom error. Takes a flattened string so it stays\n * dependency-free; returns `undefined` so callers keep their generic handling.\n */\nexport function matchB20RevertError(input?: string | null): B20RevertMatch | undefined {\n if (!input) return undefined\n const matches = input.match(SELECTOR_PATTERN)\n if (!matches) return undefined\n\n for (const candidate of matches) {\n const name = B20_ERROR_SELECTORS[candidate.toLowerCase() as keyof typeof B20_ERROR_SELECTORS]\n if (!name) continue\n if (name !== 'ContractPaused') return { name }\n\n // The feature is the single 32-byte word after the selector, present only if we got full data.\n const dataMatch = input.match(new RegExp(`${candidate}([0-9a-fA-F]{64})`, 'i'))\n const featureIndex = dataMatch ? Number.parseInt(dataMatch[1], 16) : Number.NaN\n const feature = B20_PAUSABLE_FEATURES[featureIndex]\n return feature ? { name, feature } : { name }\n }\n\n return undefined\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/entities/erc20Token.ts","../src/utils.ts","../src/entities/native.ts","../src/abis/ERC20.ts","../src/abis/ERC165.ts","../src/abis/ScaledUIAmount.ts","../src/abis/B20.ts","../src/ether.ts","../src/scaledUIAmount.ts","../src/b20.ts","../src/resolveNativeCurrency.ts"],"names":["invariant","NativeCurrency","ChainId","B20Variant","SCALED_UI_DENOMINATOR","getChainConfig"],"mappings":"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","sourcesContent":["import { ChainId } from '@pancakeswap/chains'\nimport { Percent } from '@pancakeswap/swap-sdk-core'\n\nimport { ERC20Token } from './entities/erc20Token'\n\nexport const ZERO_PERCENT = new Percent('0')\nexport const ONE_HUNDRED_PERCENT = new Percent('1')\n\nexport const WETH9 = {\n [ChainId.ETHEREUM]: new ERC20Token(\n ChainId.ETHEREUM,\n '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.GOERLI]: new ERC20Token(\n ChainId.GOERLI,\n '0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.BSC]: new ERC20Token(\n ChainId.BSC,\n '0x2170Ed0880ac9A755fd29B2688956BD959F933F8',\n 18,\n 'ETH',\n 'Binance-Peg Ethereum Token',\n 'https://ethereum.org',\n ),\n [ChainId.BSC_TESTNET]: new ERC20Token(\n ChainId.BSC,\n '0xE7bCB9e341D546b66a46298f4893f5650a56e99E',\n 18,\n 'ETH',\n 'ETH',\n 'https://ethereum.org',\n ),\n [ChainId.ARBITRUM_ONE]: new ERC20Token(\n ChainId.ARBITRUM_ONE,\n '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.ARBITRUM_GOERLI]: new ERC20Token(\n ChainId.ARBITRUM_GOERLI,\n '0xEe01c0CD76354C383B8c7B4e65EA88D00B06f36f',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.ZKSYNC]: new ERC20Token(\n ChainId.ZKSYNC,\n '0x5AEa5775959fBC2557Cc8789bC1bf90A239D9a91',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.ZKSYNC_TESTNET]: new ERC20Token(\n ChainId.ZKSYNC_TESTNET,\n '0x02968DB286f24cB18bB5b24903eC8eBFAcf591C0',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.LINEA]: new ERC20Token(\n ChainId.LINEA,\n '0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.LINEA_TESTNET]: new ERC20Token(\n ChainId.LINEA_TESTNET,\n '0x2C1b868d6596a18e32E61B901E4060C872647b6C',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.OPBNB_TESTNET]: new ERC20Token(\n ChainId.OPBNB_TESTNET,\n '0x584f7b986d9942B0859a1E6921efA5342A673d04',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.OPBNB]: new ERC20Token(\n ChainId.OPBNB,\n '0xE7798f023fC62146e8Aa1b36Da45fb70855a77Ea',\n 18,\n 'ETH',\n 'Binance-Peg Ethereum Token',\n 'https://ethereum.org',\n ),\n [ChainId.BASE]: new ERC20Token(\n ChainId.BASE,\n '0x4200000000000000000000000000000000000006',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.BASE_TESTNET]: new ERC20Token(\n ChainId.BASE_TESTNET,\n '0x4200000000000000000000000000000000000006',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.SCROLL_SEPOLIA]: new ERC20Token(\n ChainId.SCROLL_SEPOLIA,\n '0x5300000000000000000000000000000000000004',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.SEPOLIA]: new ERC20Token(\n ChainId.SEPOLIA,\n '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.ARBITRUM_SEPOLIA]: new ERC20Token(\n ChainId.ARBITRUM_SEPOLIA,\n '0x1bdc540dEB9Ed1fA29964DeEcCc524A8f5e2198e',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.BASE_SEPOLIA]: new ERC20Token(\n ChainId.BASE_SEPOLIA,\n '0x4200000000000000000000000000000000000006',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n [ChainId.MONAD_MAINNET]: new ERC20Token(\n ChainId.MONAD_MAINNET,\n '0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A',\n 18,\n 'WMON',\n 'Wrapped Monad',\n 'https://www.monad.xyz/',\n ),\n [ChainId.MONAD_TESTNET]: new ERC20Token(\n ChainId.MONAD_TESTNET,\n '0x760AfE86e5de5fa0Ee542fc7B7B713e1c5425701',\n 18,\n 'WMON',\n 'Wrapped Monad',\n 'https://www.monad.xyz/',\n ),\n [ChainId.ROBINHOOD]: new ERC20Token(\n ChainId.ROBINHOOD,\n '0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73',\n 18,\n 'WETH',\n 'Wrapped Ether',\n 'https://weth.io',\n ),\n}\n\nexport const WBNB = {\n [ChainId.ETHEREUM]: new ERC20Token(\n ChainId.ETHEREUM,\n '0x418D75f65a02b3D53B2418FB8E1fe493759c7605',\n 18,\n 'WBNB',\n 'Wrapped BNB',\n 'https://www.binance.org',\n ),\n [ChainId.BSC]: new ERC20Token(\n ChainId.BSC,\n '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c',\n 18,\n 'WBNB',\n 'Wrapped BNB',\n 'https://www.binance.org',\n ),\n [ChainId.BSC_TESTNET]: new ERC20Token(\n ChainId.BSC_TESTNET,\n '0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd',\n 18,\n 'WBNB',\n 'Wrapped BNB',\n 'https://www.binance.org',\n ),\n [ChainId.OPBNB_TESTNET]: new ERC20Token(\n ChainId.OPBNB_TESTNET,\n '0x4200000000000000000000000000000000000006',\n 18,\n 'WBNB',\n 'Wrapped BNB',\n 'https://www.binance.org',\n ),\n [ChainId.OPBNB]: new ERC20Token(\n ChainId.OPBNB,\n '0x4200000000000000000000000000000000000006',\n 18,\n 'WBNB',\n 'Wrapped BNB',\n 'https://www.binance.org',\n ),\n}\n\nexport const WNATIVE: Partial<Record<ChainId, ERC20Token>> = {\n [ChainId.ETHEREUM]: WETH9[ChainId.ETHEREUM],\n [ChainId.GOERLI]: WETH9[ChainId.GOERLI],\n [ChainId.BSC]: WBNB[ChainId.BSC],\n [ChainId.BSC_TESTNET]: WBNB[ChainId.BSC_TESTNET],\n [ChainId.ARBITRUM_ONE]: WETH9[ChainId.ARBITRUM_ONE],\n [ChainId.ARBITRUM_GOERLI]: WETH9[ChainId.ARBITRUM_GOERLI],\n [ChainId.ZKSYNC]: WETH9[ChainId.ZKSYNC],\n [ChainId.ZKSYNC_TESTNET]: WETH9[ChainId.ZKSYNC_TESTNET],\n [ChainId.LINEA]: WETH9[ChainId.LINEA],\n [ChainId.LINEA_TESTNET]: WETH9[ChainId.LINEA_TESTNET],\n [ChainId.OPBNB_TESTNET]: WBNB[ChainId.OPBNB_TESTNET],\n [ChainId.OPBNB]: WBNB[ChainId.OPBNB],\n [ChainId.BASE]: WETH9[ChainId.BASE],\n [ChainId.BASE_TESTNET]: WETH9[ChainId.BASE_TESTNET],\n [ChainId.SCROLL_SEPOLIA]: WETH9[ChainId.SCROLL_SEPOLIA],\n [ChainId.SEPOLIA]: WETH9[ChainId.SEPOLIA],\n [ChainId.ARBITRUM_SEPOLIA]: WETH9[ChainId.ARBITRUM_SEPOLIA],\n [ChainId.BASE_SEPOLIA]: WETH9[ChainId.BASE_SEPOLIA],\n [ChainId.MONAD_MAINNET]: WETH9[ChainId.MONAD_MAINNET],\n [ChainId.MONAD_TESTNET]: WETH9[ChainId.MONAD_TESTNET],\n [ChainId.ROBINHOOD]: WETH9[ChainId.ROBINHOOD],\n}\n\n/**\n * The ERC-20 a chain's native currency wraps into.\n *\n * Not every EVM chain has one: on Arc the native USDC already satisfies IERC20, so\n * nothing wraps it and the chain is absent here. Read it through\n * {@link getWrappedNative} rather than indexing directly, so the missing case has to\n * be handled instead of blowing up at the first property access.\n */\nexport const getWrappedNative = (chainId: ChainId): ERC20Token | undefined => WNATIVE[chainId]\n\nconst ETHER = { name: 'Ether', symbol: 'ETH', decimals: 18 } as const\n\nconst BNB = {\n name: 'BNB Chain Native Token',\n symbol: 'BNB',\n decimals: 18,\n} as const\n\nexport const NATIVE = {\n [ChainId.ETHEREUM]: ETHER,\n [ChainId.GOERLI]: { name: 'Goerli Ether', symbol: 'GOR', decimals: 18 },\n [ChainId.BSC]: BNB,\n [ChainId.BSC_TESTNET]: {\n name: 'BNB Chain Native Token',\n symbol: 'tBNB',\n decimals: 18,\n },\n [ChainId.ARBITRUM_ONE]: ETHER,\n [ChainId.ARBITRUM_GOERLI]: {\n name: 'Arbitrum Goerli Ether',\n symbol: 'AGOR',\n decimals: 18,\n },\n [ChainId.ZKSYNC]: ETHER,\n [ChainId.ZKSYNC_TESTNET]: ETHER,\n [ChainId.LINEA]: ETHER,\n [ChainId.LINEA_TESTNET]: ETHER,\n [ChainId.OPBNB]: BNB,\n [ChainId.OPBNB_TESTNET]: {\n name: 'BNB Chain Native Token',\n symbol: 'tBNB',\n decimals: 18,\n },\n [ChainId.BASE]: ETHER,\n [ChainId.BASE_TESTNET]: ETHER,\n [ChainId.SCROLL_SEPOLIA]: ETHER,\n [ChainId.SEPOLIA]: {\n name: 'Sepolia Ether',\n symbol: 'SEP',\n decimals: 18,\n },\n [ChainId.ARBITRUM_SEPOLIA]: {\n name: 'Arbitrum Sepolia Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n [ChainId.BASE_SEPOLIA]: {\n name: 'Sepolia Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n [ChainId.MONAD_MAINNET]: {\n name: 'Monad',\n symbol: 'MON',\n decimals: 18,\n },\n [ChainId.MONAD_TESTNET]: {\n name: 'Monad Testnet Ether',\n symbol: 'MON',\n decimals: 18,\n },\n [ChainId.ROBINHOOD]: ETHER,\n // Arc settles gas in USDC. The RPC reports it with 18 decimals; the 6-decimal\n // ERC-20 view of the same balance lives in the chain config's gasTokenOverride.\n // There is deliberately no WNATIVE entry — nothing wraps native USDC.\n [ChainId.ARC]: { name: 'USD Coin', symbol: 'USDC', decimals: 18 },\n} satisfies Partial<\n Record<\n ChainId,\n {\n name: string\n symbol: string\n decimals: number\n }\n >\n>\n","import { Token } from '@pancakeswap/swap-sdk-core'\nimport { Address } from 'viem'\n\nimport { validateAndParseAddress } from '../utils'\n\n// /**\n// * Represents an ERC20 token with a unique address and some metadata.\n// */\nexport class ERC20Token extends Token {\n public constructor(\n chainId: number,\n address: Address,\n decimals: number,\n symbol: string,\n name?: string,\n projectLink?: string,\n ) {\n super(chainId, validateAndParseAddress(address), decimals, symbol, name, projectLink)\n }\n}\n","import { type Address, getAddress } from 'viem'\nimport invariant from 'tiny-invariant'\nimport warning from 'tiny-warning'\n\n// warns if addresses are not checksummed\n// eslint-disable-next-line consistent-return\nexport function validateAndParseAddress(address: string): Address {\n try {\n const checksummedAddress = getAddress(address)\n warning(address === checksummedAddress, `${address} is not checksummed.`)\n return checksummedAddress\n } catch (error) {\n invariant(false, `${address} is not a valid address.`)\n }\n}\n","import { ChainId, getChainConfig } from '@pancakeswap/chains'\nimport invariant from 'tiny-invariant'\nimport { Currency, Token, NativeCurrency } from '@pancakeswap/swap-sdk-core'\n\nimport { WNATIVE, NATIVE } from '../constants'\n\n/**\n *\n * Native is the main usage of a 'native' currency, i.e. for BSC mainnet and all testnets\n */\nexport class Native extends NativeCurrency {\n protected constructor({\n chainId,\n decimals,\n name,\n symbol,\n }: {\n chainId: number\n decimals: number\n symbol: string\n name: string\n }) {\n super(chainId, decimals, symbol, name)\n }\n\n public get wrapped(): Token {\n const wnative = WNATIVE[this.chainId as keyof typeof WNATIVE]\n invariant(!!wnative, 'WRAPPED')\n return wnative\n }\n\n private static cache: { [chainId: number]: Native } = {}\n\n /**\n * The chain's RPC-native currency.\n *\n * On a chain that wraps nothing, this instance is a hazard rather than a convenience: its\n * `wrapped` getter throws, and the repo has ~900 unguarded `.wrapped` reads, so one leaking\n * into the UI takes a page down somewhere far from where it was created. Those chains are\n * meant to go through `resolveNativeCurrency`, which hands back the ERC-20 they declare.\n *\n * Constructing one anyway is therefore almost always a mistake, and this fails loudly at the\n * point of construction — where it can be traced — rather than five frames deep in a getter\n * on an unrelated screen. Only outside production: a wrong page beats a blank one, and the\n * existing behaviour is what ships today.\n *\n * Gas and balance arithmetic genuinely needs the RPC native and its decimals. Those call\n * sites use {@link getRpcNative}, which is greppable, so they read as a deliberate whitelist\n * instead of disappearing into the same 81 anonymous `Native.onChain` calls.\n */\n public static onChain(chainId: number): Native {\n if (process.env.NODE_ENV !== 'production' && getChainConfig(chainId as ChainId)?.gasTokenOverride) {\n throw new Error(\n `Native.onChain(${chainId}): this chain settles gas in an ERC-20 and wraps nothing, so a native ` +\n `currency here has no .wrapped and will throw wherever it is read. Use resolveNativeCurrency(chainId) ` +\n `for the product's base asset, or getRpcNative(chainId) if you really need raw gas/balance decimals.`,\n )\n }\n return Native.rpcNative(chainId)\n }\n\n /** @internal shared by `onChain` and `getRpcNative` — the actual construction. */\n public static rpcNative(chainId: number): Native {\n if (chainId in this.cache) {\n return this.cache[chainId]\n }\n invariant(!!NATIVE[chainId as keyof typeof NATIVE], 'NATIVE_CURRENCY')\n const { decimals, name, symbol } = NATIVE[chainId as keyof typeof WNATIVE]\n // eslint-disable-next-line no-return-assign\n return (this.cache[chainId] = new Native({ chainId, decimals, symbol, name }))\n }\n\n public equals(other: Currency): boolean {\n return other.isNative && other.chainId === this.chainId\n }\n}\n","export const erc20Abi = [\n {\n constant: true,\n inputs: [],\n name: 'decimals',\n outputs: [{ name: '', type: 'uint8' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [{ name: '', type: 'address' }],\n name: 'balanceOf',\n outputs: [{ name: '', type: 'uint256' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n] as const\n","/**\n * Minimal ERC-165 ABI fragment — just the `supportsInterface(bytes4)` view.\n * Used to probe whether a contract advertises support for a given interface ID.\n */\nexport const erc165Abi = [\n {\n type: 'function',\n name: 'supportsInterface',\n inputs: [{ name: 'interfaceId', type: 'bytes4' }],\n outputs: [{ type: 'bool' }],\n stateMutability: 'view',\n },\n] as const\n","/**\n * ERC-8056 (Scaled UI Amount) ABI fragments.\n *\n * Based on the `IScaledUIAmount` interface from the BNB Chain partner integration doc\n * v1.0 (8 Apr 2026). The spec itself is in Draft as of Oct 2025; these fragments are\n * pinned against the concrete implementation Binance is deploying for Stock Tokens.\n *\n * Spec: https://eips.ethereum.org/EIPS/eip-8056\n *\n * Notes:\n * - `newUIMultiplier` and `effectiveAt` are optional getters in the spec. Real\n * implementations may or may not expose them — reads must use `allowFailure: true`.\n * - `totalSupplyUI()` does NOT exist on Binance Stock Tokens per the partner doc FAQ;\n * compute as `toUIAmount(totalSupply())` instead.\n * - All on-chain helpers (`toUIAmount`, `fromUIAmount`, `balanceOfUI`) match the\n * contract's rounding exactly; prefer them over JS math when available.\n */\nexport const scaledUIAmountAbi = [\n // ─── Core required interface (ERC-165 ID: 0xa60bf13d) ───\n {\n type: 'function',\n name: 'uiMultiplier',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'toUIAmount',\n inputs: [{ name: 'rawAmount', type: 'uint256' }],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'fromUIAmount',\n inputs: [{ name: 'uiAmount', type: 'uint256' }],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n\n // ─── Balances extension (ERC-165 ID: 0xd890fd71) ───\n {\n type: 'function',\n name: 'balanceOfUI',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n\n // ─── Pending-change getters (optional in spec; common in implementations) ───\n {\n type: 'function',\n name: 'newUIMultiplier',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'effectiveAt',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n\n // ─── Events ───\n // Both timestamps required per BNB doc §4.1\n {\n type: 'event',\n name: 'UIMultiplierUpdated',\n inputs: [\n { name: 'oldMultiplier', type: 'uint256', indexed: false },\n { name: 'newMultiplier', type: 'uint256', indexed: false },\n { name: 'setAtTimestamp', type: 'uint256', indexed: false },\n { name: 'effectiveAtTimestamp', type: 'uint256', indexed: false },\n ],\n },\n // Optional event — emits raw + UI in one record (lets activity history show both\n // without re-deriving from the current multiplier)\n {\n type: 'event',\n name: 'TransferWithUIAmount',\n inputs: [\n { name: 'from', type: 'address', indexed: true },\n { name: 'to', type: 'address', indexed: true },\n { name: 'amount', type: 'uint256', indexed: false },\n { name: 'uiAmount', type: 'uint256', indexed: false },\n ],\n },\n] as const\n","/**\n * Base B20 Asset ABI fragments (Coinbase's `IB20Asset`).\n *\n * B20's ASSET variant has the same cosmetic display multiplier as ERC-8056, under different names.\n * Probed on Base mainnet 2026-07-28: `multiplier()` / `WAD_PRECISION()` / `toScaledBalance()` work;\n * `uiMultiplier()`, the pending getters and ALL of `supportsInterface()` revert. ERC-8056\n * conformance exists in base-std (PR #173) but is not deployed.\n *\n * https://docs.base.org/base-chain/specs/upgrades/beryl/b20\n */\nexport const b20AssetAbi = [\n {\n type: 'function',\n name: 'multiplier',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'WAD_PRECISION',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n\n // B20 does NOT claim the ERC-8056 Conversion extension id (0x57854fc3) — it keeps these native\n // names unaliased, so detect them by ABI, never by `supportsInterface`.\n {\n type: 'function',\n name: 'toScaledBalance',\n inputs: [{ name: 'rawBalance', type: 'uint256' }],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'toRawBalance',\n inputs: [{ name: 'scaledBalance', type: 'uint256' }],\n outputs: [{ name: 'rawBalance', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'scaledBalanceOf',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n\n // Post-#173 shapes, verbatim from base-std. The DEPLOYED precompile predates them and the\n // Coinbase doc calls its event `MultiplierUpdated` with an unverified arg list — probe the real\n // topic0 before indexing multiplier history.\n {\n type: 'event',\n name: 'UIMultiplierUpdated',\n inputs: [\n { name: 'oldMultiplier', type: 'uint256', indexed: false },\n { name: 'newMultiplier', type: 'uint256', indexed: false },\n { name: 'effectiveAtTimestamp', type: 'uint256', indexed: false },\n ],\n },\n {\n type: 'event',\n name: 'MultiplierUpdateCancelled',\n inputs: [\n { name: 'cancelledMultiplier', type: 'uint256', indexed: false },\n { name: 'cancelledEffectiveAt', type: 'uint256', indexed: false },\n ],\n },\n] as const\n","import invariant from 'tiny-invariant'\nimport { Currency, NativeCurrency, Token } from '@pancakeswap/swap-sdk-core'\nimport { ChainId } from '@pancakeswap/chains'\n\nimport { WETH9 } from './constants'\n\n/**\n * Ether is the main usage of a 'native' currency, i.e. for Ethereum mainnet and all testnets\n */\nexport class Ether extends NativeCurrency {\n protected constructor(chainId: number) {\n super(chainId, 18, 'ETH', 'Ether')\n }\n\n public get wrapped(): Token {\n const weth9 = WETH9[this.chainId as ChainId.ETHEREUM | ChainId.GOERLI]\n\n invariant(!!weth9, 'WRAPPED')\n\n return weth9\n }\n\n private static _etherCache: { [chainId: number]: Ether } = {}\n\n public static onChain(chainId: number): Ether {\n if (!this._etherCache[chainId]) {\n this._etherCache[chainId] = new Ether(chainId)\n }\n\n return this._etherCache[chainId]\n }\n\n public equals(other: Currency): boolean {\n return other.isNative && other.chainId === this.chainId\n }\n}\n","// EVM-side ScaledUI utilities — detection, read planning, and metadata parsing.\n// Pure functions, no React; the app layer wires react-query + caching on top.\n//\n// Two dialects expose the same display-multiplier concept: `erc8056` (`uiMultiplier()` + ERC-165)\n// and `b20` (Base's native standard: `multiplier()`, no ERC-165 — see ./b20). Both produce the same\n// ScaledUIAmountMetadata, and the math is identical (1e18 == B20's WAD_PRECISION()).\n//\n// `buildScaledUIAmountReads` + `parseScaledUIAmountReads` are the shared plan/parse pair used by\n// BOTH the fetcher below and the app's useScaledUIAmountMetadata hook, so the two can't drift.\n\nimport { SCALED_UI_DENOMINATOR } from '@pancakeswap/swap-sdk-core'\nimport type { Address, PublicClient } from 'viem'\nimport { b20AssetAbi } from './abis/B20'\nimport { erc165Abi } from './abis/ERC165'\nimport { scaledUIAmountAbi } from './abis/ScaledUIAmount'\nimport { isB20AssetToken } from './b20'\n\n/** ERC-8056 ERC-165 ids. B20 claims none of them — its `supportsInterface` reverts outright. */\nexport const SCALED_UI_AMOUNT_INTERFACE_ID = '0xa60bf13d' as const\nexport const SCALED_UI_AMOUNT_BALANCES_INTERFACE_ID = '0xd890fd71' as const\n\nexport type ScaledUIDialect = 'erc8056' | 'b20'\n\nexport type ScaledUIAmountReadFn = 'uiMultiplier' | 'multiplier' | 'newUIMultiplier' | 'effectiveAt'\n\ninterface ScaledUIDialectSpec {\n /** Ordered candidates for the active multiplier; first success wins. */\n multiplierFns: readonly ScaledUIAmountReadFn[]\n /** Optional in ERC-8056 and absent on B20 pre-#173, so reads use `allowFailure`. */\n pendingFns: readonly ScaledUIAmountReadFn[]\n}\n\nconst DIALECTS: Record<ScaledUIDialect, ScaledUIDialectSpec> = {\n erc8056: {\n // Deliberately no `multiplier()` fallback: it's a generic name that leverage/rebasing tokens\n // use for unrelated values, so reading it off an arbitrary token would corrupt displayed\n // amounts. Safe in the b20 dialect only because that's gated on a verified B20 address.\n multiplierFns: ['uiMultiplier'],\n pendingFns: ['newUIMultiplier', 'effectiveAt'],\n },\n b20: {\n // `multiplier()` first — the only getter that resolves today. `uiMultiplier()` is kept for\n // forward-compat: it starts working as an alias once base-std #173 reaches mainnet.\n multiplierFns: ['multiplier', 'uiMultiplier'],\n pendingFns: ['newUIMultiplier', 'effectiveAt'],\n },\n}\n\nconst ABI_BY_FN = {\n uiMultiplier: scaledUIAmountAbi,\n newUIMultiplier: scaledUIAmountAbi,\n effectiveAt: scaledUIAmountAbi,\n multiplier: b20AssetAbi,\n} as const satisfies Record<ScaledUIAmountReadFn, unknown>\n\n/** A conventional ERC-8056 token deployed on Base still gets the `erc8056` dialect. */\nexport function resolveScaledUIDialect(chainId?: number, address?: string | null): ScaledUIDialect {\n return isB20AssetToken(chainId, address) ? 'b20' : 'erc8056'\n}\n\nexport interface ScaledUIAmountRead {\n address: Address\n abi: (typeof ABI_BY_FN)[ScaledUIAmountReadFn]\n functionName: ScaledUIAmountReadFn\n chainId?: number\n}\n\n/** Shape shared by viem `multicall` and wagmi `useReadContracts` result entries. */\nexport interface ScaledUIAmountReadResult {\n status: 'success' | 'failure'\n result?: unknown\n}\n\n/** Positional — `parseScaledUIAmountReads` must be called with the same dialect. */\nexport function buildScaledUIAmountReads(params: {\n address: Address\n chainId?: number\n dialect: ScaledUIDialect\n}): ScaledUIAmountRead[] {\n const { address, chainId, dialect } = params\n const spec = DIALECTS[dialect]\n return [...spec.multiplierFns, ...spec.pendingFns].map((functionName) => ({\n address,\n abi: ABI_BY_FN[functionName],\n functionName,\n ...(chainId === undefined ? {} : { chainId }),\n }))\n}\n\nconst asBigInt = (entry: ScaledUIAmountReadResult | undefined): bigint | undefined =>\n entry?.status === 'success' && typeof entry.result === 'bigint' ? entry.result : undefined\n\n/**\n * Live ScaledUI metadata for a token. Consumers should treat `{ enabled: false, multiplier: 1e18 }`\n * as the identity case and early-out from any scaling logic.\n */\nexport type ScaledUIAmountMetadata = {\n enabled: boolean\n /** 18-decimal fixed point. Defaults to `1e18` (identity). */\n multiplier: bigint\n newMultiplier?: bigint\n /** Unix seconds. */\n effectiveAt?: number\n}\n\n/** Returned for non-scaled tokens and on any read failure; behaves like a normal ERC-20. */\nexport const IDENTITY_SCALED_UI_AMOUNT_METADATA: ScaledUIAmountMetadata = {\n enabled: false,\n multiplier: SCALED_UI_DENOMINATOR,\n}\n\nexport function parseScaledUIAmountReads(\n results: readonly ScaledUIAmountReadResult[],\n dialect: ScaledUIDialect,\n): ScaledUIAmountMetadata {\n const spec = DIALECTS[dialect]\n const multiplierCount = spec.multiplierFns.length\n\n let multiplier: bigint | undefined\n for (let i = 0; i < multiplierCount; i++) {\n const candidate = asBigInt(results[i])\n // Zero is invalid in both standards, but a buggy contract could return it — letting it through\n // would collapse displayed amounts to zero and divide-by-zero on parse.\n if (candidate !== undefined && candidate !== 0n) {\n multiplier = candidate\n break\n }\n }\n if (multiplier === undefined) return IDENTITY_SCALED_UI_AMOUNT_METADATA\n\n const pendingIndex = (fn: ScaledUIAmountReadFn) => {\n const offset = spec.pendingFns.indexOf(fn)\n return offset === -1 ? -1 : multiplierCount + offset\n }\n\n const newMultiplier = asBigInt(results[pendingIndex('newUIMultiplier')])\n const effectiveAtRaw = asBigInt(results[pendingIndex('effectiveAt')])\n const effectiveAt = effectiveAtRaw !== undefined ? Number(effectiveAtRaw) : undefined\n\n // B20 post-#173 MIRRORS `uiMultiplier()` when nothing is scheduled, so the `!==` is load-bearing.\n const hasPending =\n newMultiplier !== undefined && effectiveAt !== undefined && newMultiplier !== multiplier && effectiveAt > 0\n\n return hasPending ? { enabled: true, multiplier, newMultiplier, effectiveAt } : { enabled: true, multiplier }\n}\n\n/**\n * A perf gate, not a correctness gate — `fetchScaledUIAmountMetadata` falls back to identity anyway\n * if the reads revert. Callers cache both outcomes (asymmetric TTL in IndexedDB).\n */\nexport async function probeIsScaledUIAmount(\n client: PublicClient,\n address: Address,\n chainId?: number,\n): Promise<boolean> {\n // B20 reverts on `supportsInterface` for every id, so ERC-165 can never detect it.\n if (isB20AssetToken(chainId ?? client.chain?.id, address)) return true\n\n try {\n const result = await client.readContract({\n address,\n abi: erc165Abi,\n functionName: 'supportsInterface',\n args: [SCALED_UI_AMOUNT_INTERFACE_ID],\n })\n return Boolean(result)\n } catch {\n return false\n }\n}\n\n/** Safe against any contract — won't throw. */\nexport async function fetchScaledUIAmountMetadata(\n client: PublicClient,\n address: Address,\n chainId?: number,\n): Promise<ScaledUIAmountMetadata> {\n const dialect = resolveScaledUIDialect(chainId ?? client.chain?.id, address)\n const results = await client.multicall({\n contracts: buildScaledUIAmountReads({ address, dialect }),\n allowFailure: true,\n })\n return parseScaledUIAmountReads(results as readonly ScaledUIAmountReadResult[], dialect)\n}\n\nexport {\n SCALED_UI_DENOMINATOR,\n SCALED_UI_MULTIPLIER_DECIMALS,\n fromScaledUIAmount,\n isIdentityScaledUIMultiplier,\n toScaledUIAmount,\n} from '@pancakeswap/swap-sdk-core'\n","/**\n * Base B20 — extension module for the scaled-UI subsystem.\n *\n * Owns everything B20-specific: address recognition, precompile addresses, revert decoding.\n * Nothing outside this file and its ABI sibling needs to know B20 exists.\n *\n * Detection is by address prefix, not ERC-165: `supportsInterface` REVERTS on live B20 tokens for\n * every id including ERC-165's own, so the probe could only ever answer \"no\". Addresses are\n * self-describing instead — `[10-byte prefix][1-byte variant][9-byte keccak(deployer, salt)]` —\n * so the variant is recoverable with zero RPC.\n *\n * https://docs.base.org/base-chain/specs/upgrades/beryl/b20\n */\nimport { ChainId } from '@pancakeswap/chains'\nimport type { Address } from 'viem'\n\n/** Detection is gated on these so a `0xb2000…` vanity address elsewhere can't be mistaken for B20. */\nexport const B20_SUPPORTED_CHAIN_IDS = [ChainId.BASE, ChainId.BASE_SEPOLIA] as const\n\nexport type B20SupportedChainId = (typeof B20_SUPPORTED_CHAIN_IDS)[number]\n\n/** The 10-byte prefix shared by every B20 token, lowercase, without `0x`. */\nexport const B20_ADDRESS_PREFIX = 'b2000000000000000000' as const\n\n/** Encoded in address byte `[10]`. */\nexport enum B20Variant {\n ASSET = 0,\n STABLECOIN = 1,\n}\n\nexport const B20_FACTORY_ADDRESS = '0xB20f000000000000000000000000000000000000' as const\nexport const B20_ACTIVATION_REGISTRY_ADDRESS = '0x8453000000000000000000000000000000000001' as const\nexport const B20_POLICY_REGISTRY_ADDRESS = '0x8453000000000000000000000000000000000002' as const\n\nconst HEX_ADDRESS_LENGTH = 40\nconst VARIANT_NIBBLE_START = B20_ADDRESS_PREFIX.length\nconst VARIANT_NIBBLE_END = VARIANT_NIBBLE_START + 2\n\nconst stripHexPrefix = (address: string): string =>\n (address.startsWith('0x') || address.startsWith('0X') ? address.slice(2) : address).toLowerCase()\n\nexport function isB20SupportedChainId(chainId?: number): chainId is B20SupportedChainId {\n return B20_SUPPORTED_CHAIN_IDS.includes(chainId as B20SupportedChainId)\n}\n\n/** Chain-agnostic. Verified equivalent to the factory's own `isB20()` over 24 cases. */\nexport function isB20Address(address?: string | null): boolean {\n if (!address) return false\n const hex = stripHexPrefix(address)\n return hex.length === HEX_ADDRESS_LENGTH && hex.startsWith(B20_ADDRESS_PREFIX)\n}\n\nexport function getB20Variant(address?: string | null): B20Variant | undefined {\n if (!isB20Address(address)) return undefined\n switch (stripHexPrefix(address!).slice(VARIANT_NIBBLE_START, VARIANT_NIBBLE_END)) {\n case '00':\n return B20Variant.ASSET\n case '01':\n return B20Variant.STABLECOIN\n default:\n // A future variant we don't model. Treat as not-B20 rather than guess at its behaviour.\n return undefined\n }\n}\n\n/** Only the ASSET variant carries a multiplier, so a B20 stablecoin must not be treated as scaled. */\nexport function isB20AssetToken(chainId?: number, address?: string | null): boolean {\n return isB20SupportedChainId(chainId) && getB20Variant(address) === B20Variant.ASSET\n}\n\nexport const isB20AssetAddress = (chainId: number | undefined, address: Address | undefined): boolean =>\n isB20AssetToken(chainId, address)\n\n/* //////////////////////////////////////////////////////////////\n REVERT DECODING\n////////////////////////////////////////////////////////////// */\n\n/**\n * B20 raises ABI-encoded custom errors, and a swap reverts through the router — whose ABI doesn't\n * declare them — so viem can't name them and only the bare 4-byte selector survives. Matching it is\n * the only reliable hook. `PausableFeature` is an enum, hence `uint8`. Verified against `IB20.sol`.\n */\nexport const B20_ERROR_SELECTORS = {\n '0xa43fec12': 'PolicyForbids', // (bytes32 policyScope, uint64 policyId)\n '0xfd8c4245': 'ContractPaused', // (PausableFeature feature)\n '0xcccad523': 'PolicyNotFound', // (uint64 policyId)\n '0xcdd98a4a': 'UnsupportedPolicyType', // (bytes32 policyScope)\n '0xf58f733a': 'SupplyCapExceeded', // ()\n '0x6f12f3dc': 'InvalidMultiplier', // ()\n} as const\n\nexport type B20ErrorName = (typeof B20_ERROR_SELECTORS)[keyof typeof B20_ERROR_SELECTORS]\n\nexport const B20_PAUSABLE_FEATURES = ['TRANSFER', 'MINT', 'BURN'] as const\nexport type B20PausableFeature = (typeof B20_PAUSABLE_FEATURES)[number]\n\nexport type B20RevertMatch = {\n name: B20ErrorName\n /** Only for `ContractPaused`, when the revert data carried a decodable feature. */\n feature?: B20PausableFeature\n}\n\nconst SELECTOR_PATTERN = /0x[0-9a-fA-F]{8}/g\n\n/**\n * Scan an error payload for a known B20 custom error. Takes a flattened string so it stays\n * dependency-free; returns `undefined` so callers keep their generic handling.\n */\nexport function matchB20RevertError(input?: string | null): B20RevertMatch | undefined {\n if (!input) return undefined\n const matches = input.match(SELECTOR_PATTERN)\n if (!matches) return undefined\n\n for (const candidate of matches) {\n const name = B20_ERROR_SELECTORS[candidate.toLowerCase() as keyof typeof B20_ERROR_SELECTORS]\n if (!name) continue\n if (name !== 'ContractPaused') return { name }\n\n // The feature is the single 32-byte word after the selector, present only if we got full data.\n const dataMatch = input.match(new RegExp(`${candidate}([0-9a-fA-F]{64})`, 'i'))\n const featureIndex = dataMatch ? Number.parseInt(dataMatch[1], 16) : Number.NaN\n const feature = B20_PAUSABLE_FEATURES[featureIndex]\n return feature ? { name, feature } : { name }\n }\n\n return undefined\n}\n","import { ChainId, getChainConfig } from '@pancakeswap/chains'\nimport type { Currency } from '@pancakeswap/swap-sdk-core'\nimport { Native } from './entities/native'\nimport { ERC20Token } from './entities/erc20Token'\n\nconst cache = new Map<number, Currency>()\n\n/**\n * The currency the product should treat as a chain's base asset.\n *\n * On nearly every chain that is the RPC native, and this returns `Native.onChain(chainId)`\n * unchanged. The exception is a chain that settles gas in an ordinary ERC-20: Arc's native\n * USDC already satisfies IERC20, so nothing wraps it and `wrappedNativeCurrency` is null,\n * which makes a native `Currency` there a liability — `.wrapped` throws, and roughly a\n * hundred call sites read it without asking.\n *\n * Rather than patch each of those, the app simply never materialises such a native: this\n * returns the ERC-20 the chain declares for the same balance (`gasTokenOverride`), which is\n * also what its pools are keyed by and what a user means when they name the asset.\n *\n * NOT for gas arithmetic. `eth_getBalance`, gasPrice and gasLimit are denominated in the RPC\n * native's decimals, and on Arc that is 18 against the ERC-20's 6 — measured on chain, the two\n * views of one balance differ by exactly 1e12. Anything converting a raw wei figure must keep\n * using `NATIVE[chainId]` / `Native.onChain` and rescale explicitly.\n */\nexport function resolveNativeCurrency(chainId: number): Currency {\n const cached = cache.get(chainId)\n if (cached) return cached\n\n const gasToken = getChainConfig(chainId as ChainId)?.gasTokenOverride\n const resolved: Currency = gasToken\n ? new ERC20Token(chainId, gasToken.address as `0x${string}`, gasToken.decimals, gasToken.symbol, gasToken.name)\n : Native.onChain(chainId)\n\n cache.set(chainId, resolved)\n return resolved\n}\n\n/**\n * True when the chain's base asset is an ERC-20 rather than an unwrappable native, i.e. when\n * {@link resolveNativeCurrency} returns something that is not `isNative`.\n */\nexport function hasErc20GasToken(chainId: number): boolean {\n return Boolean(getChainConfig(chainId as ChainId)?.gasTokenOverride)\n}\n\n/**\n * The RPC-native currency, for the places that genuinely need it.\n *\n * `eth_getBalance`, `gasPrice`, `gasLimit` and anything else denominated in wei are in the\n * chain's native decimals, which on a chain with a differently-scaled ERC-20 base asset is not\n * the same scale as {@link resolveNativeCurrency} — Arc's two views of one balance were measured\n * 1e12 apart. Those raw figures must be paired with this, never with the product base asset.\n *\n * This exists so the handful of legitimate uses are greppable and reviewable, rather than\n * indistinguishable from an accidental `Native.onChain`.\n */\nexport function getRpcNative(chainId: number): Native {\n return Native.rpcNative(chainId)\n}\n\n/**\n * `getRpcNative` for a chain id that may not be an EVM chain at all.\n *\n * `Native.rpcNative` asserts `NATIVE[chainId]` exists, so handing it a non-EVM id (Solana) throws\n * `Invariant failed`. Hooks that read a native balance run on whatever chain the page happens to\n * be on, so they need to ask rather than assert.\n */\nexport function tryGetRpcNative(chainId?: number): Native | undefined {\n if (!chainId) return undefined\n try {\n return Native.rpcNative(chainId)\n } catch {\n return undefined\n }\n}\n"]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { Currency } from '@pancakeswap/swap-sdk-core';
|
|
2
|
+
import { Native } from './entities/native';
|
|
3
|
+
/**
|
|
4
|
+
* The currency the product should treat as a chain's base asset.
|
|
5
|
+
*
|
|
6
|
+
* On nearly every chain that is the RPC native, and this returns `Native.onChain(chainId)`
|
|
7
|
+
* unchanged. The exception is a chain that settles gas in an ordinary ERC-20: Arc's native
|
|
8
|
+
* USDC already satisfies IERC20, so nothing wraps it and `wrappedNativeCurrency` is null,
|
|
9
|
+
* which makes a native `Currency` there a liability — `.wrapped` throws, and roughly a
|
|
10
|
+
* hundred call sites read it without asking.
|
|
11
|
+
*
|
|
12
|
+
* Rather than patch each of those, the app simply never materialises such a native: this
|
|
13
|
+
* returns the ERC-20 the chain declares for the same balance (`gasTokenOverride`), which is
|
|
14
|
+
* also what its pools are keyed by and what a user means when they name the asset.
|
|
15
|
+
*
|
|
16
|
+
* NOT for gas arithmetic. `eth_getBalance`, gasPrice and gasLimit are denominated in the RPC
|
|
17
|
+
* native's decimals, and on Arc that is 18 against the ERC-20's 6 — measured on chain, the two
|
|
18
|
+
* views of one balance differ by exactly 1e12. Anything converting a raw wei figure must keep
|
|
19
|
+
* using `NATIVE[chainId]` / `Native.onChain` and rescale explicitly.
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveNativeCurrency(chainId: number): Currency;
|
|
22
|
+
/**
|
|
23
|
+
* True when the chain's base asset is an ERC-20 rather than an unwrappable native, i.e. when
|
|
24
|
+
* {@link resolveNativeCurrency} returns something that is not `isNative`.
|
|
25
|
+
*/
|
|
26
|
+
export declare function hasErc20GasToken(chainId: number): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* The RPC-native currency, for the places that genuinely need it.
|
|
29
|
+
*
|
|
30
|
+
* `eth_getBalance`, `gasPrice`, `gasLimit` and anything else denominated in wei are in the
|
|
31
|
+
* chain's native decimals, which on a chain with a differently-scaled ERC-20 base asset is not
|
|
32
|
+
* the same scale as {@link resolveNativeCurrency} — Arc's two views of one balance were measured
|
|
33
|
+
* 1e12 apart. Those raw figures must be paired with this, never with the product base asset.
|
|
34
|
+
*
|
|
35
|
+
* This exists so the handful of legitimate uses are greppable and reviewable, rather than
|
|
36
|
+
* indistinguishable from an accidental `Native.onChain`.
|
|
37
|
+
*/
|
|
38
|
+
export declare function getRpcNative(chainId: number): Native;
|
|
39
|
+
/**
|
|
40
|
+
* `getRpcNative` for a chain id that may not be an EVM chain at all.
|
|
41
|
+
*
|
|
42
|
+
* `Native.rpcNative` asserts `NATIVE[chainId]` exists, so handing it a non-EVM id (Solana) throws
|
|
43
|
+
* `Invariant failed`. Hooks that read a native balance run on whatever chain the page happens to
|
|
44
|
+
* be on, so they need to ask rather than assert.
|
|
45
|
+
*/
|
|
46
|
+
export declare function tryGetRpcNative(chainId?: number): Native | undefined;
|
|
47
|
+
//# sourceMappingURL=resolveNativeCurrency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveNativeCurrency.d.ts","sourceRoot":"","sources":["../src/resolveNativeCurrency.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAK1C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAW/D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOpE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pancakeswap/swap-sdk-evm",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "An SDK for Pancakeswap EVM based chains",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"tiny-invariant": "^1.3.0",
|
|
19
19
|
"tiny-warning": "^1.0.3",
|
|
20
20
|
"viem": "2.37.13",
|
|
21
|
-
"@pancakeswap/chains": "0.
|
|
21
|
+
"@pancakeswap/chains": "0.10.0",
|
|
22
22
|
"@pancakeswap/swap-sdk-core": "1.6.1"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|