Skip to content

Releases

v0.3.3

Choose a tag to compare

@github-actions github-actions released this 08 Nov 16:15
Immutable release. Only release title and notes can be modified.
v0.3.3
6ade0ff

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 signlens

The 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

Full Changelog: v0.3.2...v0.3.3

v0.3.2

Choose a tag to compare

@github-actions github-actions released this 02 Nov 14:21
Immutable release. Only release title and notes can be modified.
v0.3.2
5ab3ff7

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 signlens

The tag rebuilds to the same bytes: see Verifying a package.

What's Changed

Full Changelog: v0.3.1...v0.3.2

v0.3.1

Choose a tag to compare

@github-actions github-actions released this 02 Nov 10:11
Immutable release. Only release title and notes can be modified.
v0.3.1
14efe94

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 signlens

The 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

Choose a tag to compare

@github-actions github-actions released this 31 Oct 21:22
Immutable release. Only release title and notes can be modified.
v0.3.0
e85d3c1

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...

Read more

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 25 Oct 17:37
v0.2.0
af54d72

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 signlens

The 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

Choose a tag to compare

@github-actions github-actions released this 24 Oct 15:48
v0.1.0
753ddf4

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.
  • 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 signlens

The 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

  • @OBorce made their first contribution in #1

Full Changelog: https://github.com/signlens/signlens-extension/commits/v0.1.0