The openPosition
function is used to open a new farming position. This function requires, as input, the FarmingPositionRequest
struct:
Copy function openPosition(FarmingPositionRequest memory request) public override payable activeSetupOnly(request.setupIndex) returns(uint256 positionId) {
At the moment of creation, a positionID
that represents the position is generated:
Copy positionId = uint256(keccak256(abi.encode(uniqueOwner);
Each generated id is encoded with the uniqueOwner
(owner position) address
. This means that each address can correspond to one and only one position within each setup; a single address cannot have multiple positions in a setup.
A user can also open a position for another address
. In this case, the uniqueOwner
is not the msg.sender
, but rather the address
passed in the FarmingPositionRequest
:
Copy address uniqueOwner = (request.positionOwner != address(0)) ? request.positionOwner : msg.sender;
When opening a position, the Farming contract interact with the Uniswap v3 nonFungiblePositionManager
to mint the position NFT.
Copy data[0] = abi.encodeWithSelector(nonfungiblePositionManager.increaseLiquidity.selector, abi.encode(INonfungiblePositionManager.IncreaseLiquidityParams({
tokenId: _setups[request.setupIndex].objectId,
amount0Desired: request.amount0,
amount1Desired: request.amount1,
amount0Min: 1,
amount1Min: 1,
deadline: block.timestamp + 10000
})));
(tokenId, liquidityAmount, amount0, amount1) = abi.decode(IMulticall(address(nonfungiblePositionManager)).multicall{ value: ethValue }(data)[0], (uint256, uint128, uint256, uint256));
At this point, the FarmingPosition
struct for the created position is populated as follow:
Copy _positions[positionId] = FarmingPosition({ uniqueOwner: uniqueOwner, setupIndex : request.setupIndex, tokenId: tokenId, mainTokenAmount: mainTokenAmount, reward: reward, lockedRewardPerBlock: lockedRewardPerBlock, creationBlock: block.number
Creating a position increases the number of positions within a specific setup by one, given by:
Copy mapping(uint256 => uint256) private _setupPositionsCount;
Copy _setupPositionsCount[request.setupIndex] += 1