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}!"); }
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!"); }
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)); }