github.com/annchain/OG@v0.0.9/vm/vm_test/contracts/1.sol (about) 1 pragma solidity ^0.4.20; 2 3 /* 4 * Team JUST presents.. 5 * ====================================* 6 * _____ _ _ _ _____ ___ ____ * 7 *| _ |___| | | | | | |_ | \ * 8 *| __| . | | | | | |_ | | | * 9 *|__| |___|_____|__|__| |___|____/ * 10 * * 11 * ====================================* 12 * -> What? 13 * The original autonomous pyramid, improved: 14 * [x] More stable than ever, having withstood severe testnet abuse and attack attempts from our community!. 15 * [x] Audited, tested, and approved by known community security specialists such as tocsick and Arc. 16 * [X] New functionality; you can now perform partial sell orders. If you succumb to weak hands, you don't have to dump all of your bags! 17 * [x] New functionality; you can now transfer tokens between wallets. Trading is now possible from within the contract! 18 * [x] New Feature: PoS Masternodes! The first implementation of Ethereum Staking in the world! Vitalik is mad. 19 * [x] Masternodes: Holding 100 PoWH3D Tokens allow you to generate a Masternode link, Masternode links are used as unique entry points to the contract! 20 * [x] Masternodes: All players who enter the contract through your Masternode have 30% of their 10% dividends fee rerouted from the master-node, to the node-master! 21 * 22 * -> What about the last projects? 23 * Every programming member of the old dev team has been fired and/or killed by 232. 24 * The new dev team consists of seasoned, professional developers and has been audited by veteran solidity experts. 25 * Additionally, two independent testnet iterations have been used by hundreds of people; not a single point of failure was found. 26 * 27 * -> Who worked on this project? 28 * - PonziBot (math/memes/main site/master) 29 * - Mantso (lead solidity dev/lead web3 dev) 30 * - swagg (concept design/feedback/management) 31 * - Anonymous#1 (main site/web3/test cases) 32 * - Anonymous#2 (math formulae/whitepaper) 33 * 34 * -> Who has audited & approved the projected: 35 * - Arc 36 * - tocisck 37 * - sumpunk 38 */ 39 40 contract Hourglass { 41 /*================================= 42 = MODIFIERS = 43 =================================*/ 44 // only people with tokens 45 modifier onlyBagholders() { 46 require(myTokens() > 0); 47 _; 48 } 49 50 // only people with profits 51 modifier onlyStronghands() { 52 require(myDividends(true) > 0); 53 _; 54 } 55 56 // administrators can: 57 // -> change the name of the contract 58 // -> change the name of the token 59 // -> change the PoS difficulty (How many tokens it costs to hold a masternode, in case it gets crazy high later) 60 // they CANNOT: 61 // -> take funds 62 // -> disable withdrawals 63 // -> kill the contract 64 // -> change the price of tokens 65 modifier onlyAdministrator(){ 66 address _customerAddress = msg.sender; 67 require(administrators[keccak256(_customerAddress)]); 68 _; 69 } 70 71 72 // ensures that the first tokens in the contract will be equally distributed 73 // meaning, no divine dump will be ever possible 74 // result: healthy longevity. 75 modifier antiEarlyWhale(uint256 _amountOfEthereum){ 76 address _customerAddress = msg.sender; 77 78 // are we still in the vulnerable phase? 79 // if so, enact anti early whale protocol 80 if( onlyAmbassadors && ((totalEthereumBalance() - _amountOfEthereum) <= ambassadorQuota_ )){ 81 require( 82 // is the customer in the ambassador list? 83 ambassadors_[_customerAddress] == true && 84 85 // does the customer purchase exceed the max ambassador quota? 86 (ambassadorAccumulatedQuota_[_customerAddress] + _amountOfEthereum) <= ambassadorMaxPurchase_ 87 88 ); 89 90 // updated the accumulated quota 91 ambassadorAccumulatedQuota_[_customerAddress] = SafeMath.add(ambassadorAccumulatedQuota_[_customerAddress], _amountOfEthereum); 92 93 // execute 94 _; 95 } else { 96 // in case the ether count drops low, the ambassador phase won't reinitiate 97 onlyAmbassadors = false; 98 _; 99 } 100 101 } 102 103 104 /*============================== 105 = EVENTS = 106 ==============================*/ 107 event onTokenPurchase( 108 address indexed customerAddress, 109 uint256 incomingEthereum, 110 uint256 tokensMinted, 111 address indexed referredBy 112 ); 113 114 event onTokenSell( 115 address indexed customerAddress, 116 uint256 tokensBurned, 117 uint256 ethereumEarned 118 ); 119 120 event onReinvestment( 121 address indexed customerAddress, 122 uint256 ethereumReinvested, 123 uint256 tokensMinted 124 ); 125 126 event onWithdraw( 127 address indexed customerAddress, 128 uint256 ethereumWithdrawn 129 ); 130 131 // ERC20 132 event Transfer( 133 address indexed from, 134 address indexed to, 135 uint256 tokens 136 ); 137 138 139 /*===================================== 140 = CONFIGURABLES = 141 =====================================*/ 142 string public name = "PowH3D"; 143 string public symbol = "P3D"; 144 uint8 constant public decimals = 18; 145 uint8 constant internal dividendFee_ = 10; 146 uint256 constant internal tokenPriceInitial_ = 0.0000001 ether; 147 uint256 constant internal tokenPriceIncremental_ = 0.00000001 ether; 148 uint256 constant internal magnitude = 2**64; 149 150 // proof of stake (defaults at 100 tokens) 151 uint256 public stakingRequirement = 100e18; 152 153 // ambassador program 154 mapping(address => bool) internal ambassadors_; 155 uint256 constant internal ambassadorMaxPurchase_ = 1 ether; 156 uint256 constant internal ambassadorQuota_ = 20 ether; 157 158 159 160 /*================================ 161 = DATASETS = 162 ================================*/ 163 // amount of shares for each address (scaled number) 164 mapping(address => uint256) internal tokenBalanceLedger_; 165 mapping(address => uint256) internal referralBalance_; 166 mapping(address => int256) internal payoutsTo_; 167 mapping(address => uint256) internal ambassadorAccumulatedQuota_; 168 uint256 internal tokenSupply_ = 0; 169 uint256 internal profitPerShare_; 170 171 // administrator list (see above on what they can do) 172 mapping(bytes32 => bool) public administrators; 173 174 // when this is set to true, only ambassadors can purchase tokens (this prevents a whale premine, it ensures a fairly distributed upper pyramid) 175 bool public onlyAmbassadors = true; 176 177 178 179 /*======================================= 180 = PUBLIC FUNCTIONS = 181 =======================================*/ 182 /* 183 * -- APPLICATION ENTRY POINTS -- 184 */ 185 function Hourglass() 186 public 187 { 188 // add administrators here 189 administrators[0xdd8bb99b13fe33e1c32254dfb8fff3e71193f6b730a89dd33bfe5dedc6d83002] = true; 190 191 // add the ambassadors here. 192 // mantso - lead solidity dev & lead web dev. 193 ambassadors_[0x8b4DA1827932D71759687f925D17F81Fc94e3A9D] = true; 194 195 // ponzibot - mathematics & website, and undisputed meme god. 196 ambassadors_[0x8e0d985f3Ec1857BEc39B76aAabDEa6B31B67d53] = true; 197 198 // swagg - concept design, feedback, management. 199 ambassadors_[0x7563A35d5610eE7c9CD330E255Da0e779a644C19] = true; 200 201 // k-dawgz - shilling machine, meme maestro, bizman. 202 ambassadors_[0x215e3C713BADb158A457e61f99325bBB5d278E57] = true; 203 204 // elmojo - all those pretty .GIFs & memes you see? you can thank this man for that. 205 ambassadors_[0xaFF8B5CDCB339eEf5e1100597740a394C7B9c6cA] = true; 206 207 // capex - community moderator. 208 ambassadors_[0x8dc6569c28521560EAF1890bC41b2F3FC2010E1b] = true; 209 210 // jörmungandr - pentests & twitter trendsetter. 211 ambassadors_[0xf14BE3662FE4c9215c27698166759Db6967De94f] = true; 212 213 // inventor - the source behind the non-intrusive referral model. 214 ambassadors_[0x18E90Fc6F70344f53EBd4f6070bf6Aa23e2D748C] = true; 215 216 // tocsick - pentesting, contract auditing. 217 ambassadors_[0x49Aae4D923207e80Fc91E626BCb6532502264dfC] = true; 218 219 // arc - pentesting, contract auditing. 220 ambassadors_[0x3a0cca1A832644B60730E5D4c27947C5De609d62] = true; 221 222 // sumpunk - contract auditing. 223 ambassadors_[0x7ac74Fcc1a71b106F12c55ee8F802C9F672Ce40C] = true; 224 225 // randall - charts & sheets, data dissector, advisor. 226 ambassadors_[0x2b219C2178f099dE4E9A3667d5cCc2cc64da0763] = true; 227 228 // ambius - 3d chart visualization. 229 ambassadors_[0x2A04C7335f90a6bd4e9c4F713DD792200e27F2E6] = true; 230 231 // contributors that need to remain private out of security concerns. 232 ambassadors_[0x35668818ba8F768D4C21787a6f45C86C69394dfD] = true; //dp 233 ambassadors_[0xa3120da52e604aC3Fc80A63813Ef15476e0B6AbD] = true; //tc 234 ambassadors_[0x924E71bA600372e2410285423F1Fe66799b717EC] = true; //ja 235 ambassadors_[0x6Ed450e062C20F929CB7Ee72fCc53e9697980a18] = true; //sf 236 ambassadors_[0x18864A6682c8EB79EEA5B899F11bC94ef9a85ADb] = true; //tb 237 ambassadors_[0x9cC1BdC994b7a847705D19106287C0BF94EF04B5] = true; //sm 238 ambassadors_[0x6926572813ec1438088963f208C61847df435a74] = true; //mc 239 ambassadors_[0xE16Ab764a02Ae03681E351Ac58FE79717c0eE8C6] = true; //et 240 ambassadors_[0x276F4a79F22D1BfC51Bd8dc5b27Bfd934C823932] = true; //sn 241 ambassadors_[0xA2b4ed3E2f4beF09FB35101B76Ef4cB9D3eeCaCf] = true; //bt 242 ambassadors_[0x147fc6b04c95BCE47D013c8d7a200ee434323669] = true; //al 243 244 245 } 246 247 248 /** 249 * Converts all incoming ethereum to tokens for the caller, and passes down the referral addy (if any) 250 */ 251 function buy(address _referredBy) 252 public 253 payable 254 returns(uint256) 255 { 256 purchaseTokens(msg.value, _referredBy); 257 } 258 259 /** 260 * Fallback function to handle ethereum that was send straight to the contract 261 * Unfortunately we cannot use a referral address this way. 262 */ 263 function() 264 payable 265 public 266 { 267 purchaseTokens(msg.value, 0x0); 268 } 269 270 /** 271 * Converts all of caller's dividends to tokens. 272 */ 273 function reinvest() 274 onlyStronghands() 275 public 276 { 277 // fetch dividends 278 uint256 _dividends = myDividends(false); // retrieve ref. bonus later in the code 279 280 // pay out the dividends virtually 281 address _customerAddress = msg.sender; 282 payoutsTo_[_customerAddress] += (int256) (_dividends * magnitude); 283 284 // retrieve ref. bonus 285 _dividends += referralBalance_[_customerAddress]; 286 referralBalance_[_customerAddress] = 0; 287 288 // dispatch a buy order with the virtualized "withdrawn dividends" 289 uint256 _tokens = purchaseTokens(_dividends, 0x0); 290 291 // fire event 292 onReinvestment(_customerAddress, _dividends, _tokens); 293 } 294 295 /** 296 * Alias of sell() and withdraw(). 297 */ 298 function exit() 299 public 300 { 301 // get token count for caller & sell them all 302 address _customerAddress = msg.sender; 303 uint256 _tokens = tokenBalanceLedger_[_customerAddress]; 304 if(_tokens > 0) sell(_tokens); 305 306 // lambo delivery service 307 withdraw(); 308 } 309 310 /** 311 * Withdraws all of the callers earnings. 312 */ 313 function withdraw() 314 onlyStronghands() 315 public 316 { 317 // setup data 318 address _customerAddress = msg.sender; 319 uint256 _dividends = myDividends(false); // get ref. bonus later in the code 320 321 // update dividend tracker 322 payoutsTo_[_customerAddress] += (int256) (_dividends * magnitude); 323 324 // add ref. bonus 325 _dividends += referralBalance_[_customerAddress]; 326 referralBalance_[_customerAddress] = 0; 327 328 // lambo delivery service 329 _customerAddress.transfer(_dividends); 330 331 // fire event 332 onWithdraw(_customerAddress, _dividends); 333 } 334 335 /** 336 * Liquifies tokens to ethereum. 337 */ 338 function sell(uint256 _amountOfTokens) 339 onlyBagholders() 340 public 341 { 342 // setup data 343 address _customerAddress = msg.sender; 344 // russian hackers BTFO 345 require(_amountOfTokens <= tokenBalanceLedger_[_customerAddress]); 346 uint256 _tokens = _amountOfTokens; 347 uint256 _ethereum = tokensToEthereum_(_tokens); 348 uint256 _dividends = SafeMath.div(_ethereum, dividendFee_); 349 uint256 _taxedEthereum = SafeMath.sub(_ethereum, _dividends); 350 351 // burn the sold tokens 352 tokenSupply_ = SafeMath.sub(tokenSupply_, _tokens); 353 tokenBalanceLedger_[_customerAddress] = SafeMath.sub(tokenBalanceLedger_[_customerAddress], _tokens); 354 355 // update dividends tracker 356 int256 _updatedPayouts = (int256) (profitPerShare_ * _tokens + (_taxedEthereum * magnitude)); 357 payoutsTo_[_customerAddress] -= _updatedPayouts; 358 359 // dividing by zero is a bad idea 360 if (tokenSupply_ > 0) { 361 // update the amount of dividends per token 362 profitPerShare_ = SafeMath.add(profitPerShare_, (_dividends * magnitude) / tokenSupply_); 363 } 364 365 // fire event 366 onTokenSell(_customerAddress, _tokens, _taxedEthereum); 367 } 368 369 370 /** 371 * Transfer tokens from the caller to a new holder. 372 * Remember, there's a 10% fee here as well. 373 */ 374 function transfer(address _toAddress, uint256 _amountOfTokens) 375 onlyBagholders() 376 public 377 returns(bool) 378 { 379 // setup 380 address _customerAddress = msg.sender; 381 382 // make sure we have the requested tokens 383 // also disables transfers until ambassador phase is over 384 // ( we dont want whale premines ) 385 require(!onlyAmbassadors && _amountOfTokens <= tokenBalanceLedger_[_customerAddress]); 386 387 // withdraw all outstanding dividends first 388 if(myDividends(true) > 0) withdraw(); 389 390 // liquify 10% of the tokens that are transfered 391 // these are dispersed to shareholders 392 uint256 _tokenFee = SafeMath.div(_amountOfTokens, dividendFee_); 393 uint256 _taxedTokens = SafeMath.sub(_amountOfTokens, _tokenFee); 394 uint256 _dividends = tokensToEthereum_(_tokenFee); 395 396 // burn the fee tokens 397 tokenSupply_ = SafeMath.sub(tokenSupply_, _tokenFee); 398 399 // exchange tokens 400 tokenBalanceLedger_[_customerAddress] = SafeMath.sub(tokenBalanceLedger_[_customerAddress], _amountOfTokens); 401 tokenBalanceLedger_[_toAddress] = SafeMath.add(tokenBalanceLedger_[_toAddress], _taxedTokens); 402 403 // update dividend trackers 404 payoutsTo_[_customerAddress] -= (int256) (profitPerShare_ * _amountOfTokens); 405 payoutsTo_[_toAddress] += (int256) (profitPerShare_ * _taxedTokens); 406 407 // disperse dividends among holders 408 profitPerShare_ = SafeMath.add(profitPerShare_, (_dividends * magnitude) / tokenSupply_); 409 410 // fire event 411 Transfer(_customerAddress, _toAddress, _taxedTokens); 412 413 // ERC20 414 return true; 415 416 } 417 418 /*---------- ADMINISTRATOR ONLY FUNCTIONS ----------*/ 419 /** 420 * In case the amassador quota is not met, the administrator can manually disable the ambassador phase. 421 */ 422 function disableInitialStage() 423 onlyAdministrator() 424 public 425 { 426 onlyAmbassadors = false; 427 } 428 429 /** 430 * In case one of us dies, we need to replace ourselves. 431 */ 432 function setAdministrator(bytes32 _identifier, bool _status) 433 onlyAdministrator() 434 public 435 { 436 administrators[_identifier] = _status; 437 } 438 439 /** 440 * Precautionary measures in case we need to adjust the masternode rate. 441 */ 442 function setStakingRequirement(uint256 _amountOfTokens) 443 onlyAdministrator() 444 public 445 { 446 stakingRequirement = _amountOfTokens; 447 } 448 449 /** 450 * If we want to rebrand, we can. 451 */ 452 function setName(string _name) 453 onlyAdministrator() 454 public 455 { 456 name = _name; 457 } 458 459 /** 460 * If we want to rebrand, we can. 461 */ 462 function setSymbol(string _symbol) 463 onlyAdministrator() 464 public 465 { 466 symbol = _symbol; 467 } 468 469 470 /*---------- HELPERS AND CALCULATORS ----------*/ 471 /** 472 * Method to view the current Ethereum stored in the contract 473 * Example: totalEthereumBalance() 474 */ 475 function totalEthereumBalance() 476 public 477 view 478 returns(uint) 479 { 480 return this.balance; 481 } 482 483 /** 484 * Retrieve the total token supply. 485 */ 486 function totalSupply() 487 public 488 view 489 returns(uint256) 490 { 491 return tokenSupply_; 492 } 493 494 /** 495 * Retrieve the tokens owned by the caller. 496 */ 497 function myTokens() 498 public 499 view 500 returns(uint256) 501 { 502 address _customerAddress = msg.sender; 503 return balanceOf(_customerAddress); 504 } 505 506 /** 507 * Retrieve the dividends owned by the caller. 508 * If `_includeReferralBonus` is to to 1/true, the referral bonus will be included in the calculations. 509 * The reason for this, is that in the frontend, we will want to get the total divs (global + ref) 510 * But in the internal calculations, we want them separate. 511 */ 512 function myDividends(bool _includeReferralBonus) 513 public 514 view 515 returns(uint256) 516 { 517 address _customerAddress = msg.sender; 518 return _includeReferralBonus ? dividendsOf(_customerAddress) + referralBalance_[_customerAddress] : dividendsOf(_customerAddress) ; 519 } 520 521 /** 522 * Retrieve the token balance of any single address. 523 */ 524 function balanceOf(address _customerAddress) 525 view 526 public 527 returns(uint256) 528 { 529 return tokenBalanceLedger_[_customerAddress]; 530 } 531 532 /** 533 * Retrieve the dividend balance of any single address. 534 */ 535 function dividendsOf(address _customerAddress) 536 view 537 public 538 returns(uint256) 539 { 540 return (uint256) ((int256)(profitPerShare_ * tokenBalanceLedger_[_customerAddress]) - payoutsTo_[_customerAddress]) / magnitude; 541 } 542 543 /** 544 * Return the buy price of 1 individual token. 545 */ 546 function sellPrice() 547 public 548 view 549 returns(uint256) 550 { 551 // our calculation relies on the token supply, so we need supply. Doh. 552 if(tokenSupply_ == 0){ 553 return tokenPriceInitial_ - tokenPriceIncremental_; 554 } else { 555 uint256 _ethereum = tokensToEthereum_(1e18); 556 uint256 _dividends = SafeMath.div(_ethereum, dividendFee_ ); 557 uint256 _taxedEthereum = SafeMath.sub(_ethereum, _dividends); 558 return _taxedEthereum; 559 } 560 } 561 562 /** 563 * Return the sell price of 1 individual token. 564 */ 565 function buyPrice() 566 public 567 view 568 returns(uint256) 569 { 570 // our calculation relies on the token supply, so we need supply. Doh. 571 if(tokenSupply_ == 0){ 572 return tokenPriceInitial_ + tokenPriceIncremental_; 573 } else { 574 uint256 _ethereum = tokensToEthereum_(1e18); 575 uint256 _dividends = SafeMath.div(_ethereum, dividendFee_ ); 576 uint256 _taxedEthereum = SafeMath.add(_ethereum, _dividends); 577 return _taxedEthereum; 578 } 579 } 580 581 /** 582 * Function for the frontend to dynamically retrieve the price scaling of buy orders. 583 */ 584 function calculateTokensReceived(uint256 _ethereumToSpend) 585 public 586 view 587 returns(uint256) 588 { 589 uint256 _dividends = SafeMath.div(_ethereumToSpend, dividendFee_); 590 uint256 _taxedEthereum = SafeMath.sub(_ethereumToSpend, _dividends); 591 uint256 _amountOfTokens = ethereumToTokens_(_taxedEthereum); 592 593 return _amountOfTokens; 594 } 595 596 /** 597 * Function for the frontend to dynamically retrieve the price scaling of sell orders. 598 */ 599 function calculateEthereumReceived(uint256 _tokensToSell) 600 public 601 view 602 returns(uint256) 603 { 604 require(_tokensToSell <= tokenSupply_); 605 uint256 _ethereum = tokensToEthereum_(_tokensToSell); 606 uint256 _dividends = SafeMath.div(_ethereum, dividendFee_); 607 uint256 _taxedEthereum = SafeMath.sub(_ethereum, _dividends); 608 return _taxedEthereum; 609 } 610 611 612 /*========================================== 613 = INTERNAL FUNCTIONS = 614 ==========================================*/ 615 function purchaseTokens(uint256 _incomingEthereum, address _referredBy) 616 antiEarlyWhale(_incomingEthereum) 617 internal 618 returns(uint256) 619 { 620 // data setup 621 address _customerAddress = msg.sender; 622 uint256 _undividedDividends = SafeMath.div(_incomingEthereum, dividendFee_); 623 uint256 _referralBonus = SafeMath.div(_undividedDividends, 3); 624 uint256 _dividends = SafeMath.sub(_undividedDividends, _referralBonus); 625 uint256 _taxedEthereum = SafeMath.sub(_incomingEthereum, _undividedDividends); 626 uint256 _amountOfTokens = ethereumToTokens_(_taxedEthereum); 627 uint256 _fee = _dividends * magnitude; 628 629 // no point in continuing execution if OP is a poorfag russian hacker 630 // prevents overflow in the case that the pyramid somehow magically starts being used by everyone in the world 631 // (or hackers) 632 // and yes we know that the safemath function automatically rules out the "greater then" equasion. 633 require(_amountOfTokens > 0 && (SafeMath.add(_amountOfTokens,tokenSupply_) > tokenSupply_)); 634 635 // is the user referred by a masternode? 636 if( 637 // is this a referred purchase? 638 _referredBy != 0x0000000000000000000000000000000000000000 && 639 640 // no cheating! 641 _referredBy != _customerAddress && 642 643 // does the referrer have at least X whole tokens? 644 // i.e is the referrer a godly chad masternode 645 tokenBalanceLedger_[_referredBy] >= stakingRequirement 646 ){ 647 // wealth redistribution 648 referralBalance_[_referredBy] = SafeMath.add(referralBalance_[_referredBy], _referralBonus); 649 } else { 650 // no ref purchase 651 // add the referral bonus back to the global dividends cake 652 _dividends = SafeMath.add(_dividends, _referralBonus); 653 _fee = _dividends * magnitude; 654 } 655 656 // we can't give people infinite ethereum 657 if(tokenSupply_ > 0){ 658 659 // add tokens to the pool 660 tokenSupply_ = SafeMath.add(tokenSupply_, _amountOfTokens); 661 662 // take the amount of dividends gained through this transaction, and allocates them evenly to each shareholder 663 profitPerShare_ += (_dividends * magnitude / (tokenSupply_)); 664 665 // calculate the amount of tokens the customer receives over his purchase 666 _fee = _fee - (_fee-(_amountOfTokens * (_dividends * magnitude / (tokenSupply_)))); 667 668 } else { 669 // add tokens to the pool 670 tokenSupply_ = _amountOfTokens; 671 } 672 673 // update circulating supply & the ledger address for the customer 674 tokenBalanceLedger_[_customerAddress] = SafeMath.add(tokenBalanceLedger_[_customerAddress], _amountOfTokens); 675 676 // Tells the contract that the buyer doesn't deserve dividends for the tokens before they owned them; 677 //really i know you think you do but you don't 678 int256 _updatedPayouts = (int256) ((profitPerShare_ * _amountOfTokens) - _fee); 679 payoutsTo_[_customerAddress] += _updatedPayouts; 680 681 // fire event 682 onTokenPurchase(_customerAddress, _incomingEthereum, _amountOfTokens, _referredBy); 683 684 return _amountOfTokens; 685 } 686 687 /** 688 * Calculate Token price based on an amount of incoming ethereum 689 * It's an algorithm, hopefully we gave you the whitepaper with it in scientific notation; 690 * Some conversions occurred to prevent decimal errors or underflows / overflows in solidity code. 691 */ 692 function ethereumToTokens_(uint256 _ethereum) 693 internal 694 view 695 returns(uint256) 696 { 697 uint256 _tokenPriceInitial = tokenPriceInitial_ * 1e18; 698 uint256 _tokensReceived = 699 ( 700 ( 701 // underflow attempts BTFO 702 SafeMath.sub( 703 (sqrt 704 ( 705 (_tokenPriceInitial**2) 706 + 707 (2*(tokenPriceIncremental_ * 1e18)*(_ethereum * 1e18)) 708 + 709 (((tokenPriceIncremental_)**2)*(tokenSupply_**2)) 710 + 711 (2*(tokenPriceIncremental_)*_tokenPriceInitial*tokenSupply_) 712 ) 713 ), _tokenPriceInitial 714 ) 715 )/(tokenPriceIncremental_) 716 )-(tokenSupply_) 717 ; 718 719 return _tokensReceived; 720 } 721 722 /** 723 * Calculate token sell value. 724 * It's an algorithm, hopefully we gave you the whitepaper with it in scientific notation; 725 * Some conversions occurred to prevent decimal errors or underflows / overflows in solidity code. 726 */ 727 function tokensToEthereum_(uint256 _tokens) 728 internal 729 view 730 returns(uint256) 731 { 732 733 uint256 tokens_ = (_tokens + 1e18); 734 uint256 _tokenSupply = (tokenSupply_ + 1e18); 735 uint256 _etherReceived = 736 ( 737 // underflow attempts BTFO 738 SafeMath.sub( 739 ( 740 ( 741 ( 742 tokenPriceInitial_ +(tokenPriceIncremental_ * (_tokenSupply/1e18)) 743 )-tokenPriceIncremental_ 744 )*(tokens_ - 1e18) 745 ),(tokenPriceIncremental_*((tokens_**2-tokens_)/1e18))/2 746 ) 747 /1e18); 748 return _etherReceived; 749 } 750 751 752 //This is where all your gas goes, sorry 753 //Not sorry, you probably only paid 1 gwei 754 function sqrt(uint x) internal pure returns (uint y) { 755 uint z = (x + 1) / 2; 756 y = x; 757 while (z < y) { 758 y = z; 759 z = (x / z + z) / 2; 760 } 761 } 762 } 763 764 /** 765 * @title SafeMath 766 * @dev Math operations with safety checks that throw on error 767 */ 768 library SafeMath { 769 770 /** 771 * @dev Multiplies two numbers, throws on overflow. 772 */ 773 function mul(uint256 a, uint256 b) internal pure returns (uint256) { 774 if (a == 0) { 775 return 0; 776 } 777 uint256 c = a * b; 778 assert(c / a == b); 779 return c; 780 } 781 782 /** 783 * @dev Integer division of two numbers, truncating the quotient. 784 */ 785 function div(uint256 a, uint256 b) internal pure returns (uint256) { 786 // assert(b > 0); // Solidity automatically throws when dividing by 0 787 uint256 c = a / b; 788 // assert(a == b * c + a % b); // There is no case in which this doesn't hold 789 return c; 790 } 791 792 /** 793 * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). 794 */ 795 function sub(uint256 a, uint256 b) internal pure returns (uint256) { 796 assert(b <= a); 797 return a - b; 798 } 799 800 /** 801 * @dev Adds two numbers, throws on overflow. 802 */ 803 function add(uint256 a, uint256 b) internal pure returns (uint256) { 804 uint256 c = a + b; 805 assert(c >= a); 806 return c; 807 } 808 }