#include #include #include #include #include #include #define MAKE_ROOM(arr, pos, num) \ memmove((arr) + (pos) + 1, (arr) + (pos), \ sizeof(*(arr)) * ((num) - ((pos) + 1))) #define REMOVE_ELEM(arr, pos, num) \ memmove((arr) + (pos), (arr) + (pos) + 1, \ sizeof(*(arr)) * ((num) - ((pos) + 1))) struct wally_psbt_input *psbt_add_input(struct wally_psbt *psbt, struct wally_tx_input *input, size_t insert_at) { struct wally_tx *tx; struct wally_tx_input tmp_in; tx = psbt->tx; assert(insert_at <= tx->num_inputs); wally_tx_add_input(tx, input); tmp_in = tx->inputs[tx->num_inputs - 1]; MAKE_ROOM(tx->inputs, insert_at, tx->num_inputs); tx->inputs[insert_at] = tmp_in; if (psbt->inputs_allocation_len < tx->num_inputs) { struct wally_psbt_input *p = tal_arr(psbt, struct wally_psbt_input, tx->num_inputs); memcpy(p, psbt->inputs, sizeof(*psbt->inputs) * psbt->inputs_allocation_len); tal_free(psbt->inputs); psbt->inputs = p; psbt->inputs_allocation_len = tx->num_inputs; } psbt->num_inputs += 1; MAKE_ROOM(psbt->inputs, insert_at, psbt->num_inputs); memset(&psbt->inputs[insert_at], 0, sizeof(psbt->inputs[insert_at])); return &psbt->inputs[insert_at]; } void psbt_rm_input(struct wally_psbt *psbt, size_t remove_at) { assert(remove_at < psbt->tx->num_inputs); wally_tx_remove_input(psbt->tx, remove_at); REMOVE_ELEM(psbt->inputs, remove_at, psbt->num_inputs); psbt->num_inputs -= 1; } struct wally_psbt_output *psbt_add_output(struct wally_psbt *psbt, struct wally_tx_output *output, size_t insert_at) { struct wally_tx *tx; struct wally_tx_output tmp_out; tx = psbt->tx; assert(insert_at <= tx->num_outputs); wally_tx_add_output(tx, output); tmp_out = tx->outputs[tx->num_outputs - 1]; MAKE_ROOM(tx->outputs, insert_at, tx->num_outputs); tx->outputs[insert_at] = tmp_out; if (psbt->outputs_allocation_len < tx->num_outputs) { struct wally_psbt_output *p = tal_arr(psbt, struct wally_psbt_output, tx->num_outputs); memcpy(p, psbt->outputs, sizeof(*psbt->outputs) * psbt->outputs_allocation_len); tal_free(psbt->outputs); psbt->outputs = p; psbt->outputs_allocation_len = tx->num_outputs; } psbt->num_outputs += 1; MAKE_ROOM(psbt->outputs, insert_at, psbt->num_outputs); memset(&psbt->outputs[insert_at], 0, sizeof(psbt->outputs[insert_at])); return &psbt->outputs[insert_at]; } void psbt_rm_output(struct wally_psbt *psbt, size_t remove_at) { assert(remove_at < psbt->tx->num_outputs); wally_tx_remove_output(psbt->tx, remove_at); REMOVE_ELEM(psbt->outputs, remove_at, psbt->num_outputs); psbt->num_outputs -= 1; }