Files
xahaud/hook/genesis/callback.c
Denis Angell bedde782c6 hook tools
2024-01-24 17:05:37 +01:00

127 lines
4.4 KiB
C

/**
* Payment Txn
*/
#include "hookapi.h"
#include <stdint.h>
// clang-format off
uint8_t txn[305] =
{
/* size,upto */
/* 3, 0 */ 0x12U, 0x00U, 0x00U, /* tt = Payment */
/* 5, 3*/ 0x22U, 0x80U, 0x00U, 0x00U, 0x00U, /* flags = tfCanonical */
/* 5, 8 */ 0x24U, 0x00U, 0x00U, 0x00U, 0x00U, /* sequence = 0 */
/* 5, 13 */ 0x99U, 0x99U, 0x99U, 0x99U, 0x99U, /* dtag, flipped */
/* 6, 18 */ 0x20U, 0x1AU, 0x00U, 0x00U, 0x00U, 0x00U, /* first ledger seq */
/* 6, 24 */ 0x20U, 0x1BU, 0x00U, 0x00U, 0x00U, 0x00U, /* last ledger seq */
/* 49, 30 */ 0x61U, 0x99U, 0x99U, 0x99U, 0x99U, 0x99U, 0x99U, 0x99U, /* amount field 9 or 49 bytes */
0x99U, 0x99U, 0x99U, 0x99U, 0x99U, 0x99U, 0x99U, 0x99U,
0x99U, 0x99U, 0x99U, 0x99U, 0x99U, 0x99U, 0x99U, 0x99U,
0x99U, 0x99U, 0x99U, 0x99U, 0x99U, 0x99U, 0x99U, 0x99U,
0x99U, 0x99U, 0x99U, 0x99U, 0x99U, 0x99U, 0x99U, 0x99U,
0x99U, 0x99U, 0x99U, 0x99U, 0x99U, 0x99U, 0x99U, 0x99U, 0x99,
/* 9, 79 */ 0x68U, 0x40U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, /* fee */
/* 35, 88 */ 0x73U, 0x21U, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* pubkey */
/* 22,123 */ 0x81U, 0x14U, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* src acc */
/* 22,145 */ 0x83U, 0x14U, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* dst acc */
/* 138,167 */ /* emit details */
/* 0,305 */
};
// clang-format on
// TX BUILDER
#define FLS_OUT (txn + 20U)
#define LLS_OUT (txn + 26U)
#define DTAG_OUT (txn + 14U)
#define AMOUNT_OUT (txn + 30U)
#define FEE_OUT (txn + 80U)
#define HOOK_ACC (txn + 125U)
#define OTX_ACC (txn + 147U)
#define EMIT_OUT (txn + 167U)
int64_t cbak(uint32_t f)
{
uint8_t f_buf[4];
UINT32_TO_BUF(f_buf, f);
accept(SBUF(f_buf), __LINE__);
return 0;
}
int64_t hook(uint32_t reserved)
{
TRACESTR("callback.c: Called.");
// ACCOUNT: Hook Account
uint8_t hook_acc[20];
hook_account(HOOK_ACC, 20);
// TXN: PREPARE: Init
etxn_reserve(2);
for (int64_t i = 0; GUARD(2), i < 2; i++)
{
TRACEVAR(i);
switch (i)
{
case 0:
util_accid(OTX_ACC, 20, SBUF("rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK"));
case 1:
util_accid(OTX_ACC, 20, SBUF("rH4KEcG9dEwGwpn6AyoWK9cZPLL4RLSmWW"));
default:
break;
}
uint32_t fls = (uint32_t)ledger_seq() + 1;
*((uint32_t *)(FLS_OUT)) = FLIP_ENDIAN(fls);
// TXN PREPARE: LastLedgerSequense
uint32_t lls = fls + 4;
*((uint32_t *)(LLS_OUT)) = FLIP_ENDIAN(lls);
// TXN PREPARE: Amount
uint64_t drops = 1000000;
uint8_t *b = AMOUNT_OUT + 1;
*b++ = 0b01000000 + ((drops >> 56) & 0b00111111);
*b++ = (drops >> 48) & 0xFFU;
*b++ = (drops >> 40) & 0xFFU;
*b++ = (drops >> 32) & 0xFFU;
*b++ = (drops >> 24) & 0xFFU;
*b++ = (drops >> 16) & 0xFFU;
*b++ = (drops >> 8) & 0xFFU;
*b++ = (drops >> 0) & 0xFFU;
// TXN PREPARE: Dest Tag <- Source Tag
if (otxn_field(DTAG_OUT, 4, sfSourceTag) == 4)
*(DTAG_OUT - 1) = 0x2EU;
// TXN PREPARE: Emit Metadata
etxn_details(EMIT_OUT, 138U);
// TXN PREPARE: Fee
{
int64_t fee = etxn_fee_base(SBUF(txn));
uint8_t *b = FEE_OUT;
*b++ = 0b01000000 + ((fee >> 56) & 0b00111111);
*b++ = (fee >> 48) & 0xFFU;
*b++ = (fee >> 40) & 0xFFU;
*b++ = (fee >> 32) & 0xFFU;
*b++ = (fee >> 24) & 0xFFU;
*b++ = (fee >> 16) & 0xFFU;
*b++ = (fee >> 8) & 0xFFU;
*b++ = (fee >> 0) & 0xFFU;
}
TRACEHEX(txn); // <- final tx blob
// TXN: Emit/Send Txn
uint8_t emithash[32];
int64_t emit_result = emit(SBUF(emithash), SBUF(txn));
TRACEVAR(emit_result);
}
accept(SBUF("callback.c: Successful."), __LINE__);
// unreachable
return 0;
}