Intersection with Somnia Reactivity
How to build applications that react to data being streamed to the Somnia chain by creating subscriptions
Reactivity background
Writing data, events and reacting
import { SDK } from "@somnia-chain/streams"
import { zeroAddress, erc721Abi } from "viem"
// Use WebSocket transport in the public client for subscription tasks
// For the SDK instance that executes transactions, stick with htttp
const sdk = new SDK({
public: getPublicClient(),
wallet: getWalletClient(),
})
// Encode view function calls to be executed when an event takes place
const ethCalls = [{
to: "0x23B66B772AE29708a884cca2f9dec0e0c278bA2c",
data: encodeFunctionData({
abi: erc721Abi,
functionName: "balanceOf",
args: ["0x3dC360e0389683cA0341a11Fc3bC26252b5AF9bA"]
})
}]
// Start a subsciption
const subscription = await sdk.streams.subscribe({
ethCalls,
onData: (data) => {
const decodedLog = decodeEventLog({
abi: fireworkABI,
topics: data.result.topics,
data: data.result.data,
});
const decodedFunctionResult = decodeFunctionResult({
abi: erc721Abi,
functionName: 'balanceOf',
data: data.result.simulationResults[0],
});
console.log("Decoded event", decodedLog);
console.log("Decoded function call result", decodedFunctionResult);
}
})
// Write data and emit events that will trigger the above callback!
const dataStreams = [{
id,
schemaId: driverSchemaId,
data: encodedData
}]
const eventStreams = [{
id: somniaStreamsEventId,
argumentTopics,
data
}]
const setAndEmitEventsTxHash = await sdk.streams.setAndEmitEvents(
dataStreams,
eventStreams
)Last updated