Skip to content

Commit 51d7789

Browse files
authored
refactor: remove use of web3-eth-accounts (#12370)
1 parent bf94902 commit 51d7789

File tree

40 files changed

+174
-199
lines changed

40 files changed

+174
-199
lines changed

eslint.config.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ const deferPackages = [
2121
'@metamask/eth-sig-util',
2222
'@masknet/gun-utils',
2323
'web3-eth',
24-
'web3-eth-accounts',
2524
'twitter-text',
2625
'web3-utils',
2726
'@solana/web3.js',

packages/mask/background/services/identity/persona/sign.ts

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,53 +5,50 @@ import {
55
fromBase64URL,
66
PopupRoutes,
77
type ECKeyIdentifier,
8-
type SignType,
98
MaskMessages,
9+
type SignMessage,
1010
} from '@masknet/shared-base'
1111
import { queryPersonasWithPrivateKey } from '../../../database/persona/web.js'
1212
import { openPopupWindow } from '../../helper/popup-opener.js'
1313

14+
async function getIdentifier(message: unknown, identifier?: ECKeyIdentifier, source?: string, silent = false) {
15+
if (!identifier || !silent) {
16+
const requestID = crypto.randomUUID()
17+
await openPopupWindow(PopupRoutes.PersonaSignRequest, {
18+
message: JSON.stringify(message),
19+
requestID,
20+
identifier: identifier?.toText(),
21+
source,
22+
})
23+
24+
return timeout(
25+
new Promise<PersonaIdentifier>((resolve, reject) => {
26+
MaskMessages.events.personaSignRequest.on((approval) => {
27+
if (approval.requestID !== requestID) return
28+
if (!approval.selectedPersona) reject(new Error('The user refused to sign message with persona.'))
29+
resolve(approval.selectedPersona!)
30+
})
31+
}),
32+
60 * 1000,
33+
'Timeout of signing with persona.',
34+
)
35+
}
36+
return identifier
37+
}
1438
/**
1539
* Generate a signature w or w/o confirmation from user
1640
*/
1741
export async function signWithPersona(
18-
type: SignType,
19-
message: unknown,
42+
message: SignMessage,
2043
identifier?: ECKeyIdentifier,
21-
source?: string,
44+
origin?: string,
2245
silent = false,
2346
): Promise<string> {
24-
const getIdentifier = async () => {
25-
if (!identifier || !silent) {
26-
const requestID = crypto.randomUUID()
27-
await openPopupWindow(PopupRoutes.PersonaSignRequest, {
28-
message: JSON.stringify(message),
29-
requestID,
30-
identifier: identifier?.toText(),
31-
source,
32-
})
33-
34-
return timeout(
35-
new Promise<PersonaIdentifier>((resolve, reject) => {
36-
MaskMessages.events.personaSignRequest.on((approval) => {
37-
if (approval.requestID !== requestID) return
38-
if (!approval.selectedPersona)
39-
reject(new Error('The user refused to sign message with persona.'))
40-
resolve(approval.selectedPersona!)
41-
})
42-
}),
43-
60 * 1000,
44-
'Timeout of signing with persona.',
45-
)
46-
}
47-
return identifier
48-
}
49-
50-
const identifier_ = await getIdentifier()
47+
identifier = await getIdentifier(message.data, identifier, origin, silent)
5148

5249
// find the persona with the signer's identifier
53-
const persona = (await queryPersonasWithPrivateKey()).find((x) => x.identifier === identifier_)
50+
const persona = (await queryPersonasWithPrivateKey()).find((x) => x.identifier === identifier)
5451
if (!persona?.privateKey.d) throw new Error('Persona not found')
5552

56-
return Signer.sign(type, Buffer.from(fromBase64URL(persona.privateKey.d)), message)
53+
return Signer.sign(message, Buffer.from(fromBase64URL(persona.privateKey.d)))
5754
}

packages/mask/background/services/wallet/services/send.ts

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { JsonRpcRequest } from 'web3-types'
2-
import { ECKeyIdentifier, type SignType } from '@masknet/shared-base'
2+
import { ECKeyIdentifier, SignType } from '@masknet/shared-base'
33
import { EVMRequestReadonly, EVMWeb3Readonly } from '@masknet/web3-providers'
44
import {
55
ChainId,
@@ -8,10 +8,10 @@ import {
88
EthereumMethodType,
99
PayloadEditor,
1010
type TransactionOptions,
11-
Signer,
1211
} from '@masknet/web3-shared-evm'
1312
import { signWithWallet } from './wallet/index.js'
1413
import { signWithPersona } from '../../identity/persona/sign.js'
14+
import type { TransactionSerializable } from 'viem'
1515

1616
/**
1717
* The entrance of all RPC requests to MaskWallet.
@@ -23,25 +23,35 @@ export async function send(payload: JsonRpcRequest, options?: TransactionOptions
2323
from,
2424
chainId = options?.chainId ?? ChainId.Mainnet,
2525
signableMessage,
26-
signableConfig,
26+
signableTransaction,
2727
} = PayloadEditor.fromPayload(payload, options)
2828
const identifier = ECKeyIdentifier.from(options?.identifier).unwrapOr(undefined)
29-
const signer =
30-
identifier ?
31-
new Signer(identifier, <T>(type: SignType, message: T, identifier?: ECKeyIdentifier) =>
32-
signWithPersona(type, message, identifier, undefined, true),
33-
)
34-
: new Signer(owner || from!, signWithWallet)
29+
const signTransaction = async (transaction: TransactionSerializable) => {
30+
const message = { type: SignType.Transaction as const, data: transaction }
31+
if (identifier) {
32+
return signWithPersona(message, identifier)
33+
} else {
34+
return signWithWallet(message, owner || from!)
35+
}
36+
}
37+
const signMessageOrTypedData = async (type: SignType.Message | SignType.TypedData, message: string) => {
38+
const msg = { type, data: message }
39+
if (identifier) {
40+
return signWithPersona(msg, identifier)
41+
} else {
42+
return signWithWallet(msg, owner || from!)
43+
}
44+
}
3545

3646
switch (payload.method) {
3747
case EthereumMethodType.eth_sendTransaction:
3848
case EthereumMethodType.MASK_REPLACE_TRANSACTION:
39-
if (!signableConfig) throw new Error('No transaction to be sent.')
49+
if (!signableTransaction) throw new Error('No transaction to be sent.')
4050

4151
try {
4252
return createJsonRpcResponse(
4353
pid,
44-
await EVMWeb3Readonly.sendSignedTransaction(await signer.signTransaction(signableConfig), {
54+
await EVMWeb3Readonly.sendSignedTransaction(await signTransaction(signableTransaction), {
4555
chainId,
4656
providerURL,
4757
}),
@@ -53,21 +63,21 @@ export async function send(payload: JsonRpcRequest, options?: TransactionOptions
5363
case EthereumMethodType.personal_sign:
5464
try {
5565
if (!signableMessage) throw new Error('No message to be signed.')
56-
return createJsonRpcResponse(pid, await signer.signMessage(signableMessage))
66+
return createJsonRpcResponse(pid, await signMessageOrTypedData(SignType.Message, signableMessage))
5767
} catch (error) {
5868
throw ErrorEditor.from(error, null, 'Failed to sign message.').error
5969
}
6070
case EthereumMethodType.eth_signTypedData_v4:
6171
try {
6272
if (!signableMessage) throw new Error('No typed data to be signed.')
63-
return createJsonRpcResponse(pid, await signer.signTypedData(signableMessage))
73+
return createJsonRpcResponse(pid, await signMessageOrTypedData(SignType.TypedData, signableMessage))
6474
} catch (error) {
6575
throw ErrorEditor.from(error, null, 'Failed to sign typed data.').error
6676
}
6777
case EthereumMethodType.eth_signTransaction:
6878
try {
69-
if (!signableConfig) throw new Error('No transaction to be signed.')
70-
return createJsonRpcResponse(pid, await signer.signTransaction(signableConfig))
79+
if (!signableTransaction) throw new Error('No transaction to be signed.')
80+
return createJsonRpcResponse(pid, await signTransaction(signableTransaction))
7181
} catch (error) {
7282
throw ErrorEditor.from(error, null, 'Failed to sign transaction.').error
7383
}

packages/mask/background/services/wallet/services/wallet/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import defer * as web3_utils from 'web3-utils'
44
import { toBytes } from '@ethereumjs/util'
55
import { api } from '@dimensiondev/mask-wallet-core/proto'
66
import { Signer } from '@masknet/web3-providers'
7-
import { ImportSource, type SignType, type Wallet } from '@masknet/shared-base'
7+
import { ImportSource, type SignMessage, type Wallet } from '@masknet/shared-base'
88
import { HD_PATH_WITHOUT_INDEX_ETHEREUM } from '@masknet/web3-shared-base'
99
import * as Mask from '../maskwallet/index.js'
1010
import * as database from './database/index.js'
@@ -249,8 +249,8 @@ export async function resetAllWallets() {
249249
await database.resetAllWallets()
250250
}
251251

252-
export async function signWithWallet<T>(type: SignType, message: T, address: string) {
253-
return Signer.sign(type, Buffer.from(toBytes(`0x${await exportPrivateKey(address)}`)), message)
252+
export async function signWithWallet(message: SignMessage, address: string) {
253+
return Signer.sign(message, Buffer.from(toBytes(`0x${await exportPrivateKey(address)}`)))
254254
}
255255

256256
export async function exportMnemonicWords(address: string, unverifiedPassword?: string) {

packages/mask/popups/components/ConnectedWallet/index.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,7 @@ export const ConnectedWallet = memo(function ConnectedWallet() {
117117
if (!result) return
118118

119119
const signature = await Services.Identity.signWithPersona(
120-
SignType.Message,
121-
result.signPayload,
120+
{ type: SignType.Message, data: result.signPayload },
122121
persona.identifier,
123122
location.origin,
124123
true,

packages/mask/popups/pages/Personas/AccountDetail/index.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,7 @@ export const Component = memo(() => {
7777
if (!result) return
7878

7979
const signature = await Service.Identity.signWithPersona(
80-
SignType.Message,
81-
result.signPayload,
80+
{ type: SignType.Message, data: result.signPayload },
8281
currentPersona.identifier,
8382
location.origin,
8483
true,

packages/mask/popups/pages/Personas/ConnectWallet/index.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,7 @@ export const Component = memo(function ConnectWalletPage() {
172172

173173
if (!payload) return
174174
const personaSignature = await Services.Identity.signWithPersona(
175-
SignType.Message,
176-
payload.signPayload,
175+
{ type: SignType.Message, data: payload.signPayload },
177176
currentPersona.identifier,
178177
location.origin,
179178
true,

packages/mask/popups/pages/Personas/PersonaAvatarSetting/index.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,7 @@ const PersonaAvatarSetting = memo(function PersonaAvatar() {
132132
// Verify Wallet sign with persona
133133
if (bindingWallets.some((x) => isSameAddress(x.identity, account))) {
134134
sign = await Services.Identity.signWithPersona(
135-
SignType.Message,
136-
JSON.stringify(data),
135+
{ type: SignType.Message, data: JSON.stringify(data) },
137136
currentPersona.identifier,
138137
location.origin,
139138
true,

packages/mask/popups/pages/Personas/PersonaSignRequest/index.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ export const Component = memo(function PersonaSignRequest() {
6060
case MethodAfterPersonaSign.DISCONNECT_NEXT_ID:
6161
if (!message) break
6262
const signature = await Services.Identity.signWithPersona(
63-
SignType.Message,
64-
message,
63+
{ type: SignType.Message, data: message },
6564
selectedPersona,
6665
location.origin,
6766
true,

packages/mask/shared-ui/initUIContext.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export function setupUIContext() {
4040
queryPersonaByProfile: Services.Identity.queryPersonaByProfile,
4141
openDashboard: Services.Helper.openDashboard,
4242
openPopupWindow,
43-
signWithPersona: (a, b, c, d) => Services.Identity.signWithPersona(a, b, c, location.origin, d),
43+
signWithPersona: (a, b, c) => Services.Identity.signWithPersona(a, b, location.origin, c),
4444
hasPaymentPassword: Services.Wallet.hasPassword,
4545
createPersona: () => Services.Helper.openDashboard(DashboardRoutes.SignUpPersona),
4646
attachProfile: Services.Identity.attachProfile,

0 commit comments

Comments
 (0)