Skip to main content

Liability fence

TrustGate said the wallet scored N at time T under scoringVersion 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:
If you see 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

Fail-closed on expiry, future issuedAt, flagsHash mismatch, unauthorized issuer, bad EIP-712 signature, wrong subject, or wrong chain.

3. Check against your ladder

Optional: tokenAddress + tokenLadder for a dual-signal check. Response fields that matter:
  • allowed / allowedByCallerLadderyour ladder and a valid attestation and a pinned scoringVersion. Still not TrustGate authorization.
  • policySource: always "caller_ladder"
  • scoreIsAuthoritative: true — trust attestation.score and attestation.signature
  • walletEvaluation, tokenEvaluation
  • attestation
  • guidance restates the fence
Demo-only on testnet: ladderPreset: "example_lending" or "example_governance". Forbidden on mainnet. Mainnet also requires protocolId and multi-factor acknowledgement.

EIP-712 domain

Primary type TrustAttestation:
flagsHash = keccak256(utf8(sortedUppercaseFlags.join("|"))).

On-chain verifier

Deploy contracts/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.
Reverts: 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.