/*
* ThunderNetwork - Server Client Architecture to send Off-Chain Bitcoin Payments
* Copyright (C) 2015 Mats Jerratsch <matsjj@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package network.thunder.core.database.objects;
import network.thunder.core.etc.Tools;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Payment {
/**
* Whether *in this context* this payment is towards us or towards the node.
* Depends on the node we are currently talking with.
*/
public boolean paymentToServer;
int id;
int channelIdSender;
int channelIdReceiver;
long amount;
/*
* Different phases of a payment:
* <p>
* 0 - sender requested payment
* 1 - payment request complete - include in sender channel
* also add it to the receivers channel next time..
* <p>
* 2 -
* 3 - receiver channel updated, include in both channels
* 4 - receiver released the secret
* <p>
* 10 - settled with sender only
* 5 - settled with receiver only
* 11 - payment settled
* 5 - receiver/server requested refund
* 6 - receiver refunded/timeouted
* 12 - receiver and sender refunded (so it's settled aswell..)
*/ int phaseReceiver;
int phaseSender;
long fee;
/*
* Revocation hash and preimage for this payment.
* If we know the preimage, it means the payment made it to the final receiver and we can pull the funds.
*/
byte[] secretHash;
byte[] secret;
int timestampAddedSender;
int timestampAddedReceiver;
int timestampSettledSender;
int timestampSettledReceiver;
boolean includeInSenderChannel;
boolean includeInReceiverChannel;
boolean includeInReceiverChannelTemp;
boolean includeInSenderChannelTemp;
/*
* We use the version flags to allow for easier bruteforcing of the P2SH script.
* If we don't know at all which payments might be used together with which revocation hashes,
* brute forcing it might be an expensive and lengthy task.
*/
int versionAddedSender;
int versionAddedReceiver;
int versionSettledSender;
int versionSettledReceiver;
/**
* Instantiates a new payment.
*
* @param result the result
* @throws SQLException the SQL exception
*/
public Payment (ResultSet result) throws SQLException {
id = result.getInt("id");
channelIdReceiver = result.getInt("channel_id_receiver");
channelIdSender = result.getInt("channel_id_sender");
amount = result.getLong("amount");
fee = result.getLong("fee");
phaseSender = result.getInt("phase_sender");
phaseReceiver = result.getInt("phase_receiver");
includeInReceiverChannel = Tools.intToBool(result.getInt("include_in_receiver_channel"));
includeInSenderChannel = Tools.intToBool(result.getInt("include_in_sender_channel"));
includeInReceiverChannelTemp = Tools.intToBool(result.getInt("include_in_receiver_channel_temp"));
includeInSenderChannelTemp = Tools.intToBool(result.getInt("include_in_sender_channel_temp"));
secretHash = result.getBytes("secret_hash");
secret = result.getBytes("secret");
timestampAddedReceiver = result.getInt("timestamp_added_receiver");
timestampAddedSender = result.getInt("timestamp_added_sender");
timestampSettledReceiver = result.getInt("timestamp_settled_receiver");
timestampSettledSender = result.getInt("timestamp_settled_sender");
versionAddedReceiver = result.getInt("version_added_receiver");
versionAddedSender = result.getInt("version_added_sender");
versionSettledReceiver = result.getInt("version_settled_receiver");
versionSettledSender = result.getInt("version_settled_sender");
}
/**
* Gets the amount.
*
* @return the amount
*/
public long getAmount () {
return amount;
}
/**
* Sets the amount.
*
* @param amount the new amount
*/
public void setAmount (long amount) {
this.amount = amount;
}
/**
* Gets the channel id receiver.
*
* @return the channel id receiver
*/
public int getChannelIdReceiver () {
return channelIdReceiver;
}
/**
* Sets the channel id receiver.
*
* @param channelIdReceiver the new channel id receiver
*/
public void setChannelIdReceiver (int channelIdReceiver) {
this.channelIdReceiver = channelIdReceiver;
}
/**
* Gets the channel id sender.
*
* @return the channel id sender
*/
public int getChannelIdSender () {
return channelIdSender;
}
/**
* Sets the channel id sender.
*
* @param channelIdSender the new channel id sender
*/
public void setChannelIdSender (int channelIdSender) {
this.channelIdSender = channelIdSender;
}
public long getFee () {
return fee;
}
public void setFee (long fee) {
this.fee = fee;
}
/**
* Gets the id.
*
* @return the id
*/
public int getId () {
return id;
}
/**
* Sets the id.
*
* @param id the new id
*/
public void setId (int id) {
this.id = id;
}
public int getPhase () {
if (paymentToServer) {
return this.phaseSender;
} else {
return this.phaseReceiver;
}
}
public void setPhase (int phase) {
if (paymentToServer) {
this.phaseSender = phase;
} else {
this.phaseReceiver = phase;
}
}
public int getPhaseReceiver () {
return phaseReceiver;
}
public void setPhaseReceiver (int phaseReceiver) {
this.phaseReceiver = phaseReceiver;
}
public int getPhaseSender () {
return phaseSender;
}
public void setPhaseSender (int phaseSender) {
this.phaseSender = phaseSender;
}
public byte[] getSecret () {
return secret;
}
public void setSecret (byte[] secret) {
this.secret = secret;
}
public byte[] getSecretHash () {
return secretHash;
}
public void setSecretHash (byte[] secretHash) {
this.secretHash = secretHash;
}
public int getTimestampAddedReceiver () {
return timestampAddedReceiver;
}
public void setTimestampAddedReceiver (int timestampAddedReceiver) {
this.timestampAddedReceiver = timestampAddedReceiver;
}
public int getTimestampAddedSender () {
return timestampAddedSender;
}
public void setTimestampAddedSender (int timestampAddedSender) {
this.timestampAddedSender = timestampAddedSender;
}
public int getTimestampSettledReceiver () {
return timestampSettledReceiver;
}
public void setTimestampSettledReceiver (int timestampSettledReceiver) {
this.timestampSettledReceiver = timestampSettledReceiver;
}
public int getTimestampSettledSender () {
return timestampSettledSender;
}
public void setTimestampSettledSender (int timestampSettledSender) {
this.timestampSettledSender = timestampSettledSender;
}
public int getVersionAddedReceiver () {
return versionAddedReceiver;
}
public void setVersionAddedReceiver (int versionAddedReceiver) {
this.versionAddedReceiver = versionAddedReceiver;
}
public int getVersionAddedSender () {
return versionAddedSender;
}
public void setVersionAddedSender (int versionAddedSender) {
this.versionAddedSender = versionAddedSender;
}
public int getVersionSettledReceiver () {
return versionSettledReceiver;
}
public void setVersionSettledReceiver (int versionSettledReceiver) {
this.versionSettledReceiver = versionSettledReceiver;
}
public int getVersionSettledSender () {
return versionSettledSender;
}
public void setVersionSettledSender (int versionSettledSender) {
this.versionSettledSender = versionSettledSender;
}
/**
* Checks if is include in receiver channel.
*
* @return true, if is include in receiver channel
*/
public boolean isIncludeInReceiverChannel () {
return includeInReceiverChannel;
}
/**
* Sets the include in receiver channel.
*
* @param includeInReceiverChannel the new include in receiver channel
*/
public void setIncludeInReceiverChannel (boolean includeInReceiverChannel) {
this.includeInReceiverChannel = includeInReceiverChannel;
}
public boolean isIncludeInReceiverChannelTemp () {
return includeInReceiverChannelTemp;
}
public void setIncludeInReceiverChannelTemp (boolean includeInReceiverChannelTemp) {
this.includeInReceiverChannelTemp = includeInReceiverChannelTemp;
}
/**
* Checks if is include in sender channel.
*
* @return true, if is include in sender channel
*/
public boolean isIncludeInSenderChannel () {
return includeInSenderChannel;
}
/**
* Sets the include in sender channel.
*
* @param includeInSenderChannel the new include in sender channel
*/
public void setIncludeInSenderChannel (boolean includeInSenderChannel) {
this.includeInSenderChannel = includeInSenderChannel;
}
public boolean isIncludeInSenderChannelTemp () {
return includeInSenderChannelTemp;
}
public void setIncludeInSenderChannelTemp (boolean includeInSenderChannelTemp) {
this.includeInSenderChannelTemp = includeInSenderChannelTemp;
}
public boolean isPaymentToServer () {
return paymentToServer;
}
public void setPaymentToServer (boolean paymentToServer) {
this.paymentToServer = paymentToServer;
}
public void setIncludedInChannel (boolean includedInChannelTemp) {
if (paymentToServer) {
setIncludeInSenderChannel(includedInChannelTemp);
} else {
setIncludeInReceiverChannel(includedInChannelTemp);
}
}
public void setIncludedInChannelTemp (boolean includedInChannelTemp) {
if (paymentToServer) {
setIncludeInSenderChannelTemp(includedInChannelTemp);
} else {
setIncludeInReceiverChannelTemp(includedInChannelTemp);
}
}
}