# Error codes

We have adopted a system of error codes at GYSR to save gas costs on long revert messages.

<table><thead><tr><th width="150">Code</th><th width="347.73520625126906">Contract</th><th>Description</th></tr></thead><tbody><tr><td>p1</td><td>Pool</td><td>withdraw amount is zero</td></tr><tr><td>p2</td><td>Pool</td><td>withdraw amount exceeds vested balance</td></tr><tr><td></td><td></td><td></td></tr><tr><td>f1</td><td>PoolFactory</td><td>invalid staking module factory</td></tr><tr><td>f2</td><td>PoolFactory</td><td>invalid reward module factory</td></tr><tr><td>f3</td><td>PoolFactory</td><td>fee exceeds max</td></tr><tr><td>f4</td><td>PoolFactory</td><td>invalid whitelist type</td></tr><tr><td>f5</td><td>PoolFactory</td><td>module factory is zero address</td></tr><tr><td></td><td></td><td></td></tr><tr><td>oc1</td><td>OwnerController</td><td>sender is not owner</td></tr><tr><td>oc2</td><td>OwnerController</td><td>sender is not controller</td></tr><tr><td>oc3</td><td>OwnerController</td><td>new owner is zero address</td></tr><tr><td>oc4</td><td>OwnerController</td><td>new controller is zero address</td></tr><tr><td></td><td></td><td></td></tr><tr><td>sm1</td><td>ERC20StakingModule</td><td>stake amount is zero</td></tr><tr><td>sm2</td><td>ERC20StakingModule</td><td>stake amount is too small</td></tr><tr><td>sm3</td><td>ERC20StakingModule</td><td>unstake or claim amount is zero</td></tr><tr><td>sm4</td><td>ERC20StakingModule</td><td>staking module has zero balance</td></tr><tr><td>sm5</td><td>ERC20StakingModule</td><td>unstake or claim amount is too small</td></tr><tr><td>sm6</td><td>ERC20StakingModule</td><td>unstake or claim amount exceeds user balance</td></tr><tr><td>sm7</td><td>ERC20StakingModule</td><td>invalid bytes data for account address</td></tr><tr><td>sm8</td><td>ERC20StakingModule</td><td>staking operator is not approved</td></tr><tr><td></td><td></td><td></td></tr><tr><td>smf1</td><td>ERC20StakingModuleFactory</td><td>invalid constructor data</td></tr><tr><td></td><td></td><td></td></tr><tr><td>smn1</td><td>ERC721StakingModule</td><td>token does not support ERC721 interface</td></tr><tr><td>smn2</td><td>ERC721StakingModule</td><td>stake amount is zero</td></tr><tr><td>smn3</td><td>ERC721StakingModule</td><td>stake amount exceeds user balance</td></tr><tr><td>smn4</td><td>ERC721StakingModule</td><td>stake token ID data is invalid</td></tr><tr><td>smn5</td><td>ERC721StakingModule</td><td>unstake amount is zero</td></tr><tr><td>smn6</td><td>ERC721StakingModule</td><td>unstake amount exceeds user balance</td></tr><tr><td>smn7</td><td>ERC721StakingModule</td><td>unstake token ID data is invalid</td></tr><tr><td>smn8</td><td>ERC721StakingModule</td><td>user does not own the specified token</td></tr><tr><td>smn9</td><td>ERC721StakingModule</td><td>claim amount is zero</td></tr><tr><td>smn10</td><td>ERC721StakingModule</td><td>claim amount exceeds user balance</td></tr><tr><td></td><td></td><td></td></tr><tr><td>smnf1</td><td>ERC721StakingModuleFactory</td><td>invalid constructor data</td></tr><tr><td></td><td></td><td></td></tr><tr><td>rm1</td><td>ERC20BaseRewardModule</td><td>reward funding amount is zero</td></tr><tr><td>rm2</td><td>ERC20BaseRewardModule</td><td>funding start is in the past</td></tr><tr><td>rm3</td><td>ERC20BaseRewardModule</td><td>exceeds max active funding schedules</td></tr><tr><td></td><td></td><td></td></tr><tr><td>crm1</td><td>ERC20CompetitiveRewardModule</td><td>initial time bonus is greater than max</td></tr><tr><td>crm2</td><td>ERC20CompetitiveRewardModule</td><td>unstake, invalid gysr bonus data</td></tr><tr><td>crm3</td><td>ERC20CompetitiveRewardModule</td><td>unstake in same block, no time has elapsed</td></tr><tr><td></td><td></td><td></td></tr><tr><td>crmf1</td><td>ERC20CompetitiveRewardModuleFactory</td><td>invalid constructor data</td></tr><tr><td></td><td></td><td></td></tr><tr><td>frm1</td><td>ERC20FriendlyRewardModule</td><td>vesting start is greater than 1.0</td></tr><tr><td>frm2</td><td>ERC20FriendlyRewardModule</td><td>stake, invalid gysr bonus data</td></tr><tr><td>frm3</td><td>ERC20FriendlyRewardModule</td><td>unstake in same block, no time has elapsed</td></tr><tr><td></td><td></td><td></td></tr><tr><td>frmf1</td><td>ERC20FriendlyRewardModuleFactory</td><td>invalid constructor data</td></tr><tr><td></td><td></td><td></td></tr><tr><td>asm1</td><td>AssignmentStakingModule</td><td>stake amount is zero</td></tr><tr><td>asm2</td><td>AssignmentStakingModule</td><td>sender is not the controller</td></tr><tr><td>asm3</td><td>AssignmentStakingModule</td><td>invalid byte encoding for assignee address</td></tr><tr><td>asm4</td><td>AssignmentStakingModule</td><td>unstake amount is zero</td></tr><tr><td>asm5</td><td>AssignmentStakingModule</td><td>sender is not the controller</td></tr><tr><td>asm6</td><td>AssignmentStakingModule</td><td>invalid byte encoding for assignee address</td></tr><tr><td>asm7</td><td>AssignmentStakingModule</td><td>unstake amount exceeds current assignee rate</td></tr><tr><td>asm8</td><td>AssignmentStakingModule</td><td>claim amount is zero</td></tr><tr><td>asm9</td><td>AssignmentStakingModule</td><td>claim amount exceeds current assignee rate</td></tr><tr><td></td><td></td><td></td></tr><tr><td>bsm1</td><td>ERC20BondStakingModule</td><td>vesting period below minimum threshold</td></tr><tr><td>bsm2</td><td>ERC20BondStakingModule</td><td>stake amount is zero</td></tr><tr><td>bsm3</td><td>ERC20BondStakingModule</td><td>invalid byte encoding for stake params</td></tr><tr><td>bsm4</td><td>ERC20BondStakingModule</td><td>token market is not open</td></tr><tr><td>bsm5</td><td>ERC20BondStakingModule</td><td>debt exceeds market max for individual bond</td></tr><tr><td>bsm6</td><td>ERC20BondStakingModule</td><td>debt exceeds remaining market capacity</td></tr><tr><td>bsm7</td><td>ERC20BondStakingModule</td><td>bond debt is below user minimum threshold </td></tr><tr><td>bsm8</td><td>ERC20BondStakingModule</td><td>invalid byte encoding for unstake bond ID</td></tr><tr><td>bsm9</td><td>ERC20BondStakingModule</td><td>unstake sender does not own specified bond</td></tr><tr><td>bsm10</td><td>ERC20BondStakingModule</td><td>unstake in same block, time has not elapsed</td></tr><tr><td>bsm11</td><td>ERC20BondStakingModule</td><td>unstake amount must be zero when burndown is disabled</td></tr><tr><td>bsm12</td><td>ERC20BondStakingModule</td><td>vesting period has elapsed, no principal left to unstake</td></tr><tr><td>bsm13</td><td>ERC20BondStakingModule</td><td>unstake amount exceeds remaining principal</td></tr><tr><td>bsm14</td><td>ERC20BondStakingModule</td><td>unstake amount is too small</td></tr><tr><td>bsm15</td><td>ERC20BondStakingModule</td><td>invalid byte encoding for claim bond ID</td></tr><tr><td>bsm16</td><td>ERC20BondStakingModule</td><td>claim sender does not own specified bond</td></tr><tr><td>bsm17</td><td>ERC20BondStakingModule</td><td>invalid byte encoding for update bond ID</td></tr><tr><td>bsm18</td><td>ERC20BondStakingModule</td><td>update sender does not own specified bond</td></tr><tr><td>bsm19</td><td>ERC20BondStakingModule</td><td>market has already been opened</td></tr><tr><td>bsm20</td><td>ERC20BondStakingModule</td><td>max number of markets has been reached</td></tr><tr><td>bsm21</td><td>ERC20BondStakingModule</td><td>open market, minimum price is zero</td></tr><tr><td>bsm22</td><td>ERC20BondStakingModule</td><td>open market, max bond size is zero </td></tr><tr><td>bsm23</td><td>ERC20BondStakingModule</td><td>open market, total debt capacity is zero</td></tr><tr><td>bsm24</td><td>ERC20BondStakingModule</td><td>close market, capacity is already zero</td></tr><tr><td>bsm25</td><td>ERC20BondStakingModule</td><td>adjusted market does not exist</td></tr><tr><td>bsm26</td><td>ERC20BondStakingModule</td><td>adjust market, minimum price is zero</td></tr><tr><td>bsm27</td><td>ERC20BondStakingModule</td><td>adjust market, max bond size is zero</td></tr><tr><td>bsm28</td><td>ERC20BondStakingModule</td><td>adjust market, total debt capacity is zero</td></tr><tr><td>bsm29</td><td>ERC20BondStakingModule</td><td>withdraw from market that does not exist</td></tr><tr><td>bsm30</td><td>ERC20BondStakingModule</td><td>withdraw amount is zero</td></tr><tr><td>bsm31</td><td>ERC20BondStakingModule</td><td>withdraw amount exceeds vested principal</td></tr><tr><td></td><td></td><td></td></tr><tr><td>xrm1</td><td>ERC20FixedRewardModule</td><td>time period is zero</td></tr><tr><td>xrm2</td><td>ERC20FixedRewardModule</td><td>constant reward rate is zero</td></tr><tr><td>xrm3</td><td>ERC20FixedRewardModule</td><td>stake amount exceeds rewards capacity</td></tr><tr><td>xrm4</td><td>ERC20FixedRewardModule</td><td>current stake has not fully vested</td></tr><tr><td>xrm5</td><td>ERC20FixedRewardModule</td><td>fund amount is zero</td></tr><tr><td>xrm6</td><td>ERC20FixedRewardModule</td><td>withdraw amount is zero</td></tr><tr><td>xrm7</td><td>ERC20FixedRewardModule</td><td>withdraw amount exceeds module balance</td></tr><tr><td>xrm8</td><td>ERC20FixedRewardModule</td><td>withdraw amount exceeds uncommitted budget</td></tr><tr><td></td><td></td><td></td></tr><tr><td>lrm1</td><td>ERC20LinearRewardModule</td><td>time period is zero</td></tr><tr><td>lrm2</td><td>ERC20LinearRewardModule</td><td>constant reward rate is zero</td></tr><tr><td>lrm3</td><td>ERC20LinearRewardModule</td><td>stake amount exceeds rewards capacity</td></tr><tr><td>lrm4</td><td>ERC20LinearRewardModule</td><td>fund amount is zero</td></tr><tr><td>lrm5</td><td>ERC20LinearRewardModule</td><td>withdraw amount is zero</td></tr><tr><td>lrm6</td><td>ERC20LinearRewardModule</td><td>withdraw amount exceeds module balance</td></tr><tr><td>lrm7</td><td>ERC20LinearRewardModule</td><td>withdraw amount exceeds budget for committed runway</td></tr><tr><td></td><td></td><td></td></tr><tr><td>mrm1</td><td>ERC20MultiRewardModule</td><td>vesting start exceeds 1.0</td></tr><tr><td>mrm2</td><td>ERC20MultiRewardModule</td><td>invalid byte encoding for stake params </td></tr><tr><td>mrm3</td><td>ERC20MultiRewardModule</td><td>stake, reward token count exceeds total</td></tr><tr><td>mrm4</td><td>ERC20MultiRewardModule</td><td>stake, duplicate reward token</td></tr><tr><td>mrm5</td><td>ERC20MultiRewardModule</td><td>invalid byte encoding for unstake params</td></tr><tr><td>mrm6</td><td>ERC20MultiRewardModule</td><td>unstake, reward token count exceeds total</td></tr><tr><td>mrm7</td><td>ERC20MultiRewardModule</td><td>unstake, duplicate reward token</td></tr><tr><td>mrm8</td><td>ERC20MultiRewardModule</td><td>cannot unstake with remaining reward tokens registered</td></tr><tr><td>mrm9</td><td>ERC20MultiRewardModule</td><td>missing bytes data for claim params</td></tr><tr><td>mrm10</td><td>ERC20MultiRewardModule</td><td>invalid byte encoding for claim params</td></tr><tr><td>mrm11</td><td>ERC20MultiRewardModule</td><td>claim, reward token count exceeds total</td></tr><tr><td>mrm12</td><td>ERC20MultiRewardModule</td><td>claim index range is invalid</td></tr><tr><td>mrm13</td><td>ERC20MultiRewardModule</td><td>claim end index exceeds total user stakes</td></tr><tr><td>mrm14</td><td>ERC20MultiRewardModule</td><td>claim, duplicate reward token</td></tr><tr><td>mrm15</td><td>ERC20MultiRewardModule</td><td>missing bytes data for update params</td></tr><tr><td>mrm16</td><td>ERC20MultiRewardModule</td><td>invalid byte encoding for update params</td></tr><tr><td>mrm17</td><td>ERC20MultiRewardModule</td><td>update, reward token count exceeds total</td></tr><tr><td>mrm18</td><td>ERC20MultiRewardModule</td><td>update index range is invalid</td></tr><tr><td>mrm19</td><td>ERC20MultiRewardModule</td><td>update end index exceeds total user stakes</td></tr><tr><td>mrm20</td><td>ERC20MultiRewardModule</td><td>update, duplicate reward token</td></tr><tr><td>mrm21</td><td>ERC20MultiRewardModule</td><td>invalid byte encoding for clean params</td></tr><tr><td>mrm22</td><td>ERC20MultiRewardModule</td><td>clean, reward token count exceeds total</td></tr><tr><td>mrm23</td><td>ERC20MultiRewardModule</td><td>reward token does not exist</td></tr><tr><td>mrm24</td><td>ERC20MultiRewardModule</td><td>time elapsed is zero</td></tr><tr><td></td><td></td><td></td></tr><tr><td>crmi1</td><td>ERC20CompetitiveRewardModuleInfo</td><td>shares must be greater than zero</td></tr><tr><td>crmi2</td><td>ERC20CompetitiveRewardModuleInfo</td><td>shares greater than balance in user position</td></tr><tr><td></td><td></td><td></td></tr><tr><td>frmi1</td><td>ERC20FriendlyRewardModuleInfo</td><td>shares must be greater than zero</td></tr><tr><td>frmi2</td><td>ERC20FriendlyRewardModuleInfo</td><td>shares greater than balance in user position</td></tr></tbody></table>


---

# 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.gysr.io/developers/error-codes.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.
