@@ -98,6 +98,8 @@ class ContractTestingQRWA : protected ContractTesting
9898 callSystemProcedure (QX_CONTRACT_INDEX, INITIALIZE);
9999 INIT_CONTRACT (QUTIL);
100100 callSystemProcedure (QUTIL_CONTRACT_INDEX, INITIALIZE);
101+ INIT_CONTRACT (QSWAP);
102+ callSystemProcedure (QSWAP_CONTRACT_INDEX, INITIALIZE);
101103
102104 // Custom Initialization for qRWA State
103105 // (Overrides defaults from INITIALIZE() for testing purposes)
@@ -1679,3 +1681,70 @@ TEST(ContractQRWA, FullScenario_DividendsAndGovernance)
16791681 EXPECT_EQ (getBalance (Q1), prevBalances[Q1] + divQQ1);
16801682 EXPECT_EQ (getBalance (Q2), prevBalances[Q2] + divQQ2);
16811683}
1684+
1685+ TEST (ContractQRWA, Payout_MultiContractManagement)
1686+ {
1687+ ContractTestingQRWA qrwa;
1688+
1689+ const sint64 totalShares = 1000000 ;
1690+ const sint64 qxManagedShares = 700000 ;
1691+ const sint64 qswapManagedShares = 300000 ; // 30% moved to QSWAP management
1692+
1693+ // Issue QMINE and give to HOLDER_A
1694+ // Initially, all 1M shares are managed by QX (default for transfers via QX)
1695+ increaseEnergy (QMINE_ISSUER, 1000000000 );
1696+ increaseEnergy (HOLDER_A, 1000000 ); // For fees
1697+
1698+ qrwa.issueAsset (QMINE_ISSUER, QMINE_ASSET.assetName , totalShares);
1699+ qrwa.transferAsset (QMINE_ISSUER, HOLDER_A, QMINE_ASSET, totalShares);
1700+
1701+ // Verify initial state managed by QX
1702+ EXPECT_EQ (numberOfPossessedShares (QMINE_ASSET.assetName , QMINE_ASSET.issuer , HOLDER_A, HOLDER_A, QX_CONTRACT_INDEX, QX_CONTRACT_INDEX), totalShares);
1703+ EXPECT_EQ (numberOfPossessedShares (QMINE_ASSET.assetName , QMINE_ASSET.issuer , HOLDER_A, HOLDER_A, QSWAP_CONTRACT_INDEX, QSWAP_CONTRACT_INDEX), 0 );
1704+
1705+ // Transfer management rights of 300k shares to QSWAP
1706+ // The user (HOLDER_A) remains the Possessor.
1707+ qrwa.transferManagementRights (HOLDER_A, QMINE_ASSET, qswapManagedShares, QSWAP_CONTRACT_INDEX);
1708+
1709+ // Verify the split in management rights
1710+ // 700k should remain under QX
1711+ EXPECT_EQ (numberOfPossessedShares (QMINE_ASSET.assetName , QMINE_ASSET.issuer , HOLDER_A, HOLDER_A, QX_CONTRACT_INDEX, QX_CONTRACT_INDEX), qxManagedShares);
1712+ // 300k should now be under QSWAP
1713+ EXPECT_EQ (numberOfPossessedShares (QMINE_ASSET.assetName , QMINE_ASSET.issuer , HOLDER_A, HOLDER_A, QSWAP_CONTRACT_INDEX, QSWAP_CONTRACT_INDEX), qswapManagedShares);
1714+
1715+ qrwa.beginEpoch ();
1716+
1717+ // Generate Revenue
1718+ // pool A revenue: 1,000,000 QUs
1719+ // fees (50%): 500,000
1720+ // net revenue: 500,000
1721+ // QMINE pool (90%): 450,000
1722+ qrwa.sendToMany (ADMIN_ADDRESS, id (QRWA_CONTRACT_INDEX, 0 , 0 , 0 ), 1000000 );
1723+
1724+ qrwa.endEpoch ();
1725+
1726+ // trigger Payout
1727+ etalonTick.year = 25 ; etalonTick.month = 11 ; etalonTick.day = 7 ; // Friday
1728+ etalonTick.hour = 12 ; etalonTick.minute = 1 ; etalonTick.second = 0 ;
1729+ qrwa.resetPayoutTime ();
1730+
1731+ // snapshot balances for check
1732+ sint64 balanceBefore = getBalance (HOLDER_A);
1733+
1734+ qrwa.endTick ();
1735+
1736+ // Calculate Expected Payout
1737+ // Payout = (UserTotalShares * PoolAmount) / TotalSupply
1738+ // UserTotalShares = 1,000,000 (regardless of manager)
1739+ // PoolAmount = 450,000
1740+ // TotalSupply = 1,000,000
1741+ // Expected = 450,000
1742+ sint64 expectedPayout = (totalShares * 450000 ) / totalShares;
1743+
1744+ sint64 balanceAfter = getBalance (HOLDER_A);
1745+
1746+ // If qRWA only counted QX shares, the payout would be (700k/1M * 450k) = 315,000.
1747+ // If qRWA counts ALL shares, the payout is 450,000.
1748+ EXPECT_EQ (balanceAfter - balanceBefore, expectedPayout);
1749+ EXPECT_EQ (balanceAfter - balanceBefore, 450000 );
1750+ }
0 commit comments