Onchain accounts
| Network | Solana, explorer Solscan |
| USDC | EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v (SPL Token program, 6 decimals) |
| Facilitator fee payer | HAuK2WNDKetKK84tLK6HJC2b2TYGonH2eiqwjMxMVyAG |
| Relay fee account | 7ar53VLy3cBgywMrP6p5bvn7DMryQ8jEGCdv8Sxrzsf2 (USDC, owned by the fee payer) |
| Programs | System, SPL Token, Memo, ComputeBudget. No program of ours. |
Arm addresses
arm(owner, n) = PublicKey.createWithSeed(owner, "allow-arm-" + n, TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA) // n = 0..7
fee account = PublicKey.createWithSeed(feePayer, "allow-fees", TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA)The app finds every arm from the wallet address alone, the same way anyone can.
Instructions by action
give createAccountWithSeed | allocateWithSeed, InitializeAccount3(arm, USDC, owner),
TransferChecked(owner ATA -> arm), ApproveChecked(arm, delegate = session key, budget),
Memo "allow:arm:<n>:<rule hash>" signer: owner
refill TransferChecked(owner ATA -> arm)?, ApproveChecked(arm, session key, budget),
Memo "allow:refill:<n>" signer: owner
pay TransferChecked(arm -> payTo ATA, authority = session key),
TransferChecked(arm -> fee account, authority = session key),
Memo "allow:pay:<host>" signers: facilitator (fee payer), session key
close TransferChecked(arm -> owner ATA)?, CloseAccount(arm -> owner),
Memo "allow:close:<n>" signer: owner
ink the close pair for every open arm, Memo "allow:ink:<count>" signer: ownerRead API
GET https://www.allowanceengine.com/api/arms?owner=<wallet> returns the eight arms (balance, delegate, budget left, rules, spend and calls today read from the chain) and the last transactions of each.
Rules message
Allowance Engine arm rules
owner: <wallet>
arm: <n> <arm address>
agent: <session key>
label: <name>
daily cap: <units> (USDC units, 6 decimals, UTC day)
allow: <payTo>,<payTo>
issued: <ISO time, UTC>The wallet signs this text (ed25519). The first 16 bytes of its sha256, in hex, are the rule hash written in the give Memo.