aboutsummaryrefslogtreecommitdiffstats
path: root/test/compilationTests/corion/moduleHandler.sol
diff options
context:
space:
mode:
Diffstat (limited to 'test/compilationTests/corion/moduleHandler.sol')
-rw-r--r--test/compilationTests/corion/moduleHandler.sol448
1 files changed, 448 insertions, 0 deletions
diff --git a/test/compilationTests/corion/moduleHandler.sol b/test/compilationTests/corion/moduleHandler.sol
new file mode 100644
index 00000000..682f81dd
--- /dev/null
+++ b/test/compilationTests/corion/moduleHandler.sol
@@ -0,0 +1,448 @@
+pragma solidity ^0.4.11;
+
+import "./module.sol";
+import "./announcementTypes.sol";
+import "./multiOwner.sol";
+
+import "./publisher.sol";
+import "./token.sol";
+import "./provider.sol";
+import "./schelling.sol";
+import "./premium.sol";
+import "./ico.sol";
+
+contract abstractModule {
+ function connectModule() external returns (bool success) {}
+ function disconnectModule() external returns (bool success) {}
+ function replaceModule(address addr) external returns (bool success) {}
+ function disableModule(bool forever) external returns (bool success) {}
+ function isActive() public constant returns (bool success) {}
+ function replaceModuleHandler(address newHandler) external returns (bool success) {}
+ function transferEvent(address from, address to, uint256 value) external returns (bool success) {}
+ function newSchellingRoundEvent(uint256 roundID, uint256 reward) external returns (bool success) {}
+}
+
+contract moduleHandler is multiOwner, announcementTypes {
+
+ struct modules_s {
+ address addr;
+ bytes32 name;
+ bool schellingEvent;
+ bool transferEvent;
+ }
+
+ modules_s[] public modules;
+ address public foundationAddress;
+ uint256 debugModeUntil = block.number + 1000000;
+
+ function moduleHandler(address[] newOwners) multiOwner(newOwners) {}
+
+ function load(address foundation, bool forReplace, address Token, address Premium, address Publisher, address Schelling, address Provider) {
+ /*
+ Loading modulest to ModuleHandler.
+
+ This module can be called only once and only by the owner, if every single module and its database are already put on the blockchain.
+ If forReaplace is true, than the ModuleHandler will be replaced. Before the publishing of its replace, the new contract must be already on the blockchain.
+
+ @foundation Address of foundation.
+ @forReplace Is it for replace or not. If not, it will be connected to the module.
+ @Token address of token.
+ @Publisher address of publisher.
+ @Schelling address of Schelling.
+ @Provider address of provider
+ */
+ require( owners[msg.sender] );
+ require( modules.length == 0 );
+ foundationAddress = foundation;
+ addModule( modules_s(Token, sha3('Token'), false, false), ! forReplace);
+ addModule( modules_s(Premium, sha3('Premium'), false, false), ! forReplace);
+ addModule( modules_s(Publisher, sha3('Publisher'), false, true), ! forReplace);
+ addModule( modules_s(Schelling, sha3('Schelling'), false, true), ! forReplace);
+ addModule( modules_s(Provider, sha3('Provider'), true, true), ! forReplace);
+ }
+ function addModule(modules_s input, bool call) internal {
+ /*
+ Inside function for registration of the modules in the database.
+ If the call is false, wont happen any direct call.
+
+ @input _Structure of module.
+ @call Is connect to the module or not.
+ */
+ if ( call ) { require( abstractModule(input.addr).connectModule() ); }
+ var (success, found, id) = getModuleIDByAddress(input.addr);
+ require( success && ! found );
+ (success, found, id) = getModuleIDByHash(input.name);
+ require( success && ! found );
+ (success, found, id) = getModuleIDByAddress(0x00);
+ require( success );
+ if ( ! found ) {
+ id = modules.length;
+ modules.length++;
+ }
+ modules[id] = input;
+ }
+ function getModuleAddressByName(string name) public constant returns( bool success, bool found, address addr ) {
+ /*
+ Search by name for module. The result is an Ethereum address.
+
+ @name Name of module.
+ @addr Address of module.
+ @found Is there any result.
+ @success Was the transaction succesfull or not.
+ */
+ var (_success, _found, _id) = getModuleIDByName(name);
+ if ( _success && _found ) { return (true, true, modules[_id].addr); }
+ return (true, false, 0x00);
+ }
+ function getModuleIDByHash(bytes32 hashOfName) public constant returns( bool success, bool found, uint256 id ) {
+ /*
+ Search by hash of name in the module array. The result is an index array.
+
+ @name Name of module.
+ @id Index of module.
+ @found Was there any result or not.
+ */
+ for ( uint256 a=0 ; a<modules.length ; a++ ) {
+ if ( modules[a].name == hashOfName ) {
+ return (true, true, a);
+ }
+ }
+ return (true, false, 0);
+ }
+ function getModuleIDByName(string name) public constant returns( bool success, bool found, uint256 id ) {
+ /*
+ Search by name for module. The result is an index array.
+
+ @name Name of module.
+ @id Index of module.
+ @found Was there any result or not.
+ */
+ bytes32 _name = sha3(name);
+ for ( uint256 a=0 ; a<modules.length ; a++ ) {
+ if ( modules[a].name == _name ) {
+ return (true, true, a);
+ }
+ }
+ return (true, false, 0);
+ }
+ function getModuleIDByAddress(address addr) public constant returns( bool success, bool found, uint256 id ) {
+ /*
+ Search by ethereum address for module. The result is an index array.
+
+ @name Name of module.
+ @id Index of module.
+ @found Was there any result or not.
+ */
+ for ( uint256 a=0 ; a<modules.length ; a++ ) {
+ if ( modules[a].addr == addr ) {
+ return (true, true, a);
+ }
+ }
+ return (true, false, 0);
+ }
+ function replaceModule(string name, address addr, bool callCallback) external returns (bool success) {
+ /*
+ Module replace, can be called only by the Publisher contract.
+
+ @name Name of module.
+ @addr Address of module.
+ @bool Was there any result or not.
+ @callCallback Call the replaceable module to confirm replacement or not.
+ */
+ var (_success, _found, _id) = getModuleIDByAddress(msg.sender);
+ require( _success );
+ if ( ! ( _found && modules[_id].name == sha3('Publisher') )) {
+ require( block.number < debugModeUntil );
+ if ( ! insertAndCheckDo(calcDoHash("replaceModule", sha3(name, addr, callCallback))) ) {
+ return true;
+ }
+ }
+ (_success, _found, _id) = getModuleIDByName(name);
+ require( _success && _found );
+ if ( callCallback ) {
+ require( abstractModule(modules[_id].addr).replaceModule(addr) );
+ }
+ require( abstractModule(addr).connectModule() );
+ modules[_id].addr = addr;
+ return true;
+ }
+
+ function callReplaceCallback(string moduleName, address newModule) external returns (bool success) {
+ require( block.number < debugModeUntil );
+ if ( ! insertAndCheckDo(calcDoHash("callReplaceCallback", sha3(moduleName, newModule))) ) {
+ return true;
+ }
+ var (_success, _found, _id) = getModuleIDByName(moduleName);
+ require( _success);
+ require( abstractModule(modules[_id].addr).replaceModule(newModule) );
+ return true;
+ }
+
+ function newModule(string name, address addr, bool schellingEvent, bool transferEvent) external returns (bool success) {
+ /*
+ Adding new module to the database. Can be called only by the Publisher contract.
+
+ @name Name of module.
+ @addr Address of module.
+ @schellingEvent Gets it new Schelling round notification?
+ @transferEvent Gets it new transaction notification?
+ @bool Was there any result or not.
+ */
+ var (_success, _found, _id) = getModuleIDByAddress(msg.sender);
+ require( _success );
+ if ( ! ( _found && modules[_id].name == sha3('Publisher') )) {
+ require( block.number < debugModeUntil );
+ if ( ! insertAndCheckDo(calcDoHash("newModule", sha3(name, addr, schellingEvent, transferEvent))) ) {
+ return true;
+ }
+ }
+ addModule( modules_s(addr, sha3(name), schellingEvent, transferEvent), true);
+ return true;
+ }
+ function dropModule(string name, bool callCallback) external returns (bool success) {
+ /*
+ Deleting module from the database. Can be called only by the Publisher contract.
+
+ @name Name of module to delete.
+ @bool Was the function successfull?
+ @callCallback Call the replaceable module to confirm replacement or not.
+ */
+ var (_success, _found, _id) = getModuleIDByAddress(msg.sender);
+ require( _success );
+ if ( ! ( _found && modules[_id].name == sha3('Publisher') )) {
+ require( block.number < debugModeUntil );
+ if ( ! insertAndCheckDo(calcDoHash("replaceModule", sha3(name, callCallback))) ) {
+ return true;
+ }
+ }
+ (_success, _found, _id) = getModuleIDByName(name);
+ require( _success && _found );
+ if( callCallback ) {
+ abstractModule(modules[_id].addr).disableModule(true);
+ }
+ delete modules[_id];
+ return true;
+ }
+
+ function callDisableCallback(string moduleName) external returns (bool success) {
+ require( block.number < debugModeUntil );
+ if ( ! insertAndCheckDo(calcDoHash("callDisableCallback", sha3(moduleName))) ) {
+ return true;
+ }
+ var (_success, _found, _id) = getModuleIDByName(moduleName);
+ require( _success);
+ require( abstractModule(modules[_id].addr).disableModule(true) );
+ return true;
+ }
+
+ function broadcastTransfer(address from, address to, uint256 value) external returns (bool success) {
+ /*
+ Announcing transactions for the modules.
+
+ Can be called only by the token module.
+ Only the configured modules get notifications.( transferEvent )
+
+ @from from who.
+ @to to who.
+ @value amount.
+ @bool Was the function successfull?
+ */
+ var (_success, _found, _id) = getModuleIDByAddress(msg.sender);
+ require( _success && _found && modules[_id].name == sha3('Token') );
+ for ( uint256 a=0 ; a<modules.length ; a++ ) {
+ if ( modules[a].transferEvent && abstractModule(modules[a].addr).isActive() ) {
+ require( abstractModule(modules[a].addr).transferEvent(from, to, value) );
+ }
+ }
+ return true;
+ }
+ function broadcastSchellingRound(uint256 roundID, uint256 reward) external returns (bool success) {
+ /*
+ Announcing new Schelling round for the modules.
+ Can be called only by the Schelling module.
+ Only the configured modules get notifications( schellingEvent ).
+
+ @roundID Number of Schelling round.
+ @reward Coin emission in this Schelling round.
+ @bool Was the function successfull?
+ */
+ var (_success, _found, _id) = getModuleIDByAddress(msg.sender);
+ require( _success && _found && modules[_id].name == sha3('Schelling') );
+ for ( uint256 a=0 ; a<modules.length ; a++ ) {
+ if ( modules[a].schellingEvent && abstractModule(modules[a].addr).isActive() ) {
+ require( abstractModule(modules[a].addr).newSchellingRoundEvent(roundID, reward) );
+ }
+ }
+ return true;
+ }
+ function replaceModuleHandler(address newHandler) external returns (bool success) {
+ /*
+ Replacing ModuleHandler.
+
+ Can be called only by the publisher.
+ Every module will be informed about the ModuleHandler replacement.
+
+ @newHandler Address of the new ModuleHandler.
+ @bool Was the function successfull?
+ */
+ var (_success, _found, _id) = getModuleIDByAddress(msg.sender);
+ require( _success );
+ if ( ! ( _found && modules[_id].name == sha3('Publisher') )) {
+ require( block.number < debugModeUntil );
+ if ( ! insertAndCheckDo(calcDoHash("replaceModuleHandler", sha3(newHandler))) ) {
+ return true;
+ }
+ }
+ for ( uint256 a=0 ; a<modules.length ; a++ ) {
+ require( abstractModule(modules[a].addr).replaceModuleHandler(newHandler) );
+ }
+ return true;
+ }
+ function balanceOf(address owner) public constant returns (bool success, uint256 value) {
+ /*
+ Query of token balance.
+
+ @owner address
+ @value balance.
+ @success was the function successfull?
+ */
+ var (_success, _found, _id) = getModuleIDByName('Token');
+ require( _success && _found );
+ return (true, token(modules[_id].addr).balanceOf(owner));
+ }
+ function totalSupply() public constant returns (bool success, uint256 value) {
+ /*
+ Query of the whole token amount.
+
+ @value amount.
+ @success was the function successfull?
+ */
+ var (_success, _found, _id) = getModuleIDByName('Token');
+ require( _success && _found );
+ return (true, token(modules[_id].addr).totalSupply());
+ }
+ function isICO() public constant returns (bool success, bool ico) {
+ /*
+ Query of ICO state
+
+ @ico Is ICO in progress?.
+ @success was the function successfull?
+ */
+ var (_success, _found, _id) = getModuleIDByName('Token');
+ require( _success && _found );
+ return (true, token(modules[_id].addr).isICO());
+ }
+ function getCurrentSchellingRoundID() public constant returns (bool success, uint256 round) {
+ /*
+ Query of number of the actual Schelling round.
+
+ @round Schelling round.
+ @success was the function successfull?
+ */
+ var (_success, _found, _id) = getModuleIDByName('Schelling');
+ require( _success && _found );
+ return (true, schelling(modules[_id].addr).getCurrentSchellingRoundID());
+ }
+ function mint(address to, uint256 value) external returns (bool success) {
+ /*
+ Token emission request. Can be called only by the provider.
+
+ @to Place of new token
+ @value Token amount
+
+ @success Was the function successfull?
+ */
+ var (_success, _found, _id) = getModuleIDByAddress(msg.sender);
+ require( _success && _found && modules[_id].name == sha3('Provider') );
+ (_success, _found, _id) = getModuleIDByName('Token');
+ require( _success && _found );
+ require( token(modules[_id].addr).mint(to, value) );
+ return true;
+ }
+ function transfer(address from, address to, uint256 value, bool fee) external returns (bool success) {
+ /*
+ Token transaction request. Can be called only by a module.
+
+ @from from who.
+ @to To who.
+ @value Token amount.
+ @fee Transaction fee will be charged or not?
+ @success Was the function successfull?
+ */
+ var (_success, _found, _id) = getModuleIDByAddress(msg.sender);
+ require( _success && _found );
+ (_success, _found, _id) = getModuleIDByName('Token');
+ require( _success && _found );
+ require( token(modules[_id].addr).transferFromByModule(from, to, value, fee) );
+ return true;
+ }
+ function processTransactionFee(address from, uint256 value) external returns (bool success) {
+ /*
+ Token transaction fee. Can be called only by the provider.
+
+ @from From who.
+ @value Token amount.
+ @success Was the function successfull?
+ */
+ var (_success, _found, _id) = getModuleIDByAddress(msg.sender);
+ require( _success && _found && modules[_id].name == sha3('Provider') );
+ (_success, _found, _id) = getModuleIDByName('Token');
+ require( _success && _found );
+ require( token(modules[_id].addr).processTransactionFee(from, value) );
+ return true;
+ }
+ function burn(address from, uint256 value) external returns (bool success) {
+ /*
+ Token burn. Can be called only by Schelling.
+
+ @from From who.
+ @value Token amount.
+ @success Was the function successfull?
+ */
+ var (_success, _found, _id) = getModuleIDByAddress(msg.sender);
+ require( _success && _found && modules[_id].name == sha3('Schelling') );
+ (_success, _found, _id) = getModuleIDByName('Token');
+ require( _success && _found );
+ require( token(modules[_id].addr).burn(from, value) );
+ return true;
+ }
+ function configureModule(string moduleName, announcementType aType, uint256 value) external returns (bool success) {
+ /*
+ Changing configuration of a module. Can be called only by Publisher or while debug mode by owners.
+
+ @moduleName Module name which will be configured
+ @aType Type of variable (announcementType).
+ @value New value
+ @success Was the function successfull?
+ */
+ var (_success, _found, _id) = getModuleIDByAddress(msg.sender);
+ require( _success );
+ if ( ! ( _found && modules[_id].name == sha3('Publisher') )) {
+ require( block.number < debugModeUntil );
+ if ( ! insertAndCheckDo(calcDoHash("configureModule", sha3(moduleName, aType, value))) ) {
+ return true;
+ }
+ }
+ (_success, _found, _id) = getModuleIDByName(moduleName);
+ require( _success && _found );
+ require( schelling(modules[_id].addr).configure(aType, value) );
+ return true;
+ }
+ function freezing(bool forever) external {
+ /*
+ Freezing CORION Platform. Can be called only by the owner.
+ Freez can not be recalled!
+
+ @forever Is it forever or not?
+ */
+ require( owners[msg.sender] );
+ if ( forever ) {
+ if ( ! insertAndCheckDo(calcDoHash("freezing", sha3(forever))) ) {
+ return;
+ }
+ }
+ for ( uint256 a=0 ; a<modules.length ; a++ ) {
+ require( abstractModule(modules[a].addr).disableModule(forever) );
+ }
+ }
+}