Golem Network Token


Golem Network Token

Golem Network Token is an Ethereum based ERC20 token which is paid by the user for renting computational power. Providers can freely set their price in GNT as the rental price. Since Golem works as a marketplace, therefore, these prices will reach equilibrium over time. GNT is also required to submit deposits to providers and for participation in the application registry.

Contents

Token Information

Website: https://golem.network/
Forum: https://golemproject.slack.com
Explorer: https://etherscan.io/token/Golem
Exchanges: https://coinmarketcap.com/assets/golem-network-tokens/#markets


Token Contract Information

Symbol: GNT
Name: Golem Network Token
Address: 0xa74476443119a942de498590fe1f2454d7d4ac0d
Decimal places: 18
Available supply: 820,000,000
Total supply: 1,000,000,000


How To Watch The Token Contract In Ethereum Wallet / Mist

In Ethereum Wallet / Mist, select the CONTRACTS tab and click WATCH CONTRACT to open the Watch contract window. Then:

  • Under CONTRACT NAME, enter GNT
  • Under CONTRACT ADDRESS, enter 0xa74476443119a942de498590fe1f2454d7d4ac0d
  • Copy the Application Binary Interface below and paste it into the JSON INTERFACE text box
[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"golemFactory","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_master","type":"address"}],"name":"setMigrationMaster","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"migrate","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"refund","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"migrationMaster","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokenCreationCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_agent","type":"address"}],"name":"setMigrationAgent","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"migrationAgent","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"fundingEndBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalMigrated","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokenCreationMin","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"funding","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokenCreationRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"fundingStartBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"create","outputs":[],"payable":true,"type":"function"},{"inputs":[{"name":"_golemFactory","type":"address"},{"name":"_migrationMaster","type":"address"},{"name":"_fundingStartBlock","type":"uint256"},{"name":"_fundingEndBlock","type":"uint256"}],"type":"constructor"},{"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":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Migrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Refund","type":"event"}] 
  • Click OK
Ext 38dKJsdjh GNTWatchContract.png


How To Watch The Token In Ethereum Wallet / Mist

In Ethereum Wallet / Mist, select the CONTRACTS tab and click WATCH TOKEN to open the Add token window. Then:

  • Under TOKEN CONTRACT ADDRESS, enter 0xa74476443119a942de498590fe1f2454d7d4ac0d. The additional fields should automatically be filled in.
  • Click OK
Ext 38dKJsdjh GNTWatchToken.png


Check Your Token Balance In EtherScan.io

Navigate to https://etherscan.io/. Then:

  • Select the menu TOKEN -> View Tokens
  • Select GOLEM
  • Select the Read Contract tab
  • In the balanceOf field, enter the address you want to check the token balance of
  • Click Query
Ext 38dKJsdjh GNTCheckTokenBalanceEtherScanIo.png

A simpler way to check your token balance is to navigate to https://etherscan.io/. Then:

  • Enter your address into the search box on the top right of the screen
  • Press ENTER
  • Click on the View Token Balances dropdown
Golem wallet 1.png


How To Interact With The Token Smart Contract In Ethereum Wallet / Mist

How To Check Your Token Balance In Ethereum Wallet / Mist

Watch the Contract and Watch the Token as described above. Then:

  • View the GNT contract
  • Click on SHOW CONTRACT INFO
  • In the READ FROM CONTRACT section and under Balance of:
    • Enter the address you want to check the token balance of
    • The token balance will be displayed in the Natural Units with 18 decimal places. e.g., 806451612903225800000 is 806451612903225800000 / 1e18 = 806.4516129032258 token units
Ext 38dKJsdjh GNTCheckTokenBalance.png


How To Transfer Your Tokens In Ethereum Wallet / Mist

Watch the Contract and Watch the Token as described above. Then:

  • View the GNT contract
  • Click on SHOW CONTRACT INFO
  • In the WRITE TO CONTRACT section and under Select function:
    • Select the Transfer function
    • Under to, enter the address you want to transfer your tokens to
    • Under value’, enter the amount of tokens you want to transfer. This amount needs to be specified in the Natural Units with 18 decimal places. e.g., 1230000000000000000 is 1230000000000000000 / 1e18 = 1.23 GNTs
    • Under Execute from, select the account you want to transfer your tokens from
    • Click on Execute, then confirm your transaction
Ext 38dKJsdjh GNTTransferTokens.png


The Token Contract Source Code

Following is the source code from 0xa74476443119a942de498590fe1f2454d7d4ac0d:

  1 pragma solidity ^0.4.4;   2    3    4 /// @title Golem Network Token (GNT) - crowdfunding code for Golem Project   5 contract GolemNetworkToken {   6     string public constant name = "Golem Network Token";   7     string public constant symbol = "GNT";   8     uint8 public constant decimals = 18;  // 18 decimal places, the same as ETH.   9   10     uint256 public constant tokenCreationRate = 1000;  11   12     // The funding cap in weis.  13     uint256 public constant tokenCreationCap = 820000 ether * tokenCreationRate;  14     uint256 public constant tokenCreationMin = 150000 ether * tokenCreationRate;  15   16     uint256 public fundingStartBlock;  17     uint256 public fundingEndBlock;  18   19     // The flag indicates if the GNT contract is in Funding state.  20     bool public funding = true;  21   22     // Receives ETH and its own GNT endowment.  23     address public golemFactory;  24   25     // Has control over token migration to next version of token.  26     address public migrationMaster;  27   28     GNTAllocation lockedAllocation;  29   30     // The current total token supply.  31     uint256 totalTokens;  32   33     mapping (address => uint256) balances;  34   35     address public migrationAgent;  36     uint256 public totalMigrated;  37   38     event Transfer(address indexed _from, address indexed _to, uint256 _value);  39     event Migrate(address indexed _from, address indexed _to, uint256 _value);  40     event Refund(address indexed _from, uint256 _value);  41   42     function GolemNetworkToken(address _golemFactory,  43                                address _migrationMaster,  44                                uint256 _fundingStartBlock,  45                                uint256 _fundingEndBlock) {  46   47         if (_golemFactory == 0) throw;  48         if (_migrationMaster == 0) throw;  49         if (_fundingStartBlock <= block.number) throw;  50         if (_fundingEndBlock   <= _fundingStartBlock) throw;  51   52         lockedAllocation = new GNTAllocation(_golemFactory);  53         migrationMaster = _migrationMaster;  54         golemFactory = _golemFactory;  55         fundingStartBlock = _fundingStartBlock;  56         fundingEndBlock = _fundingEndBlock;  57     }  58   59     /// @notice Transfer `_value` GNT tokens from sender's account  60     /// `msg.sender` to provided account address `_to`.  61     /// @notice This function is disabled during the funding.  62     /// @dev Required state: Operational  63     /// @param _to The address of the tokens recipient  64     /// @param _value The amount of token to be transferred  65     /// @return Whether the transfer was successful or not  66     function transfer(address _to, uint256 _value) returns (bool) {  67         // Abort if not in Operational state.  68         if (funding) throw;  69   70         var senderBalance = balances[msg.sender];  71         if (senderBalance >= _value && _value > 0) {  72             senderBalance -= _value;  73             balances[msg.sender] = senderBalance;  74             balances[_to] += _value;  75             Transfer(msg.sender, _to, _value);  76             return true;  77         }  78         return false;  79     }  80   81     function totalSupply() external constant returns (uint256) {  82         return totalTokens;  83     }  84   85     function balanceOf(address _owner) external constant returns (uint256) {  86         return balances[_owner];  87     }  88   89     // Token migration support:  90   91     /// @notice Migrate tokens to the new token contract.  92     /// @dev Required state: Operational Migration  93     /// @param _value The amount of token to be migrated  94     function migrate(uint256 _value) external {  95         // Abort if not in Operational Migration state.  96         if (funding) throw;  97         if (migrationAgent == 0) throw;  98   99         // Validate input value. 100         if (_value == 0) throw; 101         if (_value > balances[msg.sender]) throw; 102  103         balances[msg.sender] -= _value; 104         totalTokens -= _value; 105         totalMigrated += _value; 106         MigrationAgent(migrationAgent).migrateFrom(msg.sender, _value); 107         Migrate(msg.sender, migrationAgent, _value); 108     } 109  110     /// @notice Set address of migration target contract and enable migration 111     /// process. 112     /// @dev Required state: Operational Normal 113     /// @dev State transition: -> Operational Migration 114     /// @param _agent The address of the MigrationAgent contract 115     function setMigrationAgent(address _agent) external { 116         // Abort if not in Operational Normal state. 117         if (funding) throw; 118         if (migrationAgent != 0) throw; 119         if (msg.sender != migrationMaster) throw; 120         migrationAgent = _agent; 121     } 122  123     function setMigrationMaster(address _master) external { 124         if (msg.sender != migrationMaster) throw; 125         if (_master == 0) throw; 126         migrationMaster = _master; 127     } 128  129     // Crowdfunding: 130  131     /// @notice Create tokens when funding is active. 132     /// @dev Required state: Funding Active 133     /// @dev State transition: -> Funding Success (only if cap reached) 134     function create() payable external { 135         // Abort if not in Funding Active state. 136         // The checks are split (instead of using or operator) because it is 137         // cheaper this way. 138         if (!funding) throw; 139         if (block.number < fundingStartBlock) throw; 140         if (block.number > fundingEndBlock) throw; 141  142         // Do not allow creating 0 or more than the cap tokens. 143         if (msg.value == 0) throw; 144         if (msg.value > (tokenCreationCap - totalTokens) / tokenCreationRate) 145             throw; 146  147         var numTokens = msg.value * tokenCreationRate; 148         totalTokens += numTokens; 149  150         // Assign new tokens to the sender 151         balances[msg.sender] += numTokens; 152  153         // Log token creation event 154         Transfer(0, msg.sender, numTokens); 155     } 156  157     /// @notice Finalize crowdfunding 158     /// @dev If cap was reached or crowdfunding has ended then: 159     /// create GNT for the Golem Factory and developer, 160     /// transfer ETH to the Golem Factory address. 161     /// @dev Required state: Funding Success 162     /// @dev State transition: -> Operational Normal 163     function finalize() external { 164         // Abort if not in Funding Success state. 165         if (!funding) throw; 166         if ((block.number <= fundingEndBlock || 167              totalTokens < tokenCreationMin) && 168             totalTokens < tokenCreationCap) throw; 169  170         // Switch to Operational state. This is the only place this can happen. 171         funding = false; 172  173         // Create additional GNT for the Golem Factory and developers as 174         // the 18% of total number of tokens. 175         // All additional tokens are transfered to the account controller by 176         // GNTAllocation contract which will not allow using them for 6 months. 177         uint256 percentOfTotal = 18; 178         uint256 additionalTokens = 179             totalTokens * percentOfTotal / (100 - percentOfTotal); 180         totalTokens += additionalTokens; 181         balances[lockedAllocation] += additionalTokens; 182         Transfer(0, lockedAllocation, additionalTokens); 183  184         // Transfer ETH to the Golem Factory address. 185         if (!golemFactory.send(this.balance)) throw; 186     } 187  188     /// @notice Get back the ether sent during the funding in case the funding 189     /// has not reached the minimum level. 190     /// @dev Required state: Funding Failure 191     function refund() external { 192         // Abort if not in Funding Failure state. 193         if (!funding) throw; 194         if (block.number <= fundingEndBlock) throw; 195         if (totalTokens >= tokenCreationMin) throw; 196  197         var gntValue = balances[msg.sender]; 198         if (gntValue == 0) throw; 199         balances[msg.sender] = 0; 200         totalTokens -= gntValue; 201  202         var ethValue = gntValue / tokenCreationRate; 203         Refund(msg.sender, ethValue); 204         if (!msg.sender.send(ethValue)) throw; 205     } 206 } 207  208  209 /// @title Migration Agent interface 210 contract MigrationAgent { 211     function migrateFrom(address _from, uint256 _value); 212 } 213  214  215 /// @title GNT Allocation - Time-locked vault of tokens allocated 216 /// to developers and Golem Factory 217 contract GNTAllocation { 218     // Total number of allocations to distribute additional tokens among 219     // developers and the Golem Factory. The Golem Factory has right to 20000 220     // allocations, developers to 10000 allocations, divides among individual 221     // developers by numbers specified in  `allocations` table. 222     uint256 constant totalAllocations = 30000; 223  224     // Addresses of developer and the Golem Factory to allocations mapping. 225     mapping (address => uint256) allocations; 226  227     GolemNetworkToken gnt; 228     uint256 unlockedAt; 229  230     uint256 tokensCreated = 0; 231  232     function GNTAllocation(address _golemFactory) internal { 233         gnt = GolemNetworkToken(msg.sender); 234         unlockedAt = now + 6 * 30 days; 235  236         // For the Golem Factory: 237         allocations[_golemFactory] = 20000; // 12/18 pp of 30000 allocations. 238  239         // For developers: 240         allocations[0x9d3F257827B17161a098d380822fa2614FF540c8] = 2500; // 25.0% of developers' allocations (10000). 241         allocations[0xd7406E50b73972Fa4aa533a881af68B623Ba3F66] =  730; //  7.3% of developers' allocations. 242         allocations[0xd15356D05A7990dE7eC94304B0fD538e550c09C0] =  730; 243         allocations[0x3971D17B62b825b151760E2451F818BfB64489A7] =  730; 244         allocations[0x95e337d09f1bc67681b1cab7ed1125ea2bae5ca8] =  730; 245         allocations[0x0025C58dB686b8CEce05CB8c50C1858b63Aa396E] =  730; 246         allocations[0xB127FC62dE6ca30aAc9D551591daEDdeBB2eFD7A] =  630; //  6.3% of developers' allocations. 247         allocations[0x21AF2E2c240a71E9fB84e90d71c2B2AddE0D0e81] =  630; 248         allocations[0x682AA1C3b3E102ACB9c97B861d595F9fbfF0f1B8] =  630; 249         allocations[0x6edd429c77803606cBd6Bb501CC701a6CAD6be01] =  630; 250         allocations[0x5E455624372FE11b39464e93d41D1F6578c3D9f6] =  310; //  3.1% of developers' allocations. 251         allocations[0xB7c7EaD515Ca275d53e30B39D8EBEdb3F19dA244] =  138; //  1.38% of developers' allocations. 252         allocations[0xD513b1c3fe31F3Fe0b1E42aa8F55e903F19f1730] =  135; //  1.35% of developers' allocations. 253         allocations[0x70cac7f8E404EEFce6526823452e428b5Ab09b00] =  100; //  1.0% of developers' allocations. 254         allocations[0xe0d5861e7be0fac6c85ecde6e8bf76b046a96149] =  100; 255         allocations[0x17488694D2feE4377Ec718836bb9d4910E81D9Cf] =  100; 256         allocations[0xb481372086dEc3ca2FCCD3EB2f462c9C893Ef3C5] =  100; 257         allocations[0xFB6D91E69CD7990651f26a3aa9f8d5a89159fC92] =   70; //  0.7% of developers' allocations. 258         allocations[0xE2ABdAe2980a1447F445cb962f9c0bef1B63EE13] =   70; 259         allocations[0x729A5c0232712caAf365fDd03c39cb361Bd41b1C] =   70; 260         allocations[0x12FBD8fef4903f62e30dD79AC7F439F573E02697] =   70; 261         allocations[0x657013005e5cFAF76f75d03b465cE085d402469A] =   42; //  0.42% of developers' allocations. 262         allocations[0xD0AF9f75EA618163944585bF56aCA98204d0AB66] =   25; //  0.25% of developers' allocations. 263     } 264  265     /// @notice Allow developer to unlock allocated tokens by transferring them 266     /// from GNTAllocation to developer's address. 267     function unlock() external { 268         if (now < unlockedAt) throw; 269  270         // During first unlock attempt fetch total number of locked tokens. 271         if (tokensCreated == 0) 272             tokensCreated = gnt.balanceOf(this); 273  274         var allocation = allocations[msg.sender]; 275         allocations[msg.sender] = 0; 276         var toTransfer = tokensCreated * allocation / totalAllocations; 277  278         // Will fail if allocation (and therefore toTransfer) is 0. 279         if (!gnt.transfer(msg.sender, toTransfer)) throw; 280     } 281 } 

Source

http://theethereum.wiki/

See Also on BitcoinWiki