-
Notifications
You must be signed in to change notification settings - Fork 300
Open
Labels
Description
Feature Description
Refactor the bulkSignAccountBasedMessagesWithProvider function in modules/sdk-core/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.ts to ensure that new instances of Wallet are used for each parallel call.
- Extract constructor params from the original wallet instance.
- For each message to be processed in parallel, instantiate a new
Walletobject with the extracted params. - Perform signing/building using the new wallet instance per message.
Also, write comprehensive tests to verify the new behavior and cover edge cases.
Motivation
- Prevent shared state issues or side effects when processing messages in parallel.
- Align with COIN-5426 requirements.
File changed:
- modules/sdk-core/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.ts
Relevant diff:
diff --git a/modules/sdk-core/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.ts b/modules/sdk-core/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.ts
index 47f39c179..74584b055 100644
--- a/modules/sdk-core/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.ts
+++ b/modules/sdk-core/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.ts
@@ -1,4 +1,4 @@
-import { IWallet } from '../wallet';
+import { Wallet, IWallet } from '../wallet';
import { MessageStandardType } from '../utils';
import { MidnightMessageProvider } from './midnightMessageProvider';
import { IMessageProvider, MessageInfo } from './iMessageProvider';
@@ -27,17 +27,25 @@ async function bulkSignAccountBasedMessagesWithProvider(
const failedAddresses: string[] = [];
const txRequests: Record<string, unknown>[] = [];
+ // Gather all messages to process (flatten all batches)
+ let allMessages: MessageInfo[] = [];
let messages: MessageInfo[] = await provider.getMessagesAndAddressesToSign();
while (messages.length > 0) {
- // Sign/build all messages in parallel
- const results = await Promise.all(
- messages.map((messageInfo) => signOrBuildMessage(wallet, messageInfo, messageStandardType, walletPassphrase))
- );
- // Process results and update counters
- processResults(results, txRequests, failedAddresses);
- // Get next batch of messages
+ allMessages = allMessages.concat(messages);
messages = await provider.getMessagesAndAddressesToSign();
}
+
+ // Extract wallet constructor params
+ const { bitgo, baseCoin, _wallet: walletData } = wallet as Wallet;
+
+ // Process all messages in parallel, each with a new Wallet instance
+ const results = await Promise.all(
+ allMessages.map(async (messageInfo) => {
+ const newWallet = new Wallet(bitgo, baseCoin, walletData);
+ return signOrBuildMessage(newWallet, messageInfo, messageStandardType, walletPassphrase);
+ })
+ );
+ processResults(results, txRequests, failedAddresses);
return { failedAddresses, txRequests };
}
Action Items
- Refactor to use new Wallet instances for each parallel operation as per above.
- Write/modify tests to validate the new behavior and prevent regression.
- Ensure robust error handling and maintain performance.
Copilot