Skip to content

Commit 978c195

Browse files
Merge remote-tracking branch 'origin/main' into trump
2 parents bf001d8 + 1f0c4b1 commit 978c195

File tree

9 files changed

+348
-113
lines changed

9 files changed

+348
-113
lines changed

.github/CODEOWNERS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
* @jmrossy @nambrot
1+
* @xaroz @cmcewen
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import Link from 'next/link';
2+
3+
import { DocsIcon, HistoryIcon, IconButton, PlusIcon, useModal } from '@hyperlane-xyz/widgets';
4+
import { config } from '../../consts/config';
5+
import { links } from '../../consts/links';
6+
import { useStore } from '../../features/store';
7+
import { AddWarpConfigModal } from '../../features/warpCore/AddWarpConfigModal';
8+
import { Color } from '../../styles/Color';
9+
10+
export function FloatingButtonStrip() {
11+
const { setIsSideBarOpen, isSideBarOpen } = useStore((s) => ({
12+
setIsSideBarOpen: s.setIsSideBarOpen,
13+
isSideBarOpen: s.isSideBarOpen,
14+
}));
15+
16+
const {
17+
isOpen: isAddWarpConfigOpen,
18+
open: openAddWarpConfig,
19+
close: closeAddWarpConfig,
20+
} = useModal();
21+
22+
return (
23+
<>
24+
<div className="absolute -right-8 top-2 hidden flex-col items-center justify-end gap-3 sm:flex">
25+
<IconButton
26+
className={`p-0.5 ${styles.roundedCircle}`}
27+
title="History"
28+
onClick={() => setIsSideBarOpen(!isSideBarOpen)}
29+
>
30+
<HistoryIcon color={Color.primary['500']} height={22} width={22} />
31+
</IconButton>
32+
{config.showAddRouteButton && (
33+
<IconButton
34+
className={styles.roundedCircle}
35+
title="Add route"
36+
onClick={openAddWarpConfig}
37+
>
38+
<PlusIcon color={Color.primary['500']} height={26} width={26} />
39+
</IconButton>
40+
)}
41+
<Link
42+
href={links.warpDocs}
43+
target="_blank"
44+
className={`p-0.5 ${styles.roundedCircle} ${styles.link}`}
45+
>
46+
<DocsIcon color={Color.primary['500']} height={21} width={21} className="p-px" />
47+
</Link>
48+
</div>
49+
<AddWarpConfigModal isOpen={isAddWarpConfigOpen} close={closeAddWarpConfig} />
50+
</>
51+
);
52+
}
53+
54+
const styles = {
55+
link: 'hover:opacity-70 active:opacity-60',
56+
roundedCircle: 'rounded-full bg-white',
57+
};

src/consts/config.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ interface Config {
1818
registryUrl: string | undefined; // Optional URL to use a custom registry instead of the published canonical version
1919
registryBranch?: string | undefined; // Optional customization of the registry branch instead of main
2020
registryProxyUrl?: string; // Optional URL to use a custom proxy for the GithubRegistry
21+
showAddRouteButton: boolean; // Show/Hide the add route config icon in the button strip
2122
showDisabledTokens: boolean; // Show/Hide invalid token options in the selection modal
2223
showTipBox: boolean; // Show/Hide the blue tip box above the transfer form
2324
transferBlacklist: string; // comma-separated list of routes between which transfers are disabled. Expects Caip2Id-Caip2Id (e.g. ethereum:1-sealevel:1399811149)
@@ -33,6 +34,7 @@ export const config: Config = Object.freeze({
3334
registryUrl,
3435
registryBranch,
3536
registryProxyUrl,
37+
showAddRouteButton: true,
3638
showDisabledTokens: false,
3739
showTipBox: false,
3840
version,

src/features/store.ts

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
import { GithubRegistry, IRegistry } from '@hyperlane-xyz/registry';
2-
import { ChainMap, ChainMetadata, MultiProtocolProvider, WarpCore } from '@hyperlane-xyz/sdk';
2+
import {
3+
ChainMap,
4+
ChainMetadata,
5+
MultiProtocolProvider,
6+
WarpCore,
7+
WarpCoreConfig,
8+
} from '@hyperlane-xyz/sdk';
39
import { objFilter } from '@hyperlane-xyz/utils';
410
import { toast } from 'react-toastify';
511
import { create } from 'zustand';
612
import { persist } from 'zustand/middleware';
713
import { config } from '../consts/config';
814
import { logger } from '../utils/logger';
915
import { assembleChainMetadata } from './chains/metadata';
10-
import { assembleWarpCoreConfig } from './tokens/warpCoreConfig';
1116
import { FinalTransferStatuses, TransferContext, TransferStatus } from './transfer/types';
17+
import { assembleWarpCoreConfig } from './warpCore/warpCoreConfig';
1218

1319
// Increment this when persist state has breaking changes
1420
const PERSIST_STATE_VERSION = 2;
@@ -18,8 +24,12 @@ const PERSIST_STATE_VERSION = 2;
1824
export interface AppState {
1925
// Chains and providers
2026
chainMetadata: ChainMap<ChainMetadata>;
27+
// Overrides to chain metadata set by user via the chain picker
2128
chainMetadataOverrides: ChainMap<Partial<ChainMetadata>>;
2229
setChainMetadataOverrides: (overrides?: ChainMap<Partial<ChainMetadata> | undefined>) => void;
30+
// Overrides to warp core configs added by user
31+
warpCoreConfigOverrides: WarpCoreConfig[];
32+
setWarpCoreConfigOverrides: (overrides?: WarpCoreConfig[] | undefined) => void;
2333
multiProvider: MultiProtocolProvider;
2434
registry: IRegistry;
2535
warpCore: WarpCore;
@@ -61,9 +71,21 @@ export const useStore = create<AppState>()(
6171
overrides: ChainMap<Partial<ChainMetadata> | undefined> = {},
6272
) => {
6373
logger.debug('Setting chain overrides in store');
64-
const { multiProvider } = await initWarpContext(get().registry, overrides);
74+
const { multiProvider, warpCore } = await initWarpContext({
75+
...get(),
76+
chainMetadataOverrides: overrides,
77+
});
6578
const filtered = objFilter(overrides, (_, metadata) => !!metadata);
66-
set({ chainMetadataOverrides: filtered, multiProvider });
79+
set({ chainMetadataOverrides: filtered, multiProvider, warpCore });
80+
},
81+
warpCoreConfigOverrides: [],
82+
setWarpCoreConfigOverrides: async (overrides: WarpCoreConfig[] | undefined = []) => {
83+
logger.debug('Setting warp core config overrides in store');
84+
const { multiProvider, warpCore } = await initWarpContext({
85+
...get(),
86+
warpCoreConfigOverrides: overrides,
87+
});
88+
set({ warpCoreConfigOverrides: overrides, multiProvider, warpCore });
6789
},
6890
multiProvider: new MultiProtocolProvider({}),
6991
registry: new GithubRegistry({
@@ -137,31 +159,34 @@ export const useStore = create<AppState>()(
137159
logger.error('Error during hydration', error);
138160
return;
139161
}
140-
initWarpContext(state.registry, state.chainMetadataOverrides).then(
141-
({ registry, chainMetadata, multiProvider, warpCore }) => {
142-
state.setWarpContext({ registry, chainMetadata, multiProvider, warpCore });
143-
logger.debug('Rehydration complete');
144-
},
145-
);
162+
initWarpContext(state).then(({ registry, chainMetadata, multiProvider, warpCore }) => {
163+
state.setWarpContext({ registry, chainMetadata, multiProvider, warpCore });
164+
logger.debug('Rehydration complete');
165+
});
146166
};
147167
},
148168
},
149169
),
150170
);
151171

152-
async function initWarpContext(
153-
registry: IRegistry,
154-
storeMetadataOverrides: ChainMap<Partial<ChainMetadata> | undefined>,
155-
) {
172+
async function initWarpContext({
173+
registry,
174+
chainMetadataOverrides,
175+
warpCoreConfigOverrides,
176+
}: {
177+
registry: IRegistry;
178+
chainMetadataOverrides: ChainMap<Partial<ChainMetadata> | undefined>;
179+
warpCoreConfigOverrides: WarpCoreConfig[];
180+
}) {
156181
try {
157-
const coreConfig = await assembleWarpCoreConfig();
182+
const coreConfig = await assembleWarpCoreConfig(warpCoreConfigOverrides);
158183
const chainsInTokens = Array.from(new Set(coreConfig.tokens.map((t) => t.chainName)));
159184
// Pre-load registry content to avoid repeated requests
160185
await registry.listRegistryContent();
161186
const { chainMetadata, chainMetadataWithOverrides } = await assembleChainMetadata(
162187
chainsInTokens,
163188
registry,
164-
storeMetadataOverrides,
189+
chainMetadataOverrides,
165190
);
166191
const multiProvider = new MultiProtocolProvider(chainMetadataWithOverrides);
167192
const warpCore = WarpCore.FromConfig(multiProvider, coreConfig);

src/features/tokens/warpCoreConfig.ts

Lines changed: 0 additions & 57 deletions
This file was deleted.

src/features/wallet/WalletFloatingButtons.tsx

Lines changed: 0 additions & 37 deletions
This file was deleted.

0 commit comments

Comments
 (0)