Docs
Standard messages

Standard message signing

Standard messaging signing allows for the signing of any arbitrary string message.

💡

If you're looking to sign Structured Data, please click here.

Usage

@micro-stacks/react exports a hook for this: useOpenSignMessage. The hook returns a callback, openSignMessage which takes a message of type string value. isRequestPending is also returned, a boolean value to denote if there is a current request open (meaning the user has already requested a signature). The pending state is handled all internally for every wallet request, so you don't need to manually handle any loading logic.

As with all of the hooks that interact with the wallet, you can also pass an onFinish and onCancel callback.

import { useOpenStxTokenTransfer } from '@micro-stacks/react';

Example

Below you will find a component that renders an input and a button. The input is captured in a useState hook, and piped into the openSignMessage callback, wrapped in a useCallback hook.

import * as React from 'react';
import { useOpenSignMessage } from '@micro-stacks/react';
 
const SignMessageComponent = () => {
  const { openSignMessage, isRequestPending } = useOpenSignMessage();
 
  const [payload, setPayload] = React.useState(null);
  const [message, setMessage] = React.useState('');
 
  const onClick = React.useCallback(async () => {
    await openSignMessage({
      message,
      onFinish: walletResponse => {
        setPayload(walletResponse);
      },
    });
  }, [message]);
 
  return (
    <div
      style={{
        display: 'grid',
        gap: '20px',
      }}
    >
      <h5>Sign a message!</h5>
      <input
        style={{ display: 'block' }}
        onChange={e => setMessage(e.currentTarget.value)}
      />
      <button onClick={onClick}>{isRequestPending ? 'Loading...' : 'Sign message'}</button>
      <code>
        <pre>{JSON.stringify(payload, null, 2)}</pre>
      </code>
    </div>
  );
};

Verification

To verify a signed message, you can import verifyMessageSignature from micro-stacks/connect.

Example

import { verifyMessageSignature } from 'micro-stacks/connect';
 
// original message
const message = 'hi there how are you';
 
// from the wallet
const payload = {
  signature:
    '0c956388e3bf84a2873b2fdd9c6845cceb14cea0e342bdc233dbc25e32e84aa77d483f80160541c92bf3d48beed82dcbea58c3d3f93d7cbc3fbefdbd48cecf2e01',
  publicKey: '035b08fd4d14786187f51a3360864665fa437a9ad22bbdf7ae716d4599f26943a7',
};
 
const isValid = verifyMessageSignature({
  message,
  signature: payload.signature,
  publicKey: payload.publicKey,
});