From 78cb26742cf4fa7b4ffc88a36e6718c47e2d3e73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bernard=20Stojanovi=C4=87?= Date: Wed, 5 Oct 2022 11:40:26 +0200 Subject: [PATCH] feat: implemented `polkadot` and `westmint` network (#155) * implemented `polkadot` and `westmint` network * fix comments * fix typo * fix tests --- .../src/containers/Dashboard/Dashboard.tsx | 12 ++++++------ packages/snap/snap.manifest.json | 2 +- packages/snap/src/configuration/index.ts | 10 +++++++++- packages/snap/src/configuration/predefined.ts | 11 +++++++++++ packages/snap/src/polkadot/account.ts | 18 +++++++++++++----- packages/snap/test/unit/asset/index.test.ts | 2 +- .../snap/test/unit/configuration/index.test.ts | 4 ++-- .../snap/test/unit/polkadot/account.test.ts | 4 ++-- packages/snap/test/unit/rpc/configure.test.ts | 2 +- packages/snap/test/unit/rpc/getAddress.test.ts | 4 ++-- .../snap/test/unit/rpc/getPublicKey.test.ts | 4 ++-- .../test/unit/rpc/substrate/getBalance.test.ts | 4 ++-- packages/types/index.d.ts | 4 +++- 13 files changed, 55 insertions(+), 26 deletions(-) diff --git a/packages/example/src/containers/Dashboard/Dashboard.tsx b/packages/example/src/containers/Dashboard/Dashboard.tsx index d56d74a2..4cbdd919 100644 --- a/packages/example/src/containers/Dashboard/Dashboard.tsx +++ b/packages/example/src/containers/Dashboard/Dashboard.tsx @@ -18,7 +18,7 @@ import { Account } from "../../components/Account/Account"; import { MetaMaskConnector } from "../MetaMaskConnector/MetaMaskConnector"; import { MetaMaskContext } from "../../context/metamask"; import { LatestBlock } from "../../components/LatestBlock/LatestBlock"; -import { BlockInfo, Transaction } from "@chainsafe/metamask-polkadot-types"; +import { BlockInfo, SnapNetworks, Transaction } from "@chainsafe/metamask-polkadot-types"; import { MetamaskSnapApi } from "@chainsafe/metamask-polkadot-adapter/build/types"; export const Dashboard = () => { @@ -29,7 +29,7 @@ export const Dashboard = () => { const [publicKey, setPublicKey] = useState(""); const [latestBlock, setLatestBlock] = useState({ hash: "", number: "" }); const [transactions, setTransactions] = useState([]); - const [network, setNetwork] = useState<"kusama" | "westend">("westend"); + const [network, setNetwork] = useState("westend"); const [api, setApi] = useState(null); @@ -38,9 +38,8 @@ export const Dashboard = () => { setTransactions((await api.getAllTransactions())); }, [setTransactions]); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const handleNetworkChange = async (event: React.ChangeEvent<{ value: any }>) => { - const networkName = event.target.value as "kusama" | "westend"; + const handleNetworkChange = async (event: React.ChangeEvent<{ value: unknown }>) => { + const networkName = event.target.value as SnapNetworks; if (networkName === network) return; if (!api) return; await api.setConfiguration({ networkName: networkName }); @@ -98,8 +97,9 @@ export const Dashboard = () => { defaultValue={"westend"} onChange={handleNetworkChange} > - Kusama Westend + Kusama + Polkadot diff --git a/packages/snap/snap.manifest.json b/packages/snap/snap.manifest.json index 32653121..4510d18f 100644 --- a/packages/snap/snap.manifest.json +++ b/packages/snap/snap.manifest.json @@ -7,7 +7,7 @@ "url": "git+https://github.com/chainsafe/metamask-snap-polkadot.git" }, "source": { - "shasum": "Vz+dLpnwiRlDThyNAF1rPHPRpJ0EL+aj6O2kFufWWKI=", + "shasum": "s16b9O989/SN2xnI0vsEqwYQw6zqIn0AoS1P64COrVc=", "location": { "npm": { "filePath": "./dist/bundle.js", diff --git a/packages/snap/src/configuration/index.ts b/packages/snap/src/configuration/index.ts index 7b068104..34aadc73 100644 --- a/packages/snap/src/configuration/index.ts +++ b/packages/snap/src/configuration/index.ts @@ -1,9 +1,17 @@ import {MetamaskState, Wallet} from "../interfaces"; -import {defaultConfiguration, kusamaConfiguration, westendConfiguration} from "./predefined"; +import { + defaultConfiguration, + kusamaConfiguration, + polkadotConfiguration, + westendConfiguration, +} from "./predefined"; import {SnapConfig} from "@chainsafe/metamask-polkadot-types"; export function getDefaultConfiguration(networkName: string): SnapConfig { switch (networkName) { + case "polkadot": + console.log("Polkadot configuration selected"); + return polkadotConfiguration; case "kusama": console.log("Kusama configuration selected"); return kusamaConfiguration; diff --git a/packages/snap/src/configuration/predefined.ts b/packages/snap/src/configuration/predefined.ts index 66729a2f..4f02e12e 100644 --- a/packages/snap/src/configuration/predefined.ts +++ b/packages/snap/src/configuration/predefined.ts @@ -21,4 +21,15 @@ export const westendConfiguration: SnapConfig = { wsRpcUrl: "wss://westend-rpc.polkadot.io/", }; +export const polkadotConfiguration: SnapConfig = { + addressPrefix: 0, + networkName: "polkadot", + unit: { + decimals: 12, + image: "https://polkadot.js.org/apps/static/polkadot-circle.1eea41b2..svg", + symbol: "DOT", + }, + wsRpcUrl: "wss://rpc.polkadot.io/", +}; + export const defaultConfiguration: SnapConfig = westendConfiguration; \ No newline at end of file diff --git a/packages/snap/src/polkadot/account.ts b/packages/snap/src/polkadot/account.ts index e1ea219e..509e1b34 100644 --- a/packages/snap/src/polkadot/account.ts +++ b/packages/snap/src/polkadot/account.ts @@ -4,26 +4,34 @@ import { Keyring } from '@polkadot/keyring'; import { stringToU8a } from "@polkadot/util"; import { getConfiguration } from "../configuration"; import { JsonBIP44CoinTypeNode } from "@metamask/key-tree"; - -const kusamaCoinType = 434; -// const polkadotCoinType = 354; +import { SnapNetworks } from "@chainsafe/metamask-polkadot-types"; /** * Returns KeyringPair if one is saved in wallet state, creates new one otherwise * @param wallet */ export async function getKeyPair(wallet: Wallet): Promise { + const config = await getConfiguration(wallet); const bip44Node = (await wallet.request({ - method: `snap_getBip44Entropy_${kusamaCoinType}`, + method: `snap_getBip44Entropy_${getCoinTypeByNetwork(config.networkName)}`, params: [], })) as JsonBIP44CoinTypeNode; // generate keys const seed = bip44Node.privateKey.slice(0, 32); - const config = await getConfiguration(wallet); const ss58Format = config.addressPrefix; const keyring = new Keyring({ ss58Format }); return keyring.addFromSeed(stringToU8a(seed)); } + +const getCoinTypeByNetwork = (network: SnapNetworks): number => { + switch (network) { + case "kusama": + case "westend": + return 434; + case "polkadot": + return 354; + } +}; diff --git a/packages/snap/test/unit/asset/index.test.ts b/packages/snap/test/unit/asset/index.test.ts index 569273c2..d6363135 100644 --- a/packages/snap/test/unit/asset/index.test.ts +++ b/packages/snap/test/unit/asset/index.test.ts @@ -15,7 +15,7 @@ describe('Test asset functions ', function() { 100, "test-address", { // configuration - networkName: "test-network", + networkName: "westend", unit: { assetId: POLKADOT_SNAP_ASSET_IDENTIFIER, customViewUrl: "custom-view", diff --git a/packages/snap/test/unit/configuration/index.test.ts b/packages/snap/test/unit/configuration/index.test.ts index d62cb8ba..d4ca0dfb 100644 --- a/packages/snap/test/unit/configuration/index.test.ts +++ b/packages/snap/test/unit/configuration/index.test.ts @@ -3,7 +3,7 @@ import sinonChai from "sinon-chai"; import {getConfiguration, getDefaultConfiguration} from "../../../src/configuration"; import {defaultConfiguration, kusamaConfiguration, westendConfiguration} from "../../../src/configuration/predefined"; import {WalletMock} from "../wallet.mock.test"; -import {EmptyMetamaskState, Wallet} from "../../../src/interfaces"; +import {EmptyMetamaskState} from "../../../src/interfaces"; import {SnapConfig} from "@chainsafe/metamask-polkadot-types"; chai.use(sinonChai); @@ -40,7 +40,7 @@ describe('Test configuration functions', function() { }); it('should return configuration saved in state"', async function () { - const customConfiguration: SnapConfig = {addressPrefix: 5, networkName: "test-network", wsRpcUrl: "url"}; + const customConfiguration: SnapConfig = {addressPrefix: 5, networkName: "westend", wsRpcUrl: "url"}; walletStub.request.returns({polkadot: {config: customConfiguration}}); const configuration = await getConfiguration(walletStub); expect(configuration).to.be.deep.eq(customConfiguration); diff --git a/packages/snap/test/unit/polkadot/account.test.ts b/packages/snap/test/unit/polkadot/account.test.ts index 50de545a..f63b9454 100644 --- a/packages/snap/test/unit/polkadot/account.test.ts +++ b/packages/snap/test/unit/polkadot/account.test.ts @@ -17,8 +17,8 @@ describe('Test account function: getKeyPair', function() { }); it('should return keypair', async function() { - walletStub.request.onFirstCall().returns({privateKey: testAppKey}); - walletStub.request.onSecondCall().returns({polkadot: {configuration: westendConfiguration}}); + walletStub.request.onFirstCall().returns({polkadot: {configuration: westendConfiguration}}); + walletStub.request.onSecondCall().returns({privateKey: testAppKey}); const result = await getKeyPair(walletStub); expect(result.address).to.be.eq(testAddress); expect(result.publicKey).to.be.deep.eq(hexToU8a(testPublicKey)); diff --git a/packages/snap/test/unit/rpc/configure.test.ts b/packages/snap/test/unit/rpc/configure.test.ts index fec32a64..618edd22 100644 --- a/packages/snap/test/unit/rpc/configure.test.ts +++ b/packages/snap/test/unit/rpc/configure.test.ts @@ -37,7 +37,7 @@ describe('Test rpc handler function: configure', function() { // stubs const customConfiguration: SnapConfig = { addressPrefix: 1, - networkName: "test-network", + networkName: "westend", unit: {customViewUrl: "custom-view-url", decimals: 1, image: "image", symbol: "TST"}, wsRpcUrl: "ws-rpc-url", diff --git a/packages/snap/test/unit/rpc/getAddress.test.ts b/packages/snap/test/unit/rpc/getAddress.test.ts index 66195109..161041ab 100644 --- a/packages/snap/test/unit/rpc/getAddress.test.ts +++ b/packages/snap/test/unit/rpc/getAddress.test.ts @@ -16,8 +16,8 @@ describe('Test rpc handler function: getAddress', function() { }); it('should return valid address with westend configuration', async function () { - walletStub.request.onFirstCall().returns({ privateKey: testAppKey}); - walletStub.request.onSecondCall().returns({polkadot: {configuration: westendConfiguration}}); + walletStub.request.onFirstCall().returns({polkadot: {configuration: westendConfiguration}}); + walletStub.request.onSecondCall().returns({ privateKey: testAppKey}); const result = await getAddress(walletStub); expect(result).to.be.eq("5DW5CXHWbM13Az7aetLQVUEviNq8WeXFQanHNPVMmzyRYKvX"); }); diff --git a/packages/snap/test/unit/rpc/getPublicKey.test.ts b/packages/snap/test/unit/rpc/getPublicKey.test.ts index aae64992..9c364813 100644 --- a/packages/snap/test/unit/rpc/getPublicKey.test.ts +++ b/packages/snap/test/unit/rpc/getPublicKey.test.ts @@ -16,8 +16,8 @@ describe('Test rpc handler function: getPublicKey', function() { }); it('should return pk', async function () { - walletStub.request.onFirstCall().returns({privateKey: testAppKey}); - walletStub.request.onSecondCall().returns(EmptyMetamaskState()); + walletStub.request.onFirstCall().returns(EmptyMetamaskState()); + walletStub.request.onSecondCall().returns({privateKey: testAppKey}); const result = await getPublicKey(walletStub); expect(result).to.be.eq(testPublicKey); }); diff --git a/packages/snap/test/unit/rpc/substrate/getBalance.test.ts b/packages/snap/test/unit/rpc/substrate/getBalance.test.ts index b6d04958..613b1371 100644 --- a/packages/snap/test/unit/rpc/substrate/getBalance.test.ts +++ b/packages/snap/test/unit/rpc/substrate/getBalance.test.ts @@ -20,8 +20,8 @@ describe('Test rpc handler function: getBalance', function() { it('should return balance on saved keyring in state', async function () { // wallet stub - walletStub.request.onFirstCall().returns({privateKey: testAppKey}); - walletStub.request.onSecondCall().returns(EmptyMetamaskState()); + walletStub.request.onFirstCall().returns(EmptyMetamaskState()); + walletStub.request.onSecondCall().returns({privateKey: testAppKey}); // api stub const apiStub = {query: {system: {account: sinon.stub()}}}; apiStub.query.system.account.returns({data: {free: '0'}} as unknown as AccountInfo); diff --git a/packages/types/index.d.ts b/packages/types/index.d.ts index 2d264848..74943c82 100644 --- a/packages/types/index.d.ts +++ b/packages/types/index.d.ts @@ -125,8 +125,10 @@ export interface UnitConfiguration { customViewUrl?: string; } +export type SnapNetworks = "polkadot" | "kusama" | "westend"; + export interface SnapConfig { - networkName: string; + networkName: SnapNetworks; wsRpcUrl?: string; addressPrefix?: number; unit?: UnitConfiguration;