Altana sessions
Each of our four reference agents holds its own self-custodial Altana wallet. A session key on that wallet is scoped to a short allowlist of calls, a daily spend cap and an expiry, so the agent can act on chain without holding the keys to everything. The scope lives on the wallet, so a stranger can read it. Everything below the planned scope is read live from BSC testnet, contract by contract, not from a config file. Where a value is not on chain yet it says unknown, never a zero.
All four sessions are registered on chain
Each of the four agents holds a Keystore session registered on chain, on BSC testnet (chain 97). Every status below is read live from chain, not from a config file: getKeys returns each keyId, isValidKey reads true, and each account's allowlist and daily cap are the calls and the USDT limit you can read with free eth_calls. The wallet addresses and both key identifiers are real, derived from keys we hold. tools/altana-grant.ts is the command that landed them; mainnet (chain 56) is the same one command and is never run automatically. Where any value is not on chain it says unknown, never a zero. The method is in the repository at docs/16-ALTANA.md.
The four wallet addresses
One wallet per agent, never one shared. Include these in the submission. Same address on chain 56 and chain 97.
- Venus Health Factor Watch0x3B297E6B70A768fbAF45EEA9f2E323e0d7824cF7
- BSC Yield Router0xEa88E75eF92d0970517bb6134b18083565a0Fb41
- PancakeSwap LP Range Check0x6736921084Ca68b97CB6c699877e77Cc5A3aFFBd
- Grid Ladder Planner0x27102b07D68311B9D37c07BCdc9FD998d81ba25F
Venus Health Factor Watchoperated by us
Health factor shelf, reserved id 900000001, not a registry id
The wallet and its keys
The Keystore takes the keyId, which is keccak256 of the session public key. The account takes the keyHash, a different value for the same key. Both are shown so the derivation reconciles.
Read live from BSC testnet, 1s ago
Planned scope, written to chain at grant
Approve USDT to the Aave V3 pool, then only add collateral or repay debt, at most 100 USDT a day. The tightest of the four scopes: it can defend a position and nothing else.
- approve(address,uint256)on 0x55d398326f99059fF775485246999027B3197955
- supply(address,uint256,address,uint16)on 0x6807dc923806fE8Fd134338EABCA509979a7e0cB
- repay(address,uint256,uint256,address)on 0x6807dc923806fE8Fd134338EABCA509979a7e0cB
- 100 USDT per day, token 0x55d398326f99059fF775485246999027B3197955
BSC Yield Routeroperated by us
Yield shelf, reserved id 900000002, not a registry id
The wallet and its keys
The Keystore takes the keyId, which is keccak256 of the session public key. The account takes the keyHash, a different value for the same key. Both are shown so the derivation reconciles.
Read live from BSC testnet, 1s ago
Planned scope, written to chain at grant
Approve USDT to the Aave V3 pool, supply and withdraw, at most 50 USDT a day. It cannot borrow and cannot touch any other contract.
- approve(address,uint256)on 0x55d398326f99059fF775485246999027B3197955
- supply(address,uint256,address,uint16)on 0x6807dc923806fE8Fd134338EABCA509979a7e0cB
- withdraw(address,uint256,address)on 0x6807dc923806fE8Fd134338EABCA509979a7e0cB
- 50 USDT per day, token 0x55d398326f99059fF775485246999027B3197955
PancakeSwap LP Range Checkoperated by us
Rebalancing shelf, reserved id 900000003, not a registry id
The wallet and its keys
The Keystore takes the keyId, which is keccak256 of the session public key. The account takes the keyHash, a different value for the same key. Both are shown so the derivation reconciles.
Read live from BSC testnet, 1s ago
Planned scope, written to chain at grant
Approve USDT to the PancakeSwap V2 router and swap through it, at most 50 USDT a day. No other target, no plain transfer, no approval to anyone else.
- approve(address,uint256)on 0x55d398326f99059fF775485246999027B3197955
- swapExactTokensForTokens(uint256,uint256,address[],address,uint256)on 0x10ED43C718714eb63d5aA57B78B54704E256024E
- 50 USDT per day, token 0x55d398326f99059fF775485246999027B3197955
Grid Ladder Planneroperated by us
Grid trading shelf, reserved id 900000004, not a registry id
The wallet and its keys
The Keystore takes the keyId, which is keccak256 of the session public key. The account takes the keyHash, a different value for the same key. Both are shown so the derivation reconciles.
Read live from BSC testnet, 1s ago
Planned scope, written to chain at grant
Approve USDT to the PancakeSwap V2 router and swap through it, at most 50 USDT a day. No other target, no plain transfer, no approval to anyone else.
- approve(address,uint256)on 0x55d398326f99059fF775485246999027B3197955
- swapExactTokensForTokens(uint256,uint256,address[],address,uint256)on 0x10ED43C718714eb63d5aA57B78B54704E256024E
- 50 USDT per day, token 0x55d398326f99059fF775485246999027B3197955
Verify it without us
Every value above is a free call anyone can repeat. The Keystore on chain 97 is 0x6b8361C29d05D498b1a12B54A37310f94171E94A. Read getKeys(wallet), isValidKey(wallet, keyId) and getExpiry(wallet, keyId) on it. Read canExecutePackedInfos(keyHash) plus spendInfos(keyHash) on the wallet once it is delegated. The Altana explorer at https://testnet.altana.network shows the same, as an indexed view rather than the authority.