# Contract Addresses

Multiply's on-chain surface is a single vault contract per environment. All user funds flow through the vault — USDC in, position tokens in, USDC out. These addresses are published here so you can verify them on [Polygonscan](https://polygonscan.com) before your frontend or backend approves any token spend against them.

> **How to use this page.** Verify each address on Polygonscan before you ship, then hardcode them into the allowlist your client checks at runtime. The vault address also comes back on every quote response as `polygon_vault_contract_address` and from `GET /prediction-markets/contract-info` if you prefer to fetch it dynamically.

***

## Production

Real USDC. Real Polymarket CTF (Conditional Token Framework). Live positions.

| Contract           | Address                                                                                                                    | Purpose                                    |
| ------------------ | -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ |
| **Vault**          | [`0xECF933ccDf7ebc6a0658c77E070cFe51ebe5328A`](https://polygonscan.com/address/0xECF933ccDf7ebc6a0658c77E070cFe51ebe5328A) | `LeveragedPredictionVaultV1`               |
| **USDC**           | [`0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174`](https://polygonscan.com/address/0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174) | Bridged USDC.e (the token Polymarket uses) |
| **Polymarket CTF** | [`0x4D97DCd97eC945f40cF65F87097ACe5EA0476045`](https://polygonscan.com/address/0x4D97DCd97eC945f40cF65F87097ACe5EA0476045) | Polymarket Conditional Token Framework     |

**Chain:** Polygon mainnet (EVM chain ID `137`).

The vault is the **only** contract you approve USDC against. It never holds user funds for longer than it takes to execute an open/close against Polymarket, and it cannot move your USDC for any purpose other than the position you authorize via signed quote parameters.

***

## Sandbox

Fake USDC. Fake Polymarket CTF. No real funds at risk. See [Sandbox](/for-developers/sandbox.md) for how to get access.

| Contract      | Address                                                                                                                    | Purpose                          |
| ------------- | -------------------------------------------------------------------------------------------------------------------------- | -------------------------------- |
| **Vault**     | [`0xefF55c64B8E971eEbBbbc2037593588e0F271dE2`](https://polygonscan.com/address/0xefF55c64B8E971eEbBbbc2037593588e0F271dE2) | `LeveragedPredictionVaultV1`     |
| **Fake USDC** | [`0xD477EDbe627E94639d7E92119Ca62a461c6ce555`](https://polygonscan.com/address/0xD477EDbe627E94639d7E92119Ca62a461c6ce555) | Minted to your wallet on request |
| **Fake CTF**  | [`0x8B859B4459A75b50e07D345F6b1998F27540F758`](https://polygonscan.com/address/0x8B859B4459A75b50e07D345F6b1998F27540F758) | Fake Conditional Token Framework |

**Chain:** Polygon mainnet (EVM chain ID `137`).

The sandbox vault runs the same `LeveragedPredictionVaultV1` contract as production — same ABI, same signature scheme, same position lifecycle. The only differences are the addresses and that the tokens it pulls and settles against are worthless outside the sandbox.

***

## Verifying a quote signature

Every quote returned by `POST /prediction-markets/quotes` is signed by a server-side authority key. Before you submit the quote on-chain, recover the signer from the signature and compare it to the authority address in `GET /prediction-markets/contract-info`. Any quote where the recovered signer does not match must be rejected — it has been tampered with in transit.

See [API Reference — Verifying a quote signature](/for-developers/api-reference.md#verifying-a-quote-signature) for the exact message hash layout and a working ethers.js example.

***

### Dynamic lookup

{% tabs %}
{% tab title="REST API" %}

```bash
curl https://api.dimes.fi/v1/prediction-markets/contract-info \
  -H "Authorization: Bearer <jwt>"
```

{% endtab %}

{% tab title="SDK" %}

```typescript
const info = await client.getContractInfo();
console.log(info.polygonVaultContractAddress, info.polygonUsdcContractAddress);
```

{% endtab %}

{% tab title="React" %}

```tsx
import { useContractInfo } from "@dimes-dot-fi/sdk/react";

function ContractInfo() {
  const { data: info } = useContractInfo();
  // info.polygonVaultContractAddress, info.polygonUsdcContractAddress
}
```

{% endtab %}
{% endtabs %}

***

## Getting help

Find us on the Telegram link at [dimes.fi](https://dimes.fi) if you spot an address discrepancy, need the current sandbox contracts, or want us to sign off on your contract allowlist before you ship.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.dimes.fi/for-developers/contract-addresses.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
