Movement Serialization Improvements

Fixes a bunch of PR feedback listed in #1259 (closed)

  • bark: Replace write for f.write_str in subsystem types
  • bark: Remove MovementId::inner()
  • bark: Implement Display and Debug for MovementId and MovementStatus
  • bark: Order movements by time and ID
  • bark-json: Serialize Movement::metadata as JSON
  • bark-json: Serialize VtxoState::Locked::movement_id as MovementId
  • bark: Rename released migration
    • Support upgrading from beta.3
      • We modified the movement table format, so using the query isn't safe and was a bad idea at the time.
      • Also fix some nits in query::get_movement()
  • bark: Migrate bark_movements date fields to DATETIME
    • Also remove ON DELETE CASCADE as it causes silent data loss
  • bark: Change Movement timestamps to be DateTime

I manually tested upgrading from beta.3 with this code and it works great without data loss. Initially I had data loss, hence the complicated migration file, thankfully I found a workaround.

Example movement JSON:

[
  {
    "id": 1,
    "status": "finished",
    "subsystem": {
      "name": "bark.arkoor",
      "kind": "receive"
    },
    "intended_balance_sat": 10000,
    "effective_balance_sat": 10000,
    "offchain_fee_sat": 0,
    "sent_to": [],
    "received_on": [],
    "input_vtxos": [],
    "output_vtxos": [
      "2d5427d5b223260c9df345aa96d0c7513ebc717571402be332473141a713c1cb:0"
    ],
    "exited_vtxos": [],
    "time": {
      "created_at": "2025-11-20T22:37:27Z",
      "updated_at": "2025-11-20T22:37:27Z",
      "completed_at": "2025-11-20T22:37:27Z"
    }
  },
  {
    "id": 2,
    "status": "finished",
    "subsystem": {
      "name": "bark.arkoor",
      "kind": "receive"
    },
    "intended_balance_sat": 10000,
    "effective_balance_sat": 10000,
    "offchain_fee_sat": 0,
    "sent_to": [],
    "received_on": [],
    "input_vtxos": [],
    "output_vtxos": [
      "23509206f540b45153d6f593d1225eb75ab023776e2d88f7d43231b8c2e5152e:0"
    ],
    "exited_vtxos": [],
    "time": {
      "created_at": "2025-11-20T22:37:27Z",
      "updated_at": "2025-11-20T22:37:27Z",
      "completed_at": "2025-11-20T22:37:27Z"
    }
  },
  {
    "id": 3,
    "status": "finished",
    "subsystem": {
      "name": "bark.arkoor",
      "kind": "receive"
    },
    "intended_balance_sat": 10000,
    "effective_balance_sat": 10000,
    "offchain_fee_sat": 0,
    "sent_to": [],
    "received_on": [],
    "input_vtxos": [],
    "output_vtxos": [
      "834f9ae8e6546ec847f17b306b072fc8589254982c7f851c61e8fc6f106eb9bd:0"
    ],
    "exited_vtxos": [],
    "time": {
      "created_at": "2025-11-20T22:37:27Z",
      "updated_at": "2025-11-20T22:37:27Z",
      "completed_at": "2025-11-20T22:37:27Z"
    }
  },
  {
    "id": 4,
    "status": "finished",
    "subsystem": {
      "name": "bark.arkoor",
      "kind": "receive"
    },
    "intended_balance_sat": 10000,
    "effective_balance_sat": 10000,
    "offchain_fee_sat": 0,
    "sent_to": [],
    "received_on": [],
    "input_vtxos": [],
    "output_vtxos": [
      "20e5126ed835eb572e05299138c67bed9ade9ba2fc68cea6f848e496254d4e94:0"
    ],
    "exited_vtxos": [],
    "time": {
      "created_at": "2025-11-20T22:37:27Z",
      "updated_at": "2025-11-20T22:37:27Z",
      "completed_at": "2025-11-20T22:37:27Z"
    }
  },
  {
    "id": 5,
    "status": "finished",
    "subsystem": {
      "name": "bark.lightning_receive",
      "kind": "receive"
    },
    "metadata": {
      "htlc_vtxos": [
        "458104253dd4581fb8af22f809c399ab470bb5b2ecc69f8f1c61e42e6f518ced:0"
      ]
    },
    "intended_balance_sat": 3000,
    "effective_balance_sat": 3000,
    "offchain_fee_sat": 0,
    "sent_to": [],
    "received_on": [
      {
        "destination": "lntbs30u1p53l9lvsp5yd4wpcpz0rgghs5nsp825ztc0kssuxuj29dnlpf3czqvufw3dxlqpp5h7jfc4a83hpar0vuv043e9ta8amn64wmun4a6qnhcmgp7hze092sdqqcqzpc9qyysgqrm7zkzrc7w7gl8gl6m05rxjt5kja9vwzssqjj367lvvu8q67z9hn5lffsky0m0gwncvwnrytzxenwruzk6kzyjheualtwclnxlrrmnsqeqzy9a",
        "amount_sat": 3000
      }
    ],
    "input_vtxos": [],
    "output_vtxos": [
      "43ea249e73571842effcf96abdea67eef5dfd7db3cf6b6f14996cd1d36e94aca:0"
    ],
    "exited_vtxos": [],
    "time": {
      "created_at": "2025-11-20T22:37:27Z",
      "updated_at": "2025-11-20T22:37:27Z",
      "completed_at": "2025-11-20T22:37:27Z"
    }
  },
  {
    "id": 6,
    "status": "finished",
    "subsystem": {
      "name": "bark.lightning_receive",
      "kind": "receive"
    },
    "metadata": {
      "htlc_vtxos": [
        "7312150780cf36eeb73c701584fe476e736f62f9533b1a83dbcb3a6a11caefb8:0"
      ]
    },
    "intended_balance_sat": 3215,
    "effective_balance_sat": 3215,
    "offchain_fee_sat": 0,
    "sent_to": [],
    "received_on": [
      {
        "destination": "lntbs32150n1p53l9l4sp5hu4evunckr3fkqxttrvnhqw8vdjqgrlkg8vq8ejz8pd00svtdjaqpp58z36usmsguuluxphv74354c55qat4tft3t8c09elqhg5ju8wyzxqdqqcqzpc9qyysgqnacucdcacw6jap2wk2ckhpduegjcx3gjhmg4ychcn9wreuqykdrjrxsxqm7qntqew5avd7mtsac0mtpd2efly5a9km0qhvyutq8ws6gpkgrgk5",
        "amount_sat": 3215
      }
    ],
    "input_vtxos": [],
    "output_vtxos": [
      "ed386a55b834b8be54d536eecccf504533e1cdf19ce4090a5ecbe995dc84484f:0"
    ],
    "exited_vtxos": [],
    "time": {
      "created_at": "2025-11-20T22:37:27Z",
      "updated_at": "2025-11-20T22:37:27Z",
      "completed_at": "2025-11-20T22:37:27Z"
    }
  },
  {
    "id": 7,
    "status": "finished",
    "subsystem": {
      "name": "bark.lightning_receive",
      "kind": "receive"
    },
    "metadata": {
      "htlc_vtxos": [
        "9aa8921c39aef1994e47f5b0dab9d77a411626a151d4287cacf458329e3053ca:0"
      ]
    },
    "intended_balance_sat": 10000,
    "effective_balance_sat": 10000,
    "offchain_fee_sat": 0,
    "sent_to": [],
    "received_on": [
      {
        "destination": "lntbs100u1p53l9l0sp5yxkedy2d8rmy2e2x7zzqj4gt5e8vk3ysy2fqu72ssxfvuke4vsvqpp5hmyl4w4yf6n8u4cqwed8rg2qthxuah6wta7skw8z98w7l4gz7g8qdqqcqzpc9qyysgq6lnvqn2lm9gph4w7hmwenkdljfhjw8cg8fhs9wuw4v5zn6j6h9uzhrtqllylqzy6ap6z0448vy9za8et75ql4j6qdfa9zluva5t908cpppvtmd",
        "amount_sat": 10000
      }
    ],
    "input_vtxos": [],
    "output_vtxos": [
      "ffdc73e33b8c6667e385c290c61f85e79f0d0e5917efc49d9079f4e58fbc1ad8:0"
    ],
    "exited_vtxos": [],
    "time": {
      "created_at": "2025-11-20T22:37:27Z",
      "updated_at": "2025-11-20T22:37:27Z",
      "completed_at": "2025-11-20T22:37:27Z"
    }
  },
  {
    "id": 8,
    "status": "finished",
    "subsystem": {
      "name": "bark.lightning_receive",
      "kind": "receive"
    },
    "metadata": {
      "htlc_vtxos": [
        "a38228af63c0fa06958f97fdc8d5cdb0e3937669916dbbf91bbf161ab9098eb6:0"
      ]
    },
    "intended_balance_sat": 1000,
    "effective_balance_sat": 1000,
    "offchain_fee_sat": 0,
    "sent_to": [],
    "received_on": [
      {
        "destination": "lntbs10u1p53l9lfsp5h4gyjpvr563etsvtmypnw2hyfca2gfpdd2qj9als03f52hhc44cspp59gu45s582dxyw6dk7u6nl4kzf0dsh92s3rgp8xce72d5q8ywyj5qdqqcqzpc9qyysgqaj33ecqfv6phnkttn9ktuklf36tz4qellrjumenseu7ha52ulc7xmyy88u5q407qpwl33tseg2rkehxfk4xwly7dladu2prcrj96wlspcuvdxr",
        "amount_sat": 1000
      }
    ],
    "input_vtxos": [],
    "output_vtxos": [
      "567d61ef272b89303a6316df407cd56814a3a87513bb9aa0bd4aa59c6368f1f5:0"
    ],
    "exited_vtxos": [],
    "time": {
      "created_at": "2025-11-20T22:37:27Z",
      "updated_at": "2025-11-20T22:37:28Z",
      "completed_at": "2025-11-20T22:37:28Z"
    }
  },
  {
    "id": 9,
    "status": "pending",
    "subsystem": {
      "name": "bark.round",
      "kind": "refresh"
    },
    "intended_balance_sat": 0,
    "effective_balance_sat": 0,
    "offchain_fee_sat": 0,
    "sent_to": [],
    "received_on": [],
    "input_vtxos": [
      "20e5126ed835eb572e05299138c67bed9ade9ba2fc68cea6f848e496254d4e94:0",
      "23509206f540b45153d6f593d1225eb75ab023776e2d88f7d43231b8c2e5152e:0",
      "2d5427d5b223260c9df345aa96d0c7513ebc717571402be332473141a713c1cb:0",
      "43ea249e73571842effcf96abdea67eef5dfd7db3cf6b6f14996cd1d36e94aca:0",
      "567d61ef272b89303a6316df407cd56814a3a87513bb9aa0bd4aa59c6368f1f5:0",
      "834f9ae8e6546ec847f17b306b072fc8589254982c7f851c61e8fc6f106eb9bd:0",
      "ed386a55b834b8be54d536eecccf504533e1cdf19ce4090a5ecbe995dc84484f:0",
      "ffdc73e33b8c6667e385c290c61f85e79f0d0e5917efc49d9079f4e58fbc1ad8:0"
    ],
    "output_vtxos": [],
    "exited_vtxos": [],
    "time": {
      "created_at": "2025-11-20T22:37:35Z",
      "updated_at": "2025-11-20T22:37:35Z"
    }
  }
]
Edited by Peter

Merge request reports

Loading