Skip to content
Snippets Groups Projects
ActionPrepareDistributedCommittedTransfer.java 1.7 KiB
Newer Older
package fucoin.actions.transaction;

import akka.actor.ActorRef;
import akka.actor.UntypedActorContext;
import fucoin.wallet.AbstractWallet;

public class ActionPrepareDistributedCommittedTransfer extends Transaction {

    private ActorRef source;
    private ActorRef target;
    private int amount;
    private long timestamp;
    private long id;

    public ActionPrepareDistributedCommittedTransfer(ActorRef source, ActorRef target,
                                                     int amount, long timestamp, long id) {
        this.source = source;
        this.target = target;
        this.amount = amount;
        this.timestamp = timestamp;
        this.id = id;
    }

    @Override
    protected void onAction(ActorRef sender, ActorRef self,
                            UntypedActorContext context, AbstractWallet wallet) {
        boolean granted = amount > 0 &&
                //sender is supervisor(bank) has always money
                (sender.compareTo(source) == 0
                        //sender is unknown, might be valid
                        || (wallet.amounts.containsKey(source)
                        //sender have enough money
                        && wallet.amounts.getOrDefault(source, 0) >= amount));

        // precautionly update own ledger to prevent double spending (respectively agreeing)
        Integer sourceAmount = wallet.amounts.getOrDefault(source, 0);
        Integer targetAmount = wallet.amounts.getOrDefault(target, 0);
        wallet.amounts.put(source, sourceAmount - amount);
        wallet.amounts.put(target, targetAmount + amount);

        sender.tell(new ActionPrepareDistributedCommittedTransferAnswer(source, target, amount, timestamp, granted, id), self);
    }

}