=== EthPress - Web3 Login ===
Contributors: lynn999, ethereumicoio
Donate link: https://etherscan.io/address/0x106417f7265e15c1aae52f76809f171578e982a9
Tags: metamask, ethereum, cryptocurrency, walletconnect, NFT
Requires at least: 6.0
Tested up to: 7.1
Stable tag: 3.2.2
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Requires PHP: 8.1

EthPress Web3 Login Wordpress Plugin adds the capability to connect with cryptocurrency wallets such as MetaMask or Reown QR code.

== Description ==

The EthPress Web3 Login Wordpress Plugin adds a capability to connect with cryptocurrency wallets such as [MetaMask](https://metamask.io) for Ethereum, Binance Smart Chain (BSC), Polygon (MATIC) or any other EVM-compatible blockchain, and wallets that support [Reown](https://reown.com/) QR code. Adds a button to WordPress login screen that will let users securely log in with their crypto wallet.

https://youtu.be/0a8lWF6uHPA

Add the capability to log in with cryptocurrency wallets such as [MetaMask](https://metamask.io) for Ethereum, and wallets that support Reown QR code. Adds a button to WordPress login screen that will let users securely log in with their crypto wallet.

In the background, a regular WordPress user account is created, so existing plugins and customizations will have no problem working along.

> The [EthPress NFT Access Add-On](https://ethereumico.io/product/nft-authentication-nft-access-control-wordpress-plugin/) can be used to control access for [WooCommerce](https://woocommerce.com/?aff=12943&cid=17113767) products, simple pages and posts.

== Supported Languages ==

The plugin is translated into the following languages:

* German (de_DE)
* Spanish (es_ES)
* French (fr_FR)
* Hindi (hi_IN)
* Italian (it_IT)
* Japanese (ja_JP)
* Portuguese (Brazil) (pt_BR)
* Portuguese (pt_PT)
* Russian (ru_RU)
* Chinese (Simplified) (zh_CN)
* Chinese (Traditional) (zh_TW)

== Features ==

* A web3 login button is added to your login screen automatically
* The `Reown Settings` section holds your own `Reown Project ID` (from [dashboard.reown.com](https://dashboard.reown.com)) and the wallet modal `Theme Mode` (`Dark Mode` or `Light Mode`)
* The `Hide on the WordPress login page` setting can hide the wallet login and register buttons on `wp-login.php`, while buttons added with the shortcodes or the widget keep working
* The `Terms & Conditions` settings (in Login Settings) show a required "I agree to the Terms & Conditions" checkbox next to the wallet login button. The text can link to a Terms & Conditions page URL
* A wallet without an account gets a message explaining why: the site does not accept registrations (the `Anyone can register` setting) and the visitor should contact the site administrator. The wording is filterable with `ethpress_registration_closed_message` and `ethpress_unregistered_message`
* Use the EthPress widget for maximum ease
* A shortcode [ethpress_login_button] can be used to display the Login button anywhere
* A shortcode [ethpress_link_button] can be used to display the Link accounts button anywhere. The new account linked address will be put in all HTML elements with the `eth-address-field` class present.
* Local signature verification with the `php-gmp`/`php-bcmath` extensions, or by a verification service you can [host yourself](https://gitlab.com/losnappas/verify-eth-signature). The `Diagnostics` section of the plugin settings tells you which of the two is in use
* The `Diagnostics` section of the plugin settings reports what a wallet login depends on: the PHP signature support (`php-gmp`/`php-bcmath`) of your server, a signature self-test that runs through whichever path the logins actually take (this server or the verification service), the verification service that would be used instead, whether your own Reown Project ID is set, and whether new wallets can still register

== Features PRO ==

> The [EthPress PRO](https://ethereumico.io/product/web3-login-wordpress-ethpress-plugin/) version is required to use these features. [Free 7 days Trial](https://checkout.freemius.com/mode/dialog/plugin/9248/plan/15558/?trial=paid) is available!

* Managed Verification Service. 
* EthPress login button on a [WooCommerce](https://woocommerce.com/?aff=12943&cid=17113767) Login, Register and Checkout Forms.
* An `EthPress Button` field for the [Ultimate Member](https://wordpress.org/plugins/ultimate-member/) plugin: it shows the wallet address of the current user and the wallet button inside Ultimate Member's login, registration and profile forms (see the "Integrations" section)
* The [ethpress_account] short code can be used to display the current user’s address logged with.
* A shortcode [ethpress_unlink_button] can be used to display the Unlink wallet button anywhere. It removes the wallet association and disconnects the connected wallet. The account itself is kept, so signing in with the same wallet again links it back to that account instead of creating a second one (see the "What happens to the account when a wallet is unlinked?" question)
* The `Login button label`, `Register button label`, `Link button label` and `Unlink button label` settings can be changed in the plugin settings
* The `The login signing message` and `The account link signing message` settings can be used to change the message a user signs in the wallet when logging in or linking an account
* The `The account link success message` and `The account unlink message` settings can be used to change the messages shown after a wallet is linked or unlinked
* WooCommerce Account Details show Link Wallet button setting
* The `Redirect URL` setting can be used to set an URL of a page to redirect after a successful login
* The `Disable standard redirect` setting (in Login Settings) stops the automatic redirect to the WordPress dashboard or the configured `Redirect URL` after a successful login, returning the user to the page where the login started instead
* The `Remember me` setting (in Login Settings) controls whether wallet users stay logged in across browser restarts instead of having to connect their wallet on every visit. It is enabled by default and can be changed in PRO only
* The `Profile completion` setting (in Login Settings) collects the email and name of new wallet users. The `Inline form next to the login button` mode shows the fields with the button, so they are filled in before the account is created; the `Redirect to the profile after login` mode sends users who registered without an email address to their profile after the first login
* The `Supported networks` setting (in Reown Settings) chooses which networks are offered to the user: the EVM chains and testnets, and - in PRO - the non-EVM ones (Solana, TRON, Bitcoin, TON). A network is only offered when this installation can verify its signatures
* **An account can carry several wallets** (PRO). A visitor logs in with any of them, and the `[ethpress_wallets]` shortcode lists them all; `[ethpress_account]` shows the wallet this session was opened with. Unlinking removes only the wallet it was clicked for, and it is never possible to attach somebody else's wallet
* **Non-EVM chains** (PRO): Solana, TRON, Bitcoin (P2PKH, P2WPKH and taproot/BIP-322) and TON (`ton_proof`) wallets log in to the same WordPress account as an EVM wallet. Each chain's signature is verified on your own server - the crypto stack is bundled, no external service is needed
* TON has a button of its own next to the login button: `Log in with TON`. The TonConnect SDK is what asks a TON wallet for a `ton_proof`, because AppKit does not request one on connect; the button appears only when TON is enabled in the settings and a TON wallet is installed
* The `Custom CSS` setting (in Reown Settings) can style the login buttons and the wallet modal, including the AppKit CSS variables such as `--w3m-accent`
* The `noredirect` and `redirect_to` attributes of the `[ethpress_login_button]` shortcode control the redirect per button. `[ethpress_login_button noredirect="1"]` disables the standard redirect for that button, and `redirect_to="current"` returns the user to the page where the login started. Any other value of `redirect_to` is used as an explicit redirect URL
* The `label` attribute of the `[ethpress_login_button]`, `[ethpress_link_button]` and `[ethpress_unlink_button]` shortcodes changes the button text for that button only, for example `[ethpress_login_button label="Sign in"]`

> The [NFT](https://ethereumico.io/product/nft-wordpress-plugin/) Token based access control for the [WooCommerce](https://woocommerce.com/?aff=12943&cid=17113767) products, simple pages and posts can be done with the [EthPress NFT Access Add-On](https://ethereumico.io/product/nft-authentication-nft-access-control-wordpress-plugin/). [Free 7 days Trial](https://checkout.freemius.com/mode/dialog/plugin/10731/plan/18172/?trial=paid) is available!

= Integrations =

* **[Ultimate Member](https://wordpress.org/plugins/ultimate-member/) (Professional).** EthPress adds a field of its own to Ultimate Member's field registry - `EthPress Button`, a "Blockchain Address" field type saved as the `eth_blockchain_address` user meta - so it can be placed in any Ultimate Member form: login, registration or profile, in the form builder. Everywhere it is placed, the field renders the wallet address of the current user as a read-only input next to the wallet button. A visitor who is not signed in sees the button and an empty address; a signed-in wallet user sees the address of the wallet this session was opened with, and on the profile form the same field lets them link another wallet to the account. The field has two settings of its own in Ultimate Member's field editor, `Show EthPress button?` and the button label, so a form can carry the address without the button or with a button text of its own. The integration belongs to the Professional build: in the Free version Ultimate Member keeps working as usual, the `EthPress Button` field is simply not in its field list
* **[WooCommerce](https://woocommerce.com/?aff=12943&cid=17113767) (Professional).** The wallet button is placed on three WooCommerce screens - the `My Account` login form, the register form (only when the site allows registration), and the "create an account" block at checkout - and the link button on a fourth, `Account details`, where a signed-in customer links another wallet to the account. Each of the four is a separate checkbox under `WooCommerce Settings` in the plugin settings, and while a box is unticked, or WooCommerce is not active, the matching hooks are not registered at all, so a site that does not use the integration runs no extra code. The email address and the name the customer typed into WooCommerce are handed to the account a wallet login creates (`ethpress_register_user_email` and `ethpress_register_user_name`), so a wallet registration made at checkout keeps the billing details instead of falling back to the placeholder email derived from the wallet address

== EthPress NFT Access Add-On Features ==

Check user NFT authentication control (non-fungible token, erc-721 and erc-1155) ownership. 
The [EthPress NFT Access Add-On](https://ethereumico.io/product/nft-authentication-nft-access-control-wordpress-plugin/) is perfect for blocking users access to a Page, a Post and a [WooCommerce](https://woocommerce.com/?aff=12943&cid=17113767) Product page, if they don’t own a certain NFT token.

> Free 7 days [Trial](https://checkout.freemius.com/mode/dialog/plugin/10731/plan/18172/?trial=paid) is available

* Site wide NFT verification requirement to register or login
* Restrict access to a `Page` to some NFT token owners only
* Restrict access to a `Post` to some NFT token owners only
* Restrict access to a [WooCommerce](https://woocommerce.com/?aff=12943&cid=17113767) `Product` to some NFT token owners only
* Shortcode to display your access level: [ethpress_nft_access_addon_nft product_id="1337"]
* `ERC721` and `ERC1155` non-fungible token standards are supported

= Integrations =

* [LearnPress LMS](https://wordpress.org/plugins/learnpress/) courses access can be granted with NFT token
* [Tutor LMS](https://wordpress.org/plugins/tutor/) courses access can be granted with NFT token
* [Ethereum Wallet](https://wordpress.org/plugins/ethereum-wallet/) plugin generated accounts are also tested
* The `ethpress_nft_access_get_user_accounts` filter can be used to add wallets for testing:

`
    add_filter('ethpress_nft_access_get_user_accounts', function($accounts) {
        $more_accounts = get_more_accounts();
        return array_merge($accounts, $more_accounts);
    });
`

== Disclaimer ==

**By using this free plugin you accept all responsibility for handling the account balances for all your users.**

Under no circumstances is **ethereumico.io** or any of its affiliates responsible for any damages incurred by the use of this plugin.

Every effort has been made to harden the security of this plugin, but its safe operation depends on your site being secure overall. You, the site administrator, must take all necessary precautions to secure your WordPress installation before you connect it to any live wallets.

You are strongly advised to take the following actions (at a minimum):

- [Educate yourself about cold and hot cryptocurrency storage](https://en.bitcoin.it/wiki/Cold_storage)
- Obtain hardware wallet to store your coins
- [Educate yourself about hardening WordPress security](https://codex.wordpress.org/Hardening_WordPress)
- [Install a security plugin such as Jetpack](https://jetpack.com/pricing/?aff=9181&cid=886903) or any other security plugin
- **Enable SSL on your site** if you have not already done so.

> By continuing to use the EthPress plugin, you indicate that you have understood and agreed to this disclaimer.

== Installation ==

Use WordPress' Add New Plugin feature, search "EthPress",

or

1. Upload this folder (on WordPress.org, not GitLab) to the `/wp-content/plugins/` directory
1. Activate the plugin through the 'Plugins' menu in WordPress

== Frequently Asked Questions ==

= Can NFT token ownerhip restriction be applied? =

The [NFT](https://ethereumico.io/product/nft-wordpress-plugin/) Token based access control for the [WooCommerce](https://woocommerce.com/?aff=12943&cid=17113767) products, simple pages and posts can be done with the [EthPress NFT Access Add-On](https://ethereumico.io/product/nft-authentication-nft-access-control-wordpress-plugin/). [Free 7 days Trial](https://checkout.freemius.com/mode/dialog/plugin/10731/plan/18172/?trial=paid) is available!

= The modal classes keep changing =

The wallet modal is drawn by Reown AppKit inside a shadow root, so page CSS and class selectors cannot reach it at all (the old `#web3-login-root` element and its per-build `svelte-*` classes are gone). Style it with the `Custom CSS` setting (PRO, in Reown Settings) and the AppKit CSS variables such as `--w3m-accent`.

= How does it work? =

The outline is described in [this TopTal post by Amaury Martiny](https://www.toptal.com/ethereum/one-click-login-flows-a-metamask-tutorial).

A one-time nonce is stored for the wallet address and consumed when the signature is verified, so a signed message cannot be replayed. Its lifetime is 15 minutes by default and can be changed with the `ethpress_nonce_lifetime` filter. The IP the message was requested from is stored with it for troubleshooting, but it is not part of the check, because a mobile wallet can switch networks between requesting the message and signing it.

For more details, check out [the extra readme](https://gitlab.com/losnappas/ethpress/-/blob/master/README-EXTRA.md#so-how-does-it-verify-a-user).

= Signature verification =

When user submits a signature, it needs to be verified on server-side.

Read the "How does it work?" question.

Firstly, if you have the `php-gmp` or `php-bcmath` extension installed, we do it with PHP, and you can ignore the rest of this. The `Diagnostics` section of the EthPress settings page proves it with a known message and signature.

Otherwise the verification is done by a verification service. [EthPress PRO](https://checkout.freemius.com/mode/dialog/plugin/9248/plan/15558/) comes configured with a Managed Verification Service. You can also host that service yourself and set its URL in the `Verification Service API URL` setting; its source code is here: [https://gitlab.com/losnappas/verify-eth-signature](https://gitlab.com/losnappas/verify-eth-signature).

= Are my coins safe? =

Yes. A wallet (e.g. MetaMask) does/should not leak your private keys out into the wild, that would be madness.

= What about mobile? =

Mobile integration is in good condition, with Reown QR code reading from wallets such as MetaMask Mobile, there is very little friction!

= What happens to the account when a wallet is unlinked? =

Unlinking is a soft detach: only the association is removed, the WordPress account stays.

* The `ethpress` user meta of the account is deleted, so the wallet no longer resolves to it: `[ethpress_account]`, the `eth-address-field` elements and the unlink button show nothing until a wallet is linked again.
* A user who signed in with the wallet as their login name is logged out, because the wallet was their only way in. A regular WordPress user (who linked a wallet to an existing account) stays logged in.
* The account itself is not deleted, and neither is its login name. For wallet users the login name is the wallet address, so signing in again with the **same** wallet finds that account through it and links the address back to it. This is why a freshly unlinked wallet does not get a second account, and why an unlinked wallet cannot be used to register a new one.
* Unlinking from the account page and then signing in with the same wallet therefore ends up in the same account, with the wallet linked again.

To dissociate them for good, delete the WordPress user as well (Users > All Users). Deleting a user removes their wallet address with them.

= GDPR? =

This is everything EthPress keeps on your server for a wallet:

* the wallet address, as the `ethpress` user meta of the WordPress user the wallet is linked to. Unlinking the wallet deletes that meta; the user account itself and its login name (the address) stay until the account is deleted;
* the WordPress user account itself: its login name and its display name are the wallet address, and its email is a placeholder derived from that address - unless the visitor typed a real email and name, which the registration form, the WooCommerce checkout or the `Inline form next to the login button` mode collect;
* two flags on that user, `ethpress_generated_email` and `ethpress_profile_incomplete`, which let the plugin replace the placeholder email with a real one;
* the one-time login nonce: a transient keyed by the wallet address that also records the IP the login message was requested from. The IP is kept for troubleshooting only and is never checked. The nonce is deleted as soon as the signature is verified, and expires after 15 minutes at the latest;
* debugging lines, when the plugin writes them (a failed verification, or any login verified by the service). They go to the WooCommerce log file, `wp-content/uploads/wc-logs/ethpress-*.log`, or to the PHP error log when WooCommerce is not installed, and they contain the wallet address, the message that was signed and its signature. Clear those files when the addresses have to be gone.

Nothing is sent anywhere, with two exceptions:

* the verification service, when it is the one verifying the signatures on your site (see the "Signature verification" question). Only the message and the signature are posted; the wallet address is recovered from the signature there, not sent. The default (managed) service is hosted on [ethereumico.io](https://ethereumico.io/) and stores nothing, and you can host that service yourself instead.
* opening the wallet modal talks to Reown: its API provides the wallet list, and mobile wallets are connected through the WalletConnect relay. EthPress itself sends neither the signature nor the wallet address there.

Deleting a user deletes their wallet address with them. Removing the plugin deletes the plugin settings, but the wallet addresses stay in `wp_usermeta` until those users are deleted themselves - search for the `ethpress` meta key if you need to remove them by hand.

Check the `Diagnostics` section of the EthPress settings page to see which verification path your site uses.

= Source code and contributing =

Contributions on GitLab only, thank you.

Plugin's source code: [https://gitlab.com/losnappas/ethpress](https://gitlab.com/losnappas/ethpress).

Signature verifier's, which is used if no *php-gmp* or *php-bcmath*, source code: [https://gitlab.com/losnappas/verify-eth-signature](https://gitlab.com/losnappas/verify-eth-signature).

The wallet modal is a React component built on the [Reown AppKit](https://reown.com/) library. Its source code is part of the plugin repository, in the `reown/` directory: [https://gitlab.com/losnappas/ethpress](https://gitlab.com/losnappas/ethpress).

= Further support =

On the wordpress.org support page, or on the [ethereumico.io support forum](https://ethereumico.io/support/).

== Screenshots ==

1. The wallet login button on the WordPress login screen.
2. The `[ethpress_login_button]` shortcode, so the login can live on any page.
3. The wallet modal: the visitor picks a wallet, the site never sees a password.
4. The required Terms & Conditions checkbox next to the login button.
5. Reown Settings: your own project ID and the networks offered to visitors.
6. Diagnostics: what a wallet login depends on, checked on this server.
7. (Professional) Every chain in one wallet modal: EVM, Solana, TRON, Bitcoin and TON.
8. (Professional) Supported networks, including the non-EVM chains.
9. (Professional) Login networks, modal appearance, wallet list source and custom CSS.
10. (Professional) Login Settings: profile completion, remember me and the login redirect.
11. (Professional) One account, several wallets: the `[ethpress_wallets]` shortcode.
12. (Professional) The inline profile form next to the button, so an email is collected before the account exists.
13. (Professional) Email and social login in the wallet modal: the site's Reown project enables the rows, and the Professional edition verifies the embedded wallet.
14. (Professional) WooCommerce: the wallet buttons on the shop's own login and register forms of the `My Account` page.
15. (Professional) Ultimate Member: the wallet login button inside an Ultimate Member login form.

== Hooks ==

The full list of the plugin actions and filters is documented in the
[extra readme](https://ethereumico.io/knowledge-base/ethpress-web3-login-wordpress-plugin-hooks/).

> The [EthPress PRO](https://ethereumico.io/product/web3-login-wordpress-ethpress-plugin/) version is required to use the PRO hooks. [Free 7 days Trial](https://checkout.freemius.com/mode/dialog/plugin/9248/plan/15558/?trial=paid) is available!

== Changelog ==

= 3.2.2 =

* The wallet login button, the profile fields it shows inline and the Terms checkbox now take their look from the page's theme instead of being drawn like a WordPress admin control: on an ordinary page the button is drawn the way the theme draws its own buttons - its font, its colours, its border and radius - and the email, name and Terms controls next to it inherit the theme's font and spacing. A theme that styles no buttons of its own gets a plain outlined button in the current text colour
* The plugin no longer injects a page-wide CSS reset into a page that shows the button: the page keeps its own body font, its own link underlines and its own element margins and spacing, instead of being flattened to the plugin's Arial body and collapsed paragraph rhythm
* The new `ethpress_button_surface` filter lets a site say itself which surface the button is rendered on, so an integration the plugin does not know can name its own host instead of relying on the surface the plugin detected
* The WordPress login screen keeps its admin-style button, and the WooCommerce and Ultimate Member forms keep the look of the plugin whose form they stand in - only a page that has a theme of its own changes

= 3.2.1 =

* Fixed the wallet button inside an **Ultimate Member** form: it was drawn inside a second button - the field opened its `um-field` wrapper twice, so the button sat in a duplicate div - and it did not look like the form it stood in. It now carries Ultimate Member's own secondary-button class, the one the form's "Register" button is drawn with, and the button the plugin mounts inside it no longer paints a frame of its own, so the visitor sees one button that matches its neighbours in colour, size and hover
* Fixed the wallet button inside a **WooCommerce** form: it is drawn by the theme now, like the form's own "Log In" and "Register" buttons, instead of the small grey admin-style button the plugin uses where the page has no styling of its own. The fix applies to the login, registration, checkout-registration and account-details screens alike

= 3.2.0 =

* Email and social login are back in the **Professional** edition: the plugin no longer hides the "Email" and "Continue with Google" rows there, so the wallet modal offers what the site's Reown project enables. An embedded wallet signs with ERC-1271/ERC-6492, which the Professional edition verifies - that check asks the site's JSON-RPC endpoint (`ethpress_evm_rpc_url`), so a contract-account login needs a reachable endpoint you trust. Ordinary wallets are not affected by that requirement. The **Free** edition keeps both rows hidden, because the ERC-1271/ERC-6492 verification is Professional and a row offered there could only end in a failed login; the plugin sets that itself and a Free site cannot turn the rows back on. On Professional an operator can still force them off with the `hide_email_social` inline key (see the extra readme)
* Linking a second wallet no longer renames the account: the user name stays the address of the **first** wallet the account was registered with. WordPress keeps the user name inside the authentication cookie, so renaming the account used to log out every other session of it (another browser, a phone); those sessions now keep working. The display name and the profile slug still follow the newest wallet
* Accounts that were renamed by linking a wallet in an earlier version keep their current user name - nothing depends on it, so no data is migrated
* Bitcoin wallets that sign in the BIP-322 `full` variant, or with a DER signature accompanied by their public key, now log in (PRO). Previously such a signature was rejected: the plugin understood only the 65-byte BIP-137 compact form and the BIP-322 `simple` form, so a Wallet Standard wallet ended in "Bad signature." after the visitor had approved the prompt
* Smart account login (PRO): an account that is a contract - Safe, Argent, a wallet embedded by a provider - can now log in by answering ERC-1271, and an account that is not deployed yet by ERC-6492. The check asks the chain through a JSON-RPC endpoint, so that endpoint becomes the source of truth for it; point it at your own node with the `ethpress_evm_rpc_url` filter. The new `ethpress_evm_chain_id`, `ethpress_rpc_timeout` and `ethpress_erc6492_validator` filters are documented in the extra readme
* The `Supported networks` setting now offers **VeChain** (PRO). VeChain addresses are derived the same way Ethereum addresses are, so the existing EVM signature check verifies the login. Only wallets that sign an EIP-191 `personal_sign` message are covered - VeChain's own Certificate signature is not supported yet

= 3.1.0 =

* Multichain login (PRO): besides the EVM chains, a visitor can log in with a **Solana**, **TRON**, **Bitcoin** or **TON** wallet. Each chain has its own signature verifier bundled with the plugin, so the checks run on your server and need no external service
* Bitcoin: P2PKH and P2WPKH are verified with BIP-137, taproot (`bc1p…`) addresses with BIP-322
* TON: the wallet signs a `ton_proof` (domain + timestamp + payload) instead of a text message. The payload is one-time, tied to the login message and expires in 5 minutes
* Every chain is now chosen in the wallet modal, so the login stays one button: TronLink and Leather are listed like any other wallet, and TON is a "TON" row that opens the wallet's own connect window (a `ton_proof` can only be asked for while connecting). The separate `Log in with TronLink` / `Log in with Leather` / `Log in with TON` buttons and the `Also show the per-chain buttons` setting are removed
* A wallet on a phone logs in through the same modal: TRON gets a QR code the plugin draws itself (AppKit has no TRON WalletConnect option of its own), and Bitcoin uses AppKit's
* The new `Wallet list` setting (Reown Settings, PRO) decides where the modal takes its list from. `Reown catalogue` (default, the only option in the free version) keeps the list up to date without a plugin release; `This plugin only` builds it from the wallets installed in the browser plus a built-in list of mobile wallets, sends no analytics, and - with `Block AppKit's cloud` on - returns a `Content-Security-Policy: connect-src` header that stops the page from reaching `api.web3modal.org`. WalletConnect (a phone wallet, QR code) works in both modes
* An account can carry **several wallets** (PRO): log in with any of them, and the new `[ethpress_wallets]` shortcode lists them. Unlinking removes only the wallet it was clicked for, with a confirmation. Attaching an address that belongs to another account is refused
* The `Supported networks` setting now offers the non-EVM chains as well (PRO): `Solana`, `TRON`, `Bitcoin` (mainnet, testnet, signet), `TON` (mainnet, testnet) and the test networks
* The `ethpress_login_namespaces`, `ethpress_signature_verifiers`, `ethpress_address_types`, `ethpress_verify_signature`, `ethpress_networks`, `ethpress_ton_manifest_url`, `ethpress_ton_proof_domain`, `ethpress_ton_payload_lifetime` and `ethpress_remote_non_evm_verification` filters are added for add-ons
* The `Diagnostics` section warns when the `php-sodium` extension is missing: ed25519 signatures (Solana and TON) are then checked by the bundled pure-PHP implementation, which works but is slower
* A wallet user's address is printed in full everywhere the EVM address used to be (profile, `[ethpress_account]`, `[ethpress_wallets]`, address fields); only the generated user name is shortened
* The wallet modal no longer downloads a webfont from a third-party domain: it renders in the visitor's system UI font, so a page with a login button makes no request to `fonts.reown.com` and preloads no font files
* The new `Modal appearance` setting (Reown Settings, PRO) can make the wallet modal follow your theme: its font, its accent colour and its corner radius. Only values that cannot break the layout are taken over - a light accent that would leave the button unreadable is ignored, and the radius is capped

= 3.0.0 =

* The login modal is rewritten on Reown AppKit (the successor of WalletConnect v2). The old web3modal based front end is removed
* The new `Reown` settings section is added: `Reown Project ID`, `Theme mode` and `Supported networks`
* Multichain support: the new `Supported networks` setting lets you choose which networks are offered to users - the EVM chains (Ethereum, Polygon, Arbitrum, Optimism, Base, BNB Smart Chain, Avalanche, Fantom, Gnosis, zkSync, Linea, Scroll, Celo, Polygon zkEVM, Mantle, Blast, Cronos, Moonbeam) and testnets
* Multisite support: the plugin options are now stored network wide
* The `[ethpress_unlink_button]` shortcode is added to display the Unlink wallet button anywhere. Unlinking removes the wallet association and keeps the account: signing in again with the same wallet links it back to that account, and the wallet cannot be used to register a second one
* A confirmation message is shown to the user after the account is linked
* The Freemius SDK is updated and bundled via Composer
* `olegabr/keccak` is replaced with `kornrunner/keccak`
* Requires PHP 8.1
* The `Disable standard redirect` login setting is added. When enabled, a successful login no longer redirects to the WordPress dashboard or the `Redirect URL`, but returns the user to the page where the login started
* The `noredirect` and `redirect_to` attributes are added to the `[ethpress_login_button]` shortcode, so the redirect can be controlled per button
* The `label` attribute is added to the `[ethpress_login_button]`, `[ethpress_link_button]` and `[ethpress_unlink_button]` shortcodes, so the button text can be changed per button (PRO)
* The `Remember me` login setting is added. Wallet users now stay logged in across browser restarts instead of having to connect their wallet on every visit. The Free version always keeps it enabled
* Wallet users are now registered with an email address, collected from the login form, the WooCommerce checkout, or a placeholder derived from the wallet address, so their profile is editable
* The `Profile completion` login setting is added. When enabled (PRO), new wallet users who registered without an email address are sent to their profile after the first login to add an email and a name. It also has an `Inline form next to the login button` mode, which collects the email and name before the account is created. The values are remembered for the current browser tab, so a reload does not lose them
* The `Hide on the WordPress login page` setting is added. When enabled, the wallet login and register buttons are not displayed on wp-login.php. Buttons added with the shortcodes or the widget are not affected
* The `Custom CSS` setting is added (PRO). It styles the login buttons and the wallet modal
* The `Terms & Conditions text` and `Terms & Conditions URL` login settings are added. They show a required "I agree to the Terms & Conditions" checkbox next to the wallet login button; the text links to the given URL when set. The login is blocked until the box is ticked, and the acceptance is checked on the server as well
* The `Diagnostics` section is added to the plugin settings. It answers the "why does nothing work here" questions without support: whether `php-gmp`/`php-bcmath` verify signatures on this server, whether a known message and signature really recover the expected address (checked with this server, or with the verification service when that is the path the logins take), which verification service is used instead, whether your own Reown Project ID is set, and whether new wallets can create an account
* A signature verification that is done by the verification service now fails cleanly when the service is unreachable, if your site blocks outbound requests, or when it answers with an HTML error page or a different JSON shape. Such answers used to raise PHP warnings inside the login request instead of a normal "failed to verify" error. The signature self-test in the `Diagnostics` section reports exactly that: it probes the service when the service is the path the logins take, and it waits at most 5 seconds
* The `[ethpress_login_button]` shortcode no longer prints nothing for a logged-in visitor. It prints a hint explaining that the button is hidden because the user is already logged in (`notice="1"` forces it for every visitor, `notice="0"` switches it off); site owners see the hint by default
* A wallet without an account is no longer answered with the bare "You have not registered on this site; we cannot log you in". When the site does not accept registrations (the default), the message now says so, names the `Anyone can register` setting and tells the visitor to contact the site administrator - something they can forward as is. Both messages are filterable with `ethpress_registration_closed_message` and `ethpress_unregistered_message`
* Fixed wallet login on sites where another active plugin (for example BuddyPress) prints output, or renders a login form, while the login request is being processed. Such output used to be prepended to the AJAX response, which broke it with the `Unexpected token < in JSON at position 0` error and left the user logged in on the server but not in the browser
* A malformed signature that cannot be recovered no longer returns an HTTP 500 error page. The failure is caught and reported as a regular JSON error response
* Fixed the renewed AJAX nonces that a successful login returns in its response. They were created for a session token that the browser did not have yet, so using them right after logging in failed with `Bad nonce, please refresh`. The renewed nonces are now valid on the session the login just created
* Wallet login with Bitcoin addresses (PRO). P2PKH (`1…`) and P2WPKH (`bc1q…`) are verified as BIP-137 signed messages; taproot (`bc1p…`) is verified as a BIP-322 `simple` signature, which is the scheme taproot wallets sign with, since BIP-137 is not defined for them
* Wallet login nonces are now one-time. The nonce is issued when the login message is requested and consumed when the signature is verified, so a signed message cannot be replayed. Its lifetime is configurable with the `ethpress_nonce_lifetime` filter (15 minutes by default) instead of the fixed five minutes, and it no longer depends on the session token, which fixes `Bad nonce, please refresh` on slow mobile wallet flows
