# Check an Asset Against Its Contract

Read the contract of one of your EVM token assets on its chain again, and keep what it found on the asset: matched, or what differs.

## Overview

- **The reading**, as a registration's: through Aurea's own node of the asset's chain, the code at its address, then `decimals()`, `symbol()` and `name()`, each within 5 seconds.
- **`result`**, decided in this order: `not_a_contract` (no code at the address), `not_erc20` (no ERC-20 `decimals()`, or one above 36), `decimals_differ` (the contract's decimals are not the asset's), `symbol_differs` (the decimals agree, the symbol does not — letter case aside), else `matched` — a contract that answers no readable symbol included. A symbol of your own, sent when you registered the asset, answers `symbol_differs` whenever it is not the contract's.
- **Kept on the asset** as `contractCheck` (`result`, `checkedAt`); nothing else of it changes, not even `updatedAt`. **The asset is not corrected**: change its decimals with the token routes ([Update Token](https://docs.aureahub.com/docs/admin-tokens-update.md)), then check it again.
- `200` with the asset, the `result`, and the reading itself as `contract`: `address` (EIP-55), `hasCode`, `decimals`, `symbol`, `name` — each `null` where the contract answered nothing readable.
- Any EVM token of your tenant's own, registered here or not, active or not. A native coin: `400` `ASSET_NATIVE`. A Solana asset: `400` `ASSET_CHAIN_UNSUPPORTED`. A catalogue asset, another tenant's, or an id that names none: `404` `ASSET_NOT_FOUND`. The node failing, slow, or missing: `503` `ASSET_CONTRACT_UNREAD` (`details.retryable` `true`), and nothing is kept.
- Send no body. For `owner`, `tenantadmin`, `non_signing_admin` and `editor`, on their own tenant, with their access token. Written to your audit trail [Coming soon, upon request](https://docs.aureahub.com/docs/feature-availability.md), as `asset.checked`.

## Endpoint

### `POST /v1/assets/{assetId}/check`

Authentication: bearer token required.

Reads the asset's contract on its chain again and keeps the result on the asset.

**Path parameters**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `assetId` | string (uuid) | yes | The asset's id |

**Responses**

`200` Matched

```json
{
  "asset": {
    "assetId": "7e5df737-88f9-4c90-8fc8-0f70429c2d17",
    "assetKey": "evm:8453:0xdbfbe194c514a645bb0fcb5230adaf85efea3fe7",
    "policyAsset": "base:0xdbfbe194c514a645bb0fcb5230adaf85efea3fe7",
    "family": "evm",
    "chain": "base",
    "chainId": 8453,
    "isTestnet": false,
    "type": "token",
    "address": "0xdBfbe194c514a645Bb0FCb5230aDaF85EFea3fe7",
    "symbol": "GBND31",
    "name": "Green Bond 2031",
    "decimals": 6,
    "logoUri": "https://cdn.example.com/tokens/gbnd31.png",
    "coingeckoId": null,
    "isActive": true,
    "source": "tenant",
    "registeredVia": "registry",
    "metadata": {
      "desk": "treasury",
      "isin": "XS2964021187"
    },
    "contractCheck": {
      "result": "matched",
      "checkedAt": "2026-10-14T11:02:09.874Z"
    },
    "createdAt": "2026-10-14T09:12:40.517Z",
    "updatedAt": "2026-10-14T09:12:40.517Z"
  },
  "result": "matched",
  "contract": {
    "address": "0xdBfbe194c514a645Bb0FCb5230aDaF85EFea3fe7",
    "hasCode": true,
    "decimals": 6,
    "symbol": "GBND31",
    "name": "Green Bond 2031"
  }
}
```

`200` Decimals differ

```json
{
  "asset": {
    "assetId": "537d28ed-38f3-4e60-ae96-ef4d3d302eb9",
    "assetKey": "evm:1:0x335750ce8ae4478cccbc82651f6f62498c5d452c",
    "policyAsset": "ethereum:0x335750ce8ae4478cccbc82651f6f62498c5d452c",
    "family": "evm",
    "chain": "ethereum",
    "chainId": 1,
    "isTestnet": false,
    "type": "token",
    "address": "0x335750CE8Ae4478cCcbC82651F6f62498c5D452C",
    "symbol": "GOLDX",
    "name": "Gold Token",
    "decimals": 18,
    "logoUri": null,
    "coingeckoId": null,
    "isActive": true,
    "source": "tenant",
    "registeredVia": null,
    "metadata": null,
    "contractCheck": {
      "result": "decimals_differ",
      "checkedAt": "2026-10-14T10:55:21.316Z"
    },
    "createdAt": "2026-10-02T14:08:51.902Z",
    "updatedAt": "2026-10-02T14:08:51.902Z"
  },
  "result": "decimals_differ",
  "contract": {
    "address": "0x335750CE8Ae4478cCcbC82651F6f62498c5D452C",
    "hasCode": true,
    "decimals": 6,
    "symbol": "GOLDX",
    "name": "Gold Token"
  }
}
```

`400` Native coin

```json
{
  "statusCode": 400,
  "error": "BadRequestError",
  "message": "A native coin has no contract to read",
  "details": { "code": "ASSET_NATIVE" }
}
```

`404` Not found

```json
{
  "statusCode": 404,
  "error": "NotFoundError",
  "message": "No such asset here.",
  "details": { "code": "ASSET_NOT_FOUND" }
}
```

`503` Node

```json
{
  "statusCode": 503,
  "error": "ServiceUnavailableError",
  "message": "The token contract cannot be read: the node for chain 8453 did not answer",
  "details": { "code": "ASSET_CONTRACT_UNREAD", "chainId": 8453, "retryable": true }
}
```

**Example request**

```bash
curl -X POST https://api.aureahub.com/v1/assets/537d28ed-38f3-4e60-ae96-ef4d3d302eb9/check \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
```

---

Web version: https://docs.aureahub.com/#asset-check
