# Deposit into a Prize Pool

Let's deposit into a Prize Pool.  Each step of the way we'll show you how to do it in both Solidity and Javascript (using [Ethers.js](https://docs.ethers.io)).

First, we'll need to identify what the underlying asset to be deposited is.  If it's a Compound Prize Pool, we'll want to check which cToken it is.

Let's assume we have a Compound Prize Pool that is built against cDai.

## Approve

Let's approve the Prize Pool to spend 1 of our Dai:

**Solidity**

```
DAI_ERC20.approve(CDAI_PRIZE_POOL, 1 ether);
```

**JavaScript**

```javascript
const ethers = require('ethers')
const signer = ethers.Wallet.createRandom()

const dai = new ethers.Contract(
    DAI_ADDRESS,
    ERC20_ABI,
    signer
)

const daiPrizePool = new ethers.Contract(
    DAI_PRIZE_POOL_ADDRESS,
    PRIZE_POOL_ABI,
    signer
)

await dai.approve(daiPrizePool.address, ethers.utils.parseEther('1'))

```

## Deposit

Now let's deposit into the Prize Pool.  Since we're depositing into a [Compound Prize Pool](/v3.0.1/protocol/prize-pool/compound-prize-pool.md) that uses a [Single Random Winner](/v3.0.1/protocol/prize-strategy/single-random-winner.md) strategy, we'll want to mint Tickets so that we're eligible for prizes.

We can retrieve the Ticket [controlled token](/v3.0.1/protocol/prize-pool.md#controlled-tokens) address from the Single Random Winner prize strategy:

**Solidity**

```javascript
address ticketAddress = SINGLE_RANDOM_WINNER.ticket();
```

**JavaScript**

```javascript
const strategyAddress = await daiPrizePool.prizeStrategy()

const singleRandomWinner = new ethers.Contract(
    strategyAddress,
    SINGLE_RANDOM_WINNER_ABI,
    signer
)

const ticketAddress = await singleRandomWinner.ticket()
```

Now let's deposit to mint tickets for ourselves:

**Solidity**

```javascript
CDAI_PRIZE_POOL.depositTo(
    MY_ADDRESS,
    1 ether,
    ticketAddress,
    address(0)
);    
```

**JavaScript**

```javascript
await daiPrizePool.depositTo(
    signer._address,
    ethers.utils.parseEther(1),
    ticketAddress,
    ethers.constants.AddressZero
)
```

## Depositing Sponsorship

If you wish to deposit and receive sponsorship, or any other controlled token, you simply need to pass it in as the `controlledToken` argument.

## Depositing for Someone Else

If you'd like to deposit on someone else's behalf, you can simply change the `to` address in the call to whomever you want to receive the tickets.  Note that the caller will not be able to withdraw the funds; those funds can only be withdrawn by the recipient unless they increase your allowance.

## Capturing Referral Rewards

The last parameter to the depositTo function is the referral address.  The protocol may drip referral awards globally to Prize Pools.  Referrals can earn tokens based on the fraction of referral volume they supply.

Any interface for a PrizePool will want to pass it's own address as the referrer so that it can capture sweet, sweet rewards.

For more information see [Rewards](/v3.0.1/governance/untitled.md)


---

# 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://v3.docs.pooltogether.com/v3.0.1/tutorials/buying-tickets.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.
