Skip to content

Smart Signature Testing

Test Algorand smart signatures (LogicSigs) with ease using the Algorand TypeScript Testing framework.

import * as algots from '@algorandfoundation/algorand-typescript';
import { TestExecutionContext } from '@algorandfoundation/algorand-typescript-testing';
// Create the context manager for snippets below
const ctx = new TestExecutionContext();

Define a LogicSig

Extend algots.LogicSig class to create a LogicSig:

import * as algots from '@algorandfoundation/algorand-typescript';
class HashedTimeLockedLogicSig extends LogicSig {
program(): boolean {
// LogicSig code here
return true; // Approve transaction
}
}

Execute and Test

Use ctx.executeLogicSig() to run and verify LogicSigs:

ctx.txn.createScope([ctx.any.txn.payment()]).execute(() => {
const result = ctx.executeLogicSig(new HashedTimeLockedLogicSig(), Bytes('secret'));
expect(result).toBe(true);
});

executeLogicSig() returns a boolean:

  • true: Transaction approved
  • false: Transaction rejected

Pass Arguments

Provide arguments to LogicSigs using executeLogicSig():

const result = ctx.executeLogicSig(new HashedTimeLockedLogicSig(), Bytes('secret'));

Access arguments in the LogicSig with algots.op.arg() opcode:

import * as algots from '@algorandfoundation/algorand-typescript';
class HashedTimeLockedLogicSig extends LogicSig {
program(): boolean {
// LogicSig code here
const secret = algots.op.arg(0);
const expectedHash = algots.op.sha256(algots.Bytes('secret'));
return algots.op.sha256(secret) === expectedHash;
}
}
// Example usage
const secret = algots.Bytes('secret');
expect(ctx.executeLogicSig(new HashedTimeLockedLogicSig(), secret));

For more details on available operations, see the coverage.

// test cleanup
ctx.reset();