Skip to content

Commit

Permalink
feat: improve stake accounts handling
Browse files Browse the repository at this point in the history
  • Loading branch information
icfor committed Apr 3, 2024
1 parent 3437663 commit c88aab5
Show file tree
Hide file tree
Showing 8 changed files with 59 additions and 33 deletions.
3 changes: 2 additions & 1 deletion public/locales/en/staking.json
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,8 @@
"status": {
"activating": "Activating",
"active": "Active",
"deactivating": "Deactivating"
"deactivating": "Deactivating",
"inactive": "Inactive"
}
},
"stakeAccounts": "Accounts",
Expand Down
3 changes: 2 additions & 1 deletion public/locales/zh-CN/staking.json
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,8 @@
"status": {
"activating": "Active",
"active": "Active",
"deactivating": "Deactivating"
"deactivating": "Deactivating",
"inactive": "Inactive"
}
},
"stakeAccounts": "Accounts",
Expand Down
3 changes: 2 additions & 1 deletion public/locales/zh-HK/staking.json
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,8 @@
"status": {
"activating": "Active",
"active": "Active",
"deactivating": "Deactivating"
"deactivating": "Deactivating",
"inactive": "Inactive"
}
},
"stakeAccounts": "Accounts",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,13 +140,15 @@ const StakeAccounts = ({ network, onClose }: Props) => {
activating: t("stakeAccount.status.activating"),
active: t("stakeAccount.status.active"),
deactivating: t("stakeAccount.status.deactivating"),
inactive: t("stakeAccount.status.inactive"),
}[account.status] || account.status;

const statusStyle =
{
activating: styles.statusActivating,
active: styles.statusActive,
deactivating: styles.statusDeactivating,
inactive: null,
}[account.status] || null;

const reward = rewardsByAddress?.[account.address];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,9 @@

.wallets {
display: flex;
flex-direction: row;
flex-flow: row wrap;
gap: 24px;
justify-content: center;
margin-bottom: 48px;
margin-top: 48px;
}
Expand Down
21 changes: 13 additions & 8 deletions src/screens/staking/components/staking_section/unstaking_modal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import {
} from "@src/screens/staking/lib/staking_sdk/context/selectors";
import type { StakingNetworkInfo } from "@src/screens/staking/lib/staking_sdk/core";
import { mainNetworkDenom } from "@src/screens/staking/lib/staking_sdk/core/base";
import { solanaNetworks } from "@src/screens/staking/lib/staking_sdk/core/solana";
import { formatCoin } from "@src/screens/staking/lib/staking_sdk/formatters";
import { getAccountNormalisedDelegation } from "@src/screens/staking/lib/staking_sdk/utils/accounts";
import {
Expand Down Expand Up @@ -124,12 +125,14 @@ const UnstakingModal = () => {
}
})() as string;

const stakeAccounts = selectedAccount
? getStakeAccountsForNetwork(
stakingRef.current.state,
selectedAccount.networkId,
)
: [];
const stakeAccounts = (
selectedAccount
? getStakeAccountsForNetwork(
stakingRef.current.state,
selectedAccount.networkId,
)
: []
).filter((acc) => ["activating", "active"].includes(acc.status));

const onSubmit = (e: any) => {
e?.preventDefault();
Expand Down Expand Up @@ -207,7 +210,9 @@ const UnstakingModal = () => {
});
};

const hasStakingAccounts = stakeAccounts.length > 0;
const usesStakeAccounts = account?.networkId
? solanaNetworks.has(account.networkId)
: false;

const delegationProp = account?.info?.delegation;

Expand All @@ -230,7 +235,7 @@ const UnstakingModal = () => {
)}
</div>
</div>
{hasStakingAccounts ? (
{usesStakeAccounts ? (
<>
<Label>{t("unstakingModal.amount.labelBase")}</Label>
<StakeAccountsSelect
Expand Down
4 changes: 3 additions & 1 deletion src/screens/staking/lib/staking_sdk/staking_client_types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,13 @@ type Coin = {
denom: string;
};

type StakeAccountStatus = "activating" | "active" | "deactivating" | "inactive";

export type StakeAccount = {
address: string;
amount: string;
denom: string;
status: string;
status: StakeAccountStatus;
validator_address: string;
};

Expand Down
53 changes: 33 additions & 20 deletions src/screens/staking/lib/staking_sdk/wallet_operations/solana.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,21 +21,11 @@ import type { StakeOpts, UnstakeAmount, WalletOperationResult } from "./base";

const mainnetWallet = new Solflare({});
const testnetWallet = new Solflare({ network: "testnet" });

if (ENABLE_TESTNETS) {
mainnetWallet.on("disconnect", () => {
// eslint-disable-next-line no-console
console.log("disconnected");
});
}

testnetWallet.on("disconnect", () => {
// eslint-disable-next-line no-console
console.log("disconnected");
});
const devnetWallet = new Solflare({ network: "devnet" });

let connectListenerMainnet: (() => void) | undefined;
let connectListenerTestnet: (() => void) | undefined;
let connectListenerDevnet: (() => void) | undefined;

export const tryToConnectSolflare = async (
context: TStakingContext,
Expand All @@ -48,6 +38,9 @@ export const tryToConnectSolflare = async (
const hasTestnetWallet =
ENABLE_TESTNETS && solanaNetworks.has(StakingNetworkId.SolanaTestnet);

const hasDevnetWallet =
ENABLE_TESTNETS && solanaNetworks.has(StakingNetworkId.SolanaDevnet);

const getListener =
(wallet: typeof mainnetWallet, networkId: StakingNetworkId) =>
async () => {
Expand Down Expand Up @@ -91,9 +84,11 @@ export const tryToConnectSolflare = async (

resolvedItems += 1;

const totalItems = [hasMainnetWallet, hasTestnetWallet].filter(
Boolean,
).length;
const totalItems = [
hasMainnetWallet,
hasTestnetWallet,
hasDevnetWallet,
].filter(Boolean).length;

if (resolvedItems === totalItems) {
resolve(true);
Expand All @@ -117,9 +112,8 @@ export const tryToConnectSolflare = async (
}

if (hasTestnetWallet) {
if (connectListenerTestnet) {
if (connectListenerTestnet)
testnetWallet.off("connect", connectListenerTestnet);
}

connectListenerTestnet = getListener(
testnetWallet,
Expand All @@ -129,9 +123,22 @@ export const tryToConnectSolflare = async (
testnetWallet.on("connect", connectListenerTestnet);
}

if (hasDevnetWallet) {
if (connectListenerDevnet)
devnetWallet.off("connect", connectListenerDevnet);

connectListenerDevnet = getListener(
devnetWallet,
StakingNetworkId.SolanaDevnet,
);

devnetWallet.on("connect", connectListenerDevnet);
}

await Promise.all([
hasMainnetWallet ? mainnetWallet.connect() : Promise.resolve(),
hasTestnetWallet ? testnetWallet.connect() : Promise.resolve(),
hasDevnetWallet ? devnetWallet.connect() : Promise.resolve(),
]);
});

Expand Down Expand Up @@ -213,9 +220,15 @@ const getWalletApi = (account: Account): WalletApi => {
};
}

return account.networkId === StakingNetworkId.SolanaTestnet
? testnetWallet
: mainnetWallet;
const wallet = {
[StakingNetworkId.Solana]: mainnetWallet,
[StakingNetworkId.SolanaDevnet]: devnetWallet,
[StakingNetworkId.SolanaTestnet]: testnetWallet,
}[account.networkId as string];

if (!wallet) throw new Error("Unexpected wallet");

return wallet;
};

// https://solanacookbook.com/references/staking.html
Expand Down

0 comments on commit c88aab5

Please sign in to comment.