Возможности кошелька
Метод wallet_getCapabilities из EIP-5792 сообщает DApp расширенные возможности для данной сети и источника.
Вызов wallet_getCapabilities
const capabilities = await window.ethereum.request({
method: "wallet_getCapabilities",
params: [accounts[0]],
});
Ответ сопоставляет ID сетей объектам возможностей.
Формат ответа
{
"0x1": {
"auxiliaryFunds": {
"supported": true,
"assets": [
{
"chainId": "0x1",
"address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
}
]
},
"paymasterService": {
"supported": true,
"url": "https://paymaster.anon.inc/v1"
},
"atomicBatch": {
"supported": true
}
}
}
auxiliaryFunds (ERC-7682)
auxiliaryFunds означает, что для wallet_sendCalls доступны средства вне обычного публичного баланса, а именно экранированный баланс Railgun.
Включено только для источников с подключённым стелс-адресом и сообщает DApp:
У кошелька есть дополнительные средства в приватном пуле для этой транзакции; не нужно полагаться только на достаточность видимого баланса в блокчейне.
Поведение
При wallet_sendCalls от источника, подходящего для auxiliaryFunds:
- Anon проверяет нужные активы в экранированном балансе
- При достаточности деэкранирует сумму для вызовов; публичные назначение и сумма видны
- DApp получает подтверждение, не управляя внутренним деэкранированием
Список активов
Массив assets перечисляет доступные токены пула:
- WETH, основной актив для операций в ETH
- Все токены экранированного баланса пользователя в этой сети
paymasterService
При поддержке paymasterService можно спонсировать газ в wallet_sendCalls:
{
"version": "1.0",
"capabilities": {
"paymasterService": {
"url": "https://paymaster.anon.inc/v1"
}
}
}
URL пеймастера принимает совместимые с ERC-4337 запросы.
atomicBatch
atomicBatch: { supported: true } означает атомарное исполнение wallet_sendCalls: успех всех вызовов либо общий откат. Anon использует пакетирование смарт-контрактом.
DApp вроде Uniswap проверяют atomicBatch перед сценарием смарт-кошелька.
Проверка во время выполнения
const caps = await window.ethereum.request({
method: "wallet_getCapabilities",
params: [accounts[0]],
});
const chainCaps = caps[chainId];
if (chainCaps?.auxiliaryFunds?.supported) {
// Can use private funds in wallet_sendCalls
}
if (chainCaps?.atomicBatch?.supported) {
// Can use wallet_sendCalls with atomic execution
}