mirror of
https://github.com/EvernodeXRPL/hp-devkit.git
synced 2026-04-29 15:37:58 +00:00
49 lines
2.2 KiB
JavaScript
49 lines
2.2 KiB
JavaScript
const HotPocket = require('hotpocket-nodejs-contract');
|
|
const { _projname_ } = require('./_projname_');
|
|
|
|
// Hot Pocket smart contract is defined as a function which takes the Hot Pocket ExecutionContext as an argument.
|
|
// This function gets invoked every consensus round and whenever a user sends a out-of-concensus read-request.
|
|
async function contract(ctx) {
|
|
|
|
// Create our application logic component.
|
|
// This pattern allows us to test the application logic independently of Hot Pocket.
|
|
const app = new _projname_();
|
|
|
|
// Wire-up output emissions from the application before we pass user inputs to it.
|
|
app.sendOutput = async (userPubKey, output) => {
|
|
// In Hot Pocket, each user is represented by their Ed25519 public key.
|
|
const user = ctx.users.find(userPubKey);
|
|
await user.send(output)
|
|
}
|
|
|
|
// In 'readonly' mode, nothing our contract does will get persisted on the ledger. The benefit is
|
|
// readonly messages gets processed much faster due to not being subjected to consensus.
|
|
// We should only use readonly mode for returning/replying data for the requesting user.
|
|
//
|
|
// In consensus mode (NOT read-only), we can do anything like persisting to data storage and/or
|
|
// sending data to any connected user at the time. Everything will get subjected to consensus so
|
|
// there is a time-penalty.
|
|
const isReadOnly = ctx.readonly;
|
|
|
|
// Process user inputs.
|
|
// Loop through list of users who have sent us inputs.
|
|
for (const user of ctx.users.list()) {
|
|
|
|
// Loop through inputs sent by each user.
|
|
for (const input of user.inputs) {
|
|
|
|
// Read the data buffer sent by user (this can be any kind of data like string, json or binary data).
|
|
const buf = await ctx.users.read(input);
|
|
|
|
// Let's assume all data buffers for this contract are JSON.
|
|
// In real-world apps, we need to gracefully fitler out invalid data formats for our contract.
|
|
const message = JSON.parse(buf);
|
|
|
|
// Pass the JSON message to our application logic component.
|
|
await app.handleRequest(userPubKey, message, isReadOnly);
|
|
}
|
|
}
|
|
}
|
|
|
|
const hpc = new HotPocket.Contract();
|
|
hpc.init(contract); |