Skip to content

Commit

Permalink
Rename "NameGuard result" to "NameGuard report" (#420)
Browse files Browse the repository at this point in the history
* Rename "NameGuard result" to "NameGuard report"

* Create famous-files-stare.md

* update version

---------

Co-authored-by: lightwalker.eth <126201998+lightwalker-eth@users.noreply.github.com>
  • Loading branch information
djstrong and lightwalker-eth authored Oct 3, 2024
1 parent 4893cf7 commit c2fdd5f
Show file tree
Hide file tree
Showing 11 changed files with 97 additions and 92 deletions.
8 changes: 8 additions & 0 deletions .changeset/famous-files-stare.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"nameguard-examples": minor
"@namehash/nameguard-js": minor
"@namehash/nameguard": minor
"nameguard-api": minor
---

Rename "NameGuard result" to "NameGuard report"
4 changes: 2 additions & 2 deletions api/nameguard/models/result.py
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,7 @@ class SecurePrimaryNameResult(BaseModel):
examples=['vitalik.eth'],
)

nameguard_result: Optional[NameGuardReport] = Field(
nameguard_report: Optional[NameGuardReport] = Field(
description='NameGuard report for the `primary_name`.\n'
'* if `address` has a primary name and `return_nameguard_report` is `True`, then return a `NameGuardReport` for the primary name. Else, NameGuard will return `null`',
)
Expand Down Expand Up @@ -424,7 +424,7 @@ class FakeEthNameCheckResult(BaseModel):

status: FakeEthNameCheckStatus

nameguard_result: Optional[NameGuardReport] = Field(
nameguard_report: Optional[NameGuardReport] = Field(
description='NameGuard report for the .eth ENS NFT.\n'
'* `null` if `status` is any value except `authentic_eth_name`, `invalid_eth_name` and `unknown_eth_name` (the NFT is not associated with authentic ".eth" contracts)\n'
)
Expand Down
36 changes: 18 additions & 18 deletions api/nameguard/nameguard.py
Original file line number Diff line number Diff line change
Expand Up @@ -452,29 +452,29 @@ async def secure_primary_name(
raise ProviderUnavailable(f'Communication error with provider occurred: {ex}')
display_name = f'Unnamed {address[2:6].lower()}'
primary_name = None
nameguard_result = None
nameguard_report = None
if domain is None:
status = SecurePrimaryNameStatus.NO_PRIMARY_NAME
impersonation_status = None
else:
nameguard_result = await self.inspect_name(network_name, domain)
nameguard_report = await self.inspect_name(network_name, domain)

if nameguard_result.highest_risk and nameguard_result.highest_risk.check.name == Check.UNINSPECTED.name:
if nameguard_report.highest_risk and nameguard_report.highest_risk.check.name == Check.UNINSPECTED.name:
status = SecurePrimaryNameStatus.UNINSPECTED
impersonation_status = None
elif nameguard_result.normalization == Normalization.UNNORMALIZED:
elif nameguard_report.normalization == Normalization.UNNORMALIZED:
status = SecurePrimaryNameStatus.UNNORMALIZED
impersonation_status = None
else:
display_name = nameguard_result.beautiful_name
display_name = nameguard_report.beautiful_name
status = SecurePrimaryNameStatus.NORMALIZED
primary_name = domain

impersonation_status = (
ImpersonationStatus.UNLIKELY
if any(
check.check == 'impersonation_risk' and check.status == CheckStatus.PASS
for check in nameguard_result.checks
for check in nameguard_report.checks
)
else ImpersonationStatus.POTENTIAL
)
Expand All @@ -484,7 +484,7 @@ async def secure_primary_name(
impersonation_status=impersonation_status,
display_name=display_name,
primary_name_status=status,
nameguard_result=nameguard_result if return_nameguard_report else None,
nameguard_report=nameguard_report if return_nameguard_report else None,
)

async def fake_eth_name_check_fields(
Expand All @@ -506,19 +506,19 @@ async def fake_eth_name_check(self, network_name, contract_address, token_id) ->

if token_type not in ['ERC721', 'ERC1155'] and contract_address in ens_contract_adresses:
return FakeEthNameCheckResult(
status=FakeEthNameCheckStatus.UNKNOWN_NFT, nameguard_result=None, investigated_fields=None
status=FakeEthNameCheckStatus.UNKNOWN_NFT, nameguard_report=None, investigated_fields=None
)
if token_type == 'NOT_A_CONTRACT':
return FakeEthNameCheckResult(
status=FakeEthNameCheckStatus.UNKNOWN_NFT, nameguard_result=None, investigated_fields=None
status=FakeEthNameCheckStatus.UNKNOWN_NFT, nameguard_report=None, investigated_fields=None
)
elif token_type == 'NO_SUPPORTED_NFT_STANDARD':
return FakeEthNameCheckResult(
status=FakeEthNameCheckStatus.UNKNOWN_NFT, nameguard_result=None, investigated_fields=None
status=FakeEthNameCheckStatus.UNKNOWN_NFT, nameguard_report=None, investigated_fields=None
)
elif token_type not in ['ERC721', 'ERC1155']: # Alchemy does not support other types
return FakeEthNameCheckResult(
status=FakeEthNameCheckStatus.UNKNOWN_NFT, nameguard_result=None, investigated_fields=None
status=FakeEthNameCheckStatus.UNKNOWN_NFT, nameguard_report=None, investigated_fields=None
)

title = res_json['title']
Expand Down Expand Up @@ -555,14 +555,14 @@ async def _fake_eth_name_check(

if title is None:
return FakeEthNameCheckResult(
status=FakeEthNameCheckStatus.UNKNOWN_NFT, nameguard_result=None, investigated_fields=None
status=FakeEthNameCheckStatus.UNKNOWN_NFT, nameguard_report=None, investigated_fields=None
)
else:
if is_labelhash_eth(title):
report = await self.inspect_name(network_name, title, resolve_labelhashes=False)
return FakeEthNameCheckResult(
status=FakeEthNameCheckStatus.UNKNOWN_ETH_NAME,
nameguard_result=report,
nameguard_report=report,
investigated_fields=None,
)

Expand All @@ -571,13 +571,13 @@ async def _fake_eth_name_check(
if is_ens_normalized(title):
return FakeEthNameCheckResult(
status=FakeEthNameCheckStatus.AUTHENTIC_ETH_NAME,
nameguard_result=report,
nameguard_report=report,
investigated_fields=None,
)
else:
return FakeEthNameCheckResult(
status=FakeEthNameCheckStatus.INVALID_ETH_NAME,
nameguard_result=report,
nameguard_report=report,
investigated_fields=None,
)
else:
Expand Down Expand Up @@ -605,18 +605,18 @@ async def _fake_eth_name_check(
if impersonated:
return FakeEthNameCheckResult(
status=FakeEthNameCheckStatus.IMPERSONATED_ETH_NAME,
nameguard_result=None,
nameguard_report=None,
investigated_fields=impersonating_fields,
)
elif potentially_impersonated:
return FakeEthNameCheckResult(
status=FakeEthNameCheckStatus.POTENTIALLY_IMPERSONATED_ETH_NAME,
nameguard_result=None,
nameguard_report=None,
investigated_fields=impersonating_fields,
)
else:
return FakeEthNameCheckResult(
status=FakeEthNameCheckStatus.NON_IMPERSONATED_ETH_NAME,
nameguard_result=None,
nameguard_report=None,
investigated_fields=None,
)
9 changes: 3 additions & 6 deletions api/nameguard/web_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
init_time = time.time()

from enum import Enum
from fastapi import FastAPI, Path, Request
from fastapi import FastAPI, Path
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel, Field

Expand Down Expand Up @@ -489,7 +489,7 @@ async def inspect_labelhash_post(request: InspectLabelhashRequest) -> NameGuardR
},
)
async def secure_primary_name_get(
address: str, network_name: NetworkName, request: Request, return_nameguard_report: bool = False
address: str, network_name: NetworkName, return_nameguard_report: bool = False
) -> SecurePrimaryNameResult:
"""
## Performs a reverse lookup of an Ethereum `address` to a primary name.
Expand All @@ -500,14 +500,11 @@ async def secure_primary_name_get(
Returns `display_name` to be shown to users and estimates `impersonation_status`.
If `address` has a primary name and `return_nameguard_report` is `True`, then NameGuard will return a `SecurePrimaryNameResult` including a `NameGuardReport` for the primary name. Else, NameGuard will return `None` as `nameguard_result`.
If `address` has a primary name and `return_nameguard_report` is `True`, then NameGuard will return a `SecurePrimaryNameResult` including a `NameGuardReport` for the primary name. Else, NameGuard will return `None` as `nameguard_report`.
"""
logger.debug(
f"{json.dumps({'endpoint': Endpoints.SECURE_PRIMARY_NAME, 'method': 'GET', 'network_name': network_name, 'address': address, 'return_nameguard_report': return_nameguard_report})}"
)
logger.debug(f'Request headers: {dict(request.headers)}')
logger.debug(f'Request query params: {dict(request.query_params)}')
logger.debug(f'Request path params: {dict(request.path_params)}')
nameguard.context.endpoint_name.set(Endpoints.SECURE_PRIMARY_NAME)
address = validate_ethereum_address(address)

Expand Down
2 changes: 1 addition & 1 deletion api/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "nameguard"
version = "0.1.7"
version = "0.1.8"
description = "Security \"x-ray\" for ENS names"
authors = ["NameHash Team <devops@namehash.io>"]
maintainers = ["NameHash Team <devops@namehash.io>"]
Expand Down
18 changes: 9 additions & 9 deletions api/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -789,12 +789,12 @@ def test_primary_name(
assert res_json['primary_name'] == primary_name
assert res_json['display_name'] == display_name
if primary_name_status != 'no_primary_name':
assert res_json['nameguard_result']['name'] == name
assert res_json['nameguard_result']['canonical_name'] == canonical_name
assert res_json['nameguard_report']['name'] == name
assert res_json['nameguard_report']['canonical_name'] == canonical_name
assert (
any(
check['check'] == 'impersonation_risk' and check['status'] == 'warn'
for check in res_json['nameguard_result']['checks']
for check in res_json['nameguard_report']['checks']
)
== impersonation_risk
)
Expand All @@ -811,7 +811,7 @@ def test_primary_name_get(test_client):
assert res_json['primary_name_status'] == 'normalized'
assert res_json['primary_name'] == 'vitalik.eth'
assert res_json['display_name'] == 'vitalik.eth'
assert res_json['nameguard_result'] is None
assert res_json['nameguard_report'] is None


@pytest.mark.flaky(retries=2, condition=not pytest.use_monkeypatch)
Expand All @@ -825,7 +825,7 @@ def test_primary_name_get_no_report(test_client):
assert res_json['primary_name_status'] == 'normalized'
assert res_json['primary_name'] == 'vitalik.eth'
assert res_json['display_name'] == 'vitalik.eth'
assert res_json['nameguard_result'] is None
assert res_json['nameguard_report'] is None


@pytest.mark.flaky(retries=2, condition=not pytest.use_monkeypatch)
Expand All @@ -839,7 +839,7 @@ def test_primary_name_get_report(test_client):
assert res_json['primary_name_status'] == 'normalized'
assert res_json['primary_name'] == 'vitalik.eth'
assert res_json['display_name'] == 'vitalik.eth'
assert res_json['nameguard_result'] is not None
assert res_json['nameguard_report'] is not None


@pytest.mark.flaky(retries=2, condition=not pytest.use_monkeypatch)
Expand Down Expand Up @@ -933,7 +933,7 @@ def test_primary_name_get_emoji(test_client):
assert res_json['primary_name'] == '👩🏿\u200d🦱.eth'
assert res_json['display_name'] == '👩🏿\u200d🦱.eth'
assert (
res_json['nameguard_result']['highest_risk']['message']
res_json['nameguard_report']['highest_risk']['message']
== 'Emojis used in this name may be visually confused with other similar emojis'
)

Expand Down Expand Up @@ -1273,9 +1273,9 @@ def test_fake_eth_name_check_fields(
FakeEthNameCheckStatus.AUTHENTIC_ETH_NAME,
FakeEthNameCheckStatus.UNKNOWN_ETH_NAME,
):
assert res_json['nameguard_result'] is not None
assert res_json['nameguard_report'] is not None
else:
assert res_json['nameguard_result'] is None
assert res_json['nameguard_report'] is None

# if res_json['status'] != FakeEthNameCheckStatus.UNKNOWN_NFT:
# assert res_json['investigated_fields']
Expand Down
24 changes: 12 additions & 12 deletions api/tests/test_nameguard.py
Original file line number Diff line number Diff line change
Expand Up @@ -647,28 +647,28 @@ async def test_dynamic_check_order(nameguard: NameGuard):
r = await nameguard.secure_primary_name(
'0xc9f598bc5bb554b6a15a96d19954b041c9fdbf14', 'mainnet', return_nameguard_report=True
)
assert r.nameguard_result.checks[0].check == Check.NORMALIZED
assert r.nameguard_result.checks[0].status == CheckStatus.ALERT
assert r.nameguard_result.checks[1].check == Check.TYPING_DIFFICULTY
assert r.nameguard_result.checks[1].status == CheckStatus.WARN
assert r.nameguard_report.checks[0].check == Check.NORMALIZED
assert r.nameguard_report.checks[0].status == CheckStatus.ALERT
assert r.nameguard_report.checks[1].check == Check.TYPING_DIFFICULTY
assert r.nameguard_report.checks[1].status == CheckStatus.WARN

r = await nameguard.secure_primary_name(
'0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 'mainnet', return_nameguard_report=True
)
assert r.nameguard_result.checks[0].check == Check.INVISIBLE
assert r.nameguard_result.checks[0].status == CheckStatus.PASS
assert r.nameguard_result.checks[1].check == Check.NORMALIZED
assert r.nameguard_result.checks[1].status == CheckStatus.PASS
assert r.nameguard_report.checks[0].check == Check.INVISIBLE
assert r.nameguard_report.checks[0].status == CheckStatus.PASS
assert r.nameguard_report.checks[1].check == Check.NORMALIZED
assert r.nameguard_report.checks[1].status == CheckStatus.PASS

endpoint_name.set(Endpoints.SECURE_PRIMARY_NAME)

r = await nameguard.secure_primary_name(
'0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 'mainnet', return_nameguard_report=True
)
assert r.nameguard_result.checks[0].check == Check.IMPERSONATION_RISK
assert r.nameguard_result.checks[0].status == CheckStatus.PASS
assert r.nameguard_result.checks[1].check == Check.INVISIBLE
assert r.nameguard_result.checks[1].status == CheckStatus.PASS
assert r.nameguard_report.checks[0].check == Check.IMPERSONATION_RISK
assert r.nameguard_report.checks[0].status == CheckStatus.PASS
assert r.nameguard_report.checks[1].check == Check.INVISIBLE
assert r.nameguard_report.checks[1].status == CheckStatus.PASS

endpoint_name.set(None)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,51 +23,51 @@ export function ImpersonationReport({ data }: ImpersonationReportProps) {
)
return null;

const { nameguard_result } = data;
const { nameguard_report } = data;

if (!nameguard_result)
if (!nameguard_report)
return <RatingLoadingIcon size={RatingIconSize.micro} />;

const textClass = cc([
"font-semibold",
ratingTextColor(nameguard_result.rating),
ratingTextColor(nameguard_report.rating),
]);

return (
<Tooltip
trigger={
<RatingIcon
rating={nameguard_result.rating}
rating={nameguard_report.rating}
size={RatingIconSize.micro}
/>
}
>
<div className="hidden md:flex items-start space-x-3 py-2.5 min-w-[300px]">
<div className="mt-0.5">
<RatingIcon
rating={nameguard_result.rating}
rating={nameguard_report.rating}
size={RatingIconSize.micro}
/>
</div>

<div className="space-y-1.5 flex-1">
<div className="flex items-center justify-between">
<span className={textClass}>
{nameguard_result.highest_risk?.check_name}
{nameguard_report.highest_risk?.check_name}
</span>
<span className="text-sm font-normal text-gray-400">
{nameguard_result.risk_count} risk
{(nameguard_result.risk_count || 0) >= 0 && "s"} detected
{nameguard_report.risk_count} risk
{(nameguard_report.risk_count || 0) >= 0 && "s"} detected
</span>
</div>
<div className="space-y-0.5">
<div className="text-sm text-white">
{nameguard_result.highest_risk?.message}
{nameguard_report.highest_risk?.message}
</div>
<div className="text-sm text-white">
<a
href={`https://nameguard.io/inspect/${encodeURIComponent(
nameguard_result.name,
nameguard_report.name,
)}`}
className="underline"
rel="noopener noreferrer"
Expand Down
6 changes: 3 additions & 3 deletions packages/nameguard-js/src/securePrimaryName.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export async function securePrimaryName(
impersonation_status: null,
display_name: unnamedName,
primary_name_status: "no_primary_name",
nameguard_result: null,
nameguard_report: null,
};
}

Expand All @@ -39,7 +39,7 @@ export async function securePrimaryName(
impersonation_status: null,
display_name: unnamedName,
primary_name_status: "unnormalized",
nameguard_result: null,
nameguard_report: null,
};
}

Expand All @@ -52,6 +52,6 @@ export async function securePrimaryName(
impersonation_status: computeImpersonationStatus(primaryName),
display_name: beautifulName,
primary_name_status: "normalized",
nameguard_result: null,
nameguard_report: null,
};
}
Loading

0 comments on commit c2fdd5f

Please sign in to comment.