function validatePaymasterUserOp
(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)
external returns (bytes memory context, uint256 validationData);
function postOp
(PostOpMode mode, bytes calldata context, uint256 actualGasCost)
external;
enum PostOpMode {
opSucceeded, // user op succeeded
opReverted, // user op reverted. still has to pay for gas.
postOpReverted // user op succeeded, but caused postOp to revert
}
// add a paymaster stake (must be called by the paymaster)
function addStake(uint32 _unstakeDelaySec) external payable
// unlock the stake (must wait unstakeDelay before can withdraw)
function unlockStake() external
// withdraw the unlocked stake
function withdrawStake(address payable withdrawAddress) external
To handle the transactions sponsored by paymasters, the entry point has to maintain a specific deposit mechanism, which is distinct from the staking system. This deposit serves as a pool from which UserOperation expenses are debited.
Below is the outline for the interface the entry point needs to support, aiding paymasters and, if necessary, accounts in handling their deposits:
interface EntryPointDepositManagement {
// Event emitted when funds are deposited into the EntryPoint by a paymaster or account
event Deposited(address indexed paymaster, uint256 amount);
// Event emitted when funds are withdrawn from the EntryPoint by a paymaster or account
event Withdrawn(address indexed paymaster, uint256 amount);
/**
* Deposit funds into the EntryPoint.
* @param amount The amount of ETH (or other token) to be deposited.
*/
function deposit(uint256 amount) external payable;
/**
* Withdraw funds from the EntryPoint.
* @param amount The amount of ETH (or other token) to be withdrawn.
*/
function withdraw(uint256 amount) external;
/**
* Query the deposited amount of a given paymaster or account.
* @param addr Address of the paymaster or account.
* @return The amount of ETH (or other token) deposited by the given address.
*/
function getDeposit(address addr) external view returns (uint256);
}
This interface allows for:
Depositing funds to the EntryPoint.
Withdrawing funds from the EntryPoint.
Checking the deposit balance of any paymaster or account.
The separation of deposit (for transaction costs) and stake (locked funds to ensure compliance) ensures a dual layer of financial security and transaction guarantee for the system.