> For the complete documentation index, see [llms.txt](https://docs.dimes.fi/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.dimes.fi/for-developers/wallet-integration/contract-addresses.md).

# Contract Addresses

Multiply's on-chain surface is a single vault contract per environment. All user funds flow through the vault — pUSD in, position tokens in, pUSD out. Verify these on [Polygonscan](https://polygonscan.com) before allowlisting them. The vault address is also on every quote response (`polygon_vault_contract_address`) and from `GET /prediction-markets/contract-info`.

***

## Production

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

| Contract           | Address                                                                                                                    | Purpose                                |
| ------------------ | -------------------------------------------------------------------------------------------------------------------------- | -------------------------------------- |
| **Vault**          | [`0xECF933ccDf7ebc6a0658c77E070cFe51ebe5328A`](https://polygonscan.com/address/0xECF933ccDf7ebc6a0658c77E070cFe51ebe5328A) | `LeveragedPredictionVaultV1`           |
| **pUSD**           | [`0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB`](https://polygonscan.com/address/0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB) | Polymarket USD (pUSD)                  |
| **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 pUSD against. It never holds user funds for longer than it takes to execute an open/close against Polymarket, and it cannot move your pUSD for any purpose other than the position you authorize via signed quote parameters.

***

## Sandbox

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

| Contract      | Address                                                                                                                    | Purpose                          |
| ------------- | -------------------------------------------------------------------------------------------------------------------------- | -------------------------------- |
| **Vault**     | [`0xefF55c64B8E971eEbBbbc2037593588e0F271dE2`](https://polygonscan.com/address/0xefF55c64B8E971eEbBbbc2037593588e0F271dE2) | `LeveragedPredictionVaultV1`     |
| **Test pUSD** | [`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-and-events/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.polygonUsdcTokenAddress);
```

{% endtab %}

{% tab title="React" %}

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

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

{% 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.
