From 4bd98d837cbed3b46884997d856f11e7fd65f10f Mon Sep 17 00:00:00 2001 From: Michael Birch Date: Tue, 12 Sep 2023 17:48:19 +0200 Subject: [PATCH] Add another old SubmitResult format --- refiner-lib/src/hashchain.rs | 18 +++++++----- refiner-lib/src/legacy.rs | 49 +++++++++++++++++++++++++++++++ refiner-types/src/aurora_block.rs | 2 ++ 3 files changed, 61 insertions(+), 8 deletions(-) diff --git a/refiner-lib/src/hashchain.rs b/refiner-lib/src/hashchain.rs index 71d2699..bae0001 100644 --- a/refiner-lib/src/hashchain.rs +++ b/refiner-lib/src/hashchain.rs @@ -106,14 +106,16 @@ pub fn validate_tx_hashchain( let result = crate::legacy::SubmitResultLegacyV2 { status, gas_used: transaction.gas_used, - logs: transaction - .logs - .iter() - .map(|l| crate::legacy::ResultLogV1 { - topics: l.topics.clone(), - data: l.data.clone(), - }) - .collect(), + logs: crate::legacy::to_v1_logs(&transaction.logs), + }; + Cow::Owned(result.try_to_vec().expect(MUST_BORSH_SERIALIZE)) + } + HashchainOutputKind::SubmitResultLegacyV3 => { + let result = crate::legacy::SubmitResultLegacyV3 { + status: transaction.status, + gas_used: transaction.gas_used, + result: transaction.output.clone(), + logs: crate::legacy::to_v1_logs(&transaction.logs), }; Cow::Owned(result.try_to_vec().expect(MUST_BORSH_SERIALIZE)) } diff --git a/refiner-lib/src/legacy.rs b/refiner-lib/src/legacy.rs index f4d0e3e..628da43 100644 --- a/refiner-lib/src/legacy.rs +++ b/refiner-lib/src/legacy.rs @@ -50,6 +50,40 @@ impl From for SubmitResult { } } +#[derive(BorshSerialize, BorshDeserialize)] +pub struct SubmitResultLegacyV3 { + pub status: bool, + pub gas_used: u64, + pub result: Vec, + pub logs: Vec, +} + +impl From for SubmitResult { + fn from(result: SubmitResultLegacyV3) -> Self { + let status = if result.status { + TransactionStatus::Succeed(result.result) + } else if !result.result.is_empty() { + TransactionStatus::Revert(result.result) + } else { + TransactionStatus::OutOfFund + }; + SubmitResult::new( + status, + result.gas_used, + result.logs.into_iter().map(Into::into).collect(), + ) + } +} + +pub fn to_v1_logs(logs: &[ResultLog]) -> Vec { + logs.iter() + .map(|l| ResultLogV1 { + topics: l.topics.clone(), + data: l.data.clone(), + }) + .collect() +} + pub fn decode_submit_result(result: &[u8]) -> Result<(SubmitResult, HashchainOutputKind)> { SubmitResult::try_from_slice(result) .map(|x| { @@ -68,12 +102,27 @@ pub fn decode_submit_result(result: &[u8]) -> Result<(SubmitResult, HashchainOut (x.into(), HashchainOutputKind::SubmitResultLegacyV2(tag)) }) }) + .or_else(|_| { + SubmitResultLegacyV3::try_from_slice(result) + .map(|x| (x.into(), HashchainOutputKind::SubmitResultLegacyV3)) + }) } #[cfg(test)] mod tests { use super::decode_submit_result; + #[test] + fn test_legacy_may_2021() { + // `SubmitResult` taken from + // https://explorer.mainnet.near.org/transactions/CeG24XrGneQb3PF5xmgzkPGPcFZ3yDzKJ755ZPdXAT6Q#B36aGoLRkspLkjGPgR13ZqUtR3vK7WftqT6HH2BJu5r2 + let data = hex::decode( + "01b026010000000000140000008a778c47d1d6b4dd5d2cef9881f889c250cd882000000000", + ) + .unwrap(); + decode_submit_result(&data).unwrap(); + } + #[test] fn test_legacy_v2() { let data = vec![ diff --git a/refiner-types/src/aurora_block.rs b/refiner-types/src/aurora_block.rs index 4646e68..2d5cf58 100644 --- a/refiner-types/src/aurora_block.rs +++ b/refiner-types/src/aurora_block.rs @@ -222,6 +222,8 @@ pub enum HashchainOutputKind { SubmitResultLegacyV1(ResultStatusTag), /// Borsh-encoding of SubmitResultLegacyV2 (fields populated with data from `AuroraTransaction`). SubmitResultLegacyV2(ResultStatusTag), + /// Borsh-encoding of SubmitResultLegacyV3 (fields populated with data from `AuroraTransaction`). + SubmitResultLegacyV3, /// Borsh-encoding of current SubmitResult version (fields populated with data from `AuroraTransaction`). SubmitResultV7(ResultStatusTag), /// Raw output explicitly given in `AuroraTransaction.output`