WIP: trade-bot: add support for showing trade partner's Qortal receiving address in trade offer summaries

This commit is contained in:
catbref 2020-08-04 20:35:22 +01:00
parent faa2e9502b
commit 6b83499216
3 changed files with 37 additions and 2 deletions

View File

@ -34,6 +34,8 @@ public class CrossChainOfferSummary {
private long timestamp; private long timestamp;
private String partnerQortalReceivingAddress;
protected CrossChainOfferSummary() { protected CrossChainOfferSummary() {
/* For JAXB */ /* For JAXB */
} }
@ -46,6 +48,7 @@ public class CrossChainOfferSummary {
this.tradeTimeout = crossChainTradeData.tradeTimeout; this.tradeTimeout = crossChainTradeData.tradeTimeout;
this.mode = crossChainTradeData.mode; this.mode = crossChainTradeData.mode;
this.timestamp = timestamp; this.timestamp = timestamp;
this.partnerQortalReceivingAddress = crossChainTradeData.qortalPartnerReceivingAddress;
} }
public String getQortalAtAddress() { public String getQortalAtAddress() {
@ -76,4 +79,8 @@ public class CrossChainOfferSummary {
return this.timestamp; return this.timestamp;
} }
public String getPartnerQortalReceivingAddress() {
return this.partnerQortalReceivingAddress;
}
} }

View File

@ -105,10 +105,10 @@ public class BTCACCT {
public static final int SECRET_LENGTH = 32; public static final int SECRET_LENGTH = 32;
public static final int MIN_LOCKTIME = 1500000000; public static final int MIN_LOCKTIME = 1500000000;
public static final byte[] CODE_BYTES_HASH = HashCode.fromString("fad14381b77ae1a2bfe7e16a1a8b571839c5f405fca0490ead08499ac170f65b").asBytes(); // SHA256 of AT code bytes public static final byte[] CODE_BYTES_HASH = HashCode.fromString("a472f32a6799ff85ed99567701b42fa228c58a09d38485ab208ad78d0f2cc813").asBytes(); // SHA256 of AT code bytes
/** <b>Value</b> offset into AT segment where 'mode' variable (long) is stored. (Multiply by MachineState.VALUE_SIZE for byte offset). */ /** <b>Value</b> offset into AT segment where 'mode' variable (long) is stored. (Multiply by MachineState.VALUE_SIZE for byte offset). */
private static final int MODE_VALUE_OFFSET = 63; private static final int MODE_VALUE_OFFSET = 68;
/** <b>Byte</b> offset into AT state data where 'mode' variable (long) is stored. */ /** <b>Byte</b> offset into AT state data where 'mode' variable (long) is stored. */
public static final int MODE_BYTE_OFFSET = MachineState.HEADER_LENGTH + (MODE_VALUE_OFFSET * MachineState.VALUE_SIZE); public static final int MODE_BYTE_OFFSET = MachineState.HEADER_LENGTH + (MODE_VALUE_OFFSET * MachineState.VALUE_SIZE);
@ -199,6 +199,8 @@ public class BTCACCT {
final int addrMessageDataPointer = addrCounter++; final int addrMessageDataPointer = addrCounter++;
final int addrMessageDataLength = addrCounter++; final int addrMessageDataLength = addrCounter++;
final int addrPartnerReceivingAddressPointer = addrCounter++;
final int addrEndOfConstants = addrCounter; final int addrEndOfConstants = addrCounter;
// Variables // Variables
@ -238,6 +240,9 @@ public class BTCACCT {
final int addrPartnerBitcoinPKH = addrCounter; final int addrPartnerBitcoinPKH = addrCounter;
addrCounter += 4; addrCounter += 4;
final int addrPartnerReceivingAddress = addrCounter;
addrCounter += 4;
final int addrMode = addrCounter++; final int addrMode = addrCounter++;
assert addrMode == MODE_VALUE_OFFSET : "MODE_VALUE_OFFSET does not match addrMode"; assert addrMode == MODE_VALUE_OFFSET : "MODE_VALUE_OFFSET does not match addrMode";
@ -327,6 +332,10 @@ public class BTCACCT {
assert dataByteBuffer.position() == addrMessageDataLength * MachineState.VALUE_SIZE : "addrMessageDataLength incorrect"; assert dataByteBuffer.position() == addrMessageDataLength * MachineState.VALUE_SIZE : "addrMessageDataLength incorrect";
dataByteBuffer.putLong(32L); dataByteBuffer.putLong(32L);
// Pointer into data segment of where to save partner's receiving Qortal address, used by GET_B_IND
assert dataByteBuffer.position() == addrPartnerReceivingAddressPointer * MachineState.VALUE_SIZE : "addrPartnerReceivingAddressPointer incorrect";
dataByteBuffer.putLong(addrPartnerReceivingAddress);
assert dataByteBuffer.position() == addrEndOfConstants * MachineState.VALUE_SIZE : "dataByteBuffer position not at end of constants"; assert dataByteBuffer.position() == addrEndOfConstants * MachineState.VALUE_SIZE : "dataByteBuffer position not at end of constants";
// Code labels // Code labels
@ -544,6 +553,8 @@ public class BTCACCT {
// Extract Qortal receiving address from next 32 bytes of message from transaction into B register // Extract Qortal receiving address from next 32 bytes of message from transaction into B register
codeByteBuffer.put(OpCode.EXT_FUN_DAT.compile(QortalFunctionCode.PUT_PARTIAL_MESSAGE_FROM_TX_IN_A_INTO_B.value, addrRedeemMessageReceivingAddressOffset)); codeByteBuffer.put(OpCode.EXT_FUN_DAT.compile(QortalFunctionCode.PUT_PARTIAL_MESSAGE_FROM_TX_IN_A_INTO_B.value, addrRedeemMessageReceivingAddressOffset));
// Save B register into data segment starting at addrPartnerReceivingAddress (as pointed to by addrPartnerReceivingAddressPointer)
codeByteBuffer.put(OpCode.EXT_FUN_DAT.compile(FunctionCode.GET_B_IND, addrPartnerReceivingAddressPointer));
// Pay AT's balance to receiving address // Pay AT's balance to receiving address
codeByteBuffer.put(OpCode.EXT_FUN_DAT.compile(FunctionCode.PAY_TO_ADDRESS_IN_B, addrQortAmount)); codeByteBuffer.put(OpCode.EXT_FUN_DAT.compile(FunctionCode.PAY_TO_ADDRESS_IN_B, addrQortAmount));
// Set redeemed mode // Set redeemed mode
@ -700,6 +711,9 @@ public class BTCACCT {
// Skip message data length // Skip message data length
dataByteBuffer.position(dataByteBuffer.position() + 8); dataByteBuffer.position(dataByteBuffer.position() + 8);
// Skip pointer to partner's receiving address
dataByteBuffer.position(dataByteBuffer.position() + 8);
/* End of constants / begin variables */ /* End of constants / begin variables */
// Skip AT creator's address // Skip AT creator's address
@ -753,9 +767,17 @@ public class BTCACCT {
dataByteBuffer.get(partnerBitcoinPKH); dataByteBuffer.get(partnerBitcoinPKH);
dataByteBuffer.position(dataByteBuffer.position() + 32 - partnerBitcoinPKH.length); // skip to 32 bytes dataByteBuffer.position(dataByteBuffer.position() + 32 - partnerBitcoinPKH.length); // skip to 32 bytes
// Partner's receiving address (if present)
byte[] partnerReceivingAddress = new byte[25];
dataByteBuffer.get(partnerReceivingAddress);
dataByteBuffer.position(dataByteBuffer.position() + 32 - partnerReceivingAddress.length); // skip to 32 bytes
// Trade AT's 'mode'
long modeValue = dataByteBuffer.getLong(); long modeValue = dataByteBuffer.getLong();
Mode mode = Mode.valueOf((int) (modeValue & 0xffL)); Mode mode = Mode.valueOf((int) (modeValue & 0xffL));
/* End of variables */
if (mode != null && mode != Mode.OFFERING) { if (mode != null && mode != Mode.OFFERING) {
tradeData.mode = mode; tradeData.mode = mode;
tradeData.refundTimeout = refundTimeout; tradeData.refundTimeout = refundTimeout;
@ -765,6 +787,9 @@ public class BTCACCT {
tradeData.partnerBitcoinPKH = partnerBitcoinPKH; tradeData.partnerBitcoinPKH = partnerBitcoinPKH;
tradeData.lockTimeA = lockTimeA; tradeData.lockTimeA = lockTimeA;
tradeData.lockTimeB = lockTimeB; tradeData.lockTimeB = lockTimeB;
if (mode == Mode.REDEEMED)
tradeData.qortalPartnerReceivingAddress = Base58.encode(partnerReceivingAddress);
} else { } else {
tradeData.mode = Mode.OFFERING; tradeData.mode = Mode.OFFERING;
} }

View File

@ -73,6 +73,9 @@ public class CrossChainTradeData {
@Schema(description = "Trade partner's Bitcoin public-key-hash (PKH)") @Schema(description = "Trade partner's Bitcoin public-key-hash (PKH)")
public byte[] partnerBitcoinPKH; public byte[] partnerBitcoinPKH;
@Schema(description = "Trade partner's Qortal receiving address")
public String qortalPartnerReceivingAddress;
// Constructors // Constructors
// Necessary for JAXB // Necessary for JAXB