Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: prioritize MetaMask over Brave Wallet #39

Merged
merged 1 commit into from
Feb 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 36 additions & 1 deletion src/__tests__/ethereum-conflicts.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,15 @@ describe("`window.ethereum` conflict tests", () => {
const metaMaskTestingUtils = generateTestingUtils({
providerType: "MetaMask",
});
const braveWalletTestingUtils = generateTestingUtils({
providerType: "MetaMask",
});
const braveWalletProvider = braveWalletTestingUtils.getProvider();
(braveWalletProvider as any).isBraveWallet = true;

const metaMaskProvider = metaMaskTestingUtils.getProvider();
const ethereum = {
providers: [coinbaseProvider, metaMaskProvider],
providers: [coinbaseProvider, braveWalletProvider, metaMaskProvider],
};
(window as any).ethereum = ethereum;

Expand All @@ -48,6 +54,35 @@ describe("`window.ethereum` conflict tests", () => {

(window as any).ethereum = originalEth;
});

test("when the `providers` does have a valid Brave Wallet provider, it should synchronise in `notConnected` status", async () => {
let originalEth = (window as any).ethereum;
const testingUtils = generateTestingUtils();
const coinbaseProvider = testingUtils.getProvider();
const braveWalletTestingUtils = generateTestingUtils({
providerType: "MetaMask",
});
const braveWalletProvider = braveWalletTestingUtils.getProvider();
(braveWalletProvider as any).isBraveWallet = true;
const ethereum = {
providers: [coinbaseProvider, braveWalletProvider],
};
(window as any).ethereum = ethereum;

braveWalletTestingUtils.mockNotConnectedWallet();

const { result, waitForNextUpdate } = renderHook(useMetaMask, {
wrapper: MetaMaskProvider,
});

expect(result.current.status).toEqual("initializing");

await waitForNextUpdate();

expect(result.current.status).toEqual("notConnected");

(window as any).ethereum = originalEth;
});
});

test("when the `MetaMask` provider is corrupted or removed in the meantime, it should throw", async () => {
Expand Down
17 changes: 13 additions & 4 deletions src/metamask-provider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,22 @@ type WindowInstanceWithEthereum = Window &
function getMetaMaskProvider() {
const ethereum = (window as WindowInstanceWithEthereum).ethereum;
if (!ethereum) return null;
// The `providers` field is populated when CoinBase Wallet extension is also installed
// The `providers` field is populated
// - when CoinBase Wallet extension is also installed
// - when user is on Brave and Brave Wallet is not deactivated
// The expected object is an array of providers, the MetaMask provider is inside
// See https://docs.cloud.coinbase.com/wallet-sdk/docs/injected-provider-guidance for more information
// See also https://metamask.zendesk.com/hc/en-us/articles/360038596792-Using-Metamask-wallet-in-Brave-browser
if (Array.isArray(ethereum.providers)) {
const metaMaskProvider = ethereum.providers.find((p: any) => p.isMetaMask);
if (!metaMaskProvider) return null;
return metaMaskProvider;
const metaMaskProvider = ethereum.providers.find(
(p: any) => p.isMetaMask && !p.isBraveWallet
);
if (metaMaskProvider) return metaMaskProvider;
const braveWalletProvider = ethereum.providers.find(
(p: any) => p.isMetaMask && p.isBraveWallet
);
if (!braveWalletProvider) return null;
return braveWalletProvider;
}
if (!ethereum.isMetaMask) return null;
return ethereum;
Expand Down