Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(frontend): add sol loader components #4080

Merged
merged 50 commits into from
Jan 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
ed78f4b
feat(frontend): add sol dependency
loki344 Dec 19, 2024
4b10789
feat(frontend): implement sol api
loki344 Dec 19, 2024
97b495b
feat(frontend): clarify naming
loki344 Dec 19, 2024
3dac81d
Merge branch 'main' into feat(frontend)/add-sol-api-for-balance
loki344 Dec 19, 2024
d5c6110
🤖 Apply formatting changes
github-actions[bot] Dec 19, 2024
e9017b7
feat(frontend): rm todo
loki344 Dec 19, 2024
33c7ffd
Merge remote-tracking branch 'origin/feat(frontend)/add-sol-api-for-b…
loki344 Dec 19, 2024
49559fa
feat(frontend): adjust typing
loki344 Dec 19, 2024
b2a5733
feat(frontend): adjust typing
loki344 Dec 19, 2024
977e23c
feat(frontend): lint
loki344 Dec 19, 2024
a9e1e4d
feat(frontend): lint
loki344 Dec 19, 2024
e4871e1
feat(frontend): lint
loki344 Dec 19, 2024
8655b42
feat(frontend): lint
loki344 Dec 19, 2024
7aef276
Merge branch 'refs/heads/feat(frontend)/adjust-sol-typing' into feat(…
loki344 Dec 19, 2024
816f789
feat(frontend): add types for worker
loki344 Dec 19, 2024
936e8bb
🤖 Apply formatting changes
github-actions[bot] Dec 19, 2024
8f6c1f9
feat(frontend): implement sol-listener
loki344 Dec 19, 2024
88ebcf2
🤖 Apply formatting changes
github-actions[bot] Dec 19, 2024
458726a
Merge branch 'refs/heads/feat(frontend)/add-sol-api-for-balance' into…
loki344 Dec 19, 2024
1aaaf05
feat(frontend): implement sol-wallet.scheduler.ts
loki344 Dec 19, 2024
1dbf131
Merge branch 'refs/heads/feat(frontend)/add-sol-listener' into feat(f…
loki344 Dec 19, 2024
4fbc4a4
feat(frontend): implement worker for sol wallet, add unit tests
loki344 Dec 19, 2024
3d47454
feat(frontend): implement worker for sol wallet, add unit tests
loki344 Dec 19, 2024
6e6fe73
Merge remote-tracking branch 'origin/feat(frontend)/add-sol-worker' i…
loki344 Dec 19, 2024
b9a73b0
feat(frontend): rm import
loki344 Dec 19, 2024
b1d5d8a
🤖 Apply formatting changes
github-actions[bot] Dec 19, 2024
d9ac699
Merge remote-tracking branch 'origin/main' into feat(frontend)/add-so…
loki344 Dec 20, 2024
3e3bf34
style(frontend): rm unwanted change
loki344 Dec 20, 2024
360cbf0
style(frontend): fix check
loki344 Dec 20, 2024
e41a702
🤖 Apply formatting changes
github-actions[bot] Dec 20, 2024
cdd9042
add todo
loki344 Jan 2, 2025
0b3cae6
implement MR feedback
loki344 Jan 2, 2025
bf91bec
feat(frontend): rm loaders from mr
loki344 Jan 2, 2025
93c3f2b
🤖 Apply formatting changes
github-actions[bot] Jan 2, 2025
e696cf7
Merge remote-tracking branch 'origin/feat(frontend)/add-sol-worker' i…
loki344 Jan 2, 2025
c221dea
feat(frontend): add loaderwallets
loki344 Jan 2, 2025
e1a7793
🤖 Apply formatting changes
github-actions[bot] Jan 2, 2025
f68d290
feat(frontend): rm txns
loki344 Jan 6, 2025
baeeb48
feat(frontend): fix tests
loki344 Jan 6, 2025
73bd616
feat(frontend): fix tests
loki344 Jan 6, 2025
9125eba
Merge remote-tracking branch 'refs/remotes/origin/main' into feat(fro…
loki344 Jan 6, 2025
8bc76a6
🤖 Apply formatting changes
github-actions[bot] Jan 6, 2025
c16477a
Merge remote-tracking branch 'origin/feat(frontend)/add-sol-worker' i…
loki344 Jan 6, 2025
47d7b1b
feat(frontend): add SolLoaderWallets.svelte with tests
loki344 Jan 6, 2025
6dfef79
Merge branch 'main' into feat(frontend)/add-sol-loader-components
loki344 Jan 6, 2025
8a08b3e
feat(frontend): rm comments
loki344 Jan 6, 2025
a3279a6
Merge remote-tracking branch 'origin/feat(frontend)/add-sol-loader-co…
loki344 Jan 6, 2025
07d07e1
🤖 Apply formatting changes
github-actions[bot] Jan 6, 2025
542e2bd
Merge branch 'feat(frontend)/add-sol-worker' into feat(frontend)/add-…
loki344 Jan 6, 2025
f2adea4
Merge branch 'main' into feat(frontend)/add-sol-loader-components
loki344 Jan 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
<script lang="ts">
import BtcLoaderWallets from '$btc/components/core/BtcLoaderWallets.svelte';
import IcLoaderWallets from '$icp/components/core/IcLoaderWallets.svelte';
import SolLoaderWallets from '$sol/components/core/SolLoaderWallets.svelte';
</script>

<IcLoaderWallets>
<BtcLoaderWallets>
<slot />
<SolLoaderWallets>
<slot />
</SolLoaderWallets>
</BtcLoaderWallets>
</IcLoaderWallets>
32 changes: 32 additions & 0 deletions src/frontend/src/sol/components/core/SolLoaderWallets.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<script lang="ts">
import { nonNullish } from '@dfinity/utils';
import WalletWorkers from '$lib/components/core/WalletWorkers.svelte';
import {
solAddressDevnet,
solAddressLocal,
solAddressMainnet,
solAddressTestnet
} from '$lib/derived/address.derived';
import type { Token } from '$lib/types/token';
import {
isNetworkIdSOLDevnet,
isNetworkIdSOLLocal,
isNetworkIdSOLMainnet,
isNetworkIdSOLTestnet
} from '$lib/utils/network.utils';
import { enabledSolanaTokens } from '$sol/derived/tokens.derived';
import { initSolWalletWorker as initWalletWorker } from '$sol/services/worker.sol-wallet.services';

let walletWorkerTokens: Token[];
$: walletWorkerTokens = $enabledSolanaTokens.filter(
({ network: { id: networkId } }) =>
(isNetworkIdSOLLocal(networkId) && nonNullish($solAddressLocal)) ||
(isNetworkIdSOLTestnet(networkId) && nonNullish($solAddressTestnet)) ||
(isNetworkIdSOLDevnet(networkId) && nonNullish($solAddressDevnet)) ||
(isNetworkIdSOLMainnet(networkId) && nonNullish($solAddressMainnet))
);
</script>

<WalletWorkers tokens={walletWorkerTokens} {initWalletWorker}>
<slot />
</WalletWorkers>
124 changes: 124 additions & 0 deletions src/frontend/src/tests/sol/components/core/SolLoaderWallets.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
import * as solEnv from '$env/networks/networks.sol.env';
import {
SOLANA_DEVNET_TOKEN,
SOLANA_TESTNET_TOKEN,
SOLANA_TOKEN
} from '$env/tokens/tokens.sol.env';
import * as appConstants from '$lib/constants/app.constants';
import {
solAddressDevnetStore,
solAddressLocalnetStore,
solAddressMainnetStore,
solAddressTestnetStore
} from '$lib/stores/address.store';
import { testnetsStore } from '$lib/stores/settings.store';
import SolLoaderWallets from '$sol/components/core/SolLoaderWallets.svelte';
import { enabledSolanaTokens } from '$sol/derived/tokens.derived';
import { initSolWalletWorker } from '$sol/services/worker.sol-wallet.services';
import { render } from '@testing-library/svelte';
import { get } from 'svelte/store';

vi.mock('$sol/services/worker.sol-wallet.services', () => ({
initSolWalletWorker: vi.fn()
}));

describe('SolLoaderWallets', () => {
beforeEach(() => {
vi.clearAllMocks();

// Reset all address stores
solAddressLocalnetStore.reset();
solAddressTestnetStore.reset();
solAddressDevnetStore.reset();
solAddressMainnetStore.reset();
testnetsStore.reset({ key: 'testnets' });

vi.spyOn(solEnv, 'SOLANA_NETWORK_ENABLED', 'get').mockImplementation(() => true);

vi.spyOn(appConstants, 'LOCAL', 'get').mockImplementation(() => false);
});

it('should not initialize wallet workers when no addresses are available', () => {
testnetsStore.set({ key: 'testnets', value: { enabled: true } });

render(SolLoaderWallets);

// With testnets enabled, we expect mainnet + testnet + devnet tokens
expect(get(enabledSolanaTokens).length).toBe(3);
expect(initSolWalletWorker).not.toHaveBeenCalled();
});

it('should initialize wallet workers only for networks with available addresses', () => {
const testnetAddress = 'testnet-address';
const mainnetAddress = 'mainnet-address';

testnetsStore.set({ key: 'testnets', value: { enabled: true } });
solAddressTestnetStore.set({ data: testnetAddress, certified: true });
solAddressMainnetStore.set({ data: mainnetAddress, certified: true });

render(SolLoaderWallets);

const walletWorkerTokens = get(enabledSolanaTokens).filter(
({ network: { id: networkId } }) =>
(networkId === SOLANA_TESTNET_TOKEN.network.id && testnetAddress) ||
(networkId === SOLANA_TOKEN.network.id && mainnetAddress)
);

expect(walletWorkerTokens.length).toBe(2);
});

it('should update wallet workers when addresses change', async () => {
const devnetAddress = 'devnet-address';
testnetsStore.set({ key: 'testnets', value: { enabled: true } });

const { rerender } = render(SolLoaderWallets);

expect(initSolWalletWorker).not.toHaveBeenCalled();

solAddressDevnetStore.set({ data: devnetAddress, certified: true });
await rerender({});

const walletWorkerTokens = get(enabledSolanaTokens).filter(
({ network: { id: networkId } }) =>
networkId === SOLANA_DEVNET_TOKEN.network.id && devnetAddress
);

expect(walletWorkerTokens.length).toBe(1);
});

it('should handle empty enabled tokens list when Solana network is disabled', () => {
vi.spyOn(solEnv, 'SOLANA_NETWORK_ENABLED', 'get').mockImplementation(() => false);
render(SolLoaderWallets);
expect(get(enabledSolanaTokens).length).toBe(0);
expect(initSolWalletWorker).not.toHaveBeenCalled();
});

it('should handle all networks having addresses', () => {
testnetsStore.set({ key: 'testnets', value: { enabled: true } });
solAddressLocalnetStore.set({ data: 'local-address', certified: true });
solAddressTestnetStore.set({ data: 'testnet-address', certified: true });
solAddressDevnetStore.set({ data: 'devnet-address', certified: true });
solAddressMainnetStore.set({ data: 'mainnet-address', certified: true });

render(SolLoaderWallets);

const walletWorkerTokens = get(enabledSolanaTokens).filter(
({ network: { id: networkId } }) =>
networkId === SOLANA_TESTNET_TOKEN.network.id ||
networkId === SOLANA_TOKEN.network.id ||
networkId === SOLANA_DEVNET_TOKEN.network.id
);

expect(walletWorkerTokens.length).toBe(3);
});

it('should include local network token when LOCAL is true', () => {
vi.spyOn(appConstants, 'LOCAL', 'get').mockImplementation(() => true);
testnetsStore.set({ key: 'testnets', value: { enabled: true } });

render(SolLoaderWallets);

// With LOCAL true and testnets enabled, we expect mainnet + testnet + devnet + local tokens
expect(get(enabledSolanaTokens).length).toBe(4);
});
});
Loading