EX1A-3 HLDRS RTS 7 tv501764_ex3-2.htm EXHIBIT 3.2

 

Exhibit 3.2

 

—————————

LDGR Issuer

—————————

 

pragma solidity ^0.4.24;

 

import "../libs/TransferAgentControlled.sol";

import "../libs/Owned.sol";

import "./LDGRSecurity.sol";

 

contract LDGRIssuer is Owned, TransferAgentControlled {

string public name;

address[] securities;

 

event CreateSecurity(

address indexed newSecurity,

string name,

string symbol

);

 

constructor (

address _initialOwner,

address _initialTransferAgent,

string _name

) Owned(_initialOwner) TransferAgentControlled(_initialTransferAgent) public {

name = _name;

}

 

event TransferAgentUpdated(

address indexed previousTransferAgent,

address indexed newTransferAgent

);

 

function setTransferAgent(address _newTransferAgent) public onlyOwner {

_setTransferAgent(_newTransferAgent);

}

 

function _setTransferAgent(address _newTransferAgent) internal {

require(_newTransferAgent != address(0), "Address cannot be 0.");

emit TransferAgentUpdated(transferAgent, _newTransferAgent);

transferAgent = _newTransferAgent;

}

 

function getSecurities() public view returns (address[]) {

return securities;

}

 

   

 

 

function createSecurity(string _name, string _symbol) public onlyTransferAgent returns (address) {

return _createSecurity(_name, _symbol);

}

 

function _createSecurity(string _name, string _symbol) internal returns (address) {

address newSecurity = new LDGRSecurity(this, _name, _symbol);

securities.push(newSecurity);

emit CreateSecurity(newSecurity, _name, _symbol);

return newSecurity;

}

}

 

—————————

LDGR Security

—————————

pragma solidity ^0.4.24;

 

import "../libs/IssuerControlled.sol";

import "./LDGRToken.sol";

 

contract LDGRSecurity is IssuerControlled {

string public name;

string public symbol;

address public token; // main token 0

address[] tokens; // all tokens

 

event CreateToken(

address indexed newToken,

uint256 indexed issuanceNumber

);

 

constructor (

address _issuer,

string _name,

string _symbol

) IssuerControlled(_issuer) public {

name = _name;

symbol = _symbol;

token = new LDGRToken(_issuer, _name, _symbol, 0);

tokens.push(token);

emit CreateToken(token, 0);

}

 

   

 

 

function getAllTokens() public view returns (address[]) {

return tokens;

}

 

function createToken(uint256 _issuanceNumber) public onlyIssuerTransferAgent returns (address) {

return _createToken(_issuanceNumber);

}

 

function _createToken(uint256 _issuanceNumber) internal returns (address) {

LDGRToken newToken = new LDGRToken(issuer, name, symbol, _issuanceNumber);

tokens.push(newToken);

emit CreateToken(newToken, _issuanceNumber);

return newToken;

}

}

 

—————————

LDGR Token

—————————

 

pragma solidity ^0.4.24;

 

/*

Interface for LDGR

*/

 

import "../libs/IssuerControlled.sol";

import "../libs/openzeppelin/math/SafeMath.sol";

 

contract LDGRToken is IssuerControlled {

using SafeMath for uint256;

 

string public name;

string public symbol;

uint256 public issuanceNumber;

mapping(address => uint256) balances;

uint256 public totalSupply;

uint8 public decimals;

 

event Transfer(

address indexed from,

address indexed to,

uint256 value

);

 

   

 

 

event GrantTokens(

address indexed to,

uint256 value

);

 

event RemoveTokens(

address indexed who,

uint256 value

);

 

constructor(

address _issuer,

string _name,

string _symbol,

uint256 _issuanceNumber

) IssuerControlled(_issuer) public {

name = _name;

symbol = _symbol;

issuanceNumber = _issuanceNumber;

decimals = 0;

}

 

function balanceOf(address _investor) public view returns (uint256) {

return balances[_investor];

}

 

function transferFrom(address _from, address _to, uint256 _value) public onlyIssuerTransferAgent returns (bool) {

require(_value <= balances[_from], "Not enough balance.");

require(_to != address(0), "_to is not valid.");

balances[_from] = balances[_from].sub(_value);

balances[_to] = balances[_to].add(_value);

emit Transfer(_from, _to, _value);

return true;

}

 

function grantTokens(address _to, uint256 _value) public onlyIssuerTransferAgent returns (uint256) {

require(_to != address(0), "_to is not valid.");

balances[_to] = balances[_to].add(_value);

totalSupply = totalSupply.add(_value);

emit GrantTokens(_to, _value);

return balances[_to];

}

 

   

 

 

function removeTokens(address _who, uint256 _value) public onlyIssuerTransferAgent returns (uint256) {

require(_value <= balances[_who], "_value cannot be greater than balance.");

balances[_who] = balances[_who].sub(_value);

totalSupply = totalSupply.sub(_value);

emit RemoveTokens(_who, _value);

return balances[_who];

}

}