diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml
new file mode 100644
index 000000000..078574c42
--- /dev/null
+++ b/.github/workflows/dependency-review.yml
@@ -0,0 +1,19 @@
+name: 'Dependency Review'
+on: [pull_request]
+
+permissions:
+ contents: read
+ pull-requests: write
+
+jobs:
+ dependency-review:
+ runs-on: ubuntu-latest
+ steps:
+ - name: 'Checkout Repository'
+ uses: actions/checkout@v5
+ - name: 'Dependency Review'
+ uses: actions/dependency-review-action@v4
+ with:
+ comment-summary-in-pr: on-failure
+ fail-on-severity: moderate
+ license-check: false
diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml
index f944a0ec8..e88d0b605 100644
--- a/.github/workflows/quality.yml
+++ b/.github/workflows/quality.yml
@@ -16,7 +16,7 @@ jobs:
node-version: 16
- name: Use node_modules cache
- uses: actions/cache@v2
+ uses: actions/cache@v3
with:
path: '**/node_modules'
key: ${{ runner.os }}-modules-${{ hashFiles('**/pnpm-lock.yaml') }}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 47c0fe2a3..c8a4592a9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,31 @@
+# 1.9.1
+
+This update includes updates to the peer dependencies and improvements to the Family Accounts features.
+
+## Updated
+
+- `family` package updated to latest.
+
+## Improved
+
+- Improved support for `family` features.
+
+# 1.9.0
+
+We're thrilled to announce a major upgrade to ConnectKit—designed to make onboarding and navigating Ethereum simpler and safer than ever.
+
+Introducing [Family Accounts](https://app.family.co), simplified onboarding for new users.
+
+Learn more by reading the announcement [here](https://family.co/blog/family-accounts).
+
+## New
+
+- Support for [Family Accounts](https://app.family.co).
+
+## Improved
+
+- Updates chain logos for `zora`, `base`, `optimism` and `lens`.
+
# 1.8.2
This update includes improvements to the `CoinbaseWalletSDK` connect popup and `MockConnector`.
diff --git a/examples/testbench/src/components/Web3Provider.tsx b/examples/testbench/src/components/Web3Provider.tsx
index 82622c1e6..18d42e94c 100644
--- a/examples/testbench/src/components/Web3Provider.tsx
+++ b/examples/testbench/src/components/Web3Provider.tsx
@@ -41,6 +41,7 @@ export const ckConfig = getDefaultConfig({
appName: 'ConnectKit testbench',
appIcon: '/app.png',
walletConnectProjectId: process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID!,
+ //enableFamily: false,
});
const customConfig = {
...ckConfig,
diff --git a/packages/connectkit/package.json b/packages/connectkit/package.json
index 1ca012997..9374bd108 100644
--- a/packages/connectkit/package.json
+++ b/packages/connectkit/package.json
@@ -1,6 +1,6 @@
{
"name": "connectkit",
- "version": "1.8.2",
+ "version": "1.9.1",
"author": "Family",
"homepage": "https://docs.family.co/connectkit",
"license": "BSD-2-Clause license",
@@ -41,6 +41,7 @@
"dependencies": {
"buffer": "^6.0.3",
"detect-browser": "^5.3.0",
+ "family": "^0.1.2",
"framer-motion": "^6.3.11",
"qrcode": "^1.5.0",
"react-transition-state": "^1.1.4",
diff --git a/packages/connectkit/src/assets/chains.tsx b/packages/connectkit/src/assets/chains.tsx
index 9821efdc8..19b0d77ec 100644
--- a/packages/connectkit/src/assets/chains.tsx
+++ b/packages/connectkit/src/assets/chains.tsx
@@ -108,6 +108,27 @@ export const Ethereum = ({ testnet, ...props }: Logo) => {
);
};
+export const LensChain = ({ testnet, ...props }: { testnet?: boolean }) => (
+
+);
+
export const Polygon = ({ testnet, ...props }: Logo) => (
);
@@ -850,6 +880,7 @@ const Zora = ({ testnet, ...props }: { testnet?: boolean }) => (
export default {
UnknownChain,
Base,
+ LensChain,
Ethereum,
Polygon,
Optimism,
diff --git a/packages/connectkit/src/assets/logos.tsx b/packages/connectkit/src/assets/logos.tsx
index d556a5b31..e1c77a1d0 100644
--- a/packages/connectkit/src/assets/logos.tsx
+++ b/packages/connectkit/src/assets/logos.tsx
@@ -1,4 +1,4 @@
-import { isFamily, isRainbow, isZerion } from '../utils/wallets';
+import { isArgent, isPhantom, isSafe } from '../utils/wallets';
export const Mock = ({ ...props }) => (
);
@@ -384,6 +163,23 @@ export const Coinbase = ({ background = false, ...props }) => (
);
+export const FamilyAccount = () => (
+
+);
+
export const Family = ({ ...props }) => {
const img =
'data:image/png;base64,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';
@@ -1262,12 +1058,12 @@ export const OtherWallets = ({ ...props }) => {
position: 'relative',
display: 'flex',
flexDirection: 'column',
- gap: 2,
+ gap: 3,
};
const row: React.CSSProperties = {
position: 'relative',
display: 'flex',
- gap: 2,
+ gap: 3,
};
const cell: React.CSSProperties = {
width: '50%',
@@ -1280,11 +1076,13 @@ export const OtherWallets = ({ ...props }) => {
-
+
-
{!isFamily() ? : }
-
{!isRainbow() ? : }
+
+
{!isSafe() ? : }
);
@@ -1329,6 +1127,7 @@ export default {
MetaMask,
Coinbase,
Family,
+ FamilyAccount,
Trust,
Argent,
ImToken,
diff --git a/packages/connectkit/src/components/Common/Button/index.tsx b/packages/connectkit/src/components/Common/Button/index.tsx
index 1e1ecc994..0d722b47c 100644
--- a/packages/connectkit/src/components/Common/Button/index.tsx
+++ b/packages/connectkit/src/components/Common/Button/index.tsx
@@ -42,7 +42,7 @@ const Button: React.FC = ({
: flattenChildren(children).join(''); // Need to generate a string for the key so we can automatically animate between content
const hrefUrl =
- typeof href === 'string' ? href : flattenChildren(href).join(''); // Need to have a flat string for the href
+ href && (typeof href === 'string' ? href : flattenChildren(href).join('')); // Need to have a flat string for the href
return (
{
const context = useContext();
@@ -29,17 +35,28 @@ const ConnectorList = () => {
const wallets = useWallets();
const { lastConnectorId } = useLastConnector();
+ const familyConnector = useFamilyConnector();
+ const familyAccountsConnector = useFamilyAccountsConnector();
+
+ let filteredWallets = wallets.filter(
+ (wallet) => wallet.id !== familyAccountsConnector?.id
+ );
+ if (familyConnector && isFamily()) {
+ filteredWallets = filteredWallets.filter(
+ (wallet) => wallet.id !== familyConnector?.id
+ );
+ }
const walletsToDisplay =
context.options?.hideRecentBadge || lastConnectorId === 'walletConnect' // do not hoist walletconnect to top of list
- ? wallets
+ ? filteredWallets
: [
// move last used wallet to top of list
// using .filter and spread to avoid mutating original array order with .sort
- ...wallets.filter(
+ ...filteredWallets.filter(
(wallet) => lastConnectorId === wallet.connector.id
),
- ...wallets.filter(
+ ...filteredWallets.filter(
(wallet) => lastConnectorId !== wallet.connector.id
),
];
@@ -105,7 +122,7 @@ const ConnectorItem = ({
// Safari requires opening popup on user gesture, so we connect immediately here
const shouldConnectImmediately =
(detectBrowser() === 'safari' || detectBrowser() === 'ios') &&
- isCoinbaseWalletConnector(wallet.connector.id);
+ (isCoinbaseWalletConnector(wallet.connector.id) || isPortoConnector(wallet.connector.id));
if (redirectToMoreWallets || shouldConnectImmediately) deeplink = undefined; // mobile redirects to more wallets page
@@ -134,6 +151,7 @@ const ConnectorItem = ({
{wallet.iconConnector ?? wallet.icon}
diff --git a/packages/connectkit/src/components/Common/ConnectorList/styles.ts b/packages/connectkit/src/components/Common/ConnectorList/styles.ts
index 0557aedff..0c4fbdbd3 100644
--- a/packages/connectkit/src/components/Common/ConnectorList/styles.ts
+++ b/packages/connectkit/src/components/Common/ConnectorList/styles.ts
@@ -212,6 +212,12 @@ const styles = {
&[data-shape='square'] {
border-radius: 0;
}
+
+ &[data-background='true'] {
+ border-radius: 22.5%;
+ background: var(--ck-body-background-tertiary);
+ padding: 8%;
+ }
`,
},
};
diff --git a/packages/connectkit/src/components/Common/FamilyAccountsButton/index.tsx b/packages/connectkit/src/components/Common/FamilyAccountsButton/index.tsx
new file mode 100644
index 000000000..7dbde54ed
--- /dev/null
+++ b/packages/connectkit/src/components/Common/FamilyAccountsButton/index.tsx
@@ -0,0 +1,41 @@
+import {
+ ButtonContainer,
+ InnerContainer,
+ IconContainer,
+ ButtonContainerInner,
+} from './styles';
+import FitText from '../FitText';
+import useLocales from '../../../hooks/useLocales';
+
+const FamilyLogo = () => (
+
+);
+
+export const FamilyAccountsButton = ({ onClick }: { onClick: () => void }) => {
+ const locales = useLocales();
+ return (
+
+
+
+
+
+
+ {locales.continueWithFamily}
+
+
+
+ );
+};
diff --git a/packages/connectkit/src/components/Common/FamilyAccountsButton/styles.ts b/packages/connectkit/src/components/Common/FamilyAccountsButton/styles.ts
new file mode 100644
index 000000000..85016e55f
--- /dev/null
+++ b/packages/connectkit/src/components/Common/FamilyAccountsButton/styles.ts
@@ -0,0 +1,79 @@
+import { motion } from 'framer-motion';
+import styled from './../../../styles/styled';
+
+export const ButtonContainerInner = styled(motion.div)`
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ inset: 0;
+ height: 100%;
+`;
+export const ButtonContainer = styled.button`
+ --color: #ffffff;
+ --background: var(--ck-family-accounts-brand);
+ --box-shadow: var(--ck-primary-button-box-shadow);
+ --border-radius: var(--ck-primary-button-border-radius);
+ --font-weight: var(--ck-primary-button-font-weight, 500);
+
+ --hover-color: var(--ck-button-primary-hover-color, var(--color));
+ --hover-background: var(
+ --ck-primary-button-hover-background,
+ var(--background)
+ );
+ --hover-box-shadow: var(
+ --ck-primary-button-hover-box-shadow,
+ var(--box-shadow)
+ );
+ --hover-border-radius: var(
+ --ck-primary-button-hover-border-radius,
+ var(--border-radius)
+ );
+ --hover-font-weight: var(--ck-primary-button-font-weight, var(--font-weight));
+
+ appearance: none;
+ cursor: pointer;
+ user-select: none;
+ min-width: fit-content;
+ width: 100%;
+ display: block;
+ text-align: center;
+ height: 48px;
+ margin: 18px 0 2px;
+ line-height: 48px;
+ padding: 0 4px;
+ font-size: 16px;
+ font-weight: var(--font-weight, 500);
+ text-decoration: none;
+ white-space: nowrap;
+ transition: 100ms ease;
+ transition-property: box-shadow, background-color;
+ color: var(--color);
+ background: var(--background);
+ border-radius: var(--border-radius);
+ box-shadow: var(--box-shadow);
+ will-change: transform, box-shadow, background-color, color;
+`;
+
+export const InnerContainer = styled.div`
+ transform: translateZ(0); // Shifting fix
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+ max-width: calc(100% - 42px);
+ transition: opacity 300ms ease;
+`;
+
+export const IconContainer = styled.div`
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+ max-width: 20px;
+ max-height: 20px;
+ margin: 0 12px 0 0;
+ svg {
+ display: block;
+ position: relative;
+ max-width: 100%;
+ height: auto;
+ }
+`;
diff --git a/packages/connectkit/src/components/Common/Modal/index.tsx b/packages/connectkit/src/components/Common/Modal/index.tsx
index 29e90aecc..c80c429d3 100644
--- a/packages/connectkit/src/components/Common/Modal/index.tsx
+++ b/packages/connectkit/src/components/Common/Modal/index.tsx
@@ -697,10 +697,16 @@ const Page: React.FC = ({
);
};
-export const OrDivider = ({ children }: { children?: React.ReactNode }) => {
+export const OrDivider = ({
+ children,
+ hideHr,
+}: {
+ children?: React.ReactNode;
+ hideHr?: boolean;
+}) => {
const locales = useLocales();
return (
-
+
{children ?? locales.or}
);
diff --git a/packages/connectkit/src/components/Common/Modal/styles.ts b/packages/connectkit/src/components/Common/Modal/styles.ts
index 4d90071ec..0c9dbd69b 100644
--- a/packages/connectkit/src/components/Common/Modal/styles.ts
+++ b/packages/connectkit/src/components/Common/Modal/styles.ts
@@ -71,7 +71,9 @@ export const PageContent = styled(motion.div)`
padding-top: 48px;
`;
-export const TextWithHr = styled(motion.div)`
+export const TextWithHr = styled(motion.div)<{
+ $disableHr?: boolean;
+}>`
user-select: none;
position: relative;
display: block;
@@ -90,6 +92,9 @@ export const TextWithHr = styled(motion.div)`
background: var(--ck-body-background);
transition: background-color 200ms ease;
}
+ ${(props) =>
+ !props.$disableHr &&
+ `
&:before {
z-index: 2;
content: '';
@@ -102,6 +107,7 @@ export const TextWithHr = styled(motion.div)`
background: var(--ck-body-divider);
box-shadow: var(--ck-body-divider-box-shadow);
}
+ `}
`;
export const ModalHeading = styled(motion.div)`
z-index: 3;
diff --git a/packages/connectkit/src/components/ConnectModal/ConnectUsing.tsx b/packages/connectkit/src/components/ConnectModal/ConnectUsing.tsx
index 877e945c5..f41a416d1 100644
--- a/packages/connectkit/src/components/ConnectModal/ConnectUsing.tsx
+++ b/packages/connectkit/src/components/ConnectModal/ConnectUsing.tsx
@@ -54,6 +54,7 @@ const ConnectUsing = () => {
switchConnectMethod={(id?: string) => {
//if (id) setId(id);
setStatus(states.INJECTOR);
+ setTimeout(context.triggerResize, 10); // delay required here for modal to resize
}}
/>
@@ -70,6 +71,7 @@ const ConnectUsing = () => {
switchConnectMethod={(id?: string) => {
//if (id) setId(id);
setStatus(states.QRCODE);
+ setTimeout(context.triggerResize, 10); // delay required here for modal to resize
}}
/>
diff --git a/packages/connectkit/src/components/ConnectModal/ConnectWithInjector/index.tsx b/packages/connectkit/src/components/ConnectModal/ConnectWithInjector/index.tsx
index abacab0ee..e8b934772 100644
--- a/packages/connectkit/src/components/ConnectModal/ConnectWithInjector/index.tsx
+++ b/packages/connectkit/src/components/ConnectModal/ConnectWithInjector/index.tsx
@@ -27,7 +27,11 @@ import SquircleSpinner from './SquircleSpinner';
import { RetryIconCircle, Scan } from '../../../assets/icons';
import BrowserIcon from '../../Common/BrowserIcon';
import { AlertIcon, TickIcon } from '../../../assets/icons';
-import { detectBrowser, isWalletConnectConnector } from '../../../utils';
+import {
+ detectBrowser,
+ isFamilyAccountsConnector,
+ isWalletConnectConnector,
+} from '../../../utils';
import useLocales from '../../../hooks/useLocales';
import { useConnect } from '../../../hooks/useConnect';
import { useContext } from '../../ConnectKit';
@@ -340,6 +344,16 @@ const ConnectWithInjector: React.FC<{
{locales.injectionScreen_failed_p}
+
+ {isFamilyAccountsConnector(wallet.id) && (
+ <>
+
+
+ >
+ )}
+
{/* Reason: Coinbase Wallet does not expose a QRURI when extension is installed */}
{/*
{wallet?.getWalletConnectDeeplink &&
@@ -365,11 +379,28 @@ const ConnectWithInjector: React.FC<{
exit={'exit'}
variants={contentVariants}
>
-
+
{locales.injectionScreen_rejected_h1}
{locales.injectionScreen_rejected_p}
+ {isFamilyAccountsConnector(wallet.id) && (
+ <>
+
+
+ >
+ )}
+
{/* Reason: Coinbase Wallet does not expose a QRURI when extension is installed */}
{/*
{wallet?.getWalletConnectDeeplink &&
@@ -395,7 +426,11 @@ const ConnectWithInjector: React.FC<{
exit={'exit'}
variants={contentVariants}
>
-
+
{wallet.connector.id === 'injected'
? locales.injectionScreen_connecting_injected_h1
diff --git a/packages/connectkit/src/components/ConnectModal/ConnectWithQRCode.tsx b/packages/connectkit/src/components/ConnectModal/ConnectWithQRCode.tsx
index 7bb7cae9d..cfa6b9ba7 100644
--- a/packages/connectkit/src/components/ConnectModal/ConnectWithQRCode.tsx
+++ b/packages/connectkit/src/components/ConnectModal/ConnectWithQRCode.tsx
@@ -5,7 +5,7 @@ import { useWalletConnectModal } from '../../hooks/useWalletConnectModal';
import {
detectBrowser,
- isCoinbaseWalletConnector,
+ isFamilyAccountsConnector,
isWalletConnectConnector,
} from '../../utils';
@@ -130,6 +130,14 @@ const ConnectWithQRCode: React.FC<{
)}
+ {isFamilyAccountsConnector(wallet.id) && (
+ <>
+
+
+ >
+ )}
{/*
{hasExtensionInstalled && ( // Run the extension
+
+ {isFamilyConnector && (
+ <>
+ {
+ try {
+ await connectorClient?.request<{
+ Method: 'family_switchAccounts';
+ Parameters: [];
+ ReturnType: { message: string; success: boolean };
+ }>({
+ method: 'family_switchAccounts',
+ params: [],
+ });
+ } catch (error) {
+ context.log(
+ 'rpc method family_switchAccounts is not implemented in this connector',
+ error
+ );
+ }
+ }}
+ >
+ {locales.switchWallets}
+
+ >
+ )}
{!isSafeConnector(connector?.id) && (
setShouldDisconnect(true)}
- icon={}
+ icon={isFamilyConnector ? undefined : }
>
{locales.disconnect}
diff --git a/packages/connectkit/src/constants/chainConfigs.tsx b/packages/connectkit/src/constants/chainConfigs.tsx
index 94254b634..f62d87f3e 100644
--- a/packages/connectkit/src/constants/chainConfigs.tsx
+++ b/packages/connectkit/src/constants/chainConfigs.tsx
@@ -37,6 +37,16 @@ export const chainConfigs: Chain[] = [
},
},
},
+ {
+ id: 232,
+ name: 'Lens Chain',
+ logo: ,
+ },
+ {
+ id: 37111,
+ name: 'Lens Chain Testnet',
+ logo: ,
+ },
{
id: 3,
name: 'Rinkeby',
diff --git a/packages/connectkit/src/defaultConfig.ts b/packages/connectkit/src/defaultConfig.ts
index 719a59ccd..de6850699 100644
--- a/packages/connectkit/src/defaultConfig.ts
+++ b/packages/connectkit/src/defaultConfig.ts
@@ -2,6 +2,7 @@ import { http } from 'wagmi';
import { type CreateConfigParameters } from '@wagmi/core';
import { mainnet, polygon, optimism, arbitrum } from 'wagmi/chains';
import { CoinbaseWalletParameters } from 'wagmi/connectors';
+import { EthereumProviderOptions as FamilyOptions } from 'family';
import defaultConnectors from './defaultConnectors';
@@ -21,6 +22,9 @@ type DefaultConfigProps = {
walletConnectProjectId: string;
// Coinbase Wallet preference
coinbaseWalletPreference?: CoinbaseWalletParameters<'4'>['preference'];
+ // Family options (https://app.family.co)
+ enableFamily?: boolean;
+ familyOptions?: FamilyOptions;
} & Partial;
const defaultConfig = ({
@@ -32,6 +36,8 @@ const defaultConfig = ({
coinbaseWalletPreference,
chains = [mainnet, polygon, optimism, arbitrum],
client,
+ enableFamily = true,
+ familyOptions,
...props
}: DefaultConfigProps): CreateConfigParameters => {
globalAppName = appName;
@@ -53,6 +59,8 @@ const defaultConfig = ({
},
walletConnectProjectId,
coinbaseWalletPreference,
+ enableFamily,
+ familyOptions,
});
const config: CreateConfigParameters = {
diff --git a/packages/connectkit/src/defaultConnectors.ts b/packages/connectkit/src/defaultConnectors.ts
index 514b2283d..fd049103b 100644
--- a/packages/connectkit/src/defaultConnectors.ts
+++ b/packages/connectkit/src/defaultConnectors.ts
@@ -7,6 +7,11 @@ import {
safe,
} from '@wagmi/connectors';
+import {
+ EthereumProviderOptions as FamilyOptions,
+ familyAccountsConnector,
+} from 'family';
+
type DefaultConnectorsProps = {
app: {
name: string;
@@ -16,18 +21,24 @@ type DefaultConnectorsProps = {
};
walletConnectProjectId?: string;
coinbaseWalletPreference?: CoinbaseWalletParameters<'4'>['preference'];
+ enableFamily?: boolean;
+ familyOptions?: FamilyOptions;
};
const defaultConnectors = ({
app,
walletConnectProjectId,
coinbaseWalletPreference,
+ enableFamily,
+ familyOptions,
}: DefaultConnectorsProps): CreateConnectorFn[] => {
const hasAllAppData = app.name && app.icon && app.description && app.url;
const shouldUseSafeConnector =
!(typeof window === 'undefined') && window?.parent !== window;
- const connectors: CreateConnectorFn[] = [];
+ const connectors: CreateConnectorFn[] = enableFamily
+ ? [familyAccountsConnector(familyOptions)]
+ : [];
// If we're in an iframe, include the SafeConnector
if (shouldUseSafeConnector) {
diff --git a/packages/connectkit/src/hooks/connectors/useWalletConnectUri.ts b/packages/connectkit/src/hooks/connectors/useWalletConnectUri.ts
index b5b785637..b43db83ae 100644
--- a/packages/connectkit/src/hooks/connectors/useWalletConnectUri.ts
+++ b/packages/connectkit/src/hooks/connectors/useWalletConnectUri.ts
@@ -18,7 +18,7 @@ export function useWalletConnectUri(
const [uri, setUri] = useState(undefined);
- const connector: Connector = useWalletConnectConnector();
+ const connector = useWalletConnectConnector();
const { isConnected } = useAccount();
const { connectAsync } = useConnect();
diff --git a/packages/connectkit/src/hooks/useConnectors.ts b/packages/connectkit/src/hooks/useConnectors.ts
index 8f9a17660..2ab20dc8c 100644
--- a/packages/connectkit/src/hooks/useConnectors.ts
+++ b/packages/connectkit/src/hooks/useConnectors.ts
@@ -14,7 +14,14 @@ export function useConnector(id: string, uuid?: string) {
(c) => c.id === id && c.name.includes('Injected')
) as Connector;
}
- return connectors.find((c) => c.id === id) as Connector;
+ return connectors.find((c) => c.id === id);
+}
+
+export function useFamilyAccountsConnector() {
+ return useConnector('familyAccountsProvider');
+}
+export function useFamilyConnector() {
+ return useConnector('co.family.wallet');
}
export function useInjectedConnector(uuid?: string) {
diff --git a/packages/connectkit/src/hooks/useLocales.tsx b/packages/connectkit/src/hooks/useLocales.tsx
index 266f488a5..452da38ec 100644
--- a/packages/connectkit/src/hooks/useLocales.tsx
+++ b/packages/connectkit/src/hooks/useLocales.tsx
@@ -4,8 +4,9 @@ import Logos from '../assets/logos';
import { useContext } from '../components/ConnectKit';
import { getLocale } from './../localizations';
+import { LocaleProps } from '../localizations/locales';
-export default function useLocales(replacements?: any) {
+export default function useLocales(replacements?: any): LocaleProps {
const context = useContext();
const language = context.options?.language ?? 'en-US';
@@ -15,16 +16,16 @@ export default function useLocales(replacements?: any) {
if (!translations) {
console.error(`Missing translations for: ${language}`);
- return `Missing translations for: ${language}`;
+ throw new Error(`Missing translations for: ${language}`);
}
- const translated: any = {};
+ const translated = {};
Object.keys(translations).map((key) => {
const string = translations[key];
return (translated[key] = localize(string, replacements));
});
- return translated;
+ return translated as LocaleProps;
}
const localize = (text: string, replacements?: any[string]) => {
diff --git a/packages/connectkit/src/index.ts b/packages/connectkit/src/index.ts
index a9a16a772..023b3f059 100644
--- a/packages/connectkit/src/index.ts
+++ b/packages/connectkit/src/index.ts
@@ -1,4 +1,4 @@
-export const CONNECTKIT_VERSION = '1.8.2';
+export const CONNECTKIT_VERSION = '1.9.1';
export * as Types from './types';
export { default as getDefaultConfig } from './defaultConfig';
diff --git a/packages/connectkit/src/localizations/locales/ar-AE.ts b/packages/connectkit/src/localizations/locales/ar-AE.ts
index 1bc9667e4..8d7b9588d 100644
--- a/packages/connectkit/src/localizations/locales/ar-AE.ts
+++ b/packages/connectkit/src/localizations/locales/ar-AE.ts
@@ -1,6 +1,8 @@
import { LocaleProps } from './';
+import enUS from './en-US';
const arAE: LocaleProps = {
+ ...enUS, // fallback
connectWallet: 'الاتصال بالمحفظة',
disconnect: 'قطع الاتصال',
connected: 'متصل',
@@ -16,7 +18,7 @@ const arAE: LocaleProps = {
more: 'المزيد',
tryAgain: 'حاول مجددًا',
tryAgainQuestion: 'هل نحاول مرة أخرى؟',
- dontHaveTheApp: "ليس لديك التطبيق؟",
+ dontHaveTheApp: 'ليس لديك التطبيق؟',
scanTheQRCode: 'مسح رمز الاستجابة السريعة',
useWalletConnectModal: 'استخدم نموذج ولِيتكنيكت',
useModal: 'استخدم النموذج',
@@ -46,7 +48,7 @@ const arAE: LocaleProps = {
onboardingScreen_ctaUrl: `https://ethereum.org/ar/wallets/find-wallet/`,
aboutScreen_heading: `حول المحافظ`,
- aboutScreen_a_h1: `حافظ على أصولك الرقمية`,
+ aboutScreen_a_h1: `حافظ على أصولك الرقمية`,
aboutScreen_a_p: `تمكنك المحافظ من إرسال واستقبال وتخزين والتفاعل مع الأصول الرقمية مثل NFTs ورموز إيثريوم الأخرى.`,
aboutScreen_b_h1: `وسيلة أفضل لتسجيل الدخول`,
aboutScreen_b_p: `في تطبيقات العصر الحديث، يمكن استخدام محفظتك كوسيلة سهلة لتسجيل الدخول بدلاً من الحاجة إلى تذكر كلمة مرور.`,
@@ -102,17 +104,17 @@ const arAE: LocaleProps = {
switchNetworkScreen_heading: 'تبديل الشبكات',
signInWithEthereumScreen_tooltip:
-'أنت غير مسجل الدخول حاليًا إلى هذا التطبيق.\n**سجل الدخول باستخدام إثيريوم** للمتابعة.',
+ 'أنت غير مسجل الدخول حاليًا إلى هذا التطبيق.\n**سجل الدخول باستخدام إثيريوم** للمتابعة.',
signInWithEthereumScreen_signedOut_heading: 'سجل الدخول باستخدام إثيريوم',
signInWithEthereumScreen_signedOut_h1:
-'يود هذا التطبيق التحقق منك \n كصاحب لهذه المحفظة.',
+ 'يود هذا التطبيق التحقق منك \n كصاحب لهذه المحفظة.',
signInWithEthereumScreen_signedOut_p: `يرجى تأكيد طلب الرسالة في محفظتك للمتابعة.`,
signInWithEthereumScreen_signedOut_button: 'سجل الدخول',
signInWithEthereumScreen_signedIn_heading: 'تم تسجيل الدخول باستخدام إثيريوم',
signInWithEthereumScreen_signedIn_h1:
-'لقد قمت بتأكيد نفسك كصاحب لهذه المحفظة بنجاح.',
+ 'لقد قمت بتأكيد نفسك كصاحب لهذه المحفظة بنجاح.',
signInWithEthereumScreen_signedIn_p: `سيتطلب تسجيل الخروج منك إعادة المصادقة مرة أخرى في المستقبل.`,
signInWithEthereumScreen_signedIn_button: 'تسجيل الخروج',
};
diff --git a/packages/connectkit/src/localizations/locales/ca-AD.ts b/packages/connectkit/src/localizations/locales/ca-AD.ts
index 490e639b8..46b5c1d00 100644
--- a/packages/connectkit/src/localizations/locales/ca-AD.ts
+++ b/packages/connectkit/src/localizations/locales/ca-AD.ts
@@ -1,116 +1,121 @@
import { LocaleProps } from './';
+import enUS from './en-US';
const caAD: LocaleProps = {
+ ...enUS, // fallback
connectWallet: 'Connecta la cartera',
- disconnect: 'Desconnectar',
- connected: 'Connectat',
- wrongNetwork: 'Xarxa incorrecta',
- switchNetworks: 'Canvi de xarxa',
- chainNetwork: 'Xarxa {{ CHAIN }}',
- copyToClipboard: 'Copia al portapapers',
- copyCode: 'Copia codi',
- moreInformation: 'Més informació',
- back: 'Enrere',
- close: 'Tanca',
- or: 'o',
- more: 'Més',
- tryAgain: 'Torna-ho a intentar',
- tryAgainQuestion: 'Tornar a intentar-ho?',
- dontHaveTheApp: "No tens l'aplicació?",
- scanTheQRCode: 'Escaneja el codi QR',
- useWalletConnectModal: 'Utilitza WalletConnect Modal',
- useModal: 'Utilitza Modal',
- installTheExtension: "Instal·la l'extensió",
- getWalletName: 'Obté {{ CONNECTORNAME }}',
- otherWallets: 'Altres carteres',
- learnMore: 'Més informació',
- getWallet: 'Obté una cartera',
- approveInWallet: 'Aprova a la cartera',
- confirmInWallet: 'Confirma a la cartera',
- awaitingConfirmation: 'Esperant confirmació',
- signIn: 'Inicia sessió',
- signOut: 'Tanca sessió',
- signedIn: 'Sessió iniciada',
- signedOut: 'Sessió tancada',
- walletNotConnected: 'Cartera no connectada',
-
- warnings_walletSwitchingUnsupported: `La teva cartera no permet canviar de xarxa des d'aquesta aplicació.`,
- warnings_walletSwitchingUnsupportedResolve: `Prova a canviar de xarxa des de la teva cartera.`,
- warnings_chainUnsupported: `Aquesta aplicació no és compatible amb la xarxa connectada actualment.`,
- warnings_chainUnsupportedResolve: `Canvia o desconnecta per continuar.`,
-
- onboardingScreen_heading: `Obté una cartera`,
- onboardingScreen_h1: `Comença a explorar la Web3`,
- onboardingScreen_p: `La teva cartera és el portal d'accés a tot el relacionat amb Ethereum, la tecnologia màgica que permet explorar la Web3.`,
- onboardingScreen_ctaText: `Tria la teva primera cartera`,
- onboardingScreen_ctaUrl: `https://ethereum.org/es/wallets/find-wallet/`,
-
- aboutScreen_heading: `Sobre les carteres`,
- aboutScreen_a_h1: `Per als teus actius digitals`,
- aboutScreen_a_p: `Les carteres et permeten enviar, rebre, emmagatzemar i interactuar amb actius digitals com els NFT i altres tokens d'Ethereum.`,
- aboutScreen_b_h1: `Una manera millor d'iniciar sessió`,
- aboutScreen_b_p: `Amb les aplicacions modernes, pots utilitzar la teva cartera per iniciar sessió fàcilment, en lloc de haver de recordar una contrasenya.`,
- aboutScreen_c_h1: `Explora el món de la Web3`,
- aboutScreen_c_p: `La teva cartera és una eina essencial que et permet explorar i participar en el món en ràpida evolució de la Web3.`,
- aboutScreen_ctaText: `Més informació`,
- aboutScreen_ctaUrl: `https://ethereum.org/es/wallets/`,
-
- connectorsScreen_heading: `Connecta una cartera`,
- connectorsScreen_newcomer: `No tinc una cartera`,
- connectorsScreen_h1: `Què és una cartera?`,
- connectorsScreen_p: `Les carteres s'utilitzen per enviar, rebre i emmagatzemar actius digitals. Si connectes una cartera, podràs interactuar amb les aplicacions.`,
-
- mobileConnectorsScreen_heading: `Tria una cartera`,
-
- scanScreen_heading: `Escaneja amb el telèfon`,
- scanScreen_heading_withConnector: `Escaneja amb {{ CONNECTORNAME }}`,
- scanScreen_tooltip_walletConnect: `Obre una cartera compatible amb WalletConnect [WALLETCONNECTLOGO] per escanejar`,
- scanScreen_tooltip_default: `Obre {{ CONNECTORNAME }} en el teu telèfon mòbil per escanejar`,
-
- downloadAppScreen_heading: `Obté {{ CONNECTORNAME }}`,
- downloadAppScreen_iosAndroid: `Escaneja amb la càmera del teu telèfon per descarregar-la en iOS o Android.`,
- downloadAppScreen_ios: `Escaneja amb la càmera del teu telèfon per descarregar-la en iOS.`,
- downloadAppScreen_android: `Escaneja amb la càmera del teu telèfon per descarregar-la en Android.`,
-
- injectionScreen_unavailable_h1: `Navegador no compatible`,
- injectionScreen_unavailable_p: `Per connectar la teva cartera de {{ CONNECTORSHORTNAME }}, instal·la l'extensió en {{ SUGGESTEDEXTENSIONBROWSER }}.`,
-
- injectionScreen_install_h1: `Instal·la {{ CONNECTORNAME }}`,
- injectionScreen_install_p: `Per connectar la teva cartera de {{ CONNECTORSHORTNAME }}, instal·la l'extensió del navegador.`,
-
- injectionScreen_connecting_h1: `Sol·licitud de connexió`,
- injectionScreen_connecting_p: `Obre l'extensió del navegador de {{ CONNECTORSHORTNAME }} per connectar la teva cartera.`,
-
- injectionScreen_connecting_injected_h1: `Sol·licitud de connexió`,
- injectionScreen_connecting_injected_p: `Accepta la sol·licitud a través de la teva cartera per connectar-te a aquesta aplicació.`,
-
- injectionScreen_connected_h1: `Ja connectada`,
- injectionScreen_connected_p: `Ja pots tancar aquesta finestra emergent`,
-
- injectionScreen_rejected_h1: `Sol·licitud cancel·lada`,
- injectionScreen_rejected_p: `Has cancel·lat la sol·licitud. Fes clic a dalt per tornar-ho a intentar.`,
-
- injectionScreen_failed_h1: `Error de connexió`,
- injectionScreen_failed_p: `Ho sentim, hi ha hagut un problema. Intenta connectar-te de nou.`,
-
- injectionScreen_notconnected_h1: `Inicia sessió en {{ CONNECTORNAME }}`,
- injectionScreen_notconnected_p: `Per continuar, inicia sessió en la teva extensió de {{ CONNECTORNAME }}.`,
-
- profileScreen_heading: 'Connectat',
-
- switchNetworkScreen_heading: 'Canvi de xarxa',
-
- signInWithEthereumScreen_tooltip: 'No has iniciat sessió en aquesta aplicació.\n**Inicia sessió amb Ethereum** per continuar.',
-
- signInWithEthereumScreen_signedOut_heading: 'Inicia sessió amb Ethereum',
- signInWithEthereumScreen_signedOut_h1: "Aquesta aplicació vol verificar que ets el propietari d'aquesta cartera.",
- signInWithEthereumScreen_signedOut_p: `Signa la sol·licitud de missatge en la teva cartera per continuar.`,
- signInWithEthereumScreen_signedOut_button: 'Inicia sessió',
-
- signInWithEthereumScreen_signedIn_heading: 'Sessió iniciada amb Ethereum',
- signInWithEthereumScreen_signedIn_h1: "T'has verificat correctament com a propietari d'aquesta cartera.",
- signInWithEthereumScreen_signedIn_p: `Si tanques la sessió, hauràs de tornar a autenticar-te més endavant.`,
- signInWithEthereumScreen_signedIn_button: 'Tanca sessió',
+ disconnect: 'Desconnectar',
+ connected: 'Connectat',
+ wrongNetwork: 'Xarxa incorrecta',
+ switchNetworks: 'Canvi de xarxa',
+ chainNetwork: 'Xarxa {{ CHAIN }}',
+ copyToClipboard: 'Copia al portapapers',
+ copyCode: 'Copia codi',
+ moreInformation: 'Més informació',
+ back: 'Enrere',
+ close: 'Tanca',
+ or: 'o',
+ more: 'Més',
+ tryAgain: 'Torna-ho a intentar',
+ tryAgainQuestion: 'Tornar a intentar-ho?',
+ dontHaveTheApp: "No tens l'aplicació?",
+ scanTheQRCode: 'Escaneja el codi QR',
+ useWalletConnectModal: 'Utilitza WalletConnect Modal',
+ useModal: 'Utilitza Modal',
+ installTheExtension: "Instal·la l'extensió",
+ getWalletName: 'Obté {{ CONNECTORNAME }}',
+ otherWallets: 'Altres carteres',
+ learnMore: 'Més informació',
+ getWallet: 'Obté una cartera',
+ approveInWallet: 'Aprova a la cartera',
+ confirmInWallet: 'Confirma a la cartera',
+ awaitingConfirmation: 'Esperant confirmació',
+ signIn: 'Inicia sessió',
+ signOut: 'Tanca sessió',
+ signedIn: 'Sessió iniciada',
+ signedOut: 'Sessió tancada',
+ walletNotConnected: 'Cartera no connectada',
+
+ warnings_walletSwitchingUnsupported: `La teva cartera no permet canviar de xarxa des d'aquesta aplicació.`,
+ warnings_walletSwitchingUnsupportedResolve: `Prova a canviar de xarxa des de la teva cartera.`,
+ warnings_chainUnsupported: `Aquesta aplicació no és compatible amb la xarxa connectada actualment.`,
+ warnings_chainUnsupportedResolve: `Canvia o desconnecta per continuar.`,
+
+ onboardingScreen_heading: `Obté una cartera`,
+ onboardingScreen_h1: `Comença a explorar la Web3`,
+ onboardingScreen_p: `La teva cartera és el portal d'accés a tot el relacionat amb Ethereum, la tecnologia màgica que permet explorar la Web3.`,
+ onboardingScreen_ctaText: `Tria la teva primera cartera`,
+ onboardingScreen_ctaUrl: `https://ethereum.org/es/wallets/find-wallet/`,
+
+ aboutScreen_heading: `Sobre les carteres`,
+ aboutScreen_a_h1: `Per als teus actius digitals`,
+ aboutScreen_a_p: `Les carteres et permeten enviar, rebre, emmagatzemar i interactuar amb actius digitals com els NFT i altres tokens d'Ethereum.`,
+ aboutScreen_b_h1: `Una manera millor d'iniciar sessió`,
+ aboutScreen_b_p: `Amb les aplicacions modernes, pots utilitzar la teva cartera per iniciar sessió fàcilment, en lloc de haver de recordar una contrasenya.`,
+ aboutScreen_c_h1: `Explora el món de la Web3`,
+ aboutScreen_c_p: `La teva cartera és una eina essencial que et permet explorar i participar en el món en ràpida evolució de la Web3.`,
+ aboutScreen_ctaText: `Més informació`,
+ aboutScreen_ctaUrl: `https://ethereum.org/es/wallets/`,
+
+ connectorsScreen_heading: `Connecta una cartera`,
+ connectorsScreen_newcomer: `No tinc una cartera`,
+ connectorsScreen_h1: `Què és una cartera?`,
+ connectorsScreen_p: `Les carteres s'utilitzen per enviar, rebre i emmagatzemar actius digitals. Si connectes una cartera, podràs interactuar amb les aplicacions.`,
+
+ mobileConnectorsScreen_heading: `Tria una cartera`,
+
+ scanScreen_heading: `Escaneja amb el telèfon`,
+ scanScreen_heading_withConnector: `Escaneja amb {{ CONNECTORNAME }}`,
+ scanScreen_tooltip_walletConnect: `Obre una cartera compatible amb WalletConnect [WALLETCONNECTLOGO] per escanejar`,
+ scanScreen_tooltip_default: `Obre {{ CONNECTORNAME }} en el teu telèfon mòbil per escanejar`,
+
+ downloadAppScreen_heading: `Obté {{ CONNECTORNAME }}`,
+ downloadAppScreen_iosAndroid: `Escaneja amb la càmera del teu telèfon per descarregar-la en iOS o Android.`,
+ downloadAppScreen_ios: `Escaneja amb la càmera del teu telèfon per descarregar-la en iOS.`,
+ downloadAppScreen_android: `Escaneja amb la càmera del teu telèfon per descarregar-la en Android.`,
+
+ injectionScreen_unavailable_h1: `Navegador no compatible`,
+ injectionScreen_unavailable_p: `Per connectar la teva cartera de {{ CONNECTORSHORTNAME }}, instal·la l'extensió en {{ SUGGESTEDEXTENSIONBROWSER }}.`,
+
+ injectionScreen_install_h1: `Instal·la {{ CONNECTORNAME }}`,
+ injectionScreen_install_p: `Per connectar la teva cartera de {{ CONNECTORSHORTNAME }}, instal·la l'extensió del navegador.`,
+
+ injectionScreen_connecting_h1: `Sol·licitud de connexió`,
+ injectionScreen_connecting_p: `Obre l'extensió del navegador de {{ CONNECTORSHORTNAME }} per connectar la teva cartera.`,
+
+ injectionScreen_connecting_injected_h1: `Sol·licitud de connexió`,
+ injectionScreen_connecting_injected_p: `Accepta la sol·licitud a través de la teva cartera per connectar-te a aquesta aplicació.`,
+
+ injectionScreen_connected_h1: `Ja connectada`,
+ injectionScreen_connected_p: `Ja pots tancar aquesta finestra emergent`,
+
+ injectionScreen_rejected_h1: `Sol·licitud cancel·lada`,
+ injectionScreen_rejected_p: `Has cancel·lat la sol·licitud. Fes clic a dalt per tornar-ho a intentar.`,
+
+ injectionScreen_failed_h1: `Error de connexió`,
+ injectionScreen_failed_p: `Ho sentim, hi ha hagut un problema. Intenta connectar-te de nou.`,
+
+ injectionScreen_notconnected_h1: `Inicia sessió en {{ CONNECTORNAME }}`,
+ injectionScreen_notconnected_p: `Per continuar, inicia sessió en la teva extensió de {{ CONNECTORNAME }}.`,
+
+ profileScreen_heading: 'Connectat',
+
+ switchNetworkScreen_heading: 'Canvi de xarxa',
+
+ signInWithEthereumScreen_tooltip:
+ 'No has iniciat sessió en aquesta aplicació.\n**Inicia sessió amb Ethereum** per continuar.',
+
+ signInWithEthereumScreen_signedOut_heading: 'Inicia sessió amb Ethereum',
+ signInWithEthereumScreen_signedOut_h1:
+ "Aquesta aplicació vol verificar que ets el propietari d'aquesta cartera.",
+ signInWithEthereumScreen_signedOut_p: `Signa la sol·licitud de missatge en la teva cartera per continuar.`,
+ signInWithEthereumScreen_signedOut_button: 'Inicia sessió',
+
+ signInWithEthereumScreen_signedIn_heading: 'Sessió iniciada amb Ethereum',
+ signInWithEthereumScreen_signedIn_h1:
+ "T'has verificat correctament com a propietari d'aquesta cartera.",
+ signInWithEthereumScreen_signedIn_p: `Si tanques la sessió, hauràs de tornar a autenticar-te més endavant.`,
+ signInWithEthereumScreen_signedIn_button: 'Tanca sessió',
};
export default caAD;
diff --git a/packages/connectkit/src/localizations/locales/ee-EE.ts b/packages/connectkit/src/localizations/locales/ee-EE.ts
index ce408882f..b0607d043 100644
--- a/packages/connectkit/src/localizations/locales/ee-EE.ts
+++ b/packages/connectkit/src/localizations/locales/ee-EE.ts
@@ -1,6 +1,8 @@
import { LocaleProps } from './';
+import enUS from './en-US';
const eeEE: LocaleProps = {
+ ...enUS, // fallback
connectWallet: 'Ühenda rahakott',
disconnect: 'Katkesta ühendus',
connected: 'Ühendatud',
diff --git a/packages/connectkit/src/localizations/locales/en-US.ts b/packages/connectkit/src/localizations/locales/en-US.ts
index 0fcbac9d6..c914bf0c2 100644
--- a/packages/connectkit/src/localizations/locales/en-US.ts
+++ b/packages/connectkit/src/localizations/locales/en-US.ts
@@ -1,9 +1,16 @@
const enUS = {
+ // Family Account
+ continueWithFamily: 'Continue with Family',
+ orSelectWallet: 'or select a wallet from the list below',
+ loginWithEmailOrPhone: 'Login with Email or Phone',
+ connectWithFamilyIOS: 'Connect with Family iOS',
+ // ConnectKit
connectWallet: 'Connect Wallet',
disconnect: 'Disconnect',
connected: 'Connected',
wrongNetwork: 'Wrong Network',
switchNetworks: 'Switch Networks',
+ switchWallets: 'Switch Wallets',
chainNetwork: '{{ CHAIN }} Network',
copyToClipboard: 'Copy to Clipboard',
copyCode: 'Copy Code',
@@ -68,7 +75,7 @@ const enUS = {
downloadAppScreen_heading: `Get {{ CONNECTORNAME }}`,
downloadAppScreen_iosAndroid: `Scan with your phone camera to download on iOS or Android.`,
downloadAppScreen_ios: `Scan with your phone camera to download on iOS.`,
- downloadAppScreen_android: `Scan with your phone camera to download Android.`,
+ downloadAppScreen_android: `Scan with your phone camera to download on Android.`,
injectionScreen_unavailable_h1: `Unsupported Browser`,
injectionScreen_unavailable_p: `To connect your {{ CONNECTORSHORTNAME }} wallet,\ninstall the extension on {{ SUGGESTEDEXTENSIONBROWSER }}.`,
diff --git a/packages/connectkit/src/localizations/locales/es-ES.ts b/packages/connectkit/src/localizations/locales/es-ES.ts
index 56a44a8b8..c183e9ece 100644
--- a/packages/connectkit/src/localizations/locales/es-ES.ts
+++ b/packages/connectkit/src/localizations/locales/es-ES.ts
@@ -1,6 +1,8 @@
import { LocaleProps } from './';
+import enUS from './en-US';
const esES: LocaleProps = {
+ ...enUS, // fallback
connectWallet: 'Conecta una cartera',
disconnect: 'Desconectar',
connected: 'Conectado',
diff --git a/packages/connectkit/src/localizations/locales/fa-IR.ts b/packages/connectkit/src/localizations/locales/fa-IR.ts
index 0da6ab35e..861f092fb 100644
--- a/packages/connectkit/src/localizations/locales/fa-IR.ts
+++ b/packages/connectkit/src/localizations/locales/fa-IR.ts
@@ -1,6 +1,8 @@
import { LocaleProps } from './';
+import enUS from './en-US';
const faIR: LocaleProps = {
+ ...enUS, // fallback
connectWallet: 'اتصال به کیف پول',
disconnect: 'قطع ارتباط',
connected: 'متصل شد',
diff --git a/packages/connectkit/src/localizations/locales/fr-FR.ts b/packages/connectkit/src/localizations/locales/fr-FR.ts
index 4cf37cb9f..e8d152301 100644
--- a/packages/connectkit/src/localizations/locales/fr-FR.ts
+++ b/packages/connectkit/src/localizations/locales/fr-FR.ts
@@ -1,6 +1,8 @@
import { LocaleProps } from './';
+import enUS from './en-US';
const frFR: LocaleProps = {
+ ...enUS, // fallback
connectWallet: 'Connecter le portefeuille',
disconnect: 'Déconnecter',
connected: 'Connecté',
diff --git a/packages/connectkit/src/localizations/locales/ja-JP.ts b/packages/connectkit/src/localizations/locales/ja-JP.ts
index 3d6ef9c34..ab7291bd2 100644
--- a/packages/connectkit/src/localizations/locales/ja-JP.ts
+++ b/packages/connectkit/src/localizations/locales/ja-JP.ts
@@ -1,4 +1,8 @@
-export default {
+import { LocaleProps } from './';
+import enUS from './en-US';
+
+const jaJP: LocaleProps = {
+ ...enUS, // fallback
connectWallet: 'ウォレットの接続',
disconnect: '切断',
connected: '接続されました',
@@ -111,3 +115,5 @@ export default {
signInWithEthereumScreen_signedIn_p: `サインアウトすると、今後 再度認証する必要があります。`,
signInWithEthereumScreen_signedIn_button: 'サインアウト',
};
+
+export default jaJP;
diff --git a/packages/connectkit/src/localizations/locales/pt-BR.ts b/packages/connectkit/src/localizations/locales/pt-BR.ts
index d623fa537..0f649ca19 100644
--- a/packages/connectkit/src/localizations/locales/pt-BR.ts
+++ b/packages/connectkit/src/localizations/locales/pt-BR.ts
@@ -1,6 +1,8 @@
import { LocaleProps } from './';
+import enUS from './en-US';
const ptBR: LocaleProps = {
+ ...enUS, // fallback
connectWallet: 'Conectar carteira',
disconnect: 'Desconectar',
connected: 'Conectado',
@@ -101,16 +103,19 @@ const ptBR: LocaleProps = {
switchNetworkScreen_heading: 'Alternar rede',
- signInWithEthereumScreen_tooltip: 'Você não está conectado a este aplicativo.\n**Entre com Ethereum** para continuar.',
+ signInWithEthereumScreen_tooltip:
+ 'Você não está conectado a este aplicativo.\n**Entre com Ethereum** para continuar.',
signInWithEthereumScreen_signedOut_heading: 'Entrar com Ethereum',
- signInWithEthereumScreen_signedOut_h1: 'Este aplicativo gostaria de verificar você \n como o proprietário desta carteira.',
+ signInWithEthereumScreen_signedOut_h1:
+ 'Este aplicativo gostaria de verificar você \n como o proprietário desta carteira.',
signInWithEthereumScreen_signedOut_p: `Por favor, assine o pedido de mensagem \n em sua carteira para continuar.`,
signInWithEthereumScreen_signedOut_button: 'Entrar',
signInWithEthereumScreen_signedIn_heading: 'Conectado com Ethereum',
- signInWithEthereumScreen_signedIn_h1: 'Você se verificou com sucesso \n como o proprietário desta carteira',
+ signInWithEthereumScreen_signedIn_h1:
+ 'Você se verificou com sucesso \n como o proprietário desta carteira',
signInWithEthereumScreen_signedIn_p: `Se sair, será necessário que você \n autentique novamente no futuro.`,
- signInWithEthereumScreen_signedIn_button: 'Sair'
+ signInWithEthereumScreen_signedIn_button: 'Sair',
};
export default ptBR;
diff --git a/packages/connectkit/src/localizations/locales/ru-RU.ts b/packages/connectkit/src/localizations/locales/ru-RU.ts
index 87accce08..1ff69778f 100644
--- a/packages/connectkit/src/localizations/locales/ru-RU.ts
+++ b/packages/connectkit/src/localizations/locales/ru-RU.ts
@@ -1,6 +1,8 @@
import { LocaleProps } from './';
+import enUS from './en-US';
const ruRU: LocaleProps = {
+ ...enUS, // fallback
connectWallet: 'Подключить кошелек',
disconnect: 'Отключить',
connected: 'Подключена',
@@ -46,7 +48,7 @@ const ruRU: LocaleProps = {
onboardingScreen_ctaUrl: `https://ethereum.org/en/wallets/find-wallet/`,
aboutScreen_heading: `О кошельках`,
- aboutScreen_a_h1: `Для ваших цифровых активов`,
+ aboutScreen_a_h1: `Для ваших цифровых активов`,
aboutScreen_a_p: `Кошельки позволяют вам отправлять, получать, хранить и взаимодействовать с цифровыми активами, такими как NFT и другие токены Ethereum.`,
aboutScreen_b_h1: `Лучший способ входа`,
aboutScreen_b_p: `В современных приложениях ваш кошелек можно использовать как удобный способ входа без необходимости помнить пароль.`,
@@ -115,4 +117,4 @@ const ruRU: LocaleProps = {
signInWithEthereumScreen_signedIn_button: 'Выйти',
};
-export default ruRU;
\ No newline at end of file
+export default ruRU;
diff --git a/packages/connectkit/src/localizations/locales/tr-TR.ts b/packages/connectkit/src/localizations/locales/tr-TR.ts
index ccc64fa5e..d2bc30d05 100644
--- a/packages/connectkit/src/localizations/locales/tr-TR.ts
+++ b/packages/connectkit/src/localizations/locales/tr-TR.ts
@@ -1,6 +1,8 @@
import { LocaleProps } from './';
+import enUS from './en-US';
const trTR: LocaleProps = {
+ ...enUS, // fallback
connectWallet: 'Cüzdan Bağla',
disconnect: 'Bağlantıyı Kes',
connected: 'Bağlandı',
@@ -16,7 +18,7 @@ const trTR: LocaleProps = {
more: 'Daha Fazla',
tryAgain: 'Tekrar Dene',
tryAgainQuestion: 'Tekrar Dene?',
- dontHaveTheApp: "Uygulaman yok mu?",
+ dontHaveTheApp: 'Uygulaman yok mu?',
scanTheQRCode: 'Karekodu tarat',
useWalletConnectModal: 'WalletConnect Modalini Kullan ',
useModal: 'Modal Kullan',
@@ -74,7 +76,6 @@ const trTR: LocaleProps = {
injectionScreen_unavailable_h1: `Desteklenmeyen Tarayıcı`,
injectionScreen_unavailable_p: `{{ CONNECTORSHORTNAME }} cüzdanına bağlanmak için\n{{ SUGGESTEDEXTENSIONBROWSER }} üzerinde indirmen gerekiyor.`,
-
injectionScreen_install_h1: `{{ CONNECTORNAME }} İndir`,
injectionScreen_install_p: `{{ CONNECTORSHORTNAME }} cüzdanına bağlanmak için,\ntarayıcı eklentisini indir.`,
diff --git a/packages/connectkit/src/localizations/locales/vi-VN.ts b/packages/connectkit/src/localizations/locales/vi-VN.ts
index f53debd48..cf834c809 100644
--- a/packages/connectkit/src/localizations/locales/vi-VN.ts
+++ b/packages/connectkit/src/localizations/locales/vi-VN.ts
@@ -1,6 +1,8 @@
import { LocaleProps } from './';
+import enUS from './en-US';
const viVN: LocaleProps = {
+ ...enUS, // fallback
connectWallet: 'Kết nối ví',
disconnect: 'Ngắt kết nối',
connected: 'Đã kết nối',
diff --git a/packages/connectkit/src/localizations/locales/zh-CN.ts b/packages/connectkit/src/localizations/locales/zh-CN.ts
index f390c1bd0..b16680ce6 100644
--- a/packages/connectkit/src/localizations/locales/zh-CN.ts
+++ b/packages/connectkit/src/localizations/locales/zh-CN.ts
@@ -1,6 +1,8 @@
import { LocaleProps } from './';
+import enUS from './en-US';
const zhCN: LocaleProps = {
+ ...enUS, // fallback
connectWallet: '绑定钱包',
disconnect: '解除绑定',
connected: '已绑定',
diff --git a/packages/connectkit/src/styles/index.ts b/packages/connectkit/src/styles/index.ts
index af0b94613..2b89d1c9a 100644
--- a/packages/connectkit/src/styles/index.ts
+++ b/packages/connectkit/src/styles/index.ts
@@ -31,7 +31,7 @@ const themeGlobals = {
'--ck-graphic-scaniconwithlogos-04': '#F6F7F9',
'--ck-chain-ethereum-01': '#25292E',
- '--ck-chain-ethereum-02': '#fff',
+ '--ck-chain-ethereum-02': '#ffffff',
'--ck-chain-ethereum-03': '#DFE0E0',
},
dark: {
@@ -90,22 +90,18 @@ const themeGlobals = {
},
},
brand: {
+ '--ck-family-accounts-brand': '#0090ff',
'--ck-family-brand': '#1A88F8',
'--ck-brand-walletConnect': '#3B99FC',
'--ck-brand-coinbaseWallet': '#0052FF',
- '--ck-brand-metamask': '#f6851b',
- '--ck-brand-metamask-01': '#F6851B',
- '--ck-brand-metamask-02': '#E2761B',
- '--ck-brand-metamask-03': '#CD6116',
- '--ck-brand-metamask-04': '#161616',
- '--ck-brand-metamask-05': '#763D16',
- '--ck-brand-metamask-06': '#D7C1B3',
- '--ck-brand-metamask-07': '#C0AD9E',
- '--ck-brand-metamask-08': '#E4761B',
- '--ck-brand-metamask-09': '#233447',
- '--ck-brand-metamask-10': '#E4751F',
- '--ck-brand-metamask-11': '#FEF5E7',
- '--ck-brand-metamask-12': '#E3C8AB',
+ '--ck-brand-metamask': '#FF5C16',
+ '--ck-brand-metamask-bg': '#FFF2EB',
+ '--ck-brand-metamask-01': '#FF5C16',
+ '--ck-brand-metamask-02': '#E34807',
+ '--ck-brand-metamask-03': '#FF8D5D',
+ '--ck-brand-metamask-04': '#661800',
+ '--ck-brand-metamask-05': '#C0C4CD',
+ '--ck-brand-metamask-06': '#E7EBF6',
'--ck-brand-trust-01': '#3375BB',
'--ck-brand-trust-02': '#ffffff',
'--ck-brand-trust-01b': '#ffffff', // dark Theme
@@ -170,11 +166,11 @@ const themes = {
nouns: createCssColors(themeColors.nouns),
};
const globals = {
- brand: createCssVars(themeGlobals.brand),
- ensLight: createCssVars(themeGlobals.ens.light),
- ensDark: createCssVars(themeGlobals.ens.dark),
- graphicsLight: createCssVars(themeGlobals.graphics.light),
- graphicsDark: createCssVars(themeGlobals.graphics.dark),
+ brand: createCssColors(themeGlobals.brand),
+ ensLight: createCssColors(themeGlobals.ens.light),
+ ensDark: createCssColors(themeGlobals.ens.dark),
+ graphicsLight: createCssColors(themeGlobals.graphics.light),
+ graphicsDark: createCssColors(themeGlobals.graphics.dark),
};
const globalsLight = css`
@@ -262,7 +258,6 @@ export const ResetContainer = styled(motion.div)<{
}
}}
-
${(props) => {
if (
props.$customTheme &&
diff --git a/packages/connectkit/src/utils/index.ts b/packages/connectkit/src/utils/index.ts
index 66f22e8ac..58980508f 100644
--- a/packages/connectkit/src/utils/index.ts
+++ b/packages/connectkit/src/utils/index.ts
@@ -24,7 +24,7 @@ const nFormatter = (num: number, digits: number = 2) => {
{ value: 1, symbol: '' },
{ value: 1e3, symbol: 'k' },
{ value: 1e6, symbol: 'm' },
- { value: 1e9, symbol: 'g' },
+ { value: 1e9, symbol: 'b' },
{ value: 1e12, symbol: 't' },
{ value: 1e15, symbol: 'p' },
{ value: 1e18, symbol: 'e' },
@@ -80,6 +80,12 @@ function flattenChildren(children: React.ReactNode): ReactChildArray {
export const isWalletConnectConnector = (connectorId?: string) =>
connectorId === 'walletConnect';
+export const isFamilyAccountsConnector = (connectorId?: string) =>
+ connectorId === 'familyAccountsProvider';
+
+export const isFamilyConnector = (connectorId?: string) =>
+ connectorId === 'co.family.wallet';
+
export const isMetaMaskConnector = (connectorId?: string) =>
connectorId === 'metaMaskSDK';
@@ -89,6 +95,9 @@ export const isCoinbaseWalletConnector = (connectorId?: string) =>
export const isLedgerConnector = (connectorId?: string) =>
connectorId === 'ledger';
+export const isPortoConnector = (connectorId?: string) =>
+ connectorId === 'xyz.ithaca.porto';
+
export const isSafeConnector = (connectorId?: string) => connectorId === 'safe';
export const isInjectedConnector = (connectorId?: string) =>
diff --git a/packages/connectkit/src/utils/wallets.ts b/packages/connectkit/src/utils/wallets.ts
index 539139224..13c8383a4 100644
--- a/packages/connectkit/src/utils/wallets.ts
+++ b/packages/connectkit/src/utils/wallets.ts
@@ -25,6 +25,7 @@ export const isFrame = () => isWalletInstalled('Frame');
export const isPhantom = () => isWalletInstalled('Phantom');
export const isInfinityWallet = () => isWalletInstalled('InfinityWallet');
export const isRabby = () => isWalletInstalled('Rabby');
+export const isArgent = () => isWalletInstalled('Argent');
export const isFrontier = () => isWalletInstalled('Frontier');
export const isTrust = () => {
if (typeof window === 'undefined') return false;
@@ -39,3 +40,4 @@ export const isTalisman = () => isWalletInstalled('Talisman');
export const isFordefi = () => isWalletInstalled('Fordefi');
export const isRainbow = () => isWalletInstalled('Rainbow');
export const isZerion = () => isWalletInstalled('Zerion');
+export const isSafe = () => isWalletInstalled('Safe');
diff --git a/packages/connectkit/src/wallets/walletConfigs.tsx b/packages/connectkit/src/wallets/walletConfigs.tsx
index 557fb0266..dadf9057b 100644
--- a/packages/connectkit/src/wallets/walletConfigs.tsx
+++ b/packages/connectkit/src/wallets/walletConfigs.tsx
@@ -129,6 +129,13 @@ export const walletConfigs: {
: `familywallet://wc?uri=${encodeURIComponent(uri)}`;
},
},
+ familyAccountsProvider: {
+ name: 'Family',
+ shortName: 'Family',
+ icon: ,
+ iconConnector: ,
+ iconShape: 'squircle',
+ },
frame: {
name: 'Frame',
icon: ,
diff --git a/yarn.lock b/yarn.lock
index d73eb2652..fe62dc4d0 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -7218,6 +7218,7 @@ __metadata:
"@types/styled-components": ^5.1.25
buffer: ^6.0.3
detect-browser: ^5.3.0
+ family: ^0.1.2
framer-motion: ^6.3.11
qrcode: ^1.5.0
react-transition-state: ^1.1.4
@@ -9691,6 +9692,27 @@ __metadata:
languageName: unknown
linkType: soft
+"family@npm:^0.1.2":
+ version: 0.1.2
+ resolution: "family@npm:0.1.2"
+ peerDependencies:
+ react: 17.x || 18.x || 19.x
+ react-dom: 17.x || 18.x || 19.x
+ viem: 2.x
+ wagmi: 2.x
+ peerDependenciesMeta:
+ react:
+ optional: true
+ react-dom:
+ optional: true
+ viem:
+ optional: true
+ wagmi:
+ optional: true
+ checksum: 2e2d43b773f7c8719fcb93331416ef7710151f961e6645ae3ff87a23584335b1fe36b29099b28d6d860bacc3722888cf5de0373ea976d620b43a8daf21422274
+ languageName: node
+ linkType: hard
+
"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3":
version: 3.1.3
resolution: "fast-deep-equal@npm:3.1.3"