-
Notifications
You must be signed in to change notification settings - Fork 39
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix(drive): transfer to frozen account is allowed #2478
base: v2.0-dev
Are you sure you want to change the base?
Conversation
WalkthroughThis pull request updates the token transfer validation logic. In the main validation file, the platform version configuration is switched from token issuance validation to token transfer validation. In the version 0 implementation, the logic now additionally checks if the recipient's token account is frozen (in addition to the sender's account check) before proceeding with the token transfer process. All changes maintain the existing error handling and overall structure of the validation functions, without any changes to public APIs. Changes
Sequence Diagram(s)sequenceDiagram
participant Client as Caller
participant Validator as TokenTransferValidation
participant Sender as SenderAccount
participant Receiver as RecipientAccount
Client->>Validator: initiate state transfer validation
Validator->>Sender: fetch sender identity token info & balance
Sender-->>Validator: return sender status (frozen/not)
alt sender account frozen
Validator->>Client: return error (sender frozen)
else
Validator->>Receiver: fetch recipient token account info
Receiver-->>Validator: return recipient status (frozen/not)
alt recipient account frozen
Validator->>Client: return error (recipient frozen)
else
Validator->>Client: validation passed, proceed with transfer
end
end
Possibly related PRs
Suggested reviewers
Poem
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (1)
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_transfer_transition_action/state_v0/mod.rs (1)
79-130
: Consider refactoring frozen account checks to reduce duplication.The frozen account validation logic is duplicated for sender and recipient. Consider extracting this into a helper method to improve maintainability.
impl TokenTransferTransitionActionStateValidationV0 for TokenTransferTransitionAction { + fn validate_frozen_account( + &self, + platform: &PlatformStateRef, + identity_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + let (info, fee_result) = platform.drive.fetch_identity_token_info_with_costs( + self.token_id().to_buffer(), + identity_id.to_buffer(), + block_info, + true, + transaction, + platform_version, + )?; + + execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee_result)); + + if let Some(info) = info { + if info.frozen() { + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::IdentityTokenAccountFrozenError( + IdentityTokenAccountFrozenError::new( + self.token_id(), + identity_id, + "transfer".to_string(), + ), + )), + )); + } + }; + + Ok(SimpleConsensusValidationResult::new()) + } + fn validate_state_v0( &self, platform: &PlatformStateRef, owner_id: Identifier, block_info: &BlockInfo, execution_context: &mut StateTransitionExecutionContext, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result<SimpleConsensusValidationResult, Error> { // ... existing balance validation ... - // We need to verify that our token account is not frozen - let (info, fee_result) = platform.drive.fetch_identity_token_info_with_costs( - self.token_id().to_buffer(), - owner_id.to_buffer(), - block_info, - true, - transaction, - platform_version, - )?; - - execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee_result)); - - if let Some(info) = info { - if info.frozen() { - return Ok(SimpleConsensusValidationResult::new_with_error( - ConsensusError::StateError(StateError::IdentityTokenAccountFrozenError( - IdentityTokenAccountFrozenError::new( - self.token_id(), - owner_id, - "transfer".to_string(), - ), - )), - )); - } - }; + // Verify that sender's token account is not frozen + let validation_result = self.validate_frozen_account( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )?; + if !validation_result.is_valid() { + return Ok(validation_result); + } - // We need to verify that account we are transferring to not frozen - let (info, fee_result) = platform.drive.fetch_identity_token_info_with_costs( - self.token_id().to_buffer(), - self.recipient_id().to_buffer(), - block_info, - true, - transaction, - platform_version, - )?; - - execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee_result)); - - if let Some(info) = info { - if info.frozen() { - return Ok(SimpleConsensusValidationResult::new_with_error( - ConsensusError::StateError(StateError::IdentityTokenAccountFrozenError( - IdentityTokenAccountFrozenError::new( - self.token_id(), - self.recipient_id(), - "transfer".to_string(), - ), - )), - )); - } - }; + // Verify that recipient's token account is not frozen + let validation_result = self.validate_frozen_account( + platform, + self.recipient_id(), + block_info, + execution_context, + transaction, + platform_version, + )?; + if !validation_result.is_valid() { + return Ok(validation_result); + } // ... existing token status validation ...
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_transfer_transition_action/mod.rs
(1 hunks)packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_transfer_transition_action/state_v0/mod.rs
(4 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (7)
- GitHub Check: Rust packages (drive-abci) / Tests
- GitHub Check: Rust packages (drive-abci) / Check each feature
- GitHub Check: Rust packages (drive-abci) / Unused dependencies
- GitHub Check: Rust packages (drive-abci) / Linting
- GitHub Check: Rust packages (drive-abci) / Formatting
- GitHub Check: Build Docker images (Drive, drive, drive-abci) / Build Drive image
- GitHub Check: Build JS packages / Build JS
🔇 Additional comments (5)
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_transfer_transition_action/mod.rs (1)
71-71
: LGTM! Using the correct validation context.The change from
token_issuance_transition_state_validation
totoken_transfer_transition_state_validation
ensures that the correct validation context is used for token transfers.packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_transfer_transition_action/state_v0/mod.rs (4)
62-63
: LGTM! Added cost tracking for balance retrieval.Properly tracking the cost of balance retrieval operation in the execution context.
89-90
: LGTM! Added cost tracking for sender's token info.Properly tracking the cost of fetching sender's token info in the execution context.
105-130
: LGTM! Added validation for recipient's frozen account.The implementation prevents transfers to frozen accounts by validating the recipient's token account status. The error handling is consistent with the sender's frozen account check.
This change directly addresses the PR objective of preventing transfers to frozen accounts.
139-140
: LGTM! Added cost tracking for token status.Properly tracking the cost of fetching token status in the execution context.
The code LGTM except for breaking the test, but I'm not sure we want to do this. I can imagine scenarios where sending to a frozen identity would be useful. Like if we have a contract that collects funds in a frozen account to be unfrozen at a specific date/time. |
Issue being fixed or feature implemented
Transfer to frozen account is currently allowed.
What was done?
How Has This Been Tested?
With existing tests
Breaking Changes
None
Checklist:
For repository code-owners and collaborators only
Summary by CodeRabbit