Blockchain-based systematic investment plans combining the discipline of traditional SIPs with the transparency, security, and automation of decentralized finance.
DeSIP is a blockchain-based approach to long-term investing, combining the discipline of traditional SIPs with the transparency, security, and automation of decentralized finance (DeFi).
Unlike conventional SIPs managed by banks or mutual funds, DeSIPs run on smart contracts — allowing investors to contribute, track, and grow their funds without intermediaries.
"Trustless, transparent, and automated — DeSIP puts you in full control of your systematic investment strategy on-chain."
DeSIP merges the discipline of systematic investing with the openness and efficiency of DeFi, making it ideal for users seeking long-term, transparent, and secure investment growth.
It empowers investors to control their financial future, access high-yield opportunities, and track every contribution in a trustless, global, and automated ecosystem.
All contributions, fund allocation, and growth are recorded on-chain. No hidden charges, no opaque fund management — verify everything in real-time.
DeSIP is designed for long-term crypto wealth accumulation, automated investment plans for DeFi portfolios, and passive income strategies for stablecoin holders. With keeper-bot-compatible execution, anyone can trigger your SIP when it's due — fully permissionless.
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; /* --------------------------------------------------------- DeSIP – Decentralized SIP Prototype --------------------------------------------------------- - Users create recurring investment plans - Fixed amount + interval - Funds routed to DeFi strategies - Tracks deposits & yield --------------------------------------------------------- */ interface IERC20 { function transfer(address to, uint256 amount) external returns (bool); function transferFrom(address from, address to, uint256 amount) external returns (bool); function balanceOf(address user) external view returns (uint256); } interface IStrategyAdapter { function deposit(uint256 amount) external; function withdraw(uint256 amount) external; function totalValue() external view returns (uint256); } contract DeSIP { uint256 constant BPS = 10_000; struct SIPPlan { address investor; IERC20 token; uint256 amountPerCycle; uint256 interval; uint256 startTime; uint256 lastDepositTime; uint256 totalInvested; bool active; address[] strategies; uint256[] allocations; } uint256 public planCounter; mapping(uint256 => SIPPlan) public plans; mapping(address => uint256[]) public userPlans; event SIPCreated(uint256 indexed planId, address indexed investor); event SIPExecuted(uint256 indexed planId, uint256 amount); event SIPPaused(uint256 indexed planId); event Withdrawn(uint256 indexed planId, uint256 amount); function createSIP( IERC20 token, uint256 amountPerCycle, uint256 interval, address[] calldata strategies, uint256[] calldata allocations ) external returns (uint256) { require(strategies.length == allocations.length, "Mismatch"); planCounter++; SIPPlan storage p = plans[planCounter]; p.investor = msg.sender; p.token = token; p.amountPerCycle = amountPerCycle; p.interval = interval; p.startTime = block.timestamp; p.active = true; p.strategies = strategies; p.allocations = allocations; userPlans[msg.sender].push(planCounter); emit SIPCreated(planCounter, msg.sender); return planCounter; } function executeSIP(uint256 planId) external { SIPPlan storage p = plans[planId]; require(p.active, "Inactive"); uint256 amount = p.amountPerCycle; require(p.token.transferFrom(p.investor, address(this), amount), "Transfer failed"); for (uint256 i; i < p.strategies.length; i++) { uint256 portion = (amount * p.allocations[i]) / BPS; p.token.transfer(p.strategies[i], portion); IStrategyAdapter(p.strategies[i]).deposit(portion); } p.lastDepositTime = block.timestamp; p.totalInvested += amount; emit SIPExecuted(planId, amount); } function pauseSIP(uint256 planId) external { SIPPlan storage p = plans[planId]; require(msg.sender == p.investor, "Not owner"); p.active = false; emit SIPPaused(planId); } function withdrawAll(uint256 planId) external { SIPPlan storage p = plans[planId]; require(msg.sender == p.investor, "Not owner"); uint256 beforeBal = p.token.balanceOf(address(this)); for (uint256 i; i < p.strategies.length; i++) { IStrategyAdapter strat = IStrategyAdapter(p.strategies[i]); strat.withdraw(strat.totalValue()); } uint256 gained = p.token.balanceOf(address(this)) - beforeBal; p.token.transfer(p.investor, gained); emit Withdrawn(planId, gained); } }