Skip to main content

Warp Contracts Subscription plugins

These plugins allow to subscribe for notifications to new interactions that are now being sent by the Warp Sequencer.
The Warp Sequencer publishes a notification for each newly registered interaction to a interaction/{contractTxId} channel - so each contract has its own channel.

Subscribers may use the incoming messages to locally update their state - without having to constantly poll the Warp Gateway to check whether new interactions have been registered for a given contract.

In order to safely update the local state - a plugin must verify whether the local state is cached at the sort key exactly "before" the sort key from the new interaction.
That's why each message sent by the Warp Sequencer contains the lastSortKey field.

Installation

yarn add warp-contracts-plugin-subscription

Requires warp-contract SDK ver. min. 1.2.19.

Incoming messages format

export interface InteractionMessage {
contractTxId: string; // contract for which the interaction was registerd
sortKey: string; // the sortKey of the new interaction
lastSortKey: string; // the sortKey of the interaction exactly before this new interaction
interaction: GQLNodeInterface; // the new interaction itself
}

The new interaction can be used to update the local state via the contract.readStateFor([message.interaction]) method.

WarpSubscriptionPlugin

This is an abstract implementation of the subscription plugin - a "base" that allows to create custom plugins. The R generic type defines the return type of the plugin (already wrapped in a Promise).

Example custom plugin:

class CustomSubscriptionPlugin extends WarpSubscriptionPlugin<void> {
async process(input: InteractionMessage): Promise<void> {
logger.info('From custom plugin', input);
// process the new message;
}
}

Usage:

const warp = WarpFactory.forMainnet();
const contract = warp.contract(contractTxId);
warp.use(new CustomSubscriptionPlugin(contract, warp));

StateUpdatePlugin

A WarpSubscriptionPlugin plugin implementation that contains logic for updating the local state based on the incoming messages (e.g. it verifies whether the locally cached sort key and new interaction sort key allow to safely update the state based on the new interaction).

Usage:

const warp = WarpFactory.forMainnet();
const contract = warp.contract(contractTxId);
warp.use(new StateUpdatePlugin(contractTxId, warp));

Examples

Examples are available here.