Eth Hodler

A simple non-profit DApp & ERC20 token running on the Ethereum blockchain.

Why?

Want to take a break from trading? Lock your ether and get HODL tokens in exchange.

Weak hands? You can use the Quick withdraw any time!

Get rewarded for hodling : 30 day withdrawal gets a chunk from the fee pot!

Safe, simple contract, audited by 3 independent Solidity developers, plus additional review by the community

No admin keys, no kill switch, no governance

Added 'Fee Pot' game element so it's a fun way to hodl!

About

Eth Hodler a simple contract that allows you to lock up Ether.

This contract has no owner and cannot be modified by anyone.



There are also some other features to make it more fun:

Each deposit to the Eth Hodler locks your ether and issues you with HODL tokens. These tokens

are then used to make a withdrawal and burned once the withdrawal is processed.

A normal withdrawal would take ~30 days to process, costing only the gas fee.

Should the holder want to withdraw their deposit early, they can, but

they must pay a %1 fee. The fees will be added to a fee-pot. Holders can claim

a chunk from the fee-pot, see the rules to find out how.

How To Use

This page is a DApp (Decentralized application) meaning that you'll need an Ethereum browser to use this.



The easiest way to get started is to download the MetaMask extension for Chrome.

MetaMask is currently probably the best way to use at this time as it offers the lest friction.

Rules

Tokens will be issued when sending ETH to the contract: ?

Normal ETH Withdrawal: must wait until after 30 days

Immediate ETH withdrawal: Must pay a 1% fee.

For all Withdrawals: tokens will be destroyed after withdrawal. Ether to be sent back to the address that was holding the tokens.

Tokens pending normal withdrawal will be locked until after 30 days.

While tokens are locked, they cannot be transferred or sent.

While tokens are locked, you cannot add more ETH to the address where the tokens are locked.

When the wait period is over, you must complete the withdrawal manually. If the Fee Pot is not empty, you will automatically claim a reward from the Fee Pot

When claiming the reward from the Fee Pot (Complete Withdrawal), the following formula is used:

reward = feePot * v / totalSupply

Where v is the amount you had when the withdrawal was requested,

totalSupply is the total amount of tokens in circulation at the time when Complete Withdrawal was called.

Where is the amount you had when the withdrawal was requested, is the total amount of tokens in circulation at the time when Complete Withdrawal was called. After withdrawal to ETH, tokens are burned, thus deflating the token supply.

Visual Model

List of exchanges listing the EHDL token

EHDL tokens are trade-able too.

EtherDelta - Decentralized exchange

Security information:

The contract is ownerless and non-upgradable. The Author of the contract does not own the contract, does not have any special access to the contract, this can be verified by reading the source code.

The contract code is kept as simple as possible (KISS).

The contract's source code has been verified through Etherscan and you can read it there yourself

Auditing process and maturity process: The contract went through 3 independent peer reviews, each completed by a different experienced Solidity developer (see reviews posted to Github).

Game theory analysis

If enough holders enter the contract, Price of ETH should go up, because ETH is removed from the market.

Better than normal holding, since holders can claim from the fee-pot, after holding for the minimum time

Should the ETH price spike to say $20,000 USD, immediate withdrawal will still be possible.

HODL tokens may be trade-able on an exchange, and on face value 1 EHDL = 1 ETH, should an exchange add them.

Who is the bigger hodler? Basically the bigger the holder, the bigger chunk the reward they get, and yes, the risk is there that there could suddenly be a larger hodler than you coming in! (The reward is based in the Total Supply, and it will be increased when new ether is locked in, but also decreased in your favour if weak-hands use the quick withdraw)



Mist Wallet - instructions for the professionals

It's much easier to use an Ethereum Browser / MetaMask, but you can also use the Mist wallet by itself if you have the patience. (Or another non-browser wallet that supports contracts / tokens)

ABI / Json interface Here is the Json interface. You may need this if you want to interact with the contract wallets such as Mist [{ "constant": true, "inputs": [], "name": "name", "outputs": [{"name": "", "type": "string"}], "payable": false, "type": "function" }, { "constant": false, "inputs": [{"name": "_spender", "type": "address"}, {"name": "_value", "type": "uint256"}], "name": "approve", "outputs": [{"name": "success", "type": "bool"}], "payable": false, "type": "function" }, { "constant": true, "inputs": [], "name": "totalSupply", "outputs": [{"name": "", "type": "uint256"}], "payable": false, "type": "function" }, { "constant": false, "inputs": [{"name": "_from", "type": "address"}, {"name": "_to", "type": "address"}, { "name": "_value", "type": "uint256" }], "name": "transferFrom", "outputs": [{"name": "success", "type": "bool"}], "payable": false, "type": "function" }, { "constant": true, "inputs": [{"name": "", "type": "address"}], "name": "withdrawalRequests", "outputs": [{"name": "sinceTime", "type": "uint256"}, {"name": "amount", "type": "uint256"}], "payable": false, "type": "function" }, { "constant": true, "inputs": [], "name": "decimals", "outputs": [{"name": "", "type": "uint8"}], "payable": false, "type": "function" }, { "constant": true, "inputs": [], "name": "initialSupply", "outputs": [{"name": "", "type": "uint256"}], "payable": false, "type": "function" }, { "constant": true, "inputs": [], "name": "timeWait", "outputs": [{"name": "", "type": "uint256"}], "payable": false, "type": "function" }, { "constant": true, "inputs": [], "name": "feePot", "outputs": [{"name": "", "type": "uint256"}], "payable": false, "type": "function" }, { "constant": true, "inputs": [], "name": "version", "outputs": [{"name": "", "type": "string"}], "payable": false, "type": "function" }, { "constant": true, "inputs": [{"name": "", "type": "address"}], "name": "balanceOf", "outputs": [{"name": "", "type": "uint256"}], "payable": false, "type": "function" }, { "constant": false, "inputs": [], "name": "quickWithdraw", "outputs": [{"name": "", "type": "bool"}], "payable": true, "type": "function" }, { "constant": false, "inputs": [], "name": "withdrawalComplete", "outputs": [{"name": "", "type": "bool"}], "payable": false, "type": "function" }, { "constant": true, "inputs": [], "name": "symbol", "outputs": [{"name": "", "type": "string"}], "payable": false, "type": "function" }, { "constant": true, "inputs": [{"name": "v", "type": "uint256"}], "name": "calculateFee", "outputs": [{"name": "", "type": "uint256"}], "payable": false, "type": "function" }, { "constant": false, "inputs": [{"name": "_to", "type": "address"}, {"name": "_value", "type": "uint256"}], "name": "transfer", "outputs": [], "payable": false, "type": "function" }, { "constant": false, "inputs": [{"name": "_spender", "type": "address"}, { "name": "_value", "type": "uint256" }, {"name": "_extraData", "type": "bytes"}], "name": "approveAndCall", "outputs": [{"name": "success", "type": "bool"}], "payable": false, "type": "function" }, { "constant": true, "inputs": [{"name": "v", "type": "uint256"}], "name": "calculateReward", "outputs": [{"name": "", "type": "uint256"}], "payable": false, "type": "function" }, { "constant": false, "inputs": [], "name": "withdrawalInitiate", "outputs": [], "payable": false, "type": "function" }, { "constant": true, "inputs": [{"name": "", "type": "address"}, {"name": "", "type": "address"}], "name": "allowance", "outputs": [{"name": "", "type": "uint256"}], "payable": false, "type": "function" }, { "inputs": [{"name": "tokenName", "type": "string"}, { "name": "decimalUnits", "type": "uint8" }, {"name": "tokenSymbol", "type": "string"}], "payable": false, "type": "constructor" }, {"payable": true, "type": "fallback"}, { "anonymous": false, "inputs": [{"indexed": true, "name": "from", "type": "address"}, { "indexed": true, "name": "to", "type": "address" }, {"indexed": false, "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event" }, { "anonymous": false, "inputs": [{"indexed": true, "name": "_owner", "type": "address"}, { "indexed": true, "name": "_spender", "type": "address" }, {"indexed": false, "name": "_value", "type": "uint256"}], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [{"indexed": true, "name": "by", "type": "address"}, { "indexed": false, "name": "amount", "type": "uint256" }, {"indexed": false, "name": "fee", "type": "uint256"}], "name": "WithdrawalQuick", "type": "event" }, { "anonymous": false, "inputs": [{"indexed": true, "name": "by", "type": "address"}, { "indexed": false, "name": "feeRequired", "type": "uint256" }], "name": "IncorrectFee", "type": "event" }, { "anonymous": false, "inputs": [{"indexed": true, "name": "by", "type": "address"}, { "indexed": false, "name": "amount", "type": "uint256" }], "name": "WithdrawalStarted", "type": "event" }, { "anonymous": false, "inputs": [{"indexed": true, "name": "by", "type": "address"}, { "indexed": false, "name": "amount", "type": "uint256" }, {"indexed": false, "name": "reward", "type": "uint256"}], "name": "WithdrawalDone", "type": "event" }, { "anonymous": false, "inputs": [{"indexed": true, "name": "by", "type": "address"}, { "indexed": false, "name": "blocksToWait", "type": "uint256" }], "name": "WithdrawalPremature", "type": "event" }, { "anonymous": false, "inputs": [{"indexed": true, "name": "by", "type": "address"}, { "indexed": false, "name": "amount", "type": "uint256" }], "name": "Deposited", "type": "event" }] Adding the contract to Mist To add to your Mist wallet, go to "Contracts" and choose "+ Watch Contract".

Contract Name: Eth Hodler

Contract Address: 0x47F383f5aCBacc18a3d9ff6F7AF8B49Bfed27C61

Copy and paste the above JSON Interface.

To watch the token, choose "+ Watch Token".

Token Name: Eth Hodler

Token Symbol: EHDL

Decimal Places: 18

(18 decimal places, same as ETH, since 1 ETH = 1 token)

Mist Wallet - Interacting with the contract Doing a normal send to the contract 0x47F383f5aCBacc18a3d9ff6F7AF8B49Bfed27C61 will issue the originating address with HODL tokens. You can send more ETH at any time, but do not send anything while a withdrawal is pending (it will fail). Notice that transaction costs will be taken out, so you'll get slightly less tokens than the amount of ETH sent. When sending ether to the contract, it will need to use about 65051 gas, so make sure that you include enough payment for gas. Typically you'll get a refund for any gas overpayment, but no refund is given if it runs out of gas, so set at about say 80k gas. (Default suggested setting in Mist should be fine) There are two ways to withdraw, one is quick with a fee, the other is 30 days with no fee Mist Wallet - Quick Withdrawal If you need to take out your ETH now, without the waiting period, call the Quick Withdraw function



Go to the Contracts screen, click on the Hodl contract, under "Select Function", then pick "Quick Withdraw".

The "Execute From" should be the address that has the Hodl tokens

For the "Send Ether" field, enter %1 of the Hodl token amount that is stored in that address.

Mist Wallet - Normal Withdrawal Normal withdrawal is free and takes 30 days. The advantage is that you'll

also get a percentage of the fee-pot added to your withdrawal (see rules section).

Go to the Contracts screen, click on the Hodl contract, under "Select Function", pick "Withdrawal Initiate".



The "Execute From" account should be the address that has the Hodl tokens

Once the transaction is sent, that will lock your tokens for 30 days

Send Ether should be 0

Do not attempt to transfer any tokens, add new ETH or withdraw during this time, the transactions will fail

After doing the "Withdrawal Initiate" function, here is how to check how many seconds left to wait:

Enter you address in the "Withdrawal requests" input field.

It will show two attributes: "Since Time" and "Amount"

Use the "Since Time" number in the following calculation:

SecondsToWait = SinceTime - CurrentTime + 2592000

(CurrentTime is the unix timestamp of the current block) If the resulting number is 0 or less, congrats - you are ready to complete the withdrawal (and take some fee-pot)!

After waiting for about 2592000 seconds (30 days) you can complete the withdrawal (and take your share from the fee-pot!) Go to the Contracts screen, click on the Hodl contract, under "Select Function" , then pick "Withdrawal Complete" .

The "Execute From" account should be the address that has the Hodl tokens

Send Ether should be 0

Go to the Contracts screen, click on the Hodl contract, under, then pickTheaccount should be the address that has the Hodl tokensSend Ether should be

Contract's Author

Follow @CurrencyTycoon on Twitter https://twitter.com/CurrencyTycoon

Code

See Eth Hodler on Github.