diff --git a/web/src/components/dex/DEXDashboard.tsx b/web/src/components/dex/DEXDashboard.tsx
index 30f1a250..74c0f4a3 100644
--- a/web/src/components/dex/DEXDashboard.tsx
+++ b/web/src/components/dex/DEXDashboard.tsx
@@ -142,28 +142,28 @@ export const DEXDashboard: React.FC = () => {
onClick={() => setShowInitializeUsdtModal(true)}
className="flex items-center justify-center gap-2 px-4 py-3 bg-green-600 hover:bg-green-700 text-white rounded-lg transition-colors font-medium"
>
-
+
Mint wUSDT
diff --git a/web/src/components/dex/SwapInterface.tsx b/web/src/components/dex/SwapInterface.tsx
index 2e5db313..2d28a9c4 100644
--- a/web/src/components/dex/SwapInterface.tsx
+++ b/web/src/components/dex/SwapInterface.tsx
@@ -26,12 +26,12 @@ type TransactionStatus = 'idle' | 'signing' | 'submitting' | 'success' | 'error'
// All supported tokens - filtered dynamically based on available pools
const ALL_TOKENS = [
- { symbol: 'HEZ', emoji: '🟡', assetId: -1, name: 'HEZ', decimals: 12, displaySymbol: 'HEZ', logo: '/shared/images/hez_token_512.png' },
- { symbol: 'PEZ', emoji: '🔵', assetId: 1, name: 'PEZ', decimals: 12, displaySymbol: 'PEZ', logo: '/shared/images/pez.png' },
- { symbol: 'USDT', emoji: '💵', assetId: 1000, name: 'USDT', decimals: 6, displaySymbol: 'USDT', logo: '/shared/images/USDT(hez)logo.png' },
- { symbol: 'DOT', emoji: '🔴', assetId: 1001, name: 'DOT', decimals: 10, displaySymbol: 'DOT', logo: '/shared/images/dot.png' },
- { symbol: 'ETH', emoji: '💎', assetId: 1002, name: 'ETH', decimals: 18, displaySymbol: 'ETH', logo: '/shared/images/etherium.png' },
- { symbol: 'BTC', emoji: '🟠', assetId: 1003, name: 'BTC', decimals: 8, displaySymbol: 'BTC', logo: '/shared/images/bitcoin.png' },
+ { symbol: 'HEZ', emoji: '🟡', assetId: -1, name: 'HEZ', decimals: 12, displaySymbol: 'HEZ', logo: '/tokens/HEZ.png' },
+ { symbol: 'PEZ', emoji: '🔵', assetId: 1, name: 'PEZ', decimals: 12, displaySymbol: 'PEZ', logo: '/tokens/PEZ.png' },
+ { symbol: 'USDT', emoji: '💵', assetId: 1000, name: 'USDT', decimals: 6, displaySymbol: 'USDT', logo: '/tokens/USDT.png' },
+ { symbol: 'DOT', emoji: '🔴', assetId: 1001, name: 'DOT', decimals: 10, displaySymbol: 'DOT', logo: '/tokens/DOT.png' },
+ { symbol: 'ETH', emoji: '💎', assetId: 1002, name: 'ETH', decimals: 18, displaySymbol: 'ETH', logo: '/tokens/ETH.png' },
+ { symbol: 'BTC', emoji: '🟠', assetId: 1003, name: 'BTC', decimals: 8, displaySymbol: 'BTC', logo: '/tokens/BTC.png' },
] as const;
// Helper to get tokens that have available pools
diff --git a/web/src/components/dex/mintableAssets.ts b/web/src/components/dex/mintableAssets.ts
index e7fa72fa..a00a877e 100644
--- a/web/src/components/dex/mintableAssets.ts
+++ b/web/src/components/dex/mintableAssets.ts
@@ -15,7 +15,7 @@ export const MINTABLE_ASSETS: Record = {
symbol: 'wUSDT',
name: 'Wrapped USDT',
decimals: 6,
- logo: '/shared/images/USDT(hez)logo.png',
+ logo: '/tokens/USDT.png',
defaultAmount: '10000',
color: 'green',
},
@@ -24,7 +24,7 @@ export const MINTABLE_ASSETS: Record = {
symbol: 'wDOT',
name: 'Wrapped DOT',
decimals: 10,
- logo: '/shared/images/dot.png',
+ logo: '/tokens/DOT.png',
defaultAmount: '100',
color: 'pink',
},
@@ -33,7 +33,7 @@ export const MINTABLE_ASSETS: Record = {
symbol: 'wETH',
name: 'Wrapped ETH',
decimals: 18,
- logo: '/shared/images/etherium.png',
+ logo: '/tokens/ETH.png',
defaultAmount: '10',
color: 'purple',
},
@@ -42,7 +42,7 @@ export const MINTABLE_ASSETS: Record = {
symbol: 'wBTC',
name: 'Wrapped BTC',
decimals: 8,
- logo: '/shared/images/bitcoin.png',
+ logo: '/tokens/BTC.png',
defaultAmount: '1',
color: 'orange',
},
diff --git a/web/src/components/staking/StakingDashboard.tsx b/web/src/components/staking/StakingDashboard.tsx
index 597a09f1..c11dd920 100644
--- a/web/src/components/staking/StakingDashboard.tsx
+++ b/web/src/components/staking/StakingDashboard.tsx
@@ -10,7 +10,7 @@ import { AlertCircle, CheckCircle2 } from 'lucide-react';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { useWallet } from '@/contexts/WalletContext';
import { toast } from 'sonner';
-import { web3FromAddress } from '@pezkuwi/extension-dapp';
+import { web3FromAddress, web3Enable } from '@pezkuwi/extension-dapp';
import {
getStakingInfo,
getActiveValidators,
@@ -30,6 +30,19 @@ import { LoadingState } from '@pezkuwi/components/AsyncComponent';
import { ValidatorPoolDashboard } from './ValidatorPoolDashboard';
import { handleBlockchainError, handleBlockchainSuccess } from '@pezkuwi/lib/error-handler';
+// Get signer with auto-reconnect if extension session expired
+async function getInjectorSigner(address: string) {
+ let injector = await web3FromAddress(address);
+ if (!injector?.signer) {
+ await web3Enable('PezkuwiChain');
+ injector = await web3FromAddress(address);
+ if (!injector?.signer) {
+ throw new Error('Wallet signer not available. Please reconnect your wallet.');
+ }
+ }
+ return injector;
+}
+
export const StakingDashboard: React.FC = () => {
const { api, peopleApi, selectedAccount, isApiReady, isPeopleReady } = usePezkuwi();
const { balances, refreshBalances } = useWallet();
@@ -113,7 +126,7 @@ export const StakingDashboard: React.FC = () => {
setIsRecordingScore(true);
try {
- const injector = await web3FromAddress(selectedAccount.address);
+ const injector = await getInjectorSigner(selectedAccount.address);
const result = await recordTrustScore(peopleApi, selectedAccount.address, injector.signer);
if (result.success) {
@@ -141,7 +154,7 @@ export const StakingDashboard: React.FC = () => {
setIsClaimingReward(true);
try {
- const injector = await web3FromAddress(selectedAccount.address);
+ const injector = await getInjectorSigner(selectedAccount.address);
const result = await claimPezReward(peopleApi, selectedAccount.address, epochIndex, injector.signer);
if (result.success) {
@@ -182,7 +195,7 @@ export const StakingDashboard: React.FC = () => {
throw new Error('Insufficient HEZ balance');
}
- const injector = await web3FromAddress(selectedAccount.address);
+ const injector = await getInjectorSigner(selectedAccount.address);
// If already bonded, use bondExtra, otherwise use bond
let tx;
@@ -235,7 +248,7 @@ export const StakingDashboard: React.FC = () => {
setIsLoading(true);
try {
- const injector = await web3FromAddress(selectedAccount.address);
+ const injector = await getInjectorSigner(selectedAccount.address);
const tx = api.tx.staking.nominate(selectedValidators);
@@ -278,7 +291,7 @@ export const StakingDashboard: React.FC = () => {
throw new Error('Insufficient staked amount');
}
- const injector = await web3FromAddress(selectedAccount.address);
+ const injector = await getInjectorSigner(selectedAccount.address);
const tx = api.tx.staking.unbond(amount);
await tx.signAndSend(
@@ -322,7 +335,7 @@ export const StakingDashboard: React.FC = () => {
setIsLoading(true);
try {
- const injector = await web3FromAddress(selectedAccount.address);
+ const injector = await getInjectorSigner(selectedAccount.address);
// Number of slashing spans (usually 0)
const tx = api.tx.staking.withdrawUnbonded(0);
@@ -370,7 +383,7 @@ export const StakingDashboard: React.FC = () => {
setIsLoading(true);
try {
- const injector = await web3FromAddress(selectedAccount.address);
+ const injector = await getInjectorSigner(selectedAccount.address);
// stakingScore pallet is on People Chain - uses cached staking data from Asset Hub
const tx = peopleApi.tx.stakingScore.startScoreTracking();
diff --git a/web/src/contexts/PezkuwiContext.tsx b/web/src/contexts/PezkuwiContext.tsx
index 97370051..3cdcf7df 100644
--- a/web/src/contexts/PezkuwiContext.tsx
+++ b/web/src/contexts/PezkuwiContext.tsx
@@ -121,6 +121,10 @@ export const PezkuwiProvider: React.FC = ({
extrinsic: {},
payload: {},
},
+ StorageWeightReclaim: {
+ extrinsic: {},
+ payload: {},
+ },
},
});
@@ -198,6 +202,10 @@ export const PezkuwiProvider: React.FC = ({
extrinsic: {},
payload: {},
},
+ StorageWeightReclaim: {
+ extrinsic: {},
+ payload: {},
+ },
},
});
@@ -232,6 +240,10 @@ export const PezkuwiProvider: React.FC = ({
extrinsic: {},
payload: {},
},
+ StorageWeightReclaim: {
+ extrinsic: {},
+ payload: {},
+ },
},
});