forked from ElementsProject/lightning
-
Notifications
You must be signed in to change notification settings - Fork 0
/
coin_mvt.h
267 lines (217 loc) · 7.03 KB
/
coin_mvt.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
#ifndef LIGHTNING_COMMON_COIN_MVT_H
#define LIGHTNING_COMMON_COIN_MVT_H
#include "config.h"
#include <common/amount.h>
#include <common/channel_id.h>
#include <common/utils.h>
#define COIN_MVT_VERSION 2
#define WALLET "wallet"
enum mvt_type {
CHAIN_MVT = 0,
CHANNEL_MVT = 1,
};
#define NUM_MVT_TAGS (LEASED + 1)
enum mvt_tag {
DEPOSIT = 0,
WITHDRAWAL = 1,
PENALTY = 2,
INVOICE = 3,
ROUTED = 4,
PUSHED = 5,
CHANNEL_OPEN = 6,
CHANNEL_CLOSE = 7,
CHANNEL_TO_US = 8,
HTLC_TIMEOUT = 9,
HTLC_FULFILL = 10,
HTLC_TX = 11,
TO_WALLET = 12,
IGNORED = 13,
ANCHOR = 14,
TO_THEM = 15,
PENALIZED = 16,
STOLEN = 17,
TO_MINER = 18,
OPENER = 19,
LEASE_FEE = 20,
LEASED = 21,
};
struct channel_coin_mvt {
/* account_id */
struct channel_id chan_id;
/* identifier */
struct sha256 *payment_hash;
/* mutli-part payments may share a payment hash,
* so we should also record a 'part-id' for them */
u64 *part_id;
/* label / tag array */
enum mvt_tag *tags;
/* only one or the other */
struct amount_msat credit;
struct amount_msat debit;
/* Fees collected (or paid) on this mvt */
struct amount_msat fees;
};
struct chain_coin_mvt {
/* account_id */
const char *account_name;
const struct bitcoin_txid *tx_txid;
const struct bitcoin_outpoint *outpoint;
/* some on-chain movements have a payment hash */
struct sha256 *payment_hash;
/* label / tag array */
enum mvt_tag *tags;
/* block this transaction is confirmed in */
u32 blockheight;
/* only one or the other */
struct amount_msat credit;
struct amount_msat debit;
/* total value of output (useful for tracking external outs) */
struct amount_sat output_val;
/* When we pay to external accounts, it's useful
* to track which internal account it originated from */
const char *originating_acct;
/* Number of outputs in spending tx; used by the
* `channel_close` event */
u32 output_count;
};
/* differs depending on type!? */
struct mvt_id {
struct sha256 *payment_hash;
u64 *part_id;
const struct bitcoin_txid *tx_txid;
const struct bitcoin_outpoint *outpoint;
};
struct coin_mvt {
/* name of 'account': wallet, external, <channel_id> */
const char *account_id;
/* if account_id is external, the account this 'impacted' */
const char *originating_acct;
/* Chain name: BIP 173, except signet lightning-style: tbs not tb */
const char *hrp_name;
/* type of movement: channel or chain */
enum mvt_type type;
/* identifier */
struct mvt_id id;
/* label / tag array */
enum mvt_tag *tags;
/* only one or the other */
struct amount_msat credit;
struct amount_msat debit;
/* Value of the output. May be different than
* our credit/debit amount, eg channel opens */
struct amount_sat *output_val;
/* Really only needed for channel closes */
size_t output_count;
/* Amount of fees collected/paid by channel mvt */
struct amount_msat *fees;
u32 timestamp;
u32 blockheight;
/* version is a counter of the format of the data payload that
* makes up a coin movement */
u8 version;
/* node originating this movement */
struct node_id *node_id;
};
enum mvt_tag *new_tag_arr(const tal_t *ctx, enum mvt_tag tag);
struct channel_coin_mvt *new_channel_coin_mvt(const tal_t *ctx,
const struct channel_id *cid,
const struct sha256 *payment_hash TAKES,
u64 *part_id TAKES,
struct amount_msat amount,
const enum mvt_tag *tags TAKES,
bool is_credit,
struct amount_msat fees)
NON_NULL_ARGS(2);
struct chain_coin_mvt *new_onchaind_withdraw(const tal_t *ctx,
const struct bitcoin_outpoint *outpoint,
const struct bitcoin_txid *spend_txid,
u32 blockheight,
struct amount_sat amount,
enum mvt_tag tag)
NON_NULL_ARGS(2, 3);
struct chain_coin_mvt *new_onchaind_deposit(const tal_t *ctx,
const struct bitcoin_outpoint *outpoint,
u32 blockheight,
struct amount_sat amount,
enum mvt_tag tag)
NON_NULL_ARGS(2);
struct chain_coin_mvt *new_coin_channel_close(const tal_t *ctx,
const struct bitcoin_txid *txid,
const struct bitcoin_outpoint *out,
u32 blockheight,
const struct amount_msat amount,
const struct amount_sat output_val,
u32 output_count)
NON_NULL_ARGS(2, 3);
struct chain_coin_mvt *new_coin_channel_open(const tal_t *ctx,
const struct channel_id *chan_id,
const struct bitcoin_outpoint *out,
u32 blockheight,
const struct amount_msat amount,
const struct amount_sat output_val,
bool is_opener,
bool is_leased)
NON_NULL_ARGS(2, 3);
struct chain_coin_mvt *new_onchain_htlc_deposit(const tal_t *ctx,
const struct bitcoin_outpoint *outpoint,
u32 blockheight,
struct amount_sat amount,
const struct sha256 *payment_hash)
NON_NULL_ARGS(2, 5);
struct chain_coin_mvt *new_onchain_htlc_withdraw(const tal_t *ctx,
const struct bitcoin_outpoint *outpoint,
u32 blockheight,
struct amount_sat amount,
const struct sha256 *payment_hash)
NON_NULL_ARGS(2, 5);
struct chain_coin_mvt *new_coin_wallet_deposit(const tal_t *ctx,
const struct bitcoin_outpoint *outpoint,
u32 blockheight,
struct amount_sat amount,
enum mvt_tag tag)
NON_NULL_ARGS(2);
struct chain_coin_mvt *new_coin_wallet_withdraw(const tal_t *ctx,
const struct bitcoin_txid *spend_txid,
const struct bitcoin_outpoint *outpoint,
u32 blockheight,
struct amount_sat amount,
enum mvt_tag tag)
NON_NULL_ARGS(2, 3);
struct chain_coin_mvt *new_coin_external_spend(const tal_t *ctx,
const struct bitcoin_outpoint *outpoint,
const struct bitcoin_txid *txid,
u32 blockheight,
struct amount_sat amount,
enum mvt_tag tag)
NON_NULL_ARGS(2, 3);
struct chain_coin_mvt *new_coin_external_deposit(const tal_t *ctx,
const struct bitcoin_outpoint *outpoint,
u32 blockheight,
struct amount_sat amount,
enum mvt_tag tag)
NON_NULL_ARGS(2);
struct channel_coin_mvt *new_coin_channel_push(const tal_t *ctx,
const struct channel_id *cid,
struct amount_msat amount,
enum mvt_tag tag,
bool is_credit)
NON_NULL_ARGS(2);
struct coin_mvt *finalize_chain_mvt(const tal_t *ctx,
const struct chain_coin_mvt *chain_mvt,
const char *hrp_name,
u32 timestamp,
struct node_id *node_id)
NON_NULL_ARGS(2, 3);
struct coin_mvt *finalize_channel_mvt(const tal_t *ctx,
const struct channel_coin_mvt *chan_mvt,
const char *hrp_name,
u32 timestamp,
const struct node_id *node_id)
NON_NULL_ARGS(2, 3, 5);
/* Is this an xternal account? */
bool chain_mvt_is_external(const struct chain_coin_mvt *mvt);
const char *mvt_type_str(enum mvt_type type);
const char *mvt_tag_str(enum mvt_tag tag);
void towire_chain_coin_mvt(u8 **pptr, const struct chain_coin_mvt *mvt);
void fromwire_chain_coin_mvt(const u8 **cursor, size_t *max, struct chain_coin_mvt *mvt);
#endif /* LIGHTNING_COMMON_COIN_MVT_H */