Skip to content

Commit 412b997

Browse files
committed
Utilities for creating, signing, and verifying offchain messages
1 parent 92455b8 commit 412b997

File tree

3 files changed

+116
-0
lines changed

3 files changed

+116
-0
lines changed

packages/errors/src/codes.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,22 @@ export const SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGN
190190
export const SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING = 5508010;
191191
export const SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED = 5508011;
192192

193+
// Offchain-message-related errors.
194+
// Reserve error codes in the range [5607000-5607999].
195+
export const SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED = 5607000;
196+
export const SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE = 5607001;
197+
export const SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE = 5607002;
198+
export const SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH = 5607003;
199+
export const SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH = 5607004;
200+
export const SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO = 5607005;
201+
export const SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED = 5607006;
202+
export const SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH = 5607007;
203+
export const SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH = 5607008;
204+
export const SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY = 5607009;
205+
export const SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO = 5607010;
206+
export const SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING = 5607011;
207+
export const SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH = 5607012;
208+
193209
// Transaction-related errors.
194210
// Reserve error codes in the range [5663000-5663999].
195211
export const SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES = 5663000;
@@ -485,6 +501,19 @@ export type SolanaErrorCode =
485501
| typeof SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR
486502
| typeof SOLANA_ERROR__MALFORMED_NUMBER_STRING
487503
| typeof SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND
504+
| typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE
505+
| typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH
506+
| typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH
507+
| typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED
508+
| typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH
509+
| typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH
510+
| typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY
511+
| typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO
512+
| typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO
513+
| typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH
514+
| typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE
515+
| typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING
516+
| typeof SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED
488517
| typeof SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD
489518
| typeof SOLANA_ERROR__RPC__INTEGER_OVERFLOW
490519
| typeof SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR

packages/errors/src/context.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,15 @@ import {
135135
SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR,
136136
SOLANA_ERROR__MALFORMED_NUMBER_STRING,
137137
SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND,
138+
SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE,
139+
SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH,
140+
SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH,
141+
SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED,
142+
SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH,
143+
SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH,
144+
SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH,
145+
SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING,
146+
SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED,
138147
SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD,
139148
SOLANA_ERROR__RPC__INTEGER_OVERFLOW,
140149
SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR,
@@ -533,6 +542,39 @@ export type SolanaErrorContext = DefaultUnspecifiedErrorContextToUndefined<
533542
[SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND]: {
534543
nonceAccountAddress: string;
535544
};
545+
[SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE]: {
546+
actualLength: number;
547+
};
548+
[SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH]: {
549+
missingRequiredSigners: readonly string[];
550+
unexpectedSigners: readonly string[];
551+
};
552+
[SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH]: {
553+
actualLength: number;
554+
};
555+
[SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED]: {
556+
actualBytes: number;
557+
maxBytes: number;
558+
};
559+
[SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH]: {
560+
actualMessageFormat: number;
561+
expectedMessageFormat: number;
562+
};
563+
[SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH]: {
564+
actualLength: number;
565+
specifiedLength: number;
566+
};
567+
[SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH]: {
568+
numRequiredSignatures: number;
569+
signaturesLength: number;
570+
signerAddresses: string[];
571+
};
572+
[SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING]: {
573+
addresses: string[];
574+
};
575+
[SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED]: {
576+
unsupportedVersion: number;
577+
};
536578
[SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN]: {
537579
notificationName: string;
538580
};

packages/errors/src/messages.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,19 @@ import {
156156
SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR,
157157
SOLANA_ERROR__MALFORMED_NUMBER_STRING,
158158
SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND,
159+
SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE,
160+
SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH,
161+
SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH,
162+
SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED,
163+
SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH,
164+
SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH,
165+
SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY,
166+
SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO,
167+
SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO,
168+
SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH,
169+
SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE,
170+
SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING,
171+
SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED,
159172
SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD,
160173
SOLANA_ERROR__RPC__INTEGER_OVERFLOW,
161174
SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR,
@@ -487,6 +500,38 @@ export const SolanaErrorMessages: Readonly<{
487500
[SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR]: '$message',
488501
[SOLANA_ERROR__MALFORMED_NUMBER_STRING]: '`$value` cannot be parsed as a `Number`',
489502
[SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND]: 'No nonce account could be found at address `$nonceAccountAddress`',
503+
[SOLANA_ERROR__OFFCHAIN_MESSAGE__INVALID_APPLICATION_DOMAIN_BYTE_LENGTH]:
504+
'Expected base58 encoded application domain to decode to a byte array of length 32. Actual length: $actualLength.',
505+
[SOLANA_ERROR__OFFCHAIN_MESSAGE__APPLICATION_DOMAIN_STRING_LENGTH_OUT_OF_RANGE]:
506+
'Expected base58-encoded application domain string of length in the range [32, 44]. Actual length: $actualLength.',
507+
[SOLANA_ERROR__OFFCHAIN_MESSAGE__ENVELOPE_SIGNERS_MISMATCH]:
508+
'The signer addresses in this offchain message envelope do not match the list of ' +
509+
'required signers in the message preamble. These unexpected signers were present in the ' +
510+
'envelope: `[$unexpectedSigners]`. These required signers were missing from the envelope ' +
511+
'`[$missingSigners]`.',
512+
[SOLANA_ERROR__OFFCHAIN_MESSAGE__MAXIMUM_LENGTH_EXCEEDED]:
513+
'The message body provided has a byte-length of $actualBytes. The maximum allowable ' +
514+
'byte-length is $maxBytes',
515+
[SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_FORMAT_MISMATCH]:
516+
'Expected message format $expectedMessageFormat, got $actualMessageFormat',
517+
[SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_LENGTH_MISMATCH]:
518+
'The message length specified in the message preamble is $specifiedLength bytes. The actual length of the message is $actualLength bytes.',
519+
[SOLANA_ERROR__OFFCHAIN_MESSAGE__MESSAGE_MUST_BE_NON_EMPTY]: 'Offchain message content must be non-empty',
520+
[SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_REQUIRED_SIGNERS_CANNOT_BE_ZERO]:
521+
'Offchain message must specify the address of at least one required signer',
522+
[SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_ENVELOPE_SIGNATURES_CANNOT_BE_ZERO]:
523+
'Offchain message envelope must reserve space for at least one signature',
524+
[SOLANA_ERROR__OFFCHAIN_MESSAGE__NUM_SIGNATURES_MISMATCH]:
525+
'The offchain message preamble specifies $numRequiredSignatures required signature(s), got $signaturesLength.',
526+
[SOLANA_ERROR__OFFCHAIN_MESSAGE__SIGNATURES_MISSING]:
527+
'Offchain message is missing signatures for addresses: $addresses.',
528+
[SOLANA_ERROR__OFFCHAIN_MESSAGE__RESTRICTED_ASCII_BODY_CHARACTER_OUT_OF_RANGE]:
529+
'The message body provided contains characters whose codes fall outside the allowed ' +
530+
'range. In order to ensure clear-signing compatiblity with hardware wallets, the message ' +
531+
'may only contain line feeds and characters in the range [\\x20-\\x7e].',
532+
[SOLANA_ERROR__OFFCHAIN_MESSAGE__VERSION_NUMBER_NOT_SUPPORTED]:
533+
'This version of Kit does not support decoding offchain messages with version ' +
534+
'$unsupportedVersion. The current max supported version is 0.',
490535
[SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN]:
491536
"The notification name must end in 'Notifications' and the API must supply a " +
492537
"subscription plan creator function for the notification '$notificationName'.",

0 commit comments

Comments
 (0)