Skip to main content

Singleton Flash Loan Interface

Operations → Flash Loans → Singletons (Composer)

Lead type: ComposerCommands.GEN_2025_SINGELTONS.

The singleton flash loans are constructed from atomic operations on values, e.g., the Balancer V3 vault and Uniswap V4 Position Manager.

Supported Providers​

Balancer V3​

Balancer V3 provides flash loans through its vault contract with advanced features:

  • Lead Command: ComposerCommands.GEN_2025_SINGELTONS
  • Sub-type: DexForkMappings.BALANCER_V3

Uniswap V4​

Uniswap V4 provides flash loans through its position manager:

  • Lead Command: ComposerCommands.GEN_2025_SINGELTONS
  • Sub-type: DexForkMappings.UNISWAP_V4

Parameter Structure​

OffsetLength (bytes)TypeDescription
020addressAsset contract address to borrow
2032uint256Amount to borrow (in asset decimals)
52DynamicbytesPacked composer operations to execute

Solidity Example: Balancer V3 Flash Loan​

// Inner operations to execute during flash loan
bytes memory innerOperations = abi.encodePacked(
uint8(ComposerCommands.TRANSFERS),
uint8(0), // Transfer type
address(this), // recipient
amount // amount to transfer
);
// Main flash loan operation
bytes memory operation = abi.encodePacked(
uint8(ComposerCommands.GEN_2025_SINGELTONS),
uint8(DexForkMappings.BALANCER_V3),
BALANCER_V3_VAULT,
USDC, // asset to borrow
amount, // amount to borrow
innerOperations // operations to execute
);
// Execute the flash loan
composer.deltaCompose(operation);

TypeScript Example (using viem)​

export function encodeBalancerV3FlashLoan(composerAddress: `0x${string}`, amount: bigint): `0x${string}` {
// Inner operations to execute during flash loan
const innerOperations = encodePacked(
["uint8", "uint8", "address", "uint256"],
[
ComposerCommands.TRANSFERS,
0, // Transfer type
"0x...", // recipient address
amount,
]
)

// Main flash loan operation
const operation = encodePacked(
[
"uint8", // ComposerCommands.GEN_2025_SINGELTONS
"uint8", // DexForkMappings.BALANCER_V3
"address", // vault address
"address", // asset
"uint256", // amount
"bytes", // inner operations
],
[ComposerCommands.GEN_2025_SINGELTONS, DexForkMappings.BALANCER_V3, BALANCER_V3_VAULT, USDC_ADDRESS, amount, innerOperations]
)

return operation
}

// Usage example
const operationData = encodeBalancerV3FlashLoan(
"0x...", // composer address
1000000n
)

// Call the composer
await publicClient.writeContract({
address: composerAddress,
abi: parseAbi(["function deltaCompose(bytes data)"]),
functionName: "deltaCompose",
args: [operationData],
})