Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
LABS
Guides

Setting Up Investor Accreditation and KYC Verification Pipelines

A technical guide for developers to build a system that automates investor verification for compliant security token offerings, integrating third-party KYC, decentralized identity, and on-chain enforcement.
Chainscore © 2026
introduction
INTRODUCTION

Setting Up Investor Accreditation and KYC Verification Pipelines

A guide to implementing compliant identity verification for on-chain investment protocols.

For any on-chain investment platform dealing with regulated assets like security tokens or private equity, establishing a compliant identity verification pipeline is a foundational requirement. This process, often called Know Your Customer (KYC) and Accredited Investor Verification, serves as the gatekeeper, ensuring only eligible participants can access specific financial opportunities. In a decentralized context, this creates a unique challenge: balancing regulatory compliance with the principles of user sovereignty and privacy that underpin Web3.

A robust verification pipeline typically involves three core components: identity proofing, accreditation checks, and on-chain attestation. Identity proofing verifies a user is who they claim to be, often using government-issued ID and liveness checks via a provider like Persona or Veriff. Accreditation checks confirm the user meets specific financial thresholds defined by regulators, such as the SEC's Rule 501 in the United States. This can involve analyzing bank statements, tax documents, or professional certifications through services like Accredify or Parallel Markets.

The critical technical step is moving this verified status on-chain in a privacy-preserving manner. Simply storing personal data on a public ledger is unacceptable. Instead, platforms use verifiable credentials or zero-knowledge proofs (ZKPs). A user obtains a signed attestation from a trusted verifier (e.g., 0xVerifier.sol), which is a cryptographic proof of their status without revealing the underlying documents. A smart contract, like an investment vault's mint function, can then check for a valid credential signature before allowing a transaction to proceed.

Implementing this requires careful smart contract design. A typical pattern involves a registry contract that maps user addresses to their verification status or the expiration timestamp of their credential. Gated functions use a modifier, such as onlyVerifiedInvestor, to check this registry. It's crucial to include mechanisms for status revocation and expiry to maintain ongoing compliance. Open-source libraries like OpenZeppelin's access control can be extended for this purpose, while protocols like Ethereum Attestation Service (EAS) provide a standardized framework for issuing and storing attestations.

When choosing a KYC provider, key technical considerations include their API reliability, on-chain integration options (e.g., do they offer a verifier smart contract?), and data residency requirements. Costs are typically per verification, so architecting a gas-efficient flow is important. A common user flow is: 1) User initiates verification off-chain via your frontend, 2) Provider returns a success payload with a cryptographic proof, 3) Your backend or the user's wallet submits this proof to your on-chain verifier contract, which updates the registry.

Ultimately, a well-architected KYC pipeline is not a barrier but a trust primitive that enables more sophisticated and compliant DeFi and real-world asset (RWA) applications. By leveraging decentralized identity standards like W3C Verifiable Credentials and on-chain attestation protocols, developers can build systems that respect user privacy while fulfilling regulatory obligations, paving the way for broader institutional adoption of blockchain-based finance.

prerequisites
PREREQUISITES AND SYSTEM REQUIREMENTS

Setting Up Investor Accreditation and KYC Verification Pipelines

This guide outlines the technical and compliance prerequisites for integrating investor accreditation and KYC/AML verification into Web3 applications, focusing on the infrastructure needed to meet regulatory standards.

Before implementing any verification pipeline, you must define your jurisdictional requirements. Regulations like the U.S. Securities and Exchange Commission (SEC) Rule 506(c) for accredited investors, the EU's Markets in Crypto-Assets (MiCA) regulation, or the Financial Action Task Force (FATF) Travel Rule dictate specific data collection and verification standards. Your system's design—whether it's for an Initial DEX Offering (IDO), a real-world asset (RWA) platform, or a private token sale—will be constrained by these legal frameworks. Non-compliance risks severe penalties and operational shutdowns.

The core system requirement is a secure backend capable of handling Personally Identifiable Information (PII). This necessitates a dedicated, encrypted database (e.g., PostgreSQL with pgcrypto) isolated from your public blockchain nodes. You will need APIs to connect to third-party KYC providers like Synapse, Sumsub, or Jumio, which perform identity document checks, liveness detection, and sanction screening. Your architecture must also include a secure method for users to upload documents, often using pre-signed URLs to cloud storage (AWS S3, GCP Cloud Storage) to avoid exposing your backend directly.

For accreditation, particularly under Rule 506(c), you must verify income or net worth. This requires integrating with financial data aggregators (e.g., Plaid in the U.S.) to securely retrieve bank statements, tax documents, or brokerage account balances with user consent. The system must cryptographically attest to the verification process. A common pattern is to mint a soulbound token (SBT) or a signed, verifiable credential upon successful checks, which the user's wallet can present to access gated smart contract functions, without storing the sensitive data on-chain.

Smart contract integration is a critical component. The verification result must permission access. A typical setup involves an access control contract like OpenZeppelin's AccessControl. After off-chain verification, your authorized backend signs a message. The user submits this signature to a mint or purchase function, which uses ECDSA.recover to validate it against a known verifier address. Example function logic:

solidity
function verifiedMint(bytes calldata signature) public {
    bytes32 messageHash = keccak256(abi.encodePacked(msg.sender, "ACC_VERIFIED"));
    require(hasRole(VERIFIER_ROLE, ECDSA.recover(messageHash, signature)), "Invalid proof");
    _mint(msg.sender, 1);
}

Finally, you must establish data retention and deletion policies compliant with regulations like GDPR. Your system should automate the secure purging of PII after a mandated period unless otherwise required. Logging and audit trails for all verification attempts and administrator actions are non-negotiable for regulatory examinations. Implementing these pipelines is complex but foundational for launching compliant investment vehicles in the decentralized space.

architecture-overview
INVESTOR ONBOARDING

System Architecture Overview

A robust, automated pipeline for investor accreditation and KYC verification is a foundational component for compliant Web3 fundraising platforms and tokenized asset offerings.

The core architecture for an investor onboarding pipeline typically follows a modular, event-driven design. It separates the user-facing application from the compliance logic and external service integrations. A common pattern involves a frontend client, a backend API gateway, specialized microservices for KYC and accreditation, and a secure database layer. Events, such as a user submitting their identity documents, trigger asynchronous workflows that orchestrate checks across multiple providers without blocking the user experience. This decoupling ensures scalability and makes it easier to swap out compliance vendors or add new jurisdictional requirements.

Identity Verification (KYC) is the first critical module. It integrates with specialized providers like Sumsub, Jumio, or Onfido via their APIs. The process involves collecting government-issued ID, a liveness check (often a short video selfie), and sometimes proof of address. The architecture must securely handle PII (Personally Identifiable Information), often by only storing anonymized reference IDs and audit trails while the raw data resides with the compliant vendor. The system should be designed to handle various outcomes: clear, pending_review, or rejected, with appropriate user notifications and admin dashboards for manual review escalations.

Accreditation Verification runs in parallel or sequentially after KYC. For US regulations like Rule 506(c), this involves verifying an investor's status as an accredited investor. The architecture integrates with services like Accredd or VerifyInvestor.com. The system must collect and forward relevant financial documentation or attestation letters. A key design consideration is implementing logic for different accreditation criteria: income thresholds ($200k/$300k), net worth excluding primary residence (> $1M), or professional certifications. The results should be stored with a clear expiry date, as accreditation status must be re-verified periodically.

The data model and state management are crucial. Each investor's onboarding journey should be tracked with a status machine (e.g., pending_kyc -> kyc_passed -> pending_accreditation -> verified). All documents, verification proofs, timestamps, and provider responses must be immutably logged for audit purposes. This data layer must be highly secure, employing encryption at rest and in transit, with strict access controls. Smart contracts for token sales or SAFT agreements can be programmed to check an on-chain or off-chain registry holding this verification status before allowing participation.

Finally, the architecture must plan for failure modes and compliance holds. Network timeouts, unclear document photos, or ambiguous financial statements require graceful handling. Implement retry logic with exponential backoff for API calls, dead-letter queues for failed jobs, and clear admin alerts. The design should also support manual review workflows where compliance officers can override or request additional information. By building a resilient, transparent, and modular pipeline, platforms can achieve regulatory compliance while providing a smooth investor onboarding experience.

verification-providers
IMPLEMENTATION GUIDE

Selecting and Integrating Verification Providers

A technical overview of key tools and protocols for building compliant investor onboarding pipelines in Web3, covering KYC, accreditation, and identity verification.

backend-orchestration
ARCHITECTURE

Building the Backend Verification Orchestrator

This guide details the implementation of a backend orchestrator for managing investor accreditation (KYC) and compliance workflows in a Web3 environment.

A backend verification orchestrator is a centralized service that manages the flow of user data between your application, third-party verification providers, and on-chain attestations. Its primary functions are to initiate checks, process results, and maintain a secure audit trail. Instead of handling KYC logic directly in your smart contracts or frontend, the orchestrator acts as a middleware layer, integrating with services like Synaps, Veriff, or Persona via their APIs. This separation of concerns enhances security, simplifies compliance updates, and allows for complex, multi-step verification pipelines.

The core architecture typically involves several key components. A webhook listener receives asynchronous verification results from providers. A database (e.g., PostgreSQL) stores user references, verification statuses, and raw provider payloads for compliance. A job queue (using Redis with Bull or similar) manages background tasks like retrying failed API calls or updating user records. Finally, an attestation service generates and submits verifiable credentials or on-chain proofs, such as Ethereum Attestation Service (EAS) schemas, once verification is complete. This structure ensures reliability and scalability.

Implementing the accreditation logic requires defining clear state transitions. A user's verification journey might move through statuses like pending, submitted, under_review, approved, or rejected. Your orchestrator's API should expose endpoints for frontends to POST user data and GET status updates. Crucially, personal identifiable information (PII) should never be stored on-chain. The orchestrator holds the PII securely off-chain, linking it to a user's wallet address via a UUID, and only pushes a cryptographic proof of verification status to the blockchain.

Here is a simplified Node.js example using Express and a job queue to initiate a check with a hypothetical provider:

javascript
app.post('/api/kyc/initiate', async (req, res) => {
  const { userId, walletAddress } = req.body;
  // 1. Create a session with the KYC provider
  const session = await kycpProvider.createSession({ userId });
  // 2. Store initial state in your database
  await db.storeVerificationRecord(userId, walletAddress, session.id, 'pending');
  // 3. Queue a job to check the result later
  verificationQueue.add('pollKycResult', { sessionId: session.id, userId }, { delay: 60000 });
  // 4. Return the session URL to the frontend for the user to complete
  res.json({ verificationUrl: session.url });
});

Handling the result via webhook is critical for security. Your webhook endpoint must verify the incoming request's signature (using a provider-shared secret) to prevent spoofing. Upon receiving a verified status, the orchestrator updates its database, and can then trigger the attestation process. For example, it might call an EAS resolver contract to create an on-chain attestation linking the walletAddress to a isAccredited schema. Always implement idempotency checks in your webhook handler to avoid duplicate processing from potential provider retries.

Finally, consider privacy and data minimization. Use the orchestrator to only request and store the minimum KYC data required for your jurisdiction. Implement automatic data purging policies in line with regulations like GDPR. For a fully decentralized future, explore integrating zero-knowledge proof (ZKP) based verification protocols, where the orchestrator could verify a ZKP credential (e.g., from iden3) instead of raw PII, moving towards a model of self-sovereign identity while maintaining necessary compliance guardrails.

did-verifiable-credentials
DECENTRALIZED IDENTITY

Setting Up Investor Accreditation and KYC Verification Pipelines

A technical guide to building compliant, privacy-preserving investor onboarding using verifiable credentials and zero-knowledge proofs.

Traditional investor accreditation and KYC processes are centralized, siloed, and privacy-invasive. Decentralized Identity (DID) and Verifiable Credentials (VCs) offer a paradigm shift. Instead of repeatedly submitting sensitive documents, an investor obtains a VC from a trusted issuer (e.g., a licensed KYC provider). This credential, which contains verified claims about their accreditation status or identity, is stored in a user-controlled wallet. Protocols can then request proof of these claims without accessing the underlying data, enabling a reusable, portable, and privacy-enhanced verification flow.

The technical architecture involves three core roles defined by the W3C Verifiable Credentials Data Model. The issuer (a regulated entity) signs credentials. The holder (the investor) stores and presents them. The verifier (a DeFi protocol or fundraising platform) requests and validates proofs. Standards like did:ethr or did:key create decentralized identifiers anchored to a blockchain, providing cryptographic control. Credentials are typically issued as JSON-LD or JWT objects, signed with the issuer's DID. This creates a cryptographically verifiable link between the credential and its issuer.

For accreditation, a Verifiable Credential might contain a claim like "accreditedInvestor": true with an issuance date and expiry. The critical innovation is selective disclosure. Using Zero-Knowledge Proofs (ZKPs), such as those enabled by the JSON Web Proof (JWP) draft standard or circuits from libraries like circom, the holder can prove they possess a valid credential from a trusted issuer without revealing the credential's entire contents or a unique identifier. This minimizes data leakage and preserves pseudonymity across applications.

Implementing a verification pipeline requires a verifier service. This service specifies the Presentation Request, detailing the required credentials and proof types. A holder's wallet (like SpruceID's Sign-In with Ethereum kit or Veramo) constructs a Verifiable Presentation to satisfy this request. The verifier must then check the proof signature, verify the issuer's DID on-chain, ensure the credential isn't revoked (by checking a revocation registry like Ethereum Attestation Service), and validate that the disclosed claims meet policy. Smart contracts can be verifiers for on-chain gating.

Here is a simplified conceptual flow using pseudocode for a verifier endpoint:

javascript
// Verifier receives a Verifiable Presentation (VP)
async function verifyInvestorAccreditation(vp) {
  // 1. Verify the VP's cryptographic proof
  const isSigValid = await verifyPresentationSignature(vp);
  // 2. Resolve the Issuer's DID Document from the blockchain
  const issuerDoc = await didResolver.resolve(vp.issuerDid);
  // 3. Check credential status against revocation registry
  const isRevoked = await checkRevocationStatus(vp.credentialId);
  // 4. Validate the disclosed claim meets criteria
  const isAccredited = vp.claims.accreditedInvestor === true;
  const isRecent = vp.claims.issuanceDate > Date.now() - ONE_YEAR;
  return isSigValid && !isRevoked && isAccredited && isRecent;
}

Key considerations for production systems include issuer trust (curating a list of accredited KYC providers), revocation mechanisms, credential schema management, and user experience. Projects like Ontology's ONT ID, Circle's Verite, and Polygon ID offer infrastructure. This architecture moves compliance from a repetitive, point-in-time check to a reusable, user-centric asset. It reduces friction for legitimate users while providing verifiers with cryptographically assured, policy-compliant proofs, forming the bedrock for compliant decentralized finance and securities offerings.

on-chain-attestations
TUTORIAL

Deploying On-Chain Attestation Contracts

A practical guide to building automated investor accreditation and KYC verification systems using on-chain attestations.

On-chain attestations provide a verifiable, tamper-proof record of claims, making them ideal for automating compliance workflows like investor accreditation. Instead of relying on centralized databases, you can use smart contracts to issue and verify credentials directly on a blockchain. This tutorial focuses on implementing a pipeline for Know Your Customer (KYC) and accredited investor verification using the Ethereum Attestation Service (EAS) or a custom Soulbound Token (SBT) contract. The core components are an attester (the entity issuing the credential), a schema (the data structure of the attestation), and a verifier (a contract that checks the attestation's validity).

First, define your attestation schema. For accredited investor verification, your schema must include essential fields like the investor's wallet address, accreditation status (boolean), issuer identifier, expiration date, and a link to supporting documentation. Using EAS, you can create a schema on-chain with a call to eas.register(). For a custom SBT approach, your ERC-721 or ERC-1155 contract's metadata should encode this data. The schema is the foundation; a poorly designed schema will lead to inefficient or insecure verification later.

Next, deploy the attester contract. This smart contract will have the exclusive right to issue attestations matching your schema. It should include access control—typically via OpenZeppelin's Ownable or AccessControl—to ensure only authorized parties (like a compliance officer or a trusted oracle) can mint credentials. The minting function should validate input data against the schema and emit an event. For EAS, you would call eas.attest() with the schema UID and the encoded data. Always include a revoke function to invalidate attestations if accreditation status changes.

The verification pipeline is where other protocols interact with your attestations. Create a Verifier contract that other DeFi or investment dApps can query. This contract needs a function, like isInvestorAccredited(address wallet), that checks for a valid, unexpired attestation from your trusted attester. It must verify the attestation's signature (if using EAS) or check the SBT balance and metadata. For gas efficiency, consider storing a cached status in a mapping, updated via events from the attester, rather than verifying on-chain signatures for every query.

Integrate off-chain data securely using oracles like Chainlink or a custom signer. Your KYC provider can submit a cryptographically signed message containing the investor's status. Your attester contract can then verify this signature (e.g., using ECDSA recovery) before minting the on-chain attestation. This creates a hybrid trust model: the oracle is trusted for the initial data feed, but the resulting attestation is independently verifiable by anyone on-chain. Always use a nonce or timestamp in the signed message to prevent replay attacks.

Finally, consider the user experience and legal compliance. Your system should allow users to request verification, possibly through a frontend that interacts with your contracts. Provide a way for users to see their own attestations and understand what data is stored. Remember that on-chain data is public; use encryption (e.g., with Lit Protocol) or zero-knowledge proofs for sensitive Personally Identifiable Information (PII), storing only hashes or ZK proofs on-chain. Audit your contracts thoroughly, as handling accreditation incorrectly can have significant regulatory implications.

PROTOCOL OVERVIEW

Comparison of On-Chain Attestation Standards

A technical comparison of leading standards for issuing and verifying investor accreditation credentials on-chain.

Feature / MetricEthereum Attestation Service (EAS)VeraxKarma3 Labs GoodDollar

Core Architecture

Schema-based attestations on any EVM chain

Optimistic attestation registry on OP Stack

Reputation graph with delegated attestations

Schema Flexibility

On-Chain Revocation

Gas Cost per Attestation (ETH L1)

$8-15

$0.02-0.05 (Optimism)

$0.01-0.03 (Polygon)

Timestamp Proof

On-chain block timestamp

On-chain block timestamp

Off-chain with on-chain commitment

Default Privacy

Public

Public

Private by default (ZK proofs)

Primary Use Case

General-purpose verifiable credentials

Sybil-resistant governance

Financial compliance & KYC

Integration Complexity

Low (SDK, Subgraph)

Medium (Custom indexer needed)

High (ZK circuit setup)

token-gating-implementation
ON-CHAIN VERIFICATION

Implementing Token Gating with Attestations

This guide details how to build investor accreditation and KYC verification pipelines using on-chain attestations for token-gated access.

Token gating restricts access to digital assets or services based on ownership of a specific token. Traditionally, verifying real-world credentials like investor accreditation status for a Regulation D offering required off-chain checks, creating friction. On-chain attestations solve this by providing a tamper-proof, portable, and verifiable credential. An attestation is a signed piece of data, often an EAS (Ethereum Attestation Service) schema, that asserts a claim about a user's wallet address, such as isAccreditedInvestor: true. This allows smart contracts to permission access based on verified identity, not just token balance.

Setting up the pipeline begins with defining your attestation schema. For KYC and accreditation, your schema should include fields for the investor's wallet address, a boolean status flag, an expiration timestamp, and the attester's address. Using EAS on Ethereum Sepolia, you would register a schema like (address wallet, bool isAccredited, uint64 expiry, address attester). The attester is a secure backend service you control that signs these claims after performing the necessary off-chain verification through a provider like Persona or Parallel Markets. This separation keeps sensitive data off-chain while the proof of verification lives on-chain.

The core logic resides in a gating smart contract. This contract's requireIsEligible function will check for a valid, unexpired attestation linked to the user's address before granting access. Here is a simplified example using a hypothetical attestation registry:

solidity
function mintToken(address user) public {
    Attestation memory attestation = attestationRegistry.getAttestation(user);
    require(attestation.isValid, "No valid attestation found");
    require(attestation.isAccredited, "Not an accredited investor");
    require(attestation.expiry > block.timestamp, "Attestation expired");
    // Proceed with minting logic
    _mint(user, 1);
}

This contract logic ensures only wallets with a current, accredited status can execute the function.

For the user experience, you need to connect the off-chain KYC flow to on-chain attestation issuance. A typical flow is: 1) User connects wallet to your dApp frontend, 2) User is redirected to your KYC provider's flow, 3) Upon successful verification, your backend attester service calls EAS.attest() to create the on-chain record, paying the gas fee, 4) The dApp UI detects the new attestation and unlocks the gated feature. It's critical to design your schema with an expiry field to comply with regulations requiring periodic re-verification, typically annually for accreditation.

Key security considerations include protecting your attester's private key, using a multisig or smart contract wallet for attestations, and implementing schema revocation. EAS allows attesters to revoke an attestation if a user's status changes. Furthermore, for production use, consider using a modular attestation registry like Verax on L2s to reduce gas costs, or ENS for readable identity resolution. Always audit the entire pipeline, as the gating contract's security depends entirely on the integrity of the attestation data and the attester's signer key.

This architecture creates a robust, composable foundation. The same attestation proving accredited investor status can be reused across multiple dApps and protocols without repeating KYC checks, embodying the principle of portable identity. By moving verification proofs on-chain, you enable transparent, automated, and trust-minimized access control for regulated DeFi, private NFT sales, and exclusive governance forums.

security-best-practices
INVESTOR ACCREDITATION & KYC

Security and Privacy Best Practices

Technical guidance for developers implementing compliant identity verification and investor accreditation workflows in Web3 applications.

03

Designing a Privacy-Preserving Verification Flow

Minimize data exposure and user friction with a secure architecture.

  • Decentralized Identifiers (DIDs): Use standards like W3C Verifiable Credentials to allow users to store attested KYC data in their wallet, reusing it across dApps without re-submitting documents.
  • Zero-Knowledge Proofs (ZKPs): Protocols like zkKYC allow users to prove they are verified or accredited without revealing underlying personal data.
  • Data Handling: Encrypt PII at rest, use short retention policies, and never store sensitive data on-chain.
  • User Consent: Clearly explain data usage and obtain explicit consent before collection.
04

Implementing Accredited Investor Checks

For Reg D 506(c) offerings in the US, issuers must take reasonable steps to verify accredited investor status. Acceptable methods include:

  • Third-Party Verification Letter: From a registered broker-dealer, SEC-registered investment adviser, licensed attorney, or CPA.
  • Income Verification: Review of IRS forms (W-2, 1099) for the past two years.
  • Net Worth Verification: Review of assets (bank statements, brokerage statements) and liabilities (credit report), with a signed certification.
  • Existing Investor: Verification for a previous Reg D offering in the past 5 months. Automate document collection and review workflows via provider APIs.
05

On-Chain Reputation and Sybil Resistance

Prevent Sybil attacks where one entity creates multiple verified identities.

  • Graph Analysis: Map relationships between wallet addresses and funding sources to detect clusters.
  • Staking/Gating: Require a non-trivial, lockable stake (in tokens or NFTs) tied to a verified identity.
  • Proof-of-Personhood: Integrate protocols like Worldcoin or BrightID for unique human verification.
  • Gradual Access: Use a tiered system where basic KYC unlocks Level 1 features, while accredited status unlocks Level 2 (e.g., higher investment caps).
DEVELOPER FAQ

Frequently Asked Questions

Common technical questions and troubleshooting for implementing investor accreditation and KYC verification in Web3 applications.

Accreditation and KYC (Know Your Customer) are distinct but often sequential compliance steps.

KYC is the identity verification process. It confirms a user is a real person by checking government-issued ID, proof of address, and performing sanctions screening. Tools like Sumsub, Veriff, or Onfido provide this service via API.

Accreditation verifies an investor's financial eligibility to participate in private sales or regulated offerings (like SEC Rule 506(c)). It proves an individual meets specific income or net worth thresholds. This often requires document uploads (tax returns, bank statements, letters from CPAs) and is legally required for many token sales to avoid violating securities laws. In a pipeline, KYC typically runs first, followed by accreditation checks for qualified offerings.