diff --git a/db/process_withdrawals.sql b/db/process_withdrawals.sql
new file mode 100644
index 0000000000000000000000000000000000000000..12cfef2cf3711d631196ad4f985e9b3a0fbfb022
--- /dev/null
+++ b/db/process_withdrawals.sql
@@ -0,0 +1,70 @@
+SET ROLE btracker_owner;
+
+CREATE OR REPLACE FUNCTION process_block_range_withdrawals(IN _from INT, IN _to INT, IN _report_step INT = 1000)
+RETURNS VOID
+LANGUAGE 'plpgsql' VOLATILE
+SET from_collapse_limit = 16
+SET join_collapse_limit = 16
+SET jit = OFF
+AS
+$$
+DECLARE
+  _result INT;
+BEGIN
+--RAISE NOTICE 'Processing delegations, rewards, savings, withdraws';)
+--delegations (40,41,62)
+--savings (32,33,34,59,55)
+--rewards (39,51,52,63,53)
+--withdraws (4,20,56)
+--hardforks (60)
+
+WITH process_block_range_data_b AS MATERIALIZED 
+(
+SELECT 
+  ov.body_binary::jsonb AS body,
+  ov.id AS source_op,
+  ov.block_num as source_op_block,
+  ov.op_type_id 
+FROM operations_view ov
+WHERE 
+ ov.op_type_id IN (4,20,56,60,77,70,68) AND 
+ ov.block_num BETWEEN _from AND _to
+),
+insert_balance AS MATERIALIZED 
+(
+SELECT 
+  pbr.source_op,
+  pbr.source_op_block,
+  (CASE 
+  WHEN pbr.op_type_id = 4 THEN
+    process_withdraw_vesting_operation(pbr.body, (SELECT withdraw_rate FROM btracker_app_status))
+
+  WHEN pbr.op_type_id = 20 THEN
+    process_set_withdraw_vesting_route_operation(pbr.body)
+
+  WHEN pbr.op_type_id = 56 THEN
+    process_fill_vesting_withdraw_operation(pbr.body, (SELECT start_delayed_vests FROM btracker_app_status))
+
+  WHEN pbr.op_type_id = 77 AND (SELECT start_delayed_vests FROM btracker_app_status) = TRUE THEN
+    process_transfer_to_vesting_completed_operation(pbr.body)
+
+  WHEN pbr.op_type_id = 70 AND (SELECT start_delayed_vests FROM btracker_app_status) = TRUE THEN
+    process_delayed_voting_operation(pbr.body)
+
+  WHEN pbr.op_type_id = 68 THEN
+    process_hardfork_hive_operation(pbr.body)
+
+  WHEN pbr.op_type_id = 60 THEN
+    process_hardfork(((pbr.body)->'value'->>'hardfork_id')::INT)
+  END)
+FROM process_block_range_data_b pbr
+ORDER BY pbr.source_op_block, pbr.source_op
+)
+
+SELECT COUNT(*) INTO _result 
+FROM insert_balance;
+
+END
+$$;
+
+RESET ROLE;