Skip to content

Commit

Permalink
feat: add network switcher for starknet wallet (#716)
Browse files Browse the repository at this point in the history
* feat: add network switcher for starknet wallet

* feat: add network verification for all starknet actions
  • Loading branch information
wa0x6e authored Sep 9, 2024
1 parent f04c2b3 commit 9021c5c
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 10 deletions.
25 changes: 24 additions & 1 deletion apps/ui/src/helpers/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@ import duration from 'dayjs/plugin/duration';
import relativeTime from 'dayjs/plugin/relativeTime';
import updateLocale from 'dayjs/plugin/updateLocale';
import sha3 from 'js-sha3';
import { validateAndParseAddress } from 'starknet';
import {
constants as starknetConstants,
validateAndParseAddress
} from 'starknet';
import networks from '@/helpers/networks.json';
import { VotingPowerItem } from '@/stores/votingPowers';
import { Choice, Proposal, SpaceMetadata } from '@/types';
Expand Down Expand Up @@ -379,6 +382,26 @@ export async function verifyNetwork(
}
}

export async function verifyStarknetNetwork(
web3: any,
chainId: starknetConstants.StarknetChainId
) {
if (!web3.provider.request) return;

try {
await web3.provider.request({
type: 'wallet_switchStarknetChain',
params: {
chainId
}
});
} catch (e) {
if (!e.message.toLowerCase().includes('not implemented')) {
throw new Error(e.message);
}
}
}

/**
* This function creates ERC1155 metadata object for space. external_url is stored
* at top level same as OpenSea, other extra properties are stored in the
Expand Down
63 changes: 55 additions & 8 deletions apps/ui/src/networks/starknet/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,22 @@ import {
starknetMainnet,
starknetSepolia
} from '@snapshot-labs/sx';
import { Account, AllowArray, Call, CallData, RpcProvider } from 'starknet';
import {
Account,
AllowArray,
Call,
CallData,
RpcProvider,
constants as starknetConstants
} from 'starknet';
import { executionCall, MANA_URL } from '@/helpers/mana';
import { getProvider } from '@/helpers/provider';
import { convertToMetaTransactions } from '@/helpers/transactions';
import { createErc1155Metadata, verifyNetwork } from '@/helpers/utils';
import {
createErc1155Metadata,
verifyNetwork,
verifyStarknetNetwork
} from '@/helpers/utils';
import {
EVM_CONNECTORS,
STARKNET_CONNECTORS
Expand Down Expand Up @@ -54,7 +65,11 @@ export function createActions(
chainId,
l1ChainId,
ethUrl
}: { chainId: string; l1ChainId: number; ethUrl: string }
}: {
chainId: starknetConstants.StarknetChainId;
l1ChainId: number;
ethUrl: string;
}
): NetworkActions {
const networkConfig = CONFIGS[networkId];
if (!networkConfig) throw new Error(`Unsupported network ${networkId}`);
Expand Down Expand Up @@ -93,14 +108,16 @@ export function createActions(
saltNonce: salt
});
},
async deployDependency(
deployDependency: async (
web3: any,
params: {
controller: string;
spaceAddress: string;
strategy: StrategyConfig;
}
) {
) => {
await verifyStarknetNetwork(web3, chainId);

if (!params.strategy.deploy) {
throw new Error('This strategy is not deployable');
}
Expand Down Expand Up @@ -129,6 +146,8 @@ export function createActions(
metadata: SpaceMetadata;
}
) {
await verifyStarknetNetwork(web3, chainId);

const pinned = await helpers.pin(
createErc1155Metadata(params.metadata, {
execution_strategies: params.executionStrategies.map(
Expand Down Expand Up @@ -178,6 +197,8 @@ export function createActions(
});
},
setMetadata: async (web3: any, space: Space, metadata: SpaceMetadata) => {
await verifyStarknetNetwork(web3, chainId);

const pinned = await helpers.pin(
createErc1155Metadata(metadata, {
execution_strategies: space.executors,
Expand Down Expand Up @@ -230,6 +251,8 @@ export function createActions(

if (relayerType && ['evm', 'evm-tx'].includes(relayerType)) {
await verifyNetwork(web3, l1ChainId);
} else {
await verifyStarknetNetwork(web3, chainId);
}

let selectedExecutionStrategy;
Expand Down Expand Up @@ -331,6 +354,8 @@ export function createActions(

if (relayerType && ['evm', 'evm-tx'].includes(relayerType)) {
await verifyNetwork(web3, l1ChainId);
} else {
await verifyStarknetNetwork(web3, chainId);
}

let selectedExecutionStrategy;
Expand Down Expand Up @@ -379,7 +404,9 @@ export function createActions(
data
});
},
cancelProposal: (web3: any, proposal: Proposal) => {
cancelProposal: async (web3: any, proposal: Proposal) => {
await verifyStarknetNetwork(web3, chainId);

return client.cancelProposal({
signer: web3.provider.account,
space: proposal.space.id,
Expand Down Expand Up @@ -407,6 +434,8 @@ export function createActions(

if (relayerType && ['evm', 'evm-tx'].includes(relayerType)) {
await verifyNetwork(web3, l1ChainId);
} else {
await verifyStarknetNetwork(web3, chainId);
}

const strategiesWithMetadata = await Promise.all(
Expand Down Expand Up @@ -460,20 +489,24 @@ export function createActions(
},
finalizeProposal: () => null,
executeTransactions: async (web3: any, proposal: Proposal) => {
await verifyStarknetNetwork(web3, chainId);

const executionData = getExecutionData(
proposal.space,
proposal.execution_strategy,
proposal.execution_destination,
convertToMetaTransactions(proposal.executions[0].transactions)
);

return executionCall('stark', chainId, 'execute', {
return executionCall('stark', chainId as string, 'execute', {
space: proposal.space.id,
proposalId: proposal.proposal_id,
executionParams: executionData.executionParams
});
},
executeQueuedProposal: async (web3: any, proposal: Proposal) => {
await verifyStarknetNetwork(web3, chainId);

if (!proposal.execution_destination)
throw new Error('Execution destination is missing');

Expand Down Expand Up @@ -528,6 +561,8 @@ export function createActions(
},
vetoProposal: () => null,
setVotingDelay: async (web3: any, space: Space, votingDelay: number) => {
await verifyStarknetNetwork(web3, chainId);

return client.setVotingDelay({
signer: web3.provider.account,
space: space.id,
Expand All @@ -539,6 +574,8 @@ export function createActions(
space: Space,
minVotingDuration: number
) => {
await verifyStarknetNetwork(web3, chainId);

return client.setMinVotingDuration({
signer: web3.provider.account,
space: space.id,
Expand All @@ -550,13 +587,17 @@ export function createActions(
space: Space,
maxVotingDuration: number
) => {
await verifyStarknetNetwork(web3, chainId);

return client.setMaxVotingDuration({
signer: web3.provider.account,
space: space.id,
maxVotingDuration
});
},
transferOwnership: async (web3: any, space: Space, owner: string) => {
await verifyStarknetNetwork(web3, chainId);

return client.transferOwnership({
signer: web3.provider.account,
space: space.id,
Expand All @@ -576,6 +617,8 @@ export function createActions(
minVotingDuration: number | null,
maxVotingDuration: number | null
) => {
await verifyStarknetNetwork(web3, chainId);

const pinned = await helpers.pin(
createErc1155Metadata(metadata, {
execution_strategies: space.executors,
Expand Down Expand Up @@ -637,6 +680,8 @@ export function createActions(
delegatee: string,
delegationContract: string
) => {
await verifyStarknetNetwork(web3, chainId);

const [, contractAddress] = delegationContract.split(':');

const { account }: { account: Account } = web3.provider;
Expand Down Expand Up @@ -712,7 +757,9 @@ export function createActions(
},
followSpace: () => {},
unfollowSpace: () => {},
setAlias(web3: any, alias: string) {
setAlias: async (web3: any, alias: string) => {
await verifyStarknetNetwork(web3, chainId);

return starkSigClient.setAlias({
signer: web3.provider.account,
data: { alias }
Expand Down
2 changes: 1 addition & 1 deletion apps/ui/src/networks/starknet/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import { createApi } from '../common/graphqlApi';

type Metadata = {
name: string;
chainId: string;
chainId: starknetConstants.StarknetChainId;
baseChainId: number;
baseNetworkId: NetworkID;
rpcUrl: string;
Expand Down

0 comments on commit 9021c5c

Please sign in to comment.