2
0
mirror of synced 2025-01-14 10:34:26 +00:00

190 lines
6.7 KiB
C#
Raw Normal View History

2023-12-20 10:55:29 +01:00
using CodexContractsPlugin.Marketplace;
using GethPlugin;
2023-09-19 13:39:24 +02:00
using Logging;
2023-12-20 11:34:23 +01:00
using Nethereum.ABI;
using Nethereum.Hex.HexTypes;
2023-12-20 11:34:23 +01:00
using Nethereum.Util;
using NethereumWorkflow;
2024-04-13 09:19:20 +02:00
using NethereumWorkflow.BlockUtils;
2024-04-09 13:24:30 +02:00
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
2023-12-20 09:48:22 +01:00
using Utils;
2023-09-19 13:39:24 +02:00
namespace CodexContractsPlugin
2023-09-19 10:24:43 +02:00
{
public interface ICodexContracts
{
2023-09-20 10:13:29 +02:00
CodexContractsDeployment Deployment { get; }
2023-09-19 13:39:24 +02:00
bool IsDeployed();
2023-12-15 11:02:06 +01:00
string MintTestTokens(IHasEthAddress owner, TestToken testTokens);
string MintTestTokens(EthAddress ethAddress, TestToken testTokens);
2023-10-30 13:30:14 +01:00
TestToken GetTestTokenBalance(IHasEthAddress owner);
TestToken GetTestTokenBalance(EthAddress ethAddress);
2023-12-20 09:48:22 +01:00
2024-03-27 15:39:42 +01:00
Request[] GetStorageRequests(BlockInterval blockRange);
2024-01-26 17:29:57 -05:00
EthAddress? GetSlotHost(Request storageRequest, decimal slotIndex);
RequestState GetRequestState(Request request);
2024-03-27 15:39:42 +01:00
RequestFulfilledEventDTO[] GetRequestFulfilledEvents(BlockInterval blockRange);
RequestCancelledEventDTO[] GetRequestCancelledEvents(BlockInterval blockRange);
SlotFilledEventDTO[] GetSlotFilledEvents(BlockInterval blockRange);
SlotFreedEventDTO[] GetSlotFreedEvents(BlockInterval blockRange);
2023-09-19 10:24:43 +02:00
}
2024-04-09 13:24:30 +02:00
[JsonConverter(typeof(StringEnumConverter))]
public enum RequestState
{
New,
Started,
Cancelled,
Finished,
Failed
}
2023-09-19 10:24:43 +02:00
public class CodexContractsAccess : ICodexContracts
{
2023-09-19 13:39:24 +02:00
private readonly ILog log;
2023-10-30 13:30:14 +01:00
private readonly IGethNode gethNode;
2023-09-19 13:39:24 +02:00
2023-10-30 13:30:14 +01:00
public CodexContractsAccess(ILog log, IGethNode gethNode, CodexContractsDeployment deployment)
2023-09-19 10:24:43 +02:00
{
2023-09-19 13:39:24 +02:00
this.log = log;
2023-10-30 13:30:14 +01:00
this.gethNode = gethNode;
Deployment = deployment;
2023-09-19 10:24:43 +02:00
}
2023-09-20 10:13:29 +02:00
public CodexContractsDeployment Deployment { get; }
2023-09-19 13:39:24 +02:00
public bool IsDeployed()
{
2023-12-20 09:48:22 +01:00
return !string.IsNullOrEmpty(StartInteraction().GetTokenName(Deployment.TokenAddress));
}
2023-12-15 11:02:06 +01:00
public string MintTestTokens(IHasEthAddress owner, TestToken testTokens)
2023-09-19 16:22:07 +02:00
{
2023-12-15 11:02:06 +01:00
return MintTestTokens(owner.EthAddress, testTokens);
2023-09-19 16:22:07 +02:00
}
2023-12-15 11:02:06 +01:00
public string MintTestTokens(EthAddress ethAddress, TestToken testTokens)
2023-09-19 13:39:24 +02:00
{
return StartInteraction().MintTestTokens(ethAddress, testTokens.TstWei, Deployment.TokenAddress);
2023-09-19 13:39:24 +02:00
}
2023-10-30 13:30:14 +01:00
public TestToken GetTestTokenBalance(IHasEthAddress owner)
2023-09-19 16:22:07 +02:00
{
2023-10-30 13:30:14 +01:00
return GetTestTokenBalance(owner.EthAddress);
2023-09-19 16:22:07 +02:00
}
2023-10-30 13:30:14 +01:00
public TestToken GetTestTokenBalance(EthAddress ethAddress)
2023-09-19 13:39:24 +02:00
{
2023-12-20 09:48:22 +01:00
var balance = StartInteraction().GetBalance(Deployment.TokenAddress, ethAddress.Address);
return balance.TstWei();
2023-09-19 13:39:24 +02:00
}
2023-12-20 09:48:22 +01:00
2024-03-27 15:39:42 +01:00
public Request[] GetStorageRequests(BlockInterval blockRange)
2023-12-20 09:48:22 +01:00
{
2024-02-19 15:41:48 +01:00
var events = gethNode.GetEvents<StorageRequestedEventDTO>(Deployment.MarketplaceAddress, blockRange);
2023-12-20 10:55:29 +01:00
var i = StartInteraction();
return events
2023-12-20 11:34:23 +01:00
.Select(e =>
{
var requestEvent = i.GetRequest(Deployment.MarketplaceAddress, e.Event.RequestId);
var result = requestEvent.ReturnValue1;
2024-04-13 09:19:20 +02:00
result.Block = GetBlock(e.Log.BlockNumber.ToUlong());
result.RequestId = e.Event.RequestId;
return result;
2023-12-20 11:34:23 +01:00
})
2023-12-20 10:55:29 +01:00
.ToArray();
2023-12-20 09:48:22 +01:00
}
2024-03-27 15:39:42 +01:00
public RequestFulfilledEventDTO[] GetRequestFulfilledEvents(BlockInterval blockRange)
{
2024-02-19 15:41:48 +01:00
var events = gethNode.GetEvents<RequestFulfilledEventDTO>(Deployment.MarketplaceAddress, blockRange);
return events.Select(e =>
{
var result = e.Event;
2024-04-13 09:19:20 +02:00
result.Block = GetBlock(e.Log.BlockNumber.ToUlong());
return result;
}).ToArray();
}
2024-03-27 15:39:42 +01:00
public RequestCancelledEventDTO[] GetRequestCancelledEvents(BlockInterval blockRange)
{
2024-02-19 15:41:48 +01:00
var events = gethNode.GetEvents<RequestCancelledEventDTO>(Deployment.MarketplaceAddress, blockRange);
return events.Select(e =>
{
var result = e.Event;
2024-04-13 09:19:20 +02:00
result.Block = GetBlock(e.Log.BlockNumber.ToUlong());
return result;
}).ToArray();
}
2024-03-27 15:39:42 +01:00
public SlotFilledEventDTO[] GetSlotFilledEvents(BlockInterval blockRange)
{
2024-02-19 15:41:48 +01:00
var events = gethNode.GetEvents<SlotFilledEventDTO>(Deployment.MarketplaceAddress, blockRange);
return events.Select(e =>
{
var result = e.Event;
2024-04-13 09:19:20 +02:00
result.Block = GetBlock(e.Log.BlockNumber.ToUlong());
result.Host = GetEthAddressFromTransaction(e.Log.TransactionHash);
return result;
}).ToArray();
}
2024-03-27 15:39:42 +01:00
public SlotFreedEventDTO[] GetSlotFreedEvents(BlockInterval blockRange)
{
2024-02-19 15:41:48 +01:00
var events = gethNode.GetEvents<SlotFreedEventDTO>(Deployment.MarketplaceAddress, blockRange);
return events.Select(e =>
{
var result = e.Event;
2024-04-13 09:19:20 +02:00
result.Block = GetBlock(e.Log.BlockNumber.ToUlong());
return result;
}).ToArray();
}
2024-01-26 17:29:57 -05:00
public EthAddress? GetSlotHost(Request storageRequest, decimal slotIndex)
2023-12-20 11:34:23 +01:00
{
var encoder = new ABIEncode();
var encoded = encoder.GetABIEncoded(
new ABIValue("bytes32", storageRequest.RequestId),
new ABIValue("uint256", slotIndex.ToBig())
);
var hashed = Sha3Keccack.Current.CalculateHash(encoded);
var func = new GetHostFunction
{
SlotId = hashed
};
2024-01-26 17:29:57 -05:00
var address = gethNode.Call<GetHostFunction, string>(Deployment.MarketplaceAddress, func);
if (string.IsNullOrEmpty(address)) return null;
return new EthAddress(address);
2023-12-20 11:34:23 +01:00
}
public RequestState GetRequestState(Request request)
{
var func = new RequestStateFunction
{
RequestId = request.RequestId
};
return gethNode.Call<RequestStateFunction, RequestState>(Deployment.MarketplaceAddress, func);
}
2024-04-13 09:19:20 +02:00
private BlockTimeEntry GetBlock(ulong number)
{
return gethNode.GetBlockForNumber(number);
}
private EthAddress GetEthAddressFromTransaction(string transactionHash)
{
var transaction = gethNode.GetTransaction(transactionHash);
return new EthAddress(transaction.From);
}
2023-12-20 09:48:22 +01:00
private ContractInteractions StartInteraction()
{
return new ContractInteractions(log, gethNode);
}
2023-09-19 10:24:43 +02:00
}
}