.claude/skills/resupply-architecture/SKILL.md
This skill should be used when the user asks about "Resupply architecture", "Resupply protocol overview", "ResupplyRegistry", "Core contract", "operator pattern", "Resupply system design", or needs to understand how the Resupply protocol components connect together.
npx skillsauth add cyotee/crane resupply-architectureInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Resupply is a CDP-based (Collateralized Debt Position) stablecoin lending protocol enabling users to borrow reUSD stablecoins against ERC4626 vault tokens as collateral. The protocol integrates with Curve Lend, Frax Lend, Convex, and Yearn for yield-bearing collateral support.
/src/dao/Core.sol)The central authority contract managing system-wide configuration:
// Key state variables
address public feeReceiver; // Protocol fee recipient
uint256 public epochLength; // Default: 1 week (604800 seconds)
uint256 public startTime; // Protocol start timestamp
// Operator management
mapping(address operator => bool isEnabled) public operatorPermissions;
mapping(address operator => IAuthHook hook) public authHooks;
Key functions:
execute(address target, bytes calldata data) - Execute calls through Core with operator permissionssetOperatorPermissions(address operator, bool enabled) - Enable/disable operatorssetAuthHook(address operator, IAuthHook hook) - Set pre/post execution hooks/src/protocol/ResupplyRegistry.sol)Single source of truth for all protocol addresses and deployed pairs:
// Registry mappings
address[] public pairs; // All deployed lending pairs
mapping(address => bool) public isPair; // Pair validation
mapping(bytes32 => address) public coreHandlers; // Named component lookup
// Core handler keys
bytes32 constant PAIR_DEPLOYER = keccak256("PAIR_DEPLOYER");
bytes32 constant LIQUIDATION_HANDLER = keccak256("LIQUIDATION_HANDLER");
bytes32 constant REDEMPTION_HANDLER = keccak256("REDEMPTION_HANDLER");
bytes32 constant REWARD_HANDLER = keccak256("REWARD_HANDLER");
bytes32 constant INSURANCE_POOL = keccak256("INSURANCE_POOL");
Registry access pattern:
address deployer = registry.coreHandlers(PAIR_DEPLOYER);
address[] memory allPairs = registry.getAllPairs();
bool valid = registry.isPair(pairAddress);
Operators are authorized contracts that can execute privileged actions through Core:
| Operator | Purpose |
|----------|---------|
| Guardian | Emergency pause, access control |
| TreasuryManager | Treasury fund management |
| BorrowLimitController | Dynamic borrow limit adjustments |
| PairAdder | Adding new lending pairs |
| EmissionsController | Governance token emissions |
Auth Hook Pattern:
interface IAuthHook {
function canCall(address caller, address target, bytes4 selector) external view returns (bool);
function preHook(address caller, address target, bytes calldata data) external;
function postHook(address caller, address target, bytes calldata data, bytes calldata result) external;
}
/src/protocol/Stablecoin.sol)The protocol's native stablecoin with controlled minting:
// LayerZero OFT for cross-chain support
contract Stablecoin is OFT {
address public minter; // Only minter can mint/burn
function mint(address account, uint256 amount) external;
function burn(address account, uint256 amount) external;
}
/src/dao/GovToken.sol)Governance token for protocol voting and staking rewards:
contract GovToken is OFT {
address public minter;
uint256 public maxMintable; // Capped supply
}
All contracts use consistent precision values:
uint256 constant LTV_PRECISION = 1e5; // Loan-to-value ratios (95% = 95_000)
uint256 constant EXCHANGE_PRECISION = 1e18; // Exchange rates
uint256 constant RATE_PRECISION = 1e18; // Interest rates per second
uint256 constant PAIR_DECIMALS = 1e18; // Token decimals assumption
The protocol operates on weekly epochs for reward distribution and governance:
uint256 constant EPOCH_LENGTH = 604800; // 1 week in seconds
function getEpoch() public view returns (uint256) {
return (block.timestamp - startTime) / epochLength;
}
Resupply integrates with external protocols through pair deployers:
CurveLendMinterFactory, CurveLendOperatorFor a complete list of all protocol contracts with paths, see references/contracts.md.
development
Review UI code for Web Interface Guidelines compliance. Use when asked to "review my UI", "check accessibility", "audit design", "review UX", or "check my site against best practices".
documentation
Write to contracts and send transactions. Use when executing state-changing contract functions.
development
HTTP and WebSocket transports for blockchain connectivity. Use when configuring network connections.
data-ai
Read contract data with type-safe ABI. Use when querying smart contract view/pure functions.