@@ -104,7 +104,8 @@ contract SecurityTokenRegistry is EternalStorage, Proxy {
104104 address _registrant ,
105105 bool _fromAdmin ,
106106 uint256 _usdFee ,
107- uint256 _polyFee
107+ uint256 _polyFee ,
108+ uint256 _protocolVersion
108109 );
109110 // Emit after ticker registration
110111 event RegisterTicker (
@@ -487,41 +488,64 @@ contract SecurityTokenRegistry is EternalStorage, Proxy {
487488 * @param _ticker is the ticker symbol of the security token
488489 * @param _tokenDetails is the off-chain details of the token
489490 * @param _divisible is whether or not the token is divisible
491+ * @param _protocolVersion Version of securityToken contract
492+ * - `_protocolVersion` is the packed value of uin8[3] array (it will be calculated offchain)
493+ * - if _protocolVersion == 0 then latest version of securityToken will be generated
490494 */
491495 function generateSecurityToken (
492496 string calldata _name ,
493497 string calldata _ticker ,
494498 string calldata _tokenDetails ,
495- bool _divisible
499+ bool _divisible ,
500+ uint256 _protocolVersion
496501 )
497502 external
498503 whenNotPausedOrOwner
499504 {
505+ uint256 protocolVersion = _protocolVersion;
500506 require (bytes (_name).length > 0 && bytes (_ticker).length > 0 , "Bad ticker " );
507+ if (_protocolVersion == 0 ) {
508+ protocolVersion = getUintValue (Encoder.getKey ("latestVersion " ));
509+ }
510+ require (protocolVersion != uint256 (0 ), "Invalid version " );
501511 string memory ticker = Util.upper (_ticker);
502512 bytes32 statusKey = Encoder.getKey ("registeredTickers_status " , ticker);
503513 require (! getBoolValue (statusKey), "Already deployed " );
504514 set (statusKey, true );
505515 require (_tickerOwner (ticker) == msg .sender , "Not authorised " );
506516 /*solium-disable-next-line security/no-block-members*/
507517 require (getUintValue (Encoder.getKey ("registeredTickers_expiryDate " , ticker)) >= now , "Ticker expired " );
508- (uint256 _usdFee , uint256 _polyFee ) = _takeFee (STLAUNCHFEE);
518+ _deployToken (_name, ticker, _tokenDetails, msg .sender , _divisible, protocolVersion);
519+ }
509520
510- address newSecurityTokenAddress = ISTFactory (getAddressValue (Encoder.getKey ("protocolVersionST " , getUintValue (Encoder.getKey ("latestVersion " ))))).deployToken (
521+ function _deployToken (
522+ string memory _name ,
523+ string memory _ticker ,
524+ string memory _tokenDetails ,
525+ address _issuer ,
526+ bool _divisible ,
527+ uint256 _protocolVersion
528+ )
529+ internal
530+ {
531+ (uint256 _usdFee , uint256 _polyFee ) = _takeFee (STLAUNCHFEE);
532+ address newSecurityTokenAddress = ISTFactory (getAddressValue (Encoder.getKey ("protocolVersionST " , _protocolVersion))).deployToken (
511533 _name,
512- ticker ,
534+ _ticker ,
513535 18 ,
514536 _tokenDetails,
515- msg . sender ,
537+ _issuer ,
516538 _divisible,
517539 getAddressValue (POLYMATHREGISTRY)
518540 );
519541
520542 /*solium-disable-next-line security/no-block-members*/
521- _storeSecurityTokenData (newSecurityTokenAddress, ticker , _tokenDetails, now );
522- set (Encoder.getKey ("tickerToSecurityToken " , ticker ), newSecurityTokenAddress);
543+ _storeSecurityTokenData (newSecurityTokenAddress, _ticker , _tokenDetails, now );
544+ set (Encoder.getKey ("tickerToSecurityToken " , _ticker ), newSecurityTokenAddress);
523545 /*solium-disable-next-line security/no-block-members*/
524- emit NewSecurityToken (ticker, _name, newSecurityTokenAddress, msg .sender , now , msg .sender , false , _usdFee, _polyFee);
546+ emit NewSecurityToken (
547+ _ticker, _name, newSecurityTokenAddress, msg .sender , now , msg .sender , false , _usdFee, _polyFee, _protocolVersion
548+ );
525549 }
526550
527551 /**
@@ -543,7 +567,7 @@ contract SecurityTokenRegistry is EternalStorage, Proxy {
543567 )
544568 external
545569 onlyOwner
546- {
570+ {
547571 require (bytes (_name).length > 0 && bytes (_ticker).length > 0 , "Bad data " );
548572 require (bytes (_ticker).length <= 10 , "Bad ticker " );
549573 require (_deployedAt != 0 && _owner != address (0 ), "Bad data " );
@@ -559,7 +583,9 @@ contract SecurityTokenRegistry is EternalStorage, Proxy {
559583 set (Encoder.getKey ("tickerToSecurityToken " , ticker), _securityToken);
560584 _modifyTicker (_owner, ticker, _name, registrationTime, expiryTime, true );
561585 _storeSecurityTokenData (_securityToken, ticker, _tokenDetails, _deployedAt);
562- emit NewSecurityToken (ticker, _name, _securityToken, _owner, _deployedAt, msg .sender , true , uint256 (0 ), uint256 (0 ));
586+ emit NewSecurityToken (
587+ ticker, _name, _securityToken, _owner, _deployedAt, msg .sender , true , uint256 (0 ), uint256 (0 ), 0
588+ );
563589 }
564590
565591 /**
0 commit comments