Skip to content

Commit c0d515c

Browse files
authored
Merge pull request #186 from pushchain/release/v1.1.21-donut
feat: added rollback upgrade handler
2 parents 412c595 + 91cd505 commit c0d515c

File tree

2 files changed

+4
-221
lines changed

2 files changed

+4
-221
lines changed

app/upgrades.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ import (
66
upgradetypes "cosmossdk.io/x/upgrade/types"
77

88
"github.com/pushchain/push-chain-node/app/upgrades"
9-
chainmeta "github.com/pushchain/push-chain-node/app/upgrades/chain-meta"
9+
aiauditfixes "github.com/pushchain/push-chain-node/app/upgrades/ai-audit-fixes"
1010
ceagasandpayload "github.com/pushchain/push-chain-node/app/upgrades/cea-gas-and-payload"
1111
ceapayloadverificationfix "github.com/pushchain/push-chain-node/app/upgrades/cea-payload-verification-fix"
12+
chainmeta "github.com/pushchain/push-chain-node/app/upgrades/chain-meta"
1213
chainmetavotegasless "github.com/pushchain/push-chain-node/app/upgrades/chain-meta-vote-gasless"
1314
ethhashfix "github.com/pushchain/push-chain-node/app/upgrades/eth-hash-fix"
1415
evmrpcfix "github.com/pushchain/push-chain-node/app/upgrades/evm-rpc-fix"

app/upgrades/ai-audit-fixes/upgrade.go

Lines changed: 2 additions & 220 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,18 @@ package aiauditfixes
22

33
import (
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

1914
const UpgradeName = "ai-audit-fixes"
2015

16+
// NewUpgrade constructs the upgrade definition
2117
func 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

Comments
 (0)