> For the complete documentation index, see [llms.txt](https://docs.reaper.farm/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.reaper.farm/sdk/reaper-sdk/test-tokens.md).

# Test Tokens

### Creating a Test Token

Test tokens are regular ERC20s with a public function that allows the owner to mint them at will.

`reaper.deployTestToken(name: string, symbol: string) => (address:string)`

Example of a Test Token deployment utilizing the BigGas constant to ensure execution:

```javascript
const testToken = await reaper.deployTestToken("Reaper Test Token", "RTT", reaper.BigGas);
console.log("Test Token Address: " +testToken);

> Test Token Address: 0xB19b478543D828131edCdCe33891d09C80e09341
```

{% hint style="info" %}
&#x20;Single-owner mint functions are not recommended for production, as they are highly centralized and generally insecure.
{% endhint %}

### Viewing Your Token's Metadata

Return an object which contains all relevant metadata for your test token or any other ERC20.

`reaper.getTokenMetadata(tokenAddress: string) =>` \
`({`\
&#x20; `name:string,`\
&#x20; `symbol:string,`\
&#x20; `decimals: uint,`\
&#x20; `totalSupply: uint,`\
&#x20; `owner: string`\
`})`

Fetching metadata for the above test token deployment:

```javascript
const metadata = await reaper.getTokenMetadata(testToken);
console.log("Token Name: " +metadata.name);
console.log("Token Supply: " +metadata.totalSupply);

> Token Name: Reaper Test Token
> Token Supply: 0
```

### Minting Test Tokens

ReaperSDK's built-in test token allows the owner to mint infinitely to any address.

`reaper.mintTestToken(tokenAddress: string, userAddress: string, amount: uint) =>`\
`(userBalance:BigNumber)`

Minting to multiple addresses with Reaper's parseToken function and viewing their updated balances:

```javascript
const user1 = "0x8B4441E79151e3fC5264733A3C5da4fF8EAc16c1";
const user2 = "0x66e17197A8e0BE5D3161337Bf881c2364d0c56E8";

let user1Balance = await reaper.mintTestToken(testToken, user1, await reaper.parseToken(100, testToken));
let user2Balance = await reaper.mintTestToken(testToken, user2, await reaper.parseToken(10000, testToken));
console.log("User 1 Balance: " +user1Balance);
console.log("User 2 Balance: " +user2Balance);
  
> User 1 Balance: 100
> User 2 Balance: 10000
```

### Viewing a User's Token Balances

Check any user's Fantom or ERC20 balance with simple inputs.

`reaper.getUserBalance(userAddress:string, [tokenAddress:string]) =>`\
`(userBalance:BigNumber)`

```javascript
  const user1 = "0x8B4441E79151e3fC5264733A3C5da4fF8EAc16c1";

  await reaper.mintTestToken(testToken, user1, await reaper.Ether(450, testToken));

  let fantomBalance = await reaper.getUserBalance(user1);
  let tokenBalance = await reaper.getUserBalance(user1, testToken);
  
  console.log("User One Fantom Balance: " +fantomBalance);
  console.log("User Two Test Token Balance: " +tokenBalance);
  
  > User One Fantom Balance: 102.85817804062937
  > User Two Test Token Balance: 450
```

### Approving Tokens

We took the thinking out of approvals with a simple maximum approval for any token input array. The second input can be a single address or an array of addresses - single addresses will be formatted into an array of length 1.

`reaper.approveMax(spenderAddress:string, tokenAddresses:string[ ]) => "success"`

{% hint style="info" %}
Only use maximum approvals for contracts you trust.
{% endhint %}
