# Refund Flow — verify_withdraw / withdraw_rbf / cancel_withdraw blocked
After refund is executed and signed, the refund BTCPendingInfo has state `Refund`.
`verify_withdraw`, `withdraw_rbf`, and `cancel_withdraw` all reject it —
they only accept Withdraw-related states.
## File References
| # | Method | File |
|---|--------|------|
| 1 | `get_user_deposit_address` | `contracts/satoshi-bridge/src/api/bridge.rs:406` |
| 2 | `request_refund` | `contracts/satoshi-bridge/src/api/bridge.rs:426` |
| 3 | `verify_transaction_inclusion` | `contracts/satoshi-bridge/src/btc_light_client/mod.rs:113` |
| 4 | `request_refund_callback` | `contracts/satoshi-bridge/src/refund.rs:170` |
| 5 | `execute_refund` | `contracts/satoshi-bridge/src/api/bridge.rs:454` |
| 6 | `sign_btc_transaction` | `contracts/satoshi-bridge/src/api/chain_signatures.rs:21` |
| 7 | `sign` (MPC) | `contracts/satoshi-bridge/src/chain_signature.rs:57` |
| 8 | `sign_btc_transaction_callback` | `contracts/satoshi-bridge/src/chain_signature.rs:135` |
| 9 | `verify_withdraw` | `contracts/satoshi-bridge/src/api/bridge.rs:168` |
| 10 | `withdraw_rbf` | `contracts/satoshi-bridge/src/api/bridge.rs:203` |
| 11 | `cancel_withdraw` | `contracts/satoshi-bridge/src/api/bridge.rs:234` |
## Sequence Diagram
```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'actorTextColor': '#000000', 'actorLineColor': '#333333', 'signalColor': '#333333', 'signalTextColor': '#000000', 'noteBkgColor': '#fff9c4', 'noteTextColor': '#000000', 'messageFontSize': '14px'}}}%%
sequenceDiagram
autonumber
box rgb(224, 224, 224) Off-chain
participant U as User
end
box rgb(255, 224, 178) Bitcoin
participant BTC as Bitcoin Network
end
box rgb(224, 224, 224) Off-chain
participant R as Relayer
end
box rgb(187, 222, 251) NEAR Protocol
participant B as btc_connector
(satoshi-bridge)
participant LC as BTC Light Client
participant MPC as Chain Signatures
(MPC)
end
U->>B: get_user_deposit_address(DepositMsg {
recipient_id, refund_address: "bc1q..."})
📄 api/bridge.rs:406
B-->>U: BTC deposit address
U->>BTC: Send BTC to deposit address
Note over BTC: Transaction confirmed
U->>B: request_refund(deposit_msg, tx_proof)
📄 api/bridge.rs:426
B->>LC: verify_transaction_inclusion(tx_id, merkle_proof)
📄 btc_light_client/mod.rs:113
LC-->>B: valid
Note over B: request_refund_callback
📄 refund.rs:170
B->>B: Save RefundRequest
Note over B: Timelock passes
U->>B: execute_refund(utxo_storage_key)
📄 api/bridge.rs:454
U->>B: sign_btc_transaction(sign_index)
📄 api/chain_signatures.rs:21
B->>MPC: sign(payload, path, key_version)
📄 chain_signature.rs:57
MPC-->>B: signature
Note over B: sign_btc_transaction_callback
📄 chain_signature.rs:135
U->>BTC: Broadcast refund transaction
BTC-->>U: BTC returned to refund_address
Note over R,B: Attempts to use withdraw operations on refund tx
rect rgb(255, 200, 200)
R->>B: verify_withdraw(tx_id)
📄 api/bridge.rs:168
Note over B: PANIC: "Not withdraw related tx"
U->>B: withdraw_rbf(btc_pending_verify_id)
📄 api/bridge.rs:203
Note over B: PANIC: "Not original tx"
R->>B: cancel_withdraw(btc_pending_verify_id)
📄 api/bridge.rs:234
Note over B: PANIC: "Not original tx"
end
R->>B: verify_refund_finalize(tx_id, tx_proof)
📄 api/bridge.rs
B->>LC: verify_transaction_inclusion(tx_id, merkle_proof)
📄 btc_light_client/mod.rs:113
LC-->>B: valid
Note over B: verify_refund_finalize_callback
📄 refund.rs
B->>B: Remove BTCPendingInfo
```