Skip to main content

Margin Operations

Margin operations enable DeFi strategies by combining lending, borrowing, and swapping operations in atomic transactions.

Supported Operations​

Core Margin Operations​

  • Leverage - Increase position size by borrowing against collateral and reinvesting
  • Close - Exit leveraged positions by withdrawing collateral and repaying debt
  • Collateral Swap - Exchange collateral assets without closing positions
  • Debt Swap - Change debt composition while maintaining collateral
  • Position Migration - Move positions between lending protocols

Architecture Deep Dive​

Composer Pattern​

The 1Delta margin system is built on composer pattern that enables multi-step DeFi operations to execute atomically. The BaseComposer contract serves as the foundation, with chain-specific implementations handling protocol integrations.

abstract contract BaseComposer is
DeadLogger,
Swaps,
Gen2025DexActions,
UniversalLending,
ERC4626Operations,
Transfers,
Permits,
ExternalCall
{
function deltaCompose(bytes calldata) external payable;
function _deltaComposeInternal(address, uint256, uint256) internal virtual;
}

Operation Execution Flow​

All margin operations follow a standardized execution pattern within the composer's main loop:

function _deltaComposeInternal(address callerAddress, uint256 currentOffset, uint256 calldataLength) internal virtual {
while (true) {
uint256 operation = shr(248, calldataload(currentOffset));
currentOffset = add(1, currentOffset);

// handle operations

if (currentOffset >= maxIndex) break;
}
}

Architecture Overview​

Key Components​

1. Flash Loan Providers​

The system integrates multiple flash loan providers for optimal capital efficiency:

Morpho Blue, Aave V3, Aave V2, Balancer V2, Balancer V3, Uniswap V4

2. DEX Integration​

Operations support multiple DEX aggregators and protocols:

Uniswap (v2,v3,v4), Balancer (v2,v3), GMX, Dodo, ...

3. Lending Protocol Support​

Compatible with major lending protocols:

Aave (v2,v3 and forks), Compound (v2,v3 and forks), Morpho Blue

Lending Protocol Integration​

Margin operations leverage the lending protocol support through the unified Lending Operations interface.

For detailed lending operation encoding and protocol-specific parameters, see the Lending Operations documentation.

Operation Command Structure​

Operations are encoded using compact byte packing:

Operation Byte: [Command Type (1 byte)]
Data Bytes: [Operation-specific data]

Flash Loan Operations​

Margin operations utilize flash loans through the standardized flash loan interface. The system supports multiple providers:

For detailed flash loan encoding, provider-specific parameters, and integration patterns, see the Flash Loan Operations documentation.

Technical Implementation​

Operation Encoding​

Operations are encoded as compact bytecode sequences:

// Example: Flash loan + swap + deposit sequence
bytes memory operation = abi.encodePacked(
uint8(ComposerCommands.FLASH_LOAN),
uint8(FlashLoanIds.MORPHO_BLUE),
address(asset),
address(provider),
uint128(amount),
uint16(callbackData.length),
uint8(poolId),
callbackCallData
);

Security Architecture​

Access Control​

  • Caller Validation: Strict validation of operation initiators
  • Callback Verification: Flash loan callbacks validate caller addresses

Slippage Protection​

Built-in slippage checks ensure operations meet minimum requirements:

assembly {
if gt(minimumAmountReceived, amountIn) {
mstore(0x0, SLIPPAGE)
revert(0x0, 0x4)
}
}

Gas Optimization Strategies​

1. Packed Encoding​

  • Minimize calldata size through tight byte packing
  • Use uint128 for amounts, uint16 for lengths
  • Combine related operations in single calls

2. Approval Management​

  • One-time maximum approvals reduce future gas costs
  • Pre-approve operations outside flash loan callbacks
  • Use permit signatures where supported

3. Direct Transfers​

  • Route funds directly between operations
  • Eliminate intermediate token movements
  • Use contract balance operations when possible

Quick Start Examples​

Basic Leverage Operation​

// 1. Setup composer and addresses
IComposer composer = IComposer(composerAddress);

// 2. Encode flash loan operation
bytes memory flashLoan = abi.encodePacked(
uint8(ComposerCommands.FLASH_LOAN),
uint8(FlashLoanIds.MORPHO_BLUE),
address(USDC),
morphoBlueAddress,
uint128(8000e6),
uint16(innerOps.length),
uint8(0), // pool ID
innerOps
);

// 3. Execute operation
composer.deltaCompose(flashLoan);

Multi-Protocol Operation​

// Combine operations across protocols
bytes memory multiProtocolOps = abi.encodePacked(
// Aave V3 deposit
abi.encodePacked(
uint8(ComposerCommands.LENDING),
uint8(LenderOps.DEPOSIT),
uint16(LenderIds.AAVE_V3),
address(WETH),
uint128(0),
userAddress,
aaveV3Pool
),
// Morpho flash loan
abi.encodePacked(
uint8(ComposerCommands.FLASH_LOAN),
uint8(FlashLoanIds.MORPHO_BLUE),
address(USDC),
morphoAddress,
uint128(amount),
uint16(callbackOps.length),
uint8(0),
callbackOps
)
);

Integration Requirements​

Prerequisites​

  • EOA Approval: User must approve composer for token operations
  • Protocol Permissions: Enable composer on target lending protocols
  • Flash Loan Access: Ensure flash loan providers are accessible

External Data Requirements​

For swap operations, provide aggregator data as:

  • calldata - Raw transaction data from aggregator API
  • target - DEX router or aggregator contract address
  • value - ETH value for transaction (typically 0)

Next Steps​

Explore related operation types: