User Proxy Reference
This page is the ABI reference for UserProxyFactoryV4 and UserProxyV4. It is separate from the
Intents ABI reference, whose selectors, contracts, and order types are not
interchangeable with the User Proxy.
Chains and addresses
Section titled “Chains and addresses”| Chain | Chain ID | UserProxyFactoryV4 |
UserProxyV4 implementation |
|---|---|---|---|
| Base | 8453 |
0x9944fE0d7a40E55a63aCb2d3d5DD70B7950A6540 |
0xee28b3554639F27417043EF167A41091B593c8c4 |
| Arbitrum One | 42161 |
0x9944fE0d7a40E55a63aCb2d3d5DD70B7950A6540 |
0xee28b3554639F27417043EF167A41091B593c8c4 |
| Robinhood Chain | 4663 |
0x9944fE0d7a40E55a63aCb2d3d5DD70B7950A6540 |
0xee28b3554639F27417043EF167A41091B593c8c4 |
The canonical Permit2 address on these deployments is:
0x000000000022D473030F116dDEE9F6B43aC78BA3The User Proxy is not deployed on BNB Smart Chain 56. BNB is present in the Intents deployment
list, but that is a different protocol and does not extend the proxy’s chain list.
Constants and domain
Section titled “Constants and domain”| Item | Value |
|---|---|
NATIVE |
0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE |
ACTION_EXECUTE |
0x01 |
AGENT_ORDER_TYPEHASH() getter |
0x5b56c616 selector |
| EIP-712 name | AgentSwap UserProxy |
| EIP-712 version | 2 |
The EIP-712 version is "2", not "4". domainSeparator() returns the proxy domain separator.
Use the proxy’s domain for AgentOrder; it is not the Permit2 witness domain used by Intents.
Function selectors
Section titled “Function selectors”Factory
Section titled “Factory”| Selector | Signature |
|---|---|
0x1cff614d |
predictProxy(address) |
0x4c96a389 |
deploy(address) |
0x5c60da1b |
implementation() |
0xc1a9a508 |
proxyOf(address) |
| Selector | Signature |
|---|---|
0x19ab453c |
init(address) |
0x7ee8ff6e |
execute(address,address,address,uint256,address,uint256,bytes) |
0x4cb75e2e |
executePermit2In(((address,uint256),uint256,uint256),bytes,address,address,address,uint256,bytes) |
0xca1f43a9 |
grantAgent(address,uint64,uint32,uint8,address[],uint256[]) |
0x7da6ac0d |
revokeAgent(address) |
0x950301fa |
setAgentCap(address,address,uint256) |
0xcfb47d19 |
executeAsAgent((address,address,address,uint256,address,uint256,uint256,uint256),bytes,address,bytes) |
0xf514d6e5 |
policyOf(address) |
0x27e2f125 |
agentTokenInfo(address,address) |
0xb352cf8e |
hashAgentOrder((address,address,address,uint256,address,uint256,uint256,uint256)) |
0x353eea55 |
isAgentNonceUsed(address,uint256) |
0x5b56c616 |
AGENT_ORDER_TYPEHASH() |
0xf698da25 |
domainSeparator() |
0x84b0196e |
eip712Domain() |
0x8da5cb5b |
owner() |
0xa0cf0aea |
NATIVE() |
0x6afdd850 |
PERMIT2() |
0xf05b55ef |
ACTION_EXECUTE() |
The proxy also declares receive() external payable {}, which has no selector and so has no row
above. It is what lets a router refund native ETH to the proxy mid-swap; sweepNative is how the
owner retrieves any that stays.
| 0x1be19560 | sweepToken(address) |
| 0xab803a76 | sweepNative() |
| 0x78c093cf | sweepNative(address) |
0xf05b55ef is the selector for the public ACTION_EXECUTE() getter. The typehash getter selector
is a typed-data lookup, not an entry-point selector.
Events
Section titled “Events”| Event | Fields |
|---|---|
Initialized |
address indexed owner |
ProxyDeployed |
address indexed user, address indexed proxy |
Executed |
address indexed router, address indexed tokenIn, address indexed tokenOut, uint256 amountIn, uint256 amountOut |
ExecutedV2 |
address indexed router, address indexed spender, address indexed pull, bool usedPermit2, address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOut |
AgentGranted |
address indexed agent, uint64 gen, uint64 expiry, uint32 epochLen, uint8 actionMask |
AgentRevoked |
address indexed agent, uint64 gen |
AgentCapSet |
address indexed agent, uint64 gen, address indexed tokenIn, uint256 cap |
ExecutedAsAgent |
address indexed agent, address indexed router, address indexed relayer, address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOut |
Custom errors
Section titled “Custom errors”| Error | Signature |
|---|---|
AlreadyInitialized |
AlreadyInitialized() |
NotOwner |
NotOwner() |
SlippageExceeded |
SlippageExceeded(uint256 received,uint256 minOut) |
RouterCallFailed |
RouterCallFailed(bytes returnData) |
InvalidSignature |
InvalidSignature() |
NonceAlreadyUsed |
NonceAlreadyUsed() |
SameToken |
SameToken() |
UnexpectedEthValue |
UnexpectedEthValue(uint256 sent) |
EthValueMismatch |
EthValueMismatch(uint256 sent,uint256 expected) |
NativeNotSupportedInOrder |
NativeNotSupportedInOrder() |
InsufficientOwnerDelivery |
InsufficientOwnerDelivery(uint256 delivered,uint256 required) |
Permit2AmountOverflow |
Permit2AmountOverflow(uint256 amount) |
InvalidAgent |
InvalidAgent() |
InvalidToken |
InvalidToken() |
InvalidExpiry |
InvalidExpiry() |
InvalidEpochLen |
InvalidEpochLen() |
LengthMismatch |
LengthMismatch() |
PolicyInactive |
PolicyInactive() |
ActionNotAllowed |
ActionNotAllowed() |
TokenNotAllowed |
TokenNotAllowed() |
AgentOrderExpired |
AgentOrderExpired() |
CapExceeded |
CapExceeded(uint256 used,uint256 amount,uint256 cap) |
MinOutZero |
MinOutZero() |
Reentrancy |
Reentrancy() |
AmountInZero |
AmountInZero() |
SpenderNotAllowed |
SpenderNotAllowed() |
ZeroAddress |
ZeroAddress() (factory) |