@ asevault/ 连接
将 Asentum dApp 连接到 AseVault 移动钱包(ML-DSA-65签名). 密钥留在设备上;每个请求都需要在申请中获得批准. 零从属.
npm install @asevault/connect
使用量
import { AseVaultProvider } from '@asevault/connect';
const wallet = new AseVaultProvider({ name: 'My dApp' });
await wallet.connect(); // approve in AseVault -> session
const address = wallet.address; // ase1...
const { txHash } = await wallet.callContract({
to: 'ase1...', // or 0x...
method: 'swapExactIn',
args: ['1', '0xeeee...', '1000000000000000000', '990000000000000000'],
});
const { txHash: deployTx, address: contract } = await wallet.deploy(source);
const { txHash: sendTx } = await wallet.sendTransaction({ to: 'ase1...', amount: '1000000000000000000' });
const { signature } = await wallet.signMessage({ message: 'hello' });
const { status, receipt } = await wallet.waitForTx(txHash);
// status: 'confirmed' | 'reverted' | 'timeout'
// timeout: no receipt landed. Reverted txs are dropped without a receipt
// on Asentum, so a timeout usually means dropped or reverted.
const gas = await wallet.estimateGas({ to: 'ase1...', method: 'swapExactIn', args });
wallet.on('chainChanged', (id) => {});
wallet.disconnect();
EIP-1193样式请求()与被注入的提供者使用相同的方法名支持:
await wallet.request({ method: 'ase_sendCall', params: { to, method: 'mint', args: [] } });
await wallet.request({ method: 'eth_blockNumber' });
await wallet.request({ method: 'estimateGas', params: { to, method: 'mint', args: [] } });
await wallet.accounts();
await wallet.getAddress();
wallet.selectedAddress;
wallet.chainId;
运输
自动选择,或强制通过 new AseVaultProvider({ transport })数字 :
| DApp运行的地方 | 运输 | UX 密码 |
|---|---|---|
| AseVault 应用浏览器 | InAppTransport | 现场核准单 |
| 移动浏览器 | DeepLinkTransport | 应用切换、批准、返回标签 |
| 桌面浏览器 | RelayTransport | 屏幕上的QR,电话批准 |
在桌面上,提供者默认为公共中继器(relay.asepad.fun和 connect() 显示内置的 QR 模式。 过 relay: false 选择退出( 然后连接失败) WALLET_NOT_INSTALLED) (中文(简体) ).
const wallet = new AseVaultProvider({ relay: true });
await wallet.connect(); // QR modal opens automatically
// Per-call override:
await wallet.connect({ ui: 'none' });
// Render the QR yourself:
const wallet2 = new AseVaultProvider({ relay: true, ui: 'none' });
wallet2.on('uri', (uri) => renderQr(uri));
// Custom renderer:
const wallet3 = new AseVaultProvider({ relay: true, ui: (uri) => myQr(uri) });
// Custom relay URL:
const wallet4 = new AseVaultProvider({ relay: 'https://your-relay' });
// Explicit transport:
import { RelayTransport } from '@asevault/connect';
const wallet5 = new AseVaultProvider({
transport: new RelayTransport('https://your-relay', { onUri: (uri) => renderQr(uri) }),
});
延迟和故障
钱包在预测时每~2.5 s 进行请求队列投票,结果投票为 1 s. 等待几秒钟之间 callContract() 电话里有批准表 如果钱包是背景的,OS会决定何时醒. 在~5 s后显示"检查你的手机"提示.
connect() 在显示 QR 之前探测中继器。 如果无法到达,它会抛出 RELAY_UNREACHABLE在一项待决请求中,连续三次无法到达的投票也以 RELAY_UNREACHABLE。 。 。 .
零依赖 Dev 中继器在 scripts/dev-relay.mjs运行它,在你的局域网IP上服务DApp,扫描QR.
阅读器 API
wallet.client (或 new AseVaultReader())手柄读取端点故障和超时:
| 方法 | 回返 |
|---|---|
view(contract, method, args) | 未包装的 returnValueJSON 字符串解析后, 缩写为字符串 |
getBalance(address) | (威仪) |
balanceOf(contract, address) | 通过 view |
getBlockNumber() | 编号 |
getBlock(n) | { receipts: [{ txHash, success, error, recipient, events }] } |
getReceipt(hash) | 收讫或 null (待定/未找到) |
getTxState(hash) | “待决” |
waitForTx(hash, timeoutMs?) | 状态 : “ 确认 ” |
waitReceipt(hash, timeoutMs?) | 收件或超时抛出 |
getContractEvents(contract, { event?, fromBlock?, toBlock?, limit? }) | 匹配事件, 最新第一 |
estimateGas(contract, method, args) | bigint 气体单位 |
chainId() | 小数字符串 |
useRpc(urls) 编号 : validateRpc(url) | 终点池+健康探测器 |
这个 /view RPC 返回 { ok, returnValue, gasUsed }。 。 。 . view() 决定: returnValue 直接,不是信封.
自动检测
在 AseVault 浏览器内插入钱包 window.__asevaultBridge 加号 window.asevault编号 :window.asentum 别名( n)request(), (中文(简体) ), connect(), (中文(简体) ), disconnect(), (中文(简体) ), accounts(), (中文(简体) ), getAddress(), (中文(简体) ), sendCall, (中文(简体) ), sendTransfer, (中文(简体) ), signMessage, (中文(简体) ), ase_deploy) (中文(简体) ). InAppTransport 约束 __asevaultBridge这样 installAseVaultProvider() 可替换 window.asevault 没有打破频道。 钱包推出 accountsChanged编号 :disconnect编号 :connect 将事件输入页面.
议定书(v1)
asevault://v1/connect?origin=&name=&permissions=&callback=&nonce=- > (中文)callback?asevault=1&session=<b64>(会议载有ML-DSA-65的证明)ASEVAULT_CONNECT|<nonce>|<address>(中文(简体) )asevault://v1/sign?session=&payload=<b64url>&callback=&nonce=&kind=- > (中文)callback?asevault=1&tx=<hash>或者说?error=<code>&message=asevault://v1/disconnect?session=- 中继 :
POST/GET {relay}/r/<nonce>结果,POST/GET {relay}/q已排队的请求
警卫
- 钥匙从不离开AseVault。 dApps只看到地址,公钥,签名和广播结果.
- 每一份申请都需要得到明确的申请批准.
- 会话是来源范围并可在AseVault(Connected Apps)内部被撤销.
全面整合指南: CONNECT.md。 。 。 .
产物: Asepad.fun (英语)。 。 。 .