Skip to content

Instantly share code, notes, and snippets.

View ItayPodhajcer's full-sized avatar

Itay Podhajcer ItayPodhajcer

View GitHub Profile
@ItayPodhajcer
ItayPodhajcer / EthereumEventTriggerAttribute.cs
Last active January 16, 2020 08:42
ethereum-event-azure-function-trigger/EthereumEventTriggerAttribute
[Binding]
[AttributeUsage(AttributeTargets.Parameter)]
public sealed class EthereumEventTriggerAttribute : Attribute
{
private const string DefaultUrl = "http://localhost:8545/";
public EthereumEventTriggerAttribute(string abi, string contractAddress, string eventName, string url = DefaultUrl)
{
Url = url;
Abi = abi;
@ItayPodhajcer
ItayPodhajcer / EthereumEventListener.cs
Last active January 16, 2020 08:42
ethereum-event-azure-function-trigger/EthereumEventListener.StartAsync
public async Task StartAsync(CancellationToken cancellationToken)
{
_cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
var web3 = new Web3(_attribute.Url);
var contract = web3.Eth.GetContract(_attribute.Abi, _attribute.ContractAddress);
_event = contract.GetEvent(_attribute.EventName);
_filter = await _event.CreateFilterAsync();
@ItayPodhajcer
ItayPodhajcer / EthereumEventListener.cs
Last active January 16, 2020 08:42
ethereum-event-azure-function-trigger/EthereumEventListener.ListenAsync
private async void ListenAsync(CancellationToken cancellationToken)
{
await Task.Run(async () =>
{
while (!cancellationToken.IsCancellationRequested)
{
var eventsData = await _event.GetFilterChangeDefault(_filter);
ProcessEvents(eventsData, cancellationToken);
await Task.Delay(EventPollingDelay);
@ItayPodhajcer
ItayPodhajcer / EthereumEventListener.cs
Last active January 16, 2020 08:41
ethereum-event-azure-function-trigger/EthereumEventListener.ProcessEvents
private void ProcessEvents(List<EventLog<List<ParameterOutput>>> eventsData, CancellationToken cancellationToken)
{
eventsData
.Select(eventData => ExtractEventData(eventData.Event, eventData.Log))
.ToList()
.ForEach(ethereumEventData => _executor.TryExecuteAsync(new TriggeredFunctionData { TriggerValue = ethereumEventData }, cancellationToken));
}
@ItayPodhajcer
ItayPodhajcer / EthereumEventListener.cs
Last active January 16, 2020 08:41
ethereum-event-azure-function-trigger/EthereumEventListener.ExtractEventData
private EthereumEventData ExtractEventData(List<ParameterOutput> eventParams, FilterLog log)
{
Dictionary<string, string> values = eventParams.ToDictionary(eventParam => eventParam.Parameter.Name, eventParam => eventParam.Result.ToString());
return new EthereumEventData
{
Values = values,
BlockNumber = log.BlockNumber
};
}
@ItayPodhajcer
ItayPodhajcer / EthereumEventTriggerBinding.cs
Last active January 16, 2020 08:40
ethereum-event-azure-function-trigger/EthereumEventTriggerBinding
internal class EthereumEventTriggerBinding : ITriggerBinding
{
private readonly EthereumEventTriggerAttribute _attribute;
public EthereumEventTriggerBinding(EthereumEventTriggerAttribute attribute)
{
_attribute = attribute;
}
public Type TriggerValueType => typeof(EthereumEventData);
@ItayPodhajcer
ItayPodhajcer / EthereumEventTriggerBindingProvider.cs
Last active January 16, 2020 08:40
ethereum-event-azure-function-trigger/EthereumEventTriggerBindingProvider
public class EthereumEventTriggerBindingProvider : ITriggerBindingProvider
{
public Task<ITriggerBinding> TryCreateAsync(TriggerBindingProviderContext context)
{
var result = Task.FromResult<ITriggerBinding>(default);
var attribute = context.Parameter.GetCustomAttribute<EthereumEventTriggerAttribute>(false);
if (attribute != null)
{
result = Task.FromResult<ITriggerBinding>(new EthereumEventTriggerBinding(attribute));
@ItayPodhajcer
ItayPodhajcer / EtheremEventConfigProvider.cs
Last active January 16, 2020 08:40
ethereum-event-azure-function-trigger/EtheremEventConfigProvider
[Extension("EthereumEventTrigger")]
public class EtheremEventConfigProvider : IExtensionConfigProvider
{
public void Initialize(ExtensionConfigContext context)
{
context
.AddBindingRule<EthereumEventTriggerAttribute>()
.BindToTrigger<EthereumEventData>(new EthereumEventTriggerBindingProvider());
}
}
@ItayPodhajcer
ItayPodhajcer / EthereumEventListener.cs
Last active January 16, 2020 08:39
ethereum-event-azure-function-trigger/EthereumEventListener
public class EthereumEventListener : IListener
{
private const int EventPollingDelay = 1000;
private readonly ITriggeredFunctionExecutor _executor;
private readonly EthereumEventTriggerAttribute _attribute;
private CancellationTokenSource _cts = null;
private Event _event = null;
private HexBigInteger _filter = null;
@ItayPodhajcer
ItayPodhajcer / EthereumEventTriggeredFunction.cs
Last active January 16, 2020 08:39
ethereum-event-azure-function-trigger/EthereumEventTriggeredFunction
public static class EthereumEventTriggeredFunction
{
private const string Abi = "";
private const string ContractAddress = "";
private const string EventName = "";
[FunctionName(nameof(EthereumEventTriggeredFunction))]
public static void Run([EthereumEventTrigger(abi: Abi, contractAddress: ContractAddress, eventName: EventName)]EthereumEventData eventData, ILogger logger)
{
string logMessage = $"Event data:\nBlock number: {eventData.BlockNumber}\n{string.Join('\n', eventData.Values.Select(value => $"{value.Key}: {value.Value}"))}";