@@ -2,22 +2,18 @@ package aiauditfixes
22
33import (
44 "context"
5- "fmt"
65
7- "cosmossdk.io/log"
86 storetypes "cosmossdk.io/store/types"
97 upgradetypes "cosmossdk.io/x/upgrade/types"
108
11- sdk "github.com/cosmos/cosmos-sdk/types"
129 "github.com/cosmos/cosmos-sdk/types/module"
1310
1411 "github.com/pushchain/push-chain-node/app/upgrades"
15- uexecutortypes "github.com/pushchain/push-chain-node/x/uexecutor/types"
16- utsstypes "github.com/pushchain/push-chain-node/x/utss/types"
1712)
1813
1914const UpgradeName = "ai-audit-fixes"
2015
16+ // NewUpgrade constructs the upgrade definition
2117func NewUpgrade () upgrades.Upgrade {
2218 return upgrades.Upgrade {
2319 UpgradeName : UpgradeName ,
@@ -35,220 +31,6 @@ func CreateUpgradeHandler(
3531 ak * upgrades.AppKeepers ,
3632) upgradetypes.UpgradeHandler {
3733 return func (ctx context.Context , plan upgradetypes.Plan , fromVM module.VersionMap ) (module.VersionMap , error ) {
38- sdkCtx := sdk .UnwrapSDKContext (ctx )
39- logger := sdkCtx .Logger ().With ("upgrade" , UpgradeName )
40- logger .Info ("Starting upgrade handler" )
41-
42- // ---------------------------------------------------------------
43- // 1. Backfill PendingOutbounds index from existing UniversalTx
44- // ---------------------------------------------------------------
45- if err := backfillPendingOutbounds (ctx , ak , logger ); err != nil {
46- return nil , fmt .Errorf ("backfillPendingOutbounds: %w" , err )
47- }
48-
49- // ---------------------------------------------------------------
50- // 2. Backfill TssEvents from ProcessHistory + TssKeyHistory
51- // ---------------------------------------------------------------
52- if err := backfillTssEvents (ctx , ak , logger ); err != nil {
53- return nil , fmt .Errorf ("backfillTssEvents: %w" , err )
54- }
55-
56- // ---------------------------------------------------------------
57- // 3. Register usigverifier V2 precompile in EVM params
58- // ---------------------------------------------------------------
59- if err := registerPrecompileV2 (sdkCtx , ak , logger ); err != nil {
60- return nil , fmt .Errorf ("registerPrecompileV2: %w" , err )
61- }
62-
63- // ---------------------------------------------------------------
64- // 4. Run module migrations (consensus version bumps)
65- // - uexecutor: 5 → 6 (PendingOutbounds collection)
66- // - utss: 1 → 2 (TssEvents collections)
67- // ---------------------------------------------------------------
68- versionMap , err := mm .RunMigrations (ctx , configurator , fromVM )
69- if err != nil {
70- return nil , fmt .Errorf ("RunMigrations: %w" , err )
71- }
72-
73- logger .Info ("Upgrade complete" , "upgrade" , UpgradeName )
74- return versionMap , nil
34+ return mm .RunMigrations (ctx , configurator , fromVM )
7535 }
7636}
77-
78- // backfillPendingOutbounds iterates all UniversalTx entries and creates a
79- // PendingOutboundEntry for every outbound that is still in PENDING status.
80- func backfillPendingOutbounds (ctx context.Context , ak * upgrades.AppKeepers , logger log.Logger ) error {
81- keeper := ak .UExecutorKeeper
82- logger .Info ("Backfilling PendingOutbounds index" )
83-
84- count := 0
85- iter , err := keeper .UniversalTx .Iterate (ctx , nil )
86- if err != nil {
87- return fmt .Errorf ("failed to create UniversalTx iterator: %w" , err )
88- }
89- defer iter .Close ()
90-
91- for ; iter .Valid (); iter .Next () {
92- kv , err := iter .KeyValue ()
93- if err != nil {
94- return fmt .Errorf ("failed to read UniversalTx entry: %w" , err )
95- }
96-
97- utxId := kv .Key
98- utx := kv .Value
99-
100- for _ , ob := range utx .OutboundTx {
101- if ob == nil {
102- continue
103- }
104- if ob .OutboundStatus == uexecutortypes .Status_PENDING {
105- entry := uexecutortypes.PendingOutboundEntry {
106- OutboundId : ob .Id ,
107- UniversalTxId : utxId ,
108- CreatedAt : 0 , // unknown historical height
109- }
110- if err := keeper .PendingOutbounds .Set (ctx , ob .Id , entry ); err != nil {
111- return fmt .Errorf ("failed to set pending outbound %s: %w" , ob .Id , err )
112- }
113- count ++
114- }
115- }
116- }
117-
118- logger .Info ("PendingOutbounds backfill complete" , "total_indexed" , count )
119- return nil
120- }
121-
122- // backfillTssEvents creates TssEvent entries from ProcessHistory and TssKeyHistory.
123- // Skips if events already exist (re-run guard).
124- func backfillTssEvents (ctx context.Context , ak * upgrades.AppKeepers , logger log.Logger ) error {
125- utssKeeper := ak .UTssKeeper
126- logger .Info ("Backfilling TssEvents" )
127-
128- // Guard: skip if events already exist
129- hasEvents := false
130- _ = utssKeeper .TssEvents .Walk (ctx , nil , func (id uint64 , event utsstypes.TssEvent ) (bool , error ) {
131- hasEvents = true
132- return true , nil
133- })
134- if hasEvents {
135- logger .Info ("TssEvents already exist, skipping backfill" )
136- return nil
137- }
138-
139- // Backfill from ProcessHistory
140- err := utssKeeper .ProcessHistory .Walk (ctx , nil , func (processId uint64 , process utsstypes.TssKeyProcess ) (bool , error ) {
141- eventId , err := utssKeeper .NextTssEventId .Next (ctx )
142- if err != nil {
143- return true , fmt .Errorf ("failed to generate tss event id: %w" , err )
144- }
145-
146- var status utsstypes.TssEventStatus
147- switch process .Status {
148- case utsstypes .TssKeyProcessStatus_TSS_KEY_PROCESS_PENDING :
149- status = utsstypes .TssEventStatus_TSS_EVENT_ACTIVE
150- case utsstypes .TssKeyProcessStatus_TSS_KEY_PROCESS_SUCCESS :
151- status = utsstypes .TssEventStatus_TSS_EVENT_COMPLETED
152- case utsstypes .TssKeyProcessStatus_TSS_KEY_PROCESS_FAILED :
153- status = utsstypes .TssEventStatus_TSS_EVENT_EXPIRED
154- default :
155- status = utsstypes .TssEventStatus_TSS_EVENT_ACTIVE
156- }
157-
158- tssEvent := utsstypes.TssEvent {
159- Id : eventId ,
160- EventType : utsstypes .TssEventType_TSS_EVENT_PROCESS_INITIATED ,
161- Status : status ,
162- ProcessId : process .Id ,
163- ProcessType : process .ProcessType .String (),
164- Participants : process .Participants ,
165- ExpiryHeight : process .ExpiryHeight ,
166- BlockHeight : process .BlockHeight ,
167- }
168-
169- if err := utssKeeper .TssEvents .Set (ctx , eventId , tssEvent ); err != nil {
170- return true , fmt .Errorf ("failed to store tss event: %w" , err )
171- }
172- return false , nil
173- })
174- if err != nil {
175- return fmt .Errorf ("failed to backfill process history events: %w" , err )
176- }
177-
178- // Backfill from TssKeyHistory
179- var latestFinalizedEventId uint64
180- var latestFinalizedBlockHeight int64
181- hasFinalized := false
182-
183- err = utssKeeper .TssKeyHistory .Walk (ctx , nil , func (keyId string , key utsstypes.TssKey ) (bool , error ) {
184- eventId , err := utssKeeper .NextTssEventId .Next (ctx )
185- if err != nil {
186- return true , fmt .Errorf ("failed to generate tss event id: %w" , err )
187- }
188-
189- tssEvent := utsstypes.TssEvent {
190- Id : eventId ,
191- EventType : utsstypes .TssEventType_TSS_EVENT_KEY_FINALIZED ,
192- Status : utsstypes .TssEventStatus_TSS_EVENT_COMPLETED ,
193- ProcessId : key .ProcessId ,
194- Participants : key .Participants ,
195- KeyId : key .KeyId ,
196- TssPubkey : key .TssPubkey ,
197- BlockHeight : key .FinalizedBlockHeight ,
198- }
199-
200- if err := utssKeeper .TssEvents .Set (ctx , eventId , tssEvent ); err != nil {
201- return true , fmt .Errorf ("failed to store tss key finalized event: %w" , err )
202- }
203-
204- if key .FinalizedBlockHeight >= latestFinalizedBlockHeight {
205- latestFinalizedBlockHeight = key .FinalizedBlockHeight
206- latestFinalizedEventId = eventId
207- hasFinalized = true
208- }
209- return false , nil
210- })
211- if err != nil {
212- return fmt .Errorf ("failed to backfill tss key history events: %w" , err )
213- }
214-
215- // Mark the latest finalized key event as ACTIVE
216- if hasFinalized {
217- latestEvent , err := utssKeeper .TssEvents .Get (ctx , latestFinalizedEventId )
218- if err != nil {
219- return fmt .Errorf ("failed to get latest finalized event: %w" , err )
220- }
221- latestEvent .Status = utsstypes .TssEventStatus_TSS_EVENT_ACTIVE
222- if err := utssKeeper .TssEvents .Set (ctx , latestFinalizedEventId , latestEvent ); err != nil {
223- return fmt .Errorf ("failed to update latest finalized event status: %w" , err )
224- }
225- }
226-
227- logger .Info ("TssEvents backfill complete" )
228- return nil
229- }
230-
231- // registerPrecompileV2 adds the usigverifier V2 address to EVM ActiveStaticPrecompiles
232- // so the EVM recognizes it as a callable precompile.
233- func registerPrecompileV2 (sdkCtx sdk.Context , ak * upgrades.AppKeepers , logger log.Logger ) error {
234- const usigVerifierV2Addr = "0xEC00000000000000000000000000000000000001"
235-
236- evmParams := ak .EVMKeeper .GetParams (sdkCtx )
237-
238- // Check if already registered
239- for _ , addr := range evmParams .ActiveStaticPrecompiles {
240- if addr == usigVerifierV2Addr {
241- logger .Info ("usigverifier V2 precompile already registered in EVM params" )
242- return nil
243- }
244- }
245-
246- evmParams .ActiveStaticPrecompiles = append (evmParams .ActiveStaticPrecompiles , usigVerifierV2Addr )
247-
248- if err := ak .EVMKeeper .SetParams (sdkCtx , evmParams ); err != nil {
249- return fmt .Errorf ("failed to set EVM params with new precompile: %w" , err )
250- }
251-
252- logger .Info ("Registered usigverifier V2 precompile in EVM params" , "address" , usigVerifierV2Addr )
253- return nil
254- }
0 commit comments