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

Launching a Platform with Built-In Regulatory Compliance

A technical guide for developers on architecting a tokenization platform with embedded compliance logic, including automated KYC/AML, transfer restrictions, and regulatory audit trails.
Chainscore © 2026
introduction
BUILDING FOR THE FUTURE

Introduction: The Need for Compliance by Design

Why proactive compliance architecture is essential for sustainable Web3 platforms.

Launching a decentralized platform without considering regulatory frameworks from the outset is a significant operational risk. The traditional approach of building first and addressing compliance later—often called a "bolt-on" strategy—is increasingly untenable. Regulatory bodies like the SEC, FCA, and MAS are actively scrutinizing digital asset platforms, focusing on areas like anti-money laundering (AML), know-your-customer (KYC) procedures, and securities law compliance. A compliance-by-design methodology integrates these requirements directly into the platform's architecture and smart contract logic, reducing legal exposure and building user trust from day one.

This approach is not about stifling innovation but about creating a sustainable foundation. Key regulatory touchpoints must be engineered into the user journey and backend systems. For a token launchpad, this means programmatically embedding investor accreditation checks (Reg D 506(c) verification), jurisdictional geoblocking for restricted regions, and transfer restrictions for security tokens. For a DeFi protocol, it involves integrating transaction monitoring for sanctions screening and implementing wallet-level interaction limits. These controls should be modular, upgradeable, and transparent to users where appropriate.

Technically, compliance by design leverages on-chain and off-chain verification systems. A common pattern uses a permissioned registry or a verifiable credentials system (like W3C Verifiable Credentials) managed by accredited providers. A smart contract can require a valid, non-expired credential proof for specific actions. For example, a mint function might check a ProofOfAccreditation attestation signed by a trusted oracle before allowing participation in a private sale. Off-chain, robust KYC/AML providers like Sumsub or Jumio can be integrated via API, with attestations of completion hashed and stored on-chain for audit trails.

The business case is clear: platforms with embedded compliance have a lower risk of costly enforcement actions, service interruptions, or forced geographic withdrawals. They are also more attractive to institutional participants who require demonstrable adherence to regulations. Furthermore, designing with compliance in mind forces clearer articulation of tokenomics and utility, separating security-like features from pure utility tokens—a distinction critical for regulatory classification. This proactive stance turns compliance from a cost center into a core feature and competitive advantage.

Implementing this requires cross-disciplinary planning. Developers, legal counsel, and product managers must collaborate early to map regulatory requirements to technical specifications. Start by conducting a regulatory mapping exercise: identify all applicable regulations (e.g., FATF Travel Rule, MiCA in the EU, SEC guidelines), define the necessary controls, and design the smart contract state variables and modifiers to enforce them. Use upgradeable proxy patterns or modular diamond proxies (EIP-2535) to allow for future regulatory updates without requiring a full platform migration, ensuring long-term adaptability.

prerequisites
FOUNDATION

Prerequisites and Tech Stack

A compliant Web3 platform requires a deliberate technology stack and foundational knowledge. This section outlines the essential tools, frameworks, and regulatory concepts you need before writing your first line of code.

Launching a compliant platform begins with a solid technical foundation. You'll need proficiency in a smart contract language like Solidity for Ethereum Virtual Machine (EVM) chains or Rust for Solana. A strong understanding of Web3.js or Ethers.js libraries is essential for frontend interaction. For backend services, Node.js or Python with frameworks like FastAPI are common choices. Your development environment should include tools like Hardhat or Foundry for EVM development, which provide testing, deployment, and local blockchain simulation crucial for iterating on compliance logic before mainnet deployment.

Regulatory compliance is not an afterthought; it must be architected into the protocol. Core concepts you must understand include Know Your Customer (KYC), Anti-Money Laundering (AML) checks, and transaction monitoring. For platforms handling securities, familiarity with regulations like the U.S. Howey Test or the EU's MiCA framework is non-negotiable. Technically, this means designing smart contracts with modular compliance hooks—such as pausable functions, upgradeable proxies for rule updates, and permissioned minting/burning—that can integrate with off-chain verification services without compromising decentralization where possible.

Your stack must include specialized tools for identity and compliance. Integrate with decentralized identity (DID) providers like SpruceID or Veramo for user-controlled credentials. For automated regulatory checks, services like Chainalysis for blockchain analytics or Sumsub for KYC orchestration provide essential APIs. All sensitive data should be handled off-chain; use zero-knowledge proofs (ZKPs) via libraries like Circom or SnarkJS to prove compliance (e.g., user is verified) without revealing the underlying personal data on-chain, balancing regulatory needs with user privacy.

A robust testing and deployment strategy is critical. Use Hardhat's fork-mainnet feature to test compliance rules against real transaction data. Implement comprehensive unit and integration tests for every regulatory function. For deployment, use a multi-sig wallet (e.g., Safe) controlled by legal and technical stakeholders for administering compliance parameters. Plan your infrastructure for on-chain/off-chain data availability, using solutions like IPFS or Ceramic for storing verifiable credentials, and ensure your frontend can seamlessly interact with wallet providers like MetaMask while managing user attestations.

architectural-overview
REGULATORY TECH

Architectural Overview: On-Chain and Off-Chain Components

A compliant Web3 platform requires a hybrid architecture that strategically separates immutable ledger logic from flexible, verifiable compliance services.

A compliant Web3 platform's architecture is fundamentally hybrid, splitting responsibilities between on-chain and off-chain components. The on-chain layer, consisting of smart contracts deployed on a blockchain like Ethereum or Polygon, handles core, immutable business logic: token transfers, ownership records, and decentralized governance voting. This layer provides transparency and censorship resistance but is inherently limited in processing complex, data-heavy compliance checks due to gas costs and blockchain's deterministic nature. Therefore, it defers permissioning and validation to a trusted off-chain component, often called a Compliance Oracle or Policy Engine.

The off-chain component is a server or decentralized network that executes regulatory logic. It connects to real-world data sources like sanction lists (OFAC), performs Know Your Customer (KYC) verification via providers like Veriff or Sumsub, and assesses transaction risk. When a user initiates an on-chain action, the smart contract queries this off-chain service via a signed message or oracle network like Chainlink. The off-chain service returns an attestation—a cryptographically signed verdict (e.g., ALLOW or DENY)—which the contract verifies before proceeding. This separation keeps sensitive personal data off the public ledger while enabling enforceable rules.

Key to this architecture's integrity is the verifiability of off-chain actions. Merely trusting a centralized server is antithetical to Web3. Solutions like zk-proofs (e.g., using zkSNARKs) allow the off-chain service to prove it correctly executed compliance policies without revealing underlying user data. Alternatively, a decentralized network of nodes running the policy engine (a decentralized autonomous organization (DAO) of attesters) can provide economic security through staking and slashing. The on-chain contract must be designed to only accept attestations from a whitelisted, secure set of signers or verifiable proofs.

Implementing this requires careful contract design. A typical pattern involves a RegulatedToken contract with a _beforeTokenTransfer hook. This hook calls a ComplianceOracle contract, which holds the address of the off-chain verifier. The flow is: 1) User requests transfer, 2) Contract emits event with user details, 3) Off-chain service listens, runs checks, and signs a message, 4) User submits the signature as a parameter to the transfer function, 5) Contract uses ecrecover to validate the signature came from the authorized verifier before finalizing. This ensures no transfer occurs without a valid compliance attestation.

This architecture balances regulatory adherence with blockchain principles. It allows platforms to update compliance rules (e.g., for new jurisdictions) off-chain without costly smart contract migrations, while the on-chain component guarantees those rules are enforced for every transaction. Developers must audit both layers: the smart contracts for security vulnerabilities and the off-chain service's operational integrity and data privacy practices. The end result is a system where regulatory compliance becomes a programmable, transparent layer within the DeFi stack, not an external afterthought.

compliance-tools-resources
DEVELOPER RESOURCES

Key Compliance Tools and Providers

Integrating compliance from the start is critical for sustainable platform growth. These tools provide the foundational infrastructure for identity verification, transaction monitoring, and regulatory reporting.

06

Implementing Internal Controls

Beyond third-party tools, platforms must establish internal policies, procedures, and controls (IPPC). This is the operational framework that turns tooling data into actionable compliance.

  • Risk-Based Approach (RBA): Document how you categorize users and transactions by risk level (e.g., geographic, transaction size).
  • Suspicious Activity Reporting (SAR): Define clear internal workflows for investigating alerts and filing reports with financial intelligence units.
  • Record Keeping: Ensure all KYC data, risk assessments, and transaction records are stored securely for 5+ years as required by regulators like FinCEN.

This internal governance is what auditors and regulators will examine during licensing applications.

implementing-automated-kyc-aml
REGULATORY COMPLIANCE

Step 1: Implementing Automated KYC/AML Verification

Integrate automated identity verification and sanctions screening to meet Anti-Money Laundering (AML) and Know Your Customer (KYC) requirements for a compliant platform launch.

Automated KYC/AML verification is the foundational layer for any regulated Web3 platform. It involves programmatically verifying user identities and screening them against global sanctions lists and politically exposed persons (PEP) databases. This process is critical for platforms handling fiat on-ramps, tokenized securities (security tokens), or operating in jurisdictions with strict financial regulations. By automating these checks, you reduce manual overhead, accelerate user onboarding, and create a verifiable audit trail for regulators. Leading providers like Sumsub, Veriff, and Onfido offer APIs that handle document verification, liveness checks, and risk scoring.

The technical integration typically involves a server-side workflow. When a user initiates onboarding, your backend generates a unique verification session via the provider's API and redirects the user to a hosted verification page. Upon completion, the provider sends a webhook to your configured endpoint with the verification result and a risk score. Your system must then update the user's status (e.g., verified, pending, rejected) and store the verification ID for compliance records. Here's a simplified Node.js example using a mock service: const verificationLink = await kycProvider.createSession(userId, 'individual'); await userDB.update(userId, { kycStatus: 'pending', kycSessionId: verificationLink.id });.

Beyond basic identity checks, a robust AML program requires ongoing monitoring. This means periodically re-screening users against updated sanctions lists and monitoring transaction patterns for suspicious activity. For blockchain-native platforms, this involves integrating chain analysis tools like Chainalysis or TRM Labs. Their APIs can screen wallet addresses upon deposit, analyze transaction graphs, and flag wallets associated with mixers or sanctioned entities. Implementing these checks at the point of fiat deposit or token swap is a standard compliance control. The key is to design a system where a user's compliance status (kycStatus, amlRiskScore) gates their access to specific platform features, such as high-value withdrawals or trading pairs.

When designing your compliance logic, consider data privacy and user experience. Only collect necessary data (adhering to principles like GDPR) and clearly communicate why it's required. The verification flow should be mobile-friendly and guide users through document capture. It's also prudent to implement a manual review fallback for edge cases flagged by the automated system. Finally, ensure your Terms of Service and Privacy Policy explicitly outline your KYC/AML procedures, data usage, and user rights. This legal groundwork is as important as the technical implementation for establishing trust and regulatory standing.

enforcing-transfer-restrictions
IMPLEMENTATION

Step 2: Enforcing Transfer Restrictions with Security Token Standards

This guide explains how to implement and enforce transfer restrictions using established security token standards, ensuring your token platform operates within regulatory frameworks.

Security tokens differ from utility tokens by embedding compliance logic directly into the token's smart contract. This is achieved through standards like ERC-1400 (Security Token Standard) and ERC-3643 (Token for Regulated EXchanges - T-REX). These standards provide a framework for on-chain transfer restrictions, which are rules that must be validated before a token transfer can succeed. Common restrictions include verifying the recipient's accreditation status, ensuring the transfer doesn't violate jurisdictional laws, or checking that the investor's wallet is whitelisted.

The core mechanism is a canTransfer function. Before any token transfer executes, the contract calls this function, which returns a byte code indicating success or a specific restriction failure. For example, a transfer to a non-whitelisted address would return a code like 0x52 (transfer rejected - recipient not eligible). Standards like ERC-1400 formalize these codes. You implement this by overriding the standard transfer and transferFrom functions in your token contract to include a call to your custom restriction logic, reverting the transaction if checks fail.

Here's a simplified code snippet illustrating a basic whitelist check within a transfer function, a foundational element of these standards:

solidity
function transfer(address to, uint256 value) public override returns (bool) {
    require(_whitelist[msg.sender], "Sender not whitelisted");
    require(_whitelist[to], "Recipient not whitelisted");
    // ... perform the actual transfer logic
}

In a full ERC-1400/3643 implementation, this logic is more modular, often separated into a dedicated compliance smart contract that the token contract queries, allowing for upgradable rules without modifying the core token contract.

Beyond simple whitelists, advanced compliance modules can verify investor credentials via signed claims from off-chain Identity Providers, enforce holding period locks, or check against real-time sanctions lists. Platforms like Polymath and Tokeny provide SDKs and smart contract suites that implement these standards. Using a vetted, audited framework is critical, as manually coding complex regulatory logic is error-prone and increases audit surface area.

Integrating these standards requires careful planning of your off-chain verification pipeline. The on-chain contract acts as the gatekeeper, but it relies on data provided by trusted issuers or oracles. You'll need systems to collect and verify investor KYC/AML data, manage whitelist updates, and issue verifiable credentials. The on-chain result is a token that cannot be transferred to an unauthorized wallet, providing a strong technical foundation for regulatory compliance.

accreditation-workflows
REGULATORY COMPLIANCE

Step 3: Designing Investor Accreditation Verification

This guide details the technical implementation of investor accreditation checks, a critical compliance requirement for private securities offerings on blockchain platforms.

Investor accreditation verification is a legal prerequisite for platforms offering Regulation D (Reg D) securities, such as those under Rule 506(c). This rule permits general solicitation but mandates that issuers take reasonable steps to verify that all purchasers are accredited investors. An accredited investor is typically defined as an individual with an annual income exceeding $200,000 ($300,000 with a spouse) for the last two years, a net worth over $1 million (excluding primary residence), or certain institutional entities. Failing to implement proper verification exposes the platform and its issuers to severe regulatory penalties.

A compliant verification system must be non-custodial and privacy-preserving. The platform should never store sensitive personal financial documents. Instead, the architecture should integrate with specialized, licensed third-party verification providers (e.g., VerifyInvestor.com, Accredd) via API. The user flow is: 1) The investor is prompted to complete verification during onboarding or before participating in a private sale. 2) They are redirected to the third-party service's secure portal. 3) The service performs the check (reviewing tax returns, bank statements, or letters from CPAs/lawyers) and returns a cryptographically signed attestation to the platform's smart contract, containing only a boolean result and a timestamp.

The core of this system is a verification registry smart contract. This contract maintains a mapping of investor wallet addresses to their verification status and expiry date. It exposes a permissioned function, submitVerification(address investor, bool isAccredited, uint256 expiryDate, bytes signature), that can only be called by the platform's designated oracle or the verification provider's authorized signer. The contract verifies the signature against a known public key before updating the investor's status. Other platform contracts, like your Security Token Offering (STO) contract, can then query this registry using a simple view function like isVerifiedAccreditedInvestor(address _investor) before allowing a token purchase.

Here is a simplified example of a registry contract's critical function:

solidity
function submitVerification(
    address investor,
    bool isAccredited,
    uint256 expiryTimestamp,
    bytes memory signature
) external onlyVerificationOracle {
    bytes32 messageHash = keccak256(abi.encodePacked(investor, isAccredited, expiryTimestamp));
    bytes32 ethSignedMessageHash = MessageHashUtils.toEthSignedMessageHash(messageHash);
    require(
        SignatureChecker.isValidSignatureNow(VERIFIER_PUBLIC_KEY, ethSignedMessageHash, signature),
        "Invalid signature"
    );
    verifications[investor] = InvestorStatus(isAccredited, expiryTimestamp);
    emit VerificationSubmitted(investor, isAccredited, expiryTimestamp);
}

This ensures the on-chain record is tamper-proof and originates from a trusted source.

Beyond the basic check, design for re-verification. Accreditation status is not permanent; the SEC expects periodic confirmation. Your registry should store an expiry date and your platform's UI must prompt users to re-verify before their status lapses. Furthermore, implement role-based access controls within your smart contracts. The STO contract should restrict mint or transfer functions to verified addresses, and the admin functions for managing the verifier oracle should be secured behind a multi-signature wallet or a DAO vote to prevent centralized abuse.

Finally, maintain a clear audit trail. All verification submissions and status changes should emit events, creating a transparent, immutable log for compliance audits. Document the entire process—including the chosen third-party provider, the data flow, and the security model—in your platform's legal terms and privacy policy. This technical diligence demonstrates the reasonable steps required by regulators and builds essential trust with both investors and issuers on your platform.

TOKEN STANDARDS

Comparison: ERC-1400 vs. ERC-3643 for Compliance

A technical comparison of two leading Ethereum token standards designed for regulated assets, highlighting their architectural approaches and compliance capabilities.

Compliance FeatureERC-1400 (Security Token)ERC-3643 (R-Token)

Primary Standard Type

Extension of ERC-20

Self-contained framework

On-Chain Compliance Logic

Off-Chain Verification Integration

Granular Transfer Restrictions

Partition-based (tranches)

Claim-based (permission keys)

Built-in Identity Framework

Mandatory Document Attestation

Primary Governance Model

Issuer-controlled

Decentralized validator network

Typical Gas Cost for Transfer

~120k gas

~180k gas

generating-audit-trails
COMPLIANCE ENGINEERING

Step 4: Generating Regulatory Audit Trails

This step details how to implement an immutable, on-chain audit trail system that automatically logs all critical compliance events for regulatory reporting and internal oversight.

A regulatory audit trail is a tamper-proof, chronological record of all significant compliance-related events on your platform. In a Web3 context, this means moving beyond traditional database logs to leverage the blockchain's inherent properties of immutability and cryptographic verification. Key events that must be logged include user onboarding (KYC/AML status changes), transaction approvals or denials, changes to compliance rulesets, administrator actions, and any manual overrides of automated systems. Each log entry should be timestamped, linked to a specific user or administrator wallet address, and reference the relevant transaction hash or smart contract call.

The most robust implementation involves emitting structured events from your core smart contracts and off-chain services, then anchoring them on-chain. For example, a ComplianceOracle contract can emit an EventLogged event containing a standardized data structure. A common pattern is to use a Merkle Tree to batch off-chain logs (like detailed KYC documents) and periodically publish the Merkle root to a low-cost chain like Ethereum L2s or a dedicated data availability layer. This provides cryptographic proof that the detailed logs existed at a point in time without storing all data expensively on-chain. The on-chain root acts as a verifiable checkpoint for regulators.

Your system should generate two primary outputs: a human-readable report and a machine-verifiable proof. The report can be exported as a PDF or via an API, summarizing events filtered by date, user, or rule. The proof consists of the transaction hashes and event logs that allow any third party, including a regulator, to independently verify the report's accuracy against the public blockchain. Tools like The Graph for indexing or Etherscan for manual verification are often referenced in this process. Ensure your logging includes failure modes, such as recording why a transaction was blocked by a compliance rule, not just successful actions.

To implement this, start by defining your event schema. Here's a simplified Solidity example for a compliance event logger:

solidity
event ComplianceEventLogged(
    bytes32 indexed eventId,
    address indexed account,
    uint256 timestamp,
    string eventType, // e.g., "KYC_VERIFIED", "TX_SANCTION_BLOCKED"
    bytes32 merkleRoot // Optional root for off-chain data batch
);

function logEvent(address _account, string calldata _eventType, bytes32 _merkleRoot) external onlyComplianceModule {
    bytes32 eventId = keccak256(abi.encodePacked(_account, block.timestamp, _eventType));
    emit ComplianceEventLogged(eventId, _account, block.timestamp, _eventType, _merkleRoot);
}

This contract, when called by a permissioned module, creates an immutable on-chain record.

Finally, integrate this logging into your application's workflow. Every interaction with your compliance engine—whether a rules engine check, a manual review, or a data refresh from a provider like Chainalysis or Elliptic—should result in a corresponding log event. Regular audits of the audit trail itself are crucial. You should periodically verify that all off-chain data referenced by Merkle roots is retrievable and intact. This complete, verifiable history is not just a regulatory requirement; it is a powerful tool for operational transparency, security incident analysis, and demonstrating your platform's commitment to lawful operation in a trust-minimized environment.

handling-jurisdiction-rules
IMPLEMENTATION

Step 5: Dynamic Handling of Jurisdiction-Specific Rules

This section details the technical implementation for applying different compliance rules to users based on their detected jurisdiction.

A compliant platform must enforce different rules for users in different regions. For example, a user in the United States may be restricted from accessing certain tokenized assets or high-yield products that are permissible for a user in Singapore. The core challenge is to apply these rules dynamically and programmatically at the point of user interaction, not just during sign-up. This requires a system that can evaluate a user's eligibility in real-time based on their verified jurisdiction and the specific action they are attempting to perform.

The implementation typically involves a rules engine that sits between the user interface and the core smart contract logic. When a user initiates a transaction—like depositing into a pool or purchasing an asset—the frontend or a backend service calls this engine with two key parameters: the user's on-chain address (or a corresponding user ID) and the action type. The engine then queries a compliance database or an on-chain registry to fetch the user's KYC/AML status and assigned jurisdiction code (e.g., US, GB, SG).

With the user's jurisdiction known, the engine checks a set of predefined rule sets mapped to that jurisdiction. These rules are often stored as structured data (like JSON) and can dictate: allowed/blocked token contracts, maximum transaction amounts, required cooling-off periods, or mandatory disclosures. A smart contract might store rule hashes on-chain for verification, while the detailed logic executes off-chain for gas efficiency. The OpenZeppelin Defender Rules engine is a practical tool for building such automated compliance workflows.

Here is a simplified conceptual example of a rule check performed in a backend service before allowing a swap on a DEX frontend:

javascript
async function checkSwapEligibility(userAddress, tokenIn, tokenOut) {
  // 1. Fetch user jurisdiction from compliance service
  const userProfile = await complianceAPI.getProfile(userAddress);
  const jurisdiction = userProfile.jurisdiction; // e.g., 'US'

  // 2. Load rule set for this jurisdiction
  const rules = jurisdictionRules[jurisdiction];

  // 3. Apply rules
  if (rules.blockedTokens.includes(tokenOut)) {
    throw new Error(`Token ${tokenOut} not available in your region.`);
  }
  if (tokenOut === 'HIGH_YIELD_TOKEN' && jurisdiction === 'US') {
    throw new Error('Product not available to US persons.');
  }
  // If all checks pass, return true to proceed
  return { eligible: true, rules: rules };
}

For on-chain enforcement, consider a pattern where a gatekeeper contract must approve a transaction before it reaches the main protocol. This contract would validate a cryptographic proof (like a signature) from your off-chain rules engine that confirms the user and action are compliant. This separation keeps complex legal logic off-chain while maintaining a verifiable, tamper-resistant record of compliance checks on-chain. The key is to design this system to be upgradable, as regulations change frequently, without requiring migration of the entire core protocol.

Finally, maintain a clear audit trail. Log all jurisdiction checks, rule applications, and blocking events. This data is crucial for demonstrating compliance to regulators during audits. The system should also handle edge cases gracefully, such as users accessing via VPNs (their KYC verification should have captured original jurisdiction) or jurisdictions where your platform does not operate at all, resulting in a complete block from the onboarding stage.

DEVELOPER FAQ

Frequently Asked Questions on Compliant Tokenization

Answers to common technical questions and troubleshooting points for developers building tokenization platforms with integrated regulatory compliance.

In compliant tokenization, a token's status is managed through a dual-state model.

On-chain state is enforced by the smart contract itself, using functions like transferWithAuthorization or modifiers that check a whitelist. This is the immutable, programmatic rule layer.

Off-chain state is the source of truth for regulatory logic, such as KYC/AML status, accreditation checks, or jurisdictional rules. This is typically managed by a secure, permissioned oracle or API. The smart contract queries this oracle before permitting a transaction.

For example, a token contract might store a mapping of allowedToTransfer, but the logic to update that mapping based on investor accreditation resides off-chain. This separation allows compliance rules to be updated without costly smart contract redeployments.

How to Build a Compliant Tokenization Platform with KYC and Transfer Restrictions | ChainScore Guides