Skip to content
Merged
73 changes: 73 additions & 0 deletions Assets/SequenceSDK/Indexer/Tests/ChainIndexerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -299,5 +299,78 @@ public async Task TestRequestDecodingErrorHandling(bool logError)

Assert.IsTrue(errorEventFired);
}

[TestCase]
public void TestSubscribeReceipts()
{
var indexer = new ChainIndexer(Chain.TestnetArbitrumSepolia);
var streamOptions = new WebRPCStreamOptions<SubscribeReceiptsReturn>(
OnSubscribeReceiptsMessageReceived,
OnWebRPCErrorReceived);

var filter = new TransactionFilter
{
contractAddress = "0x4ab3b16e9d3328f6d8025e71cefc64305ae4fe9c"
};

indexer.SubscribeReceipts(new SubscribeReceiptsArgs(filter), streamOptions);
}

[TestCase]
public void TestSubscribeEvents()
{
var indexer = new ChainIndexer(Chain.TestnetArbitrumSepolia);
var streamOptions = new WebRPCStreamOptions<SubscribeEventsReturn>(
OnSubscribeEventsMessageReceived,
OnWebRPCErrorReceived);

var eventFilter = new EventFilter
{
accounts = Array.Empty<string>(),
contractAddresses = new[] {"0x4ab3b16e9d3328f6d8025e71cefc64305ae4fe9c"},
tokenIDs = new[] {"0"},
events = new[] {"Transfer(address from, address to, uint256 value)"}
};

indexer.SubscribeEvents(new SubscribeEventsArgs(eventFilter), streamOptions);
}

[TestCase]
public void TestSubscribeBalanceUpdates()
{
var indexer = new ChainIndexer(Chain.TestnetArbitrumSepolia);
var streamOptions = new WebRPCStreamOptions<SubscribeBalanceUpdatesReturn>(
OnSubscribeEventsMessageReceived,
OnWebRPCErrorReceived);

var contractAddress = "0x4ab3b16e9d3328f6d8025e71cefc64305ae4fe9c";
indexer.SubscribeBalanceUpdates(new SubscribeBalanceUpdatesArgs(contractAddress), streamOptions);
}

[TestCase]
public void TestAbortStreams()
{
new ChainIndexer(Chain.TestnetArbitrumSepolia).AbortStreams();
}

private void OnSubscribeReceiptsMessageReceived(SubscribeReceiptsReturn @event)
{
Debug.Log($"Receipt Event Received - hash: {@event.receipt.txnHash}");
}

private void OnSubscribeEventsMessageReceived(SubscribeEventsReturn @event)
{
Debug.Log($"Contract Event Received - {@event.log.type} {@event.log.contractType}: {@event.log.txnHash}");
}

private void OnSubscribeEventsMessageReceived(SubscribeBalanceUpdatesReturn @event)
{
Debug.Log($"Balance Update Received - {@event.balance.accountAddress} owns {@event.balance.balance}");
}

private void OnWebRPCErrorReceived(WebRPCError error)
{
Debug.LogError($"OnWebRPCErrorReceived: {error.msg}");
}
}
}
10 changes: 10 additions & 0 deletions Assets/SequenceSDK/Indexer/Tests/MockHttpHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,15 @@ public Task<string> HttpPost(string chainID, string endPoint, object args, int r
}
return Task.FromResult(_response);
}

public void HttpStream<T>(string chainID, string endPoint, object args, WebRPCStreamOptions<T> options, int retries = 0)
{
throw new NotImplementedException();
}

public void AbortStreams()
{
throw new NotImplementedException();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System;
using Sequence.EmbeddedWallet;
using UnityEngine;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ namespace Sequence
[System.Serializable]
public class TransactionReceipt
{
public string txnHash;
public string transactionHash;
public string transactionIndex;
public string blockHash;
Expand All @@ -22,6 +23,4 @@ public class TransactionReceipt
public string root;
public string status;
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -148,5 +148,25 @@ public Task<GetTransactionHistoryReturn> GetTransactionHistory(GetTransactionHis
{
return Indexer.GetTransactionHistory(ChainId, args, 0, _customHttpHandler, this);
}

public void SubscribeReceipts(SubscribeReceiptsArgs args, WebRPCStreamOptions<SubscribeReceiptsReturn> options)
{
Indexer.SubscribeReceipts(ChainId, args, options, this);
}

public void SubscribeEvents(SubscribeEventsArgs args, WebRPCStreamOptions<SubscribeEventsReturn> options)
{
Indexer.SubscribeEvents(ChainId, args, options, this);
}

public void SubscribeBalanceUpdates(SubscribeBalanceUpdatesArgs args, WebRPCStreamOptions<SubscribeBalanceUpdatesReturn> options)
{
Indexer.SubscribeBalanceUpdates(ChainId, args, options, this);
}

public void AbortStreams()
{
Indexer.AbortStreams(this);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace Sequence
{
[System.Serializable]
public class EventDecoded
{
public string topicHash;
public string eventSig;
public string[] types;
public string[] names;
public string[] values;
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace Sequence
{
[System.Serializable]
public class EventFilter
{
public string[] events;
public string[] contractAddresses;
public string[] accounts;
public string[] tokenIDs;
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,6 @@ public class EventLog
public EventLogDataType logDataType;
public string ts;
public string logData;
public EventDecoded @event;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace Sequence
{
[System.Serializable]
public class SubscribeBalanceUpdatesArgs
{
public string contractAddress;

public SubscribeBalanceUpdatesArgs(string contractAddress)
{
this.contractAddress = contractAddress;
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace Sequence
{
[System.Serializable]
public class SubscribeBalanceUpdatesReturn
{
public TokenBalance balance;
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace Sequence
{
[System.Serializable]
public class SubscribeEventsArgs
{
public EventFilter filter;

public SubscribeEventsArgs(EventFilter filter)
{
this.filter = filter;
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace Sequence
{
[System.Serializable]
public class SubscribeEventsReturn
{
public EventLog log;
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace Sequence
{
[System.Serializable]
public class SubscribeReceiptsArgs
{
public TransactionFilter filter;

public SubscribeReceiptsArgs(TransactionFilter filter)
{
this.filter = filter;
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace Sequence
{
[System.Serializable]
public class SubscribeReceiptsReturn
{
public TransactionReceipt receipt;
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace Sequence
{
[System.Serializable]
public class TransactionFilter
{
public string txnHash;
public string from;
public string to;
public string contractAddress;
public string @event;
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System;

namespace Sequence
{
public class WebRPCStreamOptions<T>
{
public Action<T> onMessage;
public Action<WebRPCError> onError;

public WebRPCStreamOptions(Action<T> onMessage, Action<WebRPCError> onError)
{
this.onMessage = onMessage;
this.onError = onError;
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
using System;
using System.Text;
using Newtonsoft.Json;
using UnityEngine;
using UnityEngine.Networking;

namespace Sequence
{
public class DownloadHandlerStream<T> : DownloadHandlerScript
{
private readonly WebRPCStreamOptions<T> _options;

public DownloadHandlerStream(WebRPCStreamOptions<T> options)
{
_options = options;
}

protected override bool ReceiveData(byte[] data, int dataLength)
{
CompleteContent();

// Stream returns a ping of size 1
if (dataLength <= 1)
return true;

try
{
// One event can include multiple JSON objects, seperated by a line break
var input = Encoding.UTF8.GetString(data);
var jsonParts = input.Split(Environment.NewLine.ToCharArray());

foreach (var part in jsonParts)
{
if (!part.StartsWith('{'))
continue;

var streamData = JsonConvert.DeserializeObject<T>(part);
_options.onMessage?.Invoke(streamData);
}

return true;
}
catch (Exception e)
{
_options.onError?.Invoke(new WebRPCError
{
msg = e.Message
});

Debug.LogException(e);
return false;
}
}
}
}
Loading