/// <summary> /// Claims unsold tokens /// </summary> /// <returns></returns> public static bool ClaimUnsoldTokens() { bool UnsoldTokensClaimed = Storage.Get(Storage.CurrentContext, StorageKeys.UnsoldTokensClaimed()).AsString() == "1"; //This method can only be executed by the admin account, after the public sale, and can only be called once (use UnsoldTokensClaimed() storage item) if (Helpers.GetBlockTimestamp() >= ICOTemplate.PublicSaleEndTime() && UnsoldTokensClaimed == false && Helpers.VerifyIsAdminAccount()) { byte[] address = ICOTemplate.AdditionalCompanyTokenFund; //Get amount remaining BigInteger amountRemaining = NEP5.CrowdsaleAvailableAmount(); //Add vested amount to account TokenSale.SetVestingPeriodForAddress(address, "company", amountRemaining); //Set total supply Helpers.SetTotalSupply(amountRemaining); //Set the UnsoldTokensClaimed() storage item so ClaimUnsoldTokens() cannot be called again Storage.Put(Storage.CurrentContext, StorageKeys.UnsoldTokensClaimed(), "1"); transfer(null, address, amountRemaining); Runtime.Notify("ClaimUnsoldTokens() tokens allocated", address, amountRemaining); return(true); } return(false); }
/// <summary> /// retrieve information for the received transaction /// </summary> /// <returns>object[] { /// (Transaction)tx, (byte[])sender, (byte)receiver, ulong receivedNEO, ulong receivedGAS, /// (BigInteger)whiteListGroupNumber, (BigInteger)crowdsaleAvailableAmount, (BigInteger)groupMaximumContribution /// (BigInteger)totalTokensPurchased, (BigInteger)neoRemainingAfterPurchase, (BigInteger)gasRemainingAfterPurchase /// (BigInteger)totalContributionBalance /// } /// </returns> public static object[] GetEthTransactionAndSaleData(ulong receivedETH, string ethAddress, byte[] neoAddress) { Transaction tx = (Transaction)ExecutionEngine.ScriptContainer; byte[] sender = neoAddress; byte[] receiver = neoAddress; // only add funds to total received value if receiver is the recipient of the output Runtime.Notify("GetEthTransactionData() Received ETH Deposit type", receiver); BigInteger whiteListGroupNumber = KYC.GetWhitelistGroupNumber(sender); BigInteger crowdsaleAvailableAmount = NEP5.CrowdsaleAvailableAmount(); BigInteger groupMaximumContribution = KYC.GetGroupMaxContribution(whiteListGroupNumber) * NEP5.factor; BigInteger totalTokensPurchased = 0; //ETH minimum must be 0.1 eth if (ICOTemplate.ICOAllowsETH() && receivedETH >= ICOTemplate.EthMinimumContribution()) { //Get the amount of tokens in exchange for contributed ETH. receivedETH is with 18 decimals so divide by 1000000000000000000. BigInteger ethTokenValue = receivedETH * ICOTemplate.ICOEthToTokenExchangeRate() / 1000000000000000000; // there is enough NOS left for this purchase to complete totalTokensPurchased = ethTokenValue; // ensure amountAvailable now reflects number of tokens purchased with ETH } BigInteger totalContributionBalance = BalanceOfSaleContribution(sender) + (totalTokensPurchased * NEP5.factor); return(new object[] { tx, // neo transaction object sender, // who initiated the transfer receiver, // who the assets were sent to ethAddress, // ETH address of contributor receivedETH, // how many neo were transferred whiteListGroupNumber, // what whitelist group is the sender in crowdsaleAvailableAmount, // how many tokens are left to be purchased groupMaximumContribution, // how many tokens can members of this whitelist group purchase totalTokensPurchased, // the total number of tokens purchased in this transaction totalContributionBalance // the total amount of tokens sender has purchased during public sale }); }
/// <summary> /// retrieve information for the received transaction /// </summary> /// <returns>object[] { /// (Transaction)tx, (byte[])sender, (byte)receiver, ulong receivedNEO, ulong receivedGAS, /// (BigInteger)whiteListGroupNumber, (BigInteger)crowdsaleAvailableAmount, (BigInteger)groupMaximumContribution /// (BigInteger)totalTokensPurchased, (BigInteger)neoRemainingAfterPurchase, (BigInteger)gasRemainingAfterPurchase /// (BigInteger)totalContributionBalance /// } /// </returns> public static object[] GetTransactionAndSaleData() { Transaction tx = (Transaction)ExecutionEngine.ScriptContainer; TransactionOutput[] inputs = tx.GetReferences(); TransactionOutput reference = inputs[0]; TransactionOutput[] outputs = tx.GetOutputs(); byte[] sender = reference.ScriptHash; byte[] receiver = ExecutionEngine.ExecutingScriptHash; ulong receivedNEO = 0; ulong receivedGAS = 0; foreach (var input in inputs) { // ensure that the provided inputs are valid if (input.ScriptHash == receiver) { throw new System.Exception(); } } foreach (TransactionOutput output in outputs) { if (output.ScriptHash == receiver) { // only add funds to total received value if receiver is the recipient of the output ulong receivedValue = (ulong)output.Value; Runtime.Notify("GetTransactionData() Received Deposit type", receiver, reference.AssetId); if (reference.AssetId == NEP5.NEO) { receivedNEO += receivedValue; } else if (reference.AssetId == NEP5.GAS) { receivedGAS += receivedValue; } } } BigInteger whiteListGroupNumber = KYC.GetWhitelistGroupNumber(sender); BigInteger crowdsaleAvailableAmount = NEP5.CrowdsaleAvailableAmount(); BigInteger groupMaximumContribution = KYC.GetGroupMaxContribution(whiteListGroupNumber) * NEP5.factor; BigInteger totalTokensPurchased = 0; BigInteger neoRemainingAfterPurchase = 0; BigInteger gasRemainingAfterPurchase = 0; BigInteger runningCrowdsaleAmount = crowdsaleAvailableAmount; if (ICOTemplate.ICOAllowsNEO() && receivedNEO > 0) { BigInteger neoTokenValue = receivedNEO * ICOTemplate.ICONeoToTokenExchangeRate(); if (neoTokenValue > runningCrowdsaleAmount) { // the user is trying to purchase more tokens than are available // figure out how much NOS can be purchased without exceeding the cap neoRemainingAfterPurchase = (neoTokenValue - runningCrowdsaleAmount) / (ICOTemplate.ICONeoToTokenExchangeRate()); totalTokensPurchased = runningCrowdsaleAmount; } else { // there is enough NOS left for this purchase to complete totalTokensPurchased = neoTokenValue; } // ensure amountAvailable now reflects number of tokens purchased with NEO runningCrowdsaleAmount -= totalTokensPurchased; } if (ICOTemplate.ICOAllowsGAS() && receivedGAS > 0) { BigInteger gasTokenValue = receivedGAS * ICOTemplate.ICOGasToTokenExchangeRate(); if (gasTokenValue > runningCrowdsaleAmount) { // the user is trying to purchase more tokens than are available // figure out how much NOS can be purchased without exceeding the cap gasRemainingAfterPurchase = (gasTokenValue - runningCrowdsaleAmount) / (ICOTemplate.ICOGasToTokenExchangeRate()); totalTokensPurchased = totalTokensPurchased + runningCrowdsaleAmount; } else { totalTokensPurchased = totalTokensPurchased + gasTokenValue; } } BigInteger totalContributionBalance = BalanceOfSaleContribution(sender) + totalTokensPurchased; return(new object[] { tx, // neo transaction object sender, // who initiated the transfer receiver, // who the assets were sent to receivedNEO, // how many neo were transferred receivedGAS, // how many gas were transferred whiteListGroupNumber, // what whitelist group is the sender in crowdsaleAvailableAmount, // how many tokens are left to be purchased groupMaximumContribution, // how many tokens can members of this whitelist group purchase totalTokensPurchased, // the total number of tokens purchased in this transaction neoRemainingAfterPurchase, // how much neo is left after purchase of tokens gasRemainingAfterPurchase, // how much gas is left after purchase of tokens totalContributionBalance // the total amount of tokens sender has purchased during public sale }); }