diff --git a/src/neo/SmartContract/Manifest/ContractAbi.cs b/src/neo/SmartContract/Manifest/ContractAbi.cs
index 1d27ae4f1b..e7fb4a5272 100644
--- a/src/neo/SmartContract/Manifest/ContractAbi.cs
+++ b/src/neo/SmartContract/Manifest/ContractAbi.cs
@@ -28,6 +28,17 @@ public class ContractAbi
///
public ContractEventDescriptor[] Events { get; set; }
+ public ContractAbi Clone()
+ {
+ return new ContractAbi
+ {
+ Hash = Hash,
+ EntryPoint = EntryPoint.Clone(),
+ Methods = Methods.Select(p => p.Clone()).ToArray(),
+ Events = Events.Select(p => p.Clone()).ToArray()
+ };
+ }
+
///
/// Parse ContractAbi from json
///
diff --git a/src/neo/SmartContract/Manifest/ContractEventDescriptor.cs b/src/neo/SmartContract/Manifest/ContractEventDescriptor.cs
index 00748f9b09..0aa11a3eea 100644
--- a/src/neo/SmartContract/Manifest/ContractEventDescriptor.cs
+++ b/src/neo/SmartContract/Manifest/ContractEventDescriptor.cs
@@ -15,6 +15,15 @@ public class ContractEventDescriptor
///
public ContractParameterDefinition[] Parameters { get; set; }
+ public ContractEventDescriptor Clone()
+ {
+ return new ContractEventDescriptor
+ {
+ Name = Name,
+ Parameters = Parameters.Select(p => p.Clone()).ToArray()
+ };
+ }
+
///
/// Parse ContractMethodDescription from json
///
diff --git a/src/neo/SmartContract/Manifest/ContractGroup.cs b/src/neo/SmartContract/Manifest/ContractGroup.cs
index b138427cfa..c10bcba283 100644
--- a/src/neo/SmartContract/Manifest/ContractGroup.cs
+++ b/src/neo/SmartContract/Manifest/ContractGroup.cs
@@ -22,6 +22,15 @@ public class ContractGroup
///
public byte[] Signature { get; set; }
+ public ContractGroup Clone()
+ {
+ return new ContractGroup
+ {
+ PubKey = PubKey,
+ Signature = Signature
+ };
+ }
+
///
/// Parse ContractManifestGroup from json
///
diff --git a/src/neo/SmartContract/Manifest/ContractManifest.cs b/src/neo/SmartContract/Manifest/ContractManifest.cs
index ebbcd61f2c..c376af7d00 100644
--- a/src/neo/SmartContract/Manifest/ContractManifest.cs
+++ b/src/neo/SmartContract/Manifest/ContractManifest.cs
@@ -136,7 +136,18 @@ public JObject ToJson()
/// Clone
///
/// Return a copy of this object
- public ContractManifest Clone() => FromJson(ToJson());
+ public ContractManifest Clone()
+ {
+ return new ContractManifest
+ {
+ Groups = Groups.Select(p => p.Clone()).ToArray(),
+ Features = Features,
+ Abi = Abi.Clone(),
+ Permissions = Permissions.Select(p => p.Clone()).ToArray(),
+ Trusts = Trusts,
+ SafeMethods = SafeMethods
+ };
+ }
///
/// String representation
diff --git a/src/neo/SmartContract/Manifest/ContractMethodDescriptor.cs b/src/neo/SmartContract/Manifest/ContractMethodDescriptor.cs
index 476ec546a6..6596f86dd6 100644
--- a/src/neo/SmartContract/Manifest/ContractMethodDescriptor.cs
+++ b/src/neo/SmartContract/Manifest/ContractMethodDescriptor.cs
@@ -34,6 +34,16 @@ public class ContractMethodDescriptor : ContractEventDescriptor
///
public ContractParameterType ReturnType { get; set; }
+ public new ContractMethodDescriptor Clone()
+ {
+ return new ContractMethodDescriptor
+ {
+ Name = Name,
+ Parameters = Parameters.Select(p => p.Clone()).ToArray(),
+ ReturnType = ReturnType
+ };
+ }
+
///
/// Parse ContractMethodDescription from json
///
diff --git a/src/neo/SmartContract/Manifest/ContractParameterDefinition.cs b/src/neo/SmartContract/Manifest/ContractParameterDefinition.cs
index 3f184d6ba8..d5b95f5245 100644
--- a/src/neo/SmartContract/Manifest/ContractParameterDefinition.cs
+++ b/src/neo/SmartContract/Manifest/ContractParameterDefinition.cs
@@ -16,6 +16,15 @@ public class ContractParameterDefinition
///
public ContractParameterType Type { get; set; }
+ public ContractParameterDefinition Clone()
+ {
+ return new ContractParameterDefinition
+ {
+ Name = Name,
+ Type = Type
+ };
+ }
+
///
/// Parse ContractParameterDefinition from json
///
diff --git a/src/neo/SmartContract/Manifest/ContractPermission.cs b/src/neo/SmartContract/Manifest/ContractPermission.cs
index 890de9d200..ab86157786 100644
--- a/src/neo/SmartContract/Manifest/ContractPermission.cs
+++ b/src/neo/SmartContract/Manifest/ContractPermission.cs
@@ -27,6 +27,15 @@ public class ContractPermission
Methods = WildCardContainer.CreateWildcard()
};
+ public ContractPermission Clone()
+ {
+ return new ContractPermission
+ {
+ Contract = Contract,
+ Methods = Methods
+ };
+ }
+
///
/// Parse ContractPermission from json
///
diff --git a/tests/neo.UnitTests/SmartContract/Manifest/UT_ContractManifest.cs b/tests/neo.UnitTests/SmartContract/Manifest/UT_ContractManifest.cs
index 5c2a99ff56..2416c60bd5 100644
--- a/tests/neo.UnitTests/SmartContract/Manifest/UT_ContractManifest.cs
+++ b/tests/neo.UnitTests/SmartContract/Manifest/UT_ContractManifest.cs
@@ -137,7 +137,7 @@ public void TestClone()
var expected = ContractManifest.CreateDefault(UInt160.Zero);
expected.SafeMethods = WildCardContainer.Create(new string[] { "AAA" });
var actual = expected.Clone();
- Assert.AreEqual(actual.SafeMethods.ToString(), expected.SafeMethods.ToString());
+ Assert.AreEqual(actual.ToString(), expected.ToString());
}
}
}