From 9f8731a06a641fc85b1102231a027f719cd039ef Mon Sep 17 00:00:00 2001 From: Taylor Dawson Date: Mon, 26 Sep 2022 12:10:18 -0700 Subject: [PATCH 1/3] Add Database property --- .github/workflows/issue-to-notion.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/issue-to-notion.yml b/.github/workflows/issue-to-notion.yml index fb5843884..e1ce264d4 100644 --- a/.github/workflows/issue-to-notion.yml +++ b/.github/workflows/issue-to-notion.yml @@ -15,13 +15,14 @@ jobs: -H 'Authorization: Bearer '"$NOTION_TOKEN"'' \ -H "Content-Type: application/json" \ -H "Notion-Version: 2022-02-22" \ - --data '{"parent":{"type":"database_id","database_id":"'"$DATABASE_ID"'"},"icon":{"type":"emoji","emoji":"🐛"},"properties":{"Name":{"type":"title","title":[{"type":"text","text":{"content":"'"$(echo $TITLE | tr '"' "'")"'"}}]},"Assigned":{"people":['${people:0:-1}']},"Status":{"select":{"name":"'"$STATUS"'"}},"Flag":{"multi_select":[{"name":"'"$FLAG"'"}]},"Type":{"multi_select":[{"name":"bug"}]},"Project":{"multi_select":[{"name":"'"$PROJECT_NAME"'"}]}},"children":[{"object":"block","type":"bookmark","bookmark":{"url":"'"$ISSUE_URL"'"}}]}' + --data '{"parent":{"type":"database_id","database_id":"'"$DATABASE_ID"'"},"icon":{"type":"emoji","emoji":"🐛"},"properties":{"Name":{"type":"title","title":[{"type":"text","text":{"content":"'"$(echo $TITLE | tr '"' "'")"'"}}]},"Assigned":{"people":['${people:0:-1}']},"Status":{"select":{"name":"'"$STATUS"'"}},"Flag":{"multi_select":[{"name":"'"$FLAG"'"}]},"Database":{"multi_select":[{"name":"'"$DATABASE_NAME"'"}]},"Type":{"multi_select":[{"name":"bug"}]},"Project":{"multi_select":[{"name":"'"$PROJECT_NAME"'"}]}},"children":[{"object":"block","type":"bookmark","bookmark":{"url":"'"$ISSUE_URL"'"}}]}' env: NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }} STATE: ${{ github.event.issue.state }} ISSUE_URL: ${{ github.event.issue.html_url }} TITLE: ${{ github.event.issue.title }} FLAG: Github + DATABASE_NAME: Product STATUS: Backlog # Product Work Board DATABASE_ID: 69f0e513a59d445b87a1baed729c75c5 From 5afbc9cb214b9ed27140999ac78c1232c611b726 Mon Sep 17 00:00:00 2001 From: Aaron Date: Wed, 28 Sep 2022 12:17:04 +1000 Subject: [PATCH 2/3] Sync accounts functionality (#1301) --- packages/core/package.json | 2 +- packages/core/src/provider.ts | 83 +++++++++++++++++++++++++++++------ packages/core/src/types.ts | 12 +++++ 3 files changed, 83 insertions(+), 14 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index 2717988e4..3ccad440b 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@web3-onboard/core", - "version": "2.8.5", + "version": "2.9.0-alpha.1", "description": "Web3-Onboard makes it simple to connect Ethereum hardware and software wallets to your dapp. Features standardized spec compliant web3 providers for all supported wallets, framework agnostic modern javascript UI with code splitting, CSS customization, multi-chain and multi-account support, reactive wallet state subscriptions and real-time transaction state change notifications.", "keywords": [ "Ethereum", diff --git a/packages/core/src/provider.ts b/packages/core/src/provider.ts index 21262163f..4da16c9e0 100644 --- a/packages/core/src/provider.ts +++ b/packages/core/src/provider.ts @@ -2,6 +2,13 @@ import { fromEventPattern, Observable } from 'rxjs' import { filter, takeUntil, take, share, switchMap } from 'rxjs/operators' import partition from 'lodash.partition' import { providers } from 'ethers' +import { weiToEth } from '@web3-onboard/common' +import { disconnectWallet$ } from './streams.js' +import { updateAccount, updateWallet } from './store/actions.js' +import { validEnsChain } from './utils.js' +import disconnect from './disconnect.js' +import { state } from './store/index.js' +import { getBlocknativeSdk } from './services.js' import type { ChainId, @@ -14,14 +21,14 @@ import type { SelectAccountsRequest } from '@web3-onboard/common' -import { weiToEth } from '@web3-onboard/common' -import { disconnectWallet$ } from './streams.js' -import type { Account, Address, Balances, Ens, WalletState } from './types.js' -import { updateAccount, updateWallet } from './store/actions.js' -import { validEnsChain } from './utils.js' -import disconnect from './disconnect.js' -import { state } from './store/index.js' -import { getBlocknativeSdk } from './services.js' +import type { + Account, + Address, + Balances, + Ens, + WalletPermission, + WalletState +} from './types.js' export const ethersProviders: { [key: string]: providers.StaticJsonRpcProvider @@ -112,6 +119,17 @@ export function trackWallet( // when account changed, set it to first account and subscribe to events accountsChanged$.subscribe(async ([address]) => { + // sync accounts with internal state + // in the case of an account has been manually disconnected + try { + await syncWalletConnectedAccounts(label) + } catch (error) { + console.warn( + 'Web3Onboard: Error whilst trying to sync connected accounts:', + error + ) + } + // no address, then no account connected, so disconnect wallet // this could happen if user locks wallet, // or if disconnects app from wallet @@ -180,11 +198,12 @@ export function trackWallet( const balanceProm = getBalance(address, chain) const account = accounts.find(account => account.address === address) - const ensProm = account.ens - ? Promise.resolve(account.ens) - : validEnsChain(connectedWalletChain.id) - ? getEns(address, chain) - : Promise.resolve(null) + const ensProm = + account && account.ens + ? Promise.resolve(account.ens) + : validEnsChain(connectedWalletChain.id) + ? getEns(address, chain) + : Promise.resolve(null) return Promise.all([Promise.resolve(address), balanceProm, ensProm]) }) @@ -390,3 +409,41 @@ export function addNewChain( ] }) } + +export async function getPermissions( + provider: EIP1193Provider +): Promise { + try { + const permissions = (await provider.request({ + method: 'wallet_getPermissions' + })) as WalletPermission[] + + return Array.isArray(permissions) ? permissions : [] + } catch (error) { + return [] + } +} + +export async function syncWalletConnectedAccounts( + label: WalletState['label'] +): Promise { + const wallet = state.get().wallets.find(wallet => wallet.label === label) + const permissions = await getPermissions(wallet.provider) + const accountsPermissions = permissions.find( + ({ parentCapability }) => parentCapability === 'eth_accounts' + ) + + if (accountsPermissions) { + const { value: connectedAccounts } = accountsPermissions.caveats.find( + ({ type }) => type === 'restrictReturnedAccounts' + ) || { value: null } + + if (connectedAccounts) { + const syncedAccounts = wallet.accounts.filter(({ address }) => + connectedAccounts.includes(address) + ) + + updateWallet(wallet.label, { ...wallet, accounts: syncedAccounts }) + } + } +} diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index fd0659d92..65b591ba4 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -343,3 +343,15 @@ export type DeviceNotBrowser = { os: null browser: null } + +export type WalletPermission = { + id: string + parentCapability: string + invoker: string + caveats: { + type: string + value: string[] + }[] + + date: number +} From 9e93f1b10e6893b0ef2f4c59217585fe0f766dba Mon Sep 17 00:00:00 2001 From: Aaron Date: Mon, 3 Oct 2022 10:49:45 +1100 Subject: [PATCH 3/3] Increment versions --- package.json | 2 +- packages/core/package.json | 2 +- packages/demo/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index ca9ac7484..712c5c490 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "web3-onboard-monorepo", - "version": "2.12.0", + "version": "2.13.0", "private": true, "workspaces": { "packages": [ diff --git a/packages/core/package.json b/packages/core/package.json index 3ccad440b..7722a9d7f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@web3-onboard/core", - "version": "2.9.0-alpha.1", + "version": "2.9.0", "description": "Web3-Onboard makes it simple to connect Ethereum hardware and software wallets to your dapp. Features standardized spec compliant web3 providers for all supported wallets, framework agnostic modern javascript UI with code splitting, CSS customization, multi-chain and multi-account support, reactive wallet state subscriptions and real-time transaction state change notifications.", "keywords": [ "Ethereum", diff --git a/packages/demo/package.json b/packages/demo/package.json index 80a1b149a..3b042a2bd 100644 --- a/packages/demo/package.json +++ b/packages/demo/package.json @@ -23,7 +23,7 @@ }, "dependencies": { "@web3-onboard/coinbase": "^2.1.3", - "@web3-onboard/core": "^2.8.5", + "@web3-onboard/core": "^2.9.0", "@web3-onboard/dcent": "^2.2.1", "@web3-onboard/fortmatic": "^2.0.14", "@web3-onboard/gas": "^2.1.3",