//token.sol
pragma solidity ^0.4.24;
/*import "./Ownable.sol";
*/
contract ERC20Interface {
function totalSupply() public constant returns (uint);
function balanceOf(address tokenOwner) public constant returns (uint balance);
function allowance(address tokenOwner, address spender) public constant returns (uint remaining);
function transfer(address to, uint tokens) public returns (bool success);
function approve(address spender, uint tokens) public returns (bool success);
function transferFrom(address from, address to, uint tokens) public returns (bool success);
event Transfer(address indexed from, address indexed to, uint tokens);
event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}
contract sofoCoin is ERC20Interface {
string constant tokenName = "SofoCoin"; //
string constant symbol = "Sofo";
mapping (address => uint) coinBalance;
mapping(address => mapping (address => uint256)) allowed;
uint decimal = 8; //decimal of 18th for one unit of crncy
uint public totalSupply;
uint public initialSupply ;
address public owner;
/* uint public startDate;
uint public bonusEnds;
uint public endDate; */
constructor() public payable{
totalSupply = 3000000000 * (10 ** decimal);
initialSupply = 1500000000 * (10 ** decimal);
owner = msg.sender;
coinBalance[msg.sender] = initialSupply;
}
function initialSupply() public constant returns(uint){
return initialSupply;
}
function totalSupply() public constant returns (uint){
return totalSupply;
}
function balanceOf(address tokenOwner) public constant returns(uint balance) {
return coinBalance[tokenOwner];
}
function allowance (address tokenOwner,address spender) public constant returns(uint remaining) {
return allowed[tokenOwner][spender];
}
function approve(address spender, uint tokens) public returns (bool success){
uint haveToken = balanceOf(msg.sender);
require (haveToken>= tokens && tokens>0);
allowed[msg.sender][spender] = tokens;//address(msg.sender) -> [address(spender)->token(amount of acess)]
emit Approval(msg.sender, spender, tokens);
return true;
}
function transfer(address to, uint tokens) public returns (bool success){// from any acc to any addres
uint haveToken = balanceOf(msg.sender);
require (haveToken>= tokens && tokens>0);
coinBalance[msg.sender]= coinBalance[msg.sender] - tokens;
coinBalance[to] = coinBalance[to] + tokens;
emit Transfer(msg.sender, to, tokens);
return true;
}
function transferFrom(address from, address to, uint tokens) public returns (bool success){
uint allowedToken = allowance(from , msg.sender);
require (allowedToken>0 && allowedToken>=tokens);
coinBalance[from]= coinBalance[from] - tokens ;
allowed[from][msg.sender] = allowed[from][msg.sender] -tokens;//here msg.sender is the person having acess for acc of person
coinBalance[to] = coinBalance[to] + tokens;
emit Transfer(from, to, tokens);
return true;
}
}
//ico.sol
pragma solidity ^0.4.24;
import "./token.sol";
contract ico {
/* mapping (address => uint) coinBalance;
mapping(address => mapping (address => uint256)) allowed;*/
uint decimal = 18; //decimal of 18th for one unit of crncy
uint public totalSupply ;
uint public initialSupply = address(this).balance;
address public owner;
uint valueOfEther = 1000; // 1000 sofoCoin = 1 ehter
**sofoCoin ercObject;**
event chk(address);
uint public a;
constructor (address tokenaddress) public payable{
**ercObject = sofoCoin(tokenaddress);**
owner = address(this);
totalSupply = ercObject.totalSupply();
}
function burnTokens( uint tokens) public returns(bool res) {
// burn token from qwner acc only burn from intitialSupply
uint haveToken = ercObject.balanceOf(owner);
emit chk(owner);
require (msg.sender==owner && haveToken >= tokens);
**ercObject.coinBalance[owner] = ercObject.coinBalance[owner] - tokens;**
initialSupply = initialSupply-tokens;
return true;
}
function tokenDistribution (address to,uint tokens) private returns(bool res) {
require(msg.sender== owner);
calDiscount(tokens);
return ercObject.transfer(to ,tokens);
}
function calcuateRate (uint amount) internal view returns(uint token){
return amount * (valueOfEther /10^18);
}
function buyToken() public payable {
require(msg.value >= 100000000000000);
uint tokens = calcuateRate(msg.value);
tokens = calDiscount(tokens);
tokens= tokens * (10 ** decimal);
ercObject.transfer(msg.sender, tokens);
}
function calDiscount (uint tokens) view public returns(uint bonus) {
uint coinsDistrubuted = initialSupply - ercObject.coinBalance[owner]; // initially owner have all coins so money distrubuted among the acc is deducted from owner
uint percentage = (100 * coinsDistrubuted) /initialSupply;
if( percentage <=10 || percentage == 0){
bonus = 40;
}
else if( percentage <=20){
bonus = 30;
}
else if(percentage <=30){
bonus = 20;
}
else if(percentage <= 40){
bonus = 10;
}
else{
bonus = 0;
}
tokens = tokens + (tokens/100)*bonus;
tokens = tokens * (10 ** decimal);
return tokens;
}
function mintCoin(uint tokens) public returns(bool res){
uint mintToken = initialSupply+tokens;//initialsupply after minting
require ((msg.sender == owner) && (tokens>0) && (totalSupply>=mintToken));
ercObject.coinBalance[owner] = ercObject.coinBalance[owner] + tokens;
/* initialSupply = coinBalance[owner];*/
initialSupply = initialSupply + tokens;
return true;
}
/* This unnamed function is called whenever someone tries to send ether to it */
function () public {
revert(); // Prevents accidental sending of ether
}
}
i want to access variable from token contract in ico contract , functions are accessible using obj.functionName() but mapping and variables are showing error.
browser/ico.sol:28:9: TypeError: Indexed expression has to be a type, mapping or array (is function (address) view external returns (uint256)) ercObject.coinBalance[owner] = ercObject.coinBalance[owner] - tokens; ^-------------------^