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 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 2717988e4..7722a9d7f 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", "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 +} 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",