> ## Documentation Index
> Fetch the complete documentation index at: https://docs.predicate.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Enroll your Asset

> Once enrolled, Predicate freezes non-compliant addresses automatically — a one-time setup for ongoing compliance.

<Tabs>
  <Tab title="EVM">
    ## Overview

    Automated freeze enforcement requires two capabilities: your asset must expose an interface that can prevent an address from transferring funds, and an authorized party (Predicate) must be able to invoke it. The steps below walk you through adding this interface to your contract/program, granting Predicate the necessary authorization, and enrolling your asset so that enforcement runs automatically.

    ### Prerequisites

    <Card title="IFreezable" icon="lock" href="https://github.com/predicatelabs/predicate-contracts/blob/main/src/interfaces/IFreezable.sol">
      Your asset contract must implement the IFreezable interface.
      This interface provides freeze functionality with role-based access control.
    </Card>

    ### Integration Steps

    <Steps>
      <Step title="Grant Freeze Manager Role">
        Grant Predicate's freeze manager address the FREEZE\_MANAGER\_ROLE. This allows Predicate to enforce compliance actions on your asset contract.

        <Info>
          The Predicate authorized freezer across all EVM chains is `0x363c256D368277BBFaf6EaF65beE123a7AdbA464`
        </Info>

        <CodeGroup>
          ```bash Foundry (cast) theme={null}
          # Grant freeze manager role to Predicate
          cast send <YOUR_ASSET_ADDRESS> \
            "grantRole(bytes32,address)" \
            $(cast keccak "FREEZE_MANAGER_ROLE") \
            0x363c256D368277BBFaf6EaF65beE123a7AdbA464 \
            --rpc-url <RPC_URL> \
            --private-key <PRIVATE_KEY>
          ```

          ```solidity Solidity theme={null}
          // In your contract's initialization or admin function
          _grantRole(FREEZE_MANAGER_ROLE, 0x363c256D368277BBFaf6EaF65beE123a7AdbA464);
          ```
        </CodeGroup>
      </Step>

      <Step title="Enroll in Dashboard">
        Complete enrollment through the Predicate application.

        * Request Access: Contact the Predicate team for an invitation.

        * Add Your Asset: Add a new project to the Predicate Application by supplying your Asset details

        Once enrolled, Predicate will continuously monitor the data sources defined in your policy and enforce actions as addresses are detected. You can return to the dashboard anytime to review enforcement activity.
      </Step>
    </Steps>
  </Tab>

  <Tab title="Stellar">
    ## Overview

    Automated freeze enforcement requires two capabilities: your asset must expose an interface that can prevent an address from transferring funds, and an authorized party (Predicate) must be able to invoke it. The steps below walk you through adding this interface to your contract/program, granting Predicate the necessary authorization, and enrolling your asset so that enforcement runs automatically.

    <Note>OpenZeppelin's Stellar Contracts use the verb **block** rather than freeze. We'll follow that terminology below to stay consistent with the interface.</Note>

    ### Prerequisites

    <Card title="FungibleBlockList" icon="lock" href="https://docs.openzeppelin.com/stellar-contracts/tokens/fungible/fungible">
      Your asset's Soroban contract must implement the `FungibleBlockList` trait from OpenZeppelin's Stellar Contracts.
      This trait provides blocklist functionality with role-based access control.
    </Card>

    ### Integration Steps

    <Steps>
      <Step title="Grant Blocker Role">
        Grant Predicate's Stellar account the blocker role on your asset contract. This allows Predicate to enforce compliance actions by blocking and unblocking addresses.

        <Info>
          The Predicate authorized account on Stellar is `GCDJXKIZODN7SISUQYLIP2PDIRAGASCGV7P62ABEJE7M7ISAZVHD6SFL`
        </Info>

        When deploying your contract, pass Predicate's address as the `blocker` parameter in your constructor, or grant the role via your contract's access control functions:

        ```rust theme={null}
        // During contract initialization
        access_control::grant_role_no_auth(
            e,
            &predicate_address,
            &symbol_short!("blocker"),
            &admin,
        );
        ```
      </Step>

      <Step title="Enroll in Dashboard">
        Complete enrollment through the Predicate application.

        * Request Access: Contact the Predicate team for an invitation.

        * Add Your Asset: Add a new project to the Predicate Application by supplying your Stellar asset details

        Once enrolled, Predicate will continuously monitor the data sources defined in your policy and enforce actions as addresses are detected. You can return to the dashboard anytime to review enforcement activity.
      </Step>
    </Steps>
  </Tab>
</Tabs>
