Skip to content

Commit

Permalink
feat(emergency kit): Add emergency kit to recreate position from fail…
Browse files Browse the repository at this point in the history
…ed order and signed channel
  • Loading branch information
holzeis committed Mar 22, 2024
1 parent cb52b63 commit 5702114
Show file tree
Hide file tree
Showing 5 changed files with 277 additions and 141 deletions.
1 change: 1 addition & 0 deletions coordinator/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ pub mod cli;
pub mod db;
pub mod dlc_handler;
pub mod dlc_protocol;
mod emergency_kit;
mod leaderboard;
pub mod logger;
pub mod message;
Expand Down
306 changes: 165 additions & 141 deletions mobile/lib/common/settings/emergency_kit_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -67,159 +67,183 @@ class _EmergencyKitScreenState extends State<EmergencyKitScreen> {
)
],
)),
const SizedBox(height: 30),
EmergencyKitButton(
icon: const Icon(FontAwesomeIcons.broom),
title: "Cleanup filling orders",
onPressed: () async {
final messenger = ScaffoldMessenger.of(context);
final orderChangeNotifier = context.read<OrderChangeNotifier>();
final goRouter = GoRouter.of(context);
])),
const SizedBox(height: 10),
Expanded(
child: SingleChildScrollView(
child: Container(
margin: const EdgeInsets.only(left: 10, right: 10, bottom: 30),
child: Column(children: [
EmergencyKitButton(
icon: const Icon(FontAwesomeIcons.broom),
title: "Cleanup filling orders",
onPressed: () async {
final messenger = ScaffoldMessenger.of(context);
final orderChangeNotifier = context.read<OrderChangeNotifier>();
final goRouter = GoRouter.of(context);

try {
await rust.api.setFillingOrdersToFailed();
await orderChangeNotifier.initialize();
showSnackBar(messenger, "Successfully set filling orders to failed");
} catch (e) {
showSnackBar(
messenger, "Failed to set filling orders to failed. Error: $e");
}
try {
await rust.api.setFillingOrdersToFailed();
await orderChangeNotifier.initialize();
showSnackBar(messenger, "Successfully set filling orders to failed");
} catch (e) {
showSnackBar(
messenger, "Failed to set filling orders to failed. Error: $e");
}

goRouter.pop();
}),
const SizedBox(height: 30),
Row(
children: [
Expanded(
child: TextField(
onChanged: (value) => _dlcChannelId = value,
decoration: InputDecoration(
border: const OutlineInputBorder(),
hintText: "Copy from Settings > Channel",
labelText: "Dlc Channel Id",
labelStyle: const TextStyle(color: Colors.black87),
filled: true,
fillColor: Colors.white,
errorStyle: TextStyle(
color: Colors.red[900],
),
goRouter.pop();
}),
const SizedBox(height: 30),
Row(
children: [
Expanded(
child: TextField(
onChanged: (value) => _dlcChannelId = value,
decoration: InputDecoration(
border: const OutlineInputBorder(),
hintText: "Copy from Settings > Channel",
labelText: "Dlc Channel Id",
labelStyle: const TextStyle(color: Colors.black87),
filled: true,
fillColor: Colors.white,
errorStyle: TextStyle(
color: Colors.red[900],
),
)),
IconButton(
onPressed: () {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: const Text("Are you sure?"),
content: const Text(
"Performing that action may break your app state and should only get executed after consulting with the 10101 Team."),
actions: [
TextButton(
onPressed: () => GoRouter.of(context).pop(),
child: const Text('No'),
),
TextButton(
onPressed: () async {
final messenger = ScaffoldMessenger.of(context);
final goRouter = GoRouter.of(context);
),
)),
IconButton(
onPressed: () {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: const Text("Are you sure?"),
content: const Text(
"Performing that action may break your app state and should only get executed after consulting with the 10101 Team."),
actions: [
TextButton(
onPressed: () => GoRouter.of(context).pop(),
child: const Text('No'),
),
TextButton(
onPressed: () async {
final messenger = ScaffoldMessenger.of(context);
final goRouter = GoRouter.of(context);

try {
await dlcChannelChangeNotifier
.deleteDlcChannel(_dlcChannelId ?? "");
showSnackBar(messenger,
"Successfully deleted dlc channel with id $_dlcChannelId");
} catch (error) {
showSnackBar(messenger, "$error");
}
goRouter.pop();
},
child: const Text('Yes'),
),
]);
});
},
icon: const Icon(
Icons.delete,
size: 32,
))
],
),
const SizedBox(height: 30),
EmergencyKitButton(
icon: const Icon(FontAwesomeIcons.broom),
title: "Delete position",
onPressed: () async {
final messenger = ScaffoldMessenger.of(context);
final goRouter = GoRouter.of(context);
try {
await dlcChannelChangeNotifier
.deleteDlcChannel(_dlcChannelId ?? "");
showSnackBar(messenger,
"Successfully deleted dlc channel with id $_dlcChannelId");
} catch (error) {
showSnackBar(messenger, "$error");
}
goRouter.pop();
},
child: const Text('Yes'),
),
]);
});
},
icon: const Icon(
Icons.delete,
size: 32,
))
],
),
const SizedBox(height: 30),
EmergencyKitButton(
icon: const Icon(FontAwesomeIcons.broom),
title: "Delete position",
onPressed: () async {
final messenger = ScaffoldMessenger.of(context);
final goRouter = GoRouter.of(context);

try {
await rust.api.deletePosition();
showSnackBar(messenger, "Successfully deleted position");
} catch (e) {
showSnackBar(messenger, "Failed to delete position. Error: $e");
}
try {
await rust.api.deletePosition();
showSnackBar(messenger, "Successfully deleted position");
} catch (e) {
showSnackBar(messenger, "Failed to delete position. Error: $e");
}

goRouter.pop();
}),
const SizedBox(height: 30),
EmergencyKitButton(
icon: const Icon(FontAwesomeIcons.broom),
title: "Resend SettleFinalize Message",
onPressed: () async {
final messenger = ScaffoldMessenger.of(context);
final goRouter = GoRouter.of(context);
goRouter.pop();
}),
const SizedBox(height: 30),
EmergencyKitButton(
icon: const Icon(FontAwesomeIcons.broom),
title: "Recreate position",
onPressed: () async {
final messenger = ScaffoldMessenger.of(context);
final goRouter = GoRouter.of(context);

try {
await rust.api.resendSettleFinalizeMessage();
showSnackBar(messenger, "Successfully resend SettleFinalize message");
} catch (e) {
showSnackBar(
messenger, "Failed to resend SettleFinalize message. Error: $e");
}
try {
await rust.api.recreatePosition();
showSnackBar(messenger, "Successfully recreated position");
} catch (e) {
showSnackBar(messenger, "Failed to recreate position. Error: $e");
}

goRouter.pop();
}),
const SizedBox(height: 30),
EmergencyKitButton(
icon: const Icon(FontAwesomeIcons.backwardStep),
title: "Rollback channel state",
onPressed: () async {
final messenger = ScaffoldMessenger.of(context);
final orderChangeNotifier = context.read<OrderChangeNotifier>();
final goRouter = GoRouter.of(context);
goRouter.pop();
}),
const SizedBox(height: 30),
EmergencyKitButton(
icon: const Icon(FontAwesomeIcons.broom),
title: "Resend SettleFinalize Message",
onPressed: () async {
final messenger = ScaffoldMessenger.of(context);
final goRouter = GoRouter.of(context);

try {
await rust.api.rollBackChannelState();
await orderChangeNotifier.initialize();
showSnackBar(messenger, "Successfully rolled back channel state");
} catch (e) {
showSnackBar(messenger, "Failed to rollback channel state. Error: $e");
}
try {
await rust.api.resendSettleFinalizeMessage();
showSnackBar(messenger, "Successfully resend SettleFinalize message");
} catch (e) {
showSnackBar(
messenger, "Failed to resend SettleFinalize message. Error: $e");
}

goRouter.pop();
}),
const SizedBox(height: 30),
Visibility(
visible: config.network == "regtest",
child: EmergencyKitButton(
icon: const Icon(FontAwesomeIcons.broom),
title: "Reset answered poll cache",
onPressed: () {
final messenger = ScaffoldMessenger.of(context);
final goRouter = GoRouter.of(context);
goRouter.pop();
}),
const SizedBox(height: 30),
EmergencyKitButton(
icon: const Icon(FontAwesomeIcons.backwardStep),
title: "Rollback channel state",
onPressed: () async {
final messenger = ScaffoldMessenger.of(context);
final orderChangeNotifier = context.read<OrderChangeNotifier>();
final goRouter = GoRouter.of(context);

try {
rust.api.resetAllAnsweredPolls();
showSnackBar(messenger,
"Successfully reset answered polls - You can now answer them again");
} catch (e) {
showSnackBar(messenger, "Failed to reset answered polls: $e");
}
try {
await rust.api.rollBackChannelState();
await orderChangeNotifier.initialize();
showSnackBar(messenger, "Successfully rolled back channel state");
} catch (e) {
showSnackBar(messenger, "Failed to rollback channel state. Error: $e");
}

goRouter.pop();
})),
])),
goRouter.pop();
}),
const SizedBox(height: 30),
Visibility(
visible: config.network == "regtest",
child: EmergencyKitButton(
icon: const Icon(FontAwesomeIcons.broom),
title: "Reset answered poll cache",
onPressed: () {
final messenger = ScaffoldMessenger.of(context);
final goRouter = GoRouter.of(context);

try {
rust.api.resetAllAnsweredPolls();
showSnackBar(messenger,
"Successfully reset answered polls - You can now answer them again");
} catch (e) {
showSnackBar(messenger, "Failed to reset answered polls: $e");
}

goRouter.pop();
})),
]),
)))
],
),
),
Expand Down
4 changes: 4 additions & 0 deletions mobile/native/src/api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -389,6 +389,10 @@ pub fn delete_position() -> Result<()> {
emergency_kit::delete_position()
}

pub fn recreate_position() -> Result<()> {
emergency_kit::recreate_position()
}

pub fn resend_settle_finalize_message() -> Result<()> {
emergency_kit::resend_settle_finalize_message()
}
Expand Down
15 changes: 15 additions & 0 deletions mobile/native/src/db/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,21 @@ pub fn maybe_get_open_orders() -> Result<Vec<trade::order::Order>> {
Ok(orders)
}

pub fn get_last_failed_order() -> Result<Option<trade::order::Order>> {
let mut db = connection()?;

let mut orders = Order::get_by_state(OrderState::Failed, &mut db)?;

orders.sort_by(|a, b| b.creation_timestamp.cmp(&a.creation_timestamp));

let order = match orders.first() {
Some(order) => Some(order.clone().try_into()?),
None => None,
};

Ok(order)
}

/// Return an [`Order`] that is currently in [`OrderState::Filling`].
pub fn get_order_in_filling() -> Result<Option<trade::order::Order>> {
let mut db = connection()?;
Expand Down
Loading

0 comments on commit 5702114

Please sign in to comment.