주소에 열려 있는 토큰 허용량과 포이즈닝 형태 신호는 어떻게 조회합니까?

주소 · 섀도 휴리스틱으로 구간이 매겨진 디코딩된 Approval 사실과 금액 0 송신 탐지기 — 둘 다 위험 등급을 움직이지 않습니다

  • API 가이드
  • 6분
  • 중급
  • 개발자
  • GET …/approvals
  • GET …/heuristics

ACHIVX Academy 원문 (영어) ↗

/v1/addresses/{address}/approvals?chain=은 주소가 열어 둔 스테이블코인 허용량(디코딩된 Approval 사실, 클래스 F)을 섀도 방식으로 계산한 행별 위험 band, 그리고 목록 전체에 대한 worst_band와 함께 나열합니다. /v1/addresses/{address}/heuristics?chain=은 주소가 금액 0 전송(zero-value transfer)을 보냈는지를 flagged, status, zero_value_sends로 알려 줍니다. 이는 주소 포이즈닝(address poisoning) 캠페인이 가짜 이력을 심을 때 쓰는 형태입니다. 둘 다 참고용입니다. 구간과 플래그는 휴리스틱(클래스 H)이며, 탐지기가 정밀도 기준을 통과하기 전까지는 위험 점수에 절대 반영되지 않고, 두 응답 모두 note에서 이를 밝힙니다.

승인(approval)

curl -s 'https://stablescan.achivx.com/v1/addresses/0x28C6c06298d514Db089934071355E5743bf21d60/approvals?chain=1'

2026-10-24 기준 바이낸스(Binance) 핫월렛에는 열린 허용량이 없었습니다.

{
  "address": "0x28c6c06298d514db089934071355e5743bf21d60",
  "chain_id": 1,
  "open": [],
  "worst_band": "none",
  "note": "Open allowances are decoded Approval facts (Class F, shown plainly). The per-row risk band is a heuristic (Class H) computed in shadow — informational, NOT a risk-tier contribution, until the detector clears the precision gate. A known-service spender (a DEX router) is banded low …",
  "chain_source": "explicit",
  "freshness_seconds": 199
}

목록이 비어 있지 않으면 각 open[] 행에는 token, spender(라벨이 있으면 라벨도 표시되며, 알려진 DEX 라우터는 low로 구간이 매겨집니다), 최소 단위의 allowance(무제한 승인은 uint256 최댓값), 승인 시점, 그리고 band가 들어 있습니다. worst_band는 모든 행 중 가장 높은 구간으로, none, low, medium, high 중 하나입니다. 주소 페이지는 같은 목록을 open approvals · N 아래에 computed in shadow — informational, NOT a risk-tier contribution이라는 문구와 함께 보여 줍니다.

open: []의 의미: 이 네트워크에서 인덱싱된 스테이블코인에 대해, data_vintage 이후 인덱싱된 로그 범위에서 열린 허용량이 발견되지 않았다는 것입니다. 이것은 목록일 뿐 이상 없음 판정이 아니며, 스캐너가 인덱싱하지 않는 토큰에 대해서는 아무것도 말하지 않습니다.

첫 요청의 세 가지 헬퍼로 같은 호출을 하면 다음과 같습니다.

Python

appr = scan(f"/v1/addresses/{addr}/approvals", chain=1)
print(appr["worst_band"], len(appr["open"]), "open allowances")
for row in appr["open"]:
    print(" ", row["token"], "->", row.get("spender_name") or row["spender"], row["band"])

Go

var appr struct {
	WorstBand string           `json:"worst_band"`
	Open      []map[string]any `json:"open"`
}
if err := get("/v1/addresses/"+addr+"/approvals", url.Values{"chain": {"1"}}, &appr); err != nil {
	return err
}
fmt.Println(appr.WorstBand, len(appr.Open), "open allowances")

TypeScript

type Approvals = { open: Record<string, unknown>[]; worst_band: "none" | "low" | "medium" | "high" };
const appr = await scan<Approvals>(`/v1/addresses/${addr}/approvals`, { chain: 1 });
console.log(appr.worst_band, appr.open.length, "open allowances");

휴리스틱

curl -s 'https://stablescan.achivx.com/v1/addresses/0x28C6c06298d514Db089934071355E5743bf21d60/heuristics?chain=1'
{
  "chain_id": 1,
  "address": "0x28c6c06298d514db089934071355e5743bf21d60",
  "flagged": false,
  "status": "not_flagged",
  "basis": "Our own automated shape detector, pre-false-positive-review. It reports that this address SENT zero-value transfers — the pattern address-poisoning campaigns use to seed fake history. It is not a verified determination, not an accusation, and not an input to any risk tier …",
  "chain_source": "explicit",
  "freshness_seconds": 205
}

경고 표시된 주소에는 status: "flagged", zero_value_sends(건수이며, 상한에서 집계가 멈췄다면 zero_value_sends_capped: true), first_seen, 그리고 열어 볼 수 있는 sample_tx가 들어 있습니다. 탐지기는 주소가 보낸 것을 봅니다. 금액 0 전송을 받기만 하는 포이즈닝 피해자는 이 탐지기에 의해 표시되지 않습니다. basis는 한 번 읽어 두십시오. 탐지기 자체의 면책 문구이며, 이 페이지의 입장 전부이기도 합니다. 검증된 판정이 아니고, 혐의 제기가 아니며, 어떤 위험 등급의 입력값도 아닙니다.

첫 요청의 세 가지 헬퍼로 같은 호출을 하면 다음과 같습니다.

Python

heur = scan(f"/v1/addresses/{addr}/heuristics", chain=1)
if heur["flagged"]:
    print("poisoning shape:", heur["zero_value_sends"], "zero-value sends; sample", heur["sample_tx"])

Go

var heur struct {
	Flagged        bool   `json:"flagged"`
	Status         string `json:"status"`
	ZeroValueSends int    `json:"zero_value_sends"`
	SampleTx       string `json:"sample_tx"`
}
if err := get("/v1/addresses/"+addr+"/heuristics", url.Values{"chain": {"1"}}, &heur); err != nil {
	return err
}

TypeScript

type Heuristics = { flagged: boolean; status: "flagged" | "not_flagged"; zero_value_sends?: number; zero_value_sends_capped?: boolean; sample_tx?: string; first_seen?: string | null };
const heur = await scan<Heuristics>(`/v1/addresses/${addr}/heuristics`, { chain: 1 });

이 두 가지가 판단에서 차지하는 자리

어느 라우트도 /risk를 바꾸지 않으며, 여러분의 코드도 그렇게 하도록 두어서는 안 됩니다. high 구간이나 flagged는 등급이 아니라 살펴볼 이유로 취급해 판정 옆에 보여 주십시오. /approvals의 정직한 용도는 주소 소유자(내가 어떤 허용량을 열어 두었는가?)와 고객 지원(오래된 승인을 통한 자금 탈취가 가능한가?)을 위한 것이고, /heuristics의 정직한 용도는 비슷하게 생긴 주소가 왜 이력에 나타났는지 독자에게 설명하는 것입니다.

Stablecoin scanner ACHIVX에서

출처

더 알아보기

주소 · GET …/approvals · GET …/heuristics · 2026-10-24 작성, openapi.json, agents.md 및 당일 실제 호출 기준. 응답 형태는 인용이며, 수치는 날짜 기준이고 인덱스에 따라 달라집니다.

이 페이지는 ACHIVX Academy 영어 원문을 한국어로 옮긴 것입니다. 번역과 원문이 다르면 영어 원문이 기준입니다.