FutarchyRouter
The FutarchyRouter contract replicates the main Conditional Tokens functions, but allowing to work with ERC20 outcomes instead of the ERC1155.
Variables
conditionalTokens
contract IConditionalTokens conditionalTokensConditional Tokens contract.
wrapped1155Factory
contract IWrapped1155Factory wrapped1155FactoryWrapped1155Factory contract.
Functions
constructor
constructor(contract IConditionalTokens _conditionalTokens, contract IWrapped1155Factory _wrapped1155Factory) publicConstructor.
Parameters
_conditionalTokens
contract IConditionalTokens
Conditional Tokens contract.
_wrapped1155Factory
contract IWrapped1155Factory
Wrapped1155Factory contract.
splitPosition
function splitPosition(contract FutarchyProposal proposal, contract IERC20 collateralToken, uint256 amount) publicTransfers the collateral to the FutarchyRouter, splits the position and sends the ERC20 outcome tokens back to the user.
The ERC20 associated to each outcome must be previously created on the wrapped1155Factory. Collateral tokens are deposited only if we are not splitting a deep position (proposal.parentCollectionId is bytes32(0)).
Parameters
proposal
contract Proposal
The Proposal to split.
collateralToken
contract IERC20
The address of the ERC20 used as collateral.
amount
uint256
The amount of collateral to split.
Pre-condition
- The ERC20 associated to each outcome must be previously created on the wrapped1155Factory. 
- The caller must have <amount> collateral tokens or ERC20 parent outcome tokens (in the case - proposal.parentCollectionIdis not null).
Logic
When proposal.parentCollectionId is null:
- Transfer <amount> collateral from the user to - FutarchyRouter.
- Call - conditionalTokens.splitPositionto transfer <amount> collateral from- FutarchyRouterto- ConditionalTokens, while minting corresponding ERC1155 outcome tokens to- FutarchyRouter.
When proposal.parentCollectionId is not null:
- Unwrap ERC20 parent outcome tokens back to ERC1155 tokens. 
- Call - conditionalTokens.splitPositionto transfer ERC1155 parent outcome tokens from- FutarchyRouterto- ConditionalTokens, burning them while minting corresponding conditional outcome tokens to- FutarchyRouter.
Step 3 is the same in both cases:
- Transfer ERC1155 outcome tokens from - FutarchyRouterto- Wrapped1155Factorycontract. There is a callback function in- Wrapped1155Factorythat will wrap the tokens into ERC20 tokens, then transfer the wrapped tokens back to the original user.
_splitPosition
function _splitPosition(contract FutarchyProposal proposal, contract IERC20 collateralToken, uint256 amount) internalSplits a position and sends the ERC20 outcome tokens to the user.
The ERC20 associated to each outcome must be previously created on the wrapped1155Factory.
Parameters
proposal
contract FutarchyProposal
The Proposal to split.
collateralToken
contract IERC20
The address of the ERC20 used as collateral.
amount
uint256
The amount of collateral to split.
mergePositions
function mergePositions(contract FutarchyProposal proposal, contract IERC20 collateralToken, uint256 amount) publicMerges positions and sends the collateral tokens to the user.
The ERC20 associated to each outcome must be previously created on the wrapped1155Factory. Collateral tokens are withdrawn only if we are not merging a deep position (market.parentCollectionId is bytes32(0)).
Parameters
proposal
contract FutarchyProposal
The Proposal to merge.
collateralToken
contract IERC20
The address of the ERC20 used as collateral.
amount
uint256
The amount of outcome tokens to merge.
Pre-condition
- The ERC20 associated to each outcome must be previously created on the wrapped1155Factory. 
- The caller must have <amount> ERC20 tokens of all the outcomes of a proposal. 
Logic
Merging positions does precisely the opposite of what splitting a position does.
- Unwraps ERC20 outcome tokens (which will burn these tokens and transfer corresponding ERC1155 outcome tokens back to the - FutarchyRoutercontract).
- Call - conditionalTokens.mergePositionsto burn ERC1155 outcome tokens. Then:
When market.parentCollectionId is null:
- Return collateral to - FutarchyRouter, which will then be sent to the user.
When proposal.parentCollectionId is not null:
- conditionalTokenswill mint ERC1155 parent outcome tokens and send to- FutarchyRouter.- FutarchyRouterwill wrap these tokens to ERC20 and send to the user.
_mergePositions
function _mergePositions(contract FutarchyProposal proposal, contract IERC20 collateralToken, uint256 amount) internalMerges positions and receives the collateral tokens.
Callers to this function must send the collateral to the user.
Parameters
proposal
contract FutarchyProposal
The proposal to merge.
collateralToken
contract IERC20
The address of the ERC20 used as collateral.
amount
uint256
The amount of outcome tokens to merge.
redeemPositions
function redeemPositions(contract FutarchyProposal proposal, contract IERC20 collateralToken, uint256 amounts) publicRedeems positions and sends the collateral tokens to the user.
The ERC20 associated to each outcome must be previously created on the wrapped1155Factory. Collateral tokens are withdrawn only if we are not redeeming a deep position (parentCollectionId is bytes32(0)).
Parameters
proposal
contract FutarchyProposal
The Proposal to redeem.
collateralToken
contract IERC20
The address of the ERC20 used as collateral.
amount
uint256
Amount to redeem.
Pre-condition
- The ERC20 associated to each outcome must be previously created on the wrapped1155Factory. 
- The caller must have ERC20 tokens of the outcome they want to redeem. 
- conditionalTokens.reportPayoutshas been called by an oracle.
Logic
- Unwraps ERC20 outcome tokens (which will burn these tokens and transfer corresponding ERC1155 outcome tokens back to the - Routercontract).
- Call - conditionalTokens.redeemPositionsto burn ERC1155 outcome tokens. Then:
When proposal.parentCollectionId is null:
- Return collateral to - FutarchyRouter. The return amount is in proportion to the- ConditionalTokenspayouts.- FutarchyRouterwill calculate the collateral difference before and after redeeming and transfer the difference to the user.
When proposal.parentCollectionId is not null:
- conditionalTokenswill mint ERC1155 parent outcome tokens and send to- FutarchyRouter. The amount is in proportion to the- ConditionalTokenspayouts.- FutarchyRouterwill calculate the ERC1155 outcome tokens difference before and after redeeming, wrap the difference to ERC20 and send to the user.
_redeemPositions
function _redeemPositions(contract FutarchyProposal proposal, contract IERC20 collateralToken, uint256 amount) internalRedeems positions and sends the collateral tokens to the user.
Callers to this function must send the collateral to the user.
Parameters
proposal
contract FutarchyProposal
The Proposal to redeem.
collateralToken
contract IERC20
The address of the ERC20 used as collateral.
amount
uint256
Amount to redeem.
redeemProposal
function redeemProposal(contract FutarchyProposal proposal, uint256 amount1, uint256 amount2) internalRedeems positions and receives the collateral tokens.
It's a wrapper around redeemPositions that allows to redeem one or two collateral at the same time.
Parameters
proposal
contract FutarchyProposal
The Proposal to redeem.
amount1
uint256
Amount of the token collateral to redeem.
amount2
uint256
Amount of the currency collateral to redeem.
getTokenId
function getTokenId(contract IERC20 collateralToken, bytes32 parentCollectionId, bytes32 conditionId, uint256 indexSet) public view returns (uint256)Constructs a tokenId from a collateral token and an outcome collection.
Parameters
collateralToken
contract IERC20
The address of the ERC20 used as collateral.
parentCollectionId
bytes32
The Conditional Tokens parent collection id.
conditionId
bytes32
The id of the condition used to redeem.
indexSet
uint256
Index set of the outcome collection to combine with the parent outcome collection.
Return Values
[0]
uint256
The token id.
getWinningOutcomes
function getWinningOutcomes(bytes32 conditionId) external view returns (bool[])Helper function used to know the redeemable outcomes associated to a conditionId.
Parameters
conditionId
bytes32
The id of the condition.
Return Values
[0]
bool[]
An array of outcomes where a true value indicates that the outcome is redeemable.
Last updated