-
Account
-
- Check the status of your account
+
+
+
+ Account
+
+
+ Manage your account; view your wallet balance, see your transaction history and more, all in one place.
-
-
- Wallet Status
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Balance
- -
- {{ account.balance }}
-
-
-
-
- Is Frozen
- -
- {{ account.isFrozen ? 'Yes' : 'No' }}
-
-
-
-
-
-
- Transactions
-
-
-
- Type
- |
-
- Memo
- |
-
- Amount
- |
-
- Date
- |
-
-
-
-
-
-
-
-
- {{ transaction.type }}
-
-
-
- |
-
- {{ transaction.memo }}
- |
-
- {{ transaction.amount }}
- |
-
- {{ transaction.timestamp | date: 'short' }}
- |
-
-
-
-
-
-
-
-
- Please connect your wallet to view your account details.
-
-
-
-
0" class="mt-4">
-
- {{ error() }}
-
-
-
+
\ No newline at end of file
diff --git a/apps/webapp/src/app/pages/account/account.page.ts b/apps/webapp/src/app/pages/account/account.page.ts
index fa634e2..8c6179c 100644
--- a/apps/webapp/src/app/pages/account/account.page.ts
+++ b/apps/webapp/src/app/pages/account/account.page.ts
@@ -1,28 +1,20 @@
-import { Component, inject, OnInit } from '@angular/core';
+import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
+import { RouterModule } from '@angular/router';
import { LayoutContainerComponent } from '../../containers/layout/layout-container.component';
-import { WalletStore } from '../../store';
@Component({
selector: 'webapp-account',
standalone: true,
- imports: [CommonModule, LayoutContainerComponent],
+ imports: [RouterModule, CommonModule, LayoutContainerComponent],
templateUrl: './account.page.html',
styleUrl: './account.page.css',
- providers: [WalletStore],
+ providers: [],
})
-export class AccountPage implements OnInit {
- readonly walletStore = inject(WalletStore);
- readonly account$ = this.walletStore.account();
- readonly transactions = this.walletStore.transactions;
- readonly error = this.walletStore.error;
-
- ngOnInit() {
- this.loadTransactions();
- }
-
- loadTransactions() {
- this.walletStore.loadTransactions(10);
- }
+export class AccountPage {
+ links = [
+ { path: 'wallet', label: 'Wallet' },
+ { path: 'send', label: 'Send Tokens' },
+ ];
}
diff --git a/apps/webapp/src/app/store/wallet/models.ts b/apps/webapp/src/app/store/wallet/models.ts
index 7f0db58..54cd2c9 100644
--- a/apps/webapp/src/app/store/wallet/models.ts
+++ b/apps/webapp/src/app/store/wallet/models.ts
@@ -93,7 +93,7 @@ export type Transaction = {
};
version: string;
};
-}
+};
export type TransactionHistoryResponse = {
success: boolean;
@@ -104,7 +104,39 @@ export type TransactionHistoryResponse = {
export type Transactions = Array<{
timestamp: Date;
type: 'transfer' | 'unknown';
- memo?: string
- amount?: number,
- sign?: -1 | 1,
-}>;
\ No newline at end of file
+ memo?: string;
+ amount?: number;
+ sign?: -1 | 1;
+}>;
+
+export type TokenInfoResponse = {
+ success: boolean;
+ message: string;
+ result: {
+ name: string;
+ symbol: string;
+ image: string;
+ decimals: number;
+ address: string;
+ freeze_authority: string;
+ current_supply: number;
+ extensions: Array<{
+ extension: string;
+ state: {
+ newerTransferFee: {
+ epoch: number;
+ maximumFee: number;
+ transferFeeBasisPoints: number;
+ };
+ olderTransferFee: {
+ epoch: number;
+ maximumFee: number;
+ transferFeeBasisPoints: number;
+ };
+ transferFeeConfigAuthority: null;
+ withdrawWithheldAuthority: string;
+ withheldAmount: number;
+ };
+ }>;
+ };
+};
diff --git a/apps/webapp/src/app/store/wallet/service.ts b/apps/webapp/src/app/store/wallet/service.ts
index f27aba4..b8935f8 100644
--- a/apps/webapp/src/app/store/wallet/service.ts
+++ b/apps/webapp/src/app/store/wallet/service.ts
@@ -1,12 +1,13 @@
import { HttpClient } from '@angular/common/http';
import { Injectable, inject } from '@angular/core';
import { getAssociatedTokenAddressSync } from '@solana/spl-token';
-import { map, of, timeout } from 'rxjs';
import { PublicKey } from '@solana/web3.js';
+import { map, of, timeout } from 'rxjs';
import { environment } from '../../../environments/environment';
import {
TokenBalanceResponse,
+ TokenInfoResponse,
Transaction,
TransactionHistoryResponse,
Transactions,
@@ -22,6 +23,12 @@ const isInvalidTransaction = (transaction: Transaction) => {
export class ShyftApiService {
private readonly http = inject(HttpClient);
+ getRpcUrl() {
+ const url = new URL(environment.rpcUrl);
+ url.searchParams.set('api_key', environment.shyftApiKey);
+ return url.toString();
+ }
+
getAccount(publicKey?: string) {
if (!publicKey) {
return of(null);
@@ -76,7 +83,7 @@ export class ShyftApiService {
: {
timestamp: new Date(transaction.timestamp),
memo: transaction.actions[1].info.message,
- amount: transaction.actions[1].info.amount,
+ amount: transaction.actions[0].info.amount,
sign: transaction.actions[0].info.sender === wallet ? -1 : 1,
type: 'transfer',
}),
@@ -84,4 +91,23 @@ export class ShyftApiService {
)
);
}
+
+ getTokenInfo(tokenAddress = environment.mintUSDC) {
+ const url = new URL(
+ '/sol/v1/token/get_info',
+ environment.shyftApiUrl
+ );
+ url.searchParams.append('network', environment.walletNetwork);
+ url.searchParams.append('token_address', tokenAddress);
+
+ return this.http
+ .get
(url.toString(), {
+ headers: {
+ 'x-api-key': environment.shyftApiKey,
+ },
+ })
+ .pipe(
+ timeout(5000),
+ map((res) => res.result));
+ }
}
diff --git a/apps/webapp/src/app/store/wallet/store.ts b/apps/webapp/src/app/store/wallet/store.ts
index bcff010..44e0057 100644
--- a/apps/webapp/src/app/store/wallet/store.ts
+++ b/apps/webapp/src/app/store/wallet/store.ts
@@ -1,14 +1,21 @@
-import { computed, inject } from '@angular/core';
+import { InjectionToken, computed, inject } from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { tapResponse } from '@ngrx/operators';
import {
patchState,
signalStore,
withComputed,
+ withHooks,
withMethods,
withState,
} from '@ngrx/signals';
import { rxMethod } from '@ngrx/signals/rxjs-interop';
-import { WalletStore as WalletAdapterStore } from '@heavy-duty/wallet-adapter';
+import {
+ ConnectionStore,
+ WalletStore as WalletAdapterStore,
+ injectTransactionSender,
+} from '@heavy-duty/wallet-adapter';
+import { createTransferInstructions } from '@heavy-duty/spl-utils';
import { combineLatest, of, pipe, switchMap, tap } from 'rxjs';
import { ShyftApiService } from './service';
@@ -16,53 +23,127 @@ import { Transactions } from './models';
type WalletState = {
wallet: WalletAdapterStore;
+ connection: ConnectionStore;
transactions: Transactions;
isLoading?: boolean;
error?: string;
+ signature?: string;
};
+const WALLET_STATE = new InjectionToken('WalletState', {
+ factory: () => ({
+ wallet: inject(WalletAdapterStore),
+ connection: inject(ConnectionStore),
+ transactions: [],
+ error: '',
+ signature: '',
+ }),
+});
+
export const WalletStore = signalStore(
- withState(
- () =>
- {
- wallet: inject(WalletAdapterStore),
- transactions: [],
- error: '',
- }
- ),
+ withState(() => inject(WALLET_STATE)),
+ withHooks({
+ onInit(store) {
+ const wallet = store.wallet();
+ // Connect the wallet to the RPC endpoint
+ const walletService = inject(ShyftApiService);
+ store.connection().setEndpoint(walletService.getRpcUrl());
+ // Auto connect the wallet if it was connected before
+ wallet.connected$.pipe(takeUntilDestroyed()).subscribe((connected) => {
+ connected && localStorage.setItem('autoConnect', 'true');
+ });
+ wallet.disconnecting$
+ .pipe(takeUntilDestroyed())
+ .subscribe((disconnected) => {
+ disconnected && localStorage.removeItem('autoConnect');
+ });
+ },
+ }),
withComputed((store, walletService = inject(ShyftApiService)) => ({
account: computed(() => {
return store
.wallet()
.publicKey$.pipe(
switchMap((publicKey) =>
- walletService.getAccount(publicKey?.toBase58())
+ publicKey
+ ? walletService.getAccount(publicKey.toBase58())
+ : of(null)
)
);
}),
})),
- withMethods((store, walletService = inject(ShyftApiService)) => ({
- loadTransactions: rxMethod(
- pipe(
- tap(() => patchState(store, { isLoading: true })),
- switchMap((limit) =>
- combineLatest([store.wallet().publicKey$, of(limit)])
- ),
- switchMap(([publicKey, limit]) => {
- if (!publicKey) return [];
- return walletService.getTransactions(publicKey, limit).pipe(
- tapResponse({
- next: (transactions) => patchState(store, { transactions }),
- error: (error: Error) => {
- console.error('error', error);
- patchState(store, { error: error.message });
- },
- complete: () =>
- patchState(store, { isLoading: false, error: '' }),
- })
- );
- })
- )
- ),
- }))
+ withMethods(
+ (
+ store,
+ walletService = inject(ShyftApiService),
+ transactionSender = injectTransactionSender()
+ ) => ({
+ clearSignature(): void {
+ patchState(store, { signature: undefined });
+ },
+ loadTransactions: rxMethod(
+ pipe(
+ tap(() => patchState(store, { isLoading: true })),
+ switchMap((limit) =>
+ combineLatest([store.wallet().publicKey$, of(limit)])
+ ),
+ switchMap(([publicKey, limit]) => {
+ if (!publicKey) return of([]);
+ return walletService.getTransactions(publicKey, limit)
+ }),
+ tapResponse({
+ next: (transactions) => patchState(store, { transactions }),
+ error: (error: Error) => {
+ console.error('error', error);
+ patchState(store, { error: error.message });
+ },
+ complete: () =>
+ patchState(store, { isLoading: false, error: undefined }),
+ })
+ )
+ ),
+ sendTransaction: rxMethod<{
+ amount: number;
+ memo: string;
+ tokenAddress: string;
+ senderAddress: string;
+ receiverAddress: string;
+ }>(
+ pipe(
+ tap(() => patchState(store, { isLoading: true })),
+ switchMap((payload) =>
+ combineLatest([
+ walletService.getTokenInfo(payload.tokenAddress),
+ of(payload),
+ ])
+ ),
+ switchMap(([tokenInfo, payload]) => {
+ return transactionSender.send(
+ createTransferInstructions({
+ amount: payload.amount * 10 ** tokenInfo.decimals,
+ memo: payload.memo,
+ mintAddress: payload.tokenAddress,
+ senderAddress: payload.senderAddress,
+ receiverAddress: payload.receiverAddress,
+ fundReceiver: true,
+ })
+ );
+ }),
+ tapResponse({
+ next: (signature) => {
+ return patchState(store, { signature });
+ },
+ error: (error: Error) => {
+ console.error('error', error);
+ patchState(store, { error: error.message });
+ },
+ complete: () => {
+ console.log('completed');
+ patchState(store, { isLoading: false, error: undefined });
+ },
+ })
+ )
+ ),
+ })
+ )
);
diff --git a/apps/webapp/src/environments/environment.prod.ts b/apps/webapp/src/environments/environment.prod.ts
index e744a38..909647c 100644
--- a/apps/webapp/src/environments/environment.prod.ts
+++ b/apps/webapp/src/environments/environment.prod.ts
@@ -2,6 +2,7 @@ export const environment = {
production: import.meta.env.NODE_ENV === 'production',
shyftApiKey: import.meta.env.NG_APP_SHYFT_API_KEY,
shyftApiUrl: 'https://api.shyft.to',
+ rpcUrl: 'https://rpc.shyft.to',
walletNetwork: 'mainnet-beta',
mintUSDC: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'
};
\ No newline at end of file
diff --git a/apps/webapp/src/environments/environment.ts b/apps/webapp/src/environments/environment.ts
index 6e7ced9..efa58d1 100644
--- a/apps/webapp/src/environments/environment.ts
+++ b/apps/webapp/src/environments/environment.ts
@@ -2,6 +2,7 @@ export const environment = {
production: false,
shyftApiKey: import.meta.env.NG_APP_SHYFT_API_KEY,
shyftApiUrl: 'https://api.shyft.to',
+ rpcUrl: 'https://devnet-rpc.shyft.to',
walletNetwork: 'devnet',
- mintUSDC: '4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU'
+ mintUSDC: '4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU', // https://faucet.circle.com/
};
\ No newline at end of file
diff --git a/libs/ui/src/lib/header/header.component.html b/libs/ui/src/lib/header/header.component.html
index 1595ac4..7010e47 100644
--- a/libs/ui/src/lib/header/header.component.html
+++ b/libs/ui/src/lib/header/header.component.html
@@ -30,7 +30,7 @@
-
+
-
+ />
+ />
Toggle Theme
diff --git a/package-lock.json b/package-lock.json
index 630de5c..4901769 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -21,21 +21,25 @@
"@angular/platform-server": "~17.1.0",
"@angular/router": "~17.1.0",
"@angular/ssr": "~17.1.0",
- "@heavy-duty/wallet-adapter": "^0.8.0",
- "@heavy-duty/wallet-adapter-cdk": "^0.8.0",
- "@heavy-duty/wallet-adapter-material": "^0.8.0",
+ "@heavy-duty/solana-utils": "^0.1.5",
+ "@heavy-duty/spl-utils": "^0.1.5",
+ "@heavy-duty/wallet-adapter": "^0.8.4",
+ "@heavy-duty/wallet-adapter-cdk": "^0.8.4",
+ "@heavy-duty/wallet-adapter-material": "^0.8.4",
"@ng-icons/core": "^26.4.0",
"@ng-icons/heroicons": "^26.4.0",
"@ng-icons/ionicons": "^26.4.0",
"@ngrx/signals": "^17.1.0",
"@nx/angular": "18.0.3",
- "@solana/spl-token": "^0.4.0",
+ "@solana/spl-token": "^0.4.1",
+ "@sweetalert2/ngx-sweetalert2": "^12.3.0",
"@tailwindcss/aspect-ratio": "^0.4.2",
"@tailwindcss/forms": "^0.5.7",
"@tailwindcss/typography": "^0.5.10",
"express": "~4.18.2",
"ngxtension": "^2.0.0",
"rxjs": "~7.8.0",
+ "sweetalert2": "^11.10.5",
"tslib": "^2.3.0",
"zone.js": "~0.14.3"
},
@@ -5006,12 +5010,28 @@
"@hapi/hoek": "^9.0.0"
}
},
+ "node_modules/@heavy-duty/solana-utils": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@heavy-duty/solana-utils/-/solana-utils-0.1.5.tgz",
+ "integrity": "sha512-f4NCjuBEYeWeKiKPQSOuzwZqFJSrRa6z08AePppePVjvPCrImCPfSNb2Vwq6iqSN1i5qaXB1XlNO+aKDLh4nkw==",
+ "dependencies": {
+ "tslib": "^2.3.0"
+ }
+ },
+ "node_modules/@heavy-duty/spl-utils": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@heavy-duty/spl-utils/-/spl-utils-0.1.5.tgz",
+ "integrity": "sha512-PknqyWaVddJw1CqIRnx1dR6mpen+dQWB35HI+LBA48PWYIogZlJZD9fbrWolbPINo+vTMYNeBnidLWndnVbUVg==",
+ "dependencies": {
+ "tslib": "^2.3.0"
+ }
+ },
"node_modules/@heavy-duty/wallet-adapter": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/@heavy-duty/wallet-adapter/-/wallet-adapter-0.8.0.tgz",
- "integrity": "sha512-uVtLGJ0DaFnhRS/W8TBZaX0Lk+ENIMOjsyyLQRVYh1IoQLiCAjaWVxKZ7Ecy2LKIeQJvXKZdjg4TTO21YS55lA==",
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/@heavy-duty/wallet-adapter/-/wallet-adapter-0.8.4.tgz",
+ "integrity": "sha512-hiJ0HdHwmUIw5dtgV3k4HKuRMjpux+NRoS0iZ/aEsMLVq4dRA+UmJxxhlKJb+wU6+qr+Af8qujChggjpXxe1LQ==",
"dependencies": {
- "@angular/core": "^17.0.0",
+ "@angular/core": "^17.1.0",
"@ngrx/component-store": "^17.0.0",
"@solana-mobile/wallet-adapter-mobile": "^2.0.1",
"@solana/wallet-adapter-base": "^0.9.23",
@@ -5025,14 +5045,14 @@
}
},
"node_modules/@heavy-duty/wallet-adapter-cdk": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/@heavy-duty/wallet-adapter-cdk/-/wallet-adapter-cdk-0.8.0.tgz",
- "integrity": "sha512-vqB0NADrMhNuea703l2tPOUPm+1okp3tsmjlEIgmaWkwnemZEBEaBJItSDWQwU1VDUb+AKRpcRHbVYE7mryKTA==",
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/@heavy-duty/wallet-adapter-cdk/-/wallet-adapter-cdk-0.8.4.tgz",
+ "integrity": "sha512-nyu28lol+82WEXkj5HrXvRehdmkFjrjryQm/Y6sUmXGF3xMdsYPFM5TpevM5HQ/mRJlGrMaoVWUb9YtYt5DmAw==",
"dependencies": {
- "@angular/common": "^17.0.0",
- "@angular/core": "^17.0.0",
- "@angular/platform-browser": "^17.0.0",
- "@heavy-duty/wallet-adapter": "0.8.0",
+ "@angular/common": "^17.1.0",
+ "@angular/core": "^17.1.0",
+ "@angular/platform-browser": "^17.1.0",
+ "@heavy-duty/wallet-adapter": "0.8.4",
"@ngrx/component-store": "^17.0.0",
"@solana/wallet-adapter-base": "^0.9.23",
"@solana/web3.js": "^1.87.6",
@@ -5041,16 +5061,16 @@
}
},
"node_modules/@heavy-duty/wallet-adapter-material": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/@heavy-duty/wallet-adapter-material/-/wallet-adapter-material-0.8.0.tgz",
- "integrity": "sha512-ciK/OlaPyDkIx6HEyQTeP76OVKXCxJQCC6xc+hBZ1YzOGZ6Vd+pBKm71MPISzMHT5c85mF/845UakP38j/ihKQ==",
- "dependencies": {
- "@angular/cdk": "^17.0.0",
- "@angular/common": "^17.0.0",
- "@angular/core": "^17.0.0",
- "@angular/material": "^17.0.0",
- "@heavy-duty/wallet-adapter": "0.8.0",
- "@heavy-duty/wallet-adapter-cdk": "0.8.0",
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/@heavy-duty/wallet-adapter-material/-/wallet-adapter-material-0.8.4.tgz",
+ "integrity": "sha512-GAA90cW2dl265v8qBLEHeURoQ7JsynmRdl2pmHT0EUT7R2GxYhIkCRvXjmNtl1jrtaXVs/VHcL7LmmPHuzVC/Q==",
+ "dependencies": {
+ "@angular/cdk": "^17.1.0",
+ "@angular/common": "^17.1.0",
+ "@angular/core": "^17.1.0",
+ "@angular/material": "^17.1.0",
+ "@heavy-duty/wallet-adapter": "0.8.4",
+ "@heavy-duty/wallet-adapter-cdk": "0.8.4",
"@ngrx/component-store": "^17.0.0",
"@solana/wallet-adapter-base": "^0.9.23",
"rxjs": "~7.8.0",
@@ -9895,9 +9915,9 @@
}
},
"node_modules/@solana/spl-token": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.0.tgz",
- "integrity": "sha512-jjBIBG9IsclqQVl5Y82npGE6utdCh7Z9VFcF5qgJa5EUq2XgspW3Dt1wujWjH/vQDRnkp9zGO+BqQU/HhX/3wg==",
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.1.tgz",
+ "integrity": "sha512-DEe15GI0l+XLHwtau/3GUwGQJ9YY/VWNE0k/QuXaaGKo4adMZLEAIQUktRc/S2sRqPjvUdR5anZGxQ9p5khWZw==",
"dependencies": {
"@solana/buffer-layout": "^4.0.0",
"@solana/buffer-layout-utils": "^0.2.0",
@@ -9908,7 +9928,7 @@
"node": ">=16"
},
"peerDependencies": {
- "@solana/web3.js": "^1.89.1"
+ "@solana/web3.js": "^1.90.0"
}
},
"node_modules/@solana/spl-token-metadata": {
@@ -13903,6 +13923,19 @@
"integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==",
"devOptional": true
},
+ "node_modules/@sweetalert2/ngx-sweetalert2": {
+ "version": "12.3.0",
+ "resolved": "https://registry.npmjs.org/@sweetalert2/ngx-sweetalert2/-/ngx-sweetalert2-12.3.0.tgz",
+ "integrity": "sha512-hcLSXfUOKFo8scFy+MIzOa35TeVNkMwVf7YKLh6XqyuMcUoKU40GM0PCKEyotCQA1bIy2c6gleGr1NEYZ3umNg==",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "peerDependencies": {
+ "@angular/common": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0",
+ "@angular/core": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0",
+ "sweetalert2": "^11.0.0"
+ }
+ },
"node_modules/@tailwindcss/aspect-ratio": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/@tailwindcss/aspect-ratio/-/aspect-ratio-0.4.2.tgz",
@@ -31718,6 +31751,15 @@
"webpack": ">=2"
}
},
+ "node_modules/sweetalert2": {
+ "version": "11.10.5",
+ "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.10.5.tgz",
+ "integrity": "sha512-q9eE3EKhMcpIDU/Xcz7z5lk8axCGkgxwK47gXGrrfncnBJWxHPPHnBVAjfsVXcTt8Yi8U6HNEcBRSu+qGeyFdA==",
+ "funding": {
+ "type": "individual",
+ "url": "https://github.com/sponsors/limonte"
+ }
+ },
"node_modules/symbol-observable": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz",
diff --git a/package.json b/package.json
index c3ae72d..b58f3d6 100644
--- a/package.json
+++ b/package.json
@@ -26,21 +26,25 @@
"@angular/platform-server": "~17.1.0",
"@angular/router": "~17.1.0",
"@angular/ssr": "~17.1.0",
- "@heavy-duty/wallet-adapter": "^0.8.0",
- "@heavy-duty/wallet-adapter-cdk": "^0.8.0",
- "@heavy-duty/wallet-adapter-material": "^0.8.0",
+ "@heavy-duty/solana-utils": "^0.1.5",
+ "@heavy-duty/spl-utils": "^0.1.5",
+ "@heavy-duty/wallet-adapter": "^0.8.4",
+ "@heavy-duty/wallet-adapter-cdk": "^0.8.4",
+ "@heavy-duty/wallet-adapter-material": "^0.8.4",
"@ng-icons/core": "^26.4.0",
"@ng-icons/heroicons": "^26.4.0",
"@ng-icons/ionicons": "^26.4.0",
"@ngrx/signals": "^17.1.0",
"@nx/angular": "18.0.3",
- "@solana/spl-token": "^0.4.0",
+ "@solana/spl-token": "^0.4.1",
+ "@sweetalert2/ngx-sweetalert2": "^12.3.0",
"@tailwindcss/aspect-ratio": "^0.4.2",
"@tailwindcss/forms": "^0.5.7",
"@tailwindcss/typography": "^0.5.10",
"express": "~4.18.2",
"ngxtension": "^2.0.0",
"rxjs": "~7.8.0",
+ "sweetalert2": "^11.10.5",
"tslib": "^2.3.0",
"zone.js": "~0.14.3"
},