No Fianto fee during the beta. Any fee comes with at least 30 days notice. See pricing
Wallets7 min read

Signing a message or signing a transaction: what your wallet is asking you to approve.

Signing a message proves you control a wallet and moves nothing: the signature goes back to the site that asked, never to the network, and costs no fee. Signing a transaction authorises instructions that run on chain, which can move tokens and cost a small network fee once the network processes them. Fianto uses both, on purpose: merchants prove their receiving wallet and customers sign in to the portal with a message, while a payment, a subscription and a cancel are transactions.

On this page
What is the difference between signing a message and signing a transaction?How does the Wallet Standard name each signing request?What does a merchant sign to prove a receiving wallet?What does a customer sign to open the subscription portal?What does a customer sign to pay at checkout?How do you tell whether a signature request is safe?SourcesQuestions
TL;DR
  • A signed message is a proof of ownership. It is not sent to the network, so it cannot move funds and costs nothing.
  • A signed transaction is a set of on-chain instructions. Read what it does before you approve, because it can move tokens.
  • Fianto's wallet proof and portal sign-in are plain-text messages; payments, subscriptions, cancels and rent reclaims are transactions the wallet signs and Fianto sends.

What is the difference between signing a message and signing a transaction?

The difference is what happens to the signature afterwards. Both use the wallet's private key, the secret that only your wallet holds. A message signature is handed back to the website, which checks it against your public address to confirm you control that wallet, and that is the end of it. A transaction signature is attached to a transaction, a bundle of instructions such as "move 25 USDC from this account to that one", and the transaction is sent to Solana, where validators run it.

That is why only one of them costs anything. Phantom's developer documentation says: "Message signatures do not involve network fees and are a convenient way for apps to verify ownership of an address." A transaction that the network processes pays a fee in SOL, under $0.01 for the ones a Fianto customer signs.

How does the Wallet Standard name each signing request?

The Wallet Standard, the shared interface Solana wallets expose to websites, names each kind of signature as a separate feature. A site can only call the features a wallet lists. The descriptions below are quoted from the standard's feature definitions.

FeatureWhat the standard says it doesWhere Fianto uses it
solana:signMessage"Sign messages (arbitrary bytes) using the account's secret key."Merchant wallet proof; customer portal sign-in
solana:signTransaction"Sign transactions using the account's secret key."Checkout payments and subscriptions; portal Cancel, Reclaim rent and Re-authorise
solana:signAndSendTransaction"Sign transactions using the account's secret key and send them to the chain."Never
solana:signIn"Sign In With Solana", based on Ethereum's EIP-4361 and CAIP-122; the site passes the fields and the wallet writes the messageNever: Fianto writes the sign-in text and the wallet signs it as a message

Fianto asks wallets only to sign, and sends every transaction itself, because the server, unlike the page, still holds the signed transaction after the tab closes and can send it again until it lands. A wallet that can sign and send but not sign alone is refused at checkout with wallet_unsupported: "This wallet can only send payments itself, and we need it to sign the payment so that we can send it. Pay with a different Solana wallet." The other checkout errors are explained in why did my Solana payment fail.

What does a merchant sign to prove a receiving wallet?

A merchant proves a receiving wallet by signing a plain-text message during setup, not a transaction. Fianto's backend writes the text, the merchant's wallet signs it, and the backend checks the signature against the exact bytes it stored, never against text the browser sends back. This is the message, with the account's values in brackets:

Code
fianto wants you to confirm this wallet receives payments for your account.

Account: <your account email>
Wallet: <the wallet address>
Purpose: Onboarding
Nonce: <32 random hex characters>
Issued At: <time, ISO 8601>

This is a message, not a transaction. Signing it costs nothing and moves nothing.

The nonce, a random value used once, stops an old signature from being replayed, and the message can be signed for five minutes after it is issued. The dashboard checks the Account and Wallet lines against the page before it opens your wallet. The same proof, with Purpose: Wallet change, is asked for when an approved merchant changes the receiving wallet, and a signature from the receiving wallet is one of the checks in the self-serve two-factor reset. The setup steps are on Set up your business in the docs.

What does a customer sign to open the subscription portal?

A customer signs in to the portal at fianto.xyz/my with a Sign In With Solana message, a standard text format for logging in with a wallet. Fianto writes it with this statement, word for word:

Sign in to fianto to see and manage your subscriptions. Signing in costs nothing and moves no funds.

Fianto's sign-in statement

The message also names the portal's domain, the wallet address, Solana mainnet, a nonce and an expiry five minutes after it is issued. The domain line is your check against a copy on a lookalike site: it should match the address bar. Some wallets check it too. Phantom's docs, describing its sign-in feature, say: "Phantom validates recognized Sign-In with Solana (SIWS) messages before displaying an approval prompt." A portal sign-in lasts up to one day.

The customer portal after sign-in: one Active monthly subscription at 19.01 USDC, with its next charge, start date and wallet. Signing in was a message; pressing Cancel subscription asks the wallet to sign a transaction.

Everything the portal changes is a transaction. Cancel, Reclaim rent and Re-authorise each ask your wallet to sign, Fianto sends it, and you pay the network fee. Cancelling runs to the end of the period you have paid for; the steps are in how to cancel a crypto subscription, and what the portal shows is on the customer portal page.

What does a customer sign to pay at checkout?

A customer paying at checkout signs one transaction that Fianto built, and its contents are short. For a one-off payment, it holds:

  1. Two compute-budget instructions, which set how much computation the transaction may use and the priority fee.
  2. A USDC transfer of the price from the customer's USDC account to the merchant's.
  3. A second USDC transfer of Fianto's fee to Fianto's treasury, only when the fee is above zero. There is no Fianto fee during the beta.

The customer's wallet pays the Solana fee and is the only signer. After signing, Fianto checks the signed transaction against what it built, down to every transfer's token, source, destination and amount, and refuses to send it if any of them differ. The checks are listed in crypto payment mistakes and how a signed checkout prevents them.

A subscription checkout is also one transaction, but it does more: it creates the subscription on chain with a cap per billing period and pays the first period. That approval is a delegation, permission for an approved party to collect within limits later, and it is why reading a subscription request matters more than reading a one-off payment. How the limits are enforced is in Solana token delegation explained.

One readable transaction per payment, sent by Fianto, checked before it leaves.

Read how Fianto stays non-custodial

How do you tell whether a signature request is safe?

A signature request is safe to approve when you know which site asked, what kind of signature it is, and what it does. If the wallet adds a warning, what wallet transaction warnings mean decodes it. A short routine before you press Approve:

  1. Check the site address in the browser bar, and the domain the wallet shows. A sign-in message for another domain is a red flag.
  2. Check the kind of request. Both of Fianto's messages are plain text that say what they are for. A message you cannot read tells you nothing about what you are agreeing to, so reject it unless you trust the site that asked.
  3. For a transaction, read the balance changes your wallet predicts. A payment should move the price, and the fee if there is one, and nothing else.
  4. Be wary of any transaction that changes who controls a token account or approves an unlimited amount. A Fianto one-off payment does neither.
  5. Reject when unsure. Rejecting signs nothing and sends nothing.

A message signature still has value to whoever receives it: a signed sign-in message can sign them in as you on the site it names. Sign messages only on sites you meant to visit, the same way you would type a password.

Sources
Questions

Questions about signing messages and transactions.

Is signing a message safe?

A signed message cannot move funds or cost a fee, because it is never sent to the network. It can still prove your identity to the site that asked, so sign messages only on sites you meant to visit.

Does signing a message cost gas on Solana?

No. Only transactions pay a network fee. A message signature goes back to the website that requested it.

Why does Fianto ask me to sign a message?

Merchants sign one to prove they control the wallet that receives payments, and customers sign one to open the subscription portal. Both texts say signing costs nothing and moves nothing.

What is the difference between signTransaction and signAndSendTransaction?

signTransaction returns the signed transaction to the website, which sends it; signAndSendTransaction has the wallet send it too. For transactions Fianto only uses signTransaction, so it can resend a payment until it lands.

Can a website take my funds with a message signature?

A message signature itself moves nothing. Funds move only through a transaction your wallet signs, which is why the transaction prompt is the one to read closely.

Read next.

PaymentsWallets9 min read

Wrong amount, token or network: crypto payment mistakes and how a signed checkout prevents them

Once a crypto transfer is final, nobody can pull it back: not your wallet, not the network and not Circle, whose USDC terms say "Circle does not have the ability to reverse or recall any transaction once initiated." The only way to get mistaken USDC back is for whoever controls the receiving address to send it, and anyone who offers to "recover" it for a fee is almost certainly running a scam. A checkout that builds the transaction for the customer removes the usual mistakes before the wallet opens: on Fianto the amount, the token, the network and the destination are fixed by the server and checked again after signing.

Solana8 min read

Why did my Solana payment fail? Common errors in plain English

The usual reasons a Solana payment fails sit in the wallet: too little of the token being sent, too little SOL for the network fee and the minimum balance, no account for that token yet, or a transaction signed too late, after its blockhash expired. A Solana transaction is all or nothing, so a failed one moves no tokens, though one that reached the network and failed still costs its small SOL fee. On a Fianto checkout most of these are caught before your wallet even opens, and the page names the one that stopped you.

Guides9 min read

Ten questions customers ask when paying in USDC, and how to answer them

Most questions from customers paying in USDC are answered by one of three things: the payment's status in your dashboard, the exact sentence the checkout showed them, or the transaction signature. A payment the customer saw succeed shows as Confirmed until Solana finalizes it, then Succeeded; only then does your order turn Paid. Below are the ten questions that come up, what the customer saw, and where you look before you reply.

Sign the message, read the transaction.

Fianto asks for each only where it belongs.

New posts are announced on X and Discord.