public static bool SetOracleOutcome(byte[] txHash, byte[] result) { //TODO: check witness if (!Runtime.CheckWitness(admin)) { Runtime.Notify("Checkwitness failed."); return(false); } Storage.Put(Storage.CurrentContext, txHash, result); //remove txHash from undoRequest map Map <byte[], string> undoRequest = new Map <byte[], string>(); byte[] v = Storage.Get(Storage.CurrentContext, "UndoRequest"); if (v.Length != 0) { undoRequest = (Map <byte[], string>)Helper.Deserialize(v); } undoRequest.Remove(txHash); byte[] b = Helper.Serialize(undoRequest); Storage.Put(Storage.CurrentContext, "UndoRequest", b); Runtime.Notify("SetOracleOutcome Done"); return(true); }
public static void Main() { // create struct instance Person p = new Person(); p.Name = "bob"; p.Age = 20; Runtime.Notify(p.Name); Runtime.Notify(p.Age); // serialize struct instance to byte[] byte[] b = Helper.Serialize(p); // deserialize byte[] to struct Person p2 = (Person)Helper.Deserialize(b); Runtime.Notify(p2.Name); Runtime.Notify(p2.Age); // create struct array Person[] array = new Person[] { new Person { Name = "tom", Age = 18 }, new Person { Name = "jack", Age = 20 } }; }
public static bool CreateOracleRequest(string request, byte[] address) { //TODO: check request format //TODO: transfer ong Transaction tx = (Transaction)ExecutionEngine.ScriptContainer; byte[] txHash = tx.Hash; //Runtime.Notify("txHash is :", txHash); Map <byte[], string> undoRequest = new Map <byte[], string>(); byte[] v = Storage.Get(Storage.CurrentContext, "UndoRequest"); if (v.Length != 0) { undoRequest = (Map <byte[], string>)Helper.Deserialize(v); } undoRequest[txHash] = request; byte[] b = Helper.Serialize(undoRequest); Storage.Put(Storage.CurrentContext, "UndoRequest", b); Runtime.Notify("CreateOracleRequest Done"); return(true); }
public static bool Revoke(byte[] claimId, byte[] ontId) { byte[] v = Storage.Get(Storage.CurrentContext, claimId); if (v == null) { ErrorEvent(claimId, " not existed!"); return(false); } ClaimTx c = (ClaimTx)Helper.Deserialize(v); if (c.status != 1) { ErrorEvent(claimId, " invalid status."); return(false); } if (!EqualBytes(c.commiterId, ontId)) { ErrorEvent(ontId, " invalid."); return(false); } c.status = 0; byte[] tx = Helper.Serialize(c); Storage.Put(Storage.CurrentContext, claimId, tx); PushEvent(ontId, " revoke claim: ", claimId); return(true); }
public static bool PayInterstOrPrincipal(string bondName, byte[] account) { if (!validateBond(bondName)) { return(false); } byte[] investorKey = bondInvestorPrefix.Concat(bondName.AsByteArray()).Concat(account); BigInteger balance = Storage.Get(Storage.CurrentContext, investorKey).AsBigInteger(); if (balance < minInvestCap) { return(false); } BondItem bond = (BondItem)Helper.Deserialize(GetBond(bondName)); byte[] paidKey = bondPaidPrefix.Concat(bondName.AsByteArray()).Concat(account); BigInteger paidRound = Storage.Get(Storage.CurrentContext, paidKey).AsBigInteger(); BigInteger currentRound = (Runtime.Time - bond.purchaseEndTime) / bond.Interval; if (paidRound > bond.Round) { return(false); } if (currentRound > bond.Round) { currentRound = bond.Round; } BigInteger investValue = Storage.Get(Storage.CurrentContext, investorKey).AsBigInteger(); BigInteger interst = (currentRound - paidRound) * (investValue * bond.CouponRate / 100); byte[] ret; if (currentRound == bond.Round) { ret = Native.Invoke(0, ontAddr, "transfer", new object[1] { new Transfer { From = bond.Account, To = account, Value = (ulong)(interst + investValue) } }); } else { ret = Native.Invoke(0, ontAddr, "transfer", new object[1] { new Transfer { From = bond.Account, To = account, Value = (ulong)interst } }); } if (ret[0] != 1) { return(false); } Storage.Put(Storage.CurrentContext, paidKey, paidRound + 1); return(true); }
public static bool InvestBond(string bondName, byte[] account, uint bondNumber) { if (!Runtime.CheckWitness(account)) { return(false); } if (bondNumber <= 0 || !validateAddress(account) || !validateBond(bondName)) { return(false); } BondItem bond = (BondItem)Helper.Deserialize(GetBond(bondName)); if (Runtime.Time > bond.purchaseEndTime) { Runtime.Notify("bond subscription has been ended."); return(false); } uint investValue = bondNumber * bond.ParValue; if (bond.remainCap < investValue) { Runtime.Notify("bond remain invest capacity not enough."); return(false); } byte[] ret = Native.Invoke(0, ontAddr, "transfer", new object[1] { new Transfer { From = account, To = bond.Account, Value = investValue } }); if (ret[0] != 1) { return(false); } bond.remainCap = bond.TotalCap - investValue; byte[] investorKey = bondInvestorPrefix.Concat(bondName.AsByteArray()).Concat(account); BigInteger balance = Storage.Get(Storage.CurrentContext, investorKey).AsBigInteger(); Storage.Put(Storage.CurrentContext, investorKey, balance + investValue); return(true); }
public static void Main() { Map <string, int> m = new Map <string, int>(); m["k1"] = 100; m["k2"] = 200; Runtime.Notify(m["k1"]); Runtime.Notify(m["k2"]); // seriallize byte[] b = Helper.Serialize(m); Storage.Put(Storage.CurrentContext, "mapexample", b); byte[] v = Storage.Get(Storage.CurrentContext, "mapexample"); // deserialize Map <string, int> m2 = (Map <string, int>)Helper.Deserialize(v); Runtime.Notify(m2["k1"]); Runtime.Notify(m2["k2"]); }