Интеграция с Elliptic для compliance
Elliptic — конкурент Chainalysis с рядом технических преимуществ: более глубокий DeFi coverage, cross-chain tracing (отслеживание средств между чейнами через bridges), и Solana поддержка. API немного отличается от Chainalysis по структуре.
Elliptic Lens API (wallet screening)
class EllipticClient {
private readonly BASE_URL = "https://aml.elliptic.co/v2";
async screenWallet(address: string, asset: string): Promise<EllipticWalletRisk> {
const response = await this.post("/wallet/synchronous", {
subject: {
asset,
type: "address",
hash: address,
blockchain: this.getBlockchain(asset),
},
type: "wallet_exposure",
customer_reference: address,
behaviour_classification: true, // включает cluster behavior данные
});
return {
riskScore: response.risk_score, // 0-10 (у Elliptic другая шкала!)
riskBand: response.risk_band, // "low" | "medium" | "high" | "very_high"
exposures: response.exposures, // разбивка direct и indirect exposure
entities: response.entities,
behaviours: response.behaviours,
};
}
async screenTransaction(txHash: string, asset: string): Promise<EllipticTxRisk> {
return this.post("/transaction/synchronous", {
subject: {
asset,
type: "transaction",
hash: txHash,
blockchain: this.getBlockchain(asset),
},
type: "indirect_exposure",
});
}
private getBlockchain(asset: string): string {
const map: Record<string, string> = {
ETH: "ethereum",
BTC: "bitcoin",
USDT: "ethereum", // или tron
SOL: "solana",
BNB: "bsc",
};
return map[asset] || asset.toLowerCase();
}
}
Нормализация risk score
Elliptic использует шкалу 0-10, Chainalysis — 0-100. При использовании обоих провайдеров нужна нормализация:
function normalizeRiskScore(score: number, provider: "chainalysis" | "elliptic"): number {
if (provider === "elliptic") return score * 10; // 0-10 → 0-100
return score; // chainalysis уже 0-100
}
// Risk band mapping для единого decision making
function getRiskDecision(score: number): "allow" | "review" | "block" {
if (score >= 70) return "block";
if (score >= 40) return "review";
return "allow";
}
Cross-chain tracing
Преимущество Elliptic: отслеживает средства через bridges (Wormhole, Stargate, LayerZero):
// Если средства пришли через bridge, Elliptic отслеживает origin chain
async function checkCrossChainExposure(
address: string,
inboundTxHash: string
): Promise<CrossChainRisk> {
const walletRisk = await elliptic.screenWallet(address, "ETH");
// exposures.indirect может показать risk через bridge
const bridgeExposures = walletRisk.exposures.indirect.filter(
e => e.category === "bridge" && e.riskScore > 40
);
if (bridgeExposures.length > 0) {
// Запрашиваем детали по каждому bridge hop
for (const exp of bridgeExposures) {
const originRisk = await elliptic.screenWallet(exp.sourceAddress, exp.sourceAsset);
if (originRisk.riskBand === "high" || originRisk.riskBand === "very_high") {
return { hasHighRisk: true, originChain: exp.sourceBlockchain };
}
}
}
return { hasHighRisk: false };
}
Интеграция Elliptic с cross-chain трассировкой и нормализованным risk scoring для dual-provider системы — 1-2 недели.







