radix-transactions 1.3.1

Various Radix transaction models and the manifest compiler/decompiler, from the Radix DLT project.
Documentation
use crate::internal_prelude::*;
use sbor::traversal::*;

pub fn extract_references(
    encoded: &[u8],
    expected_start: ExpectedStart<ManifestCustomValueKind>,
) -> IndexSet<Reference> {
    let mut references = index_set_new();
    let mut traverser = ManifestTraverser::new(
        encoded,
        expected_start,
        VecTraverserConfig {
            max_depth: MANIFEST_SBOR_V1_MAX_DEPTH,
            check_exact_end: true,
        },
    );
    loop {
        let event = traverser.next_event();
        match event.event {
            TraversalEvent::ContainerStart(_) => {}
            TraversalEvent::ContainerEnd(_) => {}
            TraversalEvent::TerminalValue(r) => {
                if let TerminalValueRef::Custom(c) = r {
                    match c.0 {
                        ManifestCustomValue::Address(address) => {
                            if let ManifestAddress::Static(node_id) = address {
                                references.insert(Reference(node_id));
                            }
                        }
                        ManifestCustomValue::Bucket(_)
                        | ManifestCustomValue::Proof(_)
                        | ManifestCustomValue::AddressReservation(_)
                        | ManifestCustomValue::Expression(_)
                        | ManifestCustomValue::Blob(_)
                        | ManifestCustomValue::Decimal(_)
                        | ManifestCustomValue::PreciseDecimal(_)
                        | ManifestCustomValue::NonFungibleLocalId(_) => {}
                    }
                }
            }
            TraversalEvent::TerminalValueBatch(_) => {}
            TraversalEvent::End => {
                break;
            }
            TraversalEvent::DecodeError(e) => {
                panic!("Unexpected decoding error: {:?}", e);
            }
        }
    }
    references
}