Submit the owner's signature and persist the grant
Recomputes the grant from the echoed prepare fields, verifies the signature recovers to the authenticated owner, re-checks the entity allocation inside the write, and stores the policy as pending. The install itself rides the first workflow operation on this wallet — nothing reaches the chain here.
This REPLACES the runner's previous grants. A wallet carries at most one usable grant: the send path resolves exactly one and refuses to execute when it finds more, so grants do not stack. Every other usable grant on this runner is revoked as part of this call, and the ones revoked come back in supersededPolicyIds. There is no flag to opt out, and clients do not need to revoke the previous grant first.
Replacement is scoped to the runner, not to a capability: submitting a grant for one capability revokes the runner's grant for any other.
Off-chain only. The superseded grants' validation entities and ERC-20 spend caps stay installed on the account until the owner signs uninstallValidation — replacing a grant does not reduce what the account could authorize on chain, only what this gateway will use.
Request body
Example request
{
"chainId": 11155111,
"policyId": "01JG2FE5MDVKBPHEG0PEYSDKAC",
"allowedActions": [
{
"target": "0x82F2Dd9a552a69f2ceD7Ff2D05c43aB8430158FB"
}
],
"erc20SpendCap": {
"token": "0x82F2Dd9a552a69f2ceD7Ff2D05c43aB8430158FB",
"amount": "500000000"
}
}Response
Grant stored; the gateway may now execute within it.
Example response
{
"id": "01JG2FE5MDVKBPHEG0PEYSDKAC",
"runner": "0x82F2Dd9a552a69f2ceD7Ff2D05c43aB8430158FB",
"chainId": 11155111,
"sessionSigner": "0x82F2Dd9a552a69f2ceD7Ff2D05c43aB8430158FB",
"allowedActions": [
{
"target": "0x82F2Dd9a552a69f2ceD7Ff2D05c43aB8430158FB"
}
],
"erc20SpendCap": {
"token": "0x82F2Dd9a552a69f2ceD7Ff2D05c43aB8430158FB",
"amount": "500000000"
},
"supersededPolicyIds": [
"01JG2FE5MDVKBPHEG0PEYSDKAC"
]
}