UNPKG

@gnosis.pm/conditional-tokens-market-makers

Version:
1 lines 12.9 kB
{"contractName":"LMSRMarketMakerData","abi":[{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"initialFunding","type":"uint256"}],"name":"AMMCreated","type":"event"}],"metadata":"{\"compiler\":{\"version\":\"0.5.10+commit.5a6ea5b1\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"initialFunding\",\"type\":\"uint256\"}],\"name\":\"AMMCreated\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/alan/src/github.com/gnosis/conditional-tokens-market-makers/contracts/LMSRMarketMakerFactory.sol\":\"LMSRMarketMakerData\"},\"evmVersion\":\"petersburg\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/home/alan/src/github.com/gnosis/conditional-tokens-market-makers/contracts/LMSRMarketMaker.sol\":{\"keccak256\":\"0x8410f1b98f546b1e6edc4b402bfc20a2956018415c6917421d9eef472633ac65\",\"urls\":[\"bzzr://33774de3e0bcec6c0640a50f571d9166f9566c0722f5faa4e90d3e1b763ad760\",\"dweb:/ipfs/QmPzfHt9ywEMjngVREdtZ2ywG5isfivPfkH9pzGXebv3cv\"]},\"/home/alan/src/github.com/gnosis/conditional-tokens-market-makers/contracts/LMSRMarketMakerFactory.sol\":{\"keccak256\":\"0xeb3422a373f1395835a2fb2fecf25eb9b8c963f2b1c6a068e1cbb8d356375858\",\"urls\":[\"bzzr://e95029f143a912fc6f1a08fda21e69d24003e1b32b83976a5f3041e807fed1bd\",\"dweb:/ipfs/QmNQc1DTsvt2h3idHzPjvqQDxenuDAWhXnLA5NLDzyG641\"]},\"/home/alan/src/github.com/gnosis/conditional-tokens-market-makers/contracts/MarketMaker.sol\":{\"keccak256\":\"0xa4addb4855f472eb1a4719298b5db759e475dd42bcd8de73d04c1ffc3b01bf40\",\"urls\":[\"bzzr://f7e679bd8b58cbc371c1a3919f740c47234cfdbda8253b6f65d2b2b57086def2\",\"dweb:/ipfs/QmQmjcWGQdmoogx9DBm8wtXxejXjDyuhmDFeihiCmzjd8N\"]},\"/home/alan/src/github.com/gnosis/conditional-tokens-market-makers/contracts/Whitelist.sol\":{\"keccak256\":\"0xe608e935510e8190d6d9fd7a0a6ecc02776d0dd106cbcbe3bac5ee0309abfae5\",\"urls\":[\"bzzr://88b9da6174844aa2f45b5bf2686298a34a12c4546449ebc8344baaafd612ac42\",\"dweb:/ipfs/QmXqMsiTBAgfgZvfL5rP1QjFhfw56JBdyVmJJRmB2WoFJ4\"]},\"@gnosis.pm/conditional-tokens-contracts/contracts/CTHelpers.sol\":{\"keccak256\":\"0x921eadb1d6cd0e742448334fb84c39b358a18cdeb7c6badbb89cae847d44a201\",\"urls\":[\"bzzr://54ea8cd3a2ef100710306ce15475573542ad5235ced471d59fa1744cfaea51c8\",\"dweb:/ipfs/Qme871evGa1PBSBnV9PisLhYnFnnahLmBuy5KakLSUKRPF\"]},\"@gnosis.pm/conditional-tokens-contracts/contracts/ConditionalTokens.sol\":{\"keccak256\":\"0x11a610a3fa07ac8a59a09a76fdb944f058fdb06d3414fe49995595e68cd17d41\",\"urls\":[\"bzzr://aec70f70bf6166a9ae46146c7d293156967b345273a250667732f6f8a4355342\",\"dweb:/ipfs/QmWUFR7eKVsMS61UCK1yY2bQQhcqEQHAAmJ2FJ3GozWV8k\"]},\"@gnosis.pm/conditional-tokens-contracts/contracts/ERC1155/ERC1155.sol\":{\"keccak256\":\"0xd8e6583f45a98380ff10a5656a7ae7ba6a275e0d051043e5842f0d541abd7caa\",\"urls\":[\"bzzr://978cc82d056d10d8cc14b02f35801b10c0c2f87b0adbf6c41bbd622e20ab8cee\",\"dweb:/ipfs/QmYWqCK6moph6oeBEUc1nDaGz4GRdGXmykwKD5rykVbhcU\"]},\"@gnosis.pm/conditional-tokens-contracts/contracts/ERC1155/ERC1155TokenReceiver.sol\":{\"keccak256\":\"0x5d1e709c759b9bd72865c8608582d66fc338fde3a77f41abb04ae943915a5695\",\"urls\":[\"bzzr://55e5a597486430ad437bb8c8f0c93cf573b833fa84ccf64a25afaa01c761b839\",\"dweb:/ipfs/QmQ727N1676jG9F5iwakSG2RNeV82TVBGJHgHPmHxib8ah\"]},\"@gnosis.pm/conditional-tokens-contracts/contracts/ERC1155/IERC1155.sol\":{\"keccak256\":\"0x4971631d7de74464fed3e0abac04553e917be5e8cd10b3f825e2e7c39ccc2734\",\"urls\":[\"bzzr://e1e88dfe7440ceab59d4cd604d12e5dc93409a3c5058e497763703027ea7b9e6\",\"dweb:/ipfs/QmRzsL1o6iVEFmqBYCo3XpM4kpvbK7iSJWssXHQ3gHb5uq\"]},\"@gnosis.pm/conditional-tokens-contracts/contracts/ERC1155/IERC1155TokenReceiver.sol\":{\"keccak256\":\"0xca815b5ca57df8f1056b962c2728d6a1e56fc7d9a7869ccee8f5a1ac6075b75d\",\"urls\":[\"bzzr://61df3e61bf24c80714e326ffdc274aaefc342241de3e72374131f613cddbd042\",\"dweb:/ipfs/QmPnF3rGuY2H3Gifvha4dW7fJPptP7wJerHzjz4dpzfTJW\"]},\"@gnosis.pm/util-contracts/contracts/ConstructedCloneFactory.sol\":{\"keccak256\":\"0xd07c04b6aea8ff41993cb0179120bb7c2416476311d992633578f6084b4f783a\",\"urls\":[\"bzzr://da18076e9777db71f6068039ed24a9c3171e272d87cb3090b0036fc5a64d97e8\",\"dweb:/ipfs/QmPXGzL5oMwUJSPxsD3L2bXxsaVqw88cGn6JzU6hskpL7U\"]},\"@gnosis.pm/util-contracts/contracts/Fixed192x64Math.sol\":{\"keccak256\":\"0xad15b641bf8f5862034749b679ab91cb2c330c2ca997da4455863dc169ab82d4\",\"urls\":[\"bzzr://a37b3d23f367b7f0ba4669c417af754260f0dbedad21294079aed622222427f5\",\"dweb:/ipfs/QmScvV8NpQNBNApJXyLFcLAG4hwWExSkwPhWJrJxLqk9x5\"]},\"@gnosis.pm/util-contracts/contracts/SignedSafeMath.sol\":{\"keccak256\":\"0xf96e8d30ae216bdded12e0330bd43258ff91d7f2e197ba51cd0bebe662b2abbb\",\"urls\":[\"bzzr://7693c86096ea689f6cf2a2a5a5e7247e1bb7bc3d6573e1d3044a94f6c8082544\",\"dweb:/ipfs/QmbDxe1eTT69qjLHwYWhxUU9nnE7ACZHLbWJCW8unoP7ET\"]},\"openzeppelin-solidity/contracts/introspection/ERC165.sol\":{\"keccak256\":\"0xac2eacd7e7762e275442f28f21d821544df5aae2ed7698af13be8c41b7005e2e\",\"urls\":[\"bzzr://43e901f6f210568ebc1d3591da3ce6a9d10796b854767a9c6e3da10305a8a332\",\"dweb:/ipfs/QmQhfx2Ufr8a2gFXm3KogL66xGgAuAWMwcamkWFKGG6Vya\"]},\"openzeppelin-solidity/contracts/introspection/IERC165.sol\":{\"keccak256\":\"0x661553e43d7c4fbb2de504e5999fd5c104d367488350ed5bf023031bd1ba5ac5\",\"urls\":[\"bzzr://fc2ba15143ce3a00268ecd15fc98eb2469b18bfe27a64bbab0ac6446f161c739\",\"dweb:/ipfs/QmV7wjtRf11ibUHh4g8JjuhMpy68pPhV95L2y46UBoRfsZ\"]},\"openzeppelin-solidity/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x4ccf2d7b51873db1ccfd54ca2adae5eac3b184f9699911ed4490438419f1c690\",\"urls\":[\"bzzr://1604f5b6d6e916c154efd8c6720cda069e5ba32dfa0a9dedf2b42e5b02d07f89\",\"dweb:/ipfs/QmV3yVktya1s617QmuzQR2CfuJgUi3dR2xEZY9ecmqZ2G1\"]},\"openzeppelin-solidity/contracts/ownership/Ownable.sol\":{\"keccak256\":\"0xf79fb10e8235770eb4aea7249034076a3cc9f9119ad944fc48705bae9c9d20dc\",\"urls\":[\"bzzr://d12a11272051eb6586de8f7e0a82c04a98c9984ce8b2a6cf1ee439f65aba29a9\",\"dweb:/ipfs/QmS55hgTvNEAKinus19m65CB4wcymN8EiUPFpRx5tYJ1i2\"]},\"openzeppelin-solidity/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x90e8c2521653bbb1768b05889c5760031e688d9cd361f167489b89215e201b95\",\"urls\":[\"bzzr://aa8b45b57edafc3d67bc5d916327ea16807fae33f753ca163ae0c4061b789766\",\"dweb:/ipfs/QmP5NaEwZthQeM2ESz4WTT3osrP7jhbvu7ocbttBi2JAw6\"]},\"openzeppelin-solidity/contracts/utils/Address.sol\":{\"keccak256\":\"0xf3358e5819ca73357abd6c90bdfffd0474af54364897f6b3e3234c4b71fbe9a1\",\"urls\":[\"bzzr://f7f6da60a184233fd666ac44e6fb2bd51ca6ebdc4867a310d368049aa4e62786\",\"dweb:/ipfs/Qmb3kNCoBUZdah1AgBBD4zMk898j5Qw8ahT1w5cCMYp5Y3\"]}},\"version\":1}","bytecode":"0x6080604052348015600f57600080fd5b50603e80601d6000396000f3fe6080604052600080fdfea265627a7a72305820fbe30878d97d59ca6c0f7b5c80f2e55f2c53356eb5c50757223c1bed85608dd764736f6c634300050a0032","deployedBytecode":"0x6080604052600080fdfea265627a7a72305820fbe30878d97d59ca6c0f7b5c80f2e55f2c53356eb5c50757223c1bed85608dd764736f6c634300050a0032","sourceMap":"641:814:6:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;641:814:6;;;;;;;","deployedSourceMap":"641:814:6:-;;;;;","source":"pragma solidity ^0.5.1;\n\nimport { IERC20 } from \"openzeppelin-solidity/contracts/token/ERC20/IERC20.sol\";\nimport { ConditionalTokens } from \"@gnosis.pm/conditional-tokens-contracts/contracts/ConditionalTokens.sol\";\nimport { CTHelpers } from \"@gnosis.pm/conditional-tokens-contracts/contracts/CTHelpers.sol\";\nimport { ConstructedCloneFactory } from \"@gnosis.pm/util-contracts/contracts/ConstructedCloneFactory.sol\";\nimport { LMSRMarketMaker } from \"./LMSRMarketMaker.sol\";\nimport { Whitelist } from \"./Whitelist.sol\";\nimport { ERC1155TokenReceiver } from \"@gnosis.pm/conditional-tokens-contracts/contracts/ERC1155/ERC1155TokenReceiver.sol\";\n\ncontract LMSRMarketMakerData {\n address internal _owner;\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n\n bytes4 internal constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\n mapping(bytes4 => bool) internal _supportedInterfaces;\n\n\n uint64 constant FEE_RANGE = 10**18;\n event AMMCreated(uint initialFunding);\n ConditionalTokens internal pmSystem;\n IERC20 internal collateralToken;\n bytes32[] internal conditionIds;\n uint internal atomicOutcomeSlotCount;\n uint64 internal fee;\n uint internal funding;\n Stage internal stage;\n Whitelist internal whitelist;\n\n uint[] internal outcomeSlotCounts;\n bytes32[][] internal collectionIds;\n uint[] internal positionIds;\n\n enum Stage {\n Running,\n Paused,\n Closed\n }\n}\n\ncontract LMSRMarketMakerFactory is ConstructedCloneFactory, LMSRMarketMakerData {\n event LMSRMarketMakerCreation(address indexed creator, LMSRMarketMaker lmsrMarketMaker, ConditionalTokens pmSystem, IERC20 collateralToken, bytes32[] conditionIds, uint64 fee, uint funding);\n\n LMSRMarketMaker public implementationMaster;\n\n constructor() public {\n implementationMaster = new LMSRMarketMaker();\n }\n\n function cloneConstructor(bytes calldata consData) external {\n (\n ConditionalTokens _pmSystem,\n IERC20 _collateralToken,\n bytes32[] memory _conditionIds,\n uint64 _fee,\n Whitelist _whitelist\n ) = abi.decode(consData, (ConditionalTokens, IERC20, bytes32[], uint64, Whitelist));\n\n _owner = msg.sender;\n emit OwnershipTransferred(address(0), _owner);\n\n _supportedInterfaces[_INTERFACE_ID_ERC165] = true;\n _supportedInterfaces[\n ERC1155TokenReceiver(0).onERC1155Received.selector ^\n ERC1155TokenReceiver(0).onERC1155BatchReceived.selector\n ] = true;\n\n // Validate inputs\n require(address(_pmSystem) != address(0) && _fee < FEE_RANGE);\n pmSystem = _pmSystem;\n collateralToken = _collateralToken;\n conditionIds = _conditionIds;\n fee = _fee;\n whitelist = _whitelist;\n\n atomicOutcomeSlotCount = 1;\n outcomeSlotCounts = new uint[](conditionIds.length);\n for (uint i = 0; i < conditionIds.length; i++) {\n uint outcomeSlotCount = pmSystem.getOutcomeSlotCount(conditionIds[i]);\n atomicOutcomeSlotCount *= outcomeSlotCount;\n outcomeSlotCounts[i] = outcomeSlotCount;\n }\n require(atomicOutcomeSlotCount > 1, \"conditions must be valid\");\n\n collectionIds = new bytes32[][](conditionIds.length);\n _recordCollectionIDsForAllConditions(conditionIds.length, bytes32(0));\n\n stage = Stage.Paused;\n emit AMMCreated(funding);\n }\n\n function _recordCollectionIDsForAllConditions(uint conditionsLeft, bytes32 parentCollectionId) private {\n if(conditionsLeft == 0) {\n positionIds.push(CTHelpers.getPositionId(collateralToken, parentCollectionId));\n return;\n }\n\n conditionsLeft--;\n\n uint outcomeSlotCount = outcomeSlotCounts[conditionsLeft];\n\n collectionIds[conditionsLeft].push(parentCollectionId);\n for(uint i = 0; i < outcomeSlotCount; i++) {\n _recordCollectionIDsForAllConditions(\n conditionsLeft,\n CTHelpers.getCollectionId(\n parentCollectionId,\n conditionIds[conditionsLeft],\n 1 << i\n )\n );\n }\n }\n\n function createLMSRMarketMaker(ConditionalTokens pmSystem, IERC20 collateralToken, bytes32[] calldata conditionIds, uint64 fee, Whitelist whitelist, uint funding)\n external\n returns (LMSRMarketMaker lmsrMarketMaker)\n {\n lmsrMarketMaker = LMSRMarketMaker(createClone(address(implementationMaster), abi.encode(pmSystem, collateralToken, conditionIds, fee, whitelist)));\n collateralToken.transferFrom(msg.sender, address(this), funding);\n collateralToken.approve(address(lmsrMarketMaker), funding);\n lmsrMarketMaker.changeFunding(int(funding));\n lmsrMarketMaker.resume();\n lmsrMarketMaker.transferOwnership(msg.sender);\n emit LMSRMarketMakerCreation(msg.sender, lmsrMarketMaker, pmSystem, collateralToken, conditionIds, fee, funding);\n }\n}\n","compiler":{"name":"solc","version":"0.5.10+commit.5a6ea5b1.Emscripten.clang"},"networks":{},"schemaVersion":"3.0.16","updatedAt":"2020-03-16T19:03:53.100Z","devdoc":{"methods":{}},"userdoc":{"methods":{}}}