create account

(Part 17) Ethereum Solidity - ICO Contract, Basic Security And Token Interaction(PT 17) by igormuba

View this thread on: hive.blogpeakd.comecency.com
· @igormuba ·
$38.20
(Part 17) Ethereum Solidity - ICO Contract, Basic Security And Token Interaction(PT 17)
#### Repository
https://github.com/igormuba/EthereumSolidityClasses/tree/master/class17

#### What Will I Learn?
- Cross-contract interaction
- Creating an ICO contract
- Basic ICO security

#### Requirements

- Internet connection
- Code editor
- Browser

#### Difficulty

- Intermediate

#### Tutorial Contents

In this tutorial, I will teach you the basics of an ICO. I will add a few very basic security features on the contracts, but at this moment I won't cover any standard for security, crowd sales or token development because I want to focus on what are the core features an ICO should have. Though, if you want to learn more about design patterns, I have covered [ERC20](https://steemit.com/utopian-io/@igormuba/part-2-ethereum-solidity-development-deploying-securiy-and-erc20-compliance-pt-2) and [ERC721 and 165](https://steemit.com/utopian-io/@igormuba/part-15-ethereum-solidity-erc165-erc721-their-relation-balances-and-transfer-functions-pt-15) compliance in previous tutorials, though, all of them did not cover crowd sales and ICO patterns.

# Cross contract interaction

[On a previous tutorial](https://steemit.com/utopian-io/@igormuba/part-4-ethereum-solidity-development-inheritance-working-with-multiple-contracts-and-simple-mutability-pt-4) I have introduced how can contracts interact with each other, but in that case I was using that functionality to provide mutability for contract (Solidity contracts are inherently immutable, but that can be hacked!), but, in short, this is how it works

`import "contractYouWantToImport.sol";` by importing a local contract you provide your contract with the signature of the contract it wants to fetch by the network

`contractYouWantToImport externalContract = contractYouWantToImport(INSERT contractYouWantToImport ADDRESS HERE);` this tells the contract what is the signature and the address of the contract you want it to communicate to in the Ethereum network

To call a function from the `contractYouWantToImport` contract, you can normally call it as if `externalContract` is an instantiated object
```
externalContract.externalFunction();
```
where `externalFunction()` is a function from `contractYouWantToImport` contract


# The token contract

The token contract does not follow any standard and is made just to demonstrate how the ICO could work, you can, however, use previous tutorials to make an ERC20 token for example

```
pragma solidity ^0.5.0;

contract simpleToken{
    mapping(address => uint) public balance; //stores token balances of users
    address public icoAddress; //address of the ICO contract
}
```

I am creating a variable the ICO contract because that contract is the one that will manage the creation of tokens. We will, first, deploy the ICO contract, then, this token contract. When deploying the token we will pass the ICO contract by the constructor

```
constructor(address _icoAddress) public {
        icoAddress=_icoAddress; //sets the ICO address
        balance[_icoAddress]=1000; //gives all tokens to the ICO contract
    }
```

# Token creation function on the token contract

Still talking about the token contract, we will now set a function that allows the ICO contract to send funds from its account to the buyer's account.

```
function createToken(address _receiver, uint _amount) public{
        require(msg.sender == icoAddress); //throws error if caller is not the ICO contract
    require(balance[icoAddress]>=0); //requires that ICO contract has the balance
    require(balance[icoAddress]-_amount>=0); //requires that after transfer ICO balance is not negative
        balance[icoAddress]-=_amount; //reduces balance of ICO contract
        balance[_receiver]+=_amount; //increases balance of buyer
    }
```

Notice that in the code above we have implemented 4 security features. The 3 first ones are explicit and obvious
`require(msg.sender == icoAddress)` ensures that only the ICO contract can "create" tokens (transfer from ICO balance to buyer balance)
`require(balance[icoAddress]>=0);` ensures that the ico contract has balance to proceed with the operation
`require(balance[icoAddress]-_amount>=0);` will cancel the call function if the balance after the withdrawal from the ICO token balance is less than zero (if someone tries to buy more than the remaining supply for example)
The last security feature is that the function reduces the balance of the sender before adding to the balance of the receiver. [The DAO hack](https://medium.com/@ogucluturk/the-dao-hack-explained-unfortunate-take-off-of-smart-contracts-2bd8c8db3562) was done by using an exploit that can be prevented by doing transfers in this order!

# Token transfers

This function will allow users to trade and send tokens to each other, though, for not complying with ERC20 yet, as this is not the focus of this tutorial, this token would probably have a hard time being accepted by exchanges

```
    function transfer(address _receiver, uint _amount) public {
        require(balance[msg.sender]>=_amount); //requires the sender to have at least the amount he wants to send
        require(balance[msg.sender]-_amount>=0); // requires that senders balance won't be negative after sending
        balance[msg.sender]-=_amount; //reduces sender balance
        balance[_receiver]+=_amount; //increases receiver balance
    }
```

Again, those 3 security measures are similar to the ones used on the previous function

# Clearing ICO balance

We want that, when the ICO ends, the remaining tokens are burned, to avoid people buying the remaining tokens or for whatever economic reason ICOs like to burn tokens, it is not necessary, but it is a neat cool feature to have, also contributes to security, in my opinion.

```
function clearIcoBalance() public {
        require(msg.sender == icoAddress); //requires that caller is the ICO contract
        balance[msg.sender]=0; //cleans the balance of the sender
    }
```

Notice that we implement 2 security measures, only the ICO contract can call this function, but if someone manages to (I think it is impossible) overcome this requirement, the function cleans the balance of the caller of the function, not the ICO function, in case the caller is the contract, well, then the ICO balance will be clean as expected.

# Get user balance

This last feature is useful for debugging and for users to keep track of their balances, the implementation is very simple
```
    function getMyBalance() public view returns (uint){
        return balance[msg.sender]; //returns balance of caller
    }
```

# The ICO contract

The ICO contract is very simple and does not follow any development standard, though, on future tutorials I will cover standards, as they are important.

```
pragma solidity ^0.5.0;

import "browser/simpleToken.sol"; //imports the token

contract ico{
    simpleToken public token; //we will use this to call the tokens functions
    bool public tokenSet = false; //tells if the token contract is set
    address public tokenCreator; //address of token creator, for security
    bool public icoOver = false; //if ICO has ended or not
}
```

# The ICO constructor

On the constructor of the ICO, we will set the creator of the ICO, for future security measures
```
    constructor() public{
        tokenCreator=msg.sender; //token creator is the creator of ICO contract
    }
```

# Setting the token

This function will store on the ICO contract what is the address of the token we are selling
```
    function setToken(address _tokenAddress) public{ //receives as argument the address  of deployed token
        require(!tokenSet); //throws error if token is already set
        require(msg.sender==tokenCreator); //throws error if caller is not token creator
        token=simpleToken(_tokenAddress); //sets the address of the token
    }
```
Notice a few security measures:
`require(!tokenSet); ` ensures that we can only set the token if the token is not yet set (in case someone tries to change the token address for some reason or by accident)
` require(msg.sender==tokenCreator)` ensures us that only the deployer of the ICO contract can tell the contract what token (address) are we talking about


# Selling the token

This is the function that is responsible for receiving Ethereum payments and sending the tokens to the buyer

```
    function() payable external{
        require(!icoOver); //throes error if ICO is over
        uint amount = msg.value / 1 ether; //the paid value divided by 1Ether
        token.createToken(msg.sender, amount);//tells the token contract to send tokens from contract to buyer
    }
```

On our ICO the price of 1 token is 1 Ether, to keep things simple

# Ending the ICO

At the moment we are implementing a very simple method to end the ICO, you could make it automatic, based on amount sold or based on a set time, but I think that the following function is the basic you need to know for any of those methods mentioned.

```
    function endIco() public{
        require(msg.sender==tokenCreator); //requires caller is token creator
        icoOver=true; //changes ICO status to over
        token.clearIcoBalance; //tells the token to clean the ICO contract token balance
    }
```
Now you can see that this function connects perfectly with the function from the token when the owner of the token tells the contract to end the ICO, the contract will tell the token to clean its balance, and everything just works! Very cool!

# Deploying

According to how we have designed the Token and the ICO, it is mandatory that the ICO contract is deployed first, and just then we deploy the token contract, telling the token contract what is the ICO contract

I am using [Remix browser IDE](http://remix.ethereum.org) on a local JavaScript VM to do the following tests

Using the address 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c (the owner), I deployed the ICO contract, which has the address of 0xdd1f635dfb144068f91d430c76f4219088af9e64

To deploy the `simpleToken` I need to pass to its constructor the address of the ICO
![image.png](https://files.steempeak.com/file/steempeak/igormuba/FiN81VQD-image.png)

By checking the balance of the ICO contract, we can confirm that indeed the balance was created and assigned correctly to the right address
![image.png](https://files.steempeak.com/file/steempeak/igormuba/4DkRrdV4-image.png)

Using the owner address, set the token address on the ICO, else the crowdsale contract won't be able to find what token contract are we talking about
![image.png](https://files.steempeak.com/file/steempeak/igormuba/67gNU3dO-image.png)


# Testing

Now I have switched to the secondary address 0xca35b7d915458ef540ade6068dfe2f44e8fa733c
I have sent 10 Ether to the ICO contract, which activated the fallback (seller) function

![image.png](https://files.steempeak.com/file/steempeak/igormuba/AXBRwi2M-image.png)

The balance of the buyer account is now 10 tokens
![image.png](https://files.steempeak.com/file/steempeak/igormuba/0V8SZki1-image.png)

The balance of the ICO contract is 10 tokens smaller
![image.png](https://files.steempeak.com/file/steempeak/igormuba/krMnH7Hn-image.png)

I want now to send 5 tokens from the buyer 0xca35b7d915458ef540ade6068dfe2f44e8fa733c to a third address 0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db

I can see that after I have sent indeed my balance is lower
![image.png](https://files.steempeak.com/file/steempeak/igormuba/WgFly56N-image.png)

And the receiver balance is equal to the number of tokens I sent him
![image.png](https://files.steempeak.com/file/steempeak/igormuba/HweQ6WPI-image.png)

#### Curriculum
- [(Part 16) Ethereum Solidity - ERC721 Third Party Approval, Transfer, Events And Full Implementation(PT 16)](https://steemit.com/utopian-io/@igormuba/part-16-ethereum-solidity-erc721-third-party-approval-transfer-events-and-full-implementation-pt-16)
- [(Part 15) Ethereum Solidity - ERC165, ERC721, Their Relation, Balances And Transfer Functions(PT 15)](https://steemit.com/utopian-io/@igormuba/part-15-ethereum-solidity-erc165-erc721-their-relation-balances-and-transfer-functions-pt-15)
- [(Part 14) Ethereum Solidity - Token Uniqueness, Non-Fungibility And Transactions With Unique Tokens(PT 14)](https://steemit.com/utopian-io/@igormuba/part-14-ethereum-solidity-token-uniqueness-non-fungibility-and-transacions-with-unique-tokens-pt-14)
- [(Part 13) Ethereum Solidity In Truffle - Testnet Environment Function Calls And Truffle Testing(PT 13)](https://steemit.com/utopian-io/@igormuba/part-13-ethereum-solidity-in-truffle-testnet-environment-function-calls-and-truffle-testing-pt-13)
- [(Part 12) Ethereum Solidity - Using Truffle, Ganache And Zeppelin To Deploy(PT 12)](https://steemit.com/utopian-io/@igormuba/part-12-ethereum-solidity-using-truffle-ganache-and-zeppelin-to-deploy-pt-12)
- [(Part 11) Ethereum Solidity - Multisig Contract As Bank,k Multiple Users, And Where To Implement App Logic(PT 11)](https://steemit.com/utopian-io/@igormuba/part-11-ethereum-solidity-multisig-contract-as-bank-k-multiple-users-and-where-to-implement-app-logic-pt-11)
- [(Part 10) Ethereum Solidity - Multiple inheritances, Diamond Problem And Function Polymorphism(PT 10)](https://steemit.com/utopian-io/@igormuba/part-10-ethereum-solidity-multiple-inheritance-diaomond-problem-and-function-polymorphism-pt-10)
- [(Part 9) Ethereum Solidity Assembly - Return, Memory, Hexadecimal, Pointers, And Memory Addressing(PT 9)](https://steemit.com/utopian-io/@igormuba/part-9-ethereum-solidity-assembly-return-memory-hexadecimal-pointers-and-memory-addressing-pt-9)
- [(Part 8) Ethereum Solidity - Assembly, Reducing Costs And Creation Your Low-Level Expression(PT 8)](https://steemit.com/utopian-io/@igormuba/part-8-ethereum-solidity-assembly-reducing-costs-and-creation-your-low-level-expression-pt-8)
- [(Part 7) Ethereum Solidity - Fallback, Ethereum Fractions, And Collateral Backed Contract(PT 7)](https://steemit.com/utopian-io/@igormuba/part-7-ethereum-solidity-fallback-ethereum-fractions-and-collateral-backed-contract-pt-7)
- [(Part 6) Ethereum Solidity - Custom Variable Functionalities, Libraries, Using Libraries For Security(PT 6)](https://steemit.com/utopian-io/@igormuba/part-6-ethereum-solidity-custom-varaible-functionalities-libraries-using-libraries-for-security-pt-6)
- [(Part 5) Ethereum Solidity - Custom Access Modifiers, Security Breach Alerts, Assert And Require(PT 5)](https://steemit.com/utopian-io/@igormuba/part-4-ethereum-solidity-custom-access-modifiers-security-breach-alerts-assert-and-require-pt-4)
- [(Part 4) Ethereum Solidity Development - Inheritance, Working With Multiple Contracts And Simple Mutability(PT 4)](https://steemit.com/utopian-io/@igormuba/part-4-ethereum-solidity-development-inheritance-working-with-multiple-contracts-and-simple-mutability-pt-4)
- [(Part 3) Ethereum Solidity Development - Contract Mutability, DelegateCall And Calling Functions By Address(PT 3)](https://steemit.com/utopian-io/@igormuba/part-3-ethereum-solidity-development-contract-mutability-delegatecall-and-calling-functions-by-address-pt-3)
- [(Part 2) Ethereum Solidity Development - Deploying, Security And ERC20 Compliance(PT 2)](https://steemit.com/utopian-io/@igormuba/part-2-ethereum-solidity-development-deploying-securiy-and-erc20-compliance-pt-2)
- [(Part 1) Ethereum Solidity Development - Getting Started + Lower Level Explanation (PT 1)](https://steemit.com/utopian-io/@igormuba/part-1-ethereum-solidity-development-getting-started-lower-level-explanation-pt-1)

# Beneficiaries

This post has as beneficiaries
@utopian.pay with 5%
using the SteemPeak beneficiary tool
![image.png](https://files.steempeak.com/file/steempeak/igormuba/CZTbpzrU-image.png)
šŸ‘  , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , and 55 others
properties (23)
authorigormuba
permlinkpart-17-ethereum-solidity-ico-contract-basic-security-and-token-interaction-pt-17
categoryutopian-io
json_metadata{"community":"steempeak","app":"steempeak","format":"markdown","tags":["utopian-io","tutorials","ethereum","solidity","remix"],"users":["igormuba","ogucluturk","utopian.pay"],"links":["https://github.com/igormuba/EthereumSolidityClasses/tree/master/class17","https://steemit.com/utopian-io/@igormuba/part-2-ethereum-solidity-development-deploying-securiy-and-erc20-compliance-pt-2","https://steemit.com/utopian-io/@igormuba/part-15-ethereum-solidity-erc165-erc721-their-relation-balances-and-transfer-functions-pt-15","https://steemit.com/utopian-io/@igormuba/part-4-ethereum-solidity-development-inheritance-working-with-multiple-contracts-and-simple-mutability-pt-4","https://medium.com/@ogucluturk/the-dao-hack-explained-unfortunate-take-off-of-smart-contracts-2bd8c8db3562","http://remix.ethereum.org","https://steemit.com/utopian-io/@igormuba/part-16-ethereum-solidity-erc721-third-party-approval-transfer-events-and-full-implementation-pt-16","https://steemit.com/utopian-io/@igormuba/part-15-ethereum-solidity-erc165-erc721-their-relation-balances-and-transfer-functions-pt-15","https://steemit.com/utopian-io/@igormuba/part-14-ethereum-solidity-token-uniqueness-non-fungibility-and-transacions-with-unique-tokens-pt-14","https://steemit.com/utopian-io/@igormuba/part-13-ethereum-solidity-in-truffle-testnet-environment-function-calls-and-truffle-testing-pt-13"],"image":["https://files.steempeak.com/file/steempeak/igormuba/FiN81VQD-image.png","https://files.steempeak.com/file/steempeak/igormuba/4DkRrdV4-image.png","https://files.steempeak.com/file/steempeak/igormuba/67gNU3dO-image.png","https://files.steempeak.com/file/steempeak/igormuba/AXBRwi2M-image.png","https://files.steempeak.com/file/steempeak/igormuba/0V8SZki1-image.png","https://files.steempeak.com/file/steempeak/igormuba/krMnH7Hn-image.png","https://files.steempeak.com/file/steempeak/igormuba/WgFly56N-image.png","https://files.steempeak.com/file/steempeak/igormuba/HweQ6WPI-image.png","https://files.steempeak.com/file/steempeak/igormuba/CZTbpzrU-image.png"]}
created2019-01-16 20:57:57
last_update2019-01-16 20:57:57
depth0
children6
last_payout2019-01-23 20:57:57
cashout_time1969-12-31 23:59:59
total_payout_value28.566 HBD
curator_payout_value9.631 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length15,692
author_reputation129,824,192,853,800
root_title"(Part 17) Ethereum Solidity - ICO Contract, Basic Security And Token Interaction(PT 17)"
beneficiaries
0.
accountutopian.pay
weight500
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id78,470,395
net_rshares65,443,412,221,533
author_curate_reward""
vote details (119)
@minnowbooster ·
@minnowbooster upvoted this post!
![Calling @originalworks :)](https://upgoat.steemmall.com/?user=igormuba&receiver=igormuba&sender=samm6in&value=0.01&hash=308)
*<sub>img credz: pixabay.com</sub>*
*Nice, you got an awesome upgoat, thanks to @igormuba*
*BuildTeam wishes everyone a bullish new Year!*
*Want a boost? [Minnowbooster's](https://steemit.com/minnowbooster/@minnowbooster/minnowbooster-the-holiday-magic-is-back-for-2019) got your back!*
    
properties (22)
authorminnowbooster
permlinkcomment-1547999645833
categoryutopian-io
json_metadata{"app":"⇐stoned⇔pastries⇒/¹.².³","format":"markdown","tags":["minnowbooster"]}
created2019-01-20 15:54:06
last_update2019-01-20 15:54:06
depth1
children0
last_payout2019-01-27 15:54:06
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length419
author_reputation230,546,282,483,083
root_title"(Part 17) Ethereum Solidity - ICO Contract, Basic Security And Token Interaction(PT 17)"
beneficiaries
0.
accountupgoat
weight10,000
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id78,667,722
net_rshares0
@portugalcoin ·
$11.54
Thank you for your contribution @igormuba.

Good work on developing this tutorial. I suggest you improve the indentation of your code for better reading.

We are waiting for more tutorials.

Your contribution has been evaluated according to [Utopian policies and guidelines](https://join.utopian.io/guidelines), as well as a predefined set of questions pertaining to the category.

To view those questions and the relevant answers related to your post, [click here](https://review.utopian.io/result/8/3-1-1-1-1-2-1-3-).

---- 
Need help? Chat with us on [Discord](https://discord.gg/uTyJkNm).

[[utopian-moderator]](https://join.utopian.io/)
šŸ‘  , , , , , , , , , , , , , , , , , , ,
properties (23)
authorportugalcoin
permlinkre-igormuba-part-17-ethereum-solidity-ico-contract-basic-security-and-token-interaction-pt-17-20190117t215057532z
categoryutopian-io
json_metadata{"tags":["utopian-io"],"users":["igormuba"],"links":["https://join.utopian.io/guidelines","https://review.utopian.io/result/8/3-1-1-1-1-2-1-3-","https://discord.gg/uTyJkNm","https://join.utopian.io/"],"app":"steemit/0.1"}
created2019-01-17 21:50:57
last_update2019-01-17 21:50:57
depth1
children1
last_payout2019-01-24 21:50:57
cashout_time1969-12-31 23:59:59
total_payout_value8.748 HBD
curator_payout_value2.791 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length641
author_reputation599,460,589,822,571
root_title"(Part 17) Ethereum Solidity - ICO Contract, Basic Security And Token Interaction(PT 17)"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id78,518,520
net_rshares18,979,687,460,772
author_curate_reward""
vote details (20)
@utopian-io ·
Thank you for your review, @portugalcoin! Keep up the good work!
properties (22)
authorutopian-io
permlinkre-re-igormuba-part-17-ethereum-solidity-ico-contract-basic-security-and-token-interaction-pt-17-20190117t215057532z-20190120t005721z
categoryutopian-io
json_metadata"{"app": "beem/0.20.17"}"
created2019-01-20 00:57:21
last_update2019-01-20 00:57:21
depth2
children0
last_payout2019-01-27 00:57:21
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length64
author_reputation152,955,367,999,756
root_title"(Part 17) Ethereum Solidity - ICO Contract, Basic Security And Token Interaction(PT 17)"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id78,639,458
net_rshares0
@steem-ua ·
#### Hi @igormuba!

Your post was upvoted by @steem-ua, new Steem dApp, using UserAuthority for algorithmic post curation!
Your post is eligible for our upvote, thanks to our collaboration with @utopian-io!
**Feel free to join our [@steem-ua Discord server](https://discord.gg/KpBNYGz)**
properties (22)
authorsteem-ua
permlinkre-part-17-ethereum-solidity-ico-contract-basic-security-and-token-interaction-pt-17-20190117t220640z
categoryutopian-io
json_metadata"{"app": "beem/0.20.14"}"
created2019-01-17 22:06:42
last_update2019-01-17 22:06:42
depth1
children0
last_payout2019-01-24 22:06:42
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length287
author_reputation23,214,230,978,060
root_title"(Part 17) Ethereum Solidity - ICO Contract, Basic Security And Token Interaction(PT 17)"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id78,519,077
net_rshares0
@steemitboard ·
Congratulations @igormuba! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

<table><tr><td>https://steemitimages.com/60x70/http://steemitboard.com/@igormuba/voted.png?201901162150</td><td>You received more than 7000 upvotes. Your next target is to reach 8000 upvotes.</td></tr>
</table>

<sub>_[Click here to view your Board](https://steemitboard.com/@igormuba)_</sub>
<sub>_If you no longer want to receive notifications, reply to this comment with the word_ `STOP`</sub>



> Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!
properties (22)
authorsteemitboard
permlinksteemitboard-notify-igormuba-20190116t224923000z
categoryutopian-io
json_metadata{"image":["https://steemitboard.com/img/notify.png"]}
created2019-01-16 22:49:24
last_update2019-01-16 22:49:24
depth1
children0
last_payout2019-01-23 22:49:24
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length751
author_reputation38,975,615,169,260
root_title"(Part 17) Ethereum Solidity - ICO Contract, Basic Security And Token Interaction(PT 17)"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id78,473,838
net_rshares0
@utopian-io ·
Hey, @igormuba!

**Thanks for contributing on Utopian**.
We’re already looking forward to your next contribution!

**Get higher incentives and support Utopian.io!**
 Simply set @utopian.pay as a 5% (or higher) payout beneficiary on your contribution post (via [SteemPlus](https://chrome.google.com/webstore/detail/steemplus/mjbkjgcplmaneajhcbegoffkedeankaj?hl=en) or [Steeditor](https://steeditor.app)).

**Want to chat? Join us on Discord https://discord.gg/h52nFrV.**

<a href='https://steemconnect.com/sign/account-witness-vote?witness=utopian-io&approve=1'>Vote for Utopian Witness!</a>
properties (22)
authorutopian-io
permlinkre-part-17-ethereum-solidity-ico-contract-basic-security-and-token-interaction-pt-17-20190118t084621z
categoryutopian-io
json_metadata"{"app": "beem/0.20.9"}"
created2019-01-18 08:46:21
last_update2019-01-18 08:46:21
depth1
children0
last_payout2019-01-25 08:46:21
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length590
author_reputation152,955,367,999,756
root_title"(Part 17) Ethereum Solidity - ICO Contract, Basic Security And Token Interaction(PT 17)"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id78,544,748
net_rshares0