We do not have a reliable USD price for the recorded assets yet.
0x6c9ed4c2d81b6abfdf297b0cbc13585ed91f2a5e69e3545d3ea4316f50021b560x91334d03dd9b9de8d48b50fe389337eeb759aeb1BSC0x713630359cc9046869ad1642a7b61c23956425ccBSC0x12dabfce08ef59c24cdee6c488e05179fb8d64d9BSC0xaae35c003a323d291b7293618506aa612302b7cfBSC0xe3cba5c0a8efaedce84751af2efddcf071d311a9BSCOn BSC (chainid 56), a single adversary-crafted contract-creation transaction drained the MorningStar staking contract’s entire MSC balance and converted the resulting liquidity into a large WBNB profit for the attacker.
An unprivileged EOA 0xB0720D8541cD2b6fC35cCC39ec84e84383A7000b deployed an attack contract 0x486da49a56b564B824ea140fa4a5fF74DE6CF34B in transaction 0x6c9ed4c2d81b6abfdf297b0cbc13585ed91f2a5e69e3545d3ea4316f50021b56 at block 73309656. During its constructor execution, this contract immediately invoked a pre-configured helper contract 0x1e70f17d4E9dB9341AF7fc6a8FfcDCb2A52291e5, which in turn called MorningStar::releaseReward with a fee equal to MorningStar’s entire MSC balance.
Because releaseReward(uint256 fee) was a public function with no access control and no bound tying fee to legitimate rewards, MorningStar:
0xAaE35C003A323D291B7293618506Aa612302B7cf, pushing value into the main GPC/WBNB pool 0x12dAbFCe08eF59c24cdee6c488E05179Fb8D64D9.0x6278FA23Fbe28B9736214E03cf2030F5ee1CCaC9.Using the newly created AMMToken imbalance plus a large pre-existing AMMToken position and approvals, helper 0x1e70... then executed a sequence of swaps across the GPC/WBNB and GPC/XDK pools, ultimately ending with WBNB and transferring that amount to . After paying BNB in gas, the adversary’s net WBNB-equivalent gain was:
149.7439671450380251120xB072...0.000144152801441528149.743967145038025112 - 0.000144152801441528 = 149.743822992236583584 WBNBThis is an ACT (Adversary-Crafted Transaction) opportunity: a single, permissionless transaction crafted by an unprivileged EOA produces a strictly positive profit in the WBNB reference asset, using only publicly available contract functionality and existing liquidity.
Immediately before block 73309656 (pre_state_sigma_B), the canonical BSC state satisfies:
0x91334D03DD9b9De8D48b50FE389337eEb759aeB1 holds 13,329,580,007,446,108,335,195,360 MSC at token address 0x713630359Cc9046869aD1642a7b61c23956425cC.0x1e70... holds a very large AMMToken/GPC balance and has allowances set on PancakeRouter 0x10ED43C718714eb63d5aA57B78B54704E256024E and the relevant AMM pairs.0xAaE35C003A323D291B7293618506Aa612302B7cf, main GPC/WBNB pair 0x12dAbF..., and GPC/XDK pair 0xe3cBa5C0A8efAeDce84751aF2EFDdCf071D311a9 match the recorded trace and prestate balance diffs.This configuration is reconstructed from:
0x6c9ed4....Source: prestateTracer balance diff for the exploit transaction (debug_traceTransaction with prestateTracer) showing ERC20 deltas.
{
"erc20_balance_deltas": [
{
"token": "0x713630359cc9046869ad1642a7b61c23956425cc",
"holder": "0x91334d03dd9b9de8d48b50fe389337eeb759aeb1",
"before": "13329580007446108335195360",
"after": "0",
"delta": "-13329580007446108335195360",
"contract_name": "MSC"
},
{
"token": "0x713630359cc9046869ad1642a7b61c23956425cc",
"holder": "0xaae35c003a323d291b7293618506aa612302b7cf",
"before": "1995911235000045821689622",
"after": "8660701238723099989287302",
"delta": "6664790003723054167597680",
"contract_name": "MSC"
},
{
"token": "0x713630359cc9046869ad1642a7b61c23956425cc",
"holder": "0x6278fa23fbe28b9736214e03cf2030f5ee1ccac9",
"before": "8193779314400978865562",
"after": "6672983783037455146463242",
"delta": "6664790003723054167597680",
"contract_name": "MSC"
}
]
}
Caption: MorningStar’s entire MSC balance (13,329,580,007,446,108,335,195,360) leaves the staking contract and is split exactly in half between the MSC/GPC pool and the MorningStar profit Gnosis Safe.
The ACT opportunity consists of a single adversary-crafted transaction:
0x6c9ed4c2d81b6abfdf297b0cbc13585ed91f2a5e69e3545d3ea4316f50021b56adversary-crafted0xB072...From the seed trace and balance diffs:
0x1e70... receives 205.635720265951753886 WBNB from the GPC/WBNB pair.55.891753120913728774 WBNB back into that pair via PancakeRouter::swapTokensForExactTokens.149.743967145038025112 WBNB and transfers this full amount to 0xB072....0xB072... pays 0.000144152801441528 BNB in gas, with no other native balance changes in the adversary cluster.Treating BNB and WBNB 1:1, the adversary’s portfolio change in the WBNB reference asset is strictly positive:
149.743967145038025112 - 0.000144152801441528 = 149.743822992236583584 WBNBSource: cast trace for the exploit transaction, focusing on WBNB movements.
PancakePair::swap(205635720265951753886, 0, 0x1e70..., 0x)
WBNB::transfer(0x1e70..., 205635720265951753886)
...
PancakeRouter::swapTokensForExactTokens(..., 205635720265951753886, [WBNB, AMMToken], 0x1e70..., ...)
WBNB::transferFrom(0x1e70..., PancakePair: [0x12dAbF...], 55891753120913728774)
...
WBNB::transfer(0xB072..., 149743967145038025112)
Caption: Helper 0x1e70... receives 205.6357 WBNB, spends 55.8917 WBNB back into the GPC/WBNB pair, and then transfers the remaining 149.7439 WBNB to the adversary EOA.
Source: prestateTracer native balance deltas for the exploit transaction.
{
"native_balance_deltas": [
{
"address": "0xb0720d8541cd2b6fc35ccc39ec84e84383a7000b",
"before_wei": "295154261400000000",
"after_wei": "295010108598558472",
"delta_wei": "-144152801441528"
}
]
}
Caption: The only native BNB movement in the adversary cluster is gas paid by 0xB072..., confirming the net WBNB-equivalent profit calculation.
releaseRewardThe core vulnerability lies in the MorningStar staking contract’s releaseReward function. It is declared public with no access control or bounds on the fee parameter and directly spends MorningStar’s MSC balance and routes assets into AMM pools.
releaseReward implementation (MorningStar.sol)Source: verified MorningStar staking contract source (MorningStar.sol).
function releaseReward(uint256 fee) public{
uint256 burnFee = fee/2;
uint256 profitFee = fee-burnFee;
swapTokenForGPC(burnFee,uniswapV2PairGpc);
IPancakePair(uniswapV2PairGpc).sync();
IERC20(msc).safeTransfer(profit,profitFee);
}
Caption: Any caller can choose an arbitrary fee, causing MorningStar to swap half of that MSC into the MSC/GPC pool and send the other half directly to the profit address.
Key properties:
releaseReward(uint256 fee) is public and unguarded; there is no onlyOwner or role-based restriction.fee is a raw caller-supplied value; there is no check that it corresponds to accumulated rewards or any internal accounting.burnFee = fee / 2.profitFee = fee - burnFee.swapTokenForGPC(burnFee, uniswapV2PairGpc) to route MSC into GPC via PancakeRouter, sending output into a fixed MSC/GPC pair.IPancakePair(uniswapV2PairGpc).sync() to update pair reserves.IERC20(msc).safeTransfer(profit, profitFee) to send the remaining MSC directly to the profit address.Because MorningStar has pre-approved PancakeRouter to spend its MSC and holds the protocol’s staking pool balance, any arbitrary caller can:
fee directly to the profit address.The exploit transaction’s runtime execution on the deployed attack contract performs three main steps:
0x1e70... to manipulate AMM pools and set approvals.releaseReward with fee = MorningStar.mscBalance._attack and tx.origin GuardThe decompiled helper contract 0x1e70... contains an _attack() function that is gated by tx.origin and orchestrates AMM interactions.
_attack entrypoint (decompiled helper)Source: Heimdall decompiled source for helper contract 0x1e70....
function _attack() public {
require(tx.origin == (address(store_a)), "Only owner can call this function");
...
(bool success, bytes memory ret0) =
address(0xd3c304697f63b279cd314f92c19cdbe5e5b1631a).Unresolved_70a08231(var_b); // AMMToken::balanceOf
...
(bool success, bytes memory ret1) =
address(0xe3cba5c0a8efaedce84751af2efddcf071d311a9).Unresolved_022c0d9f(var_e); // AMM pair swap
}
Caption: Helper _attack() can only be executed when tx.origin equals address(store_a), binding the helper contract to a specific EOA, and then drives AMMToken and pair interactions.
From the cast trace:
AMMToken::balanceOf(0x1e70...).swapExactTokensForTokensSupportingFeeOnTransferTokens to move AMMToken into the GPC/WBNB pair.This confirms that:
store_a is set to 0xB072... (since _attack() executes without reverting when tx.origin == 0xB072...).releaseReward with Full MSC BalanceWithin the exploit transaction, helper 0x1e70... reads MorningStar’s MSC balance and calls releaseReward with that exact amount:
MSC.balanceOf(MorningStar) = 13,329,580,007,446,108,335,195,360 MSCfee = 13,329,580,007,446,108,335,195,360burnFee = fee / 2 = 6,664,790,003,723,054,167,597,680profitFee = fee - burnFee = 6,664,790,003,723,054,167,597,680The resulting on-chain effects, captured in the trace and balance diffs, are:
6,664,790,003,723,054,167,597,680 MSC (matching the burnFee).6,664,790,003,723,054,167,597,680 MSC (matching the profitFee).After MorningStar’s MSC is partially swapped into AMMToken and partially moved to the profit address, the helper uses:
to push the AMM system through a sequence of swaps:
The trace shows:
PancakePair::swap and AMMToken::transfer operations moving AMMToken between the MSC/GPC and GPC/WBNB pools.205.6357 WBNB inflow and 55.8917 WBNB outflow for helper 0x1e70....WBNB::transfer from 0x1e70... to 0xB072... of 149.743967145038025112 WBNB.This confirms the described AMM unwinding and the realized profit.
The root cause is a protocol-level bug in MorningStar’s staking contract:
releaseReward(uint256 fee), which is publicly callable by any address.Helper 0x1e70... and the attack contract 0x486d... simply exploit this flawed API, using AMM mechanics and pre-loaded liquidity to convert the induced imbalance into a one-shot WBNB profit.
The analysis identifies a tightly scoped adversary cluster:
0xB0720D8541cD2b6fC35cCC39ec84e84383A7000btx.origin of the exploit transaction, gas payer, and final WBNB recipient.0x486da49a56b564B824ea140fa4a5fF74DE6CF34B0xB072... in the exploit transaction; its runtime execution orchestrates calls into helper 0x1e70..., MorningStar, PancakeRouter, and AMM pairs.0x1e70f17d4E9dB9341AF7fc6a8FfcDCb2A52291e5_attack() guarded by tx.origin == address(store_a); holds and routes AMMToken and WBNB balances; central executor of the AMM manipulation and releaseReward call.This clustering is supported by:
_attack() tx.origin guard.0xB072....0xB072... and 0x1e70... indicating usage patterns consistent with attacker-specific infrastructure.Key victim-side and infrastructure contracts include:
0x91334D03DD9b9De8D48b50FE389337eEb759aeB1releaseReward function.0x713630359Cc9046869aD1642a7b61c23956425cC0xAaE35C003A323D291B7293618506Aa612302B7cf0x12dAbFCe08eF59c24cdee6c488E05179Fb8D64D90xe3cBa5C0A8efAeDce84751aF2EFDdCf071D311a90x6278FA23Fbe28B9736214E03cf2030F5ee1CCaC9releaseReward.The adversary flow can be decomposed into three lifecycle stages, all realized within the single exploit transaction but relying on pre-incident setup.
Before block 73309656:
0x1e70... is deployed with store_a configured to the attacker EOA 0xB072....Evidence:
AMMToken::balanceOf(0x1e70...) returning 46,841,803,215,322,280,406,440,238 AMMToken._attack() with tx.origin == 0xB072..., confirming the ownership binding.Stage: “Attack contract deployment and MorningStar MSC drain.”
Within the exploit transaction:
0xB072... sends a contract-creation transaction whose input is the creation bytecode of 0x486d....0x1e70....MSC.balanceOf(MorningStar) and obtains 13,329,580,007,446,108,335,195,360 MSC.MorningStar::releaseReward with this exact amount as fee.Effects:
Stage: “AMM unwinding and WBNB profit realization.”
Using:
helper 0x1e70...:
149.743967145038025112 WBNB at 0x1e70....0xB072....Combined with the gas cost, this yields a net WBNB-equivalent profit of 149.743822992236583584 for the adversary.
The primary quantified token-level losses are:
13,329,580,007,446,108,335,195,360 MSC.6,664,790,003,723,054,167,597,680 MSC swapped into AMMToken in the MSC/GPC pair.6,664,790,003,723,054,167,597,680 MSC transferred to the profit Gnosis Safe.71,551,581,422,663,723,226,014,917 AMMToken from the MSC/GPC pool, reflecting the AMM rebalancing that enriches the main GPC/WBNB pool.From the balance diffs and trace:
At the protocol level:
For liquidity providers:
149.743822992236583584 WBNB effectively extracted to the adversary cluster.For the adversary:
0xB072... realizes a net gain of 149.743822992236583584 WBNB-equivalent, after accounting for gas.0x6c9ed4... on BSC: Collected RPC and Etherscan metadata for the exploit transaction, including block, sender, and input data.0x6c9ed4...: High-verbosity call and event trace showing MorningStar::releaseReward, helper _attack, AMM swaps, and WBNB flows.0x91334D03DD9b9De8D48b50FE389337eEb759aeB1, including releaseReward and swapTokenForGPC.0x1e70...): Heimdall decompiled Solidity for the helper contract, including _attack and its tx.origin guard tying it to 0xB072....