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()); } } }