Skip to content
18 changes: 18 additions & 0 deletions packages/extension/src/libs/background/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import {
} from './internal';
import { handlePersistentEvents } from './external';
import SettingsState from '../settings-state';
import { isGeoRestricted } from '../utils/screening';

class BackgroundHandler {
#keyring: KeyRingBase;
Expand All @@ -36,6 +37,7 @@ class BackgroundHandler {
#persistentEvents: PersistentEvents;
#domainState: DomainState;
#settingsState: SettingsState;
#geoRestricted: boolean | undefined;

constructor() {
this.#keyring = new KeyRingBase();
Expand All @@ -51,6 +53,10 @@ class BackgroundHandler {
[ProviderName.massa]: {},
};
this.#providers = Providers;
this.#geoRestricted = undefined;
isGeoRestricted().then(restricted => {
this.#geoRestricted = restricted;
});
}
async init(): Promise<void> {
await handlePersistentEvents.bind(this)();
Expand Down Expand Up @@ -83,6 +89,9 @@ class BackgroundHandler {
method === InternalMethods.newWindowUnload
) {
this.#persistentEvents.deleteEvents(_tabid);
isGeoRestricted().then(restricted => {
this.#geoRestricted = restricted;
});
return {
result: JSON.stringify(true),
};
Expand All @@ -97,6 +106,15 @@ class BackgroundHandler {
error: JSON.stringify(getCustomError('Enkrypt: not implemented')),
};
}
if (this.#geoRestricted !== undefined && this.#geoRestricted) {
return {
error: JSON.stringify(
getCustomError(
'Enkrypt: Geo restricted https://www.myetherwallet.com/blocked',
),
),
};
}
const tabInfo = TabInfo(await Browser.tabs.get(_tabid));
if (!this.#tabProviders[_provider][_tabid]) {
const toWindow = (message: string) => {
Expand Down
32 changes: 32 additions & 0 deletions packages/extension/src/libs/utils/screening.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
const isGeoRestricted = async (): Promise<boolean> => {
return fetch('https://partners.mewapi.io/o/ipcomply')
.then(async res => {
if (res.ok) {
const json = await res.json();
return json.isRestricted;
}
return false;
})
.catch(() => false);
};

const walletCache: Record<string, boolean> = {};
const isWalletRestricted = async (walletAddress: string): Promise<boolean> => {
if (walletCache[walletAddress] !== undefined)
return walletCache[walletAddress];
const result = await fetch(
`https://partners.mewapi.io/o/walletscreen?address=${walletAddress}`,
)
.then(async res => {
if (res.ok) {
const { isRestricted } = await res.json();
return isRestricted;
}
return false;
})
.catch(() => false);
walletCache[walletAddress] = result;
return result;
};

export { isGeoRestricted, isWalletRestricted };
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ const method: MiddlewareFunction = async function (
if (payload.options && payload.options.domain) {
if (!isInitialized) {
res(null, payload.method === 'eth_coinbase' ? '' : []);
return throttledOpenOnboard();
throttledOpenOnboard();
return;
}
const accountsState = new AccountState();
accountsState
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,10 @@
</div>
</div>

<div v-if="!isApproval && decodedTx" class="provider-verify-transaction__amount">
<div
v-if="!isApproval && decodedTx"
class="provider-verify-transaction__amount"
>
<img :src="decodedTx?.tokenImage || network.icon" />

<div class="provider-verify-transaction__amount-info">
Expand Down Expand Up @@ -92,12 +95,20 @@
</div>
</div>

<send-fee-select :in-swap="true" :selected="selectedFee" :fee="gasCostValues[selectedFee]"
@open-popup="toggleSelectFee" />
<send-fee-select
:in-swap="true"
:selected="selectedFee"
:fee="gasCostValues[selectedFee]"
@open-popup="toggleSelectFee"
/>

<div class="provider-verify-transaction__data">
<a class="provider-verify-transaction__data-link" :class="{ open: isOpenData }" @click="toggleData"><span>Show
data</span> <right-chevron /></a>
<a
class="provider-verify-transaction__data-link"
:class="{ open: isOpenData }"
@click="toggleData"
><span>Show data</span> <right-chevron
/></a>

<div v-show="isOpenData" class="provider-verify-transaction__data-text">
<p>Data Hex: {{ decodedTx?.dataHex || '0x' }}</p>
Expand All @@ -106,16 +117,31 @@
<p v-if="errorMsg != ''" class="provider-verify-transaction__error">
{{ errorMsg }}
</p>
<transaction-fee-view v-model="isOpenSelectFee" :fees="gasCostValues" :selected="selectedFee" :is-header="true"
is-popup @gas-type-changed="selectFee" />
<transaction-fee-view
v-model="isOpenSelectFee"
:fees="gasCostValues"
:selected="selectedFee"
:is-header="true"
is-popup
@gas-type-changed="selectFee"
/>
</template>

<template #button-left>
<base-button title="Decline" :click="deny" :no-background="true" :disabled="isProcessing" />
<base-button
title="Decline"
:click="deny"
:no-background="true"
:disabled="isProcessing"
/>
</template>

<template #button-right>
<base-button title="Send" :click="approve" :disabled="isProcessing || errorMsg != ''" />
<base-button
title="Send"
:click="approve"
:disabled="isProcessing || errorMsg != ''"
/>
</template>
</common-popup>
</template>
Expand Down Expand Up @@ -314,11 +340,11 @@ const approve = async () => {
to: tx.to
? tx.to.toString()
: bufferToHex(
generateAddress(
tx.getSenderAddress().toBytes(),
bigIntToBytes(tx.nonce),
generateAddress(
tx.getSenderAddress().toBytes(),
bigIntToBytes(tx.nonce),
),
),
),
isIncoming: tx.getSenderAddress().toString() === tx.to?.toString(),
network: network.value.name,
status: ActivityStatus.pending,
Expand Down
Loading