Physical Options
Overview
Option
Seller Posts
At ITM Expiry — Buyer Delivers
At ITM Expiry — Buyer Receives
Creating a Physical PUT RFQ
import { ethers } from 'ethers';
import { ThetanutsClient } from '@thetanuts-finance/thetanuts-client';
const provider = new ethers.JsonRpcProvider('https://mainnet.base.org');
const signer = new ethers.Wallet(process.env.PRIVATE_KEY!, provider);
const client = new ThetanutsClient({ chainId: 8453, provider, signer });
const userAddress = await signer.getAddress();
const keyPair = await client.rfqKeys.getOrCreateKeyPair();
// Next Friday 8:00 UTC (Deribit-compatible expiry)
const now = new Date();
const daysUntilFriday = (5 - now.getUTCDay() + 7) % 7 || 7;
const nextFriday = new Date(Date.UTC(
now.getUTCFullYear(), now.getUTCMonth(),
now.getUTCDate() + daysUntilFriday,
8, 0, 0
));
const nextFridayExpiry = Math.floor(nextFriday.getTime() / 1000);
// SELL Physical PUT: "I want to buy ETH at $2500"
// If ETH falls below $2500, you receive ETH at your target price
const physicalPutRFQ = client.optionFactory.buildPhysicalOptionRFQ({
requester: userAddress as `0x${string}`,
underlying: 'ETH',
optionType: 'PUT',
strike: 2500,
expiry: nextFridayExpiry,
numContracts: 0.1,
isLong: false, // SELL — you post USDC collateral
deliveryToken: client.chainConfig.tokens.WETH.address as `0x${string}`,
collateralToken: 'USDC', // Auto-inferred for PUT: USDC
offerDeadlineMinutes: 6,
reservePrice: 0.0001,
requesterPublicKey: keyPair.compressedPublicKey,
});
// Verify the implementation is PHYSICAL_PUT (not regular PUT)
console.log('Implementation:', physicalPutRFQ.params.implementation);
// Should match: client.chainConfig.implementations.PHYSICAL_PUT
// extraOptionData contains the ABI-encoded delivery token address
// (non-empty '0x' distinguishes physical from cash-settled)
console.log('extraOptionData:', physicalPutRFQ.params.extraOptionData);
// For SELL: approve USDC collateral (strike × numContracts)
const collateral = BigInt(Math.round(2500 * 0.1 * 1e6)); // 250 USDC
await client.erc20.ensureAllowance(
client.chainConfig.tokens.USDC.address,
client.optionFactory.contractAddress,
collateral
);
const receipt = await client.optionFactory.requestForQuotation(physicalPutRFQ);
console.log('Physical PUT RFQ TX:', receipt.hash);Creating a Physical CALL RFQ
Calculation Functions
Physical Option Product Table
Product
Collateral (Seller Posts)
Delivery (Buyer Delivers at ITM Expiry)
Collateral vs Delivery
Concept
Who
When
What
Limitations
See Also
Last updated

