Contract Overview
Balance:
0 Ether
More Info
My Name Tag:
Not Available
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xCA1401c37949ca3f0a9B7128Bf99aC38b7598e89
Contract Name:
CairoPuzzleSubmission
Compiler Version
v0.6.11+commit.5ef660b1
Contract Source Code (Solidity Multiple files format)
/* Copyright 2019,2020 StarkWare Industries Ltd. Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.starkware.co/open-source-license/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ pragma solidity ^0.6.11; import "PuzzleSubmission.sol"; import "ProgramHashMgmt.sol"; import "IFactRegistry.sol"; contract CairoPuzzleSubmission is ProgramHashMgmt, PuzzleSubmission { event SuccessfulSubmission( bytes32 programHash, address submitter, uint256 timestap, string submitterName, address rewardAddress ); IFactRegistry cairoVerifier; constructor(address verifierAddress) public { cairoVerifier = IFactRegistry(verifierAddress); } function getSubmittersCount(bytes32 programHash) public view returns(uint256) { return submissionLists[programHash].length; } /* Provides the submission details of the submitter in the n-th place for the given puzzle. The place is zero based. */ function getNthPlace(bytes32 programHash, uint256 place) external view returns(address, address, string memory, uint256) { require(isRegisteredPuzzle(programHash), "PROGRAM_HASH_DOES_NOT_BELONG_TO_A_PUZZLE"); require(place < getSubmittersCount(programHash) , "INDEX_ERROR"); SubmissionDetails storage submission = submissionLists[programHash][place]; return ( submission.sender, submission.rewardAddress, submission.submitterName, submission.timestamp); } /* Registers a puzzle solution. This function should be called only after the GPS fact is successfully registered on-chain. You can use calcSubmissionFact to get the value of the fact expected by this contract, and make sure it's registered on the GPS contract, using its isValid() method. rewardAddress - The Ethereum MAINNET address, to which rewards should be sent. submitterName - The name of the submitter. programHash - The program hash of the puzzle. */ function submitPuzzleSolution( address rewardAddress, string calldata submitterName, bytes32 programHash) external { require(isRegisteredPuzzle(programHash), "PROGRAM_HASH_DOES_NOT_BELONG_TO_A_PUZZLE"); bytes32 submissionFact = calcSubmissionFact(programHash, msg.sender); require(cairoVerifier.isValid(submissionFact), "CAIRO_FACT_NOT_REGISTERED_IN_GPS_CONTRACT"); require( submitters[programHash][msg.sender] == 0, "REQUESTED_REGISTRATION_ALREADY_PERFORMED"); recordSubmission(rewardAddress, submitterName, programHash); emit SuccessfulSubmission( programHash, msg.sender, block.timestamp, submitterName, rewardAddress); } function calcSubmissionFact(bytes32 programHash, address sender) public pure returns(bytes32) { bytes32 senderHash = keccak256(abi.encode(uint256(sender))); return keccak256(abi.encode(programHash, senderHash)); } }
/* Copyright 2019,2020 StarkWare Industries Ltd. Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.starkware.co/open-source-license/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ pragma solidity ^0.6.11; /* The Fact Registry design pattern is a way to separate cryptographic verification from the business logic of the contract flow. A fact registry holds a hash table of verified "facts" which are represented by a hash of claims that the registry hash check and found valid. This table may be queried by accessing the isValid() function of the registry with a given hash. In addition, each fact registry exposes a registry specific function for submitting new claims together with their proofs. The information submitted varies from one registry to the other depending of the type of fact requiring verification. For further reading on the Fact Registry design pattern see this `StarkWare blog post <https://medium.com/starkware/the-fact-registry-a64aafb598b6>`_. */ interface IFactRegistry { /* Returns true if the given fact was previously registered in the contract. */ function isValid(bytes32 fact) external view returns(bool); }
/* Copyright 2019,2020 StarkWare Industries Ltd. Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.starkware.co/open-source-license/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ pragma solidity ^0.6.11; import "SimpleAdminable.sol"; abstract contract ProgramHashMgmt is SimpleAdminable { // A map from program hash to true. True marks eligible puzzles. mapping (bytes32 => bool) puzzleProgramHashes; /* Indicates if puzzle exists. */ function isRegisteredPuzzle(bytes32 programHash) public view returns(bool) { return puzzleProgramHashes[programHash]; } function addProgramHash(bytes32 programHash) external onlyAdmin { puzzleProgramHashes[programHash] = true; } }
/* Copyright 2019,2020 StarkWare Industries Ltd. Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.starkware.co/open-source-license/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ pragma solidity ^0.6.11; abstract contract PuzzleSubmission { // Full details of a submission. struct SubmissionDetails { bytes32 programHash; address sender; address rewardAddress; // Ethereum mainnet address of the submitter for accepting rewards. string submitterName; uint256 timestamp; } // Map programHash -> Lists of submission details. // Each list is ordered by the time of submission. mapping (bytes32 => SubmissionDetails[]) submissionLists; // Challenge submitters // A map programHash => sender => timestamp. mapping (bytes32 => mapping (address => uint256)) submitters; /* Creates and returns the storage pointer to the struct. */ function submissionStructAllocator(bytes32 programHash) internal view returns(SubmissionDetails storage submission) { bytes32 location = keccak256( abi.encodePacked("SubmissionDetailsStorage", programHash, msg.sender)); assembly {submission_slot := location} } function recordSubmission( address rewardAddresss, string calldata submitterName, bytes32 programHash) internal { SubmissionDetails storage submission = submissionStructAllocator(programHash); submitters[programHash][msg.sender] = block.timestamp; submission.programHash = programHash; submission.sender = msg.sender; submission.rewardAddress = rewardAddresss; submission.submitterName = submitterName; submission.timestamp = block.timestamp; submissionLists[programHash].push(submission); } }
/* Copyright 2019,2020 StarkWare Industries Ltd. Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.starkware.co/open-source-license/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ pragma solidity ^0.6.11; abstract contract SimpleAdminable { address owner; address ownerCandidate; mapping(address => bool) admins; constructor() internal { owner = msg.sender; admins[msg.sender] = true; } // Admin/Owner Modifiers. modifier onlyOwner() { require(isOwner(msg.sender), "ONLY_OWNER"); _; } function isOwner(address testedAddress) public view returns (bool) { return owner == testedAddress; } modifier onlyAdmin() { require(isAdmin(msg.sender), "ONLY_ADMIN"); _; } function isAdmin(address testedAddress) public view returns (bool) { return admins[testedAddress]; } function registerAdmin(address newAdmin) external onlyOwner { if (!isAdmin(newAdmin)) { admins[newAdmin] = true; } } function removeAdmin(address removedAdmin) external onlyOwner { require(!isOwner(removedAdmin), "OWNER_CANNOT_BE_REMOVED_AS_ADMIN"); delete admins[removedAdmin]; } function nominateNewOwner(address newOwner) external onlyOwner { require(!isOwner(newOwner), "ALREADY_OWNER"); ownerCandidate = newOwner; } function acceptOwnership() external { // Previous owner is still an admin. require(msg.sender == ownerCandidate, "NOT_A_CANDIDATE"); owner = ownerCandidate; admins[ownerCandidate] = true; ownerCandidate = address(0x0); } }
[{"inputs":[{"internalType":"address","name":"verifierAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"programHash","type":"bytes32"},{"indexed":false,"internalType":"address","name":"submitter","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestap","type":"uint256"},{"indexed":false,"internalType":"string","name":"submitterName","type":"string"},{"indexed":false,"internalType":"address","name":"rewardAddress","type":"address"}],"name":"SuccessfulSubmission","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"programHash","type":"bytes32"}],"name":"addProgramHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"programHash","type":"bytes32"},{"internalType":"address","name":"sender","type":"address"}],"name":"calcSubmissionFact","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"programHash","type":"bytes32"},{"internalType":"uint256","name":"place","type":"uint256"}],"name":"getNthPlace","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"programHash","type":"bytes32"}],"name":"getSubmittersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"testedAddress","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"testedAddress","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"programHash","type":"bytes32"}],"name":"isRegisteredPuzzle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"nominateNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"registerAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"removedAdmin","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rewardAddress","type":"address"},{"internalType":"string","name":"submitterName","type":"string"},{"internalType":"bytes32","name":"programHash","type":"bytes32"}],"name":"submitPuzzleSolution","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506040516112f63803806112f68339818101604052602081101561003357600080fd5b5051600080546001600160a01b0319908116339081178355825260026020526040909120805460ff19166001179055600680546001600160a01b039093169290911691909117905561126c8061008a6000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c806379ba509711610081578063aa4f5f6d1161005b578063aa4f5f6d146103c0578063c38c5813146103dd578063f186082b14610410576100d4565b806379ba50971461026557806388f9a74e1461026d5780639664e92a146102b8576100d4565b80632f54bf6e116100b25780632f54bf6e146101885780634ac5a87a146101bb5780636306b39914610248576100d4565b80631627540c146100d95780631785f53c1461010e57806324d7806c14610141575b600080fd5b61010c600480360360208110156100ef57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661042d565b005b61010c6004803603602081101561012457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661055d565b6101746004803603602081101561015757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610692565b604080519115158252519081900360200190f35b6101746004803603602081101561019e57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166106bd565b61010c600480360360608110156101d157600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516919081019060408101602082013564010000000081111561020957600080fd5b82018360208201111561021b57600080fd5b8035906020019184600183028401116401000000008311171561023d57600080fd5b9193509150356106de565b61010c6004803603602081101561025e57600080fd5b50356109b7565b61010c610a64565b6102a66004803603604081101561028357600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16610b6c565b60408051918252519081900360200190f35b6102db600480360360408110156102ce57600080fd5b5080359060200135610bd0565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561038257818101518382015260200161036a565b50505050905090810190601f1680156103af5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b6102a6600480360360208110156103d657600080fd5b5035610dc6565b61010c600480360360208110156103f357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610dd8565b6101746004803603602081101561042657600080fd5b5035610eab565b610436336106bd565b6104a157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4f4e4c595f4f574e455200000000000000000000000000000000000000000000604482015290519081900360640190fd5b6104aa816106bd565b1561051657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f414c52454144595f4f574e455200000000000000000000000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610566336106bd565b6105d157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4f4e4c595f4f574e455200000000000000000000000000000000000000000000604482015290519081900360640190fd5b6105da816106bd565b1561064657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f574e45525f43414e4e4f545f42455f52454d4f5645445f41535f41444d494e604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205460ff1690565b60005473ffffffffffffffffffffffffffffffffffffffff91821691161490565b6106e781610eab565b61073c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061120f6028913960400191505060405180910390fd5b60006107488233610b6c565b600654604080517f6a93856700000000000000000000000000000000000000000000000000000000815260048101849052905192935073ffffffffffffffffffffffffffffffffffffffff90911691636a93856791602480820192602092909190829003018186803b1580156107bd57600080fd5b505afa1580156107d1573d6000803e3d6000fd5b505050506040513d60208110156107e757600080fd5b505161083e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806111e66029913960400191505060405180910390fd5b6000828152600560209081526040808320338452909152902054156108ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806111be6028913960400191505060405180910390fd5b6108ba85858585610ec0565b7f1a3ffe4d1c14b48fe7b8737a18227a5de65f19ff07d7a2edca49c0de8faa196082334287878a604051808781526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281038252858582818152602001925080828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201829003995090975050505050505050a15050505050565b6109c033610692565b610a2b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4f4e4c595f41444d494e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60015473ffffffffffffffffffffffffffffffffffffffff163314610aea57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e4f545f415f43414e4449444154450000000000000000000000000000000000604482015290519081900360640190fd5b600180546000805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff000000000000000000000000000000000000000092831681178255815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016831790558154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff92909216602080840191909152815180840382018152838301835280519082012060608401949094526080808401949094528151808403909401845260a09092019052815191012090565b60008060606000610be086610eab565b610c35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061120f6028913960400191505060405180910390fd5b610c3e86610dc6565b8510610cab57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f494e4445585f4552524f52000000000000000000000000000000000000000000604482015290519081900360640190fd5b6000868152600460205260408120805487908110610cc557fe5b6000918252602091829020600160059092020181810154600280830154600484015460038501805460408051601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9a841615610100029a909a019092169590950497880189900489028101890190945286845294975073ffffffffffffffffffffffffffffffffffffffff9384169691909316948491830182828015610dad5780601f10610d8257610100808354040283529160200191610dad565b820191906000526020600020905b815481529060010190602001808311610d9057829003601f168201915b5050505050915094509450945094505092959194509250565b60009081526004602052604090205490565b610de1336106bd565b610e4c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4f4e4c595f4f574e455200000000000000000000000000000000000000000000604482015290519081900360640190fd5b610e5581610692565b610ea85773ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b50565b60009081526003602052604090205460ff1690565b6000610ecb82611036565b60008381526005602090815260408083203380855292529091204290558382556001820180547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116909217905560028201805490911673ffffffffffffffffffffffffffffffffffffffff88161790559050610f4d60038201858561108f565b504260048083019190915560008381526020918252604081208054600181810183559183529290912083546005909302019182558083015482820180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff938416179091556002808601548186018054909316931692909217905560038085018054869594611025949386019390821615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019091160461112b565b506004918201549101555050505050565b604080517f5375626d697373696f6e44657461696c7353746f72616765000000000000000060208083019190915260388201939093523360601b60588201528151604c818303018152606c909101909152805191012090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106110ee578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082351617855561111b565b8280016001018555821561111b579182015b8281111561111b578235825591602001919060010190611100565b506111279291506111a0565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611164578054855561111b565b8280016001018555821561111b57600052602060002091601f016020900482015b8281111561111b578254825591600101919060010190611185565b6111ba91905b8082111561112757600081556001016111a6565b9056fe5245515545535445445f524547495354524154494f4e5f414c52454144595f504552464f524d4544434149524f5f464143545f4e4f545f524547495354455245445f494e5f4750535f434f4e545241435450524f4752414d5f484153485f444f45535f4e4f545f42454c4f4e475f544f5f415f50555a5a4c45a2646970667358221220a160341cfb14037f854f0e8073417f9fd93eaa1318aa83d3db0f8ce7cede525a64736f6c634300060b0033000000000000000000000000f0ec41069a89595adf5f27a4a90ff2df30d83d2e
Deployed ByteCode Sourcemap
712:2857:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1651:159:4;;;;;;;;;;;;;;;;-1:-1:-1;1651:159:4;;;;:::i;:::-;;1462:183;;;;;;;;;;;;;;;;-1:-1:-1;1462:183:4;;;;:::i;1190:112::-;;;;;;;;;;;;;;;;-1:-1:-1;1190:112:4;;;;:::i;:::-;;;;;;;;;;;;;;;;;;974:113;;;;;;;;;;;;;;;;-1:-1:-1;974:113:4;;;;:::i;2503:797:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2503:797:0;-1:-1:-1;2503:797:0;;:::i;1018:120:2:-;;;;;;;;;;;;;;;;-1:-1:-1;1018:120:2;;:::i;1816:264:4:-;;;:::i;3306:261:0:-;;;;;;;;;;;;;;;;-1:-1:-1;3306:261:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1418:567;;;;;;;;;;;;;;;;-1:-1:-1;1418:567:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1115:157;;;;;;;;;;;;;;;;-1:-1:-1;1115:157:0;;:::i;1308:148:4:-;;;;;;;;;;;;;;;;-1:-1:-1;1308:148:4;;;;:::i;881:131:2:-;;;;;;;;;;;;;;;;-1:-1:-1;881:131:2;;:::i;1651:159:4:-;916:19;924:10;916:7;:19::i;:::-;908:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1733:17:::1;1741:8;1733:7;:17::i;:::-;1732:18;1724:44;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;1778:14;:25:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;1651:159::o;1462:183::-;916:19;924:10;916:7;:19::i;:::-;908:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1543:21:::1;1551:12;1543:7;:21::i;:::-;1542:22;1534:67;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;1618:20;;;::::0;;;:6:::1;:20;::::0;;;;1611:27;;;::::1;::::0;;1462:183::o;1190:112::-;1274:21;;1251:4;1274:21;;;:6;:21;;;;;;;;;1190:112::o;974:113::-;1035:4;1058:5;:22;;;;:5;;:22;;974:113::o;2503:797:0:-;2672:31;2691:11;2672:18;:31::i;:::-;2664:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2758:22;2783:43;2802:11;2815:10;2783:18;:43::i;:::-;2844:13;;:37;;;;;;;;;;;;;;2758:68;;-1:-1:-1;2844:13:0;;;;;:21;;:37;;;;;;;;;;;;;;;:13;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2844:37:0;2836:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2958:23;;;;:10;:23;;;;;;;;2982:10;2958:35;;;;;;;;:40;2937:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3065:59;3082:13;3097;;3112:11;3065:16;:59::i;:::-;3140:153;3174:11;3199:10;3223:15;3252:13;;3279;3140:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3140:153:0;;-1:-1:-1;;;;;;;;3140:153:0;2503:797;;;;;:::o;1018:120:2:-;1132:19:4;1140:10;1132:7;:19::i;:::-;1124:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1092:32:2::1;::::0;;;:19:::1;:32;::::0;;;;:39;;;::::1;1127:4;1092:39;::::0;;1018:120::o;1816:264:4:-;1929:14;;;;1915:10;:28;1907:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1981:14;;;;1973:22;;1981:14;;;;1973:22;;;;;;;;2005;;:6;:22;;;;;:29;;;;;;;;2044;;;;;1816:264::o;3306:261:0:-;3469:27;;;3480:15;;;;;3469:27;;;;;;;;;;;;;;;;;;;;;;3459:38;;;;;;3524:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3514:46;;;;;;3306:261::o;1418:567::-;1521:7;1530;1539:13;1554:7;1585:31;1604:11;1585:18;:31::i;:::-;1577:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1687:31;1706:11;1687:18;:31::i;:::-;1679:5;:39;1671:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1745:36;1784:28;;;:15;:28;;;;;:35;;1813:5;;1784:35;;;;;;;;;;;;;;;1850:17;1784:35;;;;;1850:17;;;;1881:24;;;;;1957:20;;;;1919:24;;;1829:149;;;;;;;;;;;1850:17;1829:149;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1784:35;;-1:-1:-1;1850:17:0;;;;;1881:24;;;;;1919;;1829:149;;1919:24;1829:149;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1418:567;;;;;;;:::o;1115:157::-;1200:7;1230:28;;;:15;:28;;;;;:35;;1115:157::o;1308:148:4:-;916:19;924:10;916:7;:19::i;:::-;908:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1383:17:::1;1391:8;1383:7;:17::i;:::-;1378:72;;1416:16;::::0;::::1;;::::0;;;:6:::1;:16;::::0;;;;:23;;;::::1;1435:4;1416:23;::::0;;1378:72:::1;1308:148:::0;:::o;881:131:2:-;950:4;973:32;;;:19;:32;;;;;;;;;881:131::o;1665:587:3:-;1815:36;1854:38;1880:11;1854:25;:38::i;:::-;1902:23;;;;:10;:23;;;;;;;;1926:10;1902:35;;;;;;;;1940:15;1902:53;;1965:36;;;2011:17;;;:30;;;;;;;;;;;2051:24;;;:41;;;;;1902:35;2051:41;;;;;1965:36;-1:-1:-1;2102:40:3;:24;;;2129:13;;2102:40;:::i;:::-;-1:-1:-1;2175:15:3;2152:20;;;;:38;;;;2200:28;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2152:10;;2200:45;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;2200:45:3;;;;;;;;-1:-1:-1;;;;;1665:587:3:o;1339:320::-;1535:69;;;;;;;;;;;;;;;;;;;1593:10;1535:69;;;;;;;;;;;;;;;;;;;;;;1512:93;;;;;;1624:29::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://a160341cfb14037f854f0e8073417f9fd93eaa1318aa83d3db0f8ce7cede525a
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.