Side Chain Implemention

The Convex system is also being rolled out to various sidechains. While the main flow is largely the same, there are a few changes to take note of.

Sidechain GitHub:

Sidechain Deployed Addresses:


The ConvexRewardPool replaces the BaseRewardPool. Unlike the mainnet platform, deposits are wrapped and staked directly to this ConvexRewardPool and this is a tokenizied erc-20 position.

The ConvexRewardPool also does not do linear distribution over time. Anytime an action is occured, the pool will claim from all sources and then check differences in balances of tokens and distribute instantly to all users the difference (increase) of tokens. This allows the pool and rewards to match the Curve gauges 1-for-1 with no trailing period. Any outside extra rewards added to the pool must also use its own time based distribution mechanic as the ConvexRewardPool will only claim and distribute.

The ConvexRewardPool is also agnostic to rewards that can be added. Thus take note that the earned() function is a mutative function. It will claim from all sources and check the differences before returning a user's claimable token amounts. When querying earned(), make sure to change your ABI to use a non-mutative view call instead.


Unlike mainnet, there is no more "WithdrawAndUnwrap" option. The only withdraw function is now a plain withdraw(uint256 _amount, bool _claim) or withdrawAll(bool claim). This will return the Curve LP token much like the "unwrap" method on mainnet.


In mainnet there is an option to claim extra rewards or not. On side chains there is only singular claim that will claim all tokens. However there is now a getReward(address _account, address _forwardTo) option to forward claims to a different address when called. Take note though getReward() without the forward option is unguarded and can be called by anyone so do not rely on all tokens being forwarded.

While pools during our initial Arbitrum launch do not have this functionality, newer pools also allow you to automatically redirect claimed rewards to another address. To set this feature, use the following function. To disable, set the redirect address to zero. Using this feature will ensure that even the unguarded getReward() will transfer tokens to the desired address.

function setRewardRedirect(address _to) external;


The PoolInfo struct has slightly changed

//mainnet struct PoolInfo { address lptoken; address token; address gauge; address crvRewards; address stash; bool shutdown; }

is now

//sidechains struct PoolInfo { address lptoken; address gauge; address rewards; bool shutdown; address factory; }

The deposit function also no longer needs a boolean "stake" option and is has become simply:

function deposit(uint256 _pid, uint256 _amount)

Last updated