Sign in with Adunai.

One handshake. Two SDK surfaces. Sign in with Adunai is the OAuth-shaped grant flow that powers both integration patterns — builders deploying contracts on the substrate, and institutional relying parties verifying African user identity without deploying contracts.

The flow at a glance

From a user's perspective, the flow is identical to any OAuth handshake: tap, consent in the aID client, return authenticated. Underneath, the grant is recorded on Base; the receiving application reads cryptographically verified attestations directly from the on-chain registries.

1AppRequestApp calls adunai.signIn() with clientId + scopes.
2aIDConsentUser reviews scopes in aID; taps Allow or Deny.
3ChainGrantSelectiveDisclosure records the scoped, revocable grant on Base.
4AppReadApp reads attestations from on-chain registries.
5AppVerifyApp verifies issuer signatures against its trust policy.

For builders · @adunai/sdk

Protocol builders use @adunai/sdk to call signIn on the substrate. The SDK handles the on-chain grant write, scope encoding, and returns a typed grant object.

typescript@adunai/sdk · pattern · build
// Builder · OAuth-shaped grant flow on protocol substrate.
import { Adunai } from "@adunai/sdk";

const adunai = new Adunai({ network: "base" });

const grant = await adunai.signIn({
  clientId: "com.nimba.app"scopes: [
    "identity:handle""attestation:kyc-tier-2""attestation:residency"],
});

// Read on-chain attestations for the granted DID.
const claims = await adunai.attestations(grant.did);

console.log(grant.handle);  // @aminata
console.log(claims.kyc);     // tier-2, verified

For relying parties · @adunai/verify

Institutional relying parties use @adunai/verify. The package handles the same grant flow but never writes to the substrate — the relying party verifies issuer signatures locally against a trust policy file.

typescript@adunai/verify · pattern · integrate
// Relying party · verify a signed attestation locally.
import { Adunai, verify } from "@adunai/verify";

const adunai = new Adunai({ network: "base" });

const grant = await adunai.signIn({
  clientId: "gov.republic.visa"scopes: [
    "attestation:kyc-tier-1""attestation:bank-statement-90d""attestation:employment""attestation:tax-compliance"],
  trustPolicy: "./trust-policy.json"});

// Verify each issuer signature against the trust policy.
const ok = grant.attestations.every(verify);
// ok === true \u2192 application admitted in seconds

Trust policy

The trust policy is a JSON file local to the relying party. It enumerates which attesters the relying party trusts for which attestation types. The protocol does not run a "global trust list" — each relying party chooses its own attester set.

jsontrust-policy.json
{
  "attestation:kyc-tier-1": [
    "0x… attester address"// Ndiga ID · KYC tier 1 (illustrative)
    "0xB12...77E9"    // Pan-African Bank · KYC tier 1
  ],
  "attestation:residency": [
    "0x… attester address"   // a national ID authority (illustrative)
  ],
  "attestation:employment": "any-accredited"
}

An any-accredited value accepts any attester in AttesterRegistry for that attestation type. Specific addresses lock the trust set to a curated list.

Scope reference

Scopes follow the pattern <type>:<variant>. Below are the launch-set scopes; full set in the SDK reference.

ScopeReadsTier
identity:handleUser's @handle and DIDPublic
identity:didDID only (no handle)Public
attestation:kyc-tier-1Government ID + face matchBaseline
attestation:kyc-tier-2Tier 1 + address + livenessEnhanced
attestation:residencyGovernment-issued residency proofEnhanced
attestation:bank-statement-90dBank-statement window attestationEnhanced
attestation:employmentEmployment verificationEnhanced
attestation:tax-complianceTax-authority compliance statusEnhanced

Pattern #18(b)

§

Architecturally enabled at mainnet. Sign in with Adunai is implemented end-to-end on Base testnet today. Operational institutional ecosystem — the specific list of accredited attesters and the trust-policy boilerplates for major institutions — activates through Phase 1+ as the partnership track matures.

Next

Phase 0 · Base Sepolia testnet