Skip to content

Commit

Permalink
feat: reflector page provider (#2718)
Browse files Browse the repository at this point in the history
* feat: reflector page provider

* feat: udpate provider

* fix: provider

* chore: fix some ui bugs

* chore: fix some bugs

* fix: metamaskModeService

* feat: update provider

* fix: conflict with rainbow

* feat: update page-provider

---------

Co-authored-by: vvvvvv1vvvvvv <[email protected]>
  • Loading branch information
cs1707 and vvvvvv1vvvvvv authored Jan 14, 2025
1 parent b599980 commit 57bfb04
Show file tree
Hide file tree
Showing 34 changed files with 1,137 additions and 582 deletions.
24 changes: 21 additions & 3 deletions _raw/locales/en/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -1151,7 +1151,8 @@
"recentlyConnected": "Recently connected",
"noRecentlyConnectedDapps": "No recently connected Dapps",
"noConnectedDapps": "No connected Dapps",
"dapps": "Dapps"
"dapps": "Dapps",
"metamaskModeTooltip": "Can’t connect Rabby on this Dapp? Try enabling <1>MetaMask Mode</1>"
},
"feedback": {
"directMessage": {
Expand Down Expand Up @@ -1268,7 +1269,8 @@
"enableTestnets": "Enable Testnets",
"toggleThemeMode": "Theme Mode",
"themeMode": "Theme Mode",
"customTestnet": "Add Custom Network"
"customTestnet": "Add Custom Network",
"metamaskMode": "MetaMask Mode"
},
"aboutUs": "About us",
"currentVersion": "Current Version",
Expand Down Expand Up @@ -1403,6 +1405,13 @@
},
"echologyPopup": {
"title": "Ecosystem"
},
"MetamaskModePopup": {
"title": "MetaMask Mode",
"desc": "If you can’t connect Rabby on a Dapp, enable MetaMask Mode and connect by selecting the MetaMask option.",
"footerText": "Add more Dapps to MetaMask Mode in More > MetaMask Mode",
"enableDesc": "Enable if Dapp only works with MetaMask",
"toastSuccess": "Enabled. Refresh the page to reconnect."
}
},
"nft": {
Expand Down Expand Up @@ -1842,7 +1851,12 @@
"SignTestnetPermission": {
"title": "Signing permission"
},
"ignoreAll": "Ignore all"
"ignoreAll": "Ignore all",
"otherWalletBtn": "Connect with Another Wallet",
"SelectWallet": {
"title": "Select a Wallet to Connect",
"desc": "Choose from the wallets you have installed"
}
},
"addressDetail": {
"add-to-whitelist": "Add to Whitelist",
Expand Down Expand Up @@ -2466,6 +2480,10 @@
"loading": "Searching the deployed chain of this address"
}
},
"metamaskModeDapps": {
"title": "MetaMask Mode",
"desc": "MetaMask Mode enabled for the following Dapps. You can connect Rabby by selecting the MetaMask option."
},
"forgotPassword": {
"home": {
"title": "Forgot Password",
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@
"@rabby-wallet/eth-walletconnect-keyring": "2.1.5",
"@rabby-wallet/eth-watch-keyring": "1.0.0",
"@rabby-wallet/gnosis-sdk": "1.3.10",
"@rabby-wallet/page-provider": "0.4.2",
"@rabby-wallet/page-provider": "0.4.3",
"@rabby-wallet/rabby-action": "0.1.8",
"@rabby-wallet/rabby-api": "0.9.9",
"@rabby-wallet/rabby-security-engine": "2.0.7",
Expand Down
3 changes: 2 additions & 1 deletion src/background/controller/provider/controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@ class ProviderController extends BaseController {
};

ethRequestAccounts = async ({ session: { origin } }) => {
console.log('ethRequestAccounts');
if (!permissionService.hasPermission(origin)) {
throw ethErrors.provider.unauthorized();
}
Expand Down Expand Up @@ -1257,7 +1258,7 @@ class ProviderController extends BaseController {
*/
@Reflect.metadata('SAFE', true)
walletRevokePermissions = ({ session: { origin }, data: { params } }) => {
if (Wallet.isUnlocked() && Wallet.getConnectedSite(origin)) {
if (Wallet.isUnlocked() && Wallet.getSite(origin)) {
if (params?.[0] && 'eth_accounts' in params[0]) {
Wallet.removeConnectedSite(origin);
}
Expand Down
6 changes: 1 addition & 5 deletions src/background/controller/provider/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,7 @@ import { ProviderRequest } from './type';

import { ethErrors } from 'eth-rpc-errors';
import { tab } from 'background/webapi';
import {
sessionService,
keyringService,
contextMenuService,
} from 'background/service';
import { sessionService, keyringService } from 'background/service';

import rpcFlow from './rpcFlow';
import internalMethod from './internalMethod';
Expand Down
19 changes: 13 additions & 6 deletions src/background/controller/provider/internalMethod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import {
permissionService,
keyringService,
preferenceService,
contextMenuService,
} from 'background/service';
import providerController from './controller';
import { findChainByEnum } from '@/utils/chain';
Expand All @@ -23,7 +22,6 @@ const tabCheckin = ({
origin,
}) => {
session.setProp({ origin, name, icon });
contextMenuService.createOrUpdate(origin);
const site = permissionService.getSite(origin);
if (site) {
permissionService.updateConnectSite(origin, { ...site, icon, name }, true);
Expand Down Expand Up @@ -79,12 +77,8 @@ const providerOverwrite = ({
};

const hasOtherProvider = () => {
const prev = preferenceService.getHasOtherProvider();
preferenceService.setHasOtherProvider(true);
const isRabby = preferenceService.getIsDefaultWallet();
if (!prev) {
contextMenuService.init();
}
if (wallet.isUnlocked()) {
setPopupIcon(isRabby ? 'rabby' : 'metamask');
}
Expand All @@ -95,10 +89,23 @@ const isDefaultWallet = ({ origin }) => {
return preferenceService.getIsDefaultWallet(origin);
};

const getProvider = ({ origin }: { origin: string }) => {
return permissionService.getSite(origin)?.rdns;
};

const resetProvider = ({ origin }: { origin: string }) => {
const site = permissionService.getSite(origin);
if (site) {
permissionService.setSite({ ...site, rdns: undefined });
}
};

export default {
tabCheckin,
getProviderState,
providerOverwrite,
hasOtherProvider,
isDefaultWallet,
'rabby:getProvider': getProvider,
'rabby:resetProvider': resetProvider,
};
5 changes: 4 additions & 1 deletion src/background/controller/provider/rpcFlow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,11 @@ const flowContext = flow
const {
request: {
session: { origin, name, icon },
data,
},
mapMethod,
} = ctx;
console.log(ctx);
if (!Reflect.getMetadata('SAFE', providerController, mapMethod)) {
if (!permissionService.hasPermission(origin)) {
if (connectOrigins.has(origin)) {
Expand All @@ -119,12 +121,13 @@ const flowContext = flow
try {
const { defaultChain } = await notificationService.requestApproval(
{
params: { origin, name, icon },
params: { origin, name, icon, $ctx: data.$ctx },
approvalComponent: 'Connect',
},
{ height: 800 }
);
connectOrigins.delete(origin);
console.log('xxxxx');
permissionService.addConnectedSiteV2({
origin,
name,
Expand Down
66 changes: 63 additions & 3 deletions src/background/controller/wallet.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import * as ethUtil from 'ethereumjs-util';
import { ethErrors } from 'eth-rpc-errors';
import { ethers, Contract } from 'ethers';
import { groupBy, isEqual, sortBy, uniq } from 'lodash';
import { groupBy, isEqual, sortBy, truncate, uniq } from 'lodash';
import abiCoder, { AbiCoder } from 'web3-eth-abi';
import {
keyringService,
Expand All @@ -18,7 +18,6 @@ import {
swapService,
RPCService,
unTriggerTxCounter,
contextMenuService,
securityEngineService,
transactionBroadcastWatchService,
RabbyPointsService,
Expand Down Expand Up @@ -133,6 +132,7 @@ import pRetry from 'p-retry';
import Browser from 'webextension-polyfill';
import { hashSafeMessage } from '@safe-global/protocol-kit';
import { userGuideService } from '../service/userGuide';
import { metamaskModeService } from '../service/metamaskModeService';

const stashKeyrings: Record<string | number, any> = {};

Expand Down Expand Up @@ -1935,7 +1935,6 @@ export class WalletController extends BaseController {
);
site.preferMetamask = false;
permissionService.setSite(site);
contextMenuService.createOrUpdate(site.origin);
const currentIsDefaultWallet = preferenceService.getIsDefaultWallet(origin);
const hasOtherProvider = preferenceService.getHasOtherProvider();
if (prevIsDefaultWallet !== currentIsDefaultWallet && hasOtherProvider) {
Expand Down Expand Up @@ -1976,7 +1975,29 @@ export class WalletController extends BaseController {
permissionService.removeConnectedSite(origin);
};
getSitesByDefaultChain = permissionService.getSitesByDefaultChain;
/**
* @deprecated
*/
getPreferMetamaskSites = permissionService.getPreferMetamaskSites;
getMetamaskModeSites = permissionService.getMetamaskModeSites;
addMetamaskModeSite = (site: ConnectedSite) => {
permissionService.setSite({
...site,
isMetamaskMode: true,
});
metamaskModeService.localSites.push(
site.origin.replace(/^https?:\/\//, '')
);
};
removeMetamaskModeSite = (site: ConnectedSite) => {
permissionService.setSite({
...site,
isMetamaskMode: false,
});
metamaskModeService.localSites = metamaskModeService.localSites.filter(
(item) => item !== site.origin.replace(/^https?:\/\//, '')
);
};
topConnectedSite = (origin: string) =>
permissionService.topConnectedSite(origin);
unpinConnectedSite = (origin: string) =>
Expand Down Expand Up @@ -5051,6 +5072,45 @@ export class WalletController extends BaseController {
});
};

changeDappProvider = ({
origin,
name,
icon,
rdns,
}: {
origin: string;
name: string;
icon: string;
rdns: string;
}) => {
const site = permissionService.getSite(origin);
if (site) {
permissionService.setSite({
...site,
rdns,
isConnected: false,
});
} else {
permissionService.setSite({
origin,
name,
icon,
chain: CHAINS_ENUM.ETH,
isSigned: false,
isConnected: false,
isTop: false,
rdns,
});
}
sessionService.broadcastEvent(
'rabby:providerChanged',
{
rdns,
},
origin,
true
);
};
savedUnencryptedKeyringData = async () =>
keyringService.savedUnencryptedKeyringData();

Expand Down
2 changes: 2 additions & 0 deletions src/background/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ import { userGuideService } from './service/userGuide';
import { isSameAddress } from './utils';
import rpcCache from './utils/rpcCache';
import { storage } from './webapi';
import { metamaskModeService } from './service/metamaskModeService';

Safe.adapter = fetchAdapter as any;

Expand Down Expand Up @@ -104,6 +105,7 @@ async function restoreAppState() {
await bridgeService.init();
await gasAccountService.init();
await uninstalledService.init();
await metamaskModeService.init();

await walletController.tryUnlock();

Expand Down
Loading

0 comments on commit 57bfb04

Please sign in to comment.