# Personal pay links

> Get paid from any chain and token at layerhop.com/to/<name>, with your ENS name, .sol name or address, in the token and chain you choose with the com.layerhop.receive ENS text record.

Source: https://docs.layerhop.com/guides/pay-links

A personal pay link is a page anyone can use to pay you: `https://layerhop.com/to/<name>`. The payer connects any EVM or Solana wallet and pays with whatever they hold, on any chain; you receive your preferred token on your preferred chain. It is a normal LayerHop swap with you as the recipient, so the payer sees every fee before signing and LayerHop never holds the funds.

Make yours at [layerhop.com/to](https://layerhop.com/to): it builds the link, a QR code and, for ENS names, the text record to set.

## What can `<name>` be?

| `<name>` | Example | Who gets paid |
| --- | --- | --- |
| ENS name | `/to/alice.eth` | The name's address for the chain you receive on (see below); its Solana address record for a Solana preference. |
| `.sol` name | `/to/alice.sol` | The wallet that owns the name on Solana (SNS). Names held by a program, such as tokenized ones, are refused. |
| EVM address | `/to/0x1111…1111` | That address. |
| Solana address | `/to/5tzF…uAi9` | That address. |

Names are resolved read-only (an Ethereum RPC for ENS, a Solana RPC for `.sol`) and cached for 5 minutes. ENS names with an offchain resolver (CCIP-Read, such as `cb.id` and Base names) work too; their gateways are only called over https on public hosts. The page always shows the resolved address so the payer can check it. `/pay/@alice.eth` redirects to `/to/alice.eth`.

**Which ENS address on which chain.** For a chain other than Ethereum, LayerHop first reads the name's address record for that chain (ENSIP-11: coin type `0x80000000 | chainId`, e.g. Base `2147492101`). Without one it uses the name's Ethereum address only when that is a regular wallet (no contract code on Ethereum), because a regular wallet is the same account on every EVM chain. If the Ethereum address is a contract (a Safe or another smart wallet), it is used only when the same contract also exists on the destination chain, with a warning; otherwise that chain is skipped and the next preference is tried (`NOT_FOUND` when none is left).

> [!WARNING]
> Paying a **smart-contract wallet** (a Safe, for example) on a chain where that wallet isn't deployed can lose the funds. If your ENS name points to a contract wallet, set an address record for each chain you want to receive on (ENS app → **Records** → **Address**), or set `com.layerhop.receive` to the chain where the wallet exists.

## Which token do I receive?

The first one LayerHop can deliver of:

1. the link's own `?chain=&token=` (for example `/to/alice.eth?chain=arbitrum&token=USDC`);
2. your ENS text record `com.layerhop.receive`;
3. the default: **USDC on Base** for an EVM address, **USDC on Solana** for a Solana address.

Only listed tokens are used (LayerHop's curated list, or verified / popular on a provider list), so a link can't steer a payer into buying a token anyone could deploy.

### The `com.layerhop.receive` record

```text
com.layerhop.receive = base:USDC
```

- Format: `<chain>:<token>`. `chain` is a chain slug or id (`base`, `arbitrum`, `8453`, `solana`; see [chains](/chains)), `token` a symbol or an address on that chain (`USDC`, `ETH`, `0x8335…2913`).
- Several entries, comma-separated, in order of preference: `arbitrum:USDC, base:ETH`. An entry that can't be used (unknown chain or token) is skipped.
- A Solana entry (`solana:USDC`) needs a Solana address on your ENS name (the SOL address record); without one LayerHop falls back to the next entry.
- Set it in the ENS app: your name → **Records** → **Edit records** → **Text** → add `com.layerhop.receive`. Setting a record is an Ethereum transaction you sign in the ENS app; LayerHop never signs anything for you.

## Link parameters

| Param | Example | Meaning |
| --- | --- | --- |
| `amount` | `25` | The amount you ask for, in your receive token (human units). The page shows whether the payer's quote covers it. |
| `chain`, `token` | `base`, `USDC` | Override the receive token for this link. |
| `note` | `Dinner` | A short note shown to the payer (plain text, up to 140 characters). |

Example: `https://layerhop.com/to/alice.eth?amount=25&note=Dinner`.

## Fees

A pay link adds no fee of its own. The payer pays the normal web swap fee (see [fees and channels](/concepts/fees-and-channels)) plus the provider's fees and gas, all shown before signing. If the payer already holds your receive token on your chain, no swap is needed: the page shows your address to send it to directly.

## API

The page uses `GET /v1/pay-links/{name}`:

```bash
curl https://api.layerhop.com/v1/pay-links/alice.eth
```

```json
{
  "input": "alice.eth",
  "kind": "ens",
  "name": "alice.eth",
  "address": "0x1111111111111111111111111111111111111111",
  "vm": "evm",
  "receive": { "chainId": 8453, "chain": "base", "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "symbol": "USDC", "decimals": 6, "source": "ens" },
  "textRecord": "base:USDC",
  "warnings": []
}
```

`receive.source` says where the choice came from (`link`, `ens` or `default`); `warnings` lists entries that were skipped. A name with no address is `NOT_FOUND`, anything that can't be a recipient is `INVALID_PARAMS`. Then quote and build a normal swap with `recipient` = `address`, `dstChain` = `receive.chainId` and `dstToken` = `receive.address` (see [EVM to Solana](/guides/evm-to-solana)).
