---
arc: 5
title: Wallet Transaction Signing API (Functional)
description: An API for a function used to sign a list of transactions.
author: DanBurton (@DanBurton)
discussions-to: https://github.com/algorandfoundation/ARCs/issues/52
status: Final
type: Standards Track
category: Interface
sub-category: Wallet
created: 2021-08-09
---

# Algorand Wallet Transaction Signing API (Functionality Only)

> This ARC is intended to be completely compatible with [ARC-1](./arc-0001.md).

## Abstract

ARC-1 defines a standard for signing transactions with security in mind. This proposal is a strict subset of ARC-1 that outlines only the minimum functionality required in order to be useable.

Wallets that conform to ARC-1 already conform to this API.

Wallets conforming to [ARC-5](./arc-0005.md) but not ARC-1 **MUST** only be used for testing purposes and **MUST NOT** used on MainNet.
This is because this ARC-5 does not provide the same security guarantees as ARC-1 to protect properly wallet users.

## Specification

The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**MAY**", and "**OPTIONAL**" in this document are to be interpreted as described in <a href="https://www.ietf.org/rfc/rfc2119.txt">RFC-2119</a>.

> Comments like this are non-normative.

### Interface `SignTxnsFunction`

Signatures are requested by calling a function `signTxns(txns)` on a list `txns` of transactions. The dApp may also provide an optional parameter `opts`.

A wallet transaction signing function `signTxns` is defined by the following interface:
```ts
export type SignTxnsFunction = (
   txns: WalletTransaction[],
   opts?: SignTxnsOpts,
)
   => Promise<(SignedTxnStr | null)[]>;
```
* `SignTxnsOpts` is as specified by [ARC-1](./arc-0001.md#interface-signtxnsopts).
* `SignedTxnStr` is as specified by [ARC-1](./arc-0001.md#interface-signedtxnstr).

A `SignTxnsFunction`:
* expects `txns` to be in the correct format as specified by `WalletTransaction`.

### Interface `WalletTransaction`

```ts
export interface WalletTransaction {
   /**
    * Base64 encoding of the canonical msgpack encoding of a Transaction.
    */
   txn: string;
}
```

### Semantic requirements

* The call `signTxns(txns, opts)` **MUST** either throw an error or return an array `ret` of the same length as the `txns` array.
* Each element of `ret` **MUST** be a valid `SignedTxnStr` with the underlying transaction exactly matching `txns[i].txn`.

This ARC uses interchangeably the terms "throw an error" and "reject a promise with an error".

`signTxns` **SHOULD** follow the error standard specified in [ARC-0001](./arc-0001.md#error-standards).

### UI requirements

Wallets satisfying this ARC but not [ARC-0001](./arc-0001.md) **MUST** clearly display a warning to the user that they **MUST** not be used with real funds on MainNet.

## Rationale

This simplified version of ARC-0001 exists for two main reasons:

1. To outline the minimum amount of functionality needed in order to be useful.
2. To serve as a stepping stone towards full ARC-0001 compatibility.

While this ARC **MUST** not be used by users with real funds on MainNet for security reasons, this simplified API sets a lower bar and acts as a signpost for which wallets can even be used at all.

## Security Considerations

None.

## Copyright

Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CCO</a>.
