diff --git a/src/neo/NeoSystem.cs b/src/neo/NeoSystem.cs
index e9e8335bb4..b837426d45 100644
--- a/src/neo/NeoSystem.cs
+++ b/src/neo/NeoSystem.cs
@@ -2,12 +2,10 @@
using Neo.Consensus;
using Neo.Ledger;
using Neo.Network.P2P;
-using Neo.Network.RPC;
using Neo.Persistence;
using Neo.Plugins;
using Neo.Wallets;
using System;
-using System.Net;
namespace Neo
{
@@ -24,7 +22,6 @@ public class NeoSystem : IDisposable
public IActorRef LocalNode { get; }
internal IActorRef TaskManager { get; }
public IActorRef Consensus { get; private set; }
- public RpcServer RpcServer { get; private set; }
private readonly IStore store;
private ChannelsConfig start_message = null;
@@ -47,7 +44,6 @@ public void Dispose()
{
foreach (var p in Plugin.Plugins)
p.Dispose();
- RpcServer?.Dispose();
EnsureStoped(LocalNode);
// Dispose will call ActorSystem.Terminate()
ActorSystem.Dispose();
@@ -90,13 +86,6 @@ public void StartNode(ChannelsConfig config)
}
}
- public void StartRpc(IPAddress bindAddress, int port, Wallet wallet = null, string sslCert = null, string password = null,
- string[] trustedAuthorities = null, long maxGasInvoke = default)
- {
- RpcServer = new RpcServer(this, wallet, maxGasInvoke);
- RpcServer.Start(bindAddress, port, sslCert, password, trustedAuthorities);
- }
-
internal void SuspendNodeStartup()
{
suspend = true;
diff --git a/src/neo/Network/RPC/ContractClient.cs b/src/neo/Network/RPC/ContractClient.cs
deleted file mode 100644
index 45fb31d267..0000000000
--- a/src/neo/Network/RPC/ContractClient.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-using Neo.Network.P2P.Payloads;
-using Neo.Network.RPC.Models;
-using Neo.SmartContract;
-using Neo.SmartContract.Manifest;
-using Neo.VM;
-using Neo.Wallets;
-
-namespace Neo.Network.RPC
-{
- ///
- /// Contract related operations through RPC API
- ///
- public class ContractClient
- {
- protected readonly RpcClient rpcClient;
-
- ///
- /// ContractClient Constructor
- ///
- /// the RPC client to call NEO RPC methods
- public ContractClient(RpcClient rpc)
- {
- rpcClient = rpc;
- }
-
- ///
- /// Use RPC method to test invoke operation.
- ///
- /// contract script hash
- /// contract operation
- /// operation arguments
- ///
- public RpcInvokeResult TestInvoke(UInt160 scriptHash, string operation, params object[] args)
- {
- byte[] script = scriptHash.MakeScript(operation, args);
- return rpcClient.InvokeScript(script);
- }
-
- ///
- /// Deploy Contract, return signed transaction
- ///
- /// contract script
- /// contract manifest
- /// sender KeyPair
- /// transaction NetworkFee, set to be 0 if you don't need higher priority
- ///
- public Transaction CreateDeployContractTx(byte[] contractScript, ContractManifest manifest, KeyPair key, long networkFee = 0)
- {
- byte[] script;
- using (ScriptBuilder sb = new ScriptBuilder())
- {
- sb.EmitSysCall(InteropService.Neo_Contract_Create, contractScript, manifest.ToString());
- script = sb.ToArray();
- }
-
- UInt160 sender = Contract.CreateSignatureRedeemScript(key.PublicKey).ToScriptHash();
- Transaction tx = new TransactionManager(rpcClient, sender)
- .MakeTransaction(script, null, null, networkFee)
- .AddSignature(key)
- .Sign()
- .Tx;
-
- return tx;
- }
- }
-}
diff --git a/src/neo/Network/RPC/Helper.cs b/src/neo/Network/RPC/Helper.cs
deleted file mode 100644
index 5c5c82e329..0000000000
--- a/src/neo/Network/RPC/Helper.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-using System;
-using System.Numerics;
-
-namespace Neo.Network.RPC
-{
- internal static class Helper
- {
- ///
- /// Convert decimal amount to BigInteger: amount * 10 ^ decimals
- ///
- /// float value
- /// token decimals
- ///
- public static BigInteger ToBigInteger(this decimal amount, uint decimals)
- {
- BigInteger factor = BigInteger.Pow(10, (int)decimals);
- var (numerator, denominator) = Fraction(amount);
- if (factor < denominator)
- {
- throw new OverflowException("The decimal places is too long.");
- }
-
- BigInteger res = factor * numerator / denominator;
- return res;
- }
-
- private static (BigInteger numerator, BigInteger denominator) Fraction(decimal d)
- {
- int[] bits = decimal.GetBits(d);
- BigInteger numerator = (1 - ((bits[3] >> 30) & 2)) *
- unchecked(((BigInteger)(uint)bits[2] << 64) |
- ((BigInteger)(uint)bits[1] << 32) |
- (uint)bits[0]);
- BigInteger denominator = BigInteger.Pow(10, (bits[3] >> 16) & 0xff);
- return (numerator, denominator);
- }
- }
-}
diff --git a/src/neo/Network/RPC/Models/RpcBlock.cs b/src/neo/Network/RPC/Models/RpcBlock.cs
deleted file mode 100644
index 1ff485f96e..0000000000
--- a/src/neo/Network/RPC/Models/RpcBlock.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using Neo.IO.Json;
-using Neo.Network.P2P.Payloads;
-
-namespace Neo.Network.RPC.Models
-{
- public class RpcBlock
- {
- public Block Block { get; set; }
-
- public int Confirmations { get; set; }
-
- public UInt256 NextBlockHash { get; set; }
-
- public JObject ToJson()
- {
- JObject json = Block.ToJson();
- json["confirmations"] = Confirmations;
- if (NextBlockHash != null)
- {
- json["nextblockhash"] = NextBlockHash.ToString();
- }
- return json;
- }
-
- public static RpcBlock FromJson(JObject json)
- {
- RpcBlock block = new RpcBlock();
- block.Block = Block.FromJson(json);
- block.Confirmations = (int)json["confirmations"].AsNumber();
- if (json["nextblockhash"] != null)
- {
- block.NextBlockHash = UInt256.Parse(json["nextblockhash"].AsString());
- }
- return block;
- }
- }
-}
diff --git a/src/neo/Network/RPC/Models/RpcBlockHeader.cs b/src/neo/Network/RPC/Models/RpcBlockHeader.cs
deleted file mode 100644
index 5346dffd91..0000000000
--- a/src/neo/Network/RPC/Models/RpcBlockHeader.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using Neo.IO.Json;
-using Neo.Network.P2P.Payloads;
-
-namespace Neo.Network.RPC.Models
-{
- public class RpcBlockHeader
- {
- public Header Header { get; set; }
-
- public int Confirmations { get; set; }
-
- public UInt256 NextBlockHash { get; set; }
-
- public JObject ToJson()
- {
- JObject json = Header.ToJson();
- json["confirmations"] = Confirmations;
- if (NextBlockHash != null)
- {
- json["nextblockhash"] = NextBlockHash.ToString();
- }
- return json;
- }
-
- public static RpcBlockHeader FromJson(JObject json)
- {
- RpcBlockHeader block = new RpcBlockHeader();
- block.Header = Header.FromJson(json);
- block.Confirmations = (int)json["confirmations"].AsNumber();
- if (json["nextblockhash"] != null)
- {
- block.NextBlockHash = UInt256.Parse(json["nextblockhash"].AsString());
- }
- return block;
- }
- }
-}
diff --git a/src/neo/Network/RPC/Models/RpcInvokeResult.cs b/src/neo/Network/RPC/Models/RpcInvokeResult.cs
deleted file mode 100644
index a9c5f04c48..0000000000
--- a/src/neo/Network/RPC/Models/RpcInvokeResult.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-using Neo.IO.Json;
-using Neo.SmartContract;
-using System.Linq;
-
-namespace Neo.Network.RPC.Models
-{
- public class RpcInvokeResult
- {
- public string Script { get; set; }
-
- public string State { get; set; }
-
- public string GasConsumed { get; set; }
-
- public ContractParameter[] Stack { get; set; }
-
- public JObject ToJson()
- {
- JObject json = new JObject();
- json["script"] = Script;
- json["state"] = State;
- json["gas_consumed"] = GasConsumed;
- json["stack"] = new JArray(Stack.Select(p => p.ToJson()));
- return json;
- }
-
- public static RpcInvokeResult FromJson(JObject json)
- {
- RpcInvokeResult invokeScriptResult = new RpcInvokeResult();
- invokeScriptResult.Script = json["script"].AsString();
- invokeScriptResult.State = json["state"].AsString();
- invokeScriptResult.GasConsumed = json["gas_consumed"].AsString();
- invokeScriptResult.Stack = ((JArray)json["stack"]).Select(p => ContractParameter.FromJson(p)).ToArray();
- return invokeScriptResult;
- }
- }
-
- public class RpcStack
- {
- public string Type { get; set; }
-
- public string Value { get; set; }
-
- public JObject ToJson()
- {
- JObject json = new JObject();
- json["type"] = Type;
- json["value"] = Value;
- return json;
- }
-
- public static RpcStack FromJson(JObject json)
- {
- RpcStack stackJson = new RpcStack();
- stackJson.Type = json["type"].AsString();
- stackJson.Value = json["value"].AsString();
- return stackJson;
- }
- }
-}
diff --git a/src/neo/Network/RPC/Models/RpcNep5Balances.cs b/src/neo/Network/RPC/Models/RpcNep5Balances.cs
deleted file mode 100644
index 74fe7be729..0000000000
--- a/src/neo/Network/RPC/Models/RpcNep5Balances.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-using Neo.IO.Json;
-using System.Linq;
-using System.Numerics;
-
-namespace Neo.Network.RPC.Models
-{
- public class RpcNep5Balances
- {
- public string Address { get; set; }
-
- public RpcNep5Balance[] Balances { get; set; }
-
- public JObject ToJson()
- {
- JObject json = new JObject();
- json["address"] = Address;
- json["balance"] = Balances.Select(p => p.ToJson()).ToArray();
- return json;
- }
-
- public static RpcNep5Balances FromJson(JObject json)
- {
- RpcNep5Balances nep5Balance = new RpcNep5Balances();
- nep5Balance.Address = json["address"].AsString();
- //List listBalance = new List();
- nep5Balance.Balances = ((JArray)json["balance"]).Select(p => RpcNep5Balance.FromJson(p)).ToArray();
- return nep5Balance;
- }
- }
-
- public class RpcNep5Balance
- {
- public UInt160 AssetHash { get; set; }
-
- public BigInteger Amount { get; set; }
-
- public uint LastUpdatedBlock { get; set; }
-
- public JObject ToJson()
- {
- JObject json = new JObject();
- json["asset_hash"] = AssetHash.ToString();
- json["amount"] = Amount.ToString();
- json["last_updated_block"] = LastUpdatedBlock.ToString();
- return json;
- }
-
- public static RpcNep5Balance FromJson(JObject json)
- {
- RpcNep5Balance balance = new RpcNep5Balance();
- balance.AssetHash = UInt160.Parse(json["asset_hash"].AsString());
- balance.Amount = BigInteger.Parse(json["amount"].AsString());
- balance.LastUpdatedBlock = uint.Parse(json["last_updated_block"].AsString());
- return balance;
- }
- }
-}
diff --git a/src/neo/Network/RPC/Models/RpcNep5TokenInfo.cs b/src/neo/Network/RPC/Models/RpcNep5TokenInfo.cs
deleted file mode 100644
index 0f251a5a37..0000000000
--- a/src/neo/Network/RPC/Models/RpcNep5TokenInfo.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System.Numerics;
-
-namespace Neo.Network.RPC.Models
-{
- public class RpcNep5TokenInfo
- {
- public string Name { get; set; }
-
- public string Symbol { get; set; }
-
- public uint Decimals { get; set; }
-
- public BigInteger TotalSupply { get; set; }
- }
-}
diff --git a/src/neo/Network/RPC/Models/RpcPeers.cs b/src/neo/Network/RPC/Models/RpcPeers.cs
deleted file mode 100644
index fac73842de..0000000000
--- a/src/neo/Network/RPC/Models/RpcPeers.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-using Neo.IO.Json;
-using System.Linq;
-
-namespace Neo.Network.RPC.Models
-{
- public class RpcPeers
- {
- public RpcPeer[] Unconnected { get; set; }
-
- public RpcPeer[] Bad { get; set; }
-
- public RpcPeer[] Connected { get; set; }
-
- public JObject ToJson()
- {
- JObject json = new JObject();
- json["unconnected"] = new JArray(Unconnected.Select(p => p.ToJson()));
- json["bad"] = new JArray(Bad.Select(p => p.ToJson()));
- json["connected"] = new JArray(Connected.Select(p => p.ToJson()));
- return json;
- }
-
- public static RpcPeers FromJson(JObject json)
- {
- RpcPeers result = new RpcPeers();
- result.Unconnected = ((JArray)json["unconnected"]).Select(p => RpcPeer.FromJson(p)).ToArray();
- result.Bad = ((JArray)json["bad"]).Select(p => RpcPeer.FromJson(p)).ToArray();
- result.Connected = ((JArray)json["connected"]).Select(p => RpcPeer.FromJson(p)).ToArray();
- return result;
- }
- }
-
- public class RpcPeer
- {
- public string Address { get; set; }
-
- public int Port { get; set; }
-
- public JObject ToJson()
- {
- JObject json = new JObject();
- json["address"] = Address;
- json["port"] = Port;
- return json;
- }
-
- public static RpcPeer FromJson(JObject json)
- {
- RpcPeer peer = new RpcPeer();
- peer.Address = json["address"].AsString();
- peer.Port = int.Parse(json["port"].AsString());
- return peer;
- }
- }
-}
diff --git a/src/neo/Network/RPC/Models/RpcPlugin.cs b/src/neo/Network/RPC/Models/RpcPlugin.cs
deleted file mode 100644
index db03f70eb3..0000000000
--- a/src/neo/Network/RPC/Models/RpcPlugin.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-using Neo.IO.Json;
-using System.Linq;
-
-namespace Neo.Network.RPC.Models
-{
- public class RpcPlugin
- {
- public string Name { get; set; }
-
- public string Version { get; set; }
-
- public string[] Interfaces { get; set; }
-
- public JObject ToJson()
- {
- JObject json = new JObject();
- json["name"] = Name;
- json["version"] = Version;
- json["interfaces"] = new JArray(Interfaces.Select(p => (JObject)p));
- return json;
- }
-
- public static RpcPlugin FromJson(JObject json)
- {
- RpcPlugin plugin = new RpcPlugin();
- plugin.Name = json["name"].AsString();
- plugin.Version = json["version"].AsString();
- plugin.Interfaces = ((JArray)json["interfaces"]).Select(p => p.AsString()).ToArray();
- return plugin;
- }
- }
-}
diff --git a/src/neo/Network/RPC/Models/RpcRawMemPool.cs b/src/neo/Network/RPC/Models/RpcRawMemPool.cs
deleted file mode 100644
index c5ebd63419..0000000000
--- a/src/neo/Network/RPC/Models/RpcRawMemPool.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-using Neo.IO.Json;
-using System.Linq;
-
-namespace Neo.Network.RPC.Models
-{
- public class RpcRawMemPool
- {
- public uint Height { get; set; }
-
- public string[] Verified { get; set; }
-
- public string[] UnVerified { get; set; }
-
- public JObject ToJson()
- {
- JObject json = new JObject();
- json["height"] = Height;
- json["verified"] = new JArray(Verified.Select(p => (JObject)p));
- json["unverified"] = new JArray(UnVerified.Select(p => (JObject)p));
- return json;
- }
-
- public static RpcRawMemPool FromJson(JObject json)
- {
- RpcRawMemPool rawMemPool = new RpcRawMemPool();
- rawMemPool.Height = uint.Parse(json["height"].AsString());
- rawMemPool.Verified = ((JArray)json["verified"]).Select(p => p.AsString()).ToArray();
- rawMemPool.UnVerified = ((JArray)json["unverified"]).Select(p => p.AsString()).ToArray();
- return rawMemPool;
- }
- }
-}
diff --git a/src/neo/Network/RPC/Models/RpcRequest.cs b/src/neo/Network/RPC/Models/RpcRequest.cs
deleted file mode 100644
index 1970adedbf..0000000000
--- a/src/neo/Network/RPC/Models/RpcRequest.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using Neo.IO.Json;
-using System.Linq;
-
-namespace Neo.Network.RPC.Models
-{
- public class RpcRequest
- {
- public int Id { get; set; }
-
- public string Jsonrpc { get; set; }
-
- public string Method { get; set; }
-
- public JObject[] Params { get; set; }
-
- public static RpcRequest FromJson(JObject json)
- {
- return new RpcRequest
- {
- Id = (int)json["id"].AsNumber(),
- Jsonrpc = json["jsonrpc"].AsString(),
- Method = json["method"].AsString(),
- Params = ((JArray)json["params"]).ToArray()
- };
- }
-
- public JObject ToJson()
- {
- var json = new JObject();
- json["id"] = Id;
- json["jsonrpc"] = Jsonrpc;
- json["method"] = Method;
- json["params"] = new JArray(Params);
- return json;
- }
- }
-}
diff --git a/src/neo/Network/RPC/Models/RpcResponse.cs b/src/neo/Network/RPC/Models/RpcResponse.cs
deleted file mode 100644
index e4ebcaed1b..0000000000
--- a/src/neo/Network/RPC/Models/RpcResponse.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-using Neo.IO.Json;
-
-namespace Neo.Network.RPC.Models
-{
- public class RpcResponse
- {
- public int? Id { get; set; }
-
- public string Jsonrpc { get; set; }
-
- public RpcResponseError Error { get; set; }
-
- public JObject Result { get; set; }
-
- public string RawResponse { get; set; }
-
- public static RpcResponse FromJson(JObject json)
- {
- var response = new RpcResponse
- {
- Id = (int?)json["id"]?.AsNumber(),
- Jsonrpc = json["jsonrpc"].AsString(),
- Result = json["result"]
- };
-
- if (json["error"] != null)
- {
- response.Error = RpcResponseError.FromJson(json["error"]);
- }
-
- return response;
- }
-
- public JObject ToJson()
- {
- var json = new JObject();
- json["id"] = Id;
- json["jsonrpc"] = Jsonrpc;
- json["error"] = Error.ToJson();
- json["result"] = Result;
- return json;
- }
- }
-
- public class RpcResponseError
- {
- public int Code { get; set; }
-
- public string Message { get; set; }
-
- public JObject Data { get; set; }
-
- public static RpcResponseError FromJson(JObject json)
- {
- return new RpcResponseError
- {
- Code = (int)json["code"].AsNumber(),
- Message = json["message"].AsString(),
- Data = json["data"],
- };
- }
-
- public JObject ToJson()
- {
- var json = new JObject();
- json["code"] = Code;
- json["message"] = Message;
- json["data"] = Data;
- return json;
- }
- }
-}
diff --git a/src/neo/Network/RPC/Models/RpcTransaction.cs b/src/neo/Network/RPC/Models/RpcTransaction.cs
deleted file mode 100644
index 48b1e19bd4..0000000000
--- a/src/neo/Network/RPC/Models/RpcTransaction.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-using Neo.IO.Json;
-using Neo.Network.P2P.Payloads;
-using Neo.VM;
-
-namespace Neo.Network.RPC.Models
-{
- public class RpcTransaction
- {
- public Transaction Transaction { get; set; }
-
- public UInt256 BlockHash { get; set; }
-
- public int? Confirmations { get; set; }
-
- public uint? BlockTime { get; set; }
-
- public VMState? VMState { get; set; }
-
- public JObject ToJson()
- {
- JObject json = Transaction.ToJson();
- if (Confirmations != null)
- {
- json["blockhash"] = BlockHash.ToString();
- json["confirmations"] = Confirmations;
- json["blocktime"] = BlockTime;
- if (VMState != null)
- {
- json["vmState"] = VMState;
- }
- }
- return json;
- }
-
- public static RpcTransaction FromJson(JObject json)
- {
- RpcTransaction transaction = new RpcTransaction();
- transaction.Transaction = Transaction.FromJson(json);
- if (json["confirmations"] != null)
- {
- transaction.BlockHash = UInt256.Parse(json["blockhash"].AsString());
- transaction.Confirmations = (int)json["confirmations"].AsNumber();
- transaction.BlockTime = (uint)json["blocktime"].AsNumber();
- transaction.VMState = json["vmState"]?.TryGetEnum();
- }
- return transaction;
- }
- }
-}
diff --git a/src/neo/Network/RPC/Models/RpcValidateAddressResult.cs b/src/neo/Network/RPC/Models/RpcValidateAddressResult.cs
deleted file mode 100644
index 5e0a704797..0000000000
--- a/src/neo/Network/RPC/Models/RpcValidateAddressResult.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using Neo.IO.Json;
-
-namespace Neo.Network.RPC.Models
-{
- public class RpcValidateAddressResult
- {
- public string Address { get; set; }
-
- public bool IsValid { get; set; }
-
- public JObject ToJson()
- {
- JObject json = new JObject();
- json["address"] = Address;
- json["isvalid"] = IsValid;
- return json;
- }
-
- public static RpcValidateAddressResult FromJson(JObject json)
- {
- RpcValidateAddressResult validateAddress = new RpcValidateAddressResult();
- validateAddress.Address = json["address"].AsString();
- validateAddress.IsValid = json["isvalid"].AsBoolean();
- return validateAddress;
- }
- }
-}
diff --git a/src/neo/Network/RPC/Models/RpcValidator.cs b/src/neo/Network/RPC/Models/RpcValidator.cs
deleted file mode 100644
index f3116ed2e4..0000000000
--- a/src/neo/Network/RPC/Models/RpcValidator.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-using Neo.IO.Json;
-using System.Numerics;
-
-namespace Neo.Network.RPC.Models
-{
- public class RpcValidator
- {
- public string PublicKey { get; set; }
-
- public BigInteger Votes { get; set; }
-
- public bool Active { get; set; }
-
- public JObject ToJson()
- {
- JObject json = new JObject();
- json["publickey"] = PublicKey;
- json["votes"] = Votes.ToString();
- json["active"] = Active;
- return json;
- }
-
- public static RpcValidator FromJson(JObject json)
- {
- RpcValidator validator = new RpcValidator();
- validator.PublicKey = json["publickey"].AsString();
- validator.Votes = BigInteger.Parse(json["votes"].AsString());
- validator.Active = json["active"].AsBoolean();
- return validator;
- }
- }
-}
diff --git a/src/neo/Network/RPC/Models/RpcVersion.cs b/src/neo/Network/RPC/Models/RpcVersion.cs
deleted file mode 100644
index 8163875b64..0000000000
--- a/src/neo/Network/RPC/Models/RpcVersion.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using Neo.IO.Json;
-
-namespace Neo.Network.RPC.Models
-{
- public class RpcVersion
- {
- public int TcpPort { get; set; }
-
- public int WsPort { get; set; }
-
- public uint Nonce { get; set; }
-
- public string UserAgent { get; set; }
-
- public JObject ToJson()
- {
- JObject json = new JObject();
- json["topPort"] = TcpPort.ToString();
- json["wsPort"] = WsPort.ToString();
- json["nonce"] = Nonce.ToString();
- json["useragent"] = UserAgent;
- return json;
- }
-
- public static RpcVersion FromJson(JObject json)
- {
- RpcVersion version = new RpcVersion();
- version.TcpPort = int.Parse(json["tcpPort"].AsString());
- version.WsPort = int.Parse(json["wsPort"].AsString());
- version.Nonce = uint.Parse(json["nonce"].AsString());
- version.UserAgent = json["useragent"].AsString();
- return version;
- }
- }
-}
diff --git a/src/neo/Network/RPC/Nep5API.cs b/src/neo/Network/RPC/Nep5API.cs
deleted file mode 100644
index 619c755280..0000000000
--- a/src/neo/Network/RPC/Nep5API.cs
+++ /dev/null
@@ -1,122 +0,0 @@
-using Neo.Network.P2P.Payloads;
-using Neo.Network.RPC.Models;
-using Neo.SmartContract;
-using Neo.VM;
-using Neo.Wallets;
-using System.Linq;
-using System.Numerics;
-using static Neo.Helper;
-
-namespace Neo.Network.RPC
-{
- ///
- /// Call NEP5 methods with RPC API
- ///
- public class Nep5API : ContractClient
- {
- ///
- /// Nep5API Constructor
- ///
- /// the RPC client to call NEO RPC methods
- public Nep5API(RpcClient rpcClient) : base(rpcClient) { }
-
- ///
- /// Get balance of NEP5 token
- ///
- /// contract script hash
- /// account script hash
- ///
- public BigInteger BalanceOf(UInt160 scriptHash, UInt160 account)
- {
- BigInteger balance = TestInvoke(scriptHash, "balanceOf", account).Stack.Single().ToStackItem().GetBigInteger();
- return balance;
- }
-
- ///
- /// Get name of NEP5 token
- ///
- /// contract script hash
- ///
- public string Name(UInt160 scriptHash)
- {
- return TestInvoke(scriptHash, "name").Stack.Single().ToStackItem().GetString();
- }
-
- ///
- /// Get symbol of NEP5 token
- ///
- /// contract script hash
- ///
- public string Symbol(UInt160 scriptHash)
- {
- return TestInvoke(scriptHash, "symbol").Stack.Single().ToStackItem().GetString();
- }
-
- ///
- /// Get decimals of NEP5 token
- ///
- /// contract script hash
- ///
- public uint Decimals(UInt160 scriptHash)
- {
- return (uint)TestInvoke(scriptHash, "decimals").Stack.Single().ToStackItem().GetBigInteger();
- }
-
- ///
- /// Get total supply of NEP5 token
- ///
- /// contract script hash
- ///
- public BigInteger TotalSupply(UInt160 scriptHash)
- {
- return TestInvoke(scriptHash, "totalSupply").Stack.Single().ToStackItem().GetBigInteger();
- }
-
- ///
- /// Get token information in one rpc call
- ///
- /// contract script hash
- ///
- public RpcNep5TokenInfo GetTokenInfo(UInt160 scriptHash)
- {
- byte[] script = Concat(scriptHash.MakeScript("name"),
- scriptHash.MakeScript("symbol"),
- scriptHash.MakeScript("decimals"),
- scriptHash.MakeScript("totalSupply"));
-
- var result = rpcClient.InvokeScript(script).Stack;
-
- return new RpcNep5TokenInfo
- {
- Name = result[0].ToStackItem().GetString(),
- Symbol = result[1].ToStackItem().GetString(),
- Decimals = (uint)result[2].ToStackItem().GetBigInteger(),
- TotalSupply = result[3].ToStackItem().GetBigInteger()
- };
- }
-
- ///
- /// Create NEP5 token transfer transaction
- ///
- /// contract script hash
- /// from KeyPair
- /// to account script hash
- /// transfer amount
- /// netwotk fee, set to be 0 will auto calculate the least fee
- ///
- public Transaction CreateTransferTx(UInt160 scriptHash, KeyPair fromKey, UInt160 to, BigInteger amount, long networkFee = 0)
- {
- var sender = Contract.CreateSignatureRedeemScript(fromKey.PublicKey).ToScriptHash();
- Cosigner[] cosigners = new[] { new Cosigner { Scopes = WitnessScope.CalledByEntry, Account = sender } };
-
- byte[] script = scriptHash.MakeScript("transfer", sender, to, amount);
- Transaction tx = new TransactionManager(rpcClient, sender)
- .MakeTransaction(script, null, cosigners, networkFee)
- .AddSignature(fromKey)
- .Sign()
- .Tx;
-
- return tx;
- }
- }
-}
diff --git a/src/neo/Network/RPC/PolicyAPI.cs b/src/neo/Network/RPC/PolicyAPI.cs
deleted file mode 100644
index 1b401cd7e5..0000000000
--- a/src/neo/Network/RPC/PolicyAPI.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-using Neo.SmartContract.Native;
-using Neo.VM;
-using System.Linq;
-
-namespace Neo.Network.RPC
-{
- ///
- /// Get Policy info by RPC API
- ///
- public class PolicyAPI : ContractClient
- {
- readonly UInt160 scriptHash = NativeContract.Policy.Hash;
-
- ///
- /// PolicyAPI Constructor
- ///
- /// the RPC client to call NEO RPC methods
- public PolicyAPI(RpcClient rpcClient) : base(rpcClient) { }
-
- ///
- /// Get Max Transactions Count Per Block
- ///
- ///
- public uint GetMaxTransactionsPerBlock()
- {
- return (uint)TestInvoke(scriptHash, "getMaxTransactionsPerBlock").Stack.Single().ToStackItem().GetBigInteger();
- }
-
- ///
- /// Get Max Block Size
- ///
- ///
- public uint GetMaxBlockSize()
- {
- return (uint)TestInvoke(scriptHash, "getMaxBlockSize").Stack.Single().ToStackItem().GetBigInteger();
- }
-
- ///
- /// Get Network Fee Per Byte
- ///
- ///
- public long GetFeePerByte()
- {
- return (long)TestInvoke(scriptHash, "getFeePerByte").Stack.Single().ToStackItem().GetBigInteger();
- }
-
- ///
- /// Get Ploicy Blocked Accounts
- ///
- ///
- public UInt160[] GetBlockedAccounts()
- {
- var result = (VM.Types.Array)TestInvoke(scriptHash, "getBlockedAccounts").Stack.Single().ToStackItem();
- return result.Select(p => new UInt160(p.GetSpan().ToArray())).ToArray();
- }
- }
-}
diff --git a/src/neo/Network/RPC/RpcClient.cs b/src/neo/Network/RPC/RpcClient.cs
deleted file mode 100644
index 0721efcb33..0000000000
--- a/src/neo/Network/RPC/RpcClient.cs
+++ /dev/null
@@ -1,313 +0,0 @@
-using Neo.IO;
-using Neo.IO.Json;
-using Neo.Ledger;
-using Neo.Network.P2P.Payloads;
-using Neo.Network.RPC.Models;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Net.Http;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Neo.Network.RPC
-{
- ///
- /// The RPC client to call NEO RPC methods
- ///
- public class RpcClient : IDisposable
- {
- private readonly HttpClient httpClient;
-
- public RpcClient(string url)
- {
- httpClient = new HttpClient() { BaseAddress = new Uri(url) };
- }
-
- public RpcClient(HttpClient client)
- {
- httpClient = client;
- }
-
- public void Dispose()
- {
- httpClient?.Dispose();
- }
-
- public async Task SendAsync(RpcRequest request)
- {
- var requestJson = request.ToJson().ToString();
- using (var result = await httpClient.PostAsync(httpClient.BaseAddress, new StringContent(requestJson, Encoding.UTF8)))
- {
- var content = await result.Content.ReadAsStringAsync();
- var response = RpcResponse.FromJson(JObject.Parse(content));
- response.RawResponse = content;
-
- if (response.Error != null)
- {
- throw new RpcException(response.Error.Code, response.Error.Message);
- }
-
- return response;
- }
- }
-
- public RpcResponse Send(RpcRequest request)
- {
- try
- {
- return SendAsync(request).Result;
- }
- catch (AggregateException ex)
- {
- throw ex.GetBaseException();
- }
- }
-
- public virtual JObject RpcSend(string method, params JObject[] paraArgs)
- {
- var request = new RpcRequest
- {
- Id = 1,
- Jsonrpc = "2.0",
- Method = method,
- Params = paraArgs.Select(p => p).ToArray()
- };
- return Send(request).Result;
- }
-
- ///
- /// Returns the hash of the tallest block in the main chain.
- ///
- public string GetBestBlockHash()
- {
- return RpcSend("getbestblockhash").AsString();
- }
-
- ///
- /// Returns the hash of the tallest block in the main chain.
- /// The serialized information of the block is returned, represented by a hexadecimal string.
- ///
- public string GetBlockHex(string hashOrIndex)
- {
- if (int.TryParse(hashOrIndex, out int index))
- {
- return RpcSend("getblock", index).AsString();
- }
- return RpcSend("getblock", hashOrIndex).AsString();
- }
-
- ///
- /// Returns the hash of the tallest block in the main chain.
- ///
- public RpcBlock GetBlock(string hashOrIndex)
- {
- if (int.TryParse(hashOrIndex, out int index))
- {
- return RpcBlock.FromJson(RpcSend("getblock", index, true));
- }
- return RpcBlock.FromJson(RpcSend("getblock", hashOrIndex, true));
- }
-
- ///
- /// Gets the number of blocks in the main chain.
- ///
- public uint GetBlockCount()
- {
- return (uint)RpcSend("getblockcount").AsNumber();
- }
-
- ///
- /// Returns the hash value of the corresponding block, based on the specified index.
- ///
- public string GetBlockHash(int index)
- {
- return RpcSend("getblockhash", index).AsString();
- }
-
- ///
- /// Returns the corresponding block header information according to the specified script hash.
- ///
- public string GetBlockHeaderHex(string hashOrIndex)
- {
- if (int.TryParse(hashOrIndex, out int index))
- {
- return RpcSend("getblockheader", index).AsString();
- }
- return RpcSend("getblockheader", hashOrIndex).AsString();
- }
-
- ///
- /// Returns the corresponding block header information according to the specified script hash.
- ///
- public RpcBlockHeader GetBlockHeader(string hashOrIndex)
- {
- if (int.TryParse(hashOrIndex, out int index))
- {
- return RpcBlockHeader.FromJson(RpcSend("getblockheader", index, true));
- }
- return RpcBlockHeader.FromJson(RpcSend("getblockheader", hashOrIndex, true));
- }
-
- ///
- /// Returns the system fees of the block, based on the specified index.
- ///
- public string GetBlockSysFee(int height)
- {
- return RpcSend("getblocksysfee", height).AsString();
- }
-
- ///
- /// Gets the current number of connections for the node.
- ///
- public int GetConnectionCount()
- {
- return (int)RpcSend("getconnectioncount").AsNumber();
- }
-
- ///
- /// Queries contract information, according to the contract script hash.
- ///
- public ContractState GetContractState(string hash)
- {
- return ContractState.FromJson(RpcSend("getcontractstate", hash));
- }
-
- ///
- /// Gets the list of nodes that the node is currently connected/disconnected from.
- ///
- public RpcPeers GetPeers()
- {
- return RpcPeers.FromJson(RpcSend("getpeers"));
- }
-
- ///
- /// Obtains the list of unconfirmed transactions in memory.
- ///
- public string[] GetRawMempool()
- {
- return ((JArray)RpcSend("getrawmempool")).Select(p => p.AsString()).ToArray();
- }
-
- ///
- /// Obtains the list of unconfirmed transactions in memory.
- /// shouldGetUnverified = true
- ///
- public RpcRawMemPool GetRawMempoolBoth()
- {
- return RpcRawMemPool.FromJson(RpcSend("getrawmempool", true));
- }
-
- ///
- /// Returns the corresponding transaction information, based on the specified hash value.
- ///
- public string GetRawTransactionHex(string txid)
- {
- return RpcSend("getrawtransaction", txid).AsString();
- }
-
- ///
- /// Returns the corresponding transaction information, based on the specified hash value.
- /// verbose = true
- ///
- public RpcTransaction GetRawTransaction(string txid)
- {
- return RpcTransaction.FromJson(RpcSend("getrawtransaction", txid, true));
- }
-
- ///
- /// Returns the stored value, according to the contract script hash and the stored key.
- ///
- public string GetStorage(string script_hash, string key)
- {
- return RpcSend("getstorage", script_hash, key).AsString();
- }
-
- ///
- /// Returns the block index in which the transaction is found.
- ///
- public uint GetTransactionHeight(string txid)
- {
- return uint.Parse(RpcSend("gettransactionheight", txid).AsString());
- }
-
- ///
- /// Returns the current NEO consensus nodes information and voting status.
- ///
- public RpcValidator[] GetValidators()
- {
- return ((JArray)RpcSend("getvalidators")).Select(p => RpcValidator.FromJson(p)).ToArray();
- }
-
- ///
- /// Returns the version information about the queried node.
- ///
- public RpcVersion GetVersion()
- {
- return RpcVersion.FromJson(RpcSend("getversion"));
- }
-
- ///
- /// Returns the result after calling a smart contract at scripthash with the given operation and parameters.
- /// This RPC call does not affect the blockchain in any way.
- ///
- public RpcInvokeResult InvokeFunction(string address, string function, RpcStack[] stacks)
- {
- return RpcInvokeResult.FromJson(RpcSend("invokefunction", address, function, stacks.Select(p => p.ToJson()).ToArray()));
- }
-
- ///
- /// Returns the result after passing a script through the VM.
- /// This RPC call does not affect the blockchain in any way.
- ///
- public RpcInvokeResult InvokeScript(byte[] script, params UInt160[] scriptHashesForVerifying)
- {
- List parameters = new List
- {
- script.ToHexString()
- };
- parameters.AddRange(scriptHashesForVerifying.Select(p => (JObject)p.ToString()));
- return RpcInvokeResult.FromJson(RpcSend("invokescript", parameters.ToArray()));
- }
-
- ///
- /// Returns a list of plugins loaded by the node.
- ///
- public RpcPlugin[] ListPlugins()
- {
- return ((JArray)RpcSend("listplugins")).Select(p => RpcPlugin.FromJson(p)).ToArray();
- }
-
- ///
- /// Broadcasts a serialized transaction over the NEO network.
- ///
- public bool SendRawTransaction(byte[] rawTransaction)
- {
- return RpcSend("sendrawtransaction", rawTransaction.ToHexString()).AsBoolean();
- }
-
- ///
- /// Broadcasts a transaction over the NEO network.
- ///
- public bool SendRawTransaction(Transaction transaction)
- {
- return SendRawTransaction(transaction.ToArray());
- }
-
- ///
- /// Broadcasts a serialized block over the NEO network.
- ///
- public bool SubmitBlock(byte[] block)
- {
- return RpcSend("submitblock", block.ToHexString()).AsBoolean();
- }
-
- ///
- /// Verifies that the address is a correct NEO address.
- ///
- public RpcValidateAddressResult ValidateAddress(string address)
- {
- return RpcValidateAddressResult.FromJson(RpcSend("validateaddress", address));
- }
- }
-}
diff --git a/src/neo/Network/RPC/RpcException.cs b/src/neo/Network/RPC/RpcException.cs
deleted file mode 100644
index b5030750ca..0000000000
--- a/src/neo/Network/RPC/RpcException.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using System;
-
-namespace Neo.Network.RPC
-{
- public class RpcException : Exception
- {
- public RpcException(int code, string message) : base(message)
- {
- HResult = code;
- }
- }
-}
diff --git a/src/neo/Network/RPC/RpcServer.cs b/src/neo/Network/RPC/RpcServer.cs
deleted file mode 100644
index e2137d517c..0000000000
--- a/src/neo/Network/RPC/RpcServer.cs
+++ /dev/null
@@ -1,667 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.IO.Compression;
-using System.Linq;
-using System.Net;
-using System.Net.Security;
-using System.Security.Cryptography.X509Certificates;
-using System.Text;
-using System.Threading.Tasks;
-using Akka.Actor;
-using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.ResponseCompression;
-using Microsoft.AspNetCore.Server.Kestrel.Https;
-using Microsoft.Extensions.DependencyInjection;
-using Neo.IO;
-using Neo.IO.Json;
-using Neo.Ledger;
-using Neo.Network.P2P;
-using Neo.Network.P2P.Payloads;
-using Neo.Persistence;
-using Neo.Plugins;
-using Neo.SmartContract;
-using Neo.SmartContract.Native;
-using Neo.VM;
-using Neo.Wallets;
-
-namespace Neo.Network.RPC
-{
- public sealed class RpcServer : IDisposable
- {
- private class CheckWitnessHashes : IVerifiable
- {
- private readonly UInt160[] _scriptHashesForVerifying;
- public Witness[] Witnesses { get; set; }
- public int Size { get; }
-
- public CheckWitnessHashes(UInt160[] scriptHashesForVerifying)
- {
- _scriptHashesForVerifying = scriptHashesForVerifying;
- }
-
- public void Serialize(BinaryWriter writer)
- {
- throw new NotImplementedException();
- }
-
- public void Deserialize(BinaryReader reader)
- {
- throw new NotImplementedException();
- }
-
- public void DeserializeUnsigned(BinaryReader reader)
- {
- throw new NotImplementedException();
- }
-
- public UInt160[] GetScriptHashesForVerifying(StoreView snapshot)
- {
- return _scriptHashesForVerifying;
- }
-
- public void SerializeUnsigned(BinaryWriter writer)
- {
- throw new NotImplementedException();
- }
- }
-
- public Wallet Wallet { get; set; }
- public long MaxGasInvoke { get; }
-
- private IWebHost host;
- private readonly NeoSystem system;
-
- public RpcServer(NeoSystem system, Wallet wallet = null, long maxGasInvoke = default)
- {
- this.system = system;
- this.Wallet = wallet;
- this.MaxGasInvoke = maxGasInvoke;
- }
-
- private static JObject CreateErrorResponse(JObject id, int code, string message, JObject data = null)
- {
- JObject response = CreateResponse(id);
- response["error"] = new JObject();
- response["error"]["code"] = code;
- response["error"]["message"] = message;
- if (data != null)
- response["error"]["data"] = data;
- return response;
- }
-
- private static JObject CreateResponse(JObject id)
- {
- JObject response = new JObject();
- response["jsonrpc"] = "2.0";
- response["id"] = id;
- return response;
- }
-
- public void Dispose()
- {
- if (host != null)
- {
- host.Dispose();
- host = null;
- }
- }
-
- private JObject GetInvokeResult(byte[] script, IVerifiable checkWitnessHashes = null)
- {
- using ApplicationEngine engine = ApplicationEngine.Run(script, checkWitnessHashes, extraGAS: MaxGasInvoke);
- JObject json = new JObject();
- json["script"] = script.ToHexString();
- json["state"] = engine.State;
- json["gas_consumed"] = engine.GasConsumed.ToString();
- try
- {
- json["stack"] = new JArray(engine.ResultStack.Select(p => p.ToParameter().ToJson()));
- }
- catch (InvalidOperationException)
- {
- json["stack"] = "error: recursive reference";
- }
- return json;
- }
-
- private static JObject GetRelayResult(RelayResultReason reason, UInt256 hash)
- {
- if (reason == RelayResultReason.Succeed)
- {
- var ret = new JObject();
- ret["hash"] = hash.ToString();
- return ret;
- }
- else
- {
- throw new RpcException(-500, reason.ToString());
- }
- }
-
- private JObject Process(string method, JArray _params)
- {
- switch (method)
- {
- case "getbestblockhash":
- {
- return GetBestBlockHash();
- }
- case "getblock":
- {
- JObject key = _params[0];
- bool verbose = _params.Count >= 2 && _params[1].AsBoolean();
- return GetBlock(key, verbose);
- }
- case "getblockcount":
- {
- return GetBlockCount();
- }
- case "getblockhash":
- {
- uint height = uint.Parse(_params[0].AsString());
- return GetBlockHash(height);
- }
- case "getblockheader":
- {
- JObject key = _params[0];
- bool verbose = _params.Count >= 2 && _params[1].AsBoolean();
- return GetBlockHeader(key, verbose);
- }
- case "getblocksysfee":
- {
- uint height = uint.Parse(_params[0].AsString());
- return GetBlockSysFee(height);
- }
- case "getconnectioncount":
- {
- return GetConnectionCount();
- }
- case "getcontractstate":
- {
- UInt160 script_hash = UInt160.Parse(_params[0].AsString());
- return GetContractState(script_hash);
- }
- case "getpeers":
- {
- return GetPeers();
- }
- case "getrawmempool":
- {
- bool shouldGetUnverified = _params.Count >= 1 && _params[0].AsBoolean();
- return GetRawMemPool(shouldGetUnverified);
- }
- case "getrawtransaction":
- {
- UInt256 hash = UInt256.Parse(_params[0].AsString());
- bool verbose = _params.Count >= 2 && _params[1].AsBoolean();
- return GetRawTransaction(hash, verbose);
- }
- case "getstorage":
- {
- UInt160 script_hash = UInt160.Parse(_params[0].AsString());
- byte[] key = _params[1].AsString().HexToBytes();
- return GetStorage(script_hash, key);
- }
- case "gettransactionheight":
- {
- UInt256 hash = UInt256.Parse(_params[0].AsString());
- return GetTransactionHeight(hash);
- }
- case "getvalidators":
- {
- return GetValidators();
- }
- case "getversion":
- {
- return GetVersion();
- }
- 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];
- return InvokeFunction(script_hash, operation, args);
- }
- case "invokescript":
- {
- byte[] script = _params[0].AsString().HexToBytes();
- CheckWitnessHashes checkWitnessHashes = null;
- if (_params.Count > 1)
- {
- UInt160[] scriptHashesForVerifying = _params.Skip(1).Select(u => UInt160.Parse(u.AsString())).ToArray();
- checkWitnessHashes = new CheckWitnessHashes(scriptHashesForVerifying);
- }
- return GetInvokeResult(script, checkWitnessHashes);
- }
- case "listplugins":
- {
- return ListPlugins();
- }
- case "sendrawtransaction":
- {
- Transaction tx = _params[0].AsString().HexToBytes().AsSerializable();
- return SendRawTransaction(tx);
- }
- case "submitblock":
- {
- Block block = _params[0].AsString().HexToBytes().AsSerializable();
- return SubmitBlock(block);
- }
- case "validateaddress":
- {
- string address = _params[0].AsString();
- return ValidateAddress(address);
- }
- default:
- throw new RpcException(-32601, "Method not found");
- }
- }
-
- private async Task ProcessAsync(HttpContext context)
- {
- context.Response.Headers["Access-Control-Allow-Origin"] = "*";
- context.Response.Headers["Access-Control-Allow-Methods"] = "GET, POST";
- context.Response.Headers["Access-Control-Allow-Headers"] = "Content-Type";
- context.Response.Headers["Access-Control-Max-Age"] = "31536000";
- if (context.Request.Method != "GET" && context.Request.Method != "POST") return;
- JObject request = null;
- if (context.Request.Method == "GET")
- {
- string jsonrpc = context.Request.Query["jsonrpc"];
- string id = context.Request.Query["id"];
- string method = context.Request.Query["method"];
- string _params = context.Request.Query["params"];
- if (!string.IsNullOrEmpty(id) && !string.IsNullOrEmpty(method) && !string.IsNullOrEmpty(_params))
- {
- try
- {
- _params = Encoding.UTF8.GetString(Convert.FromBase64String(_params));
- }
- catch (FormatException) { }
- request = new JObject();
- if (!string.IsNullOrEmpty(jsonrpc))
- request["jsonrpc"] = jsonrpc;
- request["id"] = id;
- request["method"] = method;
- request["params"] = JObject.Parse(_params);
- }
- }
- else if (context.Request.Method == "POST")
- {
- using (StreamReader reader = new StreamReader(context.Request.Body))
- {
- try
- {
- request = JObject.Parse(reader);
- }
- catch (FormatException) { }
- }
- }
- JObject response;
- if (request == null)
- {
- response = CreateErrorResponse(null, -32700, "Parse error");
- }
- else if (request is JArray array)
- {
- if (array.Count == 0)
- {
- response = CreateErrorResponse(request["id"], -32600, "Invalid Request");
- }
- else
- {
- response = array.Select(p => ProcessRequest(context, p)).Where(p => p != null).ToArray();
- }
- }
- else
- {
- response = ProcessRequest(context, request);
- }
- if (response == null || (response as JArray)?.Count == 0) return;
- context.Response.ContentType = "application/json-rpc";
- await context.Response.WriteAsync(response.ToString(), Encoding.UTF8);
- }
-
- private JObject ProcessRequest(HttpContext context, JObject request)
- {
- if (!request.ContainsProperty("id")) return null;
- if (!request.ContainsProperty("method") || !request.ContainsProperty("params") || !(request["params"] is JArray))
- {
- return CreateErrorResponse(request["id"], -32600, "Invalid Request");
- }
- JObject result = null;
- try
- {
- string method = request["method"].AsString();
- JArray _params = (JArray)request["params"];
- foreach (IRpcPlugin plugin in Plugin.RpcPlugins)
- plugin.PreProcess(context, method, _params);
- foreach (IRpcPlugin plugin in Plugin.RpcPlugins)
- {
- result = plugin.OnProcess(context, method, _params);
- if (result != null) break;
- }
- if (result == null)
- result = Process(method, _params);
- foreach (IRpcPlugin plugin in Plugin.RpcPlugins)
- plugin.PostProcess(context, method, _params, result);
- }
- catch (FormatException)
- {
- return CreateErrorResponse(request["id"], -32602, "Invalid params");
- }
- catch (IndexOutOfRangeException)
- {
- return CreateErrorResponse(request["id"], -32602, "Invalid params");
- }
- catch (Exception ex)
- {
-#if DEBUG
- return CreateErrorResponse(request["id"], ex.HResult, ex.Message, ex.StackTrace);
-#else
- return CreateErrorResponse(request["id"], ex.HResult, ex.Message);
-#endif
- }
- JObject response = CreateResponse(request["id"]);
- response["result"] = result;
- return response;
- }
-
- public void Start(IPAddress bindAddress, int port, string sslCert = null, string password = null, string[] trustedAuthorities = null)
- {
- host = new WebHostBuilder().UseKestrel(options => options.Listen(bindAddress, port, listenOptions =>
- {
- if (string.IsNullOrEmpty(sslCert)) return;
- listenOptions.UseHttps(sslCert, password, httpsConnectionAdapterOptions =>
- {
- if (trustedAuthorities is null || trustedAuthorities.Length == 0)
- return;
- httpsConnectionAdapterOptions.ClientCertificateMode = ClientCertificateMode.RequireCertificate;
- httpsConnectionAdapterOptions.ClientCertificateValidation = (cert, chain, err) =>
- {
- if (err != SslPolicyErrors.None)
- return false;
- X509Certificate2 authority = chain.ChainElements[chain.ChainElements.Count - 1].Certificate;
- return trustedAuthorities.Contains(authority.Thumbprint);
- };
- });
- }))
- .Configure(app =>
- {
- app.UseResponseCompression();
- app.Run(ProcessAsync);
- })
- .ConfigureServices(services =>
- {
- services.AddResponseCompression(options =>
- {
- // options.EnableForHttps = false;
- options.Providers.Add();
- options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Append("application/json-rpc");
- });
-
- services.Configure(options =>
- {
- options.Level = CompressionLevel.Fastest;
- });
- })
- .Build();
-
- host.Start();
- }
-
- private JObject GetBestBlockHash()
- {
- return Blockchain.Singleton.CurrentBlockHash.ToString();
- }
-
- private JObject GetBlock(JObject key, bool verbose)
- {
- Block block;
- if (key is JNumber)
- {
- uint index = uint.Parse(key.AsString());
- block = Blockchain.Singleton.GetBlock(index);
- }
- else
- {
- UInt256 hash = UInt256.Parse(key.AsString());
- block = Blockchain.Singleton.View.GetBlock(hash);
- }
- if (block == null)
- throw new RpcException(-100, "Unknown block");
- if (verbose)
- {
- JObject json = block.ToJson();
- json["confirmations"] = Blockchain.Singleton.Height - block.Index + 1;
- UInt256 hash = Blockchain.Singleton.GetNextBlockHash(block.Hash);
- if (hash != null)
- json["nextblockhash"] = hash.ToString();
- return json;
- }
- return block.ToArray().ToHexString();
- }
-
- private JObject GetBlockCount()
- {
- return Blockchain.Singleton.Height + 1;
- }
-
- private JObject GetBlockHash(uint height)
- {
- if (height <= Blockchain.Singleton.Height)
- {
- return Blockchain.Singleton.GetBlockHash(height).ToString();
- }
- throw new RpcException(-100, "Invalid Height");
- }
-
- private JObject GetBlockHeader(JObject key, bool verbose)
- {
- Header header;
- if (key is JNumber)
- {
- uint height = uint.Parse(key.AsString());
- header = Blockchain.Singleton.GetHeader(height);
- }
- else
- {
- UInt256 hash = UInt256.Parse(key.AsString());
- header = Blockchain.Singleton.View.GetHeader(hash);
- }
- if (header == null)
- throw new RpcException(-100, "Unknown block");
-
- if (verbose)
- {
- JObject json = header.ToJson();
- json["confirmations"] = Blockchain.Singleton.Height - header.Index + 1;
- UInt256 hash = Blockchain.Singleton.GetNextBlockHash(header.Hash);
- if (hash != null)
- json["nextblockhash"] = hash.ToString();
- return json;
- }
-
- return header.ToArray().ToHexString();
- }
-
- private JObject GetBlockSysFee(uint height)
- {
- if (height <= Blockchain.Singleton.Height)
- using (ApplicationEngine engine = NativeContract.GAS.TestCall("getSysFeeAmount", height))
- {
- return engine.ResultStack.Peek().GetBigInteger().ToString();
- }
- throw new RpcException(-100, "Invalid Height");
- }
-
- private JObject GetConnectionCount()
- {
- return LocalNode.Singleton.ConnectedCount;
- }
-
- private JObject GetContractState(UInt160 script_hash)
- {
- ContractState contract = Blockchain.Singleton.View.Contracts.TryGet(script_hash);
- return contract?.ToJson() ?? throw new RpcException(-100, "Unknown contract");
- }
-
- private JObject 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.ListenerTcpPort;
- return peerJson;
- }));
- return json;
- }
-
- private JObject GetRawMemPool(bool shouldGetUnverified)
- {
- if (!shouldGetUnverified)
- return new JArray(Blockchain.Singleton.MemPool.GetVerifiedTransactions().Select(p => (JObject)p.Hash.ToString()));
-
- JObject json = new JObject();
- json["height"] = Blockchain.Singleton.Height;
- Blockchain.Singleton.MemPool.GetVerifiedAndUnverifiedTransactions(
- out IEnumerable verifiedTransactions,
- out IEnumerable unverifiedTransactions);
- json["verified"] = new JArray(verifiedTransactions.Select(p => (JObject)p.Hash.ToString()));
- json["unverified"] = new JArray(unverifiedTransactions.Select(p => (JObject)p.Hash.ToString()));
- return json;
- }
-
- private JObject GetRawTransaction(UInt256 hash, bool verbose)
- {
- Transaction tx = Blockchain.Singleton.GetTransaction(hash);
- if (tx == null)
- throw new RpcException(-100, "Unknown transaction");
- if (verbose)
- {
- JObject json = tx.ToJson();
- TransactionState txState = Blockchain.Singleton.View.Transactions.TryGet(hash);
- if (txState != null)
- {
- Header header = Blockchain.Singleton.GetHeader(txState.BlockIndex);
- json["blockhash"] = header.Hash.ToString();
- json["confirmations"] = Blockchain.Singleton.Height - header.Index + 1;
- json["blocktime"] = header.Timestamp;
- json["vmState"] = txState.VMState;
- }
- return json;
- }
- return tx.ToArray().ToHexString();
- }
-
- private JObject GetStorage(UInt160 script_hash, byte[] key)
- {
- StorageItem item = Blockchain.Singleton.View.Storages.TryGet(new StorageKey
- {
- ScriptHash = script_hash,
- Key = key
- }) ?? new StorageItem();
- return item.Value?.ToHexString();
- }
-
- private JObject GetTransactionHeight(UInt256 hash)
- {
- uint? height = Blockchain.Singleton.View.Transactions.TryGet(hash)?.BlockIndex;
- if (height.HasValue) return height.Value;
- throw new RpcException(-100, "Unknown transaction");
- }
-
- private JObject GetValidators()
- {
- using (SnapshotView snapshot = Blockchain.Singleton.GetSnapshot())
- {
- var validators = NativeContract.NEO.GetValidators(snapshot);
- return NativeContract.NEO.GetRegisteredValidators(snapshot).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();
- }
- }
-
- private JObject GetVersion()
- {
- JObject json = new JObject();
- json["tcpPort"] = LocalNode.Singleton.ListenerTcpPort;
- json["wsPort"] = LocalNode.Singleton.ListenerWsPort;
- json["nonce"] = LocalNode.Nonce;
- json["useragent"] = LocalNode.UserAgent;
- return json;
- }
-
- private JObject InvokeFunction(UInt160 script_hash, string operation, ContractParameter[] args)
- {
- byte[] script;
- using (ScriptBuilder sb = new ScriptBuilder())
- {
- script = sb.EmitAppCall(script_hash, operation, args).ToArray();
- }
- return GetInvokeResult(script);
- }
-
- private JObject ListPlugins()
- {
- return new JArray(Plugin.Plugins
- .OrderBy(u => u.Name)
- .Select(u => new JObject
- {
- ["name"] = u.Name,
- ["version"] = u.Version.ToString(),
- ["interfaces"] = new JArray(u.GetType().GetInterfaces()
- .Select(p => p.Name)
- .Where(p => p.EndsWith("Plugin"))
- .Select(p => (JObject)p))
- }));
- }
-
- private JObject SendRawTransaction(Transaction tx)
- {
- RelayResultReason reason = system.Blockchain.Ask(tx).Result;
- return GetRelayResult(reason, tx.Hash);
- }
-
- private JObject SubmitBlock(Block block)
- {
- RelayResultReason reason = system.Blockchain.Ask(block).Result;
- return GetRelayResult(reason, block.Hash);
- }
-
- private JObject ValidateAddress(string address)
- {
- JObject json = new JObject();
- UInt160 scriptHash;
- try
- {
- scriptHash = address.ToScriptHash();
- }
- catch
- {
- scriptHash = null;
- }
- json["address"] = address;
- json["isvalid"] = scriptHash != null;
- return json;
- }
- }
-}
diff --git a/src/neo/Network/RPC/TransactionManager.cs b/src/neo/Network/RPC/TransactionManager.cs
deleted file mode 100644
index 7841ba8527..0000000000
--- a/src/neo/Network/RPC/TransactionManager.cs
+++ /dev/null
@@ -1,226 +0,0 @@
-using Neo.Cryptography.ECC;
-using Neo.IO;
-using Neo.Network.P2P.Payloads;
-using Neo.Network.RPC.Models;
-using Neo.SmartContract;
-using Neo.SmartContract.Native;
-using Neo.VM;
-using Neo.Wallets;
-using System;
-
-namespace Neo.Network.RPC
-{
- ///
- /// This class helps to create transaction with RPC API.
- ///
- public class TransactionManager
- {
- private readonly RpcClient rpcClient;
- private readonly PolicyAPI policyAPI;
- private readonly Nep5API nep5API;
- private readonly UInt160 sender;
-
- ///
- /// The Transaction context to manage the witnesses
- ///
- private ContractParametersContext context;
-
- ///
- /// The Transaction managed by this class
- ///
- public Transaction Tx { get; private set; }
-
- ///
- /// TransactionManager Constructor
- ///
- /// the RPC client to call NEO RPC API
- /// the account script hash of sender
- public TransactionManager(RpcClient rpc, UInt160 sender)
- {
- rpcClient = rpc;
- policyAPI = new PolicyAPI(rpc);
- nep5API = new Nep5API(rpc);
- this.sender = sender;
- }
-
- ///
- /// Create an unsigned Transaction object with given parameters.
- ///
- /// Transaction Script
- /// Transaction Attributes
- /// Transaction Cosigners
- /// Transaction NetworkFee, will set to estimate value(with only basic signatures) when networkFee is 0
- ///
- public TransactionManager MakeTransaction(byte[] script, TransactionAttribute[] attributes = null, Cosigner[] cosigners = null, long networkFee = 0)
- {
- var random = new Random();
- uint height = rpcClient.GetBlockCount() - 1;
- Tx = new Transaction
- {
- Version = 0,
- Nonce = (uint)random.Next(),
- Script = script,
- Sender = sender,
- ValidUntilBlock = height + Transaction.MaxValidUntilBlockIncrement,
- Attributes = attributes ?? new TransactionAttribute[0],
- Cosigners = cosigners ?? new Cosigner[0],
- Witnesses = new Witness[0]
- };
-
- // Add witness hashes parameter to pass CheckWitness
- UInt160[] hashes = Tx.GetScriptHashesForVerifying(null);
- RpcInvokeResult result = rpcClient.InvokeScript(script, hashes);
- Tx.SystemFee = Math.Max(long.Parse(result.GasConsumed) - ApplicationEngine.GasFree, 0);
- if (Tx.SystemFee > 0)
- {
- long d = (long)NativeContract.GAS.Factor;
- long remainder = Tx.SystemFee % d;
- if (remainder > 0)
- Tx.SystemFee += d - remainder;
- else if (remainder < 0)
- Tx.SystemFee -= remainder;
- }
-
- context = new ContractParametersContext(Tx);
-
- // set networkfee to estimate value when networkFee is 0
- Tx.NetworkFee = networkFee == 0 ? EstimateNetworkFee() : networkFee;
-
- var gasBalance = nep5API.BalanceOf(NativeContract.GAS.Hash, sender);
- if (gasBalance >= Tx.SystemFee + Tx.NetworkFee) return this;
- throw new InvalidOperationException($"Insufficient GAS in address: {sender.ToAddress()}");
- }
-
- ///
- /// Estimate NetworkFee, assuming the witnesses are basic Signature Contract
- ///
- private long EstimateNetworkFee()
- {
- long networkFee = 0;
- UInt160[] hashes = Tx.GetScriptHashesForVerifying(null);
- int size = Transaction.HeaderSize + Tx.Attributes.GetVarSize() + Tx.Script.GetVarSize() + IO.Helper.GetVarSize(hashes.Length);
-
- // assume the hashes are single Signature
- foreach (var hash in hashes)
- {
- size += 166;
- networkFee += ApplicationEngine.OpCodePrices[OpCode.PUSHBYTES64] + ApplicationEngine.OpCodePrices[OpCode.PUSHBYTES33] + InteropService.GetPrice(InteropService.Neo_Crypto_ECDsaVerify, null);
- }
-
- networkFee += size * policyAPI.GetFeePerByte();
- return networkFee;
- }
-
- ///
- /// Calculate NetworkFee with context items
- ///
- private long CalculateNetworkFee()
- {
- long networkFee = 0;
- UInt160[] hashes = Tx.GetScriptHashesForVerifying(null);
- int size = Transaction.HeaderSize + Tx.Attributes.GetVarSize() + Tx.Script.GetVarSize() + IO.Helper.GetVarSize(hashes.Length);
- foreach (UInt160 hash in hashes)
- {
- byte[] witness_script = context.GetScript(hash);
- if (witness_script is null || witness_script.Length == 0)
- {
- try
- {
- witness_script = rpcClient.GetContractState(hash.ToString())?.Script;
- }
- catch { }
- }
-
- if (witness_script is null) continue;
-
- networkFee += Wallet.CalculateNetWorkFee(witness_script, ref size);
- }
- networkFee += size * policyAPI.GetFeePerByte();
- return networkFee;
- }
-
- ///
- /// Add Signature
- ///
- /// The KeyPair to sign transction
- ///
- public TransactionManager AddSignature(KeyPair key)
- {
- var contract = Contract.CreateSignatureContract(key.PublicKey);
-
- byte[] signature = Tx.Sign(key);
- if (!context.AddSignature(contract, key.PublicKey, signature))
- {
- throw new Exception("AddSignature failed!");
- }
-
- return this;
- }
-
- ///
- /// Add Multi-Signature
- ///
- /// The KeyPair to sign transction
- /// The least count of signatures needed for multiple signature contract
- /// The Public Keys construct the multiple signature contract
- public TransactionManager AddMultiSig(KeyPair key, int m, params ECPoint[] publicKeys)
- {
- Contract contract = Contract.CreateMultiSigContract(m, publicKeys);
-
- byte[] signature = Tx.Sign(key);
- if (!context.AddSignature(contract, key.PublicKey, signature))
- {
- throw new Exception("AddMultiSig failed!");
- }
-
- return this;
- }
-
- ///
- /// Add Witness with contract
- ///
- /// The witness verification contract
- /// The witness invocation parameters
- public TransactionManager AddWitness(Contract contract, params object[] parameters)
- {
- if (!context.Add(contract, parameters))
- {
- throw new Exception("AddWitness failed!");
- };
- return this;
- }
-
- ///
- /// Add Witness with scriptHash
- ///
- /// The witness verification contract hash
- /// The witness invocation parameters
- public TransactionManager AddWitness(UInt160 scriptHash, params object[] parameters)
- {
- var contract = Contract.Create(scriptHash);
- return AddWitness(contract, parameters);
- }
-
- ///
- /// Verify Witness count and add witnesses
- ///
- public TransactionManager Sign()
- {
- // Verify witness count
- if (!context.Completed)
- {
- throw new Exception($"Please add signature or witness first!");
- }
-
- // Calculate NetworkFee
- long leastNetworkFee = CalculateNetworkFee();
- if (Tx.NetworkFee < leastNetworkFee)
- {
- throw new InvalidOperationException("Insufficient NetworkFee");
- }
-
- Tx.Witnesses = context.GetWitnesses();
- return this;
- }
- }
-}
diff --git a/src/neo/Network/RPC/WalletAPI.cs b/src/neo/Network/RPC/WalletAPI.cs
deleted file mode 100644
index e1ab3b777f..0000000000
--- a/src/neo/Network/RPC/WalletAPI.cs
+++ /dev/null
@@ -1,192 +0,0 @@
-using Neo.Ledger;
-using Neo.Network.P2P.Payloads;
-using Neo.Network.RPC.Models;
-using Neo.SmartContract;
-using Neo.SmartContract.Native;
-using Neo.VM;
-using Neo.Wallets;
-using System;
-using System.Linq;
-using System.Numerics;
-using System.Threading.Tasks;
-
-namespace Neo.Network.RPC
-{
- ///
- /// Wallet Common APIs
- ///
- public class WalletAPI
- {
- private readonly RpcClient rpcClient;
- private readonly Nep5API nep5API;
-
- ///
- /// WalletAPI Constructor
- ///
- /// the RPC client to call NEO RPC methods
- public WalletAPI(RpcClient rpc)
- {
- rpcClient = rpc;
- nep5API = new Nep5API(rpc);
- }
-
- ///
- /// Get unclaimed gas with address, scripthash or public key string
- ///
- /// address, scripthash or public key string
- /// Example: address ("AV556nYUwyJKNv8Xy7hVMLQnkmKPukw6x5"), scripthash ("0x6a38cd693b615aea24dd00de12a9f5836844da91"), public key ("02f9ec1fd0a98796cf75b586772a4ddd41a0af07a1dbdf86a7238f74fb72503575")
- ///
- public decimal GetUnclaimedGas(string account)
- {
- UInt160 accountHash = Utility.GetScriptHash(account);
- return GetUnclaimedGas(accountHash);
- }
-
- ///
- /// Get unclaimed gas
- ///
- /// account scripthash
- ///
- public decimal GetUnclaimedGas(UInt160 account)
- {
- UInt160 scriptHash = NativeContract.NEO.Hash;
- BigInteger balance = nep5API.TestInvoke(scriptHash, "unclaimedGas", account, rpcClient.GetBlockCount() - 1)
- .Stack.Single().ToStackItem().GetBigInteger();
- return ((decimal)balance) / (long)NativeContract.GAS.Factor;
- }
-
- ///
- /// Get Neo Balance
- ///
- /// address, scripthash or public key string
- /// Example: address ("AV556nYUwyJKNv8Xy7hVMLQnkmKPukw6x5"), scripthash ("0x6a38cd693b615aea24dd00de12a9f5836844da91"), public key ("02f9ec1fd0a98796cf75b586772a4ddd41a0af07a1dbdf86a7238f74fb72503575")
- ///
- public uint GetNeoBalance(string account)
- {
- BigInteger balance = GetTokenBalance(NativeContract.NEO.Hash.ToString(), account);
- return (uint)balance;
- }
-
- ///
- /// Get Gas Balance
- ///
- /// address, scripthash or public key string
- /// Example: address ("AV556nYUwyJKNv8Xy7hVMLQnkmKPukw6x5"), scripthash ("0x6a38cd693b615aea24dd00de12a9f5836844da91"), public key ("02f9ec1fd0a98796cf75b586772a4ddd41a0af07a1dbdf86a7238f74fb72503575")
- ///
- public decimal GetGasBalance(string account)
- {
- BigInteger balance = GetTokenBalance(NativeContract.GAS.Hash.ToString(), account);
- return ((decimal)balance) / (long)NativeContract.GAS.Factor;
- }
-
- ///
- /// Get token balance with string parameters
- ///
- /// token script hash, Example: "0x43cf98eddbe047e198a3e5d57006311442a0ca15"(NEO)
- /// address, scripthash or public key string
- /// Example: address ("AV556nYUwyJKNv8Xy7hVMLQnkmKPukw6x5"), scripthash ("0x6a38cd693b615aea24dd00de12a9f5836844da91"), public key ("02f9ec1fd0a98796cf75b586772a4ddd41a0af07a1dbdf86a7238f74fb72503575")
- ///
- public BigInteger GetTokenBalance(string tokenHash, string account)
- {
- UInt160 scriptHash = Utility.GetScriptHash(tokenHash);
- UInt160 accountHash = Utility.GetScriptHash(account);
- return nep5API.BalanceOf(scriptHash, accountHash);
- }
-
- ///
- /// The GAS is claimed when doing NEO transfer
- /// This function will transfer NEO balance from account to itself
- ///
- /// wif or private key
- /// Example: WIF ("KyXwTh1hB76RRMquSvnxZrJzQx7h9nQP2PCRL38v6VDb5ip3nf1p"), PrivateKey ("450d6c2a04b5b470339a745427bae6828400cf048400837d73c415063835e005")
- /// The transaction sended
- public Transaction ClaimGas(string key)
- {
- KeyPair keyPair = Utility.GetKeyPair(key);
- return ClaimGas(keyPair);
- }
-
- ///
- /// The GAS is claimed when doing NEO transfer
- /// This function will transfer NEO balance from account to itself
- ///
- /// keyPair
- /// The transaction sended
- public Transaction ClaimGas(KeyPair keyPair)
- {
- UInt160 toHash = Contract.CreateSignatureRedeemScript(keyPair.PublicKey).ToScriptHash();
- BigInteger balance = nep5API.BalanceOf(NativeContract.NEO.Hash, toHash);
- Transaction transaction = nep5API.CreateTransferTx(NativeContract.NEO.Hash, keyPair, toHash, balance);
- rpcClient.SendRawTransaction(transaction);
- return transaction;
- }
-
- ///
- /// Transfer NEP5 token balance, with common data types
- ///
- /// nep5 token script hash, Example: scripthash ("0x6a38cd693b615aea24dd00de12a9f5836844da91")
- /// wif or private key
- /// Example: WIF ("KyXwTh1hB76RRMquSvnxZrJzQx7h9nQP2PCRL38v6VDb5ip3nf1p"), PrivateKey ("450d6c2a04b5b470339a745427bae6828400cf048400837d73c415063835e005")
- /// address or account script hash
- /// token amount
- /// netwotk fee, set to be 0 will auto calculate the least fee
- ///
- public Transaction Transfer(string tokenHash, string fromKey, string toAddress, decimal amount, decimal networkFee = 0)
- {
- UInt160 scriptHash = Utility.GetScriptHash(tokenHash);
- var decimals = nep5API.Decimals(scriptHash);
-
- KeyPair from = Utility.GetKeyPair(fromKey);
- UInt160 to = Utility.GetScriptHash(toAddress);
- BigInteger amountInteger = amount.ToBigInteger(decimals);
- BigInteger networkFeeInteger = networkFee.ToBigInteger(NativeContract.GAS.Decimals);
- return Transfer(scriptHash, from, to, amountInteger, (long)networkFeeInteger);
- }
-
- ///
- /// Transfer NEP5 token balance
- ///
- /// contract script hash
- /// from KeyPair
- /// to account script hash
- /// transfer amount
- /// netwotk fee, set to be 0 will auto calculate the least fee
- ///
- public Transaction Transfer(UInt160 scriptHash, KeyPair from, UInt160 to, BigInteger amountInteger, BigInteger networkFeeInteger = default)
- {
- Transaction transaction = nep5API.CreateTransferTx(scriptHash, from, to, amountInteger, (long)networkFeeInteger);
- rpcClient.SendRawTransaction(transaction);
- return transaction;
- }
-
- ///
- /// Wait until the transaction is observable block chain
- ///
- /// the transaction to observe
- /// TimeoutException throws after "timeout" seconds
- /// the Transaction state, including vmState and blockhash
- public async Task WaitTransaction(Transaction transaction, int timeout = 60)
- {
- DateTime deadline = DateTime.UtcNow.AddSeconds(timeout);
- RpcTransaction rpcTx = null;
- while (rpcTx == null || rpcTx.Confirmations == null)
- {
- if (deadline < DateTime.UtcNow)
- {
- throw new TimeoutException();
- }
-
- try
- {
- rpcTx = rpcClient.GetRawTransaction(transaction.Hash.ToString());
- if (rpcTx == null || rpcTx.Confirmations == null)
- {
- await Task.Delay((int)Blockchain.MillisecondsPerBlock / 2);
- }
- }
- catch (Exception) { }
- }
- return rpcTx;
- }
- }
-}
diff --git a/src/neo/Plugins/IRpcPlugin.cs b/src/neo/Plugins/IRpcPlugin.cs
deleted file mode 100644
index 92e7a0fa48..0000000000
--- a/src/neo/Plugins/IRpcPlugin.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using Microsoft.AspNetCore.Http;
-using Neo.IO.Json;
-
-namespace Neo.Plugins
-{
- public interface IRpcPlugin
- {
- void PreProcess(HttpContext context, string method, JArray _params);
- JObject OnProcess(HttpContext context, string method, JArray _params);
- void PostProcess(HttpContext context, string method, JArray _params, JObject result);
- }
-}
diff --git a/src/neo/Plugins/Plugin.cs b/src/neo/Plugins/Plugin.cs
index 918a1e4ae3..36adac6a77 100644
--- a/src/neo/Plugins/Plugin.cs
+++ b/src/neo/Plugins/Plugin.cs
@@ -14,7 +14,6 @@ public abstract class Plugin : IDisposable
public static readonly List Plugins = new List();
internal static readonly List Loggers = new List();
internal static readonly Dictionary Storages = new Dictionary();
- internal static readonly List RpcPlugins = new List();
internal static readonly List PersistencePlugins = new List();
internal static readonly List P2PPlugins = new List();
internal static readonly List TxObserverPlugins = new List();
@@ -52,7 +51,6 @@ protected Plugin()
if (this is ILogPlugin logger) Loggers.Add(logger);
if (this is IStoragePlugin storage) Storages.Add(Name, storage);
if (this is IP2PPlugin p2p) P2PPlugins.Add(p2p);
- if (this is IRpcPlugin rpc) RpcPlugins.Add(rpc);
if (this is IPersistencePlugin persistence) PersistencePlugins.Add(persistence);
if (this is IMemoryPoolTxObserverPlugin txObserver) TxObserverPlugins.Add(txObserver);
diff --git a/src/neo/Utility.cs b/src/neo/Utility.cs
index b6402a91c6..984422512e 100644
--- a/src/neo/Utility.cs
+++ b/src/neo/Utility.cs
@@ -1,65 +1,11 @@
using Microsoft.Extensions.Configuration;
-using Neo.Cryptography.ECC;
using Neo.Plugins;
-using Neo.SmartContract;
-using Neo.Wallets;
using System;
namespace Neo
{
public static class Utility
{
- ///
- /// Parse WIF or private key hex string to KeyPair
- ///
- /// WIF or private key hex string
- /// Example: WIF ("KyXwTh1hB76RRMquSvnxZrJzQx7h9nQP2PCRL38v6VDb5ip3nf1p"), PrivateKey ("450d6c2a04b5b470339a745427bae6828400cf048400837d73c415063835e005")
- ///
- public static KeyPair GetKeyPair(string key)
- {
- if (string.IsNullOrEmpty(key)) { throw new ArgumentNullException(nameof(key)); }
- if (key.StartsWith("0x")) { key = key.Substring(2); }
-
- if (key.Length == 52)
- {
- return new KeyPair(Wallet.GetPrivateKeyFromWIF(key));
- }
- else if (key.Length == 64)
- {
- return new KeyPair(key.HexToBytes());
- }
-
- throw new FormatException();
- }
-
- ///
- /// Parse address, scripthash or public key string to UInt160
- ///
- /// account address, scripthash or public key string
- /// Example: address ("AV556nYUwyJKNv8Xy7hVMLQnkmKPukw6x5"), scripthash ("0x6a38cd693b615aea24dd00de12a9f5836844da91"), public key ("02f9ec1fd0a98796cf75b586772a4ddd41a0af07a1dbdf86a7238f74fb72503575")
- ///
- public static UInt160 GetScriptHash(string account)
- {
- if (string.IsNullOrEmpty(account)) { throw new ArgumentNullException(nameof(account)); }
- if (account.StartsWith("0x")) { account = account.Substring(2); }
-
- if (account.Length == 34)
- {
- return Wallets.Helper.ToScriptHash(account);
- }
- else if (account.Length == 40)
- {
- return UInt160.Parse(account);
- }
- else if (account.Length == 66)
- {
- var pubKey = ECPoint.Parse(account, ECCurve.Secp256r1);
- return Contract.CreateSignatureRedeemScript(pubKey).ToScriptHash();
- }
-
- throw new FormatException();
- }
-
///
/// Load configuration with different Environment Variable
///
diff --git a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcBlock.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcBlock.cs
deleted file mode 100644
index 860eafa076..0000000000
--- a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcBlock.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using FluentAssertions;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Neo.Network.P2P.Payloads;
-using Neo.Network.RPC.Models;
-using System;
-
-namespace Neo.UnitTests.Network.RPC.Models
-{
- [TestClass]
- public class UT_RpcBlock
- {
- [TestMethod]
- public void TestToJson()
- {
- var rpcBlock = new RpcBlock();
- var block = new Block();
- TestUtils.SetupBlockWithValues(block, UInt256.Zero, out UInt256 _, out UInt160 _, out ulong _, out uint _, out Witness _, out Transaction[] _, 1);
- rpcBlock.Block = block;
- var json = rpcBlock.ToJson();
- json["previousblockhash"].AsString().Should().Be("0x0000000000000000000000000000000000000000000000000000000000000000");
- json.Should().NotBeNull();
-
- rpcBlock.Confirmations = 1;
- rpcBlock.NextBlockHash = UInt256.Zero;
- json = rpcBlock.ToJson();
- json["confirmations"].AsNumber().Should().Be(1);
- }
- }
-}
diff --git a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcBlockHeader.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcBlockHeader.cs
deleted file mode 100644
index 85a604d3e8..0000000000
--- a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcBlockHeader.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using FluentAssertions;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Neo.Network.P2P.Payloads;
-using Neo.Network.RPC.Models;
-using System;
-
-namespace Neo.UnitTests.Network.RPC.Models
-{
- [TestClass]
- public class UT_RpcBlockHeader
- {
- [TestMethod]
- public void TestToJson()
- {
- var rpcBlockHeader = new RpcBlockHeader();
- var header = new Header();
- TestUtils.SetupHeaderWithValues(header, UInt256.Zero, out UInt256 _, out UInt160 _, out ulong _, out uint _, out Witness _);
- rpcBlockHeader.Header = header;
- var json = rpcBlockHeader.ToJson();
- json["previousblockhash"].AsString().Should().Be("0x0000000000000000000000000000000000000000000000000000000000000000");
- json.Should().NotBeNull();
-
- rpcBlockHeader.Confirmations = 1;
- rpcBlockHeader.NextBlockHash = UInt256.Zero;
- json = rpcBlockHeader.ToJson();
- json["confirmations"].AsNumber().Should().Be(1);
- }
- }
-}
diff --git a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcNep5Balance.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcNep5Balance.cs
deleted file mode 100644
index 9131db811a..0000000000
--- a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcNep5Balance.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-using FluentAssertions;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Neo.IO.Json;
-using Neo.Network.RPC.Models;
-using System.Numerics;
-
-namespace Neo.UnitTests.Network.RPC.Models
-{
- [TestClass]
- public class UT_RpcNep5Balance
- {
- private RpcNep5Balance balance;
-
- [TestInitialize]
- public void Setup()
- {
- balance = new RpcNep5Balance();
- }
-
- [TestMethod]
- public void TestAssetHash()
- {
- balance.AssetHash = UInt160.Zero;
- balance.AssetHash.Should().Be(UInt160.Zero);
- }
-
- [TestMethod]
- public void TestAmount()
- {
- balance.Amount = BigInteger.Zero;
- balance.Amount.Should().Be(BigInteger.Zero);
- }
-
- [TestMethod]
- public void TestLastUpdatedBlock()
- {
- balance.LastUpdatedBlock = 0;
- balance.LastUpdatedBlock.Should().Be(0);
- }
-
- [TestMethod]
- public void TestToJson()
- {
- balance.AssetHash = UInt160.Zero;
- balance.Amount = BigInteger.Zero;
- balance.LastUpdatedBlock = 0;
- var json = balance.ToJson();
- json["asset_hash"].AsString().Should().Be("0x0000000000000000000000000000000000000000");
- json["amount"].AsNumber().Should().Be(0);
- json["last_updated_block"].AsNumber().Should().Be(0);
- }
-
- [TestMethod]
- public void TestFromJson()
- {
- var json = new JObject();
- json["asset_hash"] = "0x0000000000000000000000000000000000000000";
- json["amount"] = "0";
- json["last_updated_block"] = "0";
- var rpcNep5Balance = RpcNep5Balance.FromJson(json);
- rpcNep5Balance.AssetHash.Should().Be(UInt160.Zero);
- rpcNep5Balance.Amount.Should().Be(BigInteger.Zero);
- rpcNep5Balance.LastUpdatedBlock.Should().Be(0);
- }
- }
-}
diff --git a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcNep5Balances.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcNep5Balances.cs
deleted file mode 100644
index 57601626ab..0000000000
--- a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcNep5Balances.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-using FluentAssertions;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Neo.IO.Json;
-using Neo.Network.RPC.Models;
-using System.Numerics;
-
-namespace Neo.UnitTests.Network.RPC.Models
-{
- [TestClass]
- public class UT_RpcNep5Balances
- {
- private RpcNep5Balances balances;
-
- [TestInitialize]
- public void Setup()
- {
- balances = new RpcNep5Balances()
- {
- Address = "abc",
- Balances = new RpcNep5Balance[] {
- new RpcNep5Balance()
- {
- AssetHash = UInt160.Zero,
- Amount = BigInteger.Zero,
- LastUpdatedBlock = 0
- },
- new RpcNep5Balance()
- {
- AssetHash = UInt160.Parse("0xa400ff00ff00ff00ff00ff00ff00ff00ff00ff01"),
- Amount = new BigInteger(1),
- LastUpdatedBlock = 1
- }
- }
- };
- }
-
- [TestMethod]
- public void TestAddress()
- {
- balances.Address.Should().Be("abc");
- }
-
- [TestMethod]
- public void TestBalances()
- {
- balances.Balances.Length.Should().Be(2);
- }
-
- [TestMethod]
- public void TestToJson()
- {
- var json = balances.ToJson();
- json["address"].AsString().Should().Be("abc");
- ((JArray)json["balance"]).Count.Should().Be(2);
- }
-
- [TestMethod]
- public void TestFromJson()
- {
- var json = balances.ToJson();
- var rpcNep5Balances = RpcNep5Balances.FromJson(json);
- rpcNep5Balances.Address.Should().Be("abc");
- rpcNep5Balances.Balances.Length.Should().Be(2);
- }
- }
-}
diff --git a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcPeer.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcPeer.cs
deleted file mode 100644
index b5c5044d13..0000000000
--- a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcPeer.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using FluentAssertions;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Neo.Network.RPC.Models;
-
-namespace Neo.UnitTests.Network.RPC.Models
-{
- [TestClass]
- public class UT_RpcPeer
- {
- [TestMethod]
- public void TestToJson()
- {
- var rpcPeer = new RpcPeer()
- {
- Address = "abc",
- Port = 800
- };
- var json = rpcPeer.ToJson();
- json["address"].AsString().Should().Be("abc");
- json["port"].AsNumber().Should().Be(800);
- }
- }
-}
diff --git a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcPeers.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcPeers.cs
deleted file mode 100644
index cb6f6ff611..0000000000
--- a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcPeers.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-using FluentAssertions;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Neo.IO.Json;
-using Neo.Network.RPC.Models;
-
-namespace Neo.UnitTests.Network.RPC.Models
-{
- [TestClass]
- public class UT_RpcPeers
- {
- [TestMethod]
- public void TestToJson()
- {
- var rpcPeers = new RpcPeers()
- {
- Unconnected = new RpcPeer[] {
- new RpcPeer()
- {
- Address = "Unconnected",
- Port = 600
- }
- },
- Bad = new RpcPeer[] {
- new RpcPeer()
- {
- Address = "Bad",
- Port = 700
- }
- },
- Connected = new RpcPeer[] {
- new RpcPeer()
- {
- Address = "Connected",
- Port = 800
- }
- }
- };
- var json = rpcPeers.ToJson();
- ((JArray)json["unconnected"]).Count.Should().Be(1);
- ((JArray)json["bad"]).Count.Should().Be(1);
- ((JArray)json["connected"]).Count.Should().Be(1);
- }
- }
-}
diff --git a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcRawMemPool.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcRawMemPool.cs
deleted file mode 100644
index e8cb9bad7e..0000000000
--- a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcRawMemPool.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using FluentAssertions;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Neo.Network.RPC.Models;
-
-namespace Neo.UnitTests.Network.RPC.Models
-{
- [TestClass]
- public class UT_RpcRawMemPool
- {
- [TestMethod]
- public void TestToJson()
- {
- var pool = new RpcRawMemPool
- {
- Height = 1,
- Verified = new string[] {
- "a", "b"
- },
- UnVerified = new string[] {
- "c", "d"
- }
- };
- var json = pool.ToJson();
- json["height"].AsNumber().Should().Be(1);
- json["verified"].AsString().Should().Be("a,b");
- json["unverified"].AsString().Should().Be("c,d");
- }
- }
-}
diff --git a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcRequest.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcRequest.cs
deleted file mode 100644
index 8f2a3b4f74..0000000000
--- a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcRequest.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using FluentAssertions;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Neo.IO.Json;
-using Neo.Network.RPC.Models;
-
-namespace Neo.UnitTests.Network.RPC.Models
-{
- [TestClass]
- public class UT_RpcRequest
- {
- [TestMethod]
- public void TestFromJson()
- {
- var req = new RpcRequest()
- {
- Id = 1,
- Jsonrpc = "myrpc",
- Method = "get",
- Params = new JObject[] {
- new JBoolean(true)
- }
- };
- var json = req.ToJson();
- var rpcRequest = RpcRequest.FromJson(json);
- rpcRequest.Jsonrpc.Should().Be("myrpc");
- rpcRequest.Method.Should().Be("get");
- rpcRequest.Id.Should().Be(1);
- rpcRequest.Params.Length.Should().Be(1);
- }
- }
-}
diff --git a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcResponse.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcResponse.cs
deleted file mode 100644
index 5c90eed92d..0000000000
--- a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcResponse.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-using FluentAssertions;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Neo.IO.Json;
-using Neo.Network.RPC.Models;
-
-namespace Neo.UnitTests.Network.RPC.Models
-{
- [TestClass]
- public class UT_RpcResponse
- {
- [TestMethod]
- public void TestToJson()
- {
- var error = new RpcResponseError()
- {
- Code = 0,
- Message = "msg",
- Data = new JBoolean(true)
- };
- var rep = new RpcResponse()
- {
- Id = 1,
- Jsonrpc = "rpc",
- Error = error,
- Result = new JBoolean(true)
- };
- var json = rep.ToJson();
- json["id"].AsNumber().Should().Be(1);
- json["jsonrpc"].AsString().Should().Be("rpc");
- json["error"].AsString().Should().Be(error.ToJson().AsString());
- json["result"].AsBoolean().Should().BeTrue();
- }
- }
-}
diff --git a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcVersion.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcVersion.cs
deleted file mode 100644
index cbb9603907..0000000000
--- a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcVersion.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using FluentAssertions;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Neo.Network.RPC.Models;
-
-namespace Neo.UnitTests.Network.RPC.Models
-{
- [TestClass]
- public class UT_RpcVersion
- {
- [TestMethod]
- public void TestToJson()
- {
- var version = new RpcVersion()
- {
- TcpPort = 800,
- WsPort = 900,
- Nonce = 1,
- UserAgent = "agent"
- };
- var json = version.ToJson();
- json["topPort"].AsNumber().Should().Be(800);
- json["wsPort"].AsNumber().Should().Be(900);
- json["nonce"].AsNumber().Should().Be(1);
- json["useragent"].AsString().Should().Be("agent");
- }
- }
-}
diff --git a/tests/neo.UnitTests/Network/RPC/UT_ContractClient.cs b/tests/neo.UnitTests/Network/RPC/UT_ContractClient.cs
deleted file mode 100644
index 13a02b5b9d..0000000000
--- a/tests/neo.UnitTests/Network/RPC/UT_ContractClient.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Moq;
-using Neo.Network.RPC;
-using Neo.SmartContract;
-using Neo.SmartContract.Manifest;
-using Neo.SmartContract.Native;
-using Neo.VM;
-using Neo.Wallets;
-
-namespace Neo.UnitTests.Network.RPC
-{
- [TestClass]
- public class UT_ContractClient
- {
- Mock rpcClientMock;
- KeyPair keyPair1;
- UInt160 sender;
-
- [TestInitialize]
- public void TestSetup()
- {
- keyPair1 = new KeyPair(Wallet.GetPrivateKeyFromWIF("KyXwTh1hB76RRMquSvnxZrJzQx7h9nQP2PCRL38v6VDb5ip3nf1p"));
- sender = Contract.CreateSignatureRedeemScript(keyPair1.PublicKey).ToScriptHash();
- rpcClientMock = UT_TransactionManager.MockRpcClient(sender, new byte[0]);
- }
-
- [TestMethod]
- public void TestInvoke()
- {
- byte[] testScript = NativeContract.GAS.Hash.MakeScript("balanceOf", UInt160.Zero);
- UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.ByteArray, Value = "00e057eb481b".HexToBytes() });
-
- ContractClient contractClient = new ContractClient(rpcClientMock.Object);
- var result = contractClient.TestInvoke(NativeContract.GAS.Hash, "balanceOf", UInt160.Zero);
-
- Assert.AreEqual(30000000000000L, (long)result.Stack[0].ToStackItem().GetBigInteger());
- }
-
- [TestMethod]
- public void TestDeployContract()
- {
- byte[] script;
- var manifest = ContractManifest.CreateDefault(new byte[1].ToScriptHash());
- manifest.Features = ContractFeatures.HasStorage | ContractFeatures.Payable;
- using (ScriptBuilder sb = new ScriptBuilder())
- {
- sb.EmitSysCall(InteropService.Neo_Contract_Create, new byte[1], manifest.ToString());
- script = sb.ToArray();
- }
-
- UT_TransactionManager.MockInvokeScript(rpcClientMock, script, new ContractParameter());
-
- ContractClient contractClient = new ContractClient(rpcClientMock.Object);
- var result = contractClient.CreateDeployContractTx(new byte[1], manifest, keyPair1);
-
- Assert.IsNotNull(result);
- }
- }
-}
diff --git a/tests/neo.UnitTests/Network/RPC/UT_Helper.cs b/tests/neo.UnitTests/Network/RPC/UT_Helper.cs
deleted file mode 100644
index cb791fa6ce..0000000000
--- a/tests/neo.UnitTests/Network/RPC/UT_Helper.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Neo.Network.RPC;
-using System;
-using System.Numerics;
-
-namespace Neo.UnitTests.Network.RPC
-{
- [TestClass]
- public class UT_Helper
- {
- [TestMethod]
- public void TestToBigInteger()
- {
- decimal amount = 1.23456789m;
- uint decimals = 9;
- var result = amount.ToBigInteger(decimals);
- Assert.AreEqual(1234567890, result);
-
- amount = 1.23456789m;
- decimals = 18;
- result = amount.ToBigInteger(decimals);
- Assert.AreEqual(BigInteger.Parse("1234567890000000000"), result);
-
- amount = 1.23456789m;
- decimals = 4;
- Assert.ThrowsException(() => result = amount.ToBigInteger(decimals));
- }
- }
-}
diff --git a/tests/neo.UnitTests/Network/RPC/UT_Nep5API.cs b/tests/neo.UnitTests/Network/RPC/UT_Nep5API.cs
deleted file mode 100644
index 48fd711638..0000000000
--- a/tests/neo.UnitTests/Network/RPC/UT_Nep5API.cs
+++ /dev/null
@@ -1,112 +0,0 @@
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Moq;
-using Neo.Network.RPC;
-using Neo.SmartContract;
-using Neo.SmartContract.Native;
-using Neo.VM;
-using Neo.Wallets;
-using System.Linq;
-using System.Numerics;
-
-namespace Neo.UnitTests.Network.RPC
-{
- [TestClass]
- public class UT_Nep5API
- {
- Mock rpcClientMock;
- KeyPair keyPair1;
- UInt160 sender;
- Nep5API nep5API;
-
- [TestInitialize]
- public void TestSetup()
- {
- keyPair1 = new KeyPair(Wallet.GetPrivateKeyFromWIF("KyXwTh1hB76RRMquSvnxZrJzQx7h9nQP2PCRL38v6VDb5ip3nf1p"));
- sender = Contract.CreateSignatureRedeemScript(keyPair1.PublicKey).ToScriptHash();
- rpcClientMock = UT_TransactionManager.MockRpcClient(sender, new byte[0]);
- nep5API = new Nep5API(rpcClientMock.Object);
- }
-
- [TestMethod]
- public void TestBalanceOf()
- {
- byte[] testScript = NativeContract.GAS.Hash.MakeScript("balanceOf", UInt160.Zero);
- UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(10000) });
-
- var balance = nep5API.BalanceOf(NativeContract.GAS.Hash, UInt160.Zero);
- Assert.AreEqual(10000, (int)balance);
- }
-
- [TestMethod]
- public void TestGetName()
- {
- byte[] testScript = NativeContract.GAS.Hash.MakeScript("name");
- UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.String, Value = NativeContract.GAS.Name });
-
- var result = nep5API.Name(NativeContract.GAS.Hash);
- Assert.AreEqual(NativeContract.GAS.Name, result);
- }
-
- [TestMethod]
- public void TestGetSymbol()
- {
- byte[] testScript = NativeContract.GAS.Hash.MakeScript("symbol");
- UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.String, Value = NativeContract.GAS.Symbol });
-
- var result = nep5API.Symbol(NativeContract.GAS.Hash);
- Assert.AreEqual(NativeContract.GAS.Symbol, result);
- }
-
- [TestMethod]
- public void TestGetDecimals()
- {
- byte[] testScript = NativeContract.GAS.Hash.MakeScript("decimals");
- UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(NativeContract.GAS.Decimals) });
-
- var result = nep5API.Decimals(NativeContract.GAS.Hash);
- Assert.AreEqual(NativeContract.GAS.Decimals, (byte)result);
- }
-
- [TestMethod]
- public void TestGetTotalSupply()
- {
- byte[] testScript = NativeContract.GAS.Hash.MakeScript("totalSupply");
- UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1_00000000) });
-
- var result = nep5API.TotalSupply(NativeContract.GAS.Hash);
- Assert.AreEqual(1_00000000, (int)result);
- }
-
- [TestMethod]
- public void TestGetTokenInfo()
- {
- UInt160 scriptHash = NativeContract.GAS.Hash;
- byte[] testScript = scriptHash.MakeScript("name")
- .Concat(scriptHash.MakeScript("symbol"))
- .Concat(scriptHash.MakeScript("decimals"))
- .Concat(scriptHash.MakeScript("totalSupply"))
- .ToArray(); ;
- UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript,
- new ContractParameter { Type = ContractParameterType.String, Value = NativeContract.GAS.Name },
- new ContractParameter { Type = ContractParameterType.String, Value = NativeContract.GAS.Symbol },
- new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(NativeContract.GAS.Decimals) },
- new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1_00000000) });
-
- var result = nep5API.GetTokenInfo(NativeContract.GAS.Hash);
- Assert.AreEqual(NativeContract.GAS.Name, result.Name);
- Assert.AreEqual(NativeContract.GAS.Symbol, result.Symbol);
- Assert.AreEqual(8, (int)result.Decimals);
- Assert.AreEqual(1_00000000, (int)result.TotalSupply);
- }
-
- [TestMethod]
- public void TestTransfer()
- {
- byte[] testScript = NativeContract.GAS.Hash.MakeScript("transfer", sender, UInt160.Zero, new BigInteger(1_00000000));
- UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter());
-
- var result = nep5API.CreateTransferTx(NativeContract.GAS.Hash, keyPair1, UInt160.Zero, new BigInteger(1_00000000));
- Assert.IsNotNull(result);
- }
- }
-}
diff --git a/tests/neo.UnitTests/Network/RPC/UT_PolicyAPI.cs b/tests/neo.UnitTests/Network/RPC/UT_PolicyAPI.cs
deleted file mode 100644
index 6b6c449111..0000000000
--- a/tests/neo.UnitTests/Network/RPC/UT_PolicyAPI.cs
+++ /dev/null
@@ -1,69 +0,0 @@
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Moq;
-using Neo.Network.RPC;
-using Neo.SmartContract;
-using Neo.SmartContract.Native;
-using Neo.VM;
-using Neo.Wallets;
-using System.Numerics;
-
-namespace Neo.UnitTests.Network.RPC
-{
- [TestClass]
- public class UT_PolicyAPI
- {
- Mock rpcClientMock;
- KeyPair keyPair1;
- UInt160 sender;
- PolicyAPI policyAPI;
-
- [TestInitialize]
- public void TestSetup()
- {
- keyPair1 = new KeyPair(Wallet.GetPrivateKeyFromWIF("KyXwTh1hB76RRMquSvnxZrJzQx7h9nQP2PCRL38v6VDb5ip3nf1p"));
- sender = Contract.CreateSignatureRedeemScript(keyPair1.PublicKey).ToScriptHash();
- rpcClientMock = UT_TransactionManager.MockRpcClient(sender, new byte[0]);
- policyAPI = new PolicyAPI(rpcClientMock.Object);
- }
-
- [TestMethod]
- public void TestGetMaxTransactionsPerBlock()
- {
- byte[] testScript = NativeContract.Policy.Hash.MakeScript("getMaxTransactionsPerBlock");
- UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(512) });
-
- var result = policyAPI.GetMaxTransactionsPerBlock();
- Assert.AreEqual(512u, result);
- }
-
- [TestMethod]
- public void TestGetMaxBlockSize()
- {
- byte[] testScript = NativeContract.Policy.Hash.MakeScript("getMaxBlockSize");
- UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1024u * 256u) });
-
- var result = policyAPI.GetMaxBlockSize();
- Assert.AreEqual(1024u * 256u, result);
- }
-
- [TestMethod]
- public void TestGetFeePerByte()
- {
- byte[] testScript = NativeContract.Policy.Hash.MakeScript("getFeePerByte");
- UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1000) });
-
- var result = policyAPI.GetFeePerByte();
- Assert.AreEqual(1000L, result);
- }
-
- [TestMethod]
- public void TestGetBlockedAccounts()
- {
- byte[] testScript = NativeContract.Policy.Hash.MakeScript("getBlockedAccounts");
- UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Array, Value = new[] { new ContractParameter { Type = ContractParameterType.Hash160, Value = UInt160.Zero } } });
-
- var result = policyAPI.GetBlockedAccounts();
- Assert.AreEqual(UInt160.Zero, result[0]);
- }
- }
-}
diff --git a/tests/neo.UnitTests/Network/RPC/UT_RpcClient.cs b/tests/neo.UnitTests/Network/RPC/UT_RpcClient.cs
deleted file mode 100644
index a8b212fe37..0000000000
--- a/tests/neo.UnitTests/Network/RPC/UT_RpcClient.cs
+++ /dev/null
@@ -1,568 +0,0 @@
-using FluentAssertions;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Moq;
-using Moq.Protected;
-using Neo.IO;
-using Neo.IO.Json;
-using Neo.Ledger;
-using Neo.Network.P2P.Payloads;
-using Neo.Network.RPC;
-using Neo.Network.RPC.Models;
-using Neo.SmartContract;
-using Neo.SmartContract.Manifest;
-using Neo.VM;
-using System;
-using System.Linq;
-using System.Net;
-using System.Net.Http;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Neo.UnitTests.Network.RPC
-{
- [TestClass]
- public class UT_RpcClient
- {
- RpcClient rpc;
- Mock handlerMock;
-
- [TestInitialize]
- public void TestSetup()
- {
- handlerMock = new Mock(MockBehavior.Strict);
-
- // use real http client with mocked handler here
- var httpClient = new HttpClient(handlerMock.Object)
- {
- BaseAddress = new Uri("http://seed1.neo.org:10331"),
- };
-
- rpc = new RpcClient(httpClient);
- }
-
- private void MockResponse(string content)
- {
- handlerMock.Protected()
- // Setup the PROTECTED method to mock
- .Setup>(
- "SendAsync",
- ItExpr.IsAny(),
- ItExpr.IsAny()
- )
- // prepare the expected response of the mocked http call
- .ReturnsAsync(new HttpResponseMessage()
- {
- StatusCode = HttpStatusCode.OK,
- Content = new StringContent(content),
- })
- .Verifiable();
- }
-
- private JObject CreateErrorResponse(JObject id, int code, string message, JObject data = null)
- {
- JObject response = CreateResponse(id);
- response["error"] = new JObject();
- response["error"]["code"] = code;
- response["error"]["message"] = message;
- if (data != null)
- response["error"]["data"] = data;
- return response;
- }
-
- private JObject CreateResponse(JObject id)
- {
- JObject response = new JObject();
- response["jsonrpc"] = "2.0";
- response["id"] = id;
- return response;
- }
-
- [TestMethod]
- public void TestErrorResponse()
- {
- JObject response = CreateErrorResponse(null, -32700, "Parse error");
- MockResponse(response.ToString());
- try
- {
- var result = rpc.GetBlockHex("773dd2dae4a9c9275290f89b56e67d7363ea4826dfd4fc13cc01cf73a44b0d0e");
- }
- catch (RpcException ex)
- {
- Assert.AreEqual(-32700, ex.HResult);
- Assert.AreEqual("Parse error", ex.Message);
- }
- }
-
- [TestMethod]
- public void TestGetBestBlockHash()
- {
- JObject response = CreateResponse(1);
- response["result"] = "000000002deadfa82cbc4682f5800";
- MockResponse(response.ToString());
-
- var result = rpc.GetBestBlockHash();
- Assert.AreEqual("000000002deadfa82cbc4682f5800", result);
- }
-
- [TestMethod]
- public void TestGetBlockHex()
- {
- JObject response = CreateResponse(1);
- response["result"] = "000000002deadfa82cbc4682f5800";
- MockResponse(response.ToString());
-
- var result = rpc.GetBlockHex("773dd2dae4a9c9275290f89b56e67d7363ea4826dfd4fc13cc01cf73a44b0d0e");
- Assert.AreEqual("000000002deadfa82cbc4682f5800", result);
- }
-
- [TestMethod]
- public void TestGetBlock()
- {
- // create block
- var block = new Block();
- TestUtils.SetupBlockWithValues(block, UInt256.Zero, out _, out UInt160 _, out ulong _, out uint _, out Witness _, out Transaction[] _, 0);
-
- block.Transactions = new[]
- {
- TestUtils.GetTransaction(),
- TestUtils.GetTransaction(),
- TestUtils.GetTransaction()
- };
-
- JObject json = block.ToJson();
- json["confirmations"] = 20;
- JObject response = CreateResponse(1);
- response["result"] = json;
- MockResponse(response.ToString());
-
- var result = rpc.GetBlock("773dd2dae4a9c9275290f89b56e67d7363ea4826dfd4fc13cc01cf73a44b0d0e");
- Assert.AreEqual(block.Hash.ToString(), result.Block.Hash.ToString());
- Assert.IsNull(result.NextBlockHash);
- Assert.AreEqual(20, result.Confirmations);
- Assert.AreEqual(block.Transactions.Length, result.Block.Transactions.Length);
- Assert.AreEqual(block.Transactions[0].Hash.ToString(), result.Block.Transactions[0].Hash.ToString());
-
- // verbose with confirmations
- json["confirmations"] = 20;
- json["nextblockhash"] = "773dd2dae4a9c9275290f89b56e67d7363ea4826dfd4fc13cc01cf73a44b0d0e";
- MockResponse(response.ToString());
- result = rpc.GetBlock("773dd2dae4a9c9275290f89b56e67d7363ea4826dfd4fc13cc01cf73a44b0d0e");
- Assert.AreEqual(block.Hash.ToString(), result.Block.Hash.ToString());
- Assert.AreEqual(20, result.Confirmations);
- Assert.AreEqual("0x773dd2dae4a9c9275290f89b56e67d7363ea4826dfd4fc13cc01cf73a44b0d0e", result.NextBlockHash.ToString());
- Assert.AreEqual(block.Transactions.Length, result.Block.Transactions.Length);
- Assert.AreEqual(block.Transactions[0].Hash.ToString(), result.Block.Transactions[0].Hash.ToString());
- }
-
- [TestMethod]
- public void TestGetBlockCount()
- {
- JObject response = CreateResponse(1);
- response["result"] = 100;
- MockResponse(response.ToString());
-
- var result = rpc.GetBlockCount();
- Assert.AreEqual(100u, result);
- }
-
- [TestMethod]
- public void TestGetBlockHash()
- {
- JObject response = CreateResponse(1);
- response["result"] = "0x4c1e879872344349067c3b1a30781eeb4f9040d3795db7922f513f6f9660b9b2";
- MockResponse(response.ToString());
-
- var result = rpc.GetBlockHash(100);
- Assert.AreEqual("0x4c1e879872344349067c3b1a30781eeb4f9040d3795db7922f513f6f9660b9b2", result);
- }
-
- [TestMethod]
- public void TestGetBlockHeaderHex()
- {
- JObject response = CreateResponse(1);
- response["result"] = "0x4c1e879872344349067c3b1a30781eeb4f9040d3795db7922f513f6f9660b9b2";
- MockResponse(response.ToString());
-
- var result = rpc.GetBlockHeaderHex("100");
- Assert.AreEqual("0x4c1e879872344349067c3b1a30781eeb4f9040d3795db7922f513f6f9660b9b2", result);
- }
-
- [TestMethod]
- public void TestGetBlockHeader()
- {
- Header header = new Header();
- TestUtils.SetupHeaderWithValues(header, UInt256.Zero, out UInt256 _, out UInt160 _, out ulong _, out uint _, out Witness _);
-
- JObject json = header.ToJson();
- json["confirmations"] = 20;
- JObject response = CreateResponse(1);
- response["result"] = json;
- MockResponse(response.ToString());
-
- var result = rpc.GetBlockHeader("100");
- Assert.AreEqual(header.Hash.ToString(), result.Header.Hash.ToString());
- Assert.IsNull(result.NextBlockHash);
- Assert.AreEqual(20, result.Confirmations);
-
- json["confirmations"] = 20;
- json["nextblockhash"] = "4c1e879872344349067c3b1a30781eeb4f9040d3795db7922f513f6f9660b9b2";
- MockResponse(response.ToString());
- result = rpc.GetBlockHeader("100");
- Assert.AreEqual(header.Hash.ToString(), result.Header.Hash.ToString());
- Assert.AreEqual(20, result.Confirmations);
- }
-
- [TestMethod]
- public void TestGetBlockSysFee()
- {
- JObject response = CreateResponse(1);
- response["result"] = "195500";
- MockResponse(response.ToString());
-
- var result = rpc.GetBlockSysFee(100);
- Assert.AreEqual("195500", result);
- }
-
- [TestMethod]
- public void TestGetConnectionCount()
- {
- JObject response = CreateResponse(1);
- response["result"] = 9;
- MockResponse(response.ToString());
-
- var result = rpc.GetConnectionCount();
- Assert.AreEqual(9, result);
- }
-
- [TestMethod]
- public void TestGetContractState()
- {
- byte[] script;
- using (var sb = new ScriptBuilder())
- {
- sb.EmitSysCall(InteropService.System_Runtime_GetInvocationCounter);
- script = sb.ToArray();
- }
-
- ContractState state = new ContractState
- {
- Script = new byte[] { (byte)OpCode.DROP, (byte)OpCode.DROP }.Concat(script).ToArray(),
- Manifest = ContractManifest.CreateDefault(UInt160.Parse("0xa400ff00ff00ff00ff00ff00ff00ff00ff00ff01"))
- };
-
- JObject response = CreateResponse(1);
- response["result"] = state.ToJson();
- MockResponse(response.ToString());
-
- var result = rpc.GetContractState("17694b31cc7ee215cea2ded146e0b2b28768fc46");
-
- Assert.AreEqual(state.Script.ToHexString(), result.Script.ToHexString());
- Assert.AreEqual(state.Manifest.Abi.EntryPoint.Name, result.Manifest.Abi.EntryPoint.Name);
- }
-
- [TestMethod]
- public void TestGetPeers()
- {
- JObject response = CreateResponse(1);
- response["result"] = JObject.Parse(@"{
- ""unconnected"": [
- {
- ""address"": ""::ffff:70.73.16.236"",
- ""port"": 10333
- },
- {
- ""address"": ""::ffff:82.95.77.148"",
- ""port"": 10333
- },
- {
- ""address"": ""::ffff:49.50.215.166"",
- ""port"": 10333
- }
- ],
- ""bad"": [],
- ""connected"": [
- {
- ""address"": ""::ffff:139.219.106.33"",
- ""port"": 10333
- },
- {
- ""address"": ""::ffff:47.88.53.224"",
- ""port"": 10333
- }
- ]
- }");
- MockResponse(response.ToString());
-
- var result = rpc.GetPeers();
- Assert.AreEqual("::ffff:139.219.106.33", result.Connected[0].Address);
- Assert.AreEqual("::ffff:82.95.77.148", result.Unconnected[1].Address);
- }
-
- [TestMethod]
- public void TestGetRawMempool()
- {
- JObject response = CreateResponse(1);
- response["result"] = JObject.Parse(@"[
- ""0x9786cce0dddb524c40ddbdd5e31a41ed1f6b5c8a683c122f627ca4a007a7cf4e"",
- ""0xb488ad25eb474f89d5ca3f985cc047ca96bc7373a6d3da8c0f192722896c1cd7"",
- ""0xf86f6f2c08fbf766ebe59dc84bc3b8829f1053f0a01deb26bf7960d99fa86cd6""
- ]");
- MockResponse(response.ToString());
-
- var result = rpc.GetRawMempool();
- Assert.AreEqual("0xb488ad25eb474f89d5ca3f985cc047ca96bc7373a6d3da8c0f192722896c1cd7", result[1]);
- }
-
- [TestMethod]
- public void TestGetRawMempoolBoth()
- {
- JObject json = new JObject();
- json["height"] = 65535;
- json["verified"] = new JArray(new[] { "0x9786cce0dddb524c40ddbdd5e31a41ed1f6b5c8a683c122f627ca4a007a7cf4e" }.Select(p => (JObject)p));
- json["unverified"] = new JArray(new[] { "0xb488ad25eb474f89d5ca3f985cc047ca96bc7373a6d3da8c0f192722896c1cd7", "0xf86f6f2c08fbf766ebe59dc84bc3b8829f1053f0a01deb26bf7960d99fa86cd6" }.Select(p => (JObject)p));
-
- JObject response = CreateResponse(1);
- response["result"] = json;
- MockResponse(response.ToString());
-
- var result = rpc.GetRawMempoolBoth();
- Assert.AreEqual(65535u, result.Height);
- Assert.AreEqual("0x9786cce0dddb524c40ddbdd5e31a41ed1f6b5c8a683c122f627ca4a007a7cf4e", result.Verified[0]);
- Assert.AreEqual("0xf86f6f2c08fbf766ebe59dc84bc3b8829f1053f0a01deb26bf7960d99fa86cd6", result.UnVerified[1]);
- }
-
- [TestMethod]
- public void TestGetRawTransactionHex()
- {
- var json = TestUtils.GetTransaction().ToArray().ToHexString();
-
- JObject response = CreateResponse(1);
- response["result"] = json;
- MockResponse(response.ToString());
-
- //var result = rpc.GetRawTransactionHex("0x9786cce0dddb524c40ddbdd5e31a41ed1f6b5c8a683c122f627ca4a007a7cf4e");
- var result = rpc.GetRawTransactionHex(TestUtils.GetTransaction().Hash.ToString());
- Assert.AreEqual(json, result);
- }
-
- [TestMethod]
- public void TestGetRawTransaction()
- {
- var transaction = TestUtils.GetTransaction();
- JObject json = transaction.ToJson();
- JObject response = CreateResponse(1);
- response["result"] = json;
- MockResponse(response.ToString());
-
- var result = rpc.GetRawTransaction("0x9786cce0dddb524c40ddbdd5e31a41ed1f6b5c8a683c122f627ca4a007a7cf4e");
- Assert.AreEqual(transaction.Hash, result.Transaction.Hash);
- Assert.AreEqual(json.ToString(), result.ToJson().ToString());
-
- // make the code compatible with the old version
- json["blockhash"] = UInt256.Zero.ToString();
- json["confirmations"] = 100;
- json["blocktime"] = 10;
- MockResponse(response.ToString());
-
- result = rpc.GetRawTransaction("0x9786cce0dddb524c40ddbdd5e31a41ed1f6b5c8a683c122f627ca4a007a7cf4e");
- Assert.AreEqual(transaction.Hash, result.Transaction.Hash);
- Assert.AreEqual(100, result.Confirmations);
- Assert.AreEqual(null, result.VMState);
- Assert.AreEqual(json.ToString(), result.ToJson().ToString());
-
- json["vmState"] = VMState.HALT;
- MockResponse(response.ToString());
-
- result = rpc.GetRawTransaction("0x9786cce0dddb524c40ddbdd5e31a41ed1f6b5c8a683c122f627ca4a007a7cf4e");
- Assert.AreEqual(transaction.Hash, result.Transaction.Hash);
- Assert.AreEqual(100, result.Confirmations);
- Assert.AreEqual(VMState.HALT, result.VMState);
- Assert.AreEqual(json.ToString(), result.ToJson().ToString());
- }
-
- [TestMethod]
- public void TestGetStorage()
- {
- JObject json = "4c696e";
- JObject response = CreateResponse(1);
- response["result"] = json;
- MockResponse(response.ToString());
-
- var result = rpc.GetStorage("03febccf81ac85e3d795bc5cbd4e84e907812aa3", "5065746572");
- Assert.AreEqual("4c696e", result);
- }
-
- [TestMethod]
- public void TestGetTransactionHeight()
- {
- JObject json = 10000;
- JObject response = CreateResponse(1);
- response["result"] = json;
- MockResponse(response.ToString());
-
- var result = rpc.GetTransactionHeight("9c909e1e3ba03290553a68d862e002c7a21ba302e043fc492fe069bf6a134d29");
- Assert.AreEqual(json.ToString(), result.ToString());
- }
-
- [TestMethod]
- public void TestGetValidators()
- {
- JObject json = JObject.Parse(@"[
- {
- ""publickey"": ""02486fd15702c4490a26703112a5cc1d0923fd697a33406bd5a1c00e0013b09a70"",
- ""votes"": ""46632420"",
- ""active"": true
- },
- {
- ""publickey"": ""024c7b7fb6c310fccf1ba33b082519d82964ea93868d676662d4a59ad548df0e7d"",
- ""votes"": ""46632420"",
- ""active"": true
- }
- ]");
- JObject response = CreateResponse(1);
- response["result"] = json;
- MockResponse(response.ToString());
-
- var result = rpc.GetValidators();
- Assert.AreEqual(((JArray)json)[0].ToString(), (result[0]).ToJson().ToString());
- }
-
- [TestMethod]
- public void TestGetVersion()
- {
- JObject json = new JObject();
- json["tcpPort"] = 30001;
- json["wsPort"] = 30002;
- json["nonce"] = 1546258664;
- json["useragent"] = "/NEO:2.7.5/";
-
- var json1 = JObject.Parse(@"{
- ""tcpPort"": 30001,
- ""wsPort"": 30002,
- ""nonce"": 1546258664,
- ""useragent"": ""/NEO:2.7.5/""
- }");
- Assert.AreEqual(json.ToString(), json1.ToString());
-
- JObject response = CreateResponse(1);
- response["result"] = json;
- MockResponse(response.ToString());
-
- var result = rpc.GetVersion();
- Assert.AreEqual(30001, result.TcpPort);
- Assert.AreEqual("/NEO:2.7.5/", result.UserAgent);
- }
-
- [TestMethod]
- public void TestInvokeFunction()
- {
- JObject json = JObject.Parse(@"
- {
- ""script"": ""1426ae7c6c9861ec418468c1f0fdc4a7f2963eb89151c10962616c616e63654f6667be39e7b562f60cbfe2aebca375a2e5ee28737caf"",
- ""state"": ""HALT"",
- ""gas_consumed"": ""0.311"",
- ""stack"": [
- {
- ""type"": ""ByteArray"",
- ""value"": ""262bec084432""
- }
- ]
- }");
- JObject response = CreateResponse(1);
- response["result"] = json;
- MockResponse(response.ToString());
-
- var result = rpc.InvokeFunction("af7c7328eee5a275a3bcaee2bf0cf662b5e739be", "balanceOf", new[] { new RpcStack { Type = "Hash160", Value = "91b83e96f2a7c4fdf0c1688441ec61986c7cae26" } });
- Assert.AreEqual(json.ToString(), result.ToJson().ToString());
- }
-
- [TestMethod]
- public void TestInvokeScript()
- {
- JObject json = JObject.Parse(@"
- {
- ""script"": ""1426ae7c6c9861ec418468c1f0fdc4a7f2963eb89151c10962616c616e63654f6667be39e7b562f60cbfe2aebca375a2e5ee28737caf"",
- ""state"": ""HALT"",
- ""gas_consumed"": ""0.311"",
- ""stack"": [
- {
- ""type"": ""ByteArray"",
- ""value"": ""262bec084432""
- }
- ]
- }");
- JObject response = CreateResponse(1);
- response["result"] = json;
- MockResponse(response.ToString());
-
- var result = rpc.InvokeScript("00046e616d656724058e5e1b6008847cd662728549088a9ee82191".HexToBytes());
- Assert.AreEqual(json.ToString(), result.ToJson().ToString());
- }
-
- [TestMethod]
- public void TestListPlugins()
- {
- JObject json = JObject.Parse(@"[{
- ""name"": ""SimplePolicyPlugin"",
- ""version"": ""2.10.1.0"",
- ""interfaces"": [
- ""ILogPlugin"",
- ""IPolicyPlugin""
- ]
- }]");
- JObject response = CreateResponse(1);
- response["result"] = json;
- MockResponse(response.ToString());
-
- var result = rpc.ListPlugins();
- Assert.AreEqual(((JArray)json)[0].ToString(), result[0].ToJson().ToString());
- }
-
- [TestMethod]
- public void TestSendRawTransaction()
- {
- JObject json = true;
- JObject response = CreateResponse(1);
- response["result"] = json;
- MockResponse(response.ToString());
-
- var result = rpc.SendRawTransaction("80000001195876cb34364dc38b730077156c6bc3a7fc570044a66fbfeeea56f71327e8ab0000029b7cffdaa674beae0f930ebe6085af9093e5fe56b34a5c220ccdcf6efc336fc500c65eaf440000000f9a23e06f74cf86b8827a9108ec2e0f89ad956c9b7cffdaa674beae0f930ebe6085af9093e5fe56b34a5c220ccdcf6efc336fc50092e14b5e00000030aab52ad93f6ce17ca07fa88fc191828c58cb71014140915467ecd359684b2dc358024ca750609591aa731a0b309c7fb3cab5cd0836ad3992aa0a24da431f43b68883ea5651d548feb6bd3c8e16376e6e426f91f84c58232103322f35c7819267e721335948d385fae5be66e7ba8c748ac15467dcca0693692dac".HexToBytes());
- Assert.AreEqual(json.ToString(), ((JObject)result).ToString());
- }
-
- [TestMethod]
- public void TestSubmitBlock()
- {
- JObject json = true;
- JObject response = CreateResponse(1);
- response["result"] = json;
- MockResponse(response.ToString());
-
- var result = rpc.SubmitBlock("03febccf81ac85e3d795bc5cbd4e84e907812aa3".HexToBytes());
- Assert.AreEqual(json.ToString(), ((JObject)result).ToString());
- }
-
- [TestMethod]
- public void TestValidateAddress()
- {
- JObject json = new JObject();
- json["address"] = "AQVh2pG732YvtNaxEGkQUei3YA4cvo7d2i";
- json["isvalid"] = false;
- JObject response = CreateResponse(1);
- response["result"] = json;
- MockResponse(response.ToString());
-
- var result = rpc.ValidateAddress("AQVh2pG732YvtNaxEGkQUei3YA4cvo7d2i");
- Assert.AreEqual(json.ToString(), result.ToJson().ToString());
- }
-
- [TestMethod]
- public void TestConstructorByUrlAndDispose()
- {
- //dummy url for test
- var client = new RpcClient("http://www.xxx.yyy");
- Action action = () => client.Dispose();
- action.Should().NotThrow();
- }
- }
-}
diff --git a/tests/neo.UnitTests/Network/RPC/UT_RpcServer.cs b/tests/neo.UnitTests/Network/RPC/UT_RpcServer.cs
deleted file mode 100644
index cfdfe7fbd8..0000000000
--- a/tests/neo.UnitTests/Network/RPC/UT_RpcServer.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-using FluentAssertions;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Neo.Network.RPC;
-using System;
-using System.Net;
-
-namespace Neo.UnitTests.Network.RPC
-{
- [TestClass]
- public class UT_RpcServer
- {
- private RpcServer server;
-
- [TestInitialize]
- public void Setup()
- {
- server = new RpcServer(TestBlockchain.TheNeoSystem);
- }
-
- [TestCleanup]
- public void TestDispose()
- {
- server.Dispose();
- }
-
- [TestMethod]
- public void TestWallet()
- {
- var wallet = TestUtils.GenerateTestWallet();
- server.Wallet = wallet;
- server.Wallet.Should().Be(wallet);
- }
-
- [TestMethod]
- public void TestMaxGasInvoke()
- {
- server.MaxGasInvoke.Should().Be(0);
- }
-
- [TestMethod]
- public void TestStart()
- {
- Action action = () => server.Start(IPAddress.Parse("127.0.0.1"), 8999);
- action.Should().NotThrow();
- }
- }
-}
diff --git a/tests/neo.UnitTests/Network/RPC/UT_TransactionManager.cs b/tests/neo.UnitTests/Network/RPC/UT_TransactionManager.cs
deleted file mode 100644
index 6fb69800cb..0000000000
--- a/tests/neo.UnitTests/Network/RPC/UT_TransactionManager.cs
+++ /dev/null
@@ -1,193 +0,0 @@
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Moq;
-using Neo.Cryptography;
-using Neo.IO;
-using Neo.IO.Json;
-using Neo.Ledger;
-using Neo.Network.P2P;
-using Neo.Network.P2P.Payloads;
-using Neo.Network.RPC;
-using Neo.Network.RPC.Models;
-using Neo.SmartContract;
-using Neo.SmartContract.Native;
-using Neo.VM;
-using Neo.Wallets;
-using System;
-using System.Linq;
-using System.Numerics;
-
-namespace Neo.UnitTests.Network.RPC
-{
- [TestClass]
- public class UT_TransactionManager
- {
- TransactionManager txManager;
- Mock rpcClientMock;
- KeyPair keyPair1;
- KeyPair keyPair2;
- UInt160 sender;
-
- [TestInitialize]
- public void TestSetup()
- {
- keyPair1 = new KeyPair(Wallet.GetPrivateKeyFromWIF("KyXwTh1hB76RRMquSvnxZrJzQx7h9nQP2PCRL38v6VDb5ip3nf1p"));
- keyPair2 = new KeyPair(Wallet.GetPrivateKeyFromWIF("L2LGkrwiNmUAnWYb1XGd5mv7v2eDf6P4F3gHyXSrNJJR4ArmBp7Q"));
- sender = Contract.CreateSignatureRedeemScript(keyPair1.PublicKey).ToScriptHash();
- rpcClientMock = MockRpcClient(sender, new byte[1]);
- }
-
- public static Mock MockRpcClient(UInt160 sender, byte[] script)
- {
- var mockRpc = new Mock(MockBehavior.Strict, "http://seed1.neo.org:10331");
-
- // MockHeight
- mockRpc.Setup(p => p.RpcSend("getblockcount")).Returns(100).Verifiable();
-
- // MockGasBalance
- byte[] balanceScript = NativeContract.GAS.Hash.MakeScript("balanceOf", sender);
- var balanceResult = new ContractParameter() { Type = ContractParameterType.Integer, Value = BigInteger.Parse("10000000000000000") };
-
- MockInvokeScript(mockRpc, balanceScript, balanceResult);
-
- // MockFeePerByte
- byte[] policyScript = NativeContract.Policy.Hash.MakeScript("getFeePerByte");
- var policyResult = new ContractParameter() { Type = ContractParameterType.Integer, Value = BigInteger.Parse("1000") };
-
- MockInvokeScript(mockRpc, policyScript, policyResult);
-
- // MockGasConsumed
- var result = new ContractParameter();
- MockInvokeScript(mockRpc, script, result);
-
- return mockRpc;
- }
-
- public static void MockInvokeScript(Mock mockClient, byte[] script, params ContractParameter[] parameters)
- {
- var result = new RpcInvokeResult()
- {
- Stack = parameters,
- GasConsumed = "100",
- Script = script.ToHexString(),
- State = ""
- };
-
- mockClient.Setup(p => p.RpcSend("invokescript", It.Is(j => j[0].AsString() == script.ToHexString())))
- .Returns(result.ToJson())
- .Verifiable();
- }
-
- [TestMethod]
- public void TestMakeTransaction()
- {
- txManager = new TransactionManager(rpcClientMock.Object, sender);
-
- TransactionAttribute[] attributes = new TransactionAttribute[1]
- {
- new TransactionAttribute
- {
- Usage = TransactionAttributeUsage.Url,
- Data = "53616d706c6555726c".HexToBytes() // "SampleUrl"
- }
- };
-
- byte[] script = new byte[1];
- txManager.MakeTransaction(script, attributes, null, 60000);
-
- var tx = txManager.Tx;
- Assert.AreEqual("53616d706c6555726c", tx.Attributes[0].Data.ToHexString());
- Assert.AreEqual(0, tx.SystemFee % (long)NativeContract.GAS.Factor);
- Assert.AreEqual(60000, tx.NetworkFee);
- }
-
- [TestMethod]
- public void TestSign()
- {
- txManager = new TransactionManager(rpcClientMock.Object, sender);
-
- TransactionAttribute[] attributes = new TransactionAttribute[1]
- {
- new TransactionAttribute
- {
- Usage = TransactionAttributeUsage.Url,
- Data = "53616d706c6555726c".HexToBytes() // "SampleUrl"
- }
- };
-
- byte[] script = new byte[1];
- txManager.MakeTransaction(script, attributes)
- .AddSignature(keyPair1)
- .Sign();
-
- // get signature from Witnesses
- var tx = txManager.Tx;
- byte[] signature = tx.Witnesses[0].InvocationScript.Skip(1).ToArray();
-
- Assert.IsTrue(Crypto.VerifySignature(tx.GetHashData(), signature, keyPair1.PublicKey.EncodePoint(false).Skip(1).ToArray()));
-
- // duplicate sign should not add new witness
- txManager.AddSignature(keyPair1).Sign();
- Assert.AreEqual(1, txManager.Tx.Witnesses.Length);
-
- // throw exception when the KeyPair is wrong
- Assert.ThrowsException(() => txManager.AddSignature(keyPair2));
- }
-
- [TestMethod]
- public void TestSignMulti()
- {
- txManager = new TransactionManager(rpcClientMock.Object, sender);
-
- var multiContract = Contract.CreateMultiSigContract(2, keyPair1.PublicKey, keyPair2.PublicKey);
-
- // Cosigner needs multi signature
- Cosigner[] cosigners = new Cosigner[1]
- {
- new Cosigner
- {
- Account = multiContract.ScriptHash,
- Scopes = WitnessScope.Global
- }
- };
-
- byte[] script = new byte[1];
- txManager.MakeTransaction(script, null, cosigners, 0_10000000)
- .AddMultiSig(keyPair1, 2, keyPair1.PublicKey, keyPair2.PublicKey)
- .AddMultiSig(keyPair2, 2, keyPair1.PublicKey, keyPair2.PublicKey)
- .AddSignature(keyPair1)
- .Sign();
-
- var snapshot = Blockchain.Singleton.GetSnapshot();
-
- var tx = txManager.Tx;
- Assert.IsTrue(tx.VerifyWitnesses(snapshot, tx.NetworkFee));
- }
-
- [TestMethod]
- public void TestAddWitness()
- {
- txManager = new TransactionManager(rpcClientMock.Object, sender);
-
- // Cosigner as contract scripthash
- Cosigner[] cosigners = new Cosigner[1]
- {
- new Cosigner
- {
- Account = UInt160.Zero,
- Scopes = WitnessScope.Global
- }
- };
-
- byte[] script = new byte[1];
- txManager.MakeTransaction(script, null, cosigners, 0_10000000);
- txManager.AddWitness(UInt160.Zero);
- txManager.AddSignature(keyPair1);
- txManager.Sign();
-
- var tx = txManager.Tx;
- Assert.AreEqual(2, tx.Witnesses.Length);
- Assert.AreEqual(0, tx.Witnesses[0].VerificationScript.Length);
- Assert.AreEqual(0, tx.Witnesses[0].InvocationScript.Length);
- }
- }
-}
diff --git a/tests/neo.UnitTests/Network/RPC/UT_WalletAPI.cs b/tests/neo.UnitTests/Network/RPC/UT_WalletAPI.cs
deleted file mode 100644
index bba6a787e1..0000000000
--- a/tests/neo.UnitTests/Network/RPC/UT_WalletAPI.cs
+++ /dev/null
@@ -1,116 +0,0 @@
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Moq;
-using Neo.IO.Json;
-using Neo.Network.P2P.Payloads;
-using Neo.Network.RPC;
-using Neo.Network.RPC.Models;
-using Neo.SmartContract;
-using Neo.SmartContract.Native;
-using Neo.VM;
-using Neo.Wallets;
-using System.Numerics;
-
-namespace Neo.UnitTests.Network.RPC
-{
- [TestClass]
- public class UT_WalletAPI
- {
- Mock rpcClientMock;
- KeyPair keyPair1;
- string address1;
- UInt160 sender;
- WalletAPI walletAPI;
-
- [TestInitialize]
- public void TestSetup()
- {
- keyPair1 = new KeyPair(Wallet.GetPrivateKeyFromWIF("KyXwTh1hB76RRMquSvnxZrJzQx7h9nQP2PCRL38v6VDb5ip3nf1p"));
- sender = Contract.CreateSignatureRedeemScript(keyPair1.PublicKey).ToScriptHash();
- address1 = Neo.Wallets.Helper.ToAddress(sender);
- rpcClientMock = UT_TransactionManager.MockRpcClient(sender, new byte[0]);
- walletAPI = new WalletAPI(rpcClientMock.Object);
- }
-
- [TestMethod]
- public void TestGetUnclaimedGas()
- {
- byte[] testScript = NativeContract.NEO.Hash.MakeScript("unclaimedGas", sender, 99);
- UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1_10000000) });
-
- var balance = walletAPI.GetUnclaimedGas(address1);
- Assert.AreEqual(1.1m, balance);
- }
-
- [TestMethod]
- public void TestGetNeoBalance()
- {
- byte[] testScript = NativeContract.NEO.Hash.MakeScript("balanceOf", sender);
- UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1_00000000) });
-
- var balance = walletAPI.GetNeoBalance(address1);
- Assert.AreEqual(1_00000000u, balance);
- }
-
- [TestMethod]
- public void TestGetGasBalance()
- {
- byte[] testScript = NativeContract.GAS.Hash.MakeScript("balanceOf", sender);
- UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1_10000000) });
-
- var balance = walletAPI.GetGasBalance(address1);
- Assert.AreEqual(1.1m, balance);
- }
-
- [TestMethod]
- public void TestGetTokenBalance()
- {
- byte[] testScript = UInt160.Zero.MakeScript("balanceOf", sender);
- UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1_10000000) });
-
- var balance = walletAPI.GetTokenBalance(UInt160.Zero.ToString(), address1);
- Assert.AreEqual(1_10000000, balance);
- }
-
- [TestMethod]
- public void TestClaimGas()
- {
- byte[] balanceScript = NativeContract.NEO.Hash.MakeScript("balanceOf", sender);
- UT_TransactionManager.MockInvokeScript(rpcClientMock, balanceScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1_00000000) });
-
- byte[] testScript = NativeContract.NEO.Hash.MakeScript("transfer", sender, sender, new BigInteger(1_00000000));
- UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1_10000000) });
-
- rpcClientMock.Setup(p => p.RpcSend("sendrawtransaction", It.IsAny())).Returns(true);
-
- var tranaction = walletAPI.ClaimGas(keyPair1.Export());
- Assert.AreEqual(testScript.ToHexString(), tranaction.Script.ToHexString());
- }
-
- [TestMethod]
- public void TestTransfer()
- {
- byte[] decimalsScript = NativeContract.GAS.Hash.MakeScript("decimals");
- UT_TransactionManager.MockInvokeScript(rpcClientMock, decimalsScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(8) });
-
- byte[] testScript = NativeContract.GAS.Hash.MakeScript("transfer", sender, UInt160.Zero, NativeContract.GAS.Factor * 100);
- UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1_10000000) });
-
- rpcClientMock.Setup(p => p.RpcSend("sendrawtransaction", It.IsAny())).Returns(true);
-
- var tranaction = walletAPI.Transfer(NativeContract.GAS.Hash.ToString(), keyPair1.Export(), UInt160.Zero.ToAddress(), 100, 1.1m);
- Assert.AreEqual(testScript.ToHexString(), tranaction.Script.ToHexString());
- }
-
- [TestMethod]
- public void TestWaitTransaction()
- {
- Transaction transaction = TestUtils.GetTransaction();
- rpcClientMock.Setup(p => p.RpcSend("getrawtransaction", It.Is(j => j[0].AsString() == transaction.Hash.ToString())))
- .Returns(new RpcTransaction { Transaction = transaction, VMState = VMState.HALT, BlockHash = UInt256.Zero, BlockTime = 100, Confirmations = 1 }.ToJson());
-
- var tx = walletAPI.WaitTransaction(transaction).Result;
- Assert.AreEqual(VMState.HALT, tx.VMState);
- Assert.AreEqual(UInt256.Zero, tx.BlockHash);
- }
- }
-}
diff --git a/tests/neo.UnitTests/UT_NeoSystem.cs b/tests/neo.UnitTests/UT_NeoSystem.cs
index 1ed00464fa..5e440d8374 100644
--- a/tests/neo.UnitTests/UT_NeoSystem.cs
+++ b/tests/neo.UnitTests/UT_NeoSystem.cs
@@ -25,8 +25,5 @@ public void Setup()
[TestMethod]
public void TestGetConsensus() => neoSystem.Consensus.Should().BeNull();
-
- [TestMethod]
- public void TestGetRpcServer() => neoSystem.RpcServer.Should().BeNull();
}
}
diff --git a/tests/neo.UnitTests/UT_Utility.cs b/tests/neo.UnitTests/UT_Utility.cs
deleted file mode 100644
index dd68da017c..0000000000
--- a/tests/neo.UnitTests/UT_Utility.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Neo.SmartContract;
-using Neo.Wallets;
-using System;
-
-namespace Neo.UnitTests
-{
- [TestClass]
- public class UT_Utility
- {
- private KeyPair keyPair;
- private UInt160 scriptHash;
-
- [TestInitialize]
- public void TestSetup()
- {
- keyPair = new KeyPair(Wallet.GetPrivateKeyFromWIF("KyXwTh1hB76RRMquSvnxZrJzQx7h9nQP2PCRL38v6VDb5ip3nf1p"));
- scriptHash = Contract.CreateSignatureRedeemScript(keyPair.PublicKey).ToScriptHash();
- }
-
- [TestMethod]
- public void TestGetKeyPair()
- {
- string nul = null;
- Assert.ThrowsException(() => Utility.GetKeyPair(nul));
-
- string wif = "KyXwTh1hB76RRMquSvnxZrJzQx7h9nQP2PCRL38v6VDb5ip3nf1p";
- var result = Utility.GetKeyPair(wif);
- Assert.AreEqual(keyPair, result);
-
- string privateKey = keyPair.PrivateKey.ToHexString();
- result = Utility.GetKeyPair(privateKey);
- Assert.AreEqual(keyPair, result);
- }
-
- [TestMethod]
- public void TestGetScriptHash()
- {
- string nul = null;
- Assert.ThrowsException(() => Utility.GetScriptHash(nul));
-
- string addr = scriptHash.ToAddress();
- var result = Utility.GetScriptHash(addr);
- Assert.AreEqual(scriptHash, result);
-
- string hash = scriptHash.ToString();
- result = Utility.GetScriptHash(hash);
- Assert.AreEqual(scriptHash, result);
-
- string publicKey = keyPair.PublicKey.ToString();
- result = Utility.GetScriptHash(publicKey);
- Assert.AreEqual(scriptHash, result);
- }
- }
-}