> For the complete documentation index, see [llms.txt](https://docs.qms.finance/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.qms.finance/for-developers/tools-and-wallets.md).

# Tools and wallets

QMS runs a standard Ethereum execution client, so the tooling you already use works once it is pointed at the QMS RPC endpoint and chain ID `19480`. This page has the configuration each wallet, framework, and library needs, along with the contracts and services already deployed for them to talk to. A tool that is not listed here most likely works too.

## Predeployed contracts

The infrastructure contracts that EVM tooling assumes are already deployed, at the same addresses they use on other chains. Nothing needs configuring to reach them.

| Contract                                      | Address                                      | Relied on by                                                                                     |
| --------------------------------------------- | -------------------------------------------- | ------------------------------------------------------------------------------------------------ |
| Multicall3                                    | `0xcA11bde05977b3631167028862bE2a173976CA11` | batched reads: viem's `multicall`, wagmi's `useReadContracts`, and most explorers and dashboards |
| CREATE2 deployer                              | `0x4e59b44847b379578588920cA78FbF26c0B4956C` | deterministic addresses: `forge create --create2` and Foundry deployment scripts                 |
| [Permit2](https://github.com/Uniswap/permit2) | `0x000000000022D473030F116dDEE9F6B43aC78BA3` | signature-based ERC-20 approvals, and the routers and aggregators built on them                  |

## Wallets

* Any wallet that supports custom networks, for example MetaMask, Rabby, or OKX Wallet. Add QMS Testnet with the values on [Add QMS Network](/onboarding/add-qms-network.md).
* A Ledger or Trezor connects through wallet software that supports custom networks. MetaMask, Rabby, and others let you pair the device and then add QMS Testnet as a network.

## Development frameworks

* [**Foundry**](https://getfoundry.sh): `forge`, `cast`, and `anvil` work against the QMS RPC endpoint. `cast chain-id --rpc-url https://rpc.testnet.qms.finance` returns `19480`.
* [**Hardhat**](https://hardhat.org): add a network entry with the QMS RPC URL and chain ID; see [Deploy a smart contract](/for-developers/deploy-a-smart-contract.md).
* [**Remix**](https://remix.ethereum.org): choose **Injected Provider** as the environment and select QMS Testnet in your wallet. Remix then compiles in the browser and deploys through the wallet.

## Libraries

{% tabs %}
{% tab title="viem" %}
Define the chain once, in a file you import wherever a chain is expected.

```ts
// chains.ts
import { defineChain } from "viem";

export const qmsTestnet = defineChain({
  id: 19480,
  name: "QMS Testnet",
  nativeCurrency: { name: "QMS", symbol: "QMS", decimals: 18 },
  rpcUrls: { default: { http: ["https://rpc.testnet.qms.finance"] } },
  blockExplorers: { default: { name: "QMSScan", url: "https://testnet.qmsscan.io" } },
  testnet: true,
});
```

Then read from the chain with a public client:

```ts
import { createPublicClient, http } from "viem";
import { qmsTestnet } from "./chains";

const client = createPublicClient({ chain: qmsTestnet, transport: http() });
await client.getBlockNumber();
```

{% endtab %}

{% tab title="wagmi" %}
wagmi takes the same chain object, defined as in the **viem** tab.

```ts
import { createConfig, http } from "wagmi";
import { injected } from "wagmi/connectors";
import { qmsTestnet } from "./chains";

export const config = createConfig({
  chains: [qmsTestnet],
  connectors: [injected()],
  transports: { [qmsTestnet.id]: http() },
});
```

Pass `config` to `WagmiProvider`, and the hooks (`useAccount`, `useReadContract`, `useWriteContract`) work against QMS Testnet with no further changes.
{% endtab %}

{% tab title="ethers" %}
Name the network explicitly so ethers does not have to look up the chain ID.

```ts
import { JsonRpcProvider, Wallet } from "ethers";

const provider = new JsonRpcProvider("https://rpc.testnet.qms.finance", {
  chainId: 19480,
  name: "qms-testnet",
});

const wallet = new Wallet(process.env.PRIVATE_KEY, provider);
```

{% endtab %}
{% endtabs %}

## Infrastructure

* **Block explorer**: <https://testnet.qmsscan.io>, a modified Blockscout that also shows, for each block, the QUBO instance that was solved and the winning solution
* **Faucet**: <https://faucet.testnet.qms.finance>
* **Status page**: <https://status.testnet.qms.finance>
* **RPC**: the public endpoint on [Network and RPC](/for-developers/network-and-rpc.md). There are no third-party providers yet.
