Skip to main content
PulseScanner.io

Address

0x3ef7c021bf808a6898dabe85fd06a62c7ddd574d
Current Holdings
$0.5494
TXs sent
not counted
First Active
2025-10-21
block 24,815,651
Last Active
329 days ago
block 24,817,243
Funded By
0x07ba…0120

Net worth historyi

3 snapshots · to block 27,488,952coverage change 26 Augcoverage change 27 Augcoverage change 27 Augcoverage change 27 Augcoverage change 27 Aug
exact matchTargetStrategysolc 0.8.20+commit.a1b79de6runtime exact · creation exact
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IERC20 {
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
    function transfer(address to, uint256 amount) external returns (bool);
    function approve(address spender, uint256 amount) external returns (bool);
    function balanceOf(address account) external view returns (uint256);
}

interface IChildToken {
    function mint(uint256 amount) external;
}

interface IUniswapV2Router02 {
    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
}

/**
 * @title TargetStrategy
 * @dev Executes concentrated accumulation strategy on a single parent-child pair
 */
contract TargetStrategy {
    // Constants
    address public constant ROUTER = 0x165C3410fC91EF562C50559f7d2289fEbed552d9;
    address public constant WPLS = 0xA1077a294dDE1B09bB078844df40758a5D0f9a27;
    address public constant DEV_ADDRESS =
        0x35D360D7d53Cc96DF768fD2Dec2eEFA4C2f01292;

    // Hardcoded parent token addresses from parents.json
    address[15] public parentTokens = [
        0x3a6c545c9E07e6d3041DC802033400F7fBf96c9a, // Mandala (MDALA)
        0x242D5959672F9f73aa431B485F39aa946A82DD4D, // Maestro (MSTRO)
        0xb5C985A42C61FdF46573479832EFD020E79ABD8F, // Geisha (GEISH)
        0x67d2c95c23877aD349671943293E0eF3Af7fc6Ec, // Satori (STORI)
        0xa16e2f4A56214061a4a1E4d7865A138D505d28b1, // FengShui (FSHUI)
        0x95400e06C94bE8178f92e4daA3eDa6909db5ABf4, // Yinyang (YYANG)
        0x1Bd1a74c107F0B4DEd166F167e162E0e5b710836, // Tantra (TANTR)
        0x0704b52496056CBE168e511f1CB0d9DE049FABD8, // Dharma (DHARM)
        0xE320AF6d4ABEDfcb1f96f156A0eB2a9B4D36E47D, // Samsara (SSARA)
        0x0f72fF84E8b57b74d4C5e915d3d3109f28045ED8, // Transcend (TCEND)
        0x29Fa9D03730E5c7224a3996AF870D9C07F2dD209, // Renaissance (RENAI)
        0x3EF4878344C88df86d695a6e58156F9d94A278D2, // Epiphany (EPIPH)
        0xaf1EfD88115a90676f8EEef01C88b0C49F3e8e8b, // Si Dang Red (DANG)
        0xe6e5B8AB71e5A747A609796666D0E3A0a5eC8BFf, // Si Kao White (KAO)
        0x74a1942613008Aa6Fec06C27F796edE6460259c1 // Si Faa Blue (SIFA)
    ];

    // Hardcoded child token addresses from children.json
    address[15] public childTokens = [
        0x553D74B68faDb8156cAfa4165Cc2Ab588A0F4003, // Effect (EFFECT)
        0xeeCd4F241EBc0c77d6569a2cF09d1a9304E9cB1c, // Symphony (SYMPH)
        0xC90843A793e714fa3CBbFd84A60CcB9bA069dea0, // Blossom (BLOSM)
        0x26b565954778A2661887a04A761C8057B99A80E9, // Awaken (AWAKE)
        0xE16E03923928f2c0B1EE7f7dC82a20f5C34F46B2, // Balance (BLNCE)
        0x491127c99f093b120F20456e2A7C09E605F89Da3, // Flux (FLUX)
        0x600032F4a970CaBfD9565c62Def0e1593a4a5503, // PulseLove (PLOVE)
        0xC519E2705D930033DF7B8560FA2764a380fd6958, // Decree (DCREE)
        0xD9F3f5674523Eaec7a011322D10135021ba699AB, // Cycle (CYCLE)
        0x0dBbCfcD512E9f003454fc1907608a561Cd62709, // Ascend (ASCND)
        0xF6bBa46921521aE18c400D9577f7C9d0Afc81053, // Rebirth (RBRTH)
        0x37AFfcBE22281DdD9ab411171254877Ea8E9b1d1, // Lucent (LCNT)
        0x601f6D55a663249f0C679aEa5b960f29cdE691d8, // Red Pill (RPILL)
        0xaba8718fAA833aC3Aa229AAD1EBf979ef595ef6D, // White Pill (WPILL)
        0x77f80C7B24cD329a02732b9181c794037cF50919 // Blue Pill (BPILL)
    ];

    // Hardcoded child/WPLS LP pair addresses from pairs.json
    address[15] public childWplsPairs = [
        0xeC2eB0b932cf32f19081FCC60a03690172D4Fb23, // EFFECT/WPLS
        0x42B620F64cb1c2d868Da2c1F8817b18E09C5463c, // SYMPH/WPLS
        0x9b64874A71545cE826f7b83846dd0F9312c01f9C, // BLOSM/WPLS
        0xfedc1278Cc060153cE6bFB8ef2c5Ba30D666fA3d, // AWAKE/WPLS
        0x7eC563eC2d72a98F14a051cf56eB5BDB78Be27E9, // BLNCE/WPLS
        0xc553C345693A5C48B6aC7e2cc217B556AC831d33, // FLUX/WPLS
        0x25eEF9Bdb2c7c1C7875D9dE5E3164754C9D8fDFD, // PLOVE/WPLS
        0x5b896621B87Ca9dE9ED8AE28D70a71C6153E3277, // DCREE/WPLS
        0xdf61b783a889c93EeC31a4Ad3A9e27196C9f6179, // CYCLE/WPLS
        0x8aaE0302EeE993aF50E84D3D873C56fCF26938a7, // ASCND/WPLS
        0xd02E68860340ab8dC899817604397FE018BcF262, // RBRTH/WPLS
        0xCBfEde32634cBA83b7f2D5F540949fc799053b7E, // LCNT/WPLS
        0xEb617C42AFC0F81d0b51230C921cd10Acb77929C, // RPILL/WPLS
        0x7769066Af08CEb9aE23c2caAa7d9c97fe4EcECFa, // WPILL/WPLS
        0xDEE55a5f6CD218a51d490D05aDf859130F687A45 // BPILL/WPLS
    ];

    // Parent/Child LP pair addresses from parent-child-pairs.json
    address[15] public parentChildPairs = [
        0xd19771E37F3085443340F45BDF5A8e61dd888748, // MDALA/EFFECT
        0x5CB9357Dac71041aE2c9f9d942232334C5bC3B92, // MSTRO/SYMPH
        0x4154f59F735BfD52261cd7D68C9c69328b8d5B72, // GEISH/BLOSM
        0x3D16c666F7Bc04F6a51fB6CC6A38a4470a740fF2, // STORI/AWAKE
        0x549894AbD605e3a39C48C9D4876F6d822eBbb817, // FSHUI/BLNCE
        0xF890B68a356E282B018bdA965B99f07c0F6585ff, // YYANG/FLUX
        0x6C310542e7958096DCf73a1635391A3aD9b6f968, // TANTR/PLOVE
        0xb5f664fD6F8e642C1201148619831f8be80A0424, // DHARM/DCREE
        0x0b0126D095aD250e1C5d9572a9F962d88D0e844C, // SSARA/CYCLE
        0x169290308ea015b8127F9A731104944d356A98ED, // TCEND/ASCND
        0xc5eB88A9a0C3715C7F6F5c06DFe2664FC647c77E, // RENAI/RBRTH
        0x3D94329A8E681d15d1618128e3484933186DBB32, // EPIPH/LCNT
        0xad76cfBC73f38fdf0665E1e2deF6F2aAAA3Bc42C, // DANG/RPILL
        0x3fa4B4eE55bbaE3e58e7f15c382a549CdE392422, // KAO/WPILL
        0x6C5B2d5ca80F0CeC8b2845060aACC6d4768420dD // SIFA/BPILL
    ];

    // Events
    event TargetStrategyExecuted(
        address indexed user,
        uint256 parentIndex,
        uint256 plsUsed,
        uint256 childAccumulated,
        uint256 lpAdded
    );

    /**
     * @notice Executes target strategy for a specific parent-child pair
     * @param adjustedX Base PLS amount per iteration
     * @param parentIndex Index of the target parent-child pair (0-14)
     * @param swapPercentage Percentage of parent to swap (33 or 100)
     */
    function executeTargetStrategy(
        uint256 adjustedX,
        uint256 parentIndex,
        uint256 swapPercentage
    ) external payable {
        require(parentIndex < 15, "Invalid parent index");
        require(
            swapPercentage == 33 || swapPercentage == 100,
            "Invalid swap percentage"
        );

        // Step 1: Calculate total PLS budget
        uint256 total = adjustedX * 15;
        require(msg.value >= total, "Insufficient PLS");

        // Step 2: Swap PLS → Parent token (66.666% of total)
        uint256 plsToParent = (total * 66666) / 100000;
        uint256 parentBack = _swapPlsToParent(parentIndex, plsToParent);

        // Step 3: Swap parent → child (use swapPercentage)
        uint256 parentToSwap = (parentBack * swapPercentage * 1000) / 100000;
        uint256 childFromSwap = _swapParentToChild(parentIndex, parentToSwap);

        // Step 4: Burn parent → child (only if swapPercentage < 100)
        uint256 childFromBurn = 0;
        if (swapPercentage < 100) {
            uint256 parentToBurn = parentBack - parentToSwap;
            childFromBurn = _burnParentToChild(parentIndex, parentToBurn);
        }

        // Step 5: Add liquidity (remaining PLS × 0.98)
        uint256 plsForLiquidity = ((total - plsToParent) * 98) / 100;
        uint256 totalChild = childFromSwap + childFromBurn;
        uint256 lpAdded = _addLiquidity(
            parentIndex,
            totalChild,
            plsForLiquidity
        );

        emit TargetStrategyExecuted(
            msg.sender,
            parentIndex,
            total,
            totalChild,
            lpAdded
        );
    }

    /**
     * @dev Swaps PLS to parent token
     */
    function _swapPlsToParent(
        uint256 parentIndex,
        uint256 plsAmount
    ) internal returns (uint256) {
        address[] memory path = new address[](2);
        path[0] = WPLS;
        path[1] = parentTokens[parentIndex];

        uint256[] memory amounts = IUniswapV2Router02(ROUTER)
            .swapExactETHForTokens{value: plsAmount}(
            0,
            path,
            address(this),
            block.timestamp
        );

        return amounts[1];
    }

    /**
     * @dev Swaps parent token to child token
     */
    function _swapParentToChild(
        uint256 parentIndex,
        uint256 parentAmount
    ) internal returns (uint256) {
        address parentToken = parentTokens[parentIndex];
        address childToken = childTokens[parentIndex];

        // Approve router
        require(
            IERC20(parentToken).approve(ROUTER, parentAmount),
            "Parent approval failed"
        );

        address[] memory path = new address[](2);
        path[0] = parentToken;
        path[1] = childToken;

        uint256[] memory amounts = IUniswapV2Router02(ROUTER)
            .swapExactTokensForTokens(
                parentAmount,
                0,
                path,
                address(this),
                block.timestamp
            );

        return amounts[1];
    }

    /**
     * @dev Burns parent token to mint child token
     */
    function _burnParentToChild(
        uint256 parentIndex,
        uint256 parentAmount
    ) internal returns (uint256) {
        address parentToken = parentTokens[parentIndex];
        address childToken = childTokens[parentIndex];

        // Check balance before (for tax tokens)
        uint256 balanceBefore = IERC20(childToken).balanceOf(address(this));

        // Approve child contract to spend parent tokens
        require(
            IERC20(parentToken).approve(childToken, parentAmount),
            "Parent approval for burn failed"
        );

        // Mint child tokens by burning parent
        IChildToken(childToken).mint(parentAmount);

        // Check balance after to get actual minted amount
        uint256 balanceAfter = IERC20(childToken).balanceOf(address(this));
        uint256 childMinted = balanceAfter - balanceBefore;

        require(childMinted > 0, "No child tokens minted");

        return childMinted;
    }

    /**
     * @dev Adds liquidity to child/WPLS pair
     */
    function _addLiquidity(
        uint256 parentIndex,
        uint256 childAmount,
        uint256 plsAmount
    ) internal returns (uint256) {
        address childToken = childTokens[parentIndex];

        // Approve router to spend child tokens
        require(
            IERC20(childToken).approve(ROUTER, childAmount),
            "Child approval for LP failed"
        );

        // Add liquidity
        (, , uint256 liquidity) = IUniswapV2Router02(ROUTER).addLiquidityETH{
            value: plsAmount
        }(childToken, childAmount, 0, 0, msg.sender, block.timestamp);

        return liquidity;
    }

    /**
     * @dev Emergency function to recover stuck tokens
     * @notice Only callable by dev address
     */
    function emergencyWithdraw(address tokenAddress) external {
        require(msg.sender == DEV_ADDRESS, "Only dev can withdraw");

        if (tokenAddress == address(0)) {
            // Withdraw PLS
            (bool sent, ) = DEV_ADDRESS.call{value: address(this).balance}("");
            require(sent, "PLS withdrawal failed");
        } else {
            // Withdraw tokens
            IERC20 token = IERC20(tokenAddress);
            uint256 balance = token.balanceOf(address(this));
            require(
                token.transfer(DEV_ADDRESS, balance),
                "Token withdrawal failed"
            );
        }
    }

    /**
     * @dev Allows contract to receive PLS
     */
    receive() external payable {}
}