Wallet-Native Assets

资产授权模型

把长期 allowance 和 operator 权限替换为钱包级、可读且有边界的授权。

3 个章节asset-authorization
01

一次性资产拉取

executeWithTokenPull 和 executeWithNftPull 在一次外部调用期间,为唯一 target 建立临时资产权限。目标合约只能拉取指定资产,并受 maxAmount 或 tokenId 约束。

成功执行后上下文被清除;失败则整笔交易回滚。资产合约中不会留下 ERC-20 allowance 或 ERC-721 operator approval。

IWalletAssetPullExecutor
interface IWalletAssetPullExecutor {
  function executeWithTokenPull(
    address target, bytes calldata data, address asset, uint256 maxAmount
  ) external;
  function executeWithNftPull(
    address target, bytes calldata data, address asset, uint256 tokenId
  ) external;
  function tokenPullToCaller(address asset, uint256 amount) external;
  function nftPullToCaller(address asset, uint256 tokenId) external;
}
02

签名转账

ERC-8112 支持 ERC-20 和原生币的 EIP-712 签名转账;nonce 按 (asset, to) 隔离。ERC-8114 支持 ERC-721 签名转账;nonce 按 (asset, tokenId) 隔离。

签名由钱包 Runtime 按 ERC-1271 语义验证,任何中继者都可以在 deadline 前提交。

Wallet-native signed transfers
interface IERC8112 {
  function tokenTransferNonce(address asset, address to) external view returns (uint256);
  function tokenTransferWithSig(
    address asset, address to, uint256 value, uint256 deadline, bytes calldata signature
  ) external returns (bool);
}

interface IERC8114 {
  function nftTransferNonce(address asset, uint256 tokenId) external view returns (uint256);
  function nftTransferWithSig(
    address asset, address to, uint256 tokenId, uint256 deadline, bytes calldata signature
  ) external returns (bool);
}
03

如何选择

  • 交易与市场即时结算:优先使用 executeWithTokenPull / executeWithNftPull。
  • 支付、Gift、Red Packet 或中继转账:使用 ERC-8112 / ERC-8114。
  • 多个普通账户调用:由钱包自身使用 executeBatch。
  • 不要把 Pull 与签名转账混为 allowance;两者都不会在 Token/NFT 合约留下长期 spender 权限。