fix(trading): refresh creator_vault from on-chain BC state before sell
Post-2026-04-28, BC.creator can be delegated to a PFEE-program-owned PDA after the initial creator buy. The create-time creator_vault cached on TokenInfo goes stale before the sell lands, producing ConstraintSeeds (0x7d6) on the Sell instruction. The sell flow already re-fetches pool_state to refresh is_mayhem_mode and is_cashback_coin; extend it to also refresh token_info.creator and re-derive creator_vault from the current BC.creator. Mainnet validation: geyser listener buy+sell on BEE — buy 2TSqZHZh…k7uN, sell 3TevcP5g…f8nQ, err=None on both. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -325,6 +325,24 @@ class PlatformAwareSeller(Trader):
|
||||
token_info.is_cashback_coin = pool_state.get(
|
||||
"is_cashback_coin", token_info.is_cashback_coin
|
||||
)
|
||||
# Refresh creator/creator_vault from current BC state. Post
|
||||
# 2026-04-28 the program may delegate BC.creator to a PFEE-owned
|
||||
# PDA after the initial creator buy, so the create-time vault
|
||||
# cached on token_info goes stale before the sell lands. Failing
|
||||
# to refresh manifests as ConstraintSeeds (0x7d6) on Sell.
|
||||
fresh_creator = pool_state.get("creator")
|
||||
if fresh_creator:
|
||||
from solders.pubkey import Pubkey as _Pubkey
|
||||
|
||||
new_creator = (
|
||||
_Pubkey.from_string(fresh_creator)
|
||||
if isinstance(fresh_creator, str)
|
||||
else fresh_creator
|
||||
)
|
||||
token_info.creator = new_creator
|
||||
token_info.creator_vault = address_provider.derive_creator_vault(
|
||||
new_creator
|
||||
)
|
||||
except Exception as e: # noqa: BLE001
|
||||
logger.warning(
|
||||
f"Could not refresh curve flags before sell ({e}); "
|
||||
|
||||
Reference in New Issue
Block a user