Exemplo n.º 1
0
        public static void Stake(NexusAPI api, string[] args)
        {
            if (args.Length != 3)
            {
                throw new CommandException("Expected args: target_address amount");
            }

            // TODO more arg validation
            var dest = Address.FromText(args[0]);

            if (dest.Text == Keys.Address.Text)
            {
                throw new CommandException("Cannot transfer to same address");
            }

            var tempAmount  = decimal.Parse(args[1]);
            var tokenSymbol = DomainSettings.StakingTokenSymbol;

            TokenResult tokenInfo;

            try
            {
                var result = api.GetToken(tokenSymbol);
                tokenInfo = (TokenResult)result;
            }
            catch (Exception e)
            {
                throw new CommandException(e.Message);
            }

            var amount = UnitConversion.ToBigInteger(tempAmount, tokenInfo.decimals);

            var script = ScriptUtils.BeginScript().
                         AllowGas(Keys.Address, Address.Null, 1, 9999).
                         CallContract("energy", "Stake", Keys.Address, dest, amount).
                         SpendGas(Keys.Address).
                         EndScript();
            var tx = new Phantasma.Blockchain.Transaction(api.Nexus.Name, "main", script, Timestamp.Now + TimeSpan.FromMinutes(5));

            tx.Sign(Keys);
            var rawTx = tx.ToByteArray(true);

            logger.Message($"Staking {tempAmount} {tokenSymbol} with {dest.Text}...");
            try
            {
                api.SendRawTransaction(Base16.Encode(rawTx));
            }
            catch (Exception e)
            {
                throw new CommandException(e.Message);
            }

            Thread.Sleep(3000);
            var hash = tx.Hash.ToString();

            do
            {
                try
                {
                    var result = api.GetTransaction(hash);
                }
                catch (Exception e)
                {
                    throw new CommandException(e.Message);
                }

                /*if (result is ErrorResult)
                 * {
                 *  var temp = (ErrorResult)result;
                 *  if (temp.error.Contains("pending"))
                 *  {
                 *      Thread.Sleep(1000);
                 *  }
                 *  else
                 *  {
                 *      throw new CommandException(temp.error);
                 *  }
                 * }
                 * else*/
                {
                    break;
                }
            } while (true);
            logger.Success($"Sent transaction with hash {hash}!");
        }
Exemplo n.º 2
0
        public static void Upload(KeyPair source, NexusAPI api, Logger logger, string[] args)
        {
            if (args.Length != 1)
            {
                throw new CommandException("Expected args: file_path");
            }

            var filePath = args[0];

            if (!File.Exists(filePath))
            {
                throw new CommandException("File does not exist");
            }

            var fileContent   = File.ReadAllBytes(filePath);
            var contentMerkle = new MerkleTree(fileContent);

            var fileName = Path.GetFileName(filePath);

            var script = ScriptUtils.BeginScript().
                         AllowGas(source.Address, Address.Null, 1, 9999).
                         CallContract("storage", "UploadFile", source.Address, fileName, fileContent.Length, contentMerkle, ArchiveFlags.None, new byte[0]).
                         SpendGas(source.Address).
                         EndScript();
            var tx = new Transaction(api.Nexus.Name, "main", script, Timestamp.Now + TimeSpan.FromMinutes(5));

            tx.Sign(source);
            var rawTx = tx.ToByteArray(true);

            logger.Message($"Uploading {fileName}...");
            try
            {
                api.SendRawTransaction(Base16.Encode(rawTx));
            }
            catch (Exception e)
            {
                throw new CommandException(e.Message);
            }

            Thread.Sleep(3000);
            var hash = tx.Hash.ToString();

            do
            {
                try
                {
                    var result = api.GetTransaction(hash);
                }
                catch (Exception e)
                {
                    throw new CommandException(e.Message);
                }

                /*if (result is ErrorResult)
                 * {
                 *  var temp = (ErrorResult)result;
                 *  if (temp.error.Contains("pending"))
                 *  {
                 *      Thread.Sleep(1000);
                 *  }
                 *  else
                 *  {
                 *      throw new CommandException(temp.error);
                 *  }
                 * }
                 * else*/
                {
                    break;
                }
            } while (true);

            var archiveHash = contentMerkle.Root.ToString();
            var archive     = (ArchiveResult)api.GetArchive(archiveHash);

            for (int i = 0; i < archive.blockCount; i++)
            {
                var ofs          = (int)(i * Archive.BlockSize);
                var blockContent = fileContent.Skip(ofs).Take((int)Archive.BlockSize).ToArray();

                logger.Message($"Writing block {i+1} out of {archive.blockCount}");
                api.WriteArchive(archiveHash, i, Base16.Encode(blockContent));
            }

            logger.Success($"File uploaded successfully!");
        }
Exemplo n.º 3
0
        private static Hash ExecuteTransaction(NexusAPI api, byte[] script, ProofOfWork proofOfWork, params IKeyPair[] keys)
        {
            var tx = new Blockchain.Transaction(api.Nexus.Name, DomainSettings.RootChainName, script, Timestamp.Now + TimeSpan.FromMinutes(5), CLI.Identifier);

            if (proofOfWork != ProofOfWork.None)
            {
                logger.Message($"Mining proof of work with difficulty: {proofOfWork}...");
                tx.Mine(proofOfWork);
            }

            logger.Message("Signing message...");
            foreach (var keyPair in keys)
            {
                tx.Sign(keyPair);
            }

            var rawTx = tx.ToByteArray(true);

            try
            {
                api.SendRawTransaction(Base16.Encode(rawTx));
            }
            catch (Exception e)
            {
                throw new CommandException(e.Message);
            }

            Thread.Sleep(3000);
            var hash = tx.Hash.ToString();

            do
            {
                try
                {
                    var result = api.GetTransaction(hash);
                }
                catch (Exception e)
                {
                    throw new CommandException(e.Message);
                }

                /*if (result is ErrorResult)
                 * {
                 *  var temp = (ErrorResult)result;
                 *  if (temp.error.Contains("pending"))
                 *  {
                 *      Thread.Sleep(1000);
                 *  }
                 *  else
                 *  {
                 *      throw new CommandException(temp.error);
                 *  }
                 * }
                 * else*/
                {
                    break;
                }
            } while (true);
            logger.Success($"Sent transaction with hash {hash}!");

            return(Hash.Parse(hash));
        }