Skip to content

Commit 541d5a7

Browse files
authored
feat: add utils to select asset from network (#33)
1 parent 60436ee commit 541d5a7

File tree

6 files changed

+174
-19
lines changed

6 files changed

+174
-19
lines changed

.changeset/popular-lions-approve.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@fuels/assets': patch
3+
---
4+
5+
Asset package: Add network utils

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@
7777
},
7878
"overrides": {
7979
"semver@<7.5.2": ">=7.5.2",
80-
"word-wrap": "npm:@aashutoshrathi/word-wrap"
80+
"word-wrap": "npm:@aashutoshrathi/word-wrap",
81+
"@babel/traverse@<7.23.2": ">=7.23.2"
8182
}
8283
}
8384
}

packages/assets/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { assets as assetList } from './assets';
22
import { resolveIconPath } from './utils/resolveIconPath';
33
export * from './constants';
4+
export * from './utils/network';
45
export * from './utils/resolveIconPath';
56
export * from './types';
67

packages/assets/src/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,6 @@ export type Asset = {
3434
};
3535

3636
export type Assets = Array<Asset>;
37+
38+
export type AssetEth = Omit<Asset, 'networks'> & Ethereum;
39+
export type AssetFuel = Omit<Asset, 'networks'> & Fuel;

packages/assets/src/utils/network.ts

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import { CHAIN_IDS } from '../constants';
2+
import type { Asset, AssetEth, AssetFuel, Ethereum, Fuel } from '../types';
3+
4+
type Network = Ethereum | Fuel;
5+
export type NetworkTypes = Ethereum['type'] | Fuel['type'];
6+
type NetworkTypeToNetwork<T> = T extends 'ethereum'
7+
? Ethereum
8+
: T extends 'fuel'
9+
? Fuel
10+
: Network;
11+
12+
export const getDefaultChainId = (
13+
networkType: NetworkTypes,
14+
): number | undefined => {
15+
if (networkType === 'ethereum') return CHAIN_IDS.eth.sepolia;
16+
if (networkType === 'fuel') return CHAIN_IDS.fuel.beta4;
17+
18+
return undefined;
19+
};
20+
21+
export type GetAssetNetworkParams<T extends NetworkTypes | undefined> = {
22+
asset: Asset;
23+
chainId?: number;
24+
networkType: T;
25+
};
26+
27+
export const getAssetNetwork = <T extends NetworkTypes | undefined>({
28+
asset,
29+
chainId,
30+
networkType,
31+
}: GetAssetNetworkParams<T>): NetworkTypeToNetwork<T> => {
32+
const network = asset.networks.find(
33+
(network) => network.chainId === chainId && network.type === networkType,
34+
) as NetworkTypeToNetwork<T>;
35+
36+
return network;
37+
};
38+
39+
export const getAssetWithNetwork = <T extends NetworkTypes>({
40+
asset,
41+
chainId,
42+
networkType,
43+
}: GetAssetNetworkParams<T>): AssetEth | AssetFuel | undefined => {
44+
const { networks: _, ...assetRest } = asset;
45+
46+
const chainIdToUse = chainId ?? getDefaultChainId(networkType);
47+
if (!chainIdToUse) return undefined;
48+
49+
const assetNetwork = getAssetNetwork({
50+
asset,
51+
chainId: chainIdToUse,
52+
networkType,
53+
});
54+
55+
if (!assetNetwork) return undefined;
56+
57+
return {
58+
...assetRest,
59+
...assetNetwork,
60+
};
61+
};
62+
63+
export const getAssetEth = (
64+
asset: Asset,
65+
chainId?: number,
66+
): AssetEth | undefined => {
67+
return getAssetWithNetwork({
68+
asset,
69+
networkType: 'ethereum',
70+
chainId,
71+
}) as AssetEth;
72+
};
73+
74+
export const getAssetFuel = (
75+
asset: Asset,
76+
chainId?: number,
77+
): AssetFuel | undefined => {
78+
return getAssetWithNetwork({
79+
asset,
80+
networkType: 'fuel',
81+
chainId,
82+
}) as AssetFuel;
83+
};

pnpm-lock.yaml

Lines changed: 80 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)