Skip to content

Commit 6e13011

Browse files
authored
fix: mf-4185 accounts from Firefly are all trusted (#9628)
1 parent c2c6d51 commit 6e13011

File tree

4 files changed

+34
-59
lines changed

4 files changed

+34
-59
lines changed

packages/plugins/EVM/src/state/IdentityService.ts

+15-54
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,7 @@ import {
1212
type SocialAddress,
1313
type SocialIdentity,
1414
} from '@masknet/shared-base'
15-
import {
16-
ENS,
17-
Firefly,
18-
Lens,
19-
MaskX,
20-
NextIDProof,
21-
NextIDStorageProvider,
22-
RSS3,
23-
SpaceID,
24-
Twitter,
25-
} from '@masknet/web3-providers'
15+
import { ENS, Lens, MaskX, NextIDProof, NextIDStorageProvider, RSS3, SpaceID, Twitter } from '@masknet/web3-providers'
2616
import { captureAsyncTransaction } from '@masknet/web3-providers/helpers'
2717
import { MaskX_BaseAPI } from '@masknet/web3-providers/types'
2818
import { ChainId, isValidAddress, isZeroAddress } from '@masknet/web3-shared-evm'
@@ -148,7 +138,7 @@ export class IdentityService extends IdentityServiceState<ChainId> {
148138
return this.createSocialAddress(SocialAddressType.Crossbell, info.address, info.crossbell)
149139
}),
150140
)
151-
return compact(allSettled.map((x) => (x.status === 'fulfilled' ? x.value : undefined)).filter(Boolean))
141+
return compact(allSettled.map((x) => (x.status === 'fulfilled' ? x.value : undefined)))
152142
}
153143

154144
/** Read a social address from avatar NextID storage. */
@@ -228,22 +218,7 @@ export class IdentityService extends IdentityServiceState<ChainId> {
228218
return this.createSocialAddress(SocialAddressType.Lens, profile.ownedBy, name)
229219
}),
230220
)
231-
return compact(allSettled.map((x) => (x.status === 'fulfilled' ? x.value : undefined)).filter(Boolean))
232-
}
233-
234-
private async getSocialAddressFromFirefly({ identifier }: SocialIdentity) {
235-
const lensAccounts = await Firefly.getLensByTwitterId(identifier?.userId)
236-
const names = lensAccounts.map((x) => x.handle)
237-
if (!names.length) return
238-
239-
const allSettled = await Promise.allSettled(
240-
names.map(async (name) => {
241-
const profile = await Lens.getProfileByHandle(name)
242-
if (!profile) return
243-
return this.createSocialAddress(SocialAddressType.Firefly, profile.ownedBy, name)
244-
}),
245-
)
246-
return compact(allSettled.map((x) => (x.status === 'fulfilled' ? x.value : undefined)).filter(Boolean))
221+
return compact(allSettled.map((x) => (x.status === 'fulfilled' ? x.value : undefined)))
247222
}
248223

249224
/** Read a social address from Twitter Blue. */
@@ -273,6 +248,7 @@ export class IdentityService extends IdentityServiceState<ChainId> {
273248
MaskX_BaseAPI.SourceType.Leaderboard,
274249
MaskX_BaseAPI.SourceType.OpenSea,
275250
MaskX_BaseAPI.SourceType.Sybil,
251+
MaskX_BaseAPI.SourceType.RSS3,
276252
]
277253
const results = response.records.filter((x) => {
278254
if (!isValidAddress(x.web3_addr) || !sourceTypes.includes(x.source)) return false
@@ -305,7 +281,7 @@ export class IdentityService extends IdentityServiceState<ChainId> {
305281
}
306282

307283
override async getFromRemote(identity: SocialIdentity, includes?: SocialAddressType[]) {
308-
const socialAddressFromFirefly = this.getSocialAddressFromFirefly(identity)
284+
const socialAddressFromMaskX = this.getSocialAddressesFromMaskX(identity)
309285
const allSettled = await Promise.allSettled([
310286
captureAsyncTransaction('getSocialAddressFromBio', this.getSocialAddressFromBio(identity)),
311287
captureAsyncTransaction('getSocialAddressFromENS', this.getSocialAddressFromENS(identity)),
@@ -317,40 +293,25 @@ export class IdentityService extends IdentityServiceState<ChainId> {
317293
captureAsyncTransaction('getSocialAddressFromCrossbell', this.getSocialAddressFromCrossbell(identity)),
318294
captureAsyncTransaction('getSocialAddressFromTwitterBlue', this.getSocialAddressFromTwitterBlue(identity)),
319295
captureAsyncTransaction('getSocialAddressesFromNextID', this.getSocialAddressesFromNextID(identity)),
320-
captureAsyncTransaction('getSocialAddressesFromMaskX', this.getSocialAddressesFromMaskX(identity)),
296+
captureAsyncTransaction('getSocialAddressesFromMaskX', socialAddressFromMaskX),
321297
captureAsyncTransaction('getSocialAddressFromLens', this.getSocialAddressFromLens(identity)),
322-
captureAsyncTransaction('getSocialAddressFromFirefly', socialAddressFromFirefly),
323298
])
324-
const identities_ = allSettled
325-
.flatMap((x) => (x.status === 'fulfilled' ? x.value : []))
326-
.filter(Boolean) as Array<SocialAddress<ChainId>>
299+
const identities_ = compact(allSettled.flatMap((x) => (x.status === 'fulfilled' ? x.value : [])))
327300

328301
const identities = uniqBy(identities_, (x) => [x.type, x.label, x.address.toLowerCase()].join('_'))
329-
if (!getNextIDPlatform() || !(process.env.channel === 'stable' && process.env.NODE_ENV === 'production')) {
330-
return identities
331-
}
332-
const [identitiesFromNextID, lensAccounts] = await Promise.all([
302+
const [identitiesFromNextID, trustedAccounts] = await Promise.all([
333303
this.getSocialAddressesFromNextID(identity),
334-
socialAddressFromFirefly,
304+
socialAddressFromMaskX,
335305
])
336-
const lensAddresses = lensAccounts?.map((x) => x.address.toLowerCase()) ?? []
306+
const trustedAddresses = trustedAccounts?.map((x) => x.address.toLowerCase()) ?? []
337307
const identitiesAddressesFromNextID = identitiesFromNextID.map((y) => y.address.toLowerCase())
338-
const allSettledTrustedIdentities = await Promise.allSettled(
339-
uniqBy(identities, (x) => x.address.toLowerCase()).map(async (x) => {
340-
const trusted =
341-
lensAddresses.includes(x.address.toLowerCase()) ||
342-
(await NextIDProof.verifyTwitterHandlerByAddress(x.address, identity.identifier?.userId ?? ''))
343-
return { ...x, trusted }
344-
}),
345-
)
346308

347309
return uniqBy(
348-
(
349-
allSettledTrustedIdentities
350-
.flatMap((x) => (x.status === 'fulfilled' && x.value.trusted ? x.value : undefined))
351-
.filter(Boolean) as Array<SocialAddress<ChainId>>
352-
)
353-
.filter((x) => !identitiesAddressesFromNextID.includes(x.address.toLowerCase()))
310+
identities
311+
.filter((x) => {
312+
const address = x.address.toLowerCase()
313+
return !identitiesAddressesFromNextID.includes(address) && trustedAddresses.includes(address)
314+
})
354315
.concat(identitiesFromNextID),
355316
(x) => x.address.toLowerCase(),
356317
)

packages/shared/src/UI/components/AccountIcon/index.tsx

+10
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,16 @@ export function AccountIcon({ socialAccount, classes: externalClasses }: Account
190190
/>
191191
</AccountTooltips>
192192
) : null}
193+
194+
{supportedAddressTypes.includes(SocialAddressType.RSS3) ? (
195+
<AccountTooltips type={SocialAddressType.RSS3}>
196+
<Icons.RSS3
197+
className={cx(classes.actionIcon, classes.icon, classes.roundedIcon)}
198+
size={18}
199+
style={iconStyle}
200+
/>
201+
</AccountTooltips>
202+
) : null}
193203
</>
194204
)
195205
}

packages/shared/src/UI/components/AddressItem/index.tsx

+8-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { first } from 'lodash-es'
22
import { Icons } from '@masknet/icons'
33
import { makeStyles } from '@masknet/theme'
44
import { Box, Link, Typography, type TypographyProps } from '@mui/material'
5-
import type { SocialAccount } from '@masknet/shared-base'
5+
import { SocialAddressType, type SocialAccount } from '@masknet/shared-base'
66
import { useWeb3State } from '@masknet/web3-hooks-base'
77
import { isSameAddress } from '@masknet/web3-shared-base'
88
import type { Web3Helper } from '@masknet/web3-helpers'
@@ -45,12 +45,16 @@ export function AddressItem({
4545

4646
if (!socialAccount) return null
4747

48+
const preferAddress =
49+
!socialAccount.label ||
50+
isEnsSubdomain(socialAccount.label) ||
51+
socialAccount.supportedAddressTypes?.includes(SocialAddressType.Firefly) || // Label from Firefly is not reliable
52+
isSameAddress(socialAccount.label, socialAccount.address)
53+
4854
return (
4955
<>
5056
<Box onClick={(ev: React.MouseEvent) => onClick?.(ev)}>
51-
{!socialAccount.label ||
52-
isEnsSubdomain(socialAccount.label) ||
53-
isSameAddress(socialAccount.label, socialAccount.address) ? (
57+
{preferAddress ? (
5458
<ReversedAddress
5559
{...TypographyProps}
5660
address={socialAccount.address}

packages/web3-providers/src/types/MaskX.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export namespace MaskX_BaseAPI {
55
}
66

77
export enum SourceType {
8-
CyberConnect = 'cyberconnect',
8+
CyberConnect = 'cyber',
99
Firefly = 'firefly',
1010
OpenSea = 'opensea',
1111
Sybil = 'sybil',

0 commit comments

Comments
 (0)