Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

feat: Add invokeSnap method; update installSnap method parameter; #159

Merged
merged 8 commits into from
Oct 26, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/snap/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export { flaskOnly } from "./utils";
export { installSnap } from "./install";
export { invokeSnap } from "./invokeSnap";
5 changes: 3 additions & 2 deletions src/snap/install.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,13 @@ export async function installSnap(
hasKeyPermissions: boolean;
customSteps?: InstallStep[];
version?: string;
}
},
installationSnapUrl: string = "https://google.com"
): Promise<void> {
flaskOnly(page);
//need to open page to access window.ethereum
const installPage = await page.browser().newPage();
await installPage.goto("https://google.com");
await installPage.goto(installationSnapUrl);
const installAction = installPage.evaluate(
(opts: { snapId: string; version?: string }) =>
window.ethereum.request({
Expand Down
31 changes: 31 additions & 0 deletions src/snap/invokeSnap.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { Page } from "puppeteer";
import { SnapInstallationParamNames } from "../types";
import { flaskOnly } from "./utils";

export async function invokeSnap(
page: Page,
snapId: string,
method: string,
params: Record<SnapInstallationParamNames, any> = {}
): Promise<Partial<any>> {
flaskOnly(page);
return page.evaluate(
async (opts: {
snapId: string;
method: string;
params: Record<SnapInstallationParamNames, any>;
}) => {
return window.ethereum.request({
method: "wallet_invokeSnap",
params: [
`${opts.snapId}`,
{
method: opts.method,
...opts.params,
},
],
});
},
{ snapId, method, params }
);
}
9 changes: 9 additions & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
import * as puppeteer from "puppeteer";

import { MetaMaskInpageProvider } from "@metamask/providers";
import { Path } from "./setup/metaMaskDownloader";

import { RECOMMENDED_METAMASK_VERSION } from "./index";

declare global {
interface Window {
ethereum: MetaMaskInpageProvider;
}
}

export type LaunchOptions = (OfficialOptions | CustomOptions) & {
//install flask (canary) version of metamask.
metaMaskFlask?: boolean;
Expand Down Expand Up @@ -53,6 +60,8 @@ export type TransactionOptions = {
priority?: number;
};

export type SnapInstallationParamNames = "version" | string;

export type Dappeteer = {
lock: () => Promise<void>;
unlock: (password: string) => Promise<void>;
Expand Down
53 changes: 40 additions & 13 deletions test/flask/snaps.spec.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
import * as dappeteer from "../../src";
import { installSnap } from "../../src/snap";
import { installSnap, invokeSnap } from "../../src/snap";
import { TestContext } from "../constant";
import { Snaps } from "../deploy";
import { toUrl } from "../utils/utils";
import { clickOnButton } from "../../src/helpers";

function getSnapIdByName(testContext: TestContext, snapName: Snaps): string {
return `local:${toUrl(testContext.snapServers[snapName].address())}`;
}

describe.only("snaps", function () {
let metamask: dappeteer.Dappeteer;
Expand All @@ -19,20 +24,16 @@ describe.only("snaps", function () {
});

it("should install base snap from npm", async function (this: TestContext) {
await installSnap(
metamask.page,
"local:" + toUrl(this.snapServers[Snaps.BASE_SNAP].address()),
{
hasPermissions: false,
hasKeyPermissions: false,
}
);
await installSnap(metamask.page, getSnapIdByName(this, Snaps.BASE_SNAP), {
hasPermissions: false,
hasKeyPermissions: false,
});
});

it("should install permissions snap from npm", async function (this: TestContext) {
await installSnap(
metamask.page,
"local:" + toUrl(this.snapServers[Snaps.PERMISSIONS_SNAP].address()),
getSnapIdByName(this, Snaps.PERMISSIONS_SNAP),
{
hasPermissions: true,
hasKeyPermissions: false,
Expand All @@ -41,13 +42,39 @@ describe.only("snaps", function () {
});

it("should install keys snap from npm", async function (this: TestContext) {
await installSnap(metamask.page, getSnapIdByName(this, Snaps.KEYS_SNAP), {
hasPermissions: true,
hasKeyPermissions: true,
});
});

it("should invoke provided snap method", async function (this: TestContext) {
const snapAddress = "http://localhost:8545";
await installSnap(
metamask.page,
"local:" + toUrl(this.snapServers[Snaps.KEYS_SNAP].address()),
getSnapIdByName(this, Snaps.PERMISSIONS_SNAP),
{
hasPermissions: true,
hasKeyPermissions: true,
}
hasKeyPermissions: false,
},
snapAddress
);

const testPage = await metamask.page.browser().newPage();
await testPage.goto(snapAddress);

const invokeAction = invokeSnap(
testPage,
getSnapIdByName(this, Snaps.PERMISSIONS_SNAP),
"hello",
{ version: "latest" }
);

await metamask.page.bringToFront();
await metamask.page.reload();

await clickOnButton(metamask.page, "Approve");

await invokeAction;
});
});