Skip to content

Commit

Permalink
feat: add switch network and get current network (#174)
Browse files Browse the repository at this point in the history
- add switch network and get current network methods
- fix bug when compare chain id
- enable add network
  • Loading branch information
stanleyyconsensys authored Nov 16, 2023
1 parent a857eed commit 560751f
Show file tree
Hide file tree
Showing 18 changed files with 398 additions and 63 deletions.
45 changes: 43 additions & 2 deletions packages/starknet-snap/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ <h1>Hello, Snaps!</h1>
</form>
<form id="addNetwork">
<fieldset>
<legend>Add Network (Currently disabled)</legend>
<legend>Add Network</legend>
<label for="addNetworkName">Network Name</label>
<input type="text" id="addNetworkName" name="addNetworkName" /><br />
<label for="addNetworkChainId">Network Chain ID (in hex)</label>
Expand All @@ -97,6 +97,20 @@ <h1>Hello, Snaps!</h1>
<input type="submit" id="addNetwork" value="Add Network" />
</fieldset>
</form>
<form id="switchNetwork">
<fieldset>
<legend>Switch Network</legend>
<label for="switchNetwork_ChainId">Network Chain ID (in hex)</label>
<input type="text" id="switchNetwork_ChainId" name="switchNetwork_ChainId" />
<input type="submit" id="switchNetwork" value="Switch Network" />
</fieldset>
</form>
<form id="getCurrentNetwork">
<fieldset>
<legend>Get Current Network</legend>
<input type="submit" id="getCurrentNetwork" value="Get Current Network" />
</fieldset>
</form>
<form id="getStoredNetworks">
<fieldset>
<legend>Get Stored Networks</legend>
Expand Down Expand Up @@ -433,6 +447,14 @@ <h1>Hello, Snaps!</h1>
id: 'addNetwork',
method: addNetwork,
},
{
id: 'switchNetwork',
method: switchNetwork,
},
{
id: 'getCurrentNetwork',
method: getCurrentNetwork,
},
{
id: 'getStoredNetworks',
method: getStoredNetworks,
Expand Down Expand Up @@ -732,6 +754,24 @@ <h1>Hello, Snaps!</h1>
});
}

// here we call the snap's "starkNet_switchNetwork" method
async function switchNetwork(e) {
e.preventDefault(); // to prevent default form behavior

const networkChainId = document.getElementById('switchNetwork_ChainId').value;

await callSnap('starkNet_switchNetwork', {
chainId: networkChainId,
});
}

// here we call the snap's "starkNet_getCurrentNetwork" method
async function getCurrentNetwork(e) {
e.preventDefault(); // to prevent default form behavior

await callSnap('starkNet_getCurrentNetwork', {});
}

// here we call the snap's "starkNet_getStoredNetworks" method
async function getStoredNetworks(e) {
e.preventDefault(); // to prevent default form behavior
Expand Down Expand Up @@ -839,7 +879,8 @@ <h1>Hello, Snaps!</h1>
async function callSnap(method, params) {
try {
const chainId = document.getElementById('targetChainId').value;

//0x534e5f474f45524c42
console.log(params)
const response = await ethereum.request({
method: 'wallet_invokeSnap',
params: {
Expand Down
5 changes: 3 additions & 2 deletions packages/starknet-snap/src/addErc20Token.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
import { DEFAULT_DECIMAL_PLACES } from './utils/constants';
import { DialogType } from '@metamask/rpc-methods';
import { heading, panel } from '@metamask/snaps-ui';
import { logger } from './utils/logger';

export async function addErc20Token(params: ApiParams) {
try {
Expand Down Expand Up @@ -53,10 +54,10 @@ export async function addErc20Token(params: ApiParams) {

await upsertErc20Token(erc20Token, wallet, saveMutex);

console.log(`addErc20Token:\nerc20Token: ${toJson(erc20Token)}`);
logger.log(`addErc20Token:\nerc20Token: ${toJson(erc20Token)}`);
return erc20Token;
} catch (err) {
console.error(`Problem found: ${err}`);
logger.error(`Problem found: ${err}`);
throw err;
}
}
30 changes: 27 additions & 3 deletions packages/starknet-snap/src/addNetwork.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
import { toJson } from './utils/serializer';
import { AddNetworkRequestParams, ApiParams } from './types/snapApi';
import { validateAddNetworkParams } from './utils/snapUtils';
import { validateAddNetworkParams, upsertNetwork, getNetworkTxt } from './utils/snapUtils';
import { logger } from './utils/logger';
import { Network } from './types/snapState';
import { DialogType } from '@metamask/rpc-methods';
import { panel, heading } from '@metamask/snaps-ui';

export async function addNetwork(params: ApiParams) {
try {
const { requestParams } = params;
const { state, wallet, saveMutex, requestParams } = params;
const requestParamsObj = requestParams as AddNetworkRequestParams;

if (
Expand All @@ -22,7 +25,28 @@ export async function addNetwork(params: ApiParams) {

validateAddNetworkParams(requestParamsObj);

throw new Error('addNetwork is currently disabled');
const network = {
name: requestParamsObj.networkName,
chainId: requestParamsObj.networkChainId,
baseUrl: requestParamsObj.networkBaseUrl,
nodeUrl: requestParamsObj.networkNodeUrl,
voyagerUrl: requestParamsObj.networkVoyagerUrl,
} as Network;

const components = getNetworkTxt(network);

const response = await wallet.request({
method: 'snap_dialog',
params: {
type: DialogType.Confirmation,
content: panel([heading('Do you want to add this network?'), ...components]),
},
});
if (!response) return false;

await upsertNetwork(network, wallet, saveMutex, state);

return true;
} catch (err) {
logger.error(`Problem found: ${err}`);
throw err;
Expand Down
16 changes: 16 additions & 0 deletions packages/starknet-snap/src/getCurrentNetwork.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { toJson } from './utils/serializer';
import { ApiParams } from './types/snapApi';
import { getCurrentNetwork as getCurrentNetworkUtil } from './utils/snapUtils';
import { logger } from './utils/logger';

export async function getCurrentNetwork(params: ApiParams) {
try {
const { state } = params;
const networks = getCurrentNetworkUtil(state);
logger.log(`getCurrentNetwork: networks:\n${toJson(networks, 2)}`);
return networks;
} catch (err) {
logger.error(`Problem found: ${err}`);
throw err;
}
}
8 changes: 8 additions & 0 deletions packages/starknet-snap/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import { SnapState } from './types/snapState';
import { extractPrivateKey } from './extractPrivateKey';
import { extractPublicKey } from './extractPublicKey';
import { addNetwork } from './addNetwork';
import { switchNetwork } from './switchNetwork';
import { getCurrentNetwork } from './getCurrentNetwork';
import {
PRELOADED_TOKENS,
STARKNET_INTEGRATION_NETWORK,
Expand Down Expand Up @@ -165,6 +167,12 @@ export const onRpcRequest: OnRpcRequestHandler = async ({ origin, request }) =>
case 'starkNet_addNetwork':
return addNetwork(apiParams);

case 'starkNet_switchNetwork':
return switchNetwork(apiParams);

case 'starkNet_getCurrentNetwork':
return getCurrentNetwork(apiParams);

case 'starkNet_getStoredNetworks':
return getStoredNetworks(apiParams);

Expand Down
35 changes: 35 additions & 0 deletions packages/starknet-snap/src/switchNetwork.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { toJson } from './utils/serializer';
import { ApiParams, SwitchNetworkRequestParams } from './types/snapApi';
import { getNetwork, setCurrentNetwork, getNetworkTxt } from './utils/snapUtils';
import { DialogType } from '@metamask/rpc-methods';
import { panel, heading } from '@metamask/snaps-ui';
import { logger } from './utils/logger';

export async function switchNetwork(params: ApiParams) {
try {
const { state, wallet, saveMutex, requestParams } = params;
const requestParamsObj = requestParams as SwitchNetworkRequestParams;
const network = getNetwork(state, requestParamsObj.chainId);
if (!network) {
throw new Error(`The given chainId is invalid: ${requestParamsObj.chainId}`);
}
const components = getNetworkTxt(network);

const response = await wallet.request({
method: 'snap_dialog',
params: {
type: DialogType.Confirmation,
content: panel([heading('Do you want to switch to this network?'), ...components]),
},
});
if (!response) return false;

logger.log(`switchNetwork: network:\n${toJson(network, 2)}`);
await setCurrentNetwork(network, wallet, saveMutex, state);

return true;
} catch (err) {
logger.error(`Problem found: ${err}`);
throw err;
}
}
4 changes: 4 additions & 0 deletions packages/starknet-snap/src/types/snapApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -199,3 +199,7 @@ export interface SignDeployAccountTransactionRequestParams extends SignRequestPa
export interface SignDeclareTransactionRequestParams extends SignRequestParams, BaseRequestParams {
transaction: DeclareSignerDetails;
}

export interface SwitchNetworkRequestParams extends BaseRequestParams {
chainId: string;
}
1 change: 1 addition & 0 deletions packages/starknet-snap/src/types/snapState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ export interface SnapState {
erc20Tokens: Erc20Token[];
networks: Network[];
transactions: Transaction[];
currentNetwork?: Network;
}

export interface AccContract {
Expand Down
2 changes: 2 additions & 0 deletions packages/starknet-snap/src/utils/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ export const MAXIMUM_TOKEN_SYMBOL_LENGTH = 16;

export const TRANSFER_SELECTOR_HEX = '0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e';

export const ACCOUNT_CLASS_HASH = '0x033434ad846cdd5f23eb73ff09fe6fddd568284a0fb7d1be20ee482f044dabe2'; // from argent-x repo

export const STARKNET_MAINNET_NETWORK: Network = {
name: 'Starknet Mainnet',
chainId: constants.StarknetChainId.SN_MAIN,
Expand Down
Loading

0 comments on commit 560751f

Please sign in to comment.