All packages
shield_behavioral_memory

shield_behavioral_memory

Oliverknowledge
v0.2.0/1 downloads/Repository

Package ref

shield-behavioral-memory@v0.2.0

Run package

CLI

Run map_behavioral_profiles from the command line.

substreams run shield-behavioral-memory@v0.2.0 map_behavioral_profiles -e solana-devnet
Authenticate by running substreams auth or directly on thegraph.market (see docs).

README

shield_behavioral_memory

Substreams package for the Shield vault program on Solana. It turns raw devnet/mainnet blocks into the behavioural memory Shield reasons over: "You sent $4,100 to this trading wallet. $2,810 came back."

Network: solana-devnet (program 4Z46Kz8ygX5Efw22ABbQ2LTf329N3nD2J81Z3CAY5Hyx). Switch network: to solana and update initialBlock for mainnet.

Modules

ModuleKindOutputWhat it does
map_shield_instructionsmapshield.v1.ShieldInstructionsDecodes every Shield instruction (args + named accounts) into one typed message per instruction.
map_shield_eventsmapshield.v1.ShieldEventsDecodes every Anchor event the program emits (Program data: logs).
store_vault_registrystore (set)stringata:<vault token account> -> vault, exec:<vault>:<owner> -> 1/0, cold:....
store_vault_walletsstore (append)stringwallets:<vault> -> owner;owner;...
map_vault_flowsmapshield.v1.VaultFlowsEvery USDC movement across a vault boundary, classified: TOP_UP_INSTANT, TOP_UP_GATED, COLD_TRANSFER, FULL_EXIT, RETURN (an execution wallet sending money back, seen at the SPL Token level), DEPOSIT.
store_flow_totalsstore (add)int64Running per-vault and per-execution-wallet totals.
map_behavioral_profilesmapshield.v1.BehavioralProfilesPer-vault snapshot: sent vs returned per execution wallet, net realized flow, deposits, exits.

Windowed metrics (24h funding velocity, 7-day realized loss, loss streak, reload-after-loss) are derived by the consumer (server/behaviour.ts) from the map_vault_flows stream, which carries every flow with its block time. The store keeps whole-history totals; the app keeps windows.

Build and run

# toolchain: rustup target add wasm32-unknown-unknown; brew install bufbuild/buf/buf; substreams CLI >= 1.22
substreams build                                   # -> shield-behavioral-memory-v0.2.0.spkg

# JWT: SUBSTREAMS_API_TOKEN in .env (shared with substreams-evm); endpoint SUBSTREAMS_SOLANA_ENDPOINT
bun run substreams:solana <slot>                   # or the raw CLI below
substreams run substreams.yaml map_vault_flows \
  -e devnet.sol.streamingfast.io:443 -s <slot> -t +200 -o jsonl
substreams gui substreams.yaml map_behavioral_profiles -e devnet.sol.streamingfast.io:443 -s <slot>

Shield's server streams map_vault_flows and map_shield_events from The Graph Market's devnet endpoint (@substreams/core, see server/substreams-source.ts), keeps a cursor, and rebuilds the behavioural profile on every block. Alternative sinks: substreams sink postgres (built-in SQL sink) or a Hosted Sink on The Graph Market.

Local development against a local validator

For iterating without a Graph Market key, run a local Firehose against solana-test-validator (StreamingFast's Docker compose in the Substreams docs) and point -e at it. Local-only data does not qualify for The Graph's hackathon track; the deployed pipeline must stream from a Graph provider.

Modules

Execution graph

7 modules
store

store_flow_totals

from #391843999

Store value

int64

Update policy

add

store

store_vault_wallets

from #391843999

Store value

string

Update policy

append