From 0616ea23bb35c657c44e6a48be2785f128214392 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 8 Sep 2019 21:46:55 +0200 Subject: [PATCH 1/3] chore(efficiency): remove some token sale logic, remove token sale status check in NEP5 transfer, fix transferFrom --- ICOTemplate/ICOTemplate.cs | 36 +--- ICOTemplate/ICOTemplate.csproj | 5 +- ICOTemplate/Token/Administration.cs | 49 +----- ICOTemplate/Token/EthSale.cs | 121 ------------- ICOTemplate/Token/Helpers.cs | 165 +----------------- ICOTemplate/Token/KYC.cs | 100 +---------- ICOTemplate/Token/NEP5.cs | 27 +-- ICOTemplate/Token/TokenSale.cs | 61 ------- ICOTemplate/packages.config | 2 +- .../.signature.p7s | Bin 0 -> 9467 bytes .../Neo.SmartContract.Framework.2.9.3.1.nupkg | Bin 0 -> 28722 bytes .../lib/net40/Neo.SmartContract.Framework.dll | Bin 0 -> 20480 bytes .../Neo.SmartContract.Framework.dll | Bin 0 -> 19968 bytes 13 files changed, 18 insertions(+), 548 deletions(-) delete mode 100644 ICOTemplate/Token/EthSale.cs create mode 100644 packages/Neo.SmartContract.Framework.2.9.3.1/.signature.p7s create mode 100644 packages/Neo.SmartContract.Framework.2.9.3.1/Neo.SmartContract.Framework.2.9.3.1.nupkg create mode 100644 packages/Neo.SmartContract.Framework.2.9.3.1/lib/net40/Neo.SmartContract.Framework.dll create mode 100644 packages/Neo.SmartContract.Framework.2.9.3.1/lib/netstandard1.6/Neo.SmartContract.Framework.dll diff --git a/ICOTemplate/ICOTemplate.cs b/ICOTemplate/ICOTemplate.cs index 09fa416..185a905 100644 --- a/ICOTemplate/ICOTemplate.cs +++ b/ICOTemplate/ICOTemplate.cs @@ -209,11 +209,14 @@ public static object Main(string operation, params object[] args) { if (Runtime.Trigger == TriggerType.Application) { - //Only allow InitSmartContract if contract not initialized and not calling whitelist/KYC operations - if(!Helpers.ContractInitialised() && ((operation != "admin" && (string) args[0] != "InitSmartContract") && operation != "AddAddress" && operation != "RevokeAddress" && operation != "GetGroupNumber" && operation != "crowdsale_status")) + + // test if a nep5 method is being invoked + foreach (string nepMethod in NEP5.GetNEP5Methods()) { - Runtime.Log("Smart Contract not Initialised"); - return false; + if (nepMethod == operation) + { + return NEP5.HandleNEP5Operation(operation, args, ExecutionEngine.CallingScriptHash, ExecutionEngine.EntryScriptHash); + } } if (operation == "admin" && Helpers.VerifyIsAdminAccount()) @@ -230,15 +233,6 @@ public static object Main(string operation, params object[] args) return false; } - // test if a nep5 method is being invoked - foreach (string nepMethod in NEP5.GetNEP5Methods()) - { - if (nepMethod == operation) - { - return NEP5.HandleNEP5Operation(operation, args, ExecutionEngine.CallingScriptHash, ExecutionEngine.EntryScriptHash); - } - } - // test if a kyc method is being invoked foreach (string kycMethod in KYC.GetKYCMethods()) { @@ -257,16 +251,6 @@ public static object Main(string operation, params object[] args) } } - //If MintTokensEth operation - if(operation == "MintTokensEth") - { - // Method can only be called by the ETH contributions listener account - if (Helpers.VerifyWitness(ICOTemplate.EthContributionListenerKey) && Helpers.RequireArgumentLength(args,3)) - { - return EthSale.MintTokensEth((string)args[0], (byte[])args[1], (ulong)args[2]); - } - } - } else if (Runtime.Trigger == TriggerType.Verification) { @@ -274,12 +258,8 @@ public static object Main(string operation, params object[] args) { return true; } - - // test if this transaction is allowed - object[] transactionData = Helpers.GetTransactionAndSaleData(); - return TokenSale.CanUserParticipateInSale(transactionData); } - + return false; } diff --git a/ICOTemplate/ICOTemplate.csproj b/ICOTemplate/ICOTemplate.csproj index f96e6ac..2028e7e 100644 --- a/ICOTemplate/ICOTemplate.csproj +++ b/ICOTemplate/ICOTemplate.csproj @@ -32,8 +32,8 @@ 4 - - ..\packages\Neo.SmartContract.Framework.2.7.3\lib\net40\Neo.SmartContract.Framework.dll + + ..\packages\Neo.SmartContract.Framework.2.9.3.1\lib\net40\Neo.SmartContract.Framework.dll @@ -47,7 +47,6 @@ - diff --git a/ICOTemplate/Token/Administration.cs b/ICOTemplate/Token/Administration.cs index b58d3c4..648ef7e 100644 --- a/ICOTemplate/Token/Administration.cs +++ b/ICOTemplate/Token/Administration.cs @@ -16,7 +16,6 @@ public class Administration : Framework.SmartContract "LockPrivateSaleAllocation", "ContractMigrate", "EnableTransferFromWhitelisting", - "InitSmartContract", "UpdateAdminAddress", "WhitelistTransferFromAdd", "WhitelistTransferFromRemove", @@ -72,8 +71,6 @@ public static object HandleAdministrationOperation(string operation, params obje return false; } return ContractMigrate(args); - case "InitSmartContract": - return InitSmartContract(); case "LockPrivateSaleAllocation": return LockPrivateSaleAllocation(); case "UpdateAdminAddress": @@ -153,51 +150,11 @@ public static bool LockPrivateSaleAllocation() /// public static bool ContractMigrate(object[] args) { - // Contract Migrate(byte[] script, byte[] parameter_list, byte return_type, bool need_storage, string name, string version, string author, string email, string description) - Contract.Migrate((byte[])args[1], (byte[])args[2], (byte)args[3], (bool)args[4], (string)args[5], (string)args[6], (string)args[7], (string)args[8], (string)args[9]); + // Contract Migrate(byte[] script, byte[] parameter_list, byte return_type, ContractPropertyState (using storage), string name, string version, string author, string email, string description) + Contract.Migrate((byte[])args[1], (byte[])args[2], (byte)args[3], (ContractPropertyState)args[4], (string)args[5], (string)args[6], (string)args[7], (string)args[8], (string)args[9]); return true; } - - /// - /// initialise the smart contract for use - /// - /// - public static bool InitSmartContract() - { - if (Helpers.ContractInitialised()) - { - // contract can only be initialised once - Runtime.Log("InitSmartContract() contract already initialised"); - return false; - } - - - uint ContractInitTime = Helpers.GetBlockTimestamp(); - Storage.Put(Storage.CurrentContext, StorageKeys.ContractInitTime(), ContractInitTime); - - // assign pre-allocated tokens to the NosProjectKey() (10,000,000 tokens) - BigInteger immediateProjectAllocationValue = ICOTemplate.ImmediateCompanyReserve() * NEP5.factor; - - - Helpers.SetBalanceOf(ICOTemplate.NosProjectKey, immediateProjectAllocationValue); - transfer(null, ICOTemplate.NosProjectKey, immediateProjectAllocationValue); - - // token allocated to private sale & vested reserves & incentives - BigInteger presaleAllocationMaxValue = ICOTemplate.LockedTokenAllocationAmount() * NEP5.factor; - - // update the total supply to reflect the project allocated tokens - BigInteger totalSupply = immediateProjectAllocationValue + presaleAllocationMaxValue; - Helpers.SetTotalSupply(totalSupply); - - UpdateAdminAddress(ICOTemplate.InitialAdminAccount); - - EnableTransferFromWhitelisting(ICOTemplate.WhitelistTransferFromListings()); - - Runtime.Log("InitSmartContract() contract initialisation complete"); - return true; - } - - + /// /// allow the contract administrator to update the admin address /// diff --git a/ICOTemplate/Token/EthSale.cs b/ICOTemplate/Token/EthSale.cs deleted file mode 100644 index 9c96e6d..0000000 --- a/ICOTemplate/Token/EthSale.cs +++ /dev/null @@ -1,121 +0,0 @@ -using Neo.SmartContract.Framework; -using Neo.SmartContract.Framework.Services.Neo; -using System; -using System.ComponentModel; -using System.Numerics; - -namespace Neo.SmartContract -{ - public class EthSale : Framework.SmartContract - { - - [DisplayName("transfer")] - public static event Action transfer; - - [DisplayName("refundEth")] - public static event Action refundEth; - - /// - /// MintTokensEth is called when a the ETH contribution listener server triggers an Ether receive event - /// - /// - public static bool MintTokensEth(string ethAddress, byte[] neoAddress, ulong ethReceived) - { - - object[] transactionData = Helpers.GetEthTransactionAndSaleData(ethReceived, ethAddress, neoAddress); - Transaction tx = (Transaction)transactionData[0]; - byte[] sender = (byte[])transactionData[1]; - byte[] receiver = (byte[])transactionData[2]; - BigInteger whiteListGroupNumber = (BigInteger)transactionData[5]; - BigInteger crowdsaleAvailableAmount = (BigInteger)transactionData[6]; - BigInteger groupMaximumContribution = (BigInteger)transactionData[7]; - BigInteger totalTokensPurchased = (BigInteger)transactionData[8] * NEP5.factor; - BigInteger totalContributionBalance = (BigInteger)transactionData[9]; - - if (!CanETHUserParticipateInSale(transactionData)) - { - refundEth(ethAddress, ethReceived); - Runtime.Notify("MintTokensEth() CanUserParticipate failed", false); - return false; - } - - if (Helpers.GetBlockTimestamp() >= ICOTemplate.PublicSaleEndTime()) - { - refundEth(ethAddress, ethReceived); - Runtime.Notify("MintTokensEth() failed. Token Sale is closed.", false); - return false; - } - - byte[] lastTransactionHash = Storage.Get(Storage.CurrentContext, StorageKeys.MintTokensEthLastTX()); - if (lastTransactionHash == tx.Hash) - { - // ensure that minTokens doesnt process the same transaction more than once - Runtime.Notify("MintTokensEth() not processing duplicate tx.Hash", tx.Hash); - return false; - } - - BigInteger tokenTotalSupply = NEP5.TotalSupply(); - - Storage.Put(Storage.CurrentContext, StorageKeys.MintTokensEthLastTX(), tx.Hash); - Runtime.Notify("MintTokensEth() receivedETH", ethReceived); - - BigInteger senderAmountSubjectToVesting = TokenSale.SubjectToVestingPeriod(sender); - BigInteger newTokenBalance = NEP5.BalanceOf(sender) + totalTokensPurchased + senderAmountSubjectToVesting; - - Helpers.SetBalanceOf(sender, newTokenBalance); - Helpers.SetBalanceOfSaleContribution(sender, totalContributionBalance); - Helpers.SetTotalSupply(totalTokensPurchased); - - transfer(null, sender, totalTokensPurchased); - return true; - } - - /// - /// determine if ETH user can participate in the token sale - /// - /// - /// - public static bool CanETHUserParticipateInSale(object[] transactionData) - { - Transaction tx = (Transaction)transactionData[0]; - byte[] sender = (byte[])transactionData[1]; - byte[] receiver = (byte[])transactionData[2]; - string ethAddress = (string)transactionData[3]; - ulong receivedETH = (ulong)transactionData[4]; - BigInteger whiteListGroupNumber = (BigInteger)transactionData[5]; - BigInteger crowdsaleAvailableAmount = (BigInteger)transactionData[6]; - BigInteger groupMaximumContribution = (BigInteger)transactionData[7]; - BigInteger totalTokensPurchased = (BigInteger)transactionData[8]; - BigInteger totalContributionBalance = (BigInteger)transactionData[9]; - - if (whiteListGroupNumber <= 0) - { - Runtime.Notify("CanUserParticipate() sender is not whitelisted", sender); - return false; - } - - if (!KYC.GroupParticipationIsUnlocked((int)whiteListGroupNumber)) - { - Runtime.Notify("CanUserParticipate() sender cannot participate yet", sender); - return false; - } - - if (crowdsaleAvailableAmount <= 0) - { - // total supply has been exhausted - Runtime.Notify("CanUserParticipate() crowdsaleAvailableAmount is <= 0", crowdsaleAvailableAmount); - return false; - } - - if (totalContributionBalance > groupMaximumContribution) - { - // don't allow this purchase exceed the group cap - Runtime.Notify("CanUserParticipate() senders purchase in ETH will exceed maxContribution cap", sender, totalContributionBalance, groupMaximumContribution); - return false; - } - - return true; - } - - } -} \ No newline at end of file diff --git a/ICOTemplate/Token/Helpers.cs b/ICOTemplate/Token/Helpers.cs index b1ba5cc..4c308c3 100644 --- a/ICOTemplate/Token/Helpers.cs +++ b/ICOTemplate/Token/Helpers.cs @@ -98,170 +98,7 @@ public static uint GetContractInitTime() { return (uint)Storage.Get(Storage.CurrentContext, StorageKeys.ContractInitTime()).AsBigInteger(); } - - /// - /// retrieve information for the received transaction - /// - /// 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 - /// } - /// - 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 - }; - } - - /// - /// retrieve information for the received transaction - /// - /// 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 - /// } - /// - 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 - }; - } - + /// /// test if a contract address is a whitelisted TransferFrom /// diff --git a/ICOTemplate/Token/KYC.cs b/ICOTemplate/Token/KYC.cs index 57449c0..8b4d458 100644 --- a/ICOTemplate/Token/KYC.cs +++ b/ICOTemplate/Token/KYC.cs @@ -54,61 +54,9 @@ public static object HandleKYCOperation(string operation, params object[] args) return Blockchain.GetHeight(); } - switch (operation) - { - case "AddAddress": - // add an address to the kyc whitelist - if (!Helpers.RequireArgumentLength(args, 2)) - { - return false; - } - return AddAddress((byte[])args[0], (int)args[1]); - case "GetGroupMaxContribution": - // get the maximum amount of NOS that can be purchased for group - if (!Helpers.RequireArgumentLength(args, 1)) - { - return false; - } - return GetGroupMaxContribution((BigInteger)args[0]); - case "GetGroupUnlockTime": - // allow people to check the block height their group will be unlocked (uint) - if (!Helpers.RequireArgumentLength(args, 1)) - { - return false; - } - return GetGroupUnlockTime((BigInteger)args[0]); - case "RevokeAddress": - // remove an address to the kyc whitelist - if (!Helpers.RequireArgumentLength(args, 1)) - { - return false; - } - return RevokeAddress((byte[])args[0]); - - } - - return false; - } - - /// - /// add an address to the kyc whitelist - /// - /// - public static bool AddAddress(byte[] address, int groupNumber) - { - if (address.Length != 20 || groupNumber <= 0 || groupNumber > 4) - { - return false; - } - - if (Helpers.VerifyWitness(ICOTemplate.KycMiddlewareKey)) - { - StorageMap kycWhitelist = Storage.CurrentContext.CreateMap(StorageKeys.KYCWhitelistPrefix()); - kycWhitelist.Put(address, groupNumber); - return true; - } return false; } + /// /// determine if the given address is whitelisted by testing if group number > 0 @@ -126,52 +74,6 @@ public static bool AddressIsWhitelisted(byte[] address) return whitelisted > 0; } - /// - /// get the maximum number of NOS that can be purchased by groupNumber during the public sale - /// - /// - /// - public static BigInteger GetGroupMaxContribution(BigInteger groupNumber) - { - BigInteger maxContribution = 0; - uint latestTimeStamp = Helpers.GetBlockTimestamp(); - uint publicSaleMaxContribution = (uint)ICOTemplate.MaximumContributionAmount(); - uint publicSaleEndTime = (uint)ICOTemplate.PublicSaleEndTime(); - - //If latest block timestamp is larger than presale start and smaller than presale end: check presale tier contributions. - if (latestTimeStamp >= (uint)ICOTemplate.PresaleStartTime() && latestTimeStamp <= (uint)ICOTemplate.PresaleEndTime()) - { - //Presale has not ended. Only presale can participate. - if (groupNumber == 1) - { - //Pre-sale tier 1. - maxContribution = (uint)ICOTemplate.PresaleTierOne(); - } - else if (groupNumber == 2) - { - //Pre-sale tier 2. - maxContribution = (uint)ICOTemplate.PresaleTierTwo(); - } - else if (groupNumber == 3) - { - //Pre-sale tier 3. - maxContribution = (uint)ICOTemplate.PresaleTierThree(); - } - else if(groupNumber == 4) - { - //Tier 4 - maxContribution = (uint)ICOTemplate.PresaleTierFour(); - } - } - //Otherwise we're in the public sale; get the publicSaleMaxContribution - //publicSaleMaxContribution returns the max contribution based on the presale phase using Helpers.GetPublicSaleMaxContribution() - else if (groupNumber > 0 && groupNumber <= 4 && latestTimeStamp >= (uint)ICOTemplate.PublicSaleStartTime() && latestTimeStamp <= publicSaleEndTime) - { - maxContribution = publicSaleMaxContribution; - } - - return maxContribution; - } /// /// helper method to retrieve the stored group unlock block height diff --git a/ICOTemplate/Token/NEP5.cs b/ICOTemplate/Token/NEP5.cs index 5bc1d88..05b9cd9 100644 --- a/ICOTemplate/Token/NEP5.cs +++ b/ICOTemplate/Token/NEP5.cs @@ -34,8 +34,7 @@ public class NEP5 : Framework.SmartContract /// public static string[] GetNEP5Methods() => new string[] { "name", "symbol", "decimals", "totalSupply", "balanceOf", - "transfer", "transferFrom", "approve", "allowance", - "crowdsale_available_amount", "mintTokens" + "transfer", "transferFrom", "approve", "allowance" }; [DisplayName("transfer")] @@ -129,16 +128,6 @@ public static object HandleNEP5Operation(string operation, object[] args, byte[] return Allowance((byte[])args[0], (byte[])args[1]); } - // check how many tokens left for purchase - if (operation == "crowdsale_available_amount") - { - return CrowdsaleAvailableAmount(); - } - - if (operation == "mintTokens") - { - return TokenSale.MintTokens(); - } return false; } @@ -264,12 +253,6 @@ public static BigInteger TotalSupply() /// public static bool Transfer(byte[] from, byte[] to, BigInteger amount, byte[] caller, byte[] entry) { - if(Helpers.GetBlockTimestamp() < ICOTemplate.PublicSaleEndTime()) - { - Runtime.Log("Transfer() not available before ICOTemplate.PublicSaleEndTime()"); - return false; - } - if (caller != entry && !Helpers.IsContractWhitelistedTransferFrom(caller)) { from = caller; @@ -334,12 +317,6 @@ public static bool Transfer(byte[] from, byte[] to, BigInteger amount, byte[] ca /// public static bool TransferFrom(byte[] originator, byte[] from, byte[] to, BigInteger amount, byte[] caller, byte[] entry) { - if (Helpers.GetBlockTimestamp() < ICOTemplate.PublicSaleEndTime()) - { - Runtime.Log("TransferFrom() not available before ICOTemplate.PublicSaleEndTime()"); - return false; - } - if (caller != entry && !Helpers.IsContractWhitelistedTransferFrom(caller)) { originator = caller; @@ -389,7 +366,7 @@ public static bool TransferFrom(byte[] originator, byte[] from, byte[] to, BigIn BigInteger newBalance = fromBalance - amount; Helpers.SetBalanceOf(from, newBalance + senderAmountSubjectToVesting); // remove balance from originating account Helpers.SetBalanceOf(to, recipientBalance + recipientAmountSubjectToVesting + amount); // set new balance for destination account - Helpers.SetAllowanceAmount(from.Concat(originator), approvedTransferAmount - amount); // deduct transferred amount from allowance + Helpers.SetAllowanceAmount(from.Concat(to), approvedTransferAmount - amount); // deduct transferred amount from allowance transfer(from, to, amount); return true; diff --git a/ICOTemplate/Token/TokenSale.cs b/ICOTemplate/Token/TokenSale.cs index 5fbc546..f7b4e1a 100644 --- a/ICOTemplate/Token/TokenSale.cs +++ b/ICOTemplate/Token/TokenSale.cs @@ -68,67 +68,6 @@ public static bool CanUserParticipateInSale(object[] transactionData) } - - /// - /// mint tokens is called when a user wishes to purchase tokens - /// - /// - public static bool MintTokens() - { - object[] transactionData = Helpers.GetTransactionAndSaleData(); - Transaction tx = (Transaction)transactionData[0]; - byte[] sender = (byte[])transactionData[1]; - byte[] receiver = (byte[])transactionData[2]; - ulong receivedNEO = (ulong)transactionData[3]; - ulong receivedGAS = (ulong)transactionData[4]; - BigInteger whiteListGroupNumber = (BigInteger)transactionData[5]; - BigInteger crowdsaleAvailableAmount = (BigInteger)transactionData[6]; - BigInteger groupMaximumContribution = (BigInteger)transactionData[7]; - BigInteger totalTokensPurchased = (BigInteger)transactionData[8]; - BigInteger neoRemainingAfterPurchase = (BigInteger)transactionData[9]; - BigInteger gasRemainingAfterPurchase = (BigInteger)transactionData[10]; - BigInteger totalContributionBalance = (BigInteger)transactionData[11]; - - if (Helpers.GetBlockTimestamp() >= ICOTemplate.PublicSaleEndTime()) - { - Runtime.Notify("MintTokens() failed. Token Sale is closed.", false); - return false; - } - - if (!CanUserParticipateInSale(transactionData)) - { - Runtime.Notify("MintTokens() CanUserParticipate failed", false); - return false; - } - - byte[] lastTransactionHash = Storage.Get(Storage.CurrentContext, StorageKeys.MintTokensLastTX()); - if (lastTransactionHash == tx.Hash) - { - // ensure that minTokens doesnt process the same transaction more than once - Runtime.Notify("MintTokens() not processing duplicate tx.Hash", tx.Hash); - return false; - } - - Storage.Put(Storage.CurrentContext, StorageKeys.MintTokensLastTX(), tx.Hash); - Runtime.Notify("MintTokens() receivedNEO / receivedGAS", receivedNEO, receivedGAS); - - if (neoRemainingAfterPurchase > 0 || gasRemainingAfterPurchase > 0) - { - // this purchase would have exceed the allowed max supply so we spent what we could and will refund the remainder - refund(sender, neoRemainingAfterPurchase, gasRemainingAfterPurchase); - } - - BigInteger senderAmountSubjectToVesting = SubjectToVestingPeriod(sender); - BigInteger newTokenBalance = NEP5.BalanceOf(sender) + totalTokensPurchased + senderAmountSubjectToVesting; - - Helpers.SetBalanceOf(sender, newTokenBalance); - Helpers.SetBalanceOfSaleContribution(sender, totalContributionBalance); - Helpers.SetTotalSupply(totalTokensPurchased); - - transfer(null, sender, totalTokensPurchased); - return true; - } - /// /// set a vesting schedule, as defined in the whitepaper, for tokens purchased during the presale /// diff --git a/ICOTemplate/packages.config b/ICOTemplate/packages.config index eb70bff..93b0079 100644 --- a/ICOTemplate/packages.config +++ b/ICOTemplate/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/packages/Neo.SmartContract.Framework.2.9.3.1/.signature.p7s b/packages/Neo.SmartContract.Framework.2.9.3.1/.signature.p7s new file mode 100644 index 0000000000000000000000000000000000000000..8b20d324efa9667ea965a320b50a318d200a7963 GIT binary patch literal 9467 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 Ic~DCK2gtf5w*UYD literal 0 HcmV?d00001 diff --git a/packages/Neo.SmartContract.Framework.2.9.3.1/lib/net40/Neo.SmartContract.Framework.dll b/packages/Neo.SmartContract.Framework.2.9.3.1/lib/net40/Neo.SmartContract.Framework.dll new file mode 100644 index 0000000000000000000000000000000000000000..8dea8d6cea54684185d82d9196b2c48e968d1369 GIT binary patch literal 20480 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 E2~GER{r~^~ literal 0 HcmV?d00001 diff --git a/packages/Neo.SmartContract.Framework.2.9.3.1/lib/netstandard1.6/Neo.SmartContract.Framework.dll b/packages/Neo.SmartContract.Framework.2.9.3.1/lib/netstandard1.6/Neo.SmartContract.Framework.dll new file mode 100644 index 0000000000000000000000000000000000000000..f30ac97a0dfd8937a404a6c3bc505f1d8181588e GIT binary patch literal 19968 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

SKYS0(`!nrI}T@(!COPo)KBs- zPAl6+F2r2nj?HV+%5KPdkP2H)&MO>^4cy9Vi(XGCR%DimIjV?eDVlz$+O{kBgaBl4 z5Y1F{OJPdhRbMPz~GJ^ZI57KEal&cKnIiBPkf1Lv#k936zVk7U2>ud*zf;Jk`M=U~!i(MmYw zD5c>ij&C_*@R`Jy11T{&hB#LQ+9;$M=%e_?GY)Oibh6J`$-7C!l!a9s^6tZUnl3i; zP;dQjA%3bv8{jL`>Bw6Rf4%q@L+&g}A=D}c8Gql`E3sw8hP50?C(?41!ZhdF0^2mc zXCSIXtLOdoL7T+)u8pP@2OPn75HSo`?LUn2al(r4A@EZfd=hm?Jo%QWfjk2Z*Q*cu zLcKq4eDkndQ&#(|f&Vm0DEOU^dYy`U0d8z+5KkEP+#^}B#UVZVpiraF7e_h15=r16 z#u~l`QuyK*KiY_A?ukCM8P~WQZN+UeA3aq;i}2NnrWPZnztxUC5_gm7herj+oo`p> zxZgf+KilKy@uPdO3*R|&FBV$o^ZF-zC(Zpd*6;Y<8sAr^NS-S6X9jia#RyNJCBt~S i#`f~~d}xOMzWyt;K!^T+M*YY9{|c4)?>c Date: Tue, 10 Sep 2019 13:17:50 +0200 Subject: [PATCH 2/3] chore(efficiency): remove unneeded methods (KYC/TGE logic) --- ICOTemplate/ICOTemplate.cs | 11 +-- ICOTemplate/ICOTemplate.csproj | 1 - ICOTemplate/Token/KYC.cs | 152 --------------------------------- ICOTemplate/Token/TokenSale.cs | 57 +------------ 4 files changed, 2 insertions(+), 219 deletions(-) delete mode 100644 ICOTemplate/Token/KYC.cs diff --git a/ICOTemplate/ICOTemplate.cs b/ICOTemplate/ICOTemplate.cs index 185a905..4d3c6bc 100644 --- a/ICOTemplate/ICOTemplate.cs +++ b/ICOTemplate/ICOTemplate.cs @@ -187,7 +187,7 @@ public class ICOTemplate : Framework.SmartContract /// list NEPs supported by this contract ///

/// - public static string SupportedStandards() => "{\"NEP-5\", \"NEP-10\"}"; + public static string[] SupportedStandards() => new string[] { "NEP-5", "NEP-10" }; /// /// should whitelisting of TransferFrom transfer/transferFrom methods be checked @@ -233,15 +233,6 @@ public static object Main(string operation, params object[] args) return false; } - // test if a kyc method is being invoked - foreach (string kycMethod in KYC.GetKYCMethods()) - { - if (kycMethod == operation) - { - return KYC.HandleKYCOperation(operation, args); - } - } - // test if a helper/misc method is being invoked foreach (string helperMethod in Helpers.GetHelperMethods()) { diff --git a/ICOTemplate/ICOTemplate.csproj b/ICOTemplate/ICOTemplate.csproj index 2028e7e..c4bd5ef 100644 --- a/ICOTemplate/ICOTemplate.csproj +++ b/ICOTemplate/ICOTemplate.csproj @@ -48,7 +48,6 @@ - diff --git a/ICOTemplate/Token/KYC.cs b/ICOTemplate/Token/KYC.cs deleted file mode 100644 index 8b4d458..0000000 --- a/ICOTemplate/Token/KYC.cs +++ /dev/null @@ -1,152 +0,0 @@ -using Neo.SmartContract.Framework; -using Neo.SmartContract.Framework.Services.Neo; -using System.Numerics; - -namespace Neo.SmartContract -{ - public class KYC : Framework.SmartContract - { - public static string[] GetKYCMethods() => new string[] { - "AddAddress", - "crowdsale_status", - "GetBlockHeight", - "GetGroupMaxContribution", - "GetGroupNumber", - "GetGroupUnlockTime", - "GroupParticipationIsUnlocked", - "RevokeAddress", - }; - - public static object HandleKYCOperation(string operation, params object[] args) - { - // neo-compiler doesn't support switch blocks with too many case statements due to c# compiler optimisations - // * IL_0004 Call System.UInt32 ::ComputeStringHash(System.String) ---> System.Exception: not supported on neovm now. - // therefore, extra if statements required for more than 6 operations - if (operation == "crowdsale_status") - { - // test if an address is whitelisted - if (!Helpers.RequireArgumentLength(args, 1)) - { - return false; - } - return AddressIsWhitelisted((byte[])args[0]); - } - else if (operation == "GetGroupNumber") - { - // allow people to check which group they have been assigned to during the whitelist process - if (!Helpers.RequireArgumentLength(args, 1)) - { - return false; - } - return GetWhitelistGroupNumber((byte[])args[0]); - } - else if (operation == "GroupParticipationIsUnlocked") - { - // allow people to check if their group is unlocked (bool) - if (!Helpers.RequireArgumentLength(args, 1)) - { - return false; - } - return GroupParticipationIsUnlocked((int)args[0]); - } else if (operation == "GetBlockHeight") - { - // expose a method to retrieve current block height - return Blockchain.GetHeight(); - } - - return false; - } - - - /// - /// determine if the given address is whitelisted by testing if group number > 0 - /// - /// - /// - public static bool AddressIsWhitelisted(byte[] address) - { - if (address.Length != 20) - { - return false; - } - - BigInteger whitelisted = GetWhitelistGroupNumber(address); - return whitelisted > 0; - } - - - /// - /// helper method to retrieve the stored group unlock block height - /// - /// - /// - public static uint GetGroupUnlockTime(BigInteger groupNumber) - { - BigInteger unlockTime = 0; - - if (groupNumber <= 0 || groupNumber > 4) - { - return 0; - } - else if (groupNumber > 0 && groupNumber <= 4) - { - unlockTime = (uint)ICOTemplate.PresaleStartTime(); - } - return (uint)unlockTime; - } - - /// - /// retrieve the group number the whitelisted address is in - /// - /// - /// - public static BigInteger GetWhitelistGroupNumber(byte[] address) - { - if (address.Length != 20) - { - return 0; - } - - StorageMap kycWhitelist = Storage.CurrentContext.CreateMap(StorageKeys.KYCWhitelistPrefix()); - return kycWhitelist.Get(address).AsBigInteger(); - } - - /// - /// determine if groupNumber is eligible to participate in public sale yet - /// - /// - /// - public static bool GroupParticipationIsUnlocked(int groupNumber) - { - if (groupNumber <= 0) - { - return false; - } - - uint unlockBlockTime = GetGroupUnlockTime(groupNumber); - return unlockBlockTime > 0 && unlockBlockTime <= Helpers.GetBlockTimestamp(); - } - - /// - /// remove an address from the whitelist - /// - /// - public static bool RevokeAddress(byte[] address) - { - if (address.Length != 20) - { - return false; - } - - if (Helpers.VerifyWitness(ICOTemplate.KycMiddlewareKey)) - { - StorageMap kycWhitelist = Storage.CurrentContext.CreateMap(StorageKeys.KYCWhitelistPrefix()); - kycWhitelist.Delete(address); - return true; - } - return false; - } - - - } -} diff --git a/ICOTemplate/Token/TokenSale.cs b/ICOTemplate/Token/TokenSale.cs index f7b4e1a..811a3e4 100644 --- a/ICOTemplate/Token/TokenSale.cs +++ b/ICOTemplate/Token/TokenSale.cs @@ -9,64 +9,9 @@ namespace Neo.SmartContract { public class TokenSale : Framework.SmartContract { - [DisplayName("refund")] - public static event Action refund; - - - [DisplayName("transfer")] public static event Action transfer; - - /// - /// determine if user can participate in the token sale yet - /// - /// - /// - public static bool CanUserParticipateInSale(object[] transactionData) - { - Transaction tx = (Transaction)transactionData[0]; - byte[] sender = (byte[])transactionData[1]; - byte[] receiver = (byte[])transactionData[2]; - ulong receivedNEO = (ulong)transactionData[3]; - ulong receivedGAS = (ulong)transactionData[4]; - BigInteger whiteListGroupNumber = (BigInteger)transactionData[5]; - BigInteger crowdsaleAvailableAmount = (BigInteger)transactionData[6]; - BigInteger groupMaximumContribution = (BigInteger)transactionData[7]; - BigInteger totalTokensPurchased = (BigInteger)transactionData[8]; - BigInteger neoRemainingAfterPurchase = (BigInteger)transactionData[9]; - BigInteger gasRemainingAfterPurchase = (BigInteger)transactionData[10]; - BigInteger totalContributionBalance = (BigInteger)transactionData[11]; - - if (whiteListGroupNumber <= 0) - { - Runtime.Notify("CanUserParticipate() sender is not whitelisted", sender); - return false; - } - - if (!KYC.GroupParticipationIsUnlocked((int)whiteListGroupNumber)) - { - Runtime.Notify("CanUserParticipate() sender cannot participate yet", sender); - return false; - } - - if (crowdsaleAvailableAmount <= 0) - { - // total supply has been exhausted - Runtime.Notify("CanUserParticipate() crowdsaleAvailableAmount is <= 0", crowdsaleAvailableAmount); - return false; - } - - if (totalContributionBalance > groupMaximumContribution) - { - // don't allow this purchase exceed the group cap - Runtime.Notify("CanUserParticipate() senders purchase will exceed maxContribution cap", sender, totalContributionBalance, groupMaximumContribution); - refund(sender, receivedNEO, receivedGAS); - return false; - } - - return true; - } - + /// /// set a vesting schedule, as defined in the whitepaper, for tokens purchased during the presale From 82921300f84239d06e333071b8c0e115d17ec5bc Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 10 Sep 2019 17:13:46 +0200 Subject: [PATCH 3/3] chore(efficiency): remove neo/gas asset info --- ICOTemplate/Token/NEP5.cs | 5 ----- .../.signature.p7s | Bin 0 -> 9466 bytes .../Neo.SmartContract.Framework.2.7.3.nupkg | Bin 0 -> 26435 bytes .../lib/net40/Neo.SmartContract.Framework.dll | Bin 0 -> 17920 bytes .../Neo.SmartContract.Framework.dll | Bin 0 -> 17408 bytes 5 files changed, 5 deletions(-) create mode 100644 packages/Neo.SmartContract.Framework.2.7.3/.signature.p7s create mode 100644 packages/Neo.SmartContract.Framework.2.7.3/Neo.SmartContract.Framework.2.7.3.nupkg create mode 100644 packages/Neo.SmartContract.Framework.2.7.3/lib/net40/Neo.SmartContract.Framework.dll create mode 100644 packages/Neo.SmartContract.Framework.2.7.3/lib/netstandard1.6/Neo.SmartContract.Framework.dll diff --git a/ICOTemplate/Token/NEP5.cs b/ICOTemplate/Token/NEP5.cs index 05b9cd9..7a98d12 100644 --- a/ICOTemplate/Token/NEP5.cs +++ b/ICOTemplate/Token/NEP5.cs @@ -1,6 +1,5 @@ using Neo.SmartContract.Framework; using Neo.SmartContract.Framework.Services.Neo; -using Neo.SmartContract.Framework.Services.System; using System; using System.ComponentModel; using System.Numerics; @@ -9,10 +8,6 @@ namespace Neo.SmartContract { public class NEP5 : Framework.SmartContract { - // define the global system assets NEO/GAS - public static readonly byte[] NEO = { 155, 124, 255, 218, 166, 116, 190, 174, 15, 147, 14, 190, 96, 133, 175, 144, 147, 229, 254, 86, 179, 74, 92, 34, 12, 205, 207, 110, 252, 51, 111, 197 }; - public static readonly byte[] GAS = { 231, 45, 40, 105, 121, 238, 108, 177, 183, 230, 93, 253, 223, 178, 227, 132, 16, 11, 141, 20, 142, 119, 88, 222, 66, 228, 22, 139, 113, 121, 44, 96 }; - /// /// NEP5.1 definition: number of decimals for this token - probably best to leave this as-is /// diff --git a/packages/Neo.SmartContract.Framework.2.7.3/.signature.p7s b/packages/Neo.SmartContract.Framework.2.7.3/.signature.p7s new file mode 100644 index 0000000000000000000000000000000000000000..1a647b1c6d9d8c7634b6e7d40c8246893a75d6b3 GIT binary patch literal 9466 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 literal 0 HcmV?d00001 diff --git a/packages/Neo.SmartContract.Framework.2.7.3/Neo.SmartContract.Framework.2.7.3.nupkg b/packages/Neo.SmartContract.Framework.2.7.3/Neo.SmartContract.Framework.2.7.3.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..d0c2b595c104bccbffc3bf4ca9993c88bc4b642f GIT binary patch literal 26435 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¥=Rt4rZ!r@Dz%n!U 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 literal 0 HcmV?d00001 diff --git a/packages/Neo.SmartContract.Framework.2.7.3/lib/netstandard1.6/Neo.SmartContract.Framework.dll b/packages/Neo.SmartContract.Framework.2.7.3/lib/netstandard1.6/Neo.SmartContract.Framework.dll new file mode 100644 index 0000000000000000000000000000000000000000..ea6c1c394108b307ae09237a8a5d800e5fdae3bf GIT binary patch literal 17408 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 literal 0 HcmV?d00001