interveil-sdk 0.1.0

A portable execution language for intent-based Solana transactions — build, sign, and submit intents without holding keys
Documentation
#[cfg(test)]
mod tests {
    use interveil_sdk::{Chain, Intent, IntentPayload};

    fn make_intent(nonce: u64, lamports: u64) -> Intent {
        Intent {
            version: 1,
            chain: Chain::Solana,
            nonce,
            payload: IntentPayload::TransferSol {
                to: "11111111111111111111111111111111".to_string(),
                lamports,
            },
        }
    }

    #[test]
    fn deterministic_1000_iterations() {
        let intent = make_intent(42, 1_000_000_000);
        let first_bytes = intent.to_bytes().unwrap();

        for _ in 0..1000 {
            let bytes = intent.to_bytes().unwrap();
            assert_eq!(bytes, first_bytes, "serialization is not deterministic");
        }
    }

    #[test]
    fn different_nonce_different_bytes() {
        let a = make_intent(1, 1_000_000_000);
        let b = make_intent(2, 1_000_000_000);
        assert_ne!(a.to_bytes().unwrap(), b.to_bytes().unwrap());
    }

    #[test]
    fn different_lamports_different_bytes() {
        let a = make_intent(1, 100);
        let b = make_intent(1, 200);
        assert_ne!(a.to_bytes().unwrap(), b.to_bytes().unwrap());
    }

    #[test]
    fn different_recipient_different_bytes() {
        let a = Intent {
            version: 1,
            chain: Chain::Solana,
            nonce: 1,
            payload: IntentPayload::TransferSol {
                to: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa".to_string(),
                lamports: 100,
            },
        };
        let b = Intent {
            version: 1,
            chain: Chain::Solana,
            nonce: 1,
            payload: IntentPayload::TransferSol {
                to: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb".to_string(),
                lamports: 100,
            },
        };
        assert_ne!(a.to_bytes().unwrap(), b.to_bytes().unwrap());
    }

    #[test]
    fn bytes_are_non_empty() {
        let intent = make_intent(1, 1);
        let bytes = intent.to_bytes().unwrap();
        assert!(!bytes.is_empty());
    }
}