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

Commit

Permalink
chore: merge unstable into master (#179)
Browse files Browse the repository at this point in the history
* chore: update CI for unstable branch

* fix!: casing of MetaMask (#132)

Fix casing of MetaMask

Co-authored-by: Marin Petrunic <marin.petrunic@gmail.com>

* fix: update ganache, fix test depending on goerli (#144)

* fix: selector issues, useless timeouts, reorganise tests (#145)

* fix: update ganache, fix test depending on goerli

* fix: bugs in selectors, less timeout, reorganise structure

* update yarn

* chore: improve root hooks

* try to increase timeout

* better ci

* add screenshot uploading to ci

* fix screenshot name

* run screenshot on failed test

* fix lint

* change viewport

* fix tests

* fix#123124

* fix tests

* whyyyyyyyyyyyyyyyyyyyyyyyyy

* please

* fix testing dapp

* dunno anymore

* fix lint

* fix typo in selector

* update dapp loading

* refactor script fetching for `index.html`

* fix dam sing test

Co-authored-by: Bernard <bero4net@gmail.com>

* fix: import token flaky (#149)

fix: import-token flakyness

* feat!: update recommended metamask version (#151)

* feat!: update recommended metamask version

* implement screenshot helper

* implement hide portfolio popup action

* implement close what's new modal action

* remove obsolete test

* fix dappeteer methods broken on update

* chore: fix lint

* update metamask version to `10.20.0`

* fix addToken.ts

* address issues

* fix lint

* fix tests

* fix #4

* fix non visible buttons

Co-authored-by: Bernard Stojanović <bero4net@gmail.com>

* chore: change eslint config to chainsafe shared (#152)

* chore: change eslint to chainsafe config

* address PR comments

* address PR comments

* fix tests

* feat: add support for installing metamask flask (#153)

feat: add support for installing metamask flaask

* feat: ability to install snap (#154)

* feat: add support for installing metamask flaask

* feat: ability to install snaps

* fi lint

* fix starting a snap

* fix snap install

Co-authored-by: Bernard <bero4net@gmail.com>

* fix: snap install faster, run all tests (#163)

* fix: run all tests, faster check for installed snap

* fix condition bug

* feat: Add invokeSnap method; update installSnap method parameter; (#159)

* Add invokeSnap method; update installSnap method parameter;

* adjust invokeSnap method after review

* Fix params type in invokeSnap method

* update invokeSnap Return type

* update invokeSnap with generic params

* update test expectation

* fix lint

* feat: add ability to accept dialogs (#138) (#164)

* feat:add ability to accept dialogs (#138)

* fix lint

* move installSnap, invokeSnap to dappeteer api; add bringToFront call to dialog methods

* pair improvements

* fix lint

* add methods snap

* exclude flask tests from global

* exclude flask tests from global

Co-authored-by: Bernard <bero4net@gmail.com>

* feat!:  add playwright support (#167)

* feat!: add playwright support

* fix: lint

* fix: ci matrix

* don't run snap tests on non flask

* address PR comments

* feat: added notification snap to methods-snap #137 (#166)

* pair improvements

* fix lint

* feat: add notify Snap method

* Added getAllNotifications method

* go back after getting all notifications

* remove timeout

* fix post merge errors

Co-authored-by: Bernard <bero4net@gmail.com>
Co-authored-by: Marin Petrunic <marin.petrunic@gmail.com>

* feat: method to bootstrap snap env (#180)

* feat: install snap from local files

* fix: installing and invokeing snaps

* disable addToken test

* disable fail fast

* replace binance smart chain

* chore: node engine requirements (#184)

set engines compatibility for 16 and above

* chore: remove metamask dir (#185)

* fix: remove page param from install snap (#188)

* feat!: replace outdated methods (#189)

* feat!: replaced addTokenMethod

* feat: remove add network method

* chore: Ci enhancement (#193)

* cache yarn and have lint and build as separate steps

* add back yarn.lock

* add jobs

* fix name

* feat: allow signing typed data (#191)

* add test to sign typed data

* add a check to see if the sign button is actually disabled

* clean up

* fix and clean

* remove flackyness

* lint

* fix playwright

* add hidden option for pupeteer types waitForSelector

* remove reload between tests

* fix: fix prompt clicking flakiness, fix multiple snap key permissions (#194)

* add retries when confirming prompts with lower timeout

* better snap error handling, ability to accept multiple key permissions

* bail on first fail

* add context to screenshots

* remove various random timeouts, add wait for overlay, more retrys

* fix lint

* increase timeout for loading network and token details

* address PR comments

* increase timeout

* add retry to profile dropdown

* feat: snap notifications 137 (#187)

* chore: node engine requirements (#184) (#186)

set engines compatibility for 16 and above

Co-authored-by: Bernard Stojanović <bero4net@gmail.com>

* pair improvements

* fix lint

* feat: add notify Snap method

* go back after getting all notifications

* remove timeout

* wip

* Add notification observe method

* update test

* remove unused code

* wip notifiction observer

* wip observer based notifications

* wip observer based notifications

* remove unused dependency

* cleanup

* fixes after merge

* revert method names

* clean waitForNotification method

* emitter solution - FP

* emitter solution - ClassBased

* Cleanup class based emitter

* fix lint

* fixes after merge

* remove p-event library

* remove eslint comment

* update test configuration

* return NotificationList from waitForNotification

* add getNotificationEmitter method

* remove back button

Co-authored-by: Marin Petrunić <mpetrunic@users.noreply.github.com>
Co-authored-by: Bernard Stojanović <bero4net@gmail.com>
Co-authored-by: Marin Petrunic <marin.petrunic@gmail.com>

* chore: Deprecate button clicks for tests (#195)

* sharedConst and signature check

* without sharedConst :)

* request accounts

* request accounts

* long typed data

* short typed data

* add token reject/accept

* add network accept/reject

* actually verify the lock/unlock

* contract interactions

* address comment

* web3-utils 1.3.4

* addToken and addNetwork use boolean

* remove useless wait

* chore: Update documentation and Readme (#202)

* docs

* change to metaMask accross the board and use bootstrap in our test

* MetaMMMMMMask

* snaps methods in API.md

* snaps usage in Readme.md

* Update README.md

Co-authored-by: Marin Petrunić <mpetrunic@users.noreply.github.com>

* address comment

* add forgotten menu item for initSnapEnv

* removing jsdoc

Co-authored-by: Marin Petrunić <mpetrunic@users.noreply.github.com>

* chore: Remove local server for dapp (#203)

* docs

* change to metaMask accross the board and use bootstrap in our test

* MetaMMMMMMask

* snaps methods in API.md

* snaps usage in Readme.md

* init

* lint

* add dev deps for ganache/console.log to make build pass

* Update README.md

Co-authored-by: Marin Petrunić <mpetrunic@users.noreply.github.com>

* address comment

* add forgotten menu item for initSnapEnv

* removing jsdoc

Co-authored-by: Marin Petrunić <mpetrunic@users.noreply.github.com>

* feat: Simplify `installSnap` and `initSnapEnv` apis (#206)

* simplify api

* remove stray comments

* fix undefined opts

* double question mark back :)

* Update src/snap/utils.ts

* 2s for my use case

* test perf

* elegant race with bad name

* chore: update web3 (#217)

chore: upgrade web3.js

* chore: update metamask version (#209)

* update recommended version

* chore: fix timeout for accept dialog (#218)

increase timeout for accept and reject dialog

* fix: increase viewport size (#219)

* Set viewport to most popular desktop resolution; fix for #208

Co-authored-by: Bernard Stojanović <bero4net@gmail.com>

* fix: viewport typo (#220)

fix viewport typo

Co-authored-by: Maarten Zuidhoorn <maarten@zuidhoorn.com>
Co-authored-by: Bernard <bero4net@gmail.com>
Co-authored-by: Anton Lykhoyda <lykhoyda@gmail.com>
Co-authored-by: Thibaut Sardan <33178835+Tbaut@users.noreply.github.com>
  • Loading branch information
5 people committed Dec 15, 2022
1 parent 2d86a6d commit fed0b60
Show file tree
Hide file tree
Showing 121 changed files with 20,839 additions and 3,774 deletions.
82 changes: 4 additions & 78 deletions .eslintrc.js
Original file line number Diff line number Diff line change
@@ -1,79 +1,5 @@
require("@rushstack/eslint-patch/modern-module-resolution");

module.exports = {
root: true,
env: {
mocha: true,
node: true,
es6: true,
},
parser: '@typescript-eslint/parser',
plugins: ['@typescript-eslint', 'eslint-plugin-import', 'prettier'],
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'prettier/@typescript-eslint',
'plugin:prettier/recommended',
],
rules: {
'prettier/prettier': ['error', {}, { usePrettierrc: true }],
'@typescript-eslint/no-require-imports': 'error',
'@typescript-eslint/no-unused-vars': [
'error',
{
varsIgnorePattern: '^_',
},
],
'@typescript-eslint/explicit-function-return-type': [
'error',
{
allowExpressions: true,
},
],
'@typescript-eslint/ban-ts-comment': 'error',
'@typescript-eslint/no-explicit-any': 'error',
'@typescript-eslint/explicit-module-boundary-types': 'error',
'@typescript-eslint/no-use-before-define': 'off',
'prefer-const': 'error',
'no-consecutive-blank-lines': 0,
'no-console': 'error',
'@typescript-eslint/naming-convention': [
'error',
{ selector: 'default', format: ['camelCase'] },
{
selector: ['classProperty', 'parameterProperty', 'objectLiteralProperty', 'classMethod', 'parameter'],
format: ['camelCase'],
leadingUnderscore: 'allow',
},
//variable must be in camel or upper case
{ selector: 'variable', format: ['camelCase', 'UPPER_CASE'], leadingUnderscore: 'allow' },
// {selector: "variable", modifiers: ["global"], format: ["PascalCase", "UPPER_CASE"]},
//classes and types must be in PascalCase
{ selector: ['typeLike', 'enum'], format: ['PascalCase'] },
{ selector: 'enumMember', format: null },
{ selector: 'typeProperty', format: ['PascalCase', 'camelCase'] },
//ignore rules on destructured params
{
selector: 'variable',
modifiers: ['destructured'],
format: null,
},
],
'import/order': [
'error',
{
groups: ['builtin', 'external', 'parent', 'internal', 'sibling'],
'newlines-between': 'always',
alphabetize: {
order: 'asc',
},
},
],
},
overrides: [
{
files: ['**/test/**/*.ts'],
rules: {
'no-console': 'off',
},
},
],
};
extends: "@chainsafe",
}
2 changes: 1 addition & 1 deletion .github/workflows/cron.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: "Validate compatiblity with metamask"
name: "Validate compatiblity with MetaMask"

on:
schedule:
Expand Down
53 changes: 43 additions & 10 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,66 @@ on:
push:
branches:
- master
- unstable
pull_request:
branches:
- '**'

jobs:
checks:
name: Checks
tests:
name: Tests
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
mm-version: [mm, flask]
automation: [playwright, puppeteer]
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
cache: yarn
node-version: "16"
cache: 'yarn'
- name: Install
run: yarn install --frozen-lockfile
- name: Build
run: yarn run build
run: yarn --prefer-offline --frozen-lockfile
- name: Tests
run: 'xvfb-run --auto-servernum --server-args="-screen 0, 1920x1080x24" yarn run test:${{matrix.automation}}:${{ matrix.mm-version }} --timeout 50000'
- uses: actions/upload-artifact@v3
if: always()
with:
name: debug_screenshots
path: ./*.png
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: "16"
cache: 'yarn'
- name: Install deps
run: yarn --prefer-offline --frozen-lockfile
- name: Lint
run: yarn run lint
- name: Tests
run: xvfb-run --auto-servernum yarn run test
build:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: "16"
cache: 'yarn'
- name: Install deps
run: yarn --prefer-offline --frozen-lockfile
- name: Build
run: yarn build

maybe-release:
name: release
runs-on: ubuntu-latest
needs: [checks]
needs: [tests, lint, build]
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
steps:
- uses: google-github-actions/release-please-action@v3 # it will analyze commits and create PR with new version and updated CHANGELOG:md file. On merging it will create github release page with changelog
Expand All @@ -50,7 +83,7 @@ jobs:
registry-url: 'https://registry.npmjs.org'
if: ${{ steps.release.outputs.release_created }}

- run: yarn install --frozen-lockfile
- run: yarn --prefer-offline --frozen-lockfile
if: ${{ steps.release.outputs.release_created }}

- run: yarn build
Expand Down
4 changes: 2 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
*DS_Store
node_modules
test/server/data.js
build
dist
.vscode/
/metamask
/.metamask
.idea
*.log
test/dapp/data.js
*.png
7 changes: 7 additions & 0 deletions .mocharc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
parallel: false
recursive: true
color: true
timeout: 20000
exit: true
spec:
- 'test/**/*.spec.ts'
7 changes: 0 additions & 7 deletions .prettierrc.js

This file was deleted.

83 changes: 71 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,28 +12,87 @@ $ yarn add @chainsafe/dappeteer
## Usage

```js
import puppeteer from 'puppeteer';
import dappeteer from '@chainsafe/dappeteer';

async function main() {
const [metamask, page] = await dappeteer.bootstrap(puppeteer, { metamaskVersion: 'v10.15.0' });
const { metaMask, browser } = await dappeteer.bootstrap();

// create a new page and visit your dapp
const dappPage = browser.newPage();
await dappPage.goto('http://my-dapp.com');

// you can change the network if you want
await metamask.switchNetwork('ropsten');
await metaMask.switchNetwork('goerli');

// you can import a token
await metamask.addToken({
tokenAddress: '0x4f96fe3b7a6cf9725f59d353f723c1bdb64ca6aa',
symbol: 'KAKI',
});
// do something in your dapp that prompts MetaMask to add a Token
const addTokenButton = await dappPage.$('#add-token');
await addTokenButton.click();
// instruct MetaMask to accept this request
await metaMask.acceptAddToken();

// go to a dapp and do something that prompts MetaMask to confirm a transaction
await page.goto('http://my-dapp.com');
const payButton = await page.$('#pay-with-eth');
// do something that prompts MetaMask to confirm a transaction
const payButton = await dappPage.$('#pay-with-eth');
await payButton.click();

// 🏌
await metamask.confirmTransaction();
await metaMask.confirmTransaction();
}

main();
```

## Usage with Snaps

```js
import dappeteer from '@chainsafe/dappeteer';
import { exec } from "child_process";

async function buildSnap(): Promise<string> {
console.log(`Building my-snap...`);
await new Promise((resolve, reject) => {
exec(`cd ./my-snap && npx mm-snap build`, (error, stdout) => {
if (error) {
reject(error);
return;
}
resolve(stdout);
});
});

return "./my-snap";
}

async function main() {
// you need to have a webpage open to interact with MetaMask, you can also visit a dApp page
const dappPage = browser.newPage();
await dappPage.goto('http://example.org/');

// build your local snap
const builtSnapDir = await buildSnap()

// setup dappateer and install your snap
const { snapId, metaMask, dappPage } = await dappeteer.initSnapEnv({
snapIdOrLocation: builtSnapDir
});

// invoke a method from your snap that promps users with approve/reject dialog
metaMask.snaps.invokeSnap(dappPage, snapId, "my-method")

// instruct MetaMask to accept this request
await metaMask.snaps.acceptDialog();

// get the notification emitter and the promise that will receive the notifications
const emitter = await metaMask.snaps.getNotificationEmitter();
const notificationPromise = emitter.waitForNotification();

// do something that prompts you snap to emit notifications
await metaMask.snaps.invokeSnap(dappPage, snapId, "notify");

// Make sure the notification promise has resolved
await notificationPromise;

// You can now read the snap notifications and run tests against them
const notifications = await metaMask.snaps.getAllNotifications();
}

main();
Expand Down
Loading

0 comments on commit fed0b60

Please sign in to comment.