Skip to content

Commit

Permalink
[Added] Legder limitation
Browse files Browse the repository at this point in the history
  • Loading branch information
greedyboi committed Nov 14, 2023
1 parent 0179d1b commit b85c31d
Show file tree
Hide file tree
Showing 7 changed files with 97 additions and 74 deletions.
1 change: 1 addition & 0 deletions src/models/wallets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ export interface LumWalletModel {
deposits: AggregatedDepositModel[];
prizes: PrizeModel[];
totalPrizesWon: { [denom: string]: number };
isLedger: boolean;
}

export interface OtherWalletModel {
Expand Down
57 changes: 31 additions & 26 deletions src/pages/Deposit/Deposit.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import cosmonautWithRocket from 'assets/lotties/cosmonaut_with_rocket.json';

import Assets from 'assets';
import { Button, Card, Lottie, Modal, PurpleBackgroundImage, Steps } from 'components';
import { FirebaseConstants, NavigationConstants } from 'constant';
import { FirebaseConstants, NavigationConstants, WalletProvider } from 'constant';
import { useColorScheme, usePrevious, useVisibilityState } from 'hooks';
import { PoolModel } from 'models';
import { DenomsUtils, Firebase, I18n, NumbersUtils, WalletUtils, WalletProvidersUtils } from 'utils';
Expand Down Expand Up @@ -82,39 +82,43 @@ const Deposit = () => {
},
walletClient: {
enable: async (chainIds) => {
const autoConnectProvider = WalletUtils.getAutoconnectProvider();
if (autoConnectProvider) {
const providerFunctions = WalletProvidersUtils.getProviderFunctions(autoConnectProvider);
const autoConnectProvider = WalletUtils.getAutoconnectProvider() || WalletProvider.Keplr;

for (const chainId of chainIds) {
await providerFunctions.enable(chainId);
}
const providerFunctions = WalletProvidersUtils.getProviderFunctions(autoConnectProvider);

if (!providerFunctions) {
return;
}

for (const chainId of chainIds) {
await providerFunctions.enable(chainId);
}
},
getKey: async (chainId) => {
const autoConnectProvider = WalletUtils.getAutoconnectProvider();
if (autoConnectProvider) {
const providerFunctions = WalletProvidersUtils.getProviderFunctions(autoConnectProvider);

return await providerFunctions.getKey(chainId);
const autoConnectProvider = WalletUtils.getAutoconnectProvider() || WalletProvider.Keplr;

const providerFunctions = WalletProvidersUtils.getProviderFunctions(autoConnectProvider);

if (!providerFunctions) {
return {
address: new Uint8Array(),
pubKey: new Uint8Array(),
name: '',
algo: '',
isNanoLedger: false,
bech32Address: '',
};
}

return {
address: new Uint8Array(),
pubKey: new Uint8Array(),
name: '',
algo: '',
isNanoLedger: false,
bech32Address: '',
};
return await providerFunctions.getKey(chainId);
},
getOfflineSigner: (chainId) => {
const autoConnectProvider = WalletUtils.getAutoconnectProvider();
const autoConnectProvider = WalletUtils.getAutoconnectProvider() || WalletProvider.Keplr;

// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const providerFunctions = WalletProvidersUtils.getProviderFunctions(autoConnectProvider!);
const providerFunctions = WalletProvidersUtils.getProviderFunctions(autoConnectProvider);

return providerFunctions.getOfflineSigner(chainId);
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
return providerFunctions!.getOfflineSigner(chainId);
},
},
};
Expand Down Expand Up @@ -855,6 +859,7 @@ const Deposit = () => {
}

const isShareStep = currentStep >= steps.length;
const showSwapCard = otherWallet && process.env.NODE_ENV !== 'test';

return (
<>
Expand All @@ -864,7 +869,7 @@ const Deposit = () => {
<div className='col'>
<h1 className='steps-title' dangerouslySetInnerHTML={{ __html: I18n.t('deposit.title') }} />
<Steps currentStep={currentStep} steps={steps} lastStepChecked={shareState === 'shared'} />
{otherWallet && process.env.NODE_ENV !== 'test' ? (
{showSwapCard ? (
<Card flat withoutPadding className='deposit-delta-card d-flex flex-column flex-sm-row align-items-center mt-5'>
<PurpleBackgroundImage src={Assets.images.questionMark} alt='' className='no-filter rounded-circle' width={42} height={42} />
<div className='text-center text-sm-start ms-0 ms-sm-4 mt-3 mt-sm-0'>{I18n.t('deposit.swapHint.content')}</div>
Expand Down Expand Up @@ -909,7 +914,7 @@ const Deposit = () => {
/>
</Card>
) : null}
<Card flat withoutPadding className='deposit-delta-card d-flex flex-column flex-sm-row align-items-center mt-3'>
<Card flat withoutPadding className={`deposit-delta-card d-flex flex-column flex-sm-row align-items-center mt-${showSwapCard ? '3' : '5'}`}>
<PurpleBackgroundImage src={Assets.images.questionMark} alt='' className='no-filter rounded-circle' width={42} height={42} />
<div className='text-center text-sm-start ms-0 ms-sm-4 mt-3 mt-sm-0' dangerouslySetInnerHTML={{ __html: I18n.t('deposit.depositHint') }} />
</Card>
Expand Down
2 changes: 1 addition & 1 deletion src/pages/MySavings/MySavings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -534,7 +534,7 @@ const MySavings = () => {
balances={balances || []}
isLoading={isTransferring}
/>
<ClaimModal prizes={prizesToClaim || []} prices={prices} pools={pools} />
<ClaimModal prizes={prizesToClaim || []} prices={prices} pools={pools} limit={lumWallet.isLedger ? 3 : 6} />
<LeavePoolModal deposit={depositToLeave} />
</div>
);
Expand Down
10 changes: 4 additions & 6 deletions src/pages/MySavings/components/Modals/Claim/Claim.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ interface Props {
prizes: PrizeModel[];
prices: { [key: string]: number };
pools: PoolModel[];
limit: number;
}

type ShareInfos = { hash: string; amount: LumTypes.Coin[]; tvl: string; poolId: string; compounded: boolean };
Expand Down Expand Up @@ -122,7 +123,7 @@ const ShareClaim = ({ infos, prices, modalRef, onTwitterShare }: { infos: ShareI
);
};

const Claim = ({ prizes, prices, pools }: Props) => {
const Claim = ({ prizes, prices, pools, limit }: Props) => {
const [blockedCompound, setBlockedCompound] = useState(false);
const [claimOnly, setClaimOnly] = useState(false);
const [currentStep, setCurrentStep] = useState(0);
Expand Down Expand Up @@ -150,8 +151,7 @@ const Claim = ({ prizes, prices, pools }: Props) => {
Firebase.logEvent(FirebaseConstants.ANALYTICS_EVENTS.JUST_CLAIMED_CONFIRMED);
}

const LIMIT = 6;
const batchCount = Math.ceil(prizes.length / LIMIT);
const batchCount = Math.ceil(prizes.length / limit);

setBatchTotal(batchCount);
setCurrentStep(currentStep + 1);
Expand All @@ -160,11 +160,9 @@ const Claim = ({ prizes, prices, pools }: Props) => {
setBatch(batch);
};

const payload = { prizes, batch, batchTotal: batchCount, onBatchComplete };

const action = compound ? dispatch.wallet.claimAndCompoundPrizes : dispatch.wallet.claimPrizes;

const res = await action(payload);
const res = await action({ prizes, batch, batchTotal: batchCount, limit, onBatchComplete });

if (!res || (res && res.error)) {
setCurrentStep(currentStep);
Expand Down
20 changes: 15 additions & 5 deletions src/redux/models/wallet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ import { LumWalletModel, OtherWalletModel, PoolModel, PrizeModel, TransactionMod
import { RootModel } from '.';
import { LumApi } from 'api';

type SignInLumPayload = LumWallet & {
isLedger: boolean;
};

interface IbcTransferPayload {
fromAddress: string;
toAddress: string;
Expand Down Expand Up @@ -51,6 +55,7 @@ interface ClaimPrizesPayload {
prizes: PrizeModel[];
batchTotal: number;
batch: number;
limit: number;
onBatchComplete: (batch: number) => void;
}

Expand Down Expand Up @@ -89,7 +94,7 @@ export const wallet = createModel<RootModel>()({
prizesMutex: false,
} as WalletState,
reducers: {
signInLum(state, payload: LumWallet): WalletState {
signInLum(state, payload: SignInLumPayload): WalletState {
return {
...state,
lumWallet: {
Expand All @@ -104,6 +109,7 @@ export const wallet = createModel<RootModel>()({
deposits: [],
prizes: [],
totalPrizesWon: {},
isLedger: !!payload.isLedger,
},
};
},
Expand Down Expand Up @@ -249,10 +255,16 @@ export const wallet = createModel<RootModel>()({
if (provider === WalletProvider.Cosmostation) {
await WalletProvidersUtils.requestCosmostationAccount(chainId);
}

const lumOfflineSigner = await providerFunctions.getOfflineSigner(chainId);
const lumWallet = await LumWalletFactory.fromOfflineSigner(lumOfflineSigner);

if (lumWallet) {
dispatch.wallet.signInLum(lumWallet);
const { isNanoLedger } = await providerFunctions.getKey(chainId);

const wallet = Object.assign(lumWallet, { isLedger: isNanoLedger });

dispatch.wallet.signInLum(wallet);

WalletUtils.storeAutoconnectKey(provider);

Expand Down Expand Up @@ -773,8 +785,6 @@ export const wallet = createModel<RootModel>()({

let prizesToClaim = [...prizes];

const LIMIT = 6;

const toastId = ToastUtils.showLoadingToast({ content: I18n.t(batchTotal > 1 ? 'pending.claimPrize' : 'pending.claimPrize', { count: 1, total: batchTotal }) });

let lastBatch = 0;
Expand All @@ -795,7 +805,7 @@ export const wallet = createModel<RootModel>()({
});
}

const toClaim = prizesToClaim.slice(0, LIMIT);
const toClaim = prizesToClaim.slice(0, payload.limit);

result = await LumClient.claimPrizes(lumWallet.innerWallet, toClaim);

Expand Down
6 changes: 4 additions & 2 deletions src/tests/app.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -143,8 +143,9 @@ describe('App', () => {
it('render the My Savings Page without crashing', async () => {
// Log in using a test wallet to enable My Savings page
const testWallet = await LumWalletFactory.fromMnemonic(testMnemonic);
const wallet = Object.assign(testWallet, { isLedger: false });

store.dispatch.wallet.signInLum(testWallet);
store.dispatch.wallet.signInLum(wallet);

// Render My Savings page
renderWithRematchStore(
Expand Down Expand Up @@ -188,10 +189,11 @@ describe('App', () => {
expect(transferBtn.parentElement).toBeDisabled();

const testWallet = await LumWalletFactory.fromMnemonic(testMnemonic);
const wallet = Object.assign(testWallet, { isLedger: false });

// Fake log in to enable the transfer button
act(() => {
store.dispatch.wallet.signInLum(testWallet);
store.dispatch.wallet.signInLum(wallet);
store.dispatch.wallet.setOtherWalletData({
denom: 'atom',
balances: [],
Expand Down
75 changes: 41 additions & 34 deletions src/utils/walletProviders.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,15 @@ export const isAnyWalletInstalled = (): boolean => {
return isCosmostationInstalled() || isKeplrInstalled();
};

const isProviderInstalled = (provider: WalletProvider) => {
return provider === WalletProvider.Cosmostation ? isCosmostationInstalled() : isKeplrInstalled();
};

export const getProviderFunctions = (provider: WalletProvider) => {
if (!isProviderInstalled(provider)) {
return null;
}

return {
enable: (chainId: string) => {
if (provider === WalletProvider.Cosmostation) {
Expand All @@ -29,11 +37,11 @@ export const getProviderFunctions = (provider: WalletProvider) => {

const keplrProvider = provider === WalletProvider.Keplr ? window.keplr : window.leap;

if (keplrProvider) {
return keplrProvider.enable(chainId);
if (!keplrProvider) {
throw new Error(I18n.t('errors.walletProvider.notInstalled', { provider }));
}

throw new Error(I18n.t('errors.walletProvider.notInstalled', { provider }));
return keplrProvider.enable(chainId);
},
getOfflineSigner: (chainId: string) => {
if (provider === WalletProvider.Cosmostation) {
Expand All @@ -46,27 +54,15 @@ export const getProviderFunctions = (provider: WalletProvider) => {

const keplrProvider = provider === WalletProvider.Keplr ? window.keplr : window.leap;

if (keplrProvider) {
return keplrProvider.getOfflineSignerAuto(chainId);
if (!keplrProvider) {
throw new Error(I18n.t('errors.walletProvider.notInstalled', { provider }));
}

throw new Error(I18n.t('errors.walletProvider.notInstalled', { provider }));
return keplrProvider.getOfflineSignerAuto(chainId);
},
getKey: async (chainId: string): Promise<Key> => {
if (provider === WalletProvider.Cosmostation) {
if (isCosmostationInstalled()) {
const account = await requestCosmostationAccount(chainId);

return {
address: LumUtils.fromBech32(account.address).data,
bech32Address: account.address,
name: account.name,
algo: 'secp256k1',
isNanoLedger: account.isLedger,
pubKey: account.publicKey,
isKeystone: false,
};
} else {
if (!isCosmostationInstalled()) {
return {
address: new Uint8Array(),
pubKey: new Uint8Array(),
Expand All @@ -77,23 +73,34 @@ export const getProviderFunctions = (provider: WalletProvider) => {
bech32Address: '',
};
}
} else {
const keplrProvider = provider === WalletProvider.Keplr ? window.keplr : window.leap;
const account = await requestCosmostationAccount(chainId);

return {
address: LumUtils.fromBech32(account.address).data,
bech32Address: account.address,
name: account.name,
algo: 'secp256k1',
isNanoLedger: account.isLedger,
pubKey: account.publicKey,
isKeystone: false,
};
}

if (keplrProvider) {
return await keplrProvider.getKey(chainId);
} else {
return {
address: new Uint8Array(),
pubKey: new Uint8Array(),
name: '',
algo: '',
isNanoLedger: false,
isKeystone: false,
bech32Address: '',
};
}
const keplrProvider = provider === WalletProvider.Keplr ? window.keplr : window.leap;

if (!keplrProvider) {
return {
address: new Uint8Array(),
pubKey: new Uint8Array(),
name: '',
algo: '',
isNanoLedger: false,
isKeystone: false,
bech32Address: '',
};
}

return await keplrProvider.getKey(chainId);
},
};
};
Expand Down

0 comments on commit b85c31d

Please sign in to comment.