30 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			SQL
		
	
	
	
	
	
			
		
		
	
	
			30 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			SQL
		
	
	
	
	
	
| FOR $contract IN (select * from active_vm fetch out) {
 | |
|     LET $operator = (select * from $contract.out.operator)[0];
 | |
|     LET $node_is_online = $contract.out.connected_at > $contract.out.disconnected_at;
 | |
|     LET $price_per_minute = fn::vm_price_per_minute($contract.id);
 | |
|     LET $amount_due = (time::now() - $contract.collected_at).mins() * $price_per_minute;
 | |
|     LET $amount_paid = IF $amount_due > $contract.locked_nano {
 | |
|         $contract.locked_nano
 | |
|     } ELSE {
 | |
|         $amount_due
 | |
|     };
 | |
|     LET $escrow_multiplier = IF $operator.escrow < 5_000_000_000_000 { 1 } ELSE { 5 };
 | |
|     IF $node_is_online {
 | |
|         UPDATE $operator.id SET balance += $amount_paid * $escrow_multiplier;
 | |
|         UPDATE $contract.id SET
 | |
|             locked_nano -= $amount_paid,
 | |
|             collected_at = time::now();
 | |
|     } ELSE {
 | |
|         LET $compensation = IF $amount_due > $operator.escrow {
 | |
|             $operator.escrow
 | |
|         } ELSE {
 | |
|             $amount_due
 | |
|         };
 | |
|         UPDATE $operator.id SET escrow -= $compensation;
 | |
|         UPDATE $contract.in SET balance += $compensation;
 | |
|     };
 | |
|     IF $amount_paid >= $contract.locked_nano {
 | |
|         fn::delete_vm($contract.id);
 | |
|     };
 | |
| };
 |