Core Contracts
DcaManager
Primary user-entry contract.
Key write functions
function createDcaSchedule(address token, uint256 depositAmount, uint256 purchaseAmount, uint256 purchasePeriod, uint256 lendingProtocolIndex) external;
function updateDcaSchedule(address token, uint256 scheduleIndex, bytes32 scheduleId, uint256 depositAmount, uint256 purchaseAmount, uint256 purchasePeriod) external;
function deleteDcaSchedule(address token, uint256 scheduleIndex, bytes32 scheduleId) external;
function depositToken(address token, uint256 scheduleIndex, bytes32 scheduleId, uint256 depositAmount) external;
function withdrawToken(address token, uint256 scheduleIndex, bytes32 scheduleId, uint256 withdrawalAmount) external;
function withdrawTokenAndInterest(address token, uint256 scheduleIndex, bytes32 scheduleId, uint256 withdrawalAmount, uint256 lendingProtocolIndex) external;
function buyRbtc(address buyer, address token, uint256 scheduleIndex, bytes32 scheduleId) external;
function batchBuyRbtc(address[] calldata buyers, address token, uint256[] calldata scheduleIndexes, bytes32[] calldata scheduleIds, uint256[] calldata purchaseAmounts, uint256 lendingProtocolIndex) external;
function withdrawRbtcFromTokenHandler(address token, uint256 lendingProtocolIndex) external;
function withdrawAllAccumulatedRbtc(address[] calldata tokens, uint256[] calldata lendingProtocolIndexes) external;
function withdrawAllAccumulatedInterest(address[] calldata tokens, uint256[] calldata lendingProtocolIndexes) external;
Key read functions
function getDcaSchedules(address user, address token) external view returns (DcaDetails[] memory);
function getScheduleTokenBalance(address user, address token, uint256 scheduleIndex) external view returns (uint256);
function getSchedulePurchaseAmount(address user, address token, uint256 scheduleIndex) external view returns (uint256);
function getSchedulePurchasePeriod(address user, address token, uint256 scheduleIndex) external view returns (uint256);
function getScheduleId(address user, address token, uint256 scheduleIndex) external view returns (bytes32);
function getInterestAccrued(address user, address token, uint256 lendingProtocolIndex) external view returns (uint256);
function getMinPurchasePeriod() external view returns (uint256);
function getMaxSchedulesPerToken() external view returns (uint256);
function getDefaultMinPurchaseAmount() external view returns (uint256);
function getTokenMinPurchaseAmount(address token) external view returns (uint256 minPurchaseAmount, bool customMinAmountSet);
DcaDetails
struct DcaDetails {
uint256 tokenBalance;
uint256 purchaseAmount;
uint256 purchasePeriod;
uint256 lastPurchaseTimestamp;
bytes32 scheduleId;
uint256 lendingProtocolIndex;
}
OperationsAdmin
Registry and role-management contract.
Relevant functions
function assignOrUpdateTokenHandler(address token, uint256 lendingProtocolIndex, address handler) external;
function addOrUpdateLendingProtocol(string calldata lowerCaseName, uint256 index) external;
function setSwapperRole(address swapper) external;
function revokeSwapperRole(address swapper) external;
function setAdminRole(address admin) external;
function revokeAdminRole(address admin) external;
function getTokenHandler(address token, uint256 lendingProtocolIndex) external view returns (address);
function getLendingProtocolIndex(string calldata lowerCaseName) external view returns (uint256);
function getLendingProtocolName(uint256 index) external view returns (string memory);
Handler Families
DOC + MoC handlers
TropykusDocHandlerMocSovrynDocHandlerMoc
DEX handlers
TropykusErc20HandlerDexSovrynErc20HandlerDex(contract exists; deployment support depends on token/protocol configuration)
Purchase Backends
PurchaseMoc
- redeems DOC through MoC proxy flow (
redeemDocRequest+redeemFreeDoc) - charges fee before crediting user accumulated rBTC
PurchaseUniswap
- swaps stablecoin via configured Uniswap V3 path
- uses MoC oracle
getPriceInfo()validity flag for minimum output calculation - unwraps WRBTC to rBTC on withdrawal
FeeHandler
Handler-level fee settings:
minFeeRatemaxFeeRatefeePurchaseLowerBoundfeePurchaseUpperBoundfeeCollector
_calculateFee uses divisor 10_000.
Validation Rules (Manager)
depositAmount > 0withdrawalAmount > 0 && withdrawalAmount <= scheduleBalancepurchaseAmount >= configuredMinimumpurchaseAmount <= scheduleBalance / 2purchasePeriod >= configuredMinimumPeriod- schedule index + schedule ID must match
- batch arrays must have equal non-zero length