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

# Developer workflows

> End-to-end IXO MultiClient SDK patterns: query client, signing client, entities, claims, and oracle-assisted evaluation.

These workflows show the canonical message patterns from the [`@ixo/impactxclient-sdk` README](https://github.com/ixofoundation/ixo-multiclient-sdk#readme). For full type definitions, see [`@ixo/impactxclient-sdk`](https://www.npmjs.com/package/@ixo/impactxclient-sdk) and the [proto definitions](https://github.com/ixofoundation/ixo-blockchain/tree/main/proto/ixo).

<Info>
  There is **no single blessed CLI** for every IXO operation. Prefer the SDK, Cosmos-compatible wallets, or deployment-specific CLIs your operator documents. For HTTP-oriented domain examples, see [Domain registration](/guides/domain-registration).
</Info>

## Prerequisites

1. Install dependencies: `@ixo/impactxclient-sdk`. For Agentic Oracle integration, see [Agentic Oracles ADK](/sdk-reference/oracle-adk).
2. Choose **RPC endpoint** and **chain ID** from [Networks and endpoints](/reference/networks-and-endpoints).
3. Choose **auth** for each surface from [Authentication matrix](/reference/authentication-matrix). On-chain writes require a funded signer (wallet or key management you control).

```bash theme={"system"}
npm install @ixo/impactxclient-sdk
```

## 1. Initialize query and signing clients

Reads use `createQueryClient`. Writes need a signer-backed `createSigningClient`. Both target the same RPC endpoint.

```typescript theme={"system"}
import {
  ixo,
  createQueryClient,
  createSigningClient,
} from "@ixo/impactxclient-sdk";

const RPC_ENDPOINT = "https://rpc.ixo.world";

const queryClient = await createQueryClient(RPC_ENDPOINT);
const signingClient = await createSigningClient(RPC_ENDPOINT, offlineSigner);
```

**Errors:** RPC misconfiguration surfaces as connection timeouts or JSON-RPC errors. Try a different node if your operator allows; confirm TLS and `chainId` against the network row in [Networks and endpoints](/reference/networks-and-endpoints).

For signer setup (Cosmos-kit, Keplr, or `getOfflineSigner` from `cosmjs-utils`), see [SDK README — Creating signers](https://github.com/ixofoundation/ixo-multiclient-sdk#creating-signers).

## 2. Register an entity (digital twin)

Compose `MsgCreateEntity`, sign and broadcast.

```typescript theme={"system"}
const createEntityMsg = {
  typeUrl: "/ixo.entity.v1beta1.MsgCreateEntity",
  value: ixo.entity.v1beta1.MsgCreateEntity.fromPartial({
    ownerAddress: signerAddress,
    entityType: "asset",
    context: [
      ixo.iid.v1beta1.Context.fromPartial({
        key: "class",
        val: "did:ixo:entity:protocol123",
      }),
    ],
    verification: [],
    controller: [],
    service: [],
    linkedResource: [],
    accordedRight: [],
    linkedEntity: [],
    linkedClaim: [],
  }),
};

const response = await signingClient.signAndBroadcast(
  signerAddress,
  [createEntityMsg],
  "auto",
);
```

Read the resulting entity through the query client:

```typescript theme={"system"}
const entities = await queryClient.ixo.entity.v1beta1.entityList();
```

**Errors:** invalid `entityType` or context key/value pairs that the chain does not accept return failed transactions. Inspect `code` and `rawLog` on the broadcast response.

## 3. Submit a claim

```typescript theme={"system"}
const submitClaimMsg = {
  typeUrl: "/ixo.claims.v1beta1.MsgSubmitClaim",
  value: ixo.claims.v1beta1.MsgSubmitClaim.fromPartial({
    creator: signerAddress,
    claimId: "bafkreih...",
    collectionId: "12",
    adminAddress: collectionAdminAddress,
  }),
};

await signingClient.signAndBroadcast(signerAddress, [submitClaimMsg], "auto");
```

**Errors:** missing `collectionId`, schema mismatch, or insufficient authorization produce chain errors. Cross-check [Claims management](/guides/dev/ixo-claims) and [Custom authorisations for IXO Claims](/guides/dev/authz-custom).

## 4. Evaluate a claim (oracle-assisted)

An Agentic Oracle returns a determination off-chain; the on-chain record is written by `MsgEvaluateClaim`. The example below assumes an Agentic Oracle service exposes a verify endpoint your code calls — see [Agentic Oracles ADK](/sdk-reference/oracle-adk) for the canonical SDK home and [Build agentic oracles](/guides/ixo-oracles-architecture) for the architecture.

```typescript theme={"system"}
const verification = await callOracleVerify({
  oracleEndpoint: "https://oracle.example",
  claimId: "bafkreih...",
});

const evaluateMsg = {
  typeUrl: "/ixo.claims.v1beta1.MsgEvaluateClaim",
  value: ixo.claims.v1beta1.MsgEvaluateClaim.fromPartial({
    creator: signerAddress,
    claimId: "bafkreih...",
    collectionId: "12",
    oracle: oracleAddress,
    adminAddress: collectionAdminAddress,
    status: 1,
    reason: 0,
    verificationProof: verification.proofCid,
    amount: [],
  }),
};

await signingClient.signAndBroadcast(signerAddress, [evaluateMsg], "auto");
```

<Note>
  `callOracleVerify` is a placeholder for whatever HTTP, MCP, or SDK call your Agentic Oracle exposes. The on-chain side is what `@ixo/impactxclient-sdk` covers — the off-chain agent service is your application code.
</Note>

**Errors:** oracle `401`/`403` typically means wrong operator credential or DID. Chain-side `MsgEvaluateClaim` failures usually point to authorization (no `EvaluateClaimAuthorization`) or claim state.

## 5. Issue tokens against an evaluated claim

After approval, mint tokens with `MsgMintToken` against your token contract — see [Manage tokens](/guides/dev/tokens) for the full message family.

```typescript theme={"system"}
const mintMsg = {
  typeUrl: "/ixo.token.v1beta1.MsgMintToken",
  value: ixo.token.v1beta1.MsgMintToken.fromPartial({
    minter: signerAddress,
    contractAddress: tokenContractAddress,
    owner: recipientAddress,
    mintBatch: [
      ixo.token.v1beta1.MintBatch.fromPartial({
        name: "CARBON",
        index: "bafkreih...",
        amount: "3600",
        collection: "did:ixo:entity:collection456",
        tokenData: [],
      }),
    ],
  }),
};

await signingClient.signAndBroadcast(signerAddress, [mintMsg], "auto");
```

## 6. Verifiable credentials

Credential issuance and verification are governed by your program's issuer keys, schemas, and registry or IXO Matrix storage — see [Credential issuance](/platforms/Emerging/credential-issuance) and [Identity and credentials](/articles/identity-and-credentials). Implement issuance in the component that holds the issuer key; verifiers should check signature, issuer DID, schema, and revocation/status lists. For HTTP-oriented credential flows on Emerging, see [Emerging API](/platforms/Emerging/emerging-api) and the matching auth rules in [Authentication matrix](/reference/authentication-matrix).

## Error handling

* **HTTP service calls:** use [Error handling](/api-reference/errors) for status codes; add retry/backoff for `429` and transient `5xx`.
* **GraphQL (Blocksync):** partial errors may appear in a top-level `errors` array while `data` is non-null — always check both. Unauthenticated introspection may be disabled on some deployments.
* **DID resolution:** if resolution fails, confirm the DID is registered on the expected network and that you query the correct registry or indexer endpoint.

## Next steps

<CardGroup cols={2}>
  <Card title="IXO MultiClient SDK" icon="server" href="/sdk-reference/multiclient-sdk">
    Module-level features on protocol.
  </Card>

  <Card title="SDK and kit overview" icon="toolbox" href="/sdk-reference/index">
    Canonical SDK overview and route selection.
  </Card>

  <Card title="Implementation examples" icon="lightbulb" href="/guides/dev/examples">
    Worked end-to-end flows.
  </Card>

  <Card title="Agentic Oracles ADK" icon="brain" href="/sdk-reference/oracle-adk">
    Build the off-chain side of evaluation.
  </Card>
</CardGroup>
