SignedTransaction

Runtime supports transactions described as ExecParams and traditional algosdk.SignedTransaction objects. This allow for easier interaction with algosdk and provides more flexibility and functionality. We can create transactions and sign them using algosdk methods and execute them in Runtime.

Example

The example shows how to send 5 algo from one account to another using Runtime. We will use Runtime.defaultAccounts() which are predefined, funded accounts and algosdk to create and sign the transaction. For more details check the algorand docs.

// create runtime
const runtime = new Runtime([]);
// get two funded accounts
const [alice, bob] = runtime.defaultAccounts();
// mock suggested params
const suggestedParams = mockSuggestedParams({ totalFee: 1000 }, runtime.getRound());
// create transaction using algosdk
const transaction = algosdk.makePaymentTxnWithSuggestedParamsFromObject({
        from: alice.address, 
        to: bob.address, 
        amount: 5e6, //5 algo 
        note: undefined,
        suggestedParams: suggestedParams});
// sign it and decode it to signedTransaction object
const signedTransacion = algosdk.decodeSignedTransaction(transaction.signTxn(alice.account.sk));
// submit the transaction
const confirmedTxn = runtime.executeTx([signedTransacion]);
console.log(confirmedTxn);

Check the example in our tests.

Multisignature

Support of SignedTransaction objects in Runtime enables users to test their multisignatures. Again with the help of algosdk we can create multisignature address, rekey an existing runtime account to this address and then sign transactions using multisignature accounts. Runtime verifies the signature and if it’s valid, it executes the transaction.

Example

This example shows how to create a multisignature address using algosdk, rekey an existing runtime account to multisignature, create a transaction and sign it using multisignature. For more details check the algorand docs.

// create runtime
const runtime = new Runtime([]);
// get two funded accounts
let [alice, bob, charlie, elon] = runtime.defaultAccounts();
// mock suggested params
const suggestedParams = mockSuggestedParams({ totalFee: 1000 }, runtime.getRound());
// create multisignature parameters
const addrs = [bob.address, charlie.address];
const multiSigParams = {
    version: 1,
    threshold: 2,
    addrs: addrs};
// create multisignature address
const multSigAddr = algosdk.multisigAddress(multiSigParams);
// rekey alice to multisignature account
const txParam: types.AlgoTransferParam = {
    type: types.TransactionType.TransferAlgo,
    sign: types.SignType.SecretKey,
    fromAccount: alice.account,
    fromAccountAddr: alice.address,
    toAccountAddr: alice.address,
    amountMicroAlgos: 0,
    payFlags: {totalFee: 1000, rekeyTo: multSigAddr},
};
runtime.executeTx([txParam]);
// sync accounts
[alice, bob, charlie, elon] = runtime.defaultAccounts();
// create transaction using algosdk
const txn = algosdk.makePaymentTxnWithSuggestedParams(
    alice.account.addr, // from
    elon.account.addr, // to
    5e6, // 5 algo
    undefined,
    undefined,
    suggestedParams);
// Sign with first account
const rawSignedTxn = algosdk.signMultisigTransaction(
    txn,
    multiSigParams,
    bob.account.sk
).blob;
// Sign with second account
const twosigs = algosdk.appendSignMultisigTransaction(
    rawSignedTxn,
    multiSigParams,
    charlie.account.sk
).blob;
// decode the transaction
const signedTxn: SignedTransaction = algosdk.decodeSignedTransaction(twosigs);
// submit the transaction
const confirmedTxn = runtime.executeTx([signedTxn]);
console.log(confirmedTxn);

Full Code

Check the example in our tests.