sumsub/agent-skills

sumsub-resolve-currency

Resolve and validate the currency fields Sumsub expects on a transaction — info.currencyCode, info.currencyType, info.cryptoParams.cryptoChain and the amountInDefaultCurrency / defaultCurrencyCode pair.

소스 보기

사용 방법

  1. 설치 명령을 복사하고 자신의 에이전트 환경에 설치하기 전에 소스 패키지를 확인하세요.
  2. 필요한 도구, 인증 정보, 지원 환경은 원본 문서에서 확인하세요.
  3. 입력과 원하는 산출물을 설명하고 출처와 결과를 대조하세요.
npx skills add https://github.com/sumsub/agent-skills --skill sumsub-resolve-currency

시작 전 확인

  • 설치에는 모델 구독, API 한도, 파일 접근 권한이 포함되지 않습니다.
  • 별점 수와 설치 수는 활동 지표이며 독립적인 품질·보안 검증이 아닙니다.
원본 Skill 문서

원본 저장소의 제목, 예시, 코드, 표, 링크, 이미지를 유지해 표시합니다.

Sumsub — Resolve currency and chain

One endpoint answers both halves, and the two halves look nothing alike:

type=fiattype=crypto
Flat list of ISO 4217 codes, fetched liveThousands of assets across a hundred-plus chains
No chain, no contract, no ambiguityOver a thousand symbols exist on more than one chain
Resolving = "is it in the list"Resolving = (symbol, chain, [contract]) → exactly one asset

Most of this skill is about the crypto side, because that is where transactions silently go wrong. Fiat is a membership test.

Endpoint

VerbPathPurpose
GET/resources/kyt/currency?type=cryptoThe crypto catalogue. Static server-side; safe to cache for a session.
GET/resources/kyt/currency?type=fiatFiat codes, assembled live from the rates provider.

Omit type and you get the fiat list. There is no public endpoint for the chain list — derive it from the crypto catalogue's distinct cryptoChain values. There is no rates endpoint: Sumsub converts internally and does not expose the rate it used.

Each crypto entry carries currencyCode, cryptoChain, contractAddress, chainId, name, coinmarketcapId, coingeckoId.

Auth — App Token + secret (sandbox only)

Signing per the authentication reference; mechanics in `sumsub-api-auth`.

⚠️ Sandbox tokens only. The helper script refuses tokens that don't start with sbx: unless SUMSUB_ALLOW_PROD=1. This endpoint is read-only, but the same rule applies across these skills — get a sandbox pair at <https://cockpit.sumsub.com/checkus/home?sbx=true> (Connect Sumsub to your AI agent -> Build & configure -> Generate token).
VarExample
SUMSUB_APP_TOKENsbx:...
SUMSUB_SECRET_KEYThe paired secret.
SUMSUB_BASEOptional. Defaults to https://api.sumsub.com.

The rule that matters

A symbol is not an asset. USDT and USDC each name more than a dozen different assets in the catalogue; ETH several. The identity of a crypto asset is the pair (currencyCode, cryptoChain), plus contractAddress when even that is not unique.

📘 An empty `cryptoChain` is a value, not a gap. It means the native coin of its own chain — BTC with no chain is bitcoin; BTC with cryptoChain: BTC is the same thing (the server normalises that common mistake); BTC on some wrapped chain is a different asset entirely.

🚧 Ambiguity does not resolve to a default — it resolves to nothing. When a lookup matches more than one row the server logs Multiple currencies found and returns no currency at all. So the symptom of a missing chain is not "wrong rate" but "currency not recognised", with everything downstream that depends on it silently degraded.

Procedure

  1. Decide the type. If the code is three uppercase letters and appears in

the fiat list, treat it as fiat unless the user says otherwise. Beware of overlaps in intent — a user saying "USD" almost never means a token called USD.

  1. Fetch the catalogue with ${CLAUDE_SKILL_DIR}/scripts/get_currencies.sh crypto

(or fiat). Cache it for the session; the crypto list is large and static.

  1. Resolve with ${CLAUDE_SKILL_DIR}/scripts/resolve_currency.py — pass the

catalogue and the query. It uppercases and trims, expands chain aliases, treats code == chain as the native coin, and on ambiguity fails with the candidate list instead of picking one.

  1. Report the exact fields to send, never just "supported":
json
   "info": {
     "currencyCode": "USDT",
     "currencyType": "crypto",
     "cryptoParams": { "cryptoChain": "TRX" }
   }
  1. Address the conversion — see below. This is the part callers forget.

amountInDefaultCurrency — read this before skipping it

info.amountInDefaultCurrency + info.defaultCurrencyCode express the transfer in your reporting currency. They look optional. They are not, in three ways.

🚧 Travel Rule thresholds are compared against `amountInDefaultCurrency`. If it is absent, the threshold comparison is skipped entirely and the Travel Rule flow runs regardless of how small the transfer is. Omitting the field does not lose precision — it changes behaviour. The same applies to the unhosted-wallet verification threshold.

🚧 The value is frozen at ingest. Sumsub computes it once, when the transaction is created, and stores it. A rate that was wrong at that moment stays wrong on the record; correcting it later means a backfill, not a re-read.

📘 If the asset does not resolve, there is nothing to convert. An unrecognised (symbol, chain) pair means no conversion happens — which is the second reason a missing cryptoChain is expensive.

Recommendation: if you know the value your own systems used, send amountInDefaultCurrency and defaultCurrencyCode explicitly. Your books and Sumsub's record then agree by construction, and you are not depending on a third-party rate at an instant you do not control.

Chain aliases

Chain names are uppercased, trimmed, then mapped through a fixed alias table before lookup. ETHEREUM, BSC, TRC20, MATIC, POLYGON, BEP20, TRON, SOLANA, AVAX_C and about two dozen more resolve to their canonical chain. Anything outside the table is used verbatim, so a near-miss like TRON20 or ERC-20 simply does not match.

The table is not exposed by any endpoint — the full list is in `references/crypto-catalogue.md`. When a user's chain string fails to resolve, check it against the aliases before concluding the asset is unsupported.

Travel Rule specifics

Beyond the threshold behaviour above, the asset you pick can decide whether an exchange is possible at all. Each catalogue entry carries the counterparty protocols' own vocabularies, and coverage is thin.

Only a minority of catalogue entries carry a mapping for any given protocol — Sygna covers the most, then GTR, then CODE, and all three are a small fraction of the whole. Coverage grows as the weekly listing job picks up new assets, so check rather than assume.

An asset with no mapping for the protocol your counterparty speaks cannot be expressed in their message. The exchange fails validation before anything is sent — surfacing as notEnoughCounterpartyData, which reads like a data problem rather than an asset-support problem. If a Travel Rule exchange fails that way on an exotic token, check the vocabulary coverage before debugging the payload. See `sumsub-integrate-travel-rule`.

Outputs

  • Resolved — the matched entry, and the exact currencyCode / currencyType / cryptoChain to send. Mention contractAddress when the symbol is a known collision, so the caller can pin it.
  • Ambiguous — the candidate rows with their chains and contracts, and the question the user must answer. Never pick one.
  • Not found — say whether the symbol is unknown or only the chain is, and check the alias table before declaring it unsupported.

Worked examples

See also

관련 작업

같은 저장소의 Skills

더 많은 Skills

모든 Skills
sumsub
커뮤니티

sumsub-integrate-travel-rule

End-to-end recipe for integrating Sumsub Travel Rule — deciding which of the three exchange flows applies, identifying the counterparty VASP, submitting the transfer, reading the exchange status, finalising or cancelling it, answering requests other VASPs send you, handling the unhosted-wallet path when no VASP is attributed, and finding existing transactions (deduplication before after-settlement exchanges). TRIGGER when the user asks to "integrate / add / implement Travel Rule", "send Travel R

설치 수
1
GitHub Stars
7
업데이트
10월 2일
sumsub
커뮤니티

sumsub-manage-wallet-address-book

Register the crypto wallet addresses an organisation controls, so Sumsub can resolve address ownership without a human. Bulk-imports addresses into the Wallet Address Book via POST /resources/kyt/walletAddress/import, and registers a single address against a specific applicant via POST /resources/api/applicants/{applicantId}/payments. TRIGGER when the user asks to "upload / import / register our wallet addresses", "add addresses to the Wallet Address Book", "register a user's crypto wallet as a

설치 수
1
GitHub Stars
7
업데이트
10월 2일
sumsub
커뮤니티

sumsub-manage-webhooks

Manage Sumsub clientWebhooks (event subscriptions for applicantReviewed / applicantPending / kytTxn / etc.) — reads via /resources/api/clientWebhooks, writes via /resources/api/agent/clientWebhooks. Sandbox only — production webhooks must be created by a human directly in the Sumsub dashboard. TRIGGER when the user asks to "list / retrieve / show webhooks", "create / add / register a webhook", or "update / edit / change a webhook target / event list / secret / signature algorithm" against their

설치 수
1
GitHub Stars
7
업데이트
10월 2일
sumsub
커뮤니티

sumsub-analyze-regulation

Analyze a regulation document (PDF or text) and produce a Sumsub configuration plan — mapping regulatory requirements to Sumsub entities (levels, questionnaires, PoA presets, TM rules, workflows, AML resolution rules). TRIGGER when the user provides a regulation PDF, legal act, or compliance requirement document and wants to know what to configure in Sumsub. Acts as the entry point before invoking sumsub-create-level, sumsub-create-questionnaire, sumsub-create-poa-preset, sumsub-create-workflow,

설치 수
2
GitHub Stars
7
업데이트
10월 2일