The Borderline Illegal Way to Raise Money For Your Brilliant Idea

Sidharth Ramesh
8 min readMay 15, 2018
Photo by Artem Bali on Unsplash

Disclaimer: I am not responsible if you end up in jail. What I am describing is kind of legal now, but may not be in the coming future. Please look up on the law, before you do stuff.

So blockchain technology seems to be all the rage now. Of course, as a naturally curious organism, I started to explore what the whole fuss was about.

I realized that this tech could change so much of what we are wasting time on today. Banking, Governments, Bureaucrats — things that I don’t have a lot of love for, can be redesigned using this new form of trust that we just discovered.

To have some fun and procrastinate, while at the same time get why blockchain technology is such a big deal, watch my video:

But getting back to the point.

I have always hated rule makers. I was the kid in school (I still am), who broke rules just for the sake of breaking them. It gives this good feeling.

So let’s suppose you have this brilliant idea. You want to make a change in the world. You need money. In the world we live today, you will need to register a company, go through 7 weeks of bureaucracy to get all your papers sorted out, and then get your idea scrutinized by another 2 or 3 authorities, and then finally, you can go ahead and start raising money through angel investors or venture capitalists. Some people start running a company and go out for an IPO, an Initial Public Offering, where they offer stocks in their company in return for your investment. Now what are stocks? Well, you just own a part of the companies’ profits, as long as you hold it (These are the same things that are traded in the secondary market and where greedy people lose a lot of money, but also if you just park your money there,you can beat inflation! Horray!)

But screw that. I am not going to register anything. I am not going to sit through weeks of paperwork just so that I can get other some money for my idea. After all, I know that my idea is brilliant, and that people will want to invest in it. So what do I do?

Launch Token Offering on the Blockchain of course.

First, let other people know about your brilliant idea, by making a cool website or something. Convey clearly what it is and how it will work. A whitepaper is great, because that’s what the blockchain community expects. Then, you just need to collect money, and as a proof of their investment, instead of a stock, we will be giving them a “Token” on the blockchain. Which is the equivalent of a stock, but just more shady, because you are actually not promising them anything in return. Yes. People still buy them because they think other people will want it from them at a higher rate.

Like this can actually happen, and it’s actually not illegal because of the disclaimers:

But, let’s not be disheartened by that. Our idea is real, and we want to help millions of people and need the money. Some people will invest because of their greed, Some because they believe in the idea and want to help.

So how can we create this token to distribute to people?

At the simplest level, you create a certain number of tokens and keep it with yourself and trade it with people for another cryptocurrency like ether. So, let’s do that first.

Create a Token on the Ethereum Blockchain

  1. Install Metamask for Chrome
  2. Get some Ether. (0.001 Eth would do just fine, so just buy some on your local exchange or just hit me up.)
  3. Go to https://remix.ethereum.org and copy and paste this code:
pragma solidity ^0.4.13;library SafeMath {/*** @dev Multiplies two numbers, throws on overflow.*/function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {if (a == 0) {return 0;}c = a * b;assert(c / a == b);return c;}/*** @dev Integer division of two numbers, truncating the quotient.*/function div(uint256 a, uint256 b) internal pure returns (uint256) {// assert(b > 0); // Solidity automatically throws when dividing by 0// uint256 c = a / b;// assert(a == b * c + a % b); // There is no case in which this doesn't holdreturn a / b;}/*** @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).*/function sub(uint256 a, uint256 b) internal pure returns (uint256) {assert(b <= a);return a - b;}/*** @dev Adds two numbers, throws on overflow.*/function add(uint256 a, uint256 b) internal pure returns (uint256 c) {c = a + b;assert(c >= a);return c;}}contract ERC20Basic {function totalSupply() public view returns (uint256);function balanceOf(address who) public view returns (uint256);function transfer(address to, uint256 value) public returns (bool);event Transfer(address indexed from, address indexed to, uint256 value);}contract BasicToken is ERC20Basic {using SafeMath for uint256;mapping(address => uint256) balances;uint256 totalSupply_;/*** @dev total number of tokens in existence*/function totalSupply() public view returns (uint256) {return totalSupply_;}/*** @dev transfer token for a specified address* @param _to The address to transfer to.* @param _value The amount to be transferred.*/function transfer(address _to, uint256 _value) public returns (bool) {require(_to != address(0));require(_value <= balances[msg.sender]);balances[msg.sender] = balances[msg.sender].sub(_value);balances[_to] = balances[_to].add(_value);emit Transfer(msg.sender, _to, _value);return true;}/*** @dev Gets the balance of the specified address.* @param _owner The address to query the the balance of.* @return An uint256 representing the amount owned by the passed address.*/function balanceOf(address _owner) public view returns (uint256) {return balances[_owner];}}contract ERC20 is ERC20Basic {function allowance(address owner, address spender) public view returns (uint256);function transferFrom(address from, address to, uint256 value) public returns (bool);function approve(address spender, uint256 value) public returns (bool);event Approval(address indexed owner, address indexed spender, uint256 value);}contract StandardToken is ERC20, BasicToken {mapping (address => mapping (address => uint256)) internal allowed;/*** @dev Transfer tokens from one address to another* @param _from address The address which you want to send tokens from* @param _to address The address which you want to transfer to* @param _value uint256 the amount of tokens to be transferred*/function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {require(_to != address(0));require(_value <= balances[_from]);require(_value <= allowed[_from][msg.sender]);balances[_from] = balances[_from].sub(_value);balances[_to] = balances[_to].add(_value);allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);emit Transfer(_from, _to, _value);return true;}/*** @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.** Beware that changing an allowance with this method brings the risk that someone may use both the old* and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this* race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729* @param _spender The address which will spend the funds.* @param _value The amount of tokens to be spent.*/function approve(address _spender, uint256 _value) public returns (bool) {allowed[msg.sender][_spender] = _value;emit Approval(msg.sender, _spender, _value);return true;}/*** @dev Function to check the amount of tokens that an owner allowed to a spender.* @param _owner address The address which owns the funds.* @param _spender address The address which will spend the funds.* @return A uint256 specifying the amount of tokens still available for the spender.*/function allowance(address _owner, address _spender) public view returns (uint256) {return allowed[_owner][_spender];}/*** @dev Increase the amount of tokens that an owner allowed to a spender.** approve should be called when allowed[_spender] == 0. To increment* allowed value is better to use this function to avoid 2 calls (and wait until* the first transaction is mined)* From MonolithDAO Token.sol* @param _spender The address which will spend the funds.* @param _addedValue The amount of tokens to increase the allowance by.*/function increaseApproval(address _spender, uint _addedValue) public returns (bool) {allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);return true;}/*** @dev Decrease the amount of tokens that an owner allowed to a spender.** approve should be called when allowed[_spender] == 0. To decrement* allowed value is better to use this function to avoid 2 calls (and wait until* the first transaction is mined)* From MonolithDAO Token.sol* @param _spender The address which will spend the funds.* @param _subtractedValue The amount of tokens to decrease the allowance by.*/function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {uint oldValue = allowed[msg.sender][_spender];if (_subtractedValue > oldValue) {allowed[msg.sender][_spender] = 0;} else {allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);}emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);return true;}}

All this is copy paste code from Open-Zeppelin, a library in solidity(the programming language for Ethereum smart contract development) so you don’t have to worry about any security issues. I used truffle and flattened out the code using solidity-flattener (the python package), but you should get the same results copy pasting the code too.

Now paste this after changing the names.

I am calling my token SID COIN with the symbol SID, (cause why not). And I am supplying 1000 of them. Notice that since we mentioned the decimals to be 18, you need to issue the amount you want to issue And follow it by 18 zeroes. So for issuing 1000 tokens, I need to set the totalSupply_ variable to 100000000000000000000. Yeah, good luck counting the zeros.

contract SidCoin is StandardToken {string public name = "SID COIN";string public symbol = "SID";uint8 public decimals = 18;function SidCoin() {totalSupply_ = 100000000000000000000;balances[msg.sender] = totalSupply_;}}

Click on the Deploy button under the Run section, and your metamask wallet should ask for confirmation. Confirm, then wait for the contract creation, and…. you now have your Token on the blockchain!

Exchange it with people who want to give you money, by using a wallet like https://myetherwallet.com that allows you to send Tokens as well. And you can start raising money. Just like that! No one is stopping you from going to venture capital events and sell the investors tokens. Go on a stage get everyone excited! You can give them your token for their fiat money through paper wallets! Go crazy!

Decentralized Exchanges

The real trading begins only when your tokens hit the exchanges. Now you maybe thinking, “wait! How can I get my token to an exchange? I hardly have the money to make a smart contract!” Well, that’s where the ERC20 standard comes in. Since, you created a token according to a standard protocol, people can build decentralized exchanges and trade your token without you even knowing about it.

Conclusion

I hadn't written in a long time, and wanted to share something that I was excited about. There may be many mistakes, since I didn’t check them many times over, so I encourage you to also reference other tutorials like the following.

I don’t really feel like asking anything, because I wrote this, just because I felt like writing. This also happens to be my ethereum address 0x322961F26192d2FeB37f6275093B9FF324098779

--

--

Sidharth Ramesh

Interested in data-driven healthcare. Founder and consultant at Medblocks.