public byte[] CreateOutput(byte[] publicKey) { using (var outputScript = new ScriptBuilder()) { outputScript.WritePushData(publicKey); outputScript.WriteOp(ScriptOp.OP_CHECKSIG); return outputScript.GetScript(); } }
private static void AppendDelimiter(ScriptBuilder scriptBuilder, ref int i) { if (i++ == 0) { scriptBuilder.Append(" "); } else { scriptBuilder.AppendLine(); scriptBuilder.Append(" ,"); } }
public void TestWritePushData0() { var data = new byte[0]; var expected = new byte[] { 0x00 }; var actual = new ScriptBuilder(); actual.WritePushData(data); CollectionAssert.AreEqual(expected, actual.GetScript()); }
public void TestWritePushData256() { var data = random.NextBytes(256); var expected = new byte[] { 0x4D }.Concat(0x00).Concat(0x01).Concat(data); var actual = new ScriptBuilder(); actual.WritePushData(data); CollectionAssert.AreEqual(expected, actual.GetScript()); }
public void TestWritePushData4294967295() { var data = random.NextBytes(4294967295); var expected = new byte[] { 0x4E }.Concat(0xFF).Concat(0xFF).Concat(0xFF).Concat(0xFF).Concat(data); var actual = new ScriptBuilder(); actual.WritePushData(data); CollectionAssert.AreEqual(expected, actual.GetScript()); }
public static void FormatAssignList(Assignment[] assignArray, SqlFragment parent, ScriptBuilder scriptBuilder, TSqlVisitor visitor) { int i = 0; foreach (Assignment assign in assignArray) { if (assign == null) { continue; } AppendDelimiter(scriptBuilder, ref i); scriptBuilder.AppendFragment(assign, parent, visitor); } }
public static void FormatColumnList( IEnumerable<Column> columns, SqlFragment parent, ScriptBuilder scriptBuilder, TSqlVisitor visitor) { int i = 0; foreach (Column column in columns) { if (column == null) { continue; } AppendDelimiter(scriptBuilder, ref i); scriptBuilder.AppendFragment(column, parent, visitor); } }
protected override void AppendClassDefinition(TsClass classModel, ScriptBuilder sb, TsGeneratorOutput generatorOutput) { string typeName = this.GetTypeName(classModel); string visibility = this.GetTypeVisibility(classModel, typeName) ? "export " : ""; sb.AppendFormatIndented( "{0}class {1} extends {2}", visibility, typeName, //all bottom-level classes must extend Backbone.Model. classModel.BaseType != null ? this.GetFullyQualifiedTypeName(classModel.BaseType) : "Backbone.Model"); sb.AppendLine(" {"); var members = new List<TsProperty>(); if ((generatorOutput & TsGeneratorOutput.Properties) == TsGeneratorOutput.Properties) { members.AddRange(classModel.Properties); } if ((generatorOutput & TsGeneratorOutput.Fields) == TsGeneratorOutput.Fields) { members.AddRange(classModel.Fields); } using (sb.IncreaseIndentation()) { foreach (var property in members) { if (property.IsIgnored) { continue; } sb.AppendLineIndented(string.Format( "get {0}(): {1} {{ return this.get(\"{0}\"); }}", this.GetPropertyName(property), this.GetPropertyType(property))); sb.AppendLineIndented(string.Format( "set {0}(v: {1}) {{ this.set(\"{0}\", v); }}", this.GetPropertyName(property), this.GetPropertyType(property))); } } sb.AppendLineIndented("}"); _generatedClasses.Add(classModel); }
private void AppendModelDoc(ScriptBuilder sb, Type type) { var provider = GetXmlDocProvider(type.Assembly); if (provider == null) { return; } var doc = provider.GetDocumentation(type); if (string.IsNullOrWhiteSpace(doc)) { return; } sb.AppendLine(); sb.AppendFormatIndented("/**"); sb.AppendLine(); sb.AppendFormatIndented(" * {0}", doc); sb.AppendLine(); sb.AppendFormatIndented(" */"); sb.AppendLine(); }
public static void FormatExpressionList( IEnumerable<Expression> expressions, SqlFragment parent, ScriptBuilder scriptBuilder, TSqlVisitor visitor, string appendOptional = null) { int i = 0; foreach (Expression expression in expressions) { if (expression == null) { continue; } AppendDelimiter(scriptBuilder, ref i); scriptBuilder.AppendFragment(expression, parent, visitor); if (appendOptional != null) { scriptBuilder.Append(appendOptional); } } }
public void Reset(byte viewNumber) { if (viewNumber == 0) { Snapshot?.Dispose(); Snapshot = Blockchain.Singleton.GetSnapshot(); Block = new Block { PrevHash = Snapshot.CurrentBlockHash, Index = Snapshot.Height + 1, NextConsensus = Blockchain.GetConsensusAddress(NativeContract.NEO.GetValidators(Snapshot).ToArray()) }; var pv = Validators; Validators = NativeContract.NEO.GetNextBlockValidators(Snapshot); if (_witnessSize == 0 || (pv != null && pv.Length != Validators.Length)) { // Compute the expected size of the witness using (ScriptBuilder sb = new ScriptBuilder()) { for (int x = 0; x < M; x++) { sb.EmitPush(new byte[64]); } _witnessSize = new Witness { InvocationScript = sb.ToArray(), VerificationScript = Contract.CreateMultiSigRedeemScript(M, Validators) }.Size; } } MyIndex = -1; ChangeViewPayloads = new ConsensusPayload[Validators.Length]; LastChangeViewPayloads = new ConsensusPayload[Validators.Length]; CommitPayloads = new ConsensusPayload[Validators.Length]; if (LastSeenMessage == null) { LastSeenMessage = new int[Validators.Length]; for (int i = 0; i < Validators.Length; i++) { LastSeenMessage[i] = -1; } } keyPair = null; for (int i = 0; i < Validators.Length; i++) { WalletAccount account = wallet?.GetAccount(Validators[i]); if (account?.HasKey != true) { continue; } MyIndex = i; keyPair = account.GetKey(); break; } } else { for (int i = 0; i < LastChangeViewPayloads.Length; i++) { if (ChangeViewPayloads[i]?.GetDeserializedMessage <ChangeView>().NewViewNumber >= viewNumber) { LastChangeViewPayloads[i] = ChangeViewPayloads[i]; } else { LastChangeViewPayloads[i] = null; } } } ViewNumber = viewNumber; Block.ConsensusData = new ConsensusData { PrimaryIndex = GetPrimaryIndex(viewNumber) }; Block.MerkleRoot = null; Block.Timestamp = 0; Block.Transactions = null; TransactionHashes = null; PreparationPayloads = new ConsensusPayload[Validators.Length]; if (MyIndex >= 0) { LastSeenMessage[MyIndex] = (int)Block.Index; } }
public void System_Blockchain_GetBlock() { var tx = new Transaction() { Script = new byte[] { 0x01 }, Attributes = Array.Empty <TransactionAttribute>(), Signers = Array.Empty <Signer>(), NetworkFee = 0x02, SystemFee = 0x03, Nonce = 0x04, ValidUntilBlock = 0x05, Version = 0x06, Witnesses = new Witness[] { new Witness() { VerificationScript = new byte[] { 0x07 } } }, }; var block = new TrimmedBlock() { Header = new Header { Index = 0, Timestamp = 2, Witness = new Witness() { InvocationScript = new byte[0], VerificationScript = new byte[0] }, PrevHash = UInt256.Zero, MerkleRoot = UInt256.Zero, PrimaryIndex = 1, NextConsensus = UInt160.Zero, }, Hashes = new[] { tx.Hash } }; var snapshot = TestBlockchain.GetTestSnapshot(); using (var script = new ScriptBuilder()) { script.EmitDynamicCall(NativeContract.Ledger.Hash, "getBlock", block.Hash.ToArray()); // Without block var engine = ApplicationEngine.Create(TriggerType.Application, null, snapshot); engine.LoadScript(script.ToArray()); Assert.AreEqual(engine.Execute(), VMState.HALT); Assert.AreEqual(1, engine.ResultStack.Count); Assert.IsTrue(engine.ResultStack.Peek().IsNull); // Not traceable block const byte Prefix_Transaction = 11; const byte Prefix_CurrentBlock = 12; var height = snapshot[NativeContract.Ledger.CreateStorageKey(Prefix_CurrentBlock)].GetInteroperable <HashIndexState>(); height.Index = block.Index + ProtocolSettings.Default.MaxTraceableBlocks; UT_SmartContractHelper.BlocksAdd(snapshot, block.Hash, block); snapshot.Add(NativeContract.Ledger.CreateStorageKey(Prefix_Transaction, tx.Hash), new StorageItem(new TransactionState { BlockIndex = block.Index, Transaction = tx }, true)); engine = ApplicationEngine.Create(TriggerType.Application, null, snapshot); engine.LoadScript(script.ToArray()); Assert.AreEqual(engine.Execute(), VMState.HALT); Assert.AreEqual(1, engine.ResultStack.Count); Assert.IsTrue(engine.ResultStack.Peek().IsNull); // With block height.Index = block.Index; engine = ApplicationEngine.Create(TriggerType.Application, null, snapshot); engine.LoadScript(script.ToArray()); Assert.AreEqual(engine.Execute(), VMState.HALT); Assert.AreEqual(1, engine.ResultStack.Count); var array = engine.ResultStack.Pop <VM.Types.Array>(); Assert.AreEqual(block.Hash, new UInt256(array[0].GetSpan())); } }
private JObject Process(string method, JArray _params) { switch (method) { case "dumpprivkey": if (wallet == null) { throw new RpcException(-400, "Access denied"); } else { UInt160 scriptHash = _params[0].AsString().ToScriptHash(); WalletAccount account = wallet.GetAccount(scriptHash); return(account.GetKey().Export()); } case "getaccountstate": { UInt160 script_hash = _params[0].AsString().ToScriptHash(); AccountState account = Blockchain.Singleton.Store.GetAccounts().TryGet(script_hash) ?? new AccountState(script_hash); return(account.ToJson()); } case "getassetstate": { UInt256 asset_id = UInt256.Parse(_params[0].AsString()); AssetState asset = Blockchain.Singleton.Store.GetAssets().TryGet(asset_id); return(asset?.ToJson() ?? throw new RpcException(-100, "Unknown asset")); } case "getbalance": if (wallet == null) { throw new RpcException(-400, "Access denied."); } else { JObject json = new JObject(); switch (UIntBase.Parse(_params[0].AsString())) { case UInt160 asset_id_160: //NEP-5 balance json["balance"] = wallet.GetAvailable(asset_id_160).ToString(); break; case UInt256 asset_id_256: //Global Assets balance IEnumerable <Coin> coins = wallet.GetCoins().Where(p => !p.State.HasFlag(CoinState.Spent) && p.Output.AssetId.Equals(asset_id_256)); json["balance"] = coins.Sum(p => p.Output.Value).ToString(); json["confirmed"] = coins.Where(p => p.State.HasFlag(CoinState.Confirmed)).Sum(p => p.Output.Value).ToString(); break; } return(json); } case "getbestblockhash": return(Blockchain.Singleton.CurrentBlockHash.ToString()); case "getblock": { Block block; if (_params[0] is JNumber) { uint index = (uint)_params[0].AsNumber(); block = Blockchain.Singleton.Store.GetBlock(index); } else { UInt256 hash = UInt256.Parse(_params[0].AsString()); block = Blockchain.Singleton.Store.GetBlock(hash); } if (block == null) { throw new RpcException(-100, "Unknown block"); } bool verbose = _params.Count >= 2 && _params[1].AsBooleanOrDefault(false); if (verbose) { JObject json = block.ToJson(); json["confirmations"] = Blockchain.Singleton.Height - block.Index + 1; UInt256 hash = Blockchain.Singleton.Store.GetNextBlockHash(block.Hash); if (hash != null) { json["nextblockhash"] = hash.ToString(); } return(json); } return(block.ToArray().ToHexString()); } case "getblockcount": return(Blockchain.Singleton.Height + 1); case "getblockhash": { uint height = (uint)_params[0].AsNumber(); if (height <= Blockchain.Singleton.Height) { return(Blockchain.Singleton.GetBlockHash(height).ToString()); } throw new RpcException(-100, "Invalid Height"); } case "getblockheader": { Header header; if (_params[0] is JNumber) { uint height = (uint)_params[0].AsNumber(); header = Blockchain.Singleton.Store.GetHeader(height); } else { UInt256 hash = UInt256.Parse(_params[0].AsString()); header = Blockchain.Singleton.Store.GetHeader(hash); } if (header == null) { throw new RpcException(-100, "Unknown block"); } bool verbose = _params.Count >= 2 && _params[1].AsBooleanOrDefault(false); if (verbose) { JObject json = header.ToJson(); json["confirmations"] = Blockchain.Singleton.Height - header.Index + 1; UInt256 hash = Blockchain.Singleton.Store.GetNextBlockHash(header.Hash); if (hash != null) { json["nextblockhash"] = hash.ToString(); } return(json); } return(header.ToArray().ToHexString()); } case "getblocksysfee": { uint height = (uint)_params[0].AsNumber(); if (height <= Blockchain.Singleton.Height) { return(Blockchain.Singleton.Store.GetSysFeeAmount(height).ToString()); } throw new RpcException(-100, "Invalid Height"); } case "getconnectioncount": return(LocalNode.Singleton.ConnectedCount); case "getcontractstate": { UInt160 script_hash = UInt160.Parse(_params[0].AsString()); ContractState contract = Blockchain.Singleton.Store.GetContracts().TryGet(script_hash); return(contract?.ToJson() ?? throw new RpcException(-100, "Unknown contract")); } case "getnewaddress": if (wallet == null) { throw new RpcException(-400, "Access denied"); } else { WalletAccount account = wallet.CreateAccount(); if (wallet is NEP6Wallet nep6) { nep6.Save(); } return(account.Address); } case "getpeers": { JObject json = new JObject(); json["unconnected"] = new JArray(LocalNode.Singleton.GetUnconnectedPeers().Select(p => { JObject peerJson = new JObject(); peerJson["address"] = p.Address.ToString(); peerJson["port"] = p.Port; return(peerJson); })); json["bad"] = new JArray(); //badpeers has been removed json["connected"] = new JArray(LocalNode.Singleton.GetRemoteNodes().Select(p => { JObject peerJson = new JObject(); peerJson["address"] = p.Remote.Address.ToString(); peerJson["port"] = p.ListenerPort; return(peerJson); })); return(json); } case "getrawmempool": return(new JArray(Blockchain.Singleton.GetMemoryPool().Select(p => (JObject)p.Hash.ToString()))); case "getrawtransaction": { UInt256 hash = UInt256.Parse(_params[0].AsString()); bool verbose = _params.Count >= 2 && _params[1].AsBooleanOrDefault(false); Transaction tx = Blockchain.Singleton.GetTransaction(hash); if (tx == null) { throw new RpcException(-100, "Unknown transaction"); } if (verbose) { JObject json = tx.ToJson(); uint? height = Blockchain.Singleton.Store.GetTransactions().TryGet(hash)?.BlockIndex; if (height != null) { Header header = Blockchain.Singleton.Store.GetHeader((uint)height); json["blockhash"] = header.Hash.ToString(); json["confirmations"] = Blockchain.Singleton.Height - header.Index + 1; json["blocktime"] = header.Timestamp; } return(json); } return(tx.ToArray().ToHexString()); } case "getstorage": { UInt160 script_hash = UInt160.Parse(_params[0].AsString()); byte[] key = _params[1].AsString().HexToBytes(); StorageItem item = Blockchain.Singleton.Store.GetStorages().TryGet(new StorageKey { ScriptHash = script_hash, Key = key }) ?? new StorageItem(); return(item.Value?.ToHexString()); } case "gettxout": { UInt256 hash = UInt256.Parse(_params[0].AsString()); ushort index = (ushort)_params[1].AsNumber(); return(Blockchain.Singleton.Store.GetUnspent(hash, index)?.ToJson(index)); } case "getvalidators": using (Snapshot snapshot = Blockchain.Singleton.GetSnapshot()) { var validators = snapshot.GetValidators(); return(snapshot.GetEnrollments().Select(p => { JObject validator = new JObject(); validator["publickey"] = p.PublicKey.ToString(); validator["votes"] = p.Votes.ToString(); validator["active"] = validators.Contains(p.PublicKey); return validator; }).ToArray()); } case "getversion": { JObject json = new JObject(); json["port"] = LocalNode.Singleton.ListenerPort; json["nonce"] = LocalNode.Nonce; json["useragent"] = LocalNode.UserAgent; return(json); } case "getwalletheight": if (wallet == null) { throw new RpcException(-400, "Access denied."); } else { return((wallet.WalletHeight > 0) ? wallet.WalletHeight - 1 : 0); } case "invoke": { UInt160 script_hash = UInt160.Parse(_params[0].AsString()); ContractParameter[] parameters = ((JArray)_params[1]).Select(p => ContractParameter.FromJson(p)).ToArray(); byte[] script; using (ScriptBuilder sb = new ScriptBuilder()) { script = sb.EmitAppCall(script_hash, parameters).ToArray(); } return(GetInvokeResult(script)); } case "invokefunction": { UInt160 script_hash = UInt160.Parse(_params[0].AsString()); string operation = _params[1].AsString(); ContractParameter[] args = _params.Count >= 3 ? ((JArray)_params[2]).Select(p => ContractParameter.FromJson(p)).ToArray() : new ContractParameter[0]; byte[] script; using (ScriptBuilder sb = new ScriptBuilder()) { script = sb.EmitAppCall(script_hash, operation, args).ToArray(); } return(GetInvokeResult(script)); } case "invokescript": { byte[] script = _params[0].AsString().HexToBytes(); return(GetInvokeResult(script)); } case "listaddress": if (wallet == null) { throw new RpcException(-400, "Access denied."); } else { return(wallet.GetAccounts().Select(p => { JObject account = new JObject(); account["address"] = p.Address; account["haskey"] = p.HasKey; account["label"] = p.Label; account["watchonly"] = p.WatchOnly; return account; }).ToArray()); } case "sendfrom": if (wallet == null) { throw new RpcException(-400, "Access denied"); } else { UIntBase assetId = UIntBase.Parse(_params[0].AsString()); AssetDescriptor descriptor = new AssetDescriptor(assetId); UInt160 from = _params[1].AsString().ToScriptHash(); UInt160 to = _params[2].AsString().ToScriptHash(); BigDecimal value = BigDecimal.Parse(_params[3].AsString(), descriptor.Decimals); if (value.Sign <= 0) { throw new RpcException(-32602, "Invalid params"); } Fixed8 fee = _params.Count >= 5 ? Fixed8.Parse(_params[4].AsString()) : Fixed8.Zero; if (fee < Fixed8.Zero) { throw new RpcException(-32602, "Invalid params"); } UInt160 change_address = _params.Count >= 6 ? _params[5].AsString().ToScriptHash() : null; Transaction tx = wallet.MakeTransaction(null, new[] { new TransferOutput { AssetId = assetId, Value = value, ScriptHash = to } }, from: from, change_address: change_address, fee: fee); if (tx == null) { throw new RpcException(-300, "Insufficient funds"); } ContractParametersContext context = new ContractParametersContext(tx); wallet.Sign(context); if (context.Completed) { tx.Witnesses = context.GetWitnesses(); wallet.ApplyTransaction(tx); system.LocalNode.Tell(new LocalNode.Relay { Inventory = tx }); return(tx.ToJson()); } else { return(context.ToJson()); } } case "sendmany": if (wallet == null) { throw new RpcException(-400, "Access denied"); } else { JArray to = (JArray)_params[0]; if (to.Count == 0) { throw new RpcException(-32602, "Invalid params"); } TransferOutput[] outputs = new TransferOutput[to.Count]; for (int i = 0; i < to.Count; i++) { UIntBase asset_id = UIntBase.Parse(to[i]["asset"].AsString()); AssetDescriptor descriptor = new AssetDescriptor(asset_id); outputs[i] = new TransferOutput { AssetId = asset_id, Value = BigDecimal.Parse(to[i]["value"].AsString(), descriptor.Decimals), ScriptHash = to[i]["address"].AsString().ToScriptHash() }; if (outputs[i].Value.Sign <= 0) { throw new RpcException(-32602, "Invalid params"); } } Fixed8 fee = _params.Count >= 2 ? Fixed8.Parse(_params[1].AsString()) : Fixed8.Zero; if (fee < Fixed8.Zero) { throw new RpcException(-32602, "Invalid params"); } UInt160 change_address = _params.Count >= 3 ? _params[2].AsString().ToScriptHash() : null; Transaction tx = wallet.MakeTransaction(null, outputs, change_address: change_address, fee: fee); if (tx == null) { throw new RpcException(-300, "Insufficient funds"); } ContractParametersContext context = new ContractParametersContext(tx); wallet.Sign(context); if (context.Completed) { tx.Witnesses = context.GetWitnesses(); wallet.ApplyTransaction(tx); system.LocalNode.Tell(new LocalNode.Relay { Inventory = tx }); return(tx.ToJson()); } else { return(context.ToJson()); } } case "sendrawtransaction": { Transaction tx = Transaction.DeserializeFrom(_params[0].AsString().HexToBytes()); RelayResultReason reason = system.Blockchain.Ask <RelayResultReason>(tx).Result; return(GetRelayResult(reason)); } case "sendtoaddress": if (wallet == null) { throw new RpcException(-400, "Access denied"); } else { UIntBase assetId = UIntBase.Parse(_params[0].AsString()); AssetDescriptor descriptor = new AssetDescriptor(assetId); UInt160 scriptHash = _params[1].AsString().ToScriptHash(); BigDecimal value = BigDecimal.Parse(_params[2].AsString(), descriptor.Decimals); if (value.Sign <= 0) { throw new RpcException(-32602, "Invalid params"); } Fixed8 fee = _params.Count >= 4 ? Fixed8.Parse(_params[3].AsString()) : Fixed8.Zero; if (fee < Fixed8.Zero) { throw new RpcException(-32602, "Invalid params"); } UInt160 change_address = _params.Count >= 5 ? _params[4].AsString().ToScriptHash() : null; Transaction tx = wallet.MakeTransaction(null, new[] { new TransferOutput { AssetId = assetId, Value = value, ScriptHash = scriptHash } }, change_address: change_address, fee: fee); if (tx == null) { throw new RpcException(-300, "Insufficient funds"); } ContractParametersContext context = new ContractParametersContext(tx); wallet.Sign(context); if (context.Completed) { tx.Witnesses = context.GetWitnesses(); wallet.ApplyTransaction(tx); system.LocalNode.Tell(new LocalNode.Relay { Inventory = tx }); return(tx.ToJson()); } else { return(context.ToJson()); } } case "submitblock": { Block block = _params[0].AsString().HexToBytes().AsSerializable <Block>(); RelayResultReason reason = system.Blockchain.Ask <RelayResultReason>(block).Result; return(GetRelayResult(reason)); } case "validateaddress": { JObject json = new JObject(); UInt160 scriptHash; try { scriptHash = _params[0].AsString().ToScriptHash(); } catch { scriptHash = null; } json["address"] = _params[0]; json["isvalid"] = scriptHash != null; return(json); } default: throw new RpcException(-32601, "Method not found"); } }
private void AppendClassDefinition(TsClass classModel, ScriptBuilder sb, TsGeneratorOutput generatorOutput, bool ko) { string typeName = this.GetTypeName(classModel); string visibility = this.GetTypeVisibility(classModel, typeName) ? "export " : ""; sb.AppendIndented($"{visibility}class {typeName}"); if (classModel.BaseType != null) { string baseTypeName = this.GetFullyQualifiedTypeName(classModel.BaseType); if (baseTypeName.StartsWith(classModel.Module.Name + ".", StringComparison.Ordinal)) { baseTypeName = baseTypeName.Substring(classModel.Module.Name.Length + 1); } sb.Append($" extends {baseTypeName}"); sb.AppendLine(" {"); using (sb.IncreaseIndentation()) { sb.AppendLineIndented("constructor() {"); using (sb.IncreaseIndentation()) { sb.AppendLineIndented("super();"); } sb.AppendLineIndented("}"); } } else { sb.AppendLine(" {"); } var members = new List <TsProperty>(); if ((generatorOutput & TsGeneratorOutput.Properties) == TsGeneratorOutput.Properties) { members.AddRange(classModel.Properties); } if ((generatorOutput & TsGeneratorOutput.Fields) == TsGeneratorOutput.Fields) { members.AddRange(classModel.Fields); } using (sb.IncreaseIndentation()) { foreach (TsProperty property in members.Where(m => !m.IsIgnored)) { string propTypeName = this.GetPropertyType(property); if (IsCollection(property)) { if (propTypeName.EndsWith("[]", StringComparison.Ordinal)) { propTypeName = propTypeName.Substring(0, propTypeName.Length - "[]".Length); } if (ko) { sb.AppendLineIndented($"{this.GetPropertyName(property)}: ko.ObservableArray<{propTypeName}> = ko.observableArray([]);"); } else { sb.AppendLineIndented($"{this.GetPropertyName(property)}: {propTypeName}[];"); } } else { if (ko) { sb.AppendLineIndented($"{this.GetPropertyName(property)}: ko.Subscribable<{propTypeName}> = ko.observable(null);"); } else { sb.AppendLineIndented($"{this.GetPropertyName(property)}: {propTypeName};"); } } } } sb.AppendLineIndented("}"); _generatedClasses.Add(classModel); }
public void AppendEnumValueDoc(ScriptBuilder sb, TsEnumValue value) { AppendMemberDoc(sb, value.Field); }
async Task test_mintTokens() { decimal amount = 0; while (true) { subPrintLine("Input amount:"); string str_amount = Console.ReadLine(); try { amount = decimal.Parse(str_amount); break; } catch (Exception e) { subPrintLine("input number"); } } //获取地址的资产列表 Dictionary <string, List <Utxo> > dir = await Helper.GetBalanceByAddress(Config.api, address); if (dir.ContainsKey(Config.id_GAS) == false) { subPrintLine("no gas"); return; } Transaction tran = null; { byte[] script = null; using (var sb = new ScriptBuilder()) { var array = new MyJson.JsonNode_Array(); sb.EmitParamJson(array); //参数倒序入 sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)mintTokens")); //参数倒序入 Hash160 shash = Config.dapp_sgas; sb.EmitAppCall(shash); //nep5脚本 script = sb.ToArray(); } var sgasScripthash = Config.dapp_sgas; var targetaddr = ThinNeo.Helper.GetAddressFromScriptHash(sgasScripthash); subPrintLine("contract address=" + targetaddr);//往合约地址转账 //生成交易 tran = Helper.makeTran(dir[Config.id_GAS], targetaddr, new Hash256(Config.id_GAS), amount); tran.type = TransactionType.InvocationTransaction; var idata = new InvokeTransData(); tran.extdata = idata; idata.script = script; //sign and broadcast var signdata = ThinNeo.Helper.Sign(tran.GetMessage(), prikey); tran.AddWitness(signdata, pubkey, address); var trandata = tran.GetRawData(); var strtrandata = ThinNeo.Helper.Bytes2HexString(trandata); byte[] postdata; var url = Helper.MakeRpcUrlPost(Config.api, "sendrawtransaction", out postdata, new MyJson.JsonNode_ValueString(strtrandata)); var result = await Helper.HttpPost(url, postdata); subPrintLine("得到的结果是:" + result); var json = MyJson.Parse(result).AsDict(); if (json.ContainsKey("result")) { var resultv = json["result"].AsList()[0].AsDict(); var txid = resultv["txid"].AsString(); subPrintLine("txid=" + txid); } } }
private void AppendClassDef(TsClass classModel, ScriptBuilder sb, TsGeneratorOutput generatorOutput) { AddNamespaceHeader(classModel.Name, sb); var typeName = GetTypeName(classModel); var visibility = GetTypeVisibility(classModel, typeName) ? "export " : ""; AddRequestRenameInformation(sb, classModel); AddDocCommentForCustomJsonConverter(sb, classModel); _docAppender.AppendClassDoc(sb, classModel, typeName); sb.AppendFormatIndented("{0}class {1}", visibility, typeName); if (CsharpTypeInfoProvider.StringAbstractions.Contains(classModel.Type)) { sb.AppendLineIndented(" extends String {}"); return; } void EnforceBaseClass <TInterface, TBase>(bool force = false) { if (!force && classModel.BaseType != null) { return; } if (classModel.Type == typeof(TBase)) { return; } if (typeof(TInterface).IsAssignableFrom(classModel.Type)) { classModel.BaseType = new TsClass(typeof(TBase)); } } EnforceBaseClass <IAnalyzer, AnalyzerBase>(); EnforceBaseClass <ITokenizer, TokenizerBase>(); EnforceBaseClass <ITokenFilter, TokenFilterBase>(); EnforceBaseClass <ICharFilter, CharFilterBase>(); EnforceBaseClass <IProperty, PropertyBase>(); EnforceBaseClass <IResponse, ResponseBase>(); EnforceBaseClass <WriteResponseBase, WriteResponseBase>(true); if (classModel.BaseType != null) { sb.AppendFormat(" extends {0}", GetFullyQualifiedTypeName(classModel.BaseType)); } var interfaces = classModel.Interfaces.Where(m => CsharpTypeInfoProvider.ExposedInterfaces.Contains(m.Type)).ToList(); if (interfaces.Count > 0) { var implementations = interfaces.Select(GetFullyQualifiedTypeName).ToArray(); var prefixFormat = " implements {0}"; sb.AppendFormat(prefixFormat, string.Join(" ,", implementations)); } sb.AppendLine(" {"); GenerateProperties(classModel, sb, generatorOutput); sb.AppendLineIndented("}"); _generatedClasses.Add(classModel); //generate a closed cat response type (NEST uses catresponse<TRecord> for all) if (typeof(ICatRecord).IsAssignableFrom(classModel.Type)) { var catResponseName = classModel.Type.Name.Replace("Record", "Response"); AddNamespaceHeader(classModel.Name, sb); sb.AppendLineIndented($"class {catResponseName} extends ResponseBase {{"); using (sb.IncreaseIndentation()) sb.AppendLineIndented($"records: {typeName}[];"); sb.AppendLineIndented("}"); } }
public void AppendClassDoc(ScriptBuilder sb, TsClass classModel, string className) { AppendModelDoc(sb, classModel.Type); }
public void SetUp() { _database = MockRepository.GenerateStub<IDatabase>(); _target = new ScriptBuilder(_database, new TextMessageWriter()); _database.Stub(x => x.GetStatementDelimiter()).Return(";"); }
public void AppendPropertyDoc(ScriptBuilder sb, TsProperty property, string propertyName, string propertyType) { AppendMemberDoc(sb, property.MemberInfo); }
public void FeeIsSignatureContract_TestScope_CurrentHash_NEO_GAS() { var wallet = TestUtils.GenerateTestWallet(); var snapshot = store.GetSnapshot(); // no password on this wallet using (var unlock = wallet.Unlock("")) { var acc = wallet.CreateAccount(); // Fake balance var key = NativeContract.GAS.CreateStorageKey(20, acc.ScriptHash); var entry = snapshot.Storages.GetAndChange(key, () => new StorageItem { Value = new Nep5AccountState().ToByteArray() }); entry.Value = new Nep5AccountState() { Balance = 10000 * NativeContract.GAS.Factor } .ToByteArray(); // Make transaction // Manually creating script byte[] script; using (ScriptBuilder sb = new ScriptBuilder()) { // self-transfer of 1e-8 GAS System.Numerics.BigInteger value = (new BigDecimal(1, 8)).Value; sb.EmitAppCall(NativeContract.GAS.Hash, "transfer", acc.ScriptHash, acc.ScriptHash, value); sb.Emit(OpCode.THROWIFNOT); script = sb.ToArray(); } // trying two custom hashes, for same target account var cosigners = new Cosigner[] { new Cosigner { Account = acc.ScriptHash, Scopes = WitnessScope.CustomContracts, AllowedContracts = new[] { NativeContract.NEO.Hash, NativeContract.GAS.Hash } } }; // using this... var tx = wallet.MakeTransaction(script, acc.ScriptHash, new TransactionAttribute[0], cosigners); Assert.IsNotNull(tx); Assert.IsNull(tx.Witnesses); // ---- // Sign // ---- var data = new ContractParametersContext(tx); bool signed = wallet.Sign(data); Assert.IsTrue(signed); // get witnesses from signed 'data' tx.Witnesses = data.GetWitnesses(); // only a single witness should exist tx.Witnesses.Length.Should().Be(1); // no attributes must exist tx.Attributes.Length.Should().Be(0); // one cosigner must exist tx.Cosigners.Length.Should().Be(1); // Fast check Assert.IsTrue(tx.VerifyWitnesses(snapshot, tx.NetworkFee)); // Check long verificationGas = 0; foreach (var witness in tx.Witnesses) { using (ApplicationEngine engine = new ApplicationEngine(TriggerType.Verification, tx, snapshot, tx.NetworkFee, false)) { engine.LoadScript(witness.VerificationScript); engine.LoadScript(witness.InvocationScript); Assert.AreEqual(VMState.HALT, engine.Execute()); Assert.AreEqual(1, engine.ResultStack.Count); Assert.IsTrue(engine.ResultStack.Pop().GetBoolean()); verificationGas += engine.GasConsumed; } } // get sizeGas var sizeGas = tx.Size * NativeContract.Policy.GetFeePerByte(snapshot); // final check on sum: verification_cost + tx_size Assert.AreEqual(verificationGas + sizeGas, 1298240); // final assert Assert.AreEqual(tx.NetworkFee, verificationGas + sizeGas); } }
public void TestParallel() { var args = new ExecutionEngineArgs() { ScriptTable = new DummyScriptTable ( new byte[] { (byte)EVMOpCode.EQUAL }, new byte[] { (byte)EVMOpCode.EQUAL } ) }; // 5 Scripts var engines = new List <ExecutionEngineBase>() { CreateEngine(args), CreateEngine(args), CreateEngine(args), CreateEngine(args), CreateEngine(args), CreateEngine(args), CreateEngine(args), CreateEngine(args), CreateEngine(args), CreateEngine(args) }; Parallel.ForEach(engines, (engine) => { using (engine) { for (ushort x = 0; x < 1000; x++) { // Load script engine.Clean(x); using (var script = new ScriptBuilder()) { script.EmitPush(x); script.EmitPush(x); script.EmitAppCall(new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, }); engine.LoadScript(script); } // Execute Assert.IsTrue(engine.Execute()); // Check result using (var it = engine.ResultStack.Pop <BooleanStackItem>()) { Assert.IsTrue(it.Value); } } } }); }
private CSharpScript(string code, string path, ScriptOptions options, Type globalsType, Type returnType, ScriptBuilder builder, Script previous) : base(code, path, options, globalsType, returnType, builder, previous) { }
Result.GetVarSize(); //Result static OracleResponse() { using ScriptBuilder sb = new ScriptBuilder(); sb.EmitDynamicCall(NativeContract.Oracle.Hash, "finish"); FixedScript = sb.ToArray(); }
public void System_Runtime_GetInvocationCounter() { var snapshot = TestBlockchain.GetStore().GetSnapshot(); var contracts = (TestDataCache <UInt160, ContractState>)snapshot.Contracts; // Call System.Runtime.GetInvocationCounter syscall var script = new ScriptBuilder(); script.EmitSysCall(InteropService.System_Runtime_GetInvocationCounter); // Init A,B,C contracts // First two drops is for drop method and arguments var contractA = new ContractState() { Script = new byte[] { (byte)OpCode.DROP, (byte)OpCode.DROP }.Concat(script.ToArray()).ToArray() }; var contractB = new ContractState() { Script = new byte[] { (byte)OpCode.DROP, (byte)OpCode.DROP, (byte)OpCode.NOP }.Concat(script.ToArray()).ToArray() }; var contractC = new ContractState() { Script = new byte[] { (byte)OpCode.DROP, (byte)OpCode.DROP, (byte)OpCode.NOP, (byte)OpCode.NOP }.Concat(script.ToArray()).ToArray() }; contracts.DeleteWhere((a, b) => a.ToArray().SequenceEqual(contractA.ScriptHash.ToArray())); contracts.DeleteWhere((a, b) => a.ToArray().SequenceEqual(contractB.ScriptHash.ToArray())); contracts.DeleteWhere((a, b) => a.ToArray().SequenceEqual(contractC.ScriptHash.ToArray())); contracts.Add(contractA.ScriptHash, contractA); contracts.Add(contractB.ScriptHash, contractB); contracts.Add(contractC.ScriptHash, contractC); // Call A,B,B,C script = new ScriptBuilder(); script.EmitSysCall(InteropService.System_Contract_Call, contractA.ScriptHash.ToArray(), "dummyMain", 0); script.EmitSysCall(InteropService.System_Contract_Call, contractB.ScriptHash.ToArray(), "dummyMain", 0); script.EmitSysCall(InteropService.System_Contract_Call, contractB.ScriptHash.ToArray(), "dummyMain", 0); script.EmitSysCall(InteropService.System_Contract_Call, contractC.ScriptHash.ToArray(), "dummyMain", 0); // Execute var engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0, true); engine.LoadScript(script.ToArray()); Assert.AreEqual(engine.Execute(), VMState.HALT); // Check the results CollectionAssert.AreEqual ( engine.ResultStack.Select(u => (int)((VM.Types.Integer)u).GetBigInteger()).ToArray(), new int[] { 1, /* A */ 1, /* B */ 2, /* B */ 1 /* C */ } ); }
//Transfer NEP-5 Asset public static Transaction CreateNep5Transfer(SignDelegate sign) { var from = "AS8UDW7aLhrywLVHFL3ny5tSBaVhWTeZjT".ToScriptHash(); var assetId = new UInt160("ceab719b8baa2310f232ee0d277c061704541cfb".HexToBytes().Reverse().ToArray()); var to = "AS8UDW7aLhrywLVHFL3ny5tSBaVhWTeZjT".ToScriptHash(); var value = 100; //交易输入是 1 GAS var inputs = new List <CoinReference> { //coin reference A new CoinReference() { PrevHash = new UInt256("0x51ac4f7f1662d8c9379ccce3fa7cd2085b9a865edfa53ad892352a41768dd1de".Remove(0, 2).HexToBytes().Reverse().ToArray()), PrevIndex = 0 } }.ToArray(); //交易输出是 0.999 GAS,找回到原地址 var outputs = new List <TransactionOutput> { new TransactionOutput() { AssetId = Blockchain.UtilityToken.Hash, //Asset Id, this is NEO ScriptHash = "AJd31a8rYPEBkY1QSxpsGy8mdU4vTYTD4U".ToScriptHash(), //Receiver Value = new Fixed8((long)(0.999 * (long)Math.Pow(10, 8))) //Value (satoshi unit) } }.ToArray(); //则手续费是 0.001 GAS //Query Balances using (ScriptBuilder sb2 = new ScriptBuilder()) { byte[] script; sb2.EmitAppCall(assetId, "balanceOf", from); sb2.Emit(OpCode.DEPTH, OpCode.PACK); script = sb2.ToArray(); ApplicationEngine engine = ApplicationEngine.Run(script); if (engine.State.HasFlag(VMState.FAULT)) { return(null); } var balances = ((VMArray)engine.ResultStack.Pop())[0]; BigInteger sum = balances.GetBigInteger(); if (sum < value) { Console.WriteLine("Insufficient balance"); return(null); } } //Transfer using (ScriptBuilder sb = new ScriptBuilder()) { sb.EmitAppCall(assetId, "transfer", from, to, value); sb.Emit(OpCode.THROWIFNOT); byte[] nonce = new byte[8]; Random rand = new Random(); rand.NextBytes(nonce); sb.Emit(OpCode.RET, nonce); var tx = new InvocationTransaction { Version = 1, Script = sb.ToArray(), Outputs = outputs, Inputs = inputs, Attributes = new TransactionAttribute[0], Witnesses = new Witness[0] }; return(sign.Invoke(tx)); } }
public override void Process(ScriptBuilder sb) { sb.EmitLabel(Name); }
public void AppendEnumDoc(ScriptBuilder sb, TsEnum enumModel, string enumName) { AppendModelDoc(sb, enumModel.Type); }
protected override void AppendModule(TsModule module, ScriptBuilder sb, TsGeneratorOutput generatorOutput) { var classes = module.Classes.Where(c => !_typeConvertors.IsConvertorRegistered(c.Type) && !c.IsIgnored).ToList(); var enums = module.Enums.Where(e => !_typeConvertors.IsConvertorRegistered(e.Type) && !e.IsIgnored).ToList(); if ((generatorOutput == TsGeneratorOutput.Enums && enums.Count == 0) || (generatorOutput == TsGeneratorOutput.Properties && classes.Count == 0) || (enums.Count == 0 && classes.Count == 0)) { return; } if ((generatorOutput & TsGeneratorOutput.Enums) == TsGeneratorOutput.Enums) { foreach (var enumModel in enums) { if (Ignore(enumModel)) { continue; } AppendEnumDefinition(enumModel, sb, generatorOutput); } } if (((generatorOutput & TsGeneratorOutput.Properties) == TsGeneratorOutput.Properties) || (generatorOutput & TsGeneratorOutput.Fields) == TsGeneratorOutput.Fields) { var cc = classes.Select(c => new { c, order = OrderTypes(c) }).ToList(); var orderedClasses = cc.OrderBy(c => c.order).ToList(); foreach (var oc in orderedClasses) { var classModel = oc.c; var t = classModel.Type; // var x = $"// {oc.order} - {oc.c.Type.FullName}"; // sb.AppendIndented(x); if (t.IsInterface && !CsharpTypeInfoProvider.ExposedInterfaces.Contains(t) && CsharpTypeInfoProvider.ExposedInterfaces.Any(i => i.IsAssignableFrom(t))) { continue; } var c = ReMapClass(classModel); if (Ignore(c)) { continue; } if (_appended.Contains(c.Name)) { continue; } if (_appended.Contains("I" + c.Name)) { continue; } AppendClassDefinition(c, sb, generatorOutput); _appended.Add(c.Name); } } if ((generatorOutput & TsGeneratorOutput.Constants) == TsGeneratorOutput.Constants) { foreach (var classModel in classes) { if (classModel.IsIgnored) { continue; } AppendConstantModule(classModel, sb); } } }
public void TestWritePushData4294967296() { var data = random.NextBytes(4294967296); var actual = new ScriptBuilder(); actual.WritePushData(data); }
public void Runtime_GetNotifications_Test() { UInt160 scriptHash2; var snapshot = Blockchain.Singleton.GetSnapshot(); using (var script = new ScriptBuilder()) { // Notify method script.Emit(OpCode.SWAP, OpCode.NEWARRAY, OpCode.SWAP); script.EmitSysCall(ApplicationEngine.System_Runtime_Notify); // Add return script.EmitPush(true); script.Emit(OpCode.RET); // Mock contract scriptHash2 = script.ToArray().ToScriptHash(); snapshot.Contracts.Delete(scriptHash2); snapshot.Contracts.Add(scriptHash2, new ContractState() { Script = script.ToArray(), Manifest = TestUtils.CreateManifest(scriptHash2, "test", ContractParameterType.Any, ContractParameterType.Integer, ContractParameterType.Integer), }); } // Wrong length using (var engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0, true)) using (var script = new ScriptBuilder()) { // Retrive script.EmitPush(1); script.EmitSysCall(ApplicationEngine.System_Runtime_GetNotifications); // Execute engine.LoadScript(script.ToArray()); Assert.AreEqual(VMState.FAULT, engine.Execute()); } // All test using (var engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0, true)) using (var script = new ScriptBuilder()) { // Notification script.EmitPush(0); script.Emit(OpCode.NEWARRAY); script.EmitPush("testEvent1"); script.EmitSysCall(ApplicationEngine.System_Runtime_Notify); // Call script script.EmitAppCall(scriptHash2, ContractParameterType.Any, "test", "testEvent2", 1); // Drop return script.Emit(OpCode.DROP); // Receive all notifications script.Emit(OpCode.PUSHNULL); script.EmitSysCall(ApplicationEngine.System_Runtime_GetNotifications); // Execute engine.LoadScript(script.ToArray()); var currentScriptHash = engine.EntryScriptHash; Assert.AreEqual(VMState.HALT, engine.Execute()); Assert.AreEqual(1, engine.ResultStack.Count); Assert.AreEqual(2, engine.Notifications.Count); Assert.IsInstanceOfType(engine.ResultStack.Peek(), typeof(VM.Types.Array)); var array = (VM.Types.Array)engine.ResultStack.Pop(); // Check syscall result AssertNotification(array[1], scriptHash2, "testEvent2"); AssertNotification(array[0], currentScriptHash, "testEvent1"); // Check notifications Assert.AreEqual(scriptHash2, engine.Notifications[1].ScriptHash); Assert.AreEqual("testEvent2", engine.Notifications[1].EventName); Assert.AreEqual(currentScriptHash, engine.Notifications[0].ScriptHash); Assert.AreEqual("testEvent1", engine.Notifications[0].EventName); } // Script notifications using (var engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0, true)) using (var script = new ScriptBuilder()) { // Notification script.EmitPush(0); script.Emit(OpCode.NEWARRAY); script.EmitPush("testEvent1"); script.EmitSysCall(ApplicationEngine.System_Runtime_Notify); // Call script script.EmitAppCall(scriptHash2, ContractParameterType.Any, "test", "testEvent2", 1); // Drop return script.Emit(OpCode.DROP); // Receive all notifications script.EmitPush(scriptHash2.ToArray()); script.EmitSysCall(ApplicationEngine.System_Runtime_GetNotifications); // Execute engine.LoadScript(script.ToArray()); var currentScriptHash = engine.EntryScriptHash; Assert.AreEqual(VMState.HALT, engine.Execute()); Assert.AreEqual(1, engine.ResultStack.Count); Assert.AreEqual(2, engine.Notifications.Count); Assert.IsInstanceOfType(engine.ResultStack.Peek(), typeof(VM.Types.Array)); var array = (VM.Types.Array)engine.ResultStack.Pop(); // Check syscall result AssertNotification(array[0], scriptHash2, "testEvent2"); // Check notifications Assert.AreEqual(scriptHash2, engine.Notifications[1].ScriptHash); Assert.AreEqual("testEvent2", engine.Notifications[1].EventName); Assert.AreEqual(currentScriptHash, engine.Notifications[0].ScriptHash); Assert.AreEqual("testEvent1", engine.Notifications[0].EventName); } // Clean storage snapshot.Contracts.Delete(scriptHash2); }
public static ScriptBuilder MintTokens(this ScriptBuilder sb, string tokenSymbol, Address from, Address target, BigInteger amount) { return(sb.CallInterop("Runtime.MintTokens", from, target, tokenSymbol, amount)); }
protected virtual JObject Process(string method, JArray _params) { switch (method) { case "getaccountstate": { UInt160 script_hash = Wallet.ToScriptHash(_params[0].AsString()); AccountState account = Blockchain.Default.GetAccountState(script_hash) ?? new AccountState(script_hash); return(account.ToJson()); } case "getassetstate": { UInt256 asset_id = UInt256.Parse(_params[0].AsString()); AssetState asset = Blockchain.Default.GetAssetState(asset_id); return(asset?.ToJson() ?? throw new RpcException(-100, "Unknown asset")); } case "getbestblockhash": return(Blockchain.Default.CurrentBlockHash.ToString()); case "getblock": { Block block; if (_params[0] is JNumber) { uint index = (uint)_params[0].AsNumber(); block = Blockchain.Default.GetBlock(index); } else { UInt256 hash = UInt256.Parse(_params[0].AsString()); block = Blockchain.Default.GetBlock(hash); } if (block == null) { throw new RpcException(-100, "Unknown block"); } bool verbose = _params.Count >= 2 && _params[1].AsBooleanOrDefault(false); if (verbose) { JObject json = block.ToJson(); json["confirmations"] = Blockchain.Default.Height - block.Index + 1; UInt256 hash = Blockchain.Default.GetNextBlockHash(block.Hash); if (hash != null) { json["nextblockhash"] = hash.ToString(); } return(json); } else { return(block.ToArray().ToHexString()); } } case "getblockcount": return(Blockchain.Default.Height + 1); case "getblockhash": { uint height = (uint)_params[0].AsNumber(); if (height >= 0 && height <= Blockchain.Default.Height) { return(Blockchain.Default.GetBlockHash(height).ToString()); } else { throw new RpcException(-100, "Invalid Height"); } } case "getblocksysfee": { uint height = (uint)_params[0].AsNumber(); if (height >= 0 && height <= Blockchain.Default.Height) { return(Blockchain.Default.GetSysFeeAmount(height).ToString()); } else { throw new RpcException(-100, "Invalid Height"); } } case "getconnectioncount": return(LocalNode.RemoteNodeCount); case "getcontractstate": { UInt160 script_hash = UInt160.Parse(_params[0].AsString()); ContractState contract = Blockchain.Default.GetContract(script_hash); return(contract?.ToJson() ?? throw new RpcException(-100, "Unknown contract")); } case "getrawmempool": return(new JArray(LocalNode.GetMemoryPool().Select(p => (JObject)p.Hash.ToString()))); case "getrawtransaction": { UInt256 hash = UInt256.Parse(_params[0].AsString()); bool verbose = _params.Count >= 2 && _params[1].AsBooleanOrDefault(false); int height = -1; Transaction tx = LocalNode.GetTransaction(hash); if (tx == null) { tx = Blockchain.Default.GetTransaction(hash, out height); } if (tx == null) { throw new RpcException(-100, "Unknown transaction"); } if (verbose) { JObject json = tx.ToJson(); if (height >= 0) { Header header = Blockchain.Default.GetHeader((uint)height); json["blockhash"] = header.Hash.ToString(); json["confirmations"] = Blockchain.Default.Height - header.Index + 1; json["blocktime"] = header.Timestamp; } return(json); } else { return(tx.ToArray().ToHexString()); } } case "getstorage": { UInt160 script_hash = UInt160.Parse(_params[0].AsString()); byte[] key = _params[1].AsString().HexToBytes(); StorageItem item = Blockchain.Default.GetStorageItem(new StorageKey { ScriptHash = script_hash, Key = key }) ?? new StorageItem(); return(item.Value?.ToHexString()); } case "gettxout": { UInt256 hash = UInt256.Parse(_params[0].AsString()); ushort index = (ushort)_params[1].AsNumber(); return(Blockchain.Default.GetUnspent(hash, index)?.ToJson(index)); } case "getvalidators": { var validators = Blockchain.Default.GetValidators(); return(Blockchain.Default.GetEnrollments().Select(p => { JObject validator = new JObject(); validator["publickey"] = p.PublicKey.ToString(); validator["votes"] = p.Votes.ToString(); validator["active"] = validators.Contains(p.PublicKey); return validator; }).ToArray()); } case "invoke": { UInt160 script_hash = UInt160.Parse(_params[0].AsString()); ContractParameter[] parameters = ((JArray)_params[1]).Select(p => ContractParameter.FromJson(p)).ToArray(); byte[] script; using (ScriptBuilder sb = new ScriptBuilder()) { script = sb.EmitAppCall(script_hash, parameters).ToArray(); } return(GetInvokeResult(script)); } case "invokefunction": { UInt160 script_hash = UInt160.Parse(_params[0].AsString()); string operation = _params[1].AsString(); ContractParameter[] args = _params.Count >= 3 ? ((JArray)_params[2]).Select(p => ContractParameter.FromJson(p)).ToArray() : new ContractParameter[0]; byte[] script; using (ScriptBuilder sb = new ScriptBuilder()) { script = sb.EmitAppCall(script_hash, operation, args).ToArray(); } return(GetInvokeResult(script)); } case "invokescript": { byte[] script = _params[0].AsString().HexToBytes(); return(GetInvokeResult(script)); } case "sendrawtransaction": { Transaction tx = Transaction.DeserializeFrom(_params[0].AsString().HexToBytes()); return(LocalNode.Relay(tx)); } case "submitblock": { Block block = _params[0].AsString().HexToBytes().AsSerializable <Block>(); return(LocalNode.Relay(block)); } case "validateaddress": { JObject json = new JObject(); UInt160 scriptHash; try { scriptHash = Wallet.ToScriptHash(_params[0].AsString()); } catch { scriptHash = null; } json["address"] = _params[0]; json["isvalid"] = scriptHash != null; return(json); } case "getpeers": { JObject json = new JObject(); { JArray unconnectedPeers = new JArray(); foreach (IPEndPoint peer in LocalNode.GetUnconnectedPeers()) { JObject peerJson = new JObject(); peerJson["address"] = peer.Address.ToString(); peerJson["port"] = peer.Port; unconnectedPeers.Add(peerJson); } json["unconnected"] = unconnectedPeers; } { JArray badPeers = new JArray(); foreach (IPEndPoint peer in LocalNode.GetBadPeers()) { JObject peerJson = new JObject(); peerJson["address"] = peer.Address.ToString(); peerJson["port"] = peer.Port; badPeers.Add(peerJson); } json["bad"] = badPeers; } { JArray connectedPeers = new JArray(); foreach (RemoteNode node in LocalNode.GetRemoteNodes()) { JObject peerJson = new JObject(); peerJson["address"] = node.RemoteEndpoint.Address.ToString(); peerJson["port"] = node.ListenerEndpoint?.Port ?? 0; connectedPeers.Add(peerJson); } json["connected"] = connectedPeers; } return(json); } case "getversion": { JObject json = new JObject(); json["port"] = LocalNode.Port; json["nonce"] = LocalNode.Nonce; json["useragent"] = LocalNode.UserAgent; return(json); } default: throw new RpcException(-32601, "Method not found"); } }
public static ScriptBuilder TransferTokens(this ScriptBuilder sb, string tokenSymbol, Address from, Address to, BigInteger amount) { return(sb.CallInterop("Runtime.TransferTokens", from, to, tokenSymbol, amount)); }
protected override void AppendModule(TsModule module, ScriptBuilder sb, TsGeneratorOutput generatorOutput) { // Use reflection to grab the internal property which was removed! var typeConverters = (TypeConvertorCollection)_typeConvertersMember.GetValue(this); var classes = module.Classes.Where(c => !typeConverters.IsConvertorRegistered(c.Type) && !c.IsIgnored) // .OrderBy(c => GetTypeName(c)) // Sorting breaks inheritance .ToList(); var baseClasses = classes .Where(c => c.BaseType != null) .Select(c => c.BaseType.Type.FullName) .Distinct() .OrderBy(c => c) .ToList(); var enums = module.Enums.Where(e => !typeConverters.IsConvertorRegistered(e.Type) && !e.IsIgnored).OrderBy(e => GetTypeName(e)).ToList(); if ((generatorOutput == TsGeneratorOutput.Enums && enums.Count == 0) || (generatorOutput == TsGeneratorOutput.Properties && classes.Count == 0) || (enums.Count == 0 && classes.Count == 0)) { return; } if (generatorOutput == TsGeneratorOutput.Properties && !classes.Any(c => c.Fields.Any() || c.Properties.Any())) { return; } if (generatorOutput == TsGeneratorOutput.Constants && !classes.Any(c => c.Constants.Any())) { return; } string moduleName = GetModuleName(module); bool generateModuleHeader = moduleName != string.Empty; if (generateModuleHeader) { if (generatorOutput != TsGeneratorOutput.Enums && (generatorOutput & TsGeneratorOutput.Constants) != TsGeneratorOutput.Constants) { sb.Append(Mode == TsGenerationModes.Definitions ? "declare " : " export "); } sb.AppendLine($"{(Mode == TsGenerationModes.Definitions ? "namespace" : "module")} {moduleName} {{"); } using (sb.IncreaseIndentation()) { if ((generatorOutput & TsGeneratorOutput.Enums) == TsGeneratorOutput.Enums) { foreach (TsEnum enumModel in enums) { this.AppendEnumDefinition(enumModel, sb, generatorOutput); } } if (((generatorOutput & TsGeneratorOutput.Properties) == TsGeneratorOutput.Properties) || (generatorOutput & TsGeneratorOutput.Fields) == TsGeneratorOutput.Fields) { foreach (TsClass baseClassModel in classes.Where(c => baseClasses.Contains(c.Type.FullName))) { this.AppendClassDefinition(baseClassModel, sb, generatorOutput); } } if (((generatorOutput & TsGeneratorOutput.Properties) == TsGeneratorOutput.Properties) || (generatorOutput & TsGeneratorOutput.Fields) == TsGeneratorOutput.Fields) { foreach (TsClass classModel in classes.Where(c => !baseClasses.Contains(c.Type.FullName))) { this.AppendClassDefinition(classModel, sb, generatorOutput); } } if ((generatorOutput & TsGeneratorOutput.Constants) == TsGeneratorOutput.Constants) { foreach (TsClass classModel in classes) { if (classModel.IsIgnored) { continue; } this.AppendConstantModule(classModel, sb); } } } if (generateModuleHeader) { sb.AppendLine("}"); } }
public static ScriptBuilder TransferBalance(this ScriptBuilder sb, string tokenSymbol, Address from, Address to) { return(sb.CallInterop("Runtime.TransferBalance", from, to, tokenSymbol)); }
public void OnPersist(Snapshot snapshot, IReadOnlyList <Blockchain.ApplicationExecuted> applicationExecutedList) { // Start freshly with a new DBCache for each block. ResetBatch(); Dictionary <Nep5BalanceKey, Nep5Balance> nep5BalancesChanged = new Dictionary <Nep5BalanceKey, Nep5Balance>(); ushort transferIndex = 0; foreach (Blockchain.ApplicationExecuted appExecuted in applicationExecutedList) { // Executions that fault won't modify storage, so we can skip them. if (appExecuted.VMState.HasFlag(VMState.FAULT)) { continue; } foreach (var notifyEventArgs in appExecuted.Notifications) { if (!(notifyEventArgs?.State is VM.Types.Array stateItems) || stateItems.Count == 0 || !(notifyEventArgs.ScriptContainer is Transaction transaction)) { continue; } HandleNotification(snapshot, transaction, notifyEventArgs.ScriptHash, stateItems, nep5BalancesChanged, ref transferIndex); } } foreach (var nep5BalancePair in nep5BalancesChanged) { // get guarantee accurate balances by calling balanceOf for keys that changed. byte[] script; using (ScriptBuilder sb = new ScriptBuilder()) { sb.EmitAppCall(nep5BalancePair.Key.AssetScriptHash, "balanceOf", nep5BalancePair.Key.UserScriptHash.ToArray()); script = sb.ToArray(); } ApplicationEngine engine = ApplicationEngine.Run(script, snapshot); if (engine.State.HasFlag(VMState.FAULT)) { continue; } if (engine.ResultStack.Count <= 0) { continue; } nep5BalancePair.Value.Balance = engine.ResultStack.Pop().GetBigInteger(); nep5BalancePair.Value.LastUpdatedBlock = snapshot.Height; if (nep5BalancePair.Value.Balance == 0) { _balances.Delete(nep5BalancePair.Key); continue; } var itemToChange = _balances.GetAndChange(nep5BalancePair.Key, () => nep5BalancePair.Value); if (itemToChange != nep5BalancePair.Value) { itemToChange.FromReplica(nep5BalancePair.Value); } } }
public static ScriptBuilder TransferNFT(this ScriptBuilder sb, string tokenSymbol, Address from, string to, BigInteger tokenId)//todo check if this is valid { return(sb.CallInterop("Runtime.TransferToken", from, to, tokenSymbol, tokenId)); }
public void FeeIsSignatureContract_TestScope_FeeOnly_Default() { // Global is supposed to be default Signer cosigner = new Signer(); cosigner.Scopes.Should().Be(WitnessScope.None); var wallet = TestUtils.GenerateTestWallet(); var snapshot = Blockchain.Singleton.GetSnapshot(); // no password on this wallet using (var unlock = wallet.Unlock("")) { var acc = wallet.CreateAccount(); // Fake balance var key = NativeContract.GAS.CreateStorageKey(20, acc.ScriptHash); var entry = snapshot.Storages.GetAndChange(key, () => new StorageItem(new AccountState())); entry.GetInteroperable <AccountState>().Balance = 10000 * NativeContract.GAS.Factor; snapshot.Commit(); // Make transaction // Manually creating script byte[] script; using (ScriptBuilder sb = new ScriptBuilder()) { // self-transfer of 1e-8 GAS BigInteger value = (new BigDecimal(1, 8)).Value; sb.EmitAppCall(NativeContract.GAS.Hash, "transfer", acc.ScriptHash, acc.ScriptHash, value); sb.Emit(OpCode.ASSERT); script = sb.ToArray(); } // try to use fee only inside the smart contract var signers = new Signer[] { new Signer { Account = acc.ScriptHash, Scopes = WitnessScope.None } }; Assert.ThrowsException <InvalidOperationException>(() => wallet.MakeTransaction(script, acc.ScriptHash, signers)); // change to global scope signers[0].Scopes = WitnessScope.Global; var tx = wallet.MakeTransaction(script, acc.ScriptHash, signers); Assert.IsNotNull(tx); Assert.IsNull(tx.Witnesses); // ---- // Sign // ---- var data = new ContractParametersContext(tx); bool signed = wallet.Sign(data); Assert.IsTrue(signed); // get witnesses from signed 'data' tx.Witnesses = data.GetWitnesses(); tx.Witnesses.Length.Should().Be(1); // Fast check Assert.IsTrue(tx.VerifyWitnesses(snapshot, tx.NetworkFee)); // Check long verificationGas = 0; foreach (var witness in tx.Witnesses) { using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Verification, tx, snapshot, tx.NetworkFee)) { engine.LoadScript(witness.VerificationScript); engine.LoadScript(witness.InvocationScript); Assert.AreEqual(VMState.HALT, engine.Execute()); Assert.AreEqual(1, engine.ResultStack.Count); Assert.IsTrue(engine.ResultStack.Pop().GetBoolean()); verificationGas += engine.GasConsumed; } } // get sizeGas var sizeGas = tx.Size * NativeContract.Policy.GetFeePerByte(snapshot); // final check on sum: verification_cost + tx_size Assert.AreEqual(1244390, verificationGas + sizeGas); // final assert Assert.AreEqual(tx.NetworkFee, verificationGas + sizeGas); } }
public static ScriptBuilder CrossTransferNFT(this ScriptBuilder sb, Address destinationChain, string tokenSymbol, Address from, string to, BigInteger tokenId) { return(sb.CallInterop("Runtime.SendToken", destinationChain, from, to, tokenSymbol, tokenId)); }
private void GetBalance() { Blockchain blockchain = LocalNode.Root.Blockchain; try { UInt160 bcpAssetId = Genesis.BcpContractAddress; UInt160 bctAssetId = Genesis.BctContractAddress; using (ScriptBuilder sb = new ScriptBuilder()) { sb.EmitSysCall("Zoro.NativeNEP5.Call", "BalanceOf", bcpAssetId, Account.ScriptHash); //sb.EmitSysCall("Zoro.NativeNEP5.Call", "Decimals", bcpAssetId); //var script = sb.ToArray().ToHexString(); //Zoro.IO.Json.JArray _params = new Zoro.IO.Json.JArray(); //_params.Add(""); //_params.Add(script); var script = sb.ToArray(); ApplicationEngine engine = ApplicationEngine.Run(script, blockchain, testMode: true); Zoro.IO.Json.JObject json = new Zoro.IO.Json.JObject(); json["script"] = script.ToHexString(); json["state"] = engine.State; json["gas_consumed"] = engine.GasConsumed.ToString(); try { json["stack"] = new Zoro.IO.Json.JArray(engine.ResultStack.Select(p => p.ToParameter().ToJson())); } catch (InvalidOperationException) { json["stack"] = "error: recursive reference"; } //var info = handler.Process("invokescript", _params); var value = GetBalanceFromJson(json.ToString()); lblZoro.Text = value; } using (ScriptBuilder sb = new ScriptBuilder()) { sb.EmitSysCall("Zoro.NativeNEP5.Call", "BalanceOf", bctAssetId, Account.ScriptHash); //sb.EmitSysCall("Zoro.NativeNEP5.Call", "Decimals", bctAssetId); //var script = sb.ToArray().ToHexString(); //Zoro.IO.Json.JArray _params = new Zoro.IO.Json.JArray(); //_params.Add(""); //_params.Add(script); var script = sb.ToArray(); ApplicationEngine engine = ApplicationEngine.Run(script, blockchain, testMode: true); Zoro.IO.Json.JObject json = new Zoro.IO.Json.JObject(); json["script"] = script.ToHexString(); json["state"] = engine.State; json["gas_consumed"] = engine.GasConsumed.ToString(); try { json["stack"] = new Zoro.IO.Json.JArray(engine.ResultStack.Select(p => p.ToParameter().ToJson())); } catch (InvalidOperationException) { json["stack"] = "error: recursive reference"; } //var info = handler.Process("invokescript", _params); var value = GetBalanceFromJson(json.ToString()); lblBct.Text = value; } } catch (Exception ex) { MessageBox.Show("获取余额出错!" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } }
public static ScriptBuilder AllowGas(this ScriptBuilder sb, Address from, Address to, BigInteger gasPrice, BigInteger gasLimit) { return(sb.CallContract(Nexus.GasContractName, "AllowGas", from, to, gasPrice, gasLimit)); }
public void FeeIsSignatureContract_TestScope_CalledByEntry_Plus_GAS() { var wallet = TestUtils.GenerateTestWallet(); var snapshot = store.GetSnapshot(); // no password on this wallet using (var unlock = wallet.Unlock("")) { var acc = wallet.CreateAccount(); // Fake balance var key = NativeContract.GAS.CreateStorageKey(20, acc.ScriptHash); var entry = snapshot.Storages.GetAndChange(key, () => new StorageItem { Value = new Nep5AccountState().ToByteArray() }); entry.Value = new Nep5AccountState() { Balance = 10000 * NativeContract.GAS.Factor } .ToByteArray(); // Make transaction // Manually creating script byte[] script; using (ScriptBuilder sb = new ScriptBuilder()) { // self-transfer of 1e-8 GAS System.Numerics.BigInteger value = (new BigDecimal(1, 8)).Value; sb.EmitAppCall(NativeContract.GAS.Hash, "transfer", acc.ScriptHash, acc.ScriptHash, value); sb.Emit(OpCode.THROWIFNOT); script = sb.ToArray(); } // trying CalledByEntry together with GAS var cosigners = new Cosigner[] { new Cosigner { Account = acc.ScriptHash, // This combination is supposed to actually be an OR, // where it's valid in both Entry and also for Custom hash provided (in any execution level) // it would be better to test this in the future including situations where a deeper call level uses this custom witness successfully Scopes = WitnessScope.CustomContracts | WitnessScope.CalledByEntry, AllowedContracts = new[] { NativeContract.GAS.Hash } } }; // using this... var tx = wallet.MakeTransaction(script, acc.ScriptHash, new TransactionAttribute[0], cosigners); Assert.IsNotNull(tx); Assert.IsNull(tx.Witnesses); // ---- // Sign // ---- var data = new ContractParametersContext(tx); bool signed = wallet.Sign(data); Assert.IsTrue(signed); // get witnesses from signed 'data' tx.Witnesses = data.GetWitnesses(); tx.Witnesses.Length.Should().Be(1); // Fast check Assert.IsTrue(tx.VerifyWitnesses(snapshot, tx.NetworkFee)); // Check long verificationGas = 0; foreach (var witness in tx.Witnesses) { using (ApplicationEngine engine = new ApplicationEngine(TriggerType.Verification, tx, snapshot, tx.NetworkFee, false)) { engine.LoadScript(witness.VerificationScript); engine.LoadScript(witness.InvocationScript); Assert.AreEqual(VMState.HALT, engine.Execute()); Assert.AreEqual(1, engine.ResultStack.Count); Assert.IsTrue(engine.ResultStack.Pop().GetBoolean()); verificationGas += engine.GasConsumed; } } // get sizeGas var sizeGas = tx.Size * NativeContract.Policy.GetFeePerByte(snapshot); // final check on sum: verification_cost + tx_size Assert.AreEqual(verificationGas + sizeGas, 1278240); // final assert Assert.AreEqual(tx.NetworkFee, verificationGas + sizeGas); } }
private static void GenerateDrawers() { Dictionary <string, CodeCompileUnit> classes = new Dictionary <string, CodeCompileUnit>(); foreach (var item in Util.GetAllTypesWithAssemblyPath()) { var type = item.type; if (type.IsVisible == false) { continue; } if (type.IsGenericType || type == typeof(Link) || type.BaseType == null || type.BaseType.GetGenericArguments().Length == 0 || typeof(Link).IsAssignableFrom(type) == false) { continue; } CodeTypeDeclaration drawerClass = new CodeTypeDeclaration($"{type.Name}Drawer"); drawerClass.BaseTypes.Add(new CodeTypeReference("LinkPropertyDrawer", new[] { new CodeTypeReference(type.BaseType.GetGenericArguments()[0]) })); drawerClass.CustomAttributes.Add(new CodeAttributeDeclaration( new CodeTypeReference("CustomPropertyDrawer"), new CodeAttributeArgument(new CodeTypeOfExpression(type)))); if (classes.TryGetValue(item.assemblyLocation, out CodeCompileUnit file) == false) { file = new CodeCompileUnit(); CodeNamespace namespaces = new CodeNamespace("SwiftFramework.Core.Editor"); namespaces.Imports.Add(new CodeNamespaceImport("UnityEditor")); file.Namespaces.Add(namespaces); classes.Add(item.assemblyLocation, file); } file.Namespaces[0].Types.Add(drawerClass); } foreach (KeyValuePair <string, CodeCompileUnit> c in classes) { FileInfo file = new FileInfo(c.Key); var dir = Path.Combine(file.Directory.FullName, "Editor"); if (dir.StartsWith(Application.dataPath.Replace('/', Path.DirectorySeparatorChar)) == false) { continue; } if (Directory.Exists(dir) == false) { Directory.CreateDirectory(dir); } string filePath = $"{dir}/LinkDrawers.cs"; ScriptBuilder.SaveClassToDisc(c.Value, filePath, false); } }
private void timer1_Tick(object sender, EventArgs e) { uint walletHeight = 0; if (Program.CurrentWallet != null) { walletHeight = (Program.CurrentWallet.WalletHeight > 0) ? Program.CurrentWallet.WalletHeight - 1 : 0; } lbl_height.Text = $"{walletHeight}/{Blockchain.Singleton.Height}/{Blockchain.Singleton.HeaderHeight}"; lbl_count_node.Text = LocalNode.Singleton.ConnectedCount.ToString(); TimeSpan persistence_span = DateTime.UtcNow - persistence_time; if (persistence_span < TimeSpan.Zero) { persistence_span = TimeSpan.Zero; } if (persistence_span > Blockchain.TimePerBlock) { toolStripProgressBar1.Style = ProgressBarStyle.Marquee; } else { toolStripProgressBar1.Value = persistence_span.Seconds; toolStripProgressBar1.Style = ProgressBarStyle.Blocks; } if (Program.CurrentWallet != null) { if (Program.CurrentWallet.WalletHeight <= Blockchain.Singleton.Height + 1) { if (balance_changed) { using (Snapshot snapshot = Blockchain.Singleton.GetSnapshot()) { IEnumerable <Coin> coins = Program.CurrentWallet?.GetCoins().Where(p => !p.State.HasFlag(CoinState.Spent)) ?? Enumerable.Empty <Coin>(); Fixed8 bonus_available = snapshot.CalculateBonus(Program.CurrentWallet.GetUnclaimedCoins().Select(p => p.Reference)); Fixed8 bonus_unavailable = snapshot.CalculateBonus(coins.Where(p => p.State.HasFlag(CoinState.Confirmed) && p.Output.AssetId.Equals(Blockchain.GoverningToken.Hash)).Select(p => p.Reference), snapshot.Height + 1); Fixed8 bonus = bonus_available + bonus_unavailable; var assets = coins.GroupBy(p => p.Output.AssetId, (k, g) => new { Asset = snapshot.Assets.TryGet(k), Value = g.Sum(p => p.Output.Value), Claim = k.Equals(Blockchain.UtilityToken.Hash) ? bonus : Fixed8.Zero }).ToDictionary(p => p.Asset.AssetId); if (bonus != Fixed8.Zero && !assets.ContainsKey(Blockchain.UtilityToken.Hash)) { assets[Blockchain.UtilityToken.Hash] = new { Asset = snapshot.Assets.TryGet(Blockchain.UtilityToken.Hash), Value = Fixed8.Zero, Claim = bonus }; } var balance_ans = coins.Where(p => p.Output.AssetId.Equals(Blockchain.GoverningToken.Hash)).GroupBy(p => p.Output.ScriptHash).ToDictionary(p => p.Key, p => p.Sum(i => i.Output.Value)); var balance_anc = coins.Where(p => p.Output.AssetId.Equals(Blockchain.UtilityToken.Hash)).GroupBy(p => p.Output.ScriptHash).ToDictionary(p => p.Key, p => p.Sum(i => i.Output.Value)); foreach (ListViewItem item in listView1.Items) { UInt160 script_hash = item.Name.ToScriptHash(); Fixed8 ans = balance_ans.ContainsKey(script_hash) ? balance_ans[script_hash] : Fixed8.Zero; Fixed8 anc = balance_anc.ContainsKey(script_hash) ? balance_anc[script_hash] : Fixed8.Zero; item.SubItems["ans"].Text = ans.ToString(); item.SubItems["anc"].Text = anc.ToString(); } foreach (AssetState asset in listView2.Items.OfType <ListViewItem>().Select(p => p.Tag as AssetState).Where(p => p != null).ToArray()) { if (!assets.ContainsKey(asset.AssetId)) { listView2.Items.RemoveByKey(asset.AssetId.ToString()); } } foreach (var asset in assets.Values) { string value_text = asset.Value.ToString() + (asset.Asset.AssetId.Equals(Blockchain.UtilityToken.Hash) ? $"+({asset.Claim})" : ""); if (listView2.Items.ContainsKey(asset.Asset.AssetId.ToString())) { listView2.Items[asset.Asset.AssetId.ToString()].SubItems["value"].Text = value_text; } else { string asset_name = asset.Asset.AssetType == AssetType.GoverningToken ? "OXS" : asset.Asset.AssetType == AssetType.UtilityToken ? "OXC" : asset.Asset.GetName(); listView2.Items.Add(new ListViewItem(new[] { new ListViewItem.ListViewSubItem { Name = "name", Text = asset_name }, new ListViewItem.ListViewSubItem { Name = "type", Text = asset.Asset.AssetType.ToString() }, new ListViewItem.ListViewSubItem { Name = "value", Text = value_text }, new ListViewItem.ListViewSubItem { ForeColor = Color.Gray, Name = "issuer", Text = $"{LanHelper.LocalLanguage("unknown issuer")}[{asset.Asset.Owner}]" } }, -1, listView2.Groups["unchecked"]) { Name = asset.Asset.AssetId.ToString(), Tag = asset.Asset, UseItemStyleForSubItems = false }); } } balance_changed = false; } } foreach (ListViewItem item in listView2.Groups["unchecked"].Items.OfType <ListViewItem>().ToArray()) { ListViewItem.ListViewSubItem subitem = item.SubItems["issuer"]; AssetState asset = (AssetState)item.Tag; CertificateQueryResult result; if (asset.AssetType == AssetType.GoverningToken || asset.AssetType == AssetType.UtilityToken) { result = new CertificateQueryResult { Type = CertificateQueryResultType.System }; } else { result = CertificateQueryService.Query(asset.Owner); } using (result) { subitem.Tag = result.Type; switch (result.Type) { case CertificateQueryResultType.Querying: case CertificateQueryResultType.QueryFailed: break; case CertificateQueryResultType.System: subitem.ForeColor = Color.Green; subitem.Text = LanHelper.LocalLanguage("OX system"); break; case CertificateQueryResultType.Invalid: subitem.ForeColor = Color.Red; subitem.Text = $"[{ LanHelper.LocalLanguage("Invalid")}][{asset.Owner}]"; break; case CertificateQueryResultType.Expired: subitem.ForeColor = Color.Yellow; subitem.Text = $"[{LanHelper.LocalLanguage("Expired")}]{result.Certificate.Subject}[{asset.Owner}]"; break; case CertificateQueryResultType.Good: subitem.ForeColor = Color.Black; subitem.Text = $"{result.Certificate.Subject}[{asset.Owner}]"; break; } switch (result.Type) { case CertificateQueryResultType.System: case CertificateQueryResultType.Missing: case CertificateQueryResultType.Invalid: case CertificateQueryResultType.Expired: case CertificateQueryResultType.Good: item.Group = listView2.Groups["checked"]; break; } } } } if (check_nep5_balance && persistence_span > TimeSpan.FromSeconds(2)) { UInt160[] addresses = Program.CurrentWallet.GetAccounts().Select(p => p.ScriptHash).ToArray(); foreach (string s in Settings.Default.NEP5Watched) { UInt160 script_hash = UInt160.Parse(s); byte[] script; using (ScriptBuilder sb = new ScriptBuilder()) { foreach (UInt160 address in addresses) { sb.EmitAppCall(script_hash, "balanceOf", address); } sb.Emit(OpCode.DEPTH, OpCode.PACK); sb.EmitAppCall(script_hash, "decimals"); sb.EmitAppCall(script_hash, "name"); script = sb.ToArray(); } ApplicationEngine engine = ApplicationEngine.Run(script); if (engine.State.HasFlag(VMState.FAULT)) { continue; } string name = engine.ResultStack.Pop().GetString(); byte decimals = (byte)engine.ResultStack.Pop().GetBigInteger(); BigInteger amount = ((VMArray)engine.ResultStack.Pop()).Aggregate(BigInteger.Zero, (x, y) => x + y.GetBigInteger()); if (amount == 0) { listView2.Items.RemoveByKey(script_hash.ToString()); continue; } BigDecimal balance = new BigDecimal(amount, decimals); string value_text = balance.ToString(); if (listView2.Items.ContainsKey(script_hash.ToString())) { listView2.Items[script_hash.ToString()].SubItems["value"].Text = value_text; } else { listView2.Items.Add(new ListViewItem(new[] { new ListViewItem.ListViewSubItem { Name = "name", Text = name }, new ListViewItem.ListViewSubItem { Name = "type", Text = "NEP-5" }, new ListViewItem.ListViewSubItem { Name = "value", Text = value_text }, new ListViewItem.ListViewSubItem { ForeColor = Color.Gray, Name = "issuer", Text = $"ScriptHash:{script_hash}" } }, -1, listView2.Groups["checked"]) { Name = script_hash.ToString(), UseItemStyleForSubItems = false }); } } check_nep5_balance = false; } } }
public void TestFindMatchableDemandPass() { ExecutionEngine engine = LoadContract("HubContract"); var nowTime = 101; byte[] expiredExpiry = BitConverter.GetBytes(100).ToArray(); byte[] futureExpiry = BitConverter.GetBytes(102).ToArray(); // demand1 - already expired var demand1 = expiredExpiry.Concat(new byte[] { // expiry (4 byte timestamp) (prepended) // itemValue (100000000) 0x00, 0xE1, 0xF5, 0x05, 0x00, // owner script hash 5, 4, 3, 2, 1, 5, 4, 3, 2, 1, // line - 10 bytes 5, 4, 3, 2, 1, 5, 4, 3, 2, 0xFF, // repRequired 1, 0, // itemSize 1 // info }).Concat(Info).ToArray(); // demand2 - item too large var demand2 = futureExpiry.Concat(new byte[] { // expiry (4 byte timestamp) (prepended) // itemValue (100000000) 0x00, 0xE1, 0xF5, 0x05, 0x00, // owner script hash 5, 4, 3, 2, 1, 5, 4, 3, 2, 1, // line - 10 bytes 5, 4, 3, 2, 1, 5, 4, 3, 2, 0xFF, // repRequired 1, 0, // itemSize 2 // info }).Concat(Info).ToArray(); // demand3 - suitable var demand3 = futureExpiry.Concat(new byte[] { // expiry (4 byte timestamp) (prepended) // itemValue (100000000) 0x00, 0xE1, 0xF5, 0x05, 0x00, // owner script hash 5, 4, 3, 2, 1, 5, 4, 3, 2, 1, // line - 10 bytes 5, 4, 3, 2, 1, 5, 4, 3, 2, 0xFF, // repRequired 1, 0, // itemSize 1 // info }).Concat(Info).ToArray(); var demands = demand1.Concat(demand2).Concat(demand3).ToArray(); using (ScriptBuilder sb = new ScriptBuilder()) { sb.EmitPush(nowTime); // args[4] - nowTime sb.EmitPush(100); // args[3] - expiresAfter sb.EmitPush(1); // args[2] - carrySpace sb.EmitPush(0); // args[1] - repRequired sb.EmitPush(demands); // args[0] sb.EmitPush(5); sb.Emit(OpCode.PACK); sb.EmitPush("test_demand_findMatchableDemand"); // operation ExecuteScript(engine, sb); } var result = engine.EvaluationStack.Peek().GetByteArray(); Assert.Equal(demand3, result); }
internal override Script Make(string code, string path, ScriptOptions options, Type globalsType, Type returnType, ScriptBuilder builder, Script previous) { return new CSharpScript(code, path, options, globalsType, returnType, builder, previous); }
public void TestFindMatchableDemandWhenFirstIsMatched() { var nowTime = 101; byte[] expiredExpiry = BitConverter.GetBytes(100).ToArray(); byte[] futureExpiry = BitConverter.GetBytes(102).ToArray(); // demand1 - suitable but matched :( var demand1 = futureExpiry.Concat(new byte[] { // expiry (4 byte timestamp) (prepended) // itemValue (100000000) 0x00, 0xE1, 0xF5, 0x05, 0x00, // owner script hash 5, 4, 3, 2, 1, 5, 4, 3, 2, 1, // line - 10 bytes 5, 4, 3, 2, 1, 5, 4, 3, 2, 0xFF, // repRequired 1, 0, // itemSize 1 // info }).Concat(Info).ToArray(); var demand1MatchKey = futureExpiry.Concat(new byte[] { // expiry (4 byte timestamp) (prepended) // itemValue (100000000) 0x00, 0xE1, 0xF5, 0x05, 0x00, // owner script hash 5, 4, 3, 2, 1, 5, 4, 3, 2, 1, // line - 10 bytes 5, 4, 3, 2, 1, 5, 4, 3, 2, 0xFF, }).ToArray(); // demand2 - suitable, unmatched var demand2 = futureExpiry.Concat(new byte[] { // expiry (4 byte timestamp) (prepended) // itemValue (100000000), slightly different to demand1 above 0x01, 0xE1, 0xF5, 0x05, 0x00, // owner script hash 5, 4, 3, 2, 1, 5, 4, 3, 2, 1, // line - 10 bytes 5, 4, 3, 2, 1, 5, 4, 3, 2, 0xFF, // repRequired 1, 0, // itemSize 1 // info }).Concat(Info).ToArray(); ExecutionEngine engine1 = LoadContract("HubContract"); using (ScriptBuilder sb = new ScriptBuilder()) { sb.EmitPush(new byte[] { 1 }); // args[1] - value sb.EmitPush(demand1MatchKey); // args[0] - key sb.EmitPush(2); sb.Emit(OpCode.PACK); sb.EmitPush("test_storage_put"); // operation ExecuteScript(engine1, sb); } ExecutionEngine engine2 = LoadContract("HubContract"); var demands = demand1.Concat(demand2).ToArray(); using (ScriptBuilder sb = new ScriptBuilder()) { sb.EmitPush(nowTime); // args[4] - nowTime sb.EmitPush(100); // args[3] - expiresAfter sb.EmitPush(1); // args[2] - carrySpace sb.EmitPush(0); // args[1] - repRequired sb.EmitPush(demands); // args[0] sb.EmitPush(5); sb.Emit(OpCode.PACK); sb.EmitPush("test_demand_findMatchableDemand"); // operation ExecuteScript(engine2, sb); } var result = engine2.EvaluationStack.Peek().GetByteArray(); Assert.Equal(demand2, result); }