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.
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: 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.receiveto the chain where the wallet exists.
Which token do I receive?#
The first one LayerHop can deliver of:
- the link's own
?chain=&token=(for example/to/alice.eth?chain=arbitrum&token=USDC); - your ENS text record
com.layerhop.receive; - 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#
com.layerhop.receive = base:USDC- Format:
<chain>:<token>.chainis a chain slug or id (base,arbitrum,8453,solana; see chains),tokena 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¬e=Dinner.
Fees#
A pay link adds no fee of its own. The payer pays the normal web swap fee (see 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}:
curl https://api.layerhop.com/v1/pay-links/alice.eth{
"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).
Last updated