diff --git a/docs/package.json b/docs/package.json index 22bbba9b3..5990eb1ff 100644 --- a/docs/package.json +++ b/docs/package.json @@ -52,7 +52,7 @@ "@web3-onboard/blocto": "^2.0.0-alpha.1", "@web3-onboard/cede-store": "^2.0.2", "@web3-onboard/coinbase": "^2.2.4", - "@web3-onboard/core": "^2.20.2-alpha.1", + "@web3-onboard/core": "^2.20.3-alpha.1", "@web3-onboard/dcent": "^2.2.7", "@web3-onboard/enkrypt": "^2.0.4", "@web3-onboard/fortmatic": "^2.0.19", @@ -61,7 +61,7 @@ "@web3-onboard/gas": "^2.1.8", "@web3-onboard/gnosis": "^2.1.10", "@web3-onboard/infinity-wallet": "^2.0.4", - "@web3-onboard/injected-wallets": "^2.10.1-alpha.1", + "@web3-onboard/injected-wallets": "^2.10.1", "@web3-onboard/keepkey": "^2.3.7", "@web3-onboard/keystone": "^2.3.7", "@web3-onboard/ledger": "^2.4.6", diff --git a/docs/src/routes/docs/[...3]modules/[...1]core/+page.md b/docs/src/routes/docs/[...3]modules/[...1]core/+page.md index 2a9472b03..13eb3608b 100644 --- a/docs/src/routes/docs/[...3]modules/[...1]core/+page.md +++ b/docs/src/routes/docs/[...3]modules/[...1]core/+page.md @@ -223,6 +223,18 @@ type RecommendedInjectedWallets = { } ``` +**`updateAppMetadata`** + +If you need to update your Application Metadata after initialization, you can call the `updateAppMetadata` function with the new configuration + +```typescript +onboard.state.actions.updateAppMetadata({ + logo: ` + `, + description: 'Updated Description!' +}) +``` + --- #### connect diff --git a/docs/src/routes/docs/[...4]wallets/[...24]walletconnect/+page.md b/docs/src/routes/docs/[...4]wallets/[...24]walletconnect/+page.md index 5563381c8..7469bf8ae 100644 --- a/docs/src/routes/docs/[...4]wallets/[...24]walletconnect/+page.md +++ b/docs/src/routes/docs/[...4]wallets/[...24]walletconnect/+page.md @@ -1,5 +1,5 @@ --- -title: Walletconnect +title: WalletConnect --- # {$frontmatter.title} @@ -116,7 +116,16 @@ const onboard = Onboard({ wallets: [ walletConnect //... other wallets - ] + ], + chains: [ // chains that are passed as optional chains to WC wallet after cleaning and parsing as number[] + { + id: '0x89', + token: 'MATIC', + label: 'Polygon', + rpcUrl: 'https://matic-mainnet.chainstacklabs.com' + } + // ... + ] }) const connectedWallets = await onboard.connectWallet() diff --git a/packages/core/README.md b/packages/core/README.md index 4588eec01..29185c9b7 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -193,6 +193,20 @@ type RecommendedInjectedWallets = { } ``` +**`updateAppMetadata`** + +If you need to update your Application Metadata after initialization, you can call the `updateAppMetadata` function with the new configuration + +```typescript +onboard.state.actions.updateAppMetadata({ + logo: ` + `, + description: 'Updated Description!' +}) +``` + +--- + **`connect`** An object that allows for customization of the Connect Modal and accepts the type ConnectModalOptions. diff --git a/packages/core/package.json b/packages/core/package.json index 9bf6c3e1b..0d012e3a8 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@web3-onboard/core", - "version": "2.20.2", + "version": "2.20.3", "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/configuration.ts b/packages/core/src/configuration.ts index a05769039..b1687f78d 100644 --- a/packages/core/src/configuration.ts +++ b/packages/core/src/configuration.ts @@ -3,7 +3,6 @@ import { getDevice } from './utils.js' export let configuration: Configuration = { svelteInstance: null, - appMetadata: null, apiKey: null, device: getDevice(), initialWalletInit: [], diff --git a/packages/core/src/constants.ts b/packages/core/src/constants.ts index 073ace4f8..e4a0e7989 100644 --- a/packages/core/src/constants.ts +++ b/packages/core/src/constants.ts @@ -26,7 +26,8 @@ export const APP_INITIAL_STATE: AppState = { connect: { showSidebar: true, disableClose: false - } + }, + appMetadata: null, } export const STORAGE_KEYS = { diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 1d102b069..8f14541b8 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -32,7 +32,8 @@ import { setPrimaryWallet, setWalletModules, updateConnectModal, - updateTheme + updateTheme, + updateAppMetadata } from './store/actions.js' import type { PatchedEIP1193Provider } from '@web3-onboard/transaction-preview' import { getBlocknativeSdk } from './services.js' @@ -53,7 +54,8 @@ const API = { updateBalances, updateAccountCenter, setPrimaryWallet, - updateTheme + updateTheme, + updateAppMetadata } } } @@ -92,7 +94,7 @@ function init(options: InitOptions): OnboardAPI { const { wallets, chains, - appMetadata = null, + appMetadata, i18n, accountCenter, apiKey, @@ -208,7 +210,6 @@ function init(options: InitOptions): OnboardAPI { const app = svelteInstance || mountApp(theme, disableFontDownload) updateConfiguration({ - appMetadata, svelteInstance: app, apiKey, initialWalletInit: wallets, @@ -217,6 +218,8 @@ function init(options: InitOptions): OnboardAPI { unstoppableResolution }) + appMetadata && updateAppMetadata(appMetadata) + if (apiKey && transactionPreview) { const getBnSDK = async () => { transactionPreview.init({ diff --git a/packages/core/src/store/actions.ts b/packages/core/src/store/actions.ts index 1f3f892f5..b813ec2e0 100644 --- a/packages/core/src/store/actions.ts +++ b/packages/core/src/store/actions.ts @@ -1,4 +1,4 @@ -import type { Chain, WalletInit, WalletModule } from '@web3-onboard/common' +import type { AppMetadata, Chain, WalletInit, WalletModule } from '@web3-onboard/common' import { nanoid } from 'nanoid' import { dispatch } from './index.js' import { configuration } from '../configuration.js' @@ -29,7 +29,8 @@ import type { ConnectModalOptions, UpdateConnectModalAction, Theme, - UpdateChainsAction + UpdateChainsAction, + UpdateAppMetadataAction } from '../types.js' import { @@ -45,7 +46,8 @@ import { validateNotify, validateConnectModalUpdate, validateUpdateTheme, - validateSetChainOptions + validateSetChainOptions, + validateAppMetadataUpdate } from '../validation.js' import { @@ -63,7 +65,8 @@ import { REMOVE_NOTIFICATION, UPDATE_ALL_WALLETS, UPDATE_CONNECT_MODAL, - UPDATE_CHAINS + UPDATE_CHAINS, + UPDATE_APP_METADATA } from './constants.js' export function addChains(chains: Chain[]): void { @@ -438,3 +441,20 @@ export function updateTheme(theme: Theme): void { const themingObj = returnTheme(theme) themingObj && handleThemeChange(themingObj) } + +export function updateAppMetadata( + update: AppMetadata| Partial +): void { + const error = validateAppMetadataUpdate(update) + + if (error) { + throw error + } + + const action = { + type: UPDATE_APP_METADATA, + payload: update + } + + dispatch(action as UpdateAppMetadataAction) +} diff --git a/packages/core/src/store/constants.ts b/packages/core/src/store/constants.ts index d9d2c0e9f..16ac82d9f 100644 --- a/packages/core/src/store/constants.ts +++ b/packages/core/src/store/constants.ts @@ -13,3 +13,4 @@ export const UPDATE_NOTIFY = 'update_notify' export const ADD_NOTIFICATION = 'add_notification' export const REMOVE_NOTIFICATION = 'remove_notification' export const UPDATE_ALL_WALLETS = 'update_balance' +export const UPDATE_APP_METADATA = 'update_app_metadata' diff --git a/packages/core/src/store/index.ts b/packages/core/src/store/index.ts index f9d240f1d..1d39323d6 100644 --- a/packages/core/src/store/index.ts +++ b/packages/core/src/store/index.ts @@ -19,7 +19,8 @@ import type { RemoveNotificationAction, UpdateAllWalletsAction, UpdateConnectModalAction, - UpdateChainsAction + UpdateChainsAction, + UpdateAppMetadataAction } from '../types.js' import { @@ -37,7 +38,8 @@ import { ADD_NOTIFICATION, REMOVE_NOTIFICATION, UPDATE_ALL_WALLETS, - UPDATE_CHAINS + UPDATE_CHAINS, + UPDATE_APP_METADATA } from './constants.js' function reducer(state: AppState, action: Action): AppState { @@ -218,6 +220,18 @@ function reducer(state: AppState, action: Action): AppState { } } + case UPDATE_APP_METADATA: { + const update = payload as UpdateAppMetadataAction['payload'] + + return { + ...state, + appMetadata: { + ...state.appMetadata, + ...update + } + } + } + case RESET_STORE: return APP_INITIAL_STATE diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 2ec8dc5be..eb4739a02 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -179,7 +179,8 @@ export interface AppState { locale: Locale notify: Notify notifications: Notification[] - connect: ConnectModalOptions + connect: ConnectModalOptions, + appMetadata: AppMetadata } export type Configuration = { @@ -428,7 +429,8 @@ export type Action = | AddNotificationAction | RemoveNotificationAction | UpdateAllWalletsAction - | UpdateConnectModalAction + | UpdateConnectModalAction + | UpdateAppMetadataAction export type AddChainsAction = { type: 'add_chains'; payload: Chain[] } export type UpdateChainsAction = { type: 'update_chains'; payload: Chain } @@ -494,6 +496,11 @@ export type UpdateAllWalletsAction = { payload: WalletState[] } +export type UpdateAppMetadataAction = { + type: 'update_app_metadata' + payload: AppMetadata | Partial +} + // ==== MISC ==== // export type ChainStyle = { icon: string diff --git a/packages/core/src/utils.ts b/packages/core/src/utils.ts index 98607da23..66663bc73 100644 --- a/packages/core/src/utils.ts +++ b/packages/core/src/utils.ts @@ -212,6 +212,10 @@ export const chainStyles: Record = { '0x14a33': { icon: baseIcon, color: '#0259F9' + }, + '0x80001': { + icon: polygonIcon, + color: '#8247E5' } } diff --git a/packages/core/src/validation.ts b/packages/core/src/validation.ts index 19b35bc09..5737190c3 100644 --- a/packages/core/src/validation.ts +++ b/packages/core/src/validation.ts @@ -9,7 +9,8 @@ import { chainNamespaceValidation, chainIdValidation, chainValidation, - validate + validate, + AppMetadata } from '@web3-onboard/common' import type { @@ -128,6 +129,19 @@ const appMetadata = Joi.object({ agreement }) +const appMetadataUpdate = Joi.object({ + name: Joi.string(), + description: Joi.string(), + icon: Joi.string(), + logo: Joi.string(), + gettingStartedGuide: Joi.string(), + email: Joi.string(), + appUrl: Joi.string(), + explore: Joi.string(), + recommendedInjectedWallets: Joi.array().items(recommendedWallet), + agreement +}) + const walletModule = Joi.object({ label: Joi.string().required(), getInfo: Joi.function().arity(1).required(), @@ -432,3 +446,9 @@ export function validateUpdateBalances(data: WalletState[]): ValidateReturn { export function validateUpdateTheme(data: Theme): ValidateReturn { return validate(theme, data) } + +export function validateAppMetadataUpdate( + data: AppMetadata | Partial +): ValidateReturn { + return validate(appMetadataUpdate, data) +} diff --git a/packages/core/src/views/account-center/AccountCenterPanel.svelte b/packages/core/src/views/account-center/AccountCenterPanel.svelte index 105308402..94d778ebd 100644 --- a/packages/core/src/views/account-center/AccountCenterPanel.svelte +++ b/packages/core/src/views/account-center/AccountCenterPanel.svelte @@ -23,6 +23,7 @@ import DisconnectAllConfirm from './DisconnectAllConfirm.svelte' import { configuration } from '../../configuration.js' import SecondaryTokenTable from './SecondaryTokenTable.svelte' + import { shareReplay, startWith } from 'rxjs' export let expanded: boolean @@ -31,7 +32,6 @@ } const { chains: appChains } = state.get() - const { appMetadata } = configuration let disconnectConfirmModal = false let hideWalletRowMenu: () => void @@ -52,6 +52,10 @@ connectedChain && connectedChain.id ) + const appMetadata$ = state + .select('appMetadata') + .pipe(startWith(state.get().appMetadata), shareReplay(1)) + const { position } = state.get().accountCenter const { device } = configuration @@ -393,7 +397,7 @@
- {#if appMetadata} + {#if $appMetadata$}
@@ -403,21 +407,21 @@ background="white" border="black" radius={8} - icon={(appMetadata && appMetadata.icon) || questionIcon} + icon={($appMetadata$ && $appMetadata$.icon) || questionIcon} />
- {(appMetadata && appMetadata.name) || 'App Name'} + {($appMetadata$ && $appMetadata$.name) || 'App Name'}
- {(appMetadata && appMetadata.description) || + {($appMetadata$ && $appMetadata$.description) || 'This app has not added a description.'}
- {#if appMetadata.gettingStartedGuide || appMetadata.explore} + {#if $appMetadata$ && ($appMetadata$.gettingStartedGuide || $appMetadata$.explore)}
{$_('accountCenter.appInfo', { @@ -425,7 +429,7 @@ })}
- {#if appMetadata.gettingStartedGuide} + {#if $appMetadata$.gettingStartedGuide}
{$_('accountCenter.learnMore', { @@ -433,7 +437,7 @@ })}
@@ -444,7 +448,7 @@
{/if} - {#if appMetadata.explore} + {#if $appMetadata$.explore} diff --git a/packages/core/src/views/account-center/AcctCenterTriggerSmall.svelte b/packages/core/src/views/account-center/AcctCenterTriggerSmall.svelte index 456f36069..2d57fa663 100644 --- a/packages/core/src/views/account-center/AcctCenterTriggerSmall.svelte +++ b/packages/core/src/views/account-center/AcctCenterTriggerSmall.svelte @@ -4,12 +4,12 @@ import { questionIcon } from '../../icons/index.js' import { WalletAppBadge, SuccessStatusIcon } from '../shared/index.js' import { state } from '../../store/index.js' - import { configuration } from '../../configuration.js' export let toggle: () => void - const { appMetadata } = configuration - const appIcon = (appMetadata && appMetadata.icon) || questionIcon + const appMetadata$ = state + .select('appMetadata') + .pipe(startWith(state.get().appMetadata), shareReplay(1)) $: [primaryWallet] = $wallets$ @@ -89,7 +89,7 @@ background={'white'} border="darkGreen" radius={8} - icon={appIcon} + icon={($appMetadata$ && $appMetadata$.icon) || questionIcon} />
diff --git a/packages/core/src/views/chain/SwitchChain.svelte b/packages/core/src/views/chain/SwitchChain.svelte index ab2a36c4b..6846d3149 100644 --- a/packages/core/src/views/chain/SwitchChain.svelte +++ b/packages/core/src/views/chain/SwitchChain.svelte @@ -4,14 +4,15 @@ import en from '../../i18n/en.json' import CloseButton from '../shared/CloseButton.svelte' import Modal from '../shared/Modal.svelte' - import { configuration } from '../../configuration.js' - const { appMetadata } = configuration const nextNetworkName = $switchChainModal$.chain.label function close() { switchChainModal$.next(null) } + const appMetadata$ = state + .select('appMetadata') + .pipe(startWith(state.get().appMetadata), shareReplay(1))