internet-court/genlayer-erc7710-connector
Connect GenLayer Intelligent Contract decisions to ERC-7710-style delegated authority. Use when an agent needs to design the interface, message schema, relayer/bridge path, EVM revocation controller, constraint updates, proof/finality assumptions, and failure handling that turn a GenLayer agent-performance review into ERC-7710 revocation or policy changes.
npx skills add https://github.com/internet-court/internet-court-skill --skill genlayer-erc7710-connector
Use this skill after the mandate, ERC-7710 policy, and GenLayer Intelligent Contract review flow exist. This skill does not teach GenLayer contract deployment. For GenLayer build, deploy, test, and CLI operations, use the official GenLayer skills at https://skills.genlayer.com/ or the GenLayer documentation.
This skill specifies the connector:
GenLayer Intelligent Contract decision
-> decision proof / receipt / finalized result
-> relayer or bridge
-> EVM RevocationController
-> ERC-7710 Delegation Manager rejects or constrains future redemptions
Never say "GenLayer cancels ERC-7710" without defining the effect path. GenLayer produces a decision. An EVM-side controller, account module, caveat enforcer, or delegation manager integration must consume that decision.
mandateId, permissionHash, delegator, delegate, delegation manager, target EVM chain, and current policy.Use the simplest mode that honestly matches the demo.
Best for hackathon/prototype demos. The UI or operator reads the GenLayer decision and calls the EVM revocation controller.
State the trust assumption: the operator is trusted to relay the decision correctly.
Best for a realistic MVP. A service watches GenLayer review transactions, waits for finality, then submits a signed EVM transaction.
Require allowlisted relayer keys and onchain event logs. Keep the delegator emergency revoke path.
Use this for Base Sepolia demos that should exercise a real cross-chain control loop without claiming mainnet-grade verification.
Flow:
1. Base reporter contract packages a spend or action snapshot.
2. Base BridgeSender.sol sends it to GenLayer through the bridge boilerplate.
3. BridgeReceiver.py dispatches process_bridge_message() on the supervisor IC.
4. Supervisor IC reviews the window and calls BridgeSender.py.
5. Base BridgeReceiver.sol dispatches processBridgeMessage() on an EVM decision receiver.
6. Decision receiver verifies bridge receiver, source chain id, and source IC.
7. Decision receiver calls RevocationController.applyGenLayerDecisionStruct().
Default Base Sepolia values from the bridge boilerplate:
84532.40245.BridgeSender.py: 61998.Required EVM contracts:
WalletSpendReporter that sends snapshots to GenLayer;GenLayerDecisionReceiver that is allowlisted as a relayer on RevocationController;RevocationController.isRevoked, isPaused, and getConstraints before spending.Trust assumption: the bridge service and configured bridge contracts are trusted for the demo unless a verified proof path is added. Keep owner emergency revoke and absolute expiry.
Best when anyone can submit a decision, but the decision can be challenged during a delay.
Use for higher-stakes demos where incorrect revocation is costly and latency is acceptable.
Best for production claims. The EVM controller verifies a GenLayer-origin proof or a trusted bridge message.
Do not choose this mode unless the proof/bridge implementation is actually available.
Use this as the default connector payload:
type GenLayerDelegationDecision = {
mandateId: string;
permissionHash: `0x${string}`;
genlayerChainId: string;
genlayerSupervisor: string;
genlayerTxId: string;
reviewWindowId: string;
decision: "continue" | "warn" | "constrain" | "revoke" | "escalate";
score: number;
violationsHash: `0x${string}`;
evidenceBundleHash: `0x${string}`;
constraintsHash: `0x${string}`;
issuedAt: number;
expiresAt: number;
nonce: bigint;
};
For EVM submission, hash and sign or verify the exact payload:
type RelayEnvelope = {
payload: GenLayerDelegationDecision;
payloadHash: `0x${string}`;
relayer: `0x${string}`;
signature?: `0x${string}`;
proof?: string;
};
The EVM controller should expose a small surface:
interface IAgentRevocationController {
event DelegationRevoked(bytes32 indexed mandateId, bytes32 indexed permissionHash, bytes32 decisionHash);
event DelegationConstrained(bytes32 indexed mandateId, bytes32 indexed permissionHash, bytes32 decisionHash);
function isRevoked(bytes32 permissionHash) external view returns (bool);
function getConstraints(bytes32 permissionHash) external view returns (bytes32 constraintsHash);
function applyGenLayerDecision(bytes calldata decision, bytes calldata proofOrSignature) external;
function emergencyRevoke(bytes32 permissionHash) external;
}
The ERC-7710 redemption path must check this controller before execution. Depending on the delegation framework, that check can live in:
continue: record reviewed window; no policy change.warn: record warning; optionally require extra evidence next review.constrain: update constraints hash, such as lower gas cap, fewer txs, disabled actions, or human approval for deployments.revoke: mark permissionHash revoked; all future redemptions fail.escalate: pause high-risk actions or require human review.For demos, a one-minute review cadence is acceptable so users can see GenLayer decisions modify or revoke a delegation quickly. For production-style mandates, default to a twenty-four-hour review window or a risk-based cadence. The artifact should include both the demo cadence and the production-style cadence so the trust and latency assumptions are visible.
Periodic review does not replace absolute permission expiry. Keep short spend periods, low caps, emergency owner revoke, and stale-decision checks.
Always handle:
expiresAt.continue decision ambiguity.constrain cannot be represented by the current policy.Mitigations: short absolute expiry, emergency revoke, tx/rate limits, pause-on-review-missed, idempotency, and explicit finality delays.
When designing the connector, return:
GenLayerDelegationDecision payload.references/connector-patterns.md for mode selection and test cases.Take internet-court/genlayer-erc7710-connector from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.