Repository navigation
Releases
v0.3.3
Added
- v1 transactions, where the wallet behind SignLens signs them. A
dapp builds a transaction in the versions a wallet lists (jup.ag
builds v1 only for a wallet that lists it, and turned its "Use V1
transactions" switch off for SignLens), and SignLens listed legacy and
v0 whatever wallet it passed requests to. It reads v1 transactions
already. From the connect on, each way to sign now lists the versions
the wallet behind lists for it, of those SignLens reads: v1 with
Backpack or Jupiter Wallet, legacy and v0 with a wallet that does not
sign v1, so a request you agreed to is never one your wallet refuses.
It follows that wallet if it starts or stops listing a version while
connected. In watch-only mode, where nothing is signed, it lists
legacy, v0 and v1. Before a connect and after the session ends,
legacy and v0, as before; the dapp is told each change.
Fixed
- The wallet the window names is the one that signs, again. On
gmgn.ai, with Phantom chosen in the settings in place of Backpack, a
message to sign showed "Continue to Phantom", and Continue opened
Backpack. A connect begun while the settings still named Backpack
(Backpack may wait on you, or on being unlocked) took the session
when it ended, after the one to Phantom; and Continue handed a request
to whichever wallet the session had by then, not the one its window
named. A connect that ends after the settings name another wallet, or
leave watch-only mode, now takes no session and tells the site to
connect again; and a request goes to the wallet its window named or
to none, saying which wallet it was for and which is behind SignLens
now.
Checking the packages
signlens-extension-0.3.3.zip is the Chrome package and signlens-extension-firefox-0.3.3.zip the Firefox one. In the directory you downloaded them to, with their .sha256 files:
sha256sum -c signlens-extension-0.3.3.zip.sha256 signlens-extension-firefox-0.3.3.zip.sha256
gh attestation verify signlens-extension-0.3.3.zip --owner signlens
gh attestation verify signlens-extension-firefox-0.3.3.zip --owner signlensThe tag rebuilds to the same bytes: see Verifying a package.
What's Changed
- Feat/v1 transactions by @OBorce in #28
- build(deps-dev): Bump the dev-dependencies group with 3 updates by @dependabot[bot] in #27
- fix(page): hand a request only to the wallet its window named by @OBorce in #29
- build: version the extension 0.3.3 and file its changelog by @OBorce in #30
New Contributors
- @dependabot[bot] made their first contribution in #27
Full Changelog: v0.3.2...v0.3.3
v0.3.2
Changed
- A description the Chrome Web Store takes. The description under
SignLens's name in the browser's list of extensions, which the stores
show as its summary, was 186 characters, and the Chrome Web Store
takes a package only when it is at most 132. It now reads "See what a
Solana transaction does before you sign it. Explains every signing
request, then hands it unchanged to your own wallet.", without the
sentence on the beta, which the name's "(beta)" and the stores'
listings still say; in Simplified Chinese likewise.
Checking the packages
signlens-extension-0.3.2.zip is the Chrome package and signlens-extension-firefox-0.3.2.zip the Firefox one. In the directory you downloaded them to, with their .sha256 files:
sha256sum -c signlens-extension-0.3.2.zip.sha256 signlens-extension-firefox-0.3.2.zip.sha256
gh attestation verify signlens-extension-0.3.2.zip --owner signlens
gh attestation verify signlens-extension-firefox-0.3.2.zip --owner signlensThe tag rebuilds to the same bytes: see Verifying a package.
What's Changed
Full Changelog: v0.3.1...v0.3.2
v0.3.1
Added
- Choose the language. The setup page and the top of the popup's
settings have a Language select: your browser's languages, the
default, which names the language they give, or English or 简体中文,
each named in itself. SignLens's own words are in the language chosen,
and the explanations are asked for in it, whatever the browser's
languages: a reader whose browser asks for Traditional Chinese, which
SignLens does not have, can read Simplified Chinese, and one whose
browser is in Chinese can read English. The page rewords itself in the
choice at once; a window already open keeps its words, and so do the
requests the popup lists. The popup's status line says that the API
explains in another language when the browser asks for it or the
settings choose it. The name and description in the browser's list of
extensions still follow the browser's language, which no extension
can change.
Checking the packages
signlens-extension-0.3.1.zip is the Chrome package and signlens-extension-firefox-0.3.1.zip the Firefox one. In the directory you downloaded them to, with their .sha256 files:
sha256sum -c signlens-extension-0.3.1.zip.sha256 signlens-extension-firefox-0.3.1.zip.sha256
gh attestation verify signlens-extension-0.3.1.zip --owner signlens
gh attestation verify signlens-extension-firefox-0.3.1.zip --owner signlensThe tag rebuilds to the same bytes: see Verifying a package.
What's Changed
- Feat/language setting by @OBorce in #24
- build: version the extension 0.3.1 and file its changelog by @OBorce in #25
Full Changelog: v0.3.0...v0.3.1
v0.3.0
Added
-
The interface in Simplified Chinese. For a reader whose browser
asks for zh, zh-CN, zh-SG or zh-MY, the window, the popup and its
settings, the setup page, the small windows, and the extension's name
and description in the browser's list of extensions are in Simplified
Chinese, reviewed in full by a native speaker; Traditional Chinese goes
on to the reader's next language. What a dapp is told stays in
English, for its developers. -
Show in English. An explanation in another language has a "Show
in English" button under its verdict, which asks for it again in
English while the request waits, so that a translation in doubt can be
read against the source; "Show in your language" asks for it back. -
The languages it explains in. The popup's status line names the
languages the API explains in besides English, each with the day it
was reviewed, as the API lists them, and no reviewer's name; the
explanation is in the first of the browser's languages among them. -
Laid out in its language. The window sets the explanation's
language and direction from what the engine says it is worded in, so a
right-to-left language runs right to left, and holds each amount and
address apart from the words around it, so that it cannot reorder the
sentence. A rating sends the language the explanation was in, so that
ratings can be read per language. -
Explanations in your language. The extension asks the API for the
explanation in the browser's languages, in their order, and the engine
words it in the first it has. Until a language ships, explanations stay
in English. -
Which wallet signs, asked once. With "First one found" in the
settings, SignLens passed requests to whichever wallet announced itself
first in the page: MetaMask, Brave or OKX, say, for someone who signs
with Phantom. Now a page with several wallets asks, the first time you
connect, which one in a window of its own that lists them with their
icons, and keeps your choice in the settings; closing it refuses the
connect. An icon is shown only if it is an image as Wallet Standard has
one (a data URL of SVG, WebP, PNG or GIF), never an address to fetch,
and the wallet's initial in its place otherwise. A dapp
reconnecting as it loads asks nothing and gets the first found, as
before, and a page with one wallet gets that one. Another SignLens (a
store build beside one built from the sources) is never the wallet
behind it, where the two passed requests to each other. -
A setup page. A new install opens one in a tab of its own: your
wallet addresses go there, so the first site that signs with one is
not asked about first; how to use SignLens (choose SignLens in the
dapp's list of wallets, not your wallet); how to pin it, ticked off
once it is pinned where the browser can tell; and what leaves your
browser. In Firefox, where the access to sites can be turned off, it
asks for that too. Updates do not open it; the popup's settings do. -
Try again. When SignLens could not explain a transaction (the API
away, busy or past its limit), the window offers "Try again": SignLens
asks once more while the request waits, with the settings as they are
then, and the same window shows what comes back, the decision still
yours.
Before, the only way was to reject and ask the site again. A request
refused as a whole, as too many transactions, say, offers no button,
since it would be refused again.
Changed
-
The interface's language. The extension words its own interface
in the reader's first language it has, chosen as the engine chooses
an explanation's: by the tag, else by the language written in the
same script, so that zh-TW, Traditional Chinese, goes on to the
reader's next language; English while it has no other. The popup's
dates and numbers, and the names of the languages it lists, follow
that language, where they took the browser's. In an explanation, the
engine's words are marked with the explanation's language and the
extension's around them with the interface's. -
Brackets in the language's own. An amount's note and a labelled
address's short form are set in the brackets the engine writes for
the explanation's language, full-width in Chinese, where the window
wrote half-width ones itself; with an engine that sends none, it
brackets them as before. -
Amounts and emphasis in the engine's words. An amount reads as the
engine words it, in the explanation's language ("≥ 1.5 SOL", "an
unknown amount of the token held in …"), where the window rebuilt it
from its units, decimals and bound in English; its trust badge and note
stay the window's. Words the engine emphasises ("YOUR", "UNLIMITED",
"NO TIME LIMIT") are set in bold, as a language without capitals needs.
An explanation from an engine before these words reads as it did. -
A descriptor's words, named. The extension reads the identifier
the engine now gives each word a descriptor wrote, its program's
address and the place in the descriptor
(JUP6…TaV4/route_v2-summary-absent), where it would have refused the
whole explanation as one it cannot read. Nothing on screen changes. -
The engine's help for its labels. The help a fixed label opens
(the fee's parts, the signers, the compute budget's settings, a token
account's mint) is the engine's, sent with each field, where the
extension kept its own copy and found a label in the collapsed
section by its English ("Create token account if missing: Mint"). -
Section titles as the engine words them. The toggle over the
sections after the instructions lists their titles as the engine
writes them ("Details: Also, Signers, Fee, Validity"), where it
lowercased them, which a translation could not survive. -
One percentage format. A percentage in the instructions reads as
the engine now writes every one, with the decimals it has and no more
("Max slippage: 1%", "Platform fee: 0.2%"), where it had two ("1.00%",
"0.20%"). -
A duration in words. A duration in the instructions reads as the
engine writes it, in its two largest units, the smaller left out when
it is zero ("2 days 3 hours", "5 minutes 20 seconds"), where it read
as a count of seconds ("183600 seconds"). -
A shortened address opens to its whole. An address shortened to
its first and last four characters ("H7Pi…7ZgL") shows all of it when
clicked, tapped, or pressed with Enter or Space, and its short form
again the same way; open, it can be selected and copied. The whole was
only in a tooltip on hover, out of reach of the keyboard and of touch. -
The band's summary laid out. The summary in the window's band, of
a single transaction, lays out the amounts and addresses it names as
the rows below do: a verified token or account name has its badge, a
claim its warning, a short address its full form on hover. It was the
summary's plain text, so the one line read first carried no badge. -
Each action on its own line. A transaction that does several things
shows their count in the window's band ("3 actions") and each one on a
line of its own below, where the summary ran them together with
semicolons and named only the first three. The summary, its actions and
the findings lay out the amounts and addresses they name as "What this
does" does: a verified token or account name has its badge, a claim its
warning, and a short address its full form. -
A badge for what SignLens verified. A token or account name that
SignLens verified shows a small check in a ring after it, where it was
followed by the word "(verified)": up to three in one line read as if
the amounts had been checked. The badge opens the same help, a screen
reader names it, and it is drawn, so no token name can carry it. A
claim keeps its words, "(claimed, unverified)", now in the warning
colour, and the summary line and the findings, which carry the
engine's text, now mark only claims. -
"1 raw unit". One raw unit reads in the singular, as the engine now
writes it, where it read "1 raw units". -
A token without a symbol, named in place. An amount of a token
SignLens does not list names it after "of", as the engine now does:
"raw units of unverified token E7T1…pump", "of the token held in
DKag…7hzh", "of the token at lookup table CpST…Swey[62]", where it
read "of an unverified token" with the token in brackets after any
note, the mint written in full. -
Raw units grouped. A token's amount in raw units groups its digits
("20,998,877,118 raw units") as the engine now does, where it was
written unbroken. -
"An unknown amount of". An amount fixed only when the transaction
runs reads "an unknown amount of SOL", with the article the engine now
writes, where it read "unknown amount of SOL". -
What a transaction does, in the engine's words. Each line under
"What this does" is the sentence the SignLens engine words for it, its
amounts and addresses laid out as before, where the window wrote its
own; the lines read the same. An effect of a type this version does
not know is now shown in those words, where the window said it could
not show it. -
An update starts the history afresh. The answers the popup kept,
and their count on the badge, are forgotten when SignLens updates: an
earlier version's may be in a shape the new one does not read, and
some browsers keep them across an update. -
The explanation from the API's
/v2. SignLens asks the SignLens
API for/v2/explain, where the engine says every word as a message:
its words and the amounts and addresses they name, which the window
lays out with its own nodes, and words in place of an address or a
token the engine does not know. It reads that document
(signlens-explanation/2) as strictly as the last, and the window
reads as it did. An API that does not s...
v0.2.0
Explanations that read the accounts a transaction names, for multisig
approvals and DAO votes, and the Firefox build ready for
addons.mozilla.org.
Added
- Accounts an explanation names. Approving a multisig proposal made
in an earlier transaction signs a reference to it; the transaction it
runs is stored on chain. A Jupiter DAO vote signs a side's number; the
proposal says which option that is. When an explanation names accounts
like these that it would read, SignLens reads them from the RPC in the
settings and asks the API again with them, up to twice, and the window
lists the accounts read, unverified. What they hold is shown as the
RPC's claim and never lowers a finding. On by default; "Read the
accounts an explanation needs" in the settings turns it off. A saved
transaction carries the accounts read with it.
Changed
- Firefox 140 or later. It is the first Firefox to ask you about the
data an add-on sends, which addons.mozilla.org requires; an earlier one
would install SignLens without asking. - A rating's version, in Firefox, only once you allow it. Firefox
asks, the first time you rate, whether a rating may carry the site and
SignLens's version, in one question; each goes only once allowed.
Checking the packages
signlens-extension-0.2.0.zip is the Chrome package and signlens-extension-firefox-0.2.0.zip the Firefox one. In the directory you downloaded them to, with their .sha256 files:
sha256sum -c signlens-extension-0.2.0.zip.sha256 signlens-extension-firefox-0.2.0.zip.sha256
gh attestation verify signlens-extension-0.2.0.zip --owner signlens
gh attestation verify signlens-extension-firefox-0.2.0.zip --owner signlensThe tag rebuilds to the same bytes: see Verifying a package.
What's Changed
- Jito example by @OBorce in #6
- feat(worker): read the accounts an explanation names and ask again by @OBorce in #7
- Firefox store by @OBorce in #8
Full Changelog: v0.1.0...v0.2.0
v0.1.0
The first public version: a Wallet Standard wallet without keys that
explains every signing request through the SignLens API and hands it to
the wallet you sign with; a window with the verdict, the effects and the
details; a feedback strip; TypeScript throughout, compiled file for file;
reproducible release packages for Chrome and Firefox. Nothing was released
before it, so everything below is new.
Added
- The wallet. "SignLens" registers as a Wallet Standard wallet in
every dapp. A dapp has to connect before it can ask for anything, and
asks one thing at a time per tab. In pass-through mode a request goes on
to the wallet you sign with (named in the settings, or the first one
found) only on your decision, or with "Show the explanation and ask
first" off when SignLens would not refuse it; anything else (no answer,
a closed or reloaded page, no decision in time) refuses it. A page that
goes stops the calls made for its request, and one it withdrew before
anything was shown is not kept. The connection holds when the wallet
behind SignLens drops its own, as jup.ag makes Backpack do whenever
another wallet is connected: SignLens takes it up again, silently,
before handing the wallet the next request, and ends the session only
if the wallet will not reconnect without asking. In watch-only mode it
connects as any address, explains, and refuses. - What the dapp gets. The wallet is handed SignLens's own copy of the
bytes it explained, taken when the dapp asked, whatever the page does
afterwards (writing into its array, a getter, a replaced built-in). The
page is told whether the request went on, was rejected by you, or was
refused by SignLens and why; never the verdict or the explanation, which
depend on your address book. The channel to the extension is a
MessageChannel the page cannot reach, through patched built-ins or
window.event. - Your addresses. The explanation calls "you" only addresses you gave
SignLens: the ones in the settings, or the watched one. A transaction
whose page names another as the one that signs it is not explained
until you say whether it is yours, in a window that shows it beside
yours, Reject first; "It's mine, add it" adds it to the settings. A
request naming more than one such address is refused, and so is one
with "Show the explanation and ask first" off, with no window. In
watch-only mode such a request is refused. - Watch-only consent. A site sees the watched address only once you
allow it, in a window of its own, once per site and address; a Deny
holds for that time only, a silent connect never asks, and the settings
list the sites and revoke them. - The explanation. Lookup tables and a simulation are read over your
RPC (legacy, v0 and v1 transactions), unlisted tokens are named from the
RPC and a token list, and the API's answer is checked field by field
before anything is shown: one that does not hold together, or a verdict
this version does not know, is an error, and a kind of effect or value
it does not know is shown as one. An API that did not answer, or
answered 502, 503 or 530, is asked once more after a short pause (its
Retry-After, at most two seconds) before the request counts as
unexplained; feedback is sent once. The window shows the verdict and the
summary first, each transaction of a request under its own heading,
what each does to you, and the instructions and the full text under
toggles; its title carries the verdict and the site. In pass-through
mode, blocked and error requests wait for you even with "Show the
explanation and ask first" off. No text from the API, the RPC or the page keeps a character that
hides or reorders what is around it (a right-to-left override, a
zero-width space): each shows as "?". A zero-width joiner stays only
between two characters that are not ASCII, as in an emoji sequence or
Persian and Indic text; beside ASCII it shows too. - The popup. The latest requests, with what became of each and why
SignLens refused one, the sites that asked to see the watched address,
and the settings. A connect that found no wallet to pass to is one row
per site, in SignLens's words, with the wallets the page named quoted.
The requests keep to about half of the browser's room
for the session, an answer too large without its full text, and give
way to a request waiting in a window when the browser runs short. The badge shows the worst verdict not seen yet,
ranked as the window ranks it. - Feedback. A strip under the explanation sends a rating and a
comment, once, one record per explained transaction with its digest,
the site's host (in Firefox only once you allow it: Firefox asks the
first time you rate, and its add-on manager changes the answer), the
wallet method, the extension's version and what the window showed (the verdict, the summary, the findings by code and
the program each instruction calls), and the transaction itself, with
the addresses its lookup tables loaded, only when you tick the box
that offers it, under every explanation, OK included. The strip says
what a rating sends before one is given. The record is the API's
signlens-feedback/2. - Endpoints. The API, the RPC and the token list must be https, or
plain http to localhost or 127.0.0.1; the worker checks again before
each call, and the popup says "Not used" of an address that breaks the
rule. Defaults are not copied into storage, so later defaults reach
everyone. - Accessibility, aiming at WCAG 2.2 AA; axe-core finds nothing in the
window, the consent and address windows or the popup, in either theme, and the
end-to-end suite runs it (e2e/axe.spec.ts):- every control is a button, tab or field with its own name, its hints
as its description; - focus stays where it was when lists change, and goes somewhere
sensible when what had it goes; - Escape rejects only when nothing nearer is open;
- text reads at 4.5:1 and a field's edge at 3:1 in both themes, held by
a test; - every window reflows to 320 pixels, and nothing
cuts off a focus ring; one too short for its header, the
explanation and the buttons at once (zoomed in) scrolls as one page.
- every control is a button, tab or field with its own name, its hints
- Packages and CI. A Firefox package, declaring the data it sends
(the site a rating carries as optional, asked for), built and released
with the Chrome one. CI runs the lint, the types, the
Node tests (in a random order) and the whole end-to-end suite on every
change, against the SignLens API's answers recorded under
test/fixtures/api/, and against the live API when one is configured,
where an answer that no longer holds what was recorded is a warning (a
release fails on it); in the tests the browser reaches no host but this
machine. CI also checks that the packages come out the same bytes on
Linux, macOS and Windows, and a release is published only when they do.
A release runs every test, the live API included, and carries a build
provenance attestation.
Checking the packages
signlens-extension-0.1.0.zip is the Chrome package and signlens-extension-firefox-0.1.0.zip the Firefox one. In the directory you downloaded them to, with their .sha256 files:
sha256sum -c signlens-extension-0.1.0.zip.sha256 signlens-extension-firefox-0.1.0.zip.sha256
gh attestation verify signlens-extension-0.1.0.zip --owner signlens
gh attestation verify signlens-extension-firefox-0.1.0.zip --owner signlensThe tag rebuilds to the same bytes: see Verifying a package.
What's Changed
- feat: a new icon, a hexagonal lens over a block, made from one drawing by @OBorce in #1
- Api json by @OBorce in #2
- fix: keep the session when the wallet behind SignLens drops its own by @OBorce in #3
- Feedback v2 by @OBorce in #4
- Release notes by @OBorce in #5
New Contributors
Full Changelog: https://github.com/signlens/signlens-extension/commits/v0.1.0