Liability fence
TrustGate said the wallet scored N at time T underscoringVersion V. The protocol chose what N allows. Scores behaviour, not value or safety. This is not a credit decision.
Every gating response repeats that disclaimer. Keep it in your own docs and denial copy. Do not tell a user “TrustGate rejected your loan.”
Endpoints
Base:https://www.trustgated.xyz
Free on testnet. No CORS. Call these from your backend. A browser on another origin will fail the preflight.
On testnet, if the unpaid wallet oracle is down, gating falls back to a raw score of 50 so the path can be demoed. Mainnet is fail-closed — no fallback. Do not ship a production gate that depends on the 50.
1. Issue
subjectType is wallet (default) or token. Aliases: wallet / token fields instead of subject. Optional ttlSeconds is clamped to [60, 7 days]. Defaults by useClass are 6h / 2d / 7d / 1d for financial_high / governance / allowlist / display.
201 body:
note: "Demo signer active", you are not production-ready. Set ATTESTATION_SIGNER_PRIVATE_KEY. Demo signers are rejected when SCORING_ENVIRONMENT=mainnet.
2. Verify off-chain
issuedAt, flagsHash mismatch, unauthorized issuer, bad EIP-712 signature, wrong subject, or wrong chain.
3. Check against your ladder
tokenAddress + tokenLadder for a dual-signal check.
Response fields that matter:
allowed/allowedByCallerLadder— your ladder and a valid attestation and a pinnedscoringVersion. Still not TrustGate authorization.policySource: always"caller_ladder"scoreIsAuthoritative:true— trustattestation.scoreandattestation.signaturewalletEvaluation,tokenEvaluationattestationguidancerestates the fence
ladderPreset: "example_lending" or "example_governance". Forbidden on mainnet. Mainnet also requires protocolId and multi-factor acknowledgement.
EIP-712 domain
TrustAttestation:
flagsHash = keccak256(utf8(sortedUppercaseFlags.join("|"))).
On-chain verifier
Deploycontracts/TrustAttestationVerifier.sol yourself. It is implemented in the repo and is not a shared singleton on Arc Testnet. Constructor takes the initial issuer. Owner calls setIssuer(address, bool) to rotate.
Expired, BadSubject, BadChain, BadIssuer, BadSignature, Unauthorized. The contract does not evaluate your ladder. You still apply bands in your own module after a successful verify.
Integration checklist
- Pin
scoringVersion - Set max attestation age (or rely on
expiresAt) - Fail closed on missing / invalid / expired attestation
- Require at least one non-TrustGate risk factor for high-value actions
- Write user-facing denials without implying TrustGate “rejected a loan”
- Never present a testnet score as mainnet-gating grade
Next
Gating product page
Doctrine, TTL table, and status.
Protocol Guard
Alerts and contextual floors, if you do not need a signature.
