github.com/igggame/nebulas-go@v2.1.0+incompatible/nf/nvm/test/test_ERC20.js (about) 1 // Copyright (C) 2017 go-nebulas authors 2 // 3 // This file is part of the go-nebulas library. 4 // 5 // the go-nebulas library is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // the go-nebulas library is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU General Public License for more details. 14 // 15 // You should have received a copy of the GNU General Public License 16 // along with the go-nebulas library. If not, see <http://www.gnu.org/licenses/>. 17 // 18 'use strict'; 19 20 21 22 var StandardToken = function () { 23 LocalContractStorage.defineProperties(this, { 24 name: null, 25 symbol: null, 26 _totalSupply: null, 27 totalIssued: null 28 }); 29 LocalContractStorage.defineMapProperty(this, "balances"); 30 }; 31 32 StandardToken.prototype = { 33 init: function (name, symbol, totalSupply) { 34 this.name = name; 35 this.symbol = symbol; 36 this._totalSupply = totalSupply; 37 this.totalIssued = 0; 38 }, 39 totalSupply: function () { 40 return this._totalSupply; 41 }, 42 balanceOf: function (owner) { 43 return this.balances.get(owner) || 0; 44 }, 45 transfer: function (to, value) { 46 var balance = this.balanceOf(msg.sender); 47 if (balance < value) { 48 return false; 49 } 50 51 var finalBalance = balance - value; 52 this.balances.set(msg.sender, finalBalance); 53 this.balances.set(to, this.balanceOf(to) + value); 54 return true; 55 }, 56 pay: function (msg, amount) { 57 if (this.totalIssued + amount > this._totalSupply) { 58 throw new Error("too much amount, exceed totalSupply"); 59 } 60 this.balances.set(msg.sender, this.balanceOf(msg.sender) + amount); 61 this.totalIssued += amount; 62 } 63 }; 64 65 var token = new StandardToken(); 66 67 // init. 68 console.log('test: init...'); 69 var assertInitStatus = function (instance) { 70 console.log('test: verify init...'); 71 if (instance.name !== "Nebulas") { 72 throw new Error("name should be Nebulas, but is " + instance.name); 73 } 74 75 if (instance.symbol !== "NAS") { 76 throw new Error("symbol should be NAS, but is " + instance.symbol); 77 } 78 79 if (instance._totalSupply !== 1000000) { 80 throw new Error("totalSupply should be 1000000, but is " + instance._totalSupply); 81 } 82 83 if (instance.totalIssued !== 0) { 84 throw new Error("totalIssued should be 0, but is " + instance.totalIssued); 85 } 86 }; 87 token.init("Nebulas", "NAS", 1000000); 88 assertInitStatus(token); 89 assertInitStatus(new StandardToken()); // assert status for new instance. 90 91 // balance. 92 console.log('test: pay...'); 93 94 var assertAfterPayStatus = function (instance) { 95 console.log('test: verify pay...'); 96 if (instance.totalIssued !== 12) { 97 throw new Error("totalIssued should be 12, but is " + instance.totalIssued); 98 } 99 100 if (instance.balanceOf(msg.sender) !== 12) { 101 throw new Error("robin's balance should be 12, but is " + instance.balanceOf(msg.sender)); 102 } 103 }; 104 const msg = { 105 sender: 'robin' 106 }; 107 token.pay(msg, 12); 108 assertAfterPayStatus(token); 109 assertAfterPayStatus(new StandardToken()); // assert status for new instance. 110 111 console.log('test: pay exceed error...'); 112 var err = new Error("exceed amount should throw exception, but not"); 113 try { 114 token.pay(msg, 999989); 115 } catch (e) { 116 if (e == err) { 117 throw e; 118 } 119 }