Skip to content

Commit 24546cd

Browse files
Mud further refactoring, deployment, system management and registration, table registration, test fixed mostly
1 parent 8c493f4 commit 24546cd

File tree

59 files changed

+1040
-388
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+1040
-388
lines changed

src/Nethereum.ABI/FunctionEncoding/ByteCodeLibrary.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Nethereum.Util;
2+
using System.IO;
23
namespace Nethereum.ABI.FunctionEncoding
34
{
45
public class ByteCodeLibrary
@@ -12,12 +13,21 @@ public class ByteCodeLibrary
1213
/// <returns></returns>
1314
public static ByteCodeLibrary CreateFromPath(string path, string libraryName, string libraryAddress)
1415
{
15-
path = path.Replace("\\", "/");
16-
var placeHolderKey = Sha3Keccack.Current.CalculateHash(path + ":" + libraryName).Substring(0, 34);
17-
return new ByteCodeLibrary() { PlaceholderKey = placeHolderKey, Address = libraryAddress };
16+
var library = new ByteCodeLibrary() { Address = libraryAddress, Path = path, LibraryName = libraryName };
17+
library.CalculatePlaceHolderKey();
18+
return library;
1819
}
1920

2021
public string PlaceholderKey { get; set; }
2122
public string Address { get; set; }
23+
public string LibraryName { get; set; }
24+
public string Path { get; set; }
25+
public string ByteCode { get; set; }
26+
27+
public void CalculatePlaceHolderKey()
28+
{
29+
var path = Path.Replace("\\", "/");
30+
PlaceholderKey = Sha3Keccack.Current.CalculateHash(path + ":" + LibraryName).Substring(0, 34);
31+
}
2232
}
2333
}

src/Nethereum.ABI/FunctionEncoding/ByteCodeLibraryLinker.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@ private static string CreatePlaceholder(string key)
2525
return ByteCodeConstants.LIBRARY_PLACEHOLDER_PREFIX + key + ByteCodeConstants.LIBRARY_PLACEHOLDER_SUFFIX;
2626
}
2727

28-
public string LinkByteCode(string byteCode, params ByteCodeLibrary[] byteCodeLibraries)
28+
public static string LinkByteCode(string byteCode, params ByteCodeLibrary[] byteCodeLibraries)
2929
{
30+
if(byteCodeLibraries == null || byteCodeLibraries.Length == 0) return byteCode;
3031
foreach (var byteCodeLibrary in byteCodeLibraries)
3132
{
3233
var placeholder = CreatePlaceholder(byteCodeLibrary.PlaceholderKey);

src/Nethereum.Contracts/ContractDeploymentMessage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public ContractDeploymentMessage(string byteCode)
1414
/// <summary>
1515
/// ByteCode (Compiled code) used for deployment
1616
/// </summary>
17-
public string ByteCode { get; internal set; }
17+
public string ByteCode { get; set; }
1818

1919
}
2020
}

src/Nethereum.Contracts/Create2Deployment/Create2DeterministicDeploymentProxyDeployment.cs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,11 @@ public static BigInteger CalculateVForChainId(BigInteger chainId)
4646

4747
public static byte[] CalculateVForChainIdAsBytes(BigInteger chainId)
4848
{
49-
return CalculateVForChainId(chainId).ToBytesForRLPEncoding();
49+
return CalculateVForChainId(chainId).ToBytesForRLPEncoding();
5050
}
5151
public static readonly byte[] DefaultR = "2222222222222222222222222222222222222222222222222222222222222222".HexToByteArray();
5252
public static readonly byte[] DefaultS = "2222222222222222222222222222222222222222222222222222222222222222".HexToByteArray();
53-
53+
5454
public const string ByteCode = "604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3";
5555
public const string RuntimeByteCode = "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3";
5656
public string RawTransaction { get; set; }
@@ -70,4 +70,18 @@ public static Create2DeterministicDeploymentProxyDeployment GetDefaultNoneEIP155
7070
};
7171
}
7272
}
73+
74+
public class Create2ContractDeploymentTransactionResult
75+
{
76+
public bool AlreadyDeployed { get; set; }
77+
public string TransactionHash { get; set; }
78+
public string Address { get; set; }
79+
}
80+
81+
public class Create2ContractDeploymentTransactionReceiptResult
82+
{
83+
public bool AlreadyDeployed { get; set; }
84+
public string Address { get; set; }
85+
public TransactionReceipt TransactionReceipt { get; set; }
86+
}
7387
}

src/Nethereum.Contracts/Create2Deployment/Create2DeterministicDeploymentProxyService.cs

Lines changed: 91 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
using Nethereum.Contracts.MessageEncodingServices;
1414

1515
using System.Diagnostics;
16+
using Nethereum.ABI.FunctionEncoding;
17+
using System.Threading;
1618

1719
namespace Nethereum.Contracts.Create2Deployment
1820
{
@@ -140,14 +142,8 @@ public async Task<string> DeployProxyAndGetContractAddressAsync(Create2Determini
140142
if (await HasProxyBeenDeployedAsync(deployment.Address)) return deployment.Address;
141143

142144
await ValidateAndSendEnoughBalanceForProxyDeploymentAndWaitForReceiptAsync(deployment);
143-
var currentLegacySetting = _ethApiContractService.TransactionManager.UseLegacyAsDefault;
144-
145-
_ethApiContractService.TransactionManager.UseLegacyAsDefault = true;
146-
147145
var txn = await _ethApiContractService.Transactions.SendRawTransaction.SendRequestAsync(deployment.RawTransaction);
148146

149-
_ethApiContractService.TransactionManager.UseLegacyAsDefault = currentLegacySetting;
150-
151147
var receipt = await _ethApiContractService.TransactionManager.TransactionReceiptService.PollForReceiptAsync(txn);
152148
var deployed = await HasProxyBeenDeployedAsync(deployment.Address);
153149
if(!deployed) throw new Exception("Proxy not deployed");
@@ -172,49 +168,57 @@ public async Task ValidateAndSendEnoughBalanceForProxyDeploymentAndWaitForReceip
172168
}
173169
}
174170

175-
public string CalculateCreate2Address<TDeploymentMessage>(TDeploymentMessage deploymentMessage, string deployerProxyAddress, string salt) where TDeploymentMessage : ContractDeploymentMessage
171+
public string CalculateCreate2Address<TDeploymentMessage>(TDeploymentMessage deploymentMessage, string deployerProxyAddress, string salt, params ByteCodeLibrary[] byteCodeLibraries) where TDeploymentMessage : ContractDeploymentMessage, new()
176172
{
177-
var deploymentEncodingService = new DeploymentMessageEncodingService<TDeploymentMessage>();
178-
var deploymentData = deploymentEncodingService.GetDeploymentData(deploymentMessage);
173+
return deploymentMessage.CalculateCreate2Address(deployerProxyAddress, salt, byteCodeLibraries);
174+
}
179175

180-
return CalculateCreate2Address(deployerProxyAddress, salt, deploymentData);
176+
public string CalculateCreate2Address<TDeploymentMessage>(TDeploymentMessage deploymentMessage, string deployerProxyAddress, string salt) where TDeploymentMessage : ContractDeploymentMessage, new()
177+
{
178+
return deploymentMessage.CalculateCreate2Address(deployerProxyAddress, salt);
181179
}
182180

183181
public string CalculateCreate2Address(string deployerProxyAddress, string salt, string contractByteCode)
184182
{
185183
return ContractUtils.CalculateCreate2Address(deployerProxyAddress, salt, contractByteCode);
186184
}
187185

188-
public async Task<bool> CheckContractAlreadyDeployedAsync(string deployerProxyAddress, string salt, string contractByteCode)
186+
public async Task<bool> HasContractAlreadyDeployedAsync(string deployerProxyAddress, string salt, string contractByteCode)
189187
{
190188
var create2Address = CalculateCreate2Address(deployerProxyAddress, salt, contractByteCode);
191189
var code = await _ethApiContractService.GetCode.SendRequestAsync(create2Address);
192190
return !string.IsNullOrEmpty(code?.RemoveHexPrefix());
193191
}
194192

195-
public async Task<bool> CheckContractAlreadyDeployedAsync<TDeploymentMessage>(TDeploymentMessage deploymentMessage, string deployerProxyAddress, string salt)
196-
where TDeploymentMessage : ContractDeploymentMessage
193+
public async Task<bool> HasContractAlreadyDeployedAsync<TDeploymentMessage>(TDeploymentMessage deploymentMessage, string deployerProxyAddress, string salt)
194+
where TDeploymentMessage : ContractDeploymentMessage, new()
197195
{
198196
var create2Address = CalculateCreate2Address(deploymentMessage, deployerProxyAddress, salt);
199197
var code = await _ethApiContractService.GetCode.SendRequestAsync(create2Address);
200198
return !string.IsNullOrEmpty(code?.RemoveHexPrefix());
201199
}
202200

203-
public async Task<bool> CheckContractAlreadyDeployedAsync(string address)
201+
public async Task<bool> HasContractAlreadyDeployedAsync(string address)
204202
{
205203
var code = await _ethApiContractService.GetCode.SendRequestAsync(address);
206204
return !string.IsNullOrEmpty(code?.RemoveHexPrefix());
207205
}
208206

209-
public async Task<string> DeployContractRequestAsync<TDeploymentMessage>(TDeploymentMessage deploymentMessage, string deployerProxyAddress, string salt)
210-
where TDeploymentMessage : ContractDeploymentMessage
207+
public async Task<Create2ContractDeploymentTransactionResult> DeployContractRequestAsync<TDeploymentMessage>(TDeploymentMessage deploymentMessage, string deployerProxyAddress, string salt, params ByteCodeLibrary[] byteCodeLibraries)
208+
where TDeploymentMessage : ContractDeploymentMessage, new()
211209
{
212-
if (await CheckContractAlreadyDeployedAsync(deploymentMessage, deployerProxyAddress, salt))
213-
throw new Exception("Contract already deployed");
210+
var address = CalculateCreate2Address(deploymentMessage, deployerProxyAddress, salt, byteCodeLibraries);
211+
if (await HasContractAlreadyDeployedAsync(address))
212+
{
213+
return new Create2ContractDeploymentTransactionResult()
214+
{
215+
Address = address,
216+
AlreadyDeployed = true
217+
};
218+
}
214219

215220
var deploymentEncodingService = new DeploymentMessageEncodingService<TDeploymentMessage>();
216-
var deploymentData = deploymentEncodingService.GetDeploymentData(deploymentMessage);
217-
221+
var deploymentData = deploymentEncodingService.GetDeploymentData(deploymentMessage, byteCodeLibraries);
218222

219223
var transactionInput = new TransactionInput()
220224
{
@@ -225,44 +229,88 @@ public async Task<string> DeployContractRequestAsync<TDeploymentMessage>(TDeploy
225229

226230
var gas = await _ethApiContractService.Transactions.EstimateGas.SendRequestAsync(transactionInput);
227231
transactionInput.Gas = gas;
228-
return await _ethApiContractService.TransactionManager.SendTransactionAsync(transactionInput);
232+
var txnHash = await _ethApiContractService.TransactionManager.SendTransactionAsync(transactionInput);
233+
return new Create2ContractDeploymentTransactionResult()
234+
{
235+
TransactionHash = txnHash,
236+
Address = address
237+
};
229238
}
230239

231-
public async Task<TransactionReceipt> DeployContractRequestAndWaitForReceiptAsync<TDeploymentMessage>(TDeploymentMessage deploymentMessage, string deployerProxyAddress, string salt)
232-
where TDeploymentMessage : ContractDeploymentMessage
240+
public async Task<Create2ContractDeploymentTransactionReceiptResult> DeployContractRequestAndWaitForReceiptAsync<TDeploymentMessage>(TDeploymentMessage deploymentMessage, string deployerProxyAddress, string salt, ByteCodeLibrary[] byteCodeLibraries = null, CancellationToken cancellationToken = default)
241+
where TDeploymentMessage : ContractDeploymentMessage, new()
233242
{
234-
var txnHash = await DeployContractRequestAsync(deploymentMessage, deployerProxyAddress, salt);
235-
var receipt = await _ethApiContractService.TransactionManager.TransactionReceiptService.PollForReceiptAsync(txnHash);
236-
if (await CheckContractAlreadyDeployedAsync(deploymentMessage, deployerProxyAddress, salt))
243+
var deploymentTransactionResult = await DeployContractRequestAsync(deploymentMessage, deployerProxyAddress, salt, byteCodeLibraries);
244+
if (deploymentTransactionResult.AlreadyDeployed)
245+
{
246+
return new Create2ContractDeploymentTransactionReceiptResult()
247+
{
248+
Address = deploymentTransactionResult.Address,
249+
AlreadyDeployed = true
250+
};
251+
}
252+
var receipt = await _ethApiContractService.TransactionManager.TransactionReceiptService.PollForReceiptAsync(deploymentTransactionResult.TransactionHash,cancellationToken);
253+
if (await HasContractAlreadyDeployedAsync(deploymentTransactionResult.Address))
237254
{
238-
return receipt;
255+
return new Create2ContractDeploymentTransactionReceiptResult()
256+
{
257+
Address = deploymentTransactionResult.Address,
258+
TransactionReceipt = receipt
259+
};
239260
}
240261
throw new Exception("Contract not deployed");
241262
}
242263

243-
public async Task<string> DeployContractRequestAsync(string deployerProxyAddress, string salt, string contractByteCode)
264+
public async Task<Create2ContractDeploymentTransactionResult> DeployContractRequestAsync(string deployerProxyAddress, string salt, string contractByteCode)
244265
{
245-
if (await CheckContractAlreadyDeployedAsync(deployerProxyAddress, salt, contractByteCode))
246-
throw new Exception("Contract already deployed");
247-
var transactionInput = new TransactionInput()
266+
var address = ContractUtils.CalculateCreate2Address(deployerProxyAddress, salt, contractByteCode);
267+
if (await HasContractAlreadyDeployedAsync(address))
248268
{
249-
From = _ethApiContractService.TransactionManager.Account.Address,
250-
Data = salt.EnsureHexPrefix() + contractByteCode.RemoveHexPrefix(),
251-
To = deployerProxyAddress
252-
};
269+
return new Create2ContractDeploymentTransactionResult()
270+
{
271+
Address = address,
272+
AlreadyDeployed = true
273+
};
274+
}
275+
else
276+
{
277+
var transactionInput = new TransactionInput()
278+
{
279+
From = _ethApiContractService.TransactionManager.Account.Address,
280+
Data = salt.EnsureHexPrefix() + contractByteCode.RemoveHexPrefix(),
281+
To = deployerProxyAddress
282+
};
253283

254-
var gas = await _ethApiContractService.Transactions.EstimateGas.SendRequestAsync(transactionInput);
255-
transactionInput.Gas = gas;
256-
return await _ethApiContractService.TransactionManager.SendTransactionAsync(transactionInput);
284+
var gas = await _ethApiContractService.Transactions.EstimateGas.SendRequestAsync(transactionInput);
285+
transactionInput.Gas = gas;
286+
var txnHash = await _ethApiContractService.TransactionManager.SendTransactionAsync(transactionInput);
287+
return new Create2ContractDeploymentTransactionResult()
288+
{
289+
TransactionHash = txnHash,
290+
Address = address
291+
};
292+
}
257293
}
258294

259-
public async Task<TransactionReceipt> DeployContractRequestAndWaitForReceiptAsync(string deployerProxyAddress, string salt, string contractByteCode)
295+
public async Task<Create2ContractDeploymentTransactionReceiptResult> DeployContractRequestAndWaitForReceiptAsync(string deployerProxyAddress, string salt, string contractByteCode, CancellationToken cancellationToken = default)
260296
{
261-
var txnHash = await DeployContractRequestAsync(deployerProxyAddress, salt, contractByteCode);
262-
var receipt = await _ethApiContractService.TransactionManager.TransactionReceiptService.PollForReceiptAsync(txnHash);
263-
if (await CheckContractAlreadyDeployedAsync(deployerProxyAddress, salt, contractByteCode))
297+
var deploymentTransactionResult = await DeployContractRequestAsync(deployerProxyAddress, salt, contractByteCode);
298+
if (deploymentTransactionResult.AlreadyDeployed)
299+
{
300+
return new Create2ContractDeploymentTransactionReceiptResult()
301+
{
302+
Address = deploymentTransactionResult.Address,
303+
AlreadyDeployed = true
304+
};
305+
}
306+
var receipt = await _ethApiContractService.TransactionManager.TransactionReceiptService.PollForReceiptAsync(deploymentTransactionResult.TransactionHash, cancellationToken);
307+
if (await HasContractAlreadyDeployedAsync(deploymentTransactionResult.Address))
264308
{
265-
return receipt;
309+
return new Create2ContractDeploymentTransactionReceiptResult()
310+
{
311+
Address = deploymentTransactionResult.Address,
312+
TransactionReceipt = receipt
313+
};
266314
}
267315
throw new Exception("Contract not deployed");
268316
}

0 commit comments

Comments
 (0)