{"contractName":"CTHelpers","abi":[],"metadata":"{\"compiler\":{\"version\":\"0.5.10+commit.5a6ea5b1\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/C/Users/Alan/Documents/GitHub/conditional-tokens-contracts/contracts/CTHelpers.sol\":\"CTHelpers\"},\"evmVersion\":\"petersburg\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/C/Users/Alan/Documents/GitHub/conditional-tokens-contracts/contracts/CTHelpers.sol\":{\"keccak256\":\"0x921eadb1d6cd0e742448334fb84c39b358a18cdeb7c6badbb89cae847d44a201\",\"urls\":[\"bzzr://54ea8cd3a2ef100710306ce15475573542ad5235ced471d59fa1744cfaea51c8\",\"dweb:/ipfs/Qme871evGa1PBSBnV9PisLhYnFnnahLmBuy5KakLSUKRPF\"]},\"openzeppelin-solidity/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x90e8c2521653bbb1768b05889c5760031e688d9cd361f167489b89215e201b95\",\"urls\":[\"bzzr://aa8b45b57edafc3d67bc5d916327ea16807fae33f753ca163ae0c4061b789766\",\"dweb:/ipfs/QmP5NaEwZthQeM2ESz4WTT3osrP7jhbvu7ocbttBi2JAw6\"]}},\"version\":1}","bytecode":"0x60556023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a72305820c2ebe3f8ff4842757c5ae5e604218795c007986e70d8d26757b27a953b2f3afd64736f6c634300050a0032","deployedBytecode":"0x73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a72305820c2ebe3f8ff4842757c5ae5e604218795c007986e70d8d26757b27a953b2f3afd64736f6c634300050a0032","sourceMap":"107:18313:0:-;;132:2:-1;166:7;155:9;146:7;137:37;255:7;249:14;246:1;241:23;235:4;232:33;222:2;;269:9;222:2;293:9;290:1;283:20;323:4;314:7;306:22;347:7;338;331:24","deployedSourceMap":"107:18313:0:-;;;;;;;;","source":"pragma solidity ^0.5.1;\n\nimport { IERC20 } from \"openzeppelin-solidity/contracts/token/ERC20/IERC20.sol\";\n\nlibrary CTHelpers {\n    /// @dev Constructs a condition ID from an oracle, a question ID, and the outcome slot count for the question.\n    /// @param oracle The account assigned to report the result for the prepared condition.\n    /// @param questionId An identifier for the question to be answered by the oracle.\n    /// @param outcomeSlotCount The number of outcome slots which should be used for this condition. Must not exceed 256.\n    function getConditionId(address oracle, bytes32 questionId, uint outcomeSlotCount) internal pure returns (bytes32) {\n        return keccak256(abi.encodePacked(oracle, questionId, outcomeSlotCount));\n    }\n\n    uint constant P = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\n    uint constant B = 3;\n\n    function sqrt(uint x) private pure returns (uint y) {\n        uint p = P;\n        // solium-disable-next-line security/no-inline-assembly\n        assembly {\n            // add chain generated via https://crypto.stackexchange.com/q/27179/71252\n            // and transformed to the following program:\n\n            // x=1; y=x+x; z=y+y; z=z+z; y=y+z; x=x+y; y=y+x; z=y+y; t=z+z; t=z+t; t=t+t;\n            // t=t+t; z=z+t; x=x+z; z=x+x; z=z+z; y=y+z; z=y+y; z=z+z; z=z+z; z=y+z; x=x+z;\n            // z=x+x; z=z+z; z=z+z; z=x+z; y=y+z; x=x+y; z=x+x; z=z+z; y=y+z; z=y+y; t=z+z;\n            // t=t+t; t=t+t; z=z+t; x=x+z; y=y+x; z=y+y; z=z+z; z=z+z; x=x+z; z=x+x; z=z+z;\n            // z=x+z; z=z+z; z=z+z; z=x+z; y=y+z; z=y+y; t=z+z; t=t+t; t=z+t; t=y+t; t=t+t;\n            // t=t+t; t=t+t; t=t+t; z=z+t; x=x+z; z=x+x; z=x+z; y=y+z; z=y+y; z=y+z; z=z+z;\n            // t=z+z; t=z+t; w=t+t; w=w+w; w=w+w; w=w+w; w=w+w; t=t+w; z=z+t; x=x+z; y=y+x;\n            // z=y+y; x=x+z; y=y+x; x=x+y; y=y+x; x=x+y; z=x+x; z=x+z; z=z+z; y=y+z; z=y+y;\n            // z=z+z; x=x+z; y=y+x; z=y+y; z=y+z; x=x+z; y=y+x; x=x+y; y=y+x; z=y+y; z=z+z;\n            // z=y+z; x=x+z; z=x+x; z=x+z; y=y+z; x=x+y; y=y+x; x=x+y; y=y+x; z=y+y; z=y+z;\n            // z=z+z; x=x+z; y=y+x; z=y+y; z=y+z; z=z+z; x=x+z; z=x+x; t=z+z; t=t+t; t=z+t;\n            // t=x+t; t=t+t; t=t+t; t=t+t; t=t+t; z=z+t; y=y+z; x=x+y; y=y+x; x=x+y; z=x+x;\n            // z=x+z; z=z+z; z=z+z; z=z+z; z=x+z; y=y+z; z=y+y; z=y+z; z=z+z; x=x+z; z=x+x;\n            // z=x+z; y=y+z; x=x+y; z=x+x; z=z+z; y=y+z; x=x+y; z=x+x; y=y+z; x=x+y; y=y+x;\n            // z=y+y; z=y+z; x=x+z; y=y+x; z=y+y; z=y+z; z=z+z; z=z+z; x=x+z; z=x+x; z=z+z;\n            // z=z+z; z=x+z; y=y+z; x=x+y; z=x+x; t=x+z; t=t+t; t=t+t; z=z+t; y=y+z; z=y+y;\n            // x=x+z; y=y+x; x=x+y; y=y+x; x=x+y; y=y+x; z=y+y; t=y+z; z=y+t; z=z+z; z=z+z;\n            // z=t+z; x=x+z; y=y+x; x=x+y; y=y+x; x=x+y; z=x+x; z=x+z; y=y+z; x=x+y; x=x+x;\n            // x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x;\n            // x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x;\n            // x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x;\n            // x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x;\n            // x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x;\n            // x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x;\n            // x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x;\n            // x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x;\n            // x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x;\n            // x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x;\n            // x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x; x=x+x;\n            // x=x+x; x=x+x; x=x+x; x=x+x; res=y+x\n            // res == (P + 1) // 4\n\n            y := mulmod(x, x, p)\n            {\n                let z := mulmod(y, y, p)\n                z := mulmod(z, z, p)\n                y := mulmod(y, z, p)\n                x := mulmod(x, y, p)\n                y := mulmod(y, x, p)\n                z := mulmod(y, y, p)\n                {\n                    let t := mulmod(z, z, p)\n                    t := mulmod(z, t, p)\n                    t := mulmod(t, t, p)\n                    t := mulmod(t, t, p)\n                    z := mulmod(z, t, p)\n                    x := mulmod(x, z, p)\n                    z := mulmod(x, x, p)\n                    z := mulmod(z, z, p)\n                    y := mulmod(y, z, p)\n                    z := mulmod(y, y, p)\n                    z := mulmod(z, z, p)\n                    z := mulmod(z, z, p)\n                    z := mulmod(y, z, p)\n                    x := mulmod(x, z, p)\n                    z := mulmod(x, x, p)\n                    z := mulmod(z, z, p)\n                    z := mulmod(z, z, p)\n                    z := mulmod(x, z, p)\n                    y := mulmod(y, z, p)\n                    x := mulmod(x, y, p)\n                    z := mulmod(x, x, p)\n                    z := mulmod(z, z, p)\n                    y := mulmod(y, z, p)\n                    z := mulmod(y, y, p)\n                    t := mulmod(z, z, p)\n                    t := mulmod(t, t, p)\n                    t := mulmod(t, t, p)\n                    z := mulmod(z, t, p)\n                    x := mulmod(x, z, p)\n                    y := mulmod(y, x, p)\n                    z := mulmod(y, y, p)\n                    z := mulmod(z, z, p)\n                    z := mulmod(z, z, p)\n                    x := mulmod(x, z, p)\n                    z := mulmod(x, x, p)\n                    z := mulmod(z, z, p)\n                    z := mulmod(x, z, p)\n                    z := mulmod(z, z, p)\n                    z := mulmod(z, z, p)\n                    z := mulmod(x, z, p)\n                    y := mulmod(y, z, p)\n                    z := mulmod(y, y, p)\n                    t := mulmod(z, z, p)\n                    t := mulmod(t, t, p)\n                    t := mulmod(z, t, p)\n                    t := mulmod(y, t, p)\n                    t := mulmod(t, t, p)\n                    t := mulmod(t, t, p)\n                    t := mulmod(t, t, p)\n                    t := mulmod(t, t, p)\n                    z := mulmod(z, t, p)\n                    x := mulmod(x, z, p)\n                    z := mulmod(x, x, p)\n                    z := mulmod(x, z, p)\n                    y := mulmod(y, z, p)\n                    z := mulmod(y, y, p)\n                    z := mulmod(y, z, p)\n                    z := mulmod(z, z, p)\n                    t := mulmod(z, z, p)\n                    t := mulmod(z, t, p)\n                    {\n                        let w := mulmod(t, t, p)\n                        w := mulmod(w, w, p)\n                        w := mulmod(w, w, p)\n                        w := mulmod(w, w, p)\n                        w := mulmod(w, w, p)\n                        t := mulmod(t, w, p)\n                    }\n                    z := mulmod(z, t, p)\n                    x := mulmod(x, z, p)\n                    y := mulmod(y, x, p)\n                    z := mulmod(y, y, p)\n                    x := mulmod(x, z, p)\n                    y := mulmod(y, x, p)\n                    x := mulmod(x, y, p)\n                    y := mulmod(y, x, p)\n                    x := mulmod(x, y, p)\n                    z := mulmod(x, x, p)\n                    z := mulmod(x, z, p)\n                    z := mulmod(z, z, p)\n                    y := mulmod(y, z, p)\n                    z := mulmod(y, y, p)\n                    z := mulmod(z, z, p)\n                    x := mulmod(x, z, p)\n                    y := mulmod(y, x, p)\n                    z := mulmod(y, y, p)\n                    z := mulmod(y, z, p)\n                    x := mulmod(x, z, p)\n                    y := mulmod(y, x, p)\n                    x := mulmod(x, y, p)\n                    y := mulmod(y, x, p)\n                    z := mulmod(y, y, p)\n                    z := mulmod(z, z, p)\n                    z := mulmod(y, z, p)\n                    x := mulmod(x, z, p)\n                    z := mulmod(x, x, p)\n                    z := mulmod(x, z, p)\n                    y := mulmod(y, z, p)\n                    x := mulmod(x, y, p)\n                    y := mulmod(y, x, p)\n                    x := mulmod(x, y, p)\n                    y := mulmod(y, x, p)\n                    z := mulmod(y, y, p)\n                    z := mulmod(y, z, p)\n                    z := mulmod(z, z, p)\n                    x := mulmod(x, z, p)\n                    y := mulmod(y, x, p)\n                    z := mulmod(y, y, p)\n                    z := mulmod(y, z, p)\n                    z := mulmod(z, z, p)\n                    x := mulmod(x, z, p)\n                    z := mulmod(x, x, p)\n                    t := mulmod(z, z, p)\n                    t := mulmod(t, t, p)\n                    t := mulmod(z, t, p)\n                    t := mulmod(x, t, p)\n                    t := mulmod(t, t, p)\n                    t := mulmod(t, t, p)\n                    t := mulmod(t, t, p)\n                    t := mulmod(t, t, p)\n                    z := mulmod(z, t, p)\n                    y := mulmod(y, z, p)\n                    x := mulmod(x, y, p)\n                    y := mulmod(y, x, p)\n                    x := mulmod(x, y, p)\n                    z := mulmod(x, x, p)\n                    z := mulmod(x, z, p)\n                    z := mulmod(z, z, p)\n                    z := mulmod(z, z, p)\n                    z := mulmod(z, z, p)\n                    z := mulmod(x, z, p)\n                    y := mulmod(y, z, p)\n                    z := mulmod(y, y, p)\n                    z := mulmod(y, z, p)\n                    z := mulmod(z, z, p)\n                    x := mulmod(x, z, p)\n                    z := mulmod(x, x, p)\n                    z := mulmod(x, z, p)\n                    y := mulmod(y, z, p)\n                    x := mulmod(x, y, p)\n                    z := mulmod(x, x, p)\n                    z := mulmod(z, z, p)\n                    y := mulmod(y, z, p)\n                    x := mulmod(x, y, p)\n                    z := mulmod(x, x, p)\n                    y := mulmod(y, z, p)\n                    x := mulmod(x, y, p)\n                    y := mulmod(y, x, p)\n                    z := mulmod(y, y, p)\n                    z := mulmod(y, z, p)\n                    x := mulmod(x, z, p)\n                    y := mulmod(y, x, p)\n                    z := mulmod(y, y, p)\n                    z := mulmod(y, z, p)\n                    z := mulmod(z, z, p)\n                    z := mulmod(z, z, p)\n                    x := mulmod(x, z, p)\n                    z := mulmod(x, x, p)\n                    z := mulmod(z, z, p)\n                    z := mulmod(z, z, p)\n                    z := mulmod(x, z, p)\n                    y := mulmod(y, z, p)\n                    x := mulmod(x, y, p)\n                    z := mulmod(x, x, p)\n                    t := mulmod(x, z, p)\n                    t := mulmod(t, t, p)\n                    t := mulmod(t, t, p)\n                    z := mulmod(z, t, p)\n                    y := mulmod(y, z, p)\n                    z := mulmod(y, y, p)\n                    x := mulmod(x, z, p)\n                    y := mulmod(y, x, p)\n                    x := mulmod(x, y, p)\n                    y := mulmod(y, x, p)\n                    x := mulmod(x, y, p)\n                    y := mulmod(y, x, p)\n                    z := mulmod(y, y, p)\n                    t := mulmod(y, z, p)\n                    z := mulmod(y, t, p)\n                    z := mulmod(z, z, p)\n                    z := mulmod(z, z, p)\n                    z := mulmod(t, z, p)\n                }\n                x := mulmod(x, z, p)\n                y := mulmod(y, x, p)\n                x := mulmod(x, y, p)\n                y := mulmod(y, x, p)\n                x := mulmod(x, y, p)\n                z := mulmod(x, x, p)\n                z := mulmod(x, z, p)\n                y := mulmod(y, z, p)\n            }\n            x := mulmod(x, y, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            x := mulmod(x, x, p)\n            y := mulmod(y, x, p)\n        }\n    }\n\n    /// @dev Constructs an outcome collection ID from a parent collection and an outcome collection.\n    /// @param parentCollectionId Collection ID of the parent outcome collection, or bytes32(0) if there's no parent.\n    /// @param conditionId Condition ID of the outcome collection to combine with the parent outcome collection.\n    /// @param indexSet Index set of the outcome collection to combine with the parent outcome collection.\n    function getCollectionId(bytes32 parentCollectionId, bytes32 conditionId, uint indexSet) internal view returns (bytes32) {\n        uint x1 = uint(keccak256(abi.encodePacked(conditionId, indexSet)));\n        bool odd = x1 >> 255 != 0;\n        uint y1;\n        uint yy;\n        do {\n            x1 = addmod(x1, 1, P);\n            yy = addmod(mulmod(x1, mulmod(x1, x1, P), P), B, P);\n            y1 = sqrt(yy);\n        } while(mulmod(y1, y1, P) != yy);\n        if(odd && y1 % 2 == 0 || !odd && y1 % 2 == 1)\n            y1 = P - y1;\n\n        uint x2 = uint(parentCollectionId);\n        if(x2 != 0) {\n            odd = x2 >> 254 != 0;\n            x2 = (x2 << 2) >> 2;\n            yy = addmod(mulmod(x2, mulmod(x2, x2, P), P), B, P);\n            uint y2 = sqrt(yy);\n            if(odd && y2 % 2 == 0 || !odd && y2 % 2 == 1)\n                y2 = P - y2;\n            require(mulmod(y2, y2, P) == yy, \"invalid parent collection ID\");\n\n            (bool success, bytes memory ret) = address(6).staticcall(abi.encode(x1, y1, x2, y2));\n            require(success, \"ecadd failed\");\n            (x1, y1) = abi.decode(ret, (uint, uint));\n        }\n\n        if(y1 % 2 == 1)\n            x1 ^= 1 << 254;\n\n        return bytes32(x1);\n    }\n\n    /// @dev Constructs a position ID from a collateral token and an outcome collection. These IDs are used as the ERC-1155 ID for this contract.\n    /// @param collateralToken Collateral token which backs the position.\n    /// @param collectionId ID of the outcome collection associated with this position.\n    function getPositionId(IERC20 collateralToken, bytes32 collectionId) internal pure returns (uint) {\n        return uint(keccak256(abi.encodePacked(collateralToken, collectionId)));\n    }\n}","compiler":{"name":"solc","version":"0.5.10+commit.5a6ea5b1.Emscripten.clang"},"networks":{},"schemaVersion":"3.2.5","updatedAt":"2020-09-17T16:00:36.801Z","devdoc":{"methods":{}},"userdoc":{"methods":{}}}