주소에 열려 있는 토큰 허용량과 포이즈닝 형태 신호는 어떻게 조회합니까?
주소 · 섀도 휴리스틱으로 구간이 매겨진 디코딩된 Approval 사실과 금액 0 송신 탐지기 — 둘 다 위험 등급을 움직이지 않습니다
- API 가이드
- 6분
- 중급
- 개발자
- GET …/approvals
- GET …/heuristics
/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에서
- 페이지의 승인 블록 — 제목, 설명 패널, 조회한 네트워크: /ethereum/address/0x098B…2f96(2026-10-24 기준 open approvals · 0).
- JSON으로: /approvals?chain=1 및 /heuristics?chain=1.
출처
- REST 인터페이스의 OpenAPI 3.1 명세(API 1.4.0)
- GET /v1/methodology (stablscan-methodology-v0.5.0)
- 에이전트 매뉴얼 — agents.md(버전 2026-10-05)
더 알아보기
관련 질문
- 주소에 대한 단일 위험 판정은 어떻게 얻고, 언제 unknown이 됩니까?
- 주소가 제재 대상인지, 동결되었는지, 알려진 서비스인지 어떻게 확인합니까?
- 응답은 어떻게 읽습니까: unknown, null, 빈 목록, no-store
주소 · GET …/approvals · GET …/heuristics · 2026-10-24 작성, openapi.json, agents.md 및 당일 실제 호출 기준. 응답 형태는 인용이며, 수치는 날짜 기준이고 인덱스에 따라 달라집니다.
이 페이지는 ACHIVX Academy 영어 원문을 한국어로 옮긴 것입니다. 번역과 원문이 다르면 영어 원문이 기준입니다.