├── .npmrc ├── test ├── client │ ├── files │ │ ├── salt │ │ ├── 410987b906628e0708296a4cb9034121ddf275f1d5ecd1302642c552428368bf19.toda │ │ ├── 41313b593c91b6b5c5ab23be3d561cea76d6dba74d8455f01807010580dddbf280.toda │ │ ├── 41452470c4bb57365d701783172f27e00a917aeeb6f97d15c390fe5c8423b5d85f.toda │ │ ├── 4151a40bde66fc10e07b1cef4668811f68c570658ead8bb192098cacb55171bd29.toda │ │ ├── 4174355864aafbb67e84237a74c7a9ef6e49e3b70c0a7518c0b2b4a6f4c4594da7.toda │ │ ├── 419cf32881947c306cd6dc425ca3fc1b43b9d2e03effd7eb35b526c00ba5691bc1.toda │ │ └── 41d3b8000e5959b81bcf55a4c4782deab8583f9b4c0624cdf9fec731cd2b06f40e.toda │ ├── remoteRelay_files │ │ ├── 411e92391c496a74d168f67cc434dd18b46b536f719f5691cabd96377f2606efaf.shield │ │ ├── 4131c65001117d57a1eaad04b84457d1b74ddb0a6a07b58cc207623351e20f5a9f.shield │ │ ├── 417fb3920df356573f6dcc283e6f2f8dd9866ac9e5469e8da5816aa742bd424b57.shield │ │ ├── 411764d35c547a131caeed1bee31208942bb6b3b019dc5d13a030036ea37a921cf.toda │ │ ├── 411e92391c496a74d168f67cc434dd18b46b536f719f5691cabd96377f2606efaf.toda │ │ ├── 4131c65001117d57a1eaad04b84457d1b74ddb0a6a07b58cc207623351e20f5a9f.toda │ │ ├── 417b666fe45dfd709954328b145be7c4ade6b636433c0e70da7e37b98a52ef8e54.toda │ │ ├── 417fb3920df356573f6dcc283e6f2f8dd9866ac9e5469e8da5816aa742bd424b57.toda │ │ ├── 418f79797eca5a8d46d3183737f0a9c50e4950a1f86298621785939cf6d41bee5b.toda │ │ ├── 41c23ccbe5731c4b77e15ade38d5fc305a5986dc810b0707d40d3fd4aa1236f8b2.toda │ │ ├── 41c9e07a006115beb76b92273e1612754750a51de90769361f05cfa0a62999fc76.toda │ │ ├── 41e1b0a489cf9a8a8e0da57d18a72bd7f4fca0fe507af4cea607eea804b7d93f3b.toda │ │ ├── 411764d35c547a131caeed1bee31208942bb6b3b019dc5d13a030036ea37a921cf.next.toda │ │ ├── 411e92391c496a74d168f67cc434dd18b46b536f719f5691cabd96377f2606efaf.next.toda │ │ ├── 4131c65001117d57a1eaad04b84457d1b74ddb0a6a07b58cc207623351e20f5a9f.next.toda │ │ ├── 417b666fe45dfd709954328b145be7c4ade6b636433c0e70da7e37b98a52ef8e54.next.toda │ │ ├── 417fb3920df356573f6dcc283e6f2f8dd9866ac9e5469e8da5816aa742bd424b57.next.toda │ │ ├── 418f79797eca5a8d46d3183737f0a9c50e4950a1f86298621785939cf6d41bee5b.next.toda │ │ ├── 41c23ccbe5731c4b77e15ade38d5fc305a5986dc810b0707d40d3fd4aa1236f8b2.next.toda │ │ └── 41c9e07a006115beb76b92273e1612754750a51de90769361f05cfa0a62999fc76.next.toda │ ├── dq_cache_dummies │ │ └── sampleCache.json │ ├── util.js │ ├── relay_server.js │ └── requirements_test.js ├── toda-tests │ ├── rigging │ │ ├── green │ │ │ ├── unit_rig.toda │ │ │ ├── simple_last.toda │ │ │ ├── simple_lash_f1.toda │ │ │ ├── simple_lash_f2.toda │ │ │ ├── unit_rig_multi.toda │ │ │ ├── valid_kiwano.toda │ │ │ ├── valid_kiwano_0.toda │ │ │ ├── valid_kiwano_1.toda │ │ │ ├── valid_kiwano_f1.toda │ │ │ ├── valid_kiwano_f2.toda │ │ │ ├── valid_kiwano_f5.toda │ │ │ ├── cork_prev_invalid.toda │ │ │ ├── invalid_rigging_green.toda │ │ │ ├── multiple_hoists_green.toda │ │ │ └── invalid_shielding_green.toda │ │ ├── red │ │ │ ├── cork_reqsat_fail.toda │ │ │ ├── self_referential.toda │ │ │ ├── splice_mismatch.toda │ │ │ ├── cork_prev_invalid.toda │ │ │ ├── meets_do_not_match.toda │ │ │ ├── lashed_non_colinear.toda │ │ │ ├── corkline_incomplete_early.toda │ │ │ ├── corkline_incomplete_late.toda │ │ │ ├── lash_succession_reqsat_fail.toda │ │ │ ├── lash_succession_no_fast_twist.toda │ │ │ └── post_rigging_missing_post_key.toda │ │ └── yellow │ │ │ ├── missing_rigging.toda │ │ │ ├── missing_shield.toda │ │ │ ├── cork_missing_rigging.toda │ │ │ ├── corkline_incomplete_early.toda │ │ │ └── lash_succession_missing_prev.toda │ └── reqsat │ │ ├── rslist │ │ ├── green │ │ │ ├── overkill.toda │ │ │ ├── exactly_255.toda │ │ │ ├── green_red_mix.toda │ │ │ ├── green_yellow_mix.toda │ │ │ └── green_wt_missing_irrelevant.toda │ │ ├── red │ │ │ ├── exactly_254.toda │ │ │ ├── invalid_weight.toda │ │ │ ├── red_green_mix.toda │ │ │ ├── red_wt_missing.toda │ │ │ ├── req_list_fewer_entries.toda │ │ │ ├── sat_list_fewer_entries.toda │ │ │ ├── rslist_req_value_not_hashes.toda │ │ │ └── rslist_sat_value_not_hashes.toda │ │ └── yellow │ │ │ ├── green_wt_missing.toda │ │ │ ├── req_entry_missing.toda │ │ │ ├── yellow_green_mix.toda │ │ │ ├── yellow_wt_missing.toda │ │ │ ├── rslist_req_value_missing.toda │ │ │ └── rslist_sat_value_missing.toda │ │ ├── reqsattrie │ │ ├── red │ │ │ ├── both_red.toda │ │ │ ├── req_null_sat_not.toda │ │ │ ├── reqtrie_invalid.toda │ │ │ ├── sat_null_req_not.toda │ │ │ ├── sattrie_invalid.toda │ │ │ ├── sattrie_key_extra.toda │ │ │ ├── sattrie_key_not_included.toda │ │ │ ├── secp256r1_red_rslist_green.toda │ │ │ ├── secp256r1_red_rslist_yellow.toda │ │ │ └── reqtrie_sattrie_different_keys.toda │ │ ├── green │ │ │ ├── both_green.toda │ │ │ └── req_and_sat_null.toda │ │ └── yellow │ │ │ ├── both_yellow.toda │ │ │ ├── reqtrie_missing.toda │ │ │ ├── sattrie_missing.toda │ │ │ ├── unknown_interpreter.toda │ │ │ ├── secp256r1_yellow_rslist_green.toda │ │ │ └── unknown_interpreter_the_sequel.toda │ │ └── secp256r1 │ │ ├── red │ │ ├── req_not_arb.toda │ │ ├── sat_not_arb.toda │ │ ├── wrong_priv_key_used.toda │ │ ├── signed_over_wrong_hash.toda │ │ └── req_missing_and_sat_not_arb.toda │ │ ├── yellow │ │ ├── req_missing.toda │ │ └── sat_missing.toda │ │ └── green │ │ └── satisfied_sig.toda ├── test-suite │ ├── inputs │ │ ├── atomic_body_test_empty_body_input.toda │ │ ├── atomic_hash_test_no_spec_01_input.toda │ │ ├── atomic_hash_test_null_hash_input.toda │ │ ├── atomic_hash_test_unit_hash_input.toda │ │ ├── atomic_atom_test_hash_mismatch_input.toda │ │ ├── atomic_hash_test_sha256_hash_input.toda │ │ ├── atomic_hash_test_symbol_hash_input.toda │ │ ├── atomic_packet_test_arb_packet_input.toda │ │ ├── atomic_twist_test_twist_empty_input.toda │ │ ├── atomic_body_test_valid_body_test_input.toda │ │ ├── atomic_hash_list_test_empty_list_input.toda │ │ ├── atomic_packet_test_hashes_packet_input.toda │ │ ├── atomic_lat_test_valid_list_of_atoms_input.toda │ │ ├── atomic_packet_test_no_spec_47_shape_input.toda │ │ ├── atomic_packet_test_packet_too_short_input.toda │ │ ├── atomic_packet_test_pairtrie_packet_input.toda │ │ ├── atomic_pairtrie_test_empty_pairtrie_input.toda │ │ ├── atomic_pairtrie_test_odd_of_hashes_input.toda │ │ ├── atomic_pairtrie_test_valid_pairtrie_input.toda │ │ ├── atomic_twist_test_valid_twist_test_input.toda │ │ ├── atomic_packet_test_basic_body_packet_input.toda │ │ ├── atomic_packet_test_basic_twist_packet_input.toda │ │ ├── atomic_pairtrie_test_odd_of_hashes_ii_input.toda │ │ ├── reqsat_reqsat_test_reqtrie_all_green_input.toda │ │ ├── reqsat_reqsat_test_trie_null_mismatch_input.toda │ │ ├── atomic_body_test_body_contains_7_hashes_input.toda │ │ ├── atomic_hash_list_test_valid_hashes_list_input.toda │ │ ├── atomic_lat_test_lat_contains_null_hash_input.toda │ │ ├── atomic_lat_test_lat_contains_shape_error_input.toda │ │ ├── atomic_lat_test_lat_contains_symbol_hash_input.toda │ │ ├── atomic_lat_test_lat_contains_unit_hash_input.toda │ │ ├── reqsat_reqsat_test_predecessor_is_null_input.toda │ │ ├── reqsat_reqsat_test_reqsat_keys_mismatch_input.toda │ │ ├── reqsat_reqsat_test_reqtrie_one_red_red_input.toda │ │ ├── reqsat_reqsat_test_reqtrie_two_red_red_input.toda │ │ ├── reqsat_reqsat_test_trie_null_mismatch_ii_input.toda │ │ ├── reqsat_reqsat_test_unknown_reqsat_type_input.toda │ │ ├── atomic_packet_test_packet_length_mismatch_input.toda │ │ ├── atomic_twist_test_twist_contains_3_hashes_input.toda │ │ ├── reqsat_reqsat_test_predecessor_is_missing__input.toda │ │ ├── reqsat_reqsat_test_reqsat_keys_mismatch_ii_input.toda │ │ ├── atomic_body_test_body_contains_only_5_hashes_input.toda │ │ ├── atomic_body_test_last_hash_ends_prematurely_input.toda │ │ ├── atomic_lat_test_atom_bytes_ends_prematurely_input.toda │ │ ├── atomic_lat_test_lat_contains_shape_error_ii_input.toda │ │ ├── atomic_lat_test_lat_contains_shape_error_iii_input.toda │ │ ├── atomic_pairtrie_test_incorrectly_sorted_keys_input.toda │ │ ├── atomic_twist_test_last_hash_ends_prematurely_input.toda │ │ ├── atomic_twist_test_twist_contains_only_1_hash_input.toda │ │ ├── reqsat_reqsat_test_reqsat_keys_mismatch_iii_input.toda │ │ ├── reqsat_reqsat_test_reqtrie_one_yellow_yellow_input.toda │ │ ├── reqsat_reqsat_test_reqtrie_two_yellow_yellow_input.toda │ │ ├── reqsat_reqsat_test_successor_body_is_missing__input.toda │ │ ├── reqsat_reqsatlist_test_sat_value_is_missing_input.toda │ │ ├── reqsat_reqsatlist_test_total_green_weight_384_input.toda │ │ ├── atomic_pairtrie_test_last_hash_ends_prematurely_input.toda │ │ ├── reqsat_reqsat_test_predecessor_body_is_missing__input.toda │ │ ├── reqsat_reqsat_test_secp256r1_invalid_signature_input.toda │ │ ├── reqsat_reqsat_test_secp256r1_req_value_is_null__input.toda │ │ ├── reqsat_reqsat_test_unknown_reqsat_type_mismatch_input.toda │ │ ├── reqsat_reqsat_test_valid_null_reqsat_succession_input.toda │ │ ├── atomic_hash_list_test_last_hash_ends_prematurely_input.toda │ │ ├── reqsat_reqsat_test_reqtrie_one_yellow_one_red_red_input.toda │ │ ├── reqsat_reqsat_test_successor_has_an_unknown_shape__input.toda │ │ ├── reqsat_reqsat_test_unknown_reqsat_type_mismatch_ii_input.toda │ │ ├── reqsat_reqsatlist_test_req_entry_value_is_missing_input.toda │ │ ├── atomic_lat_test_lat_contains_unit_hash_and_null_hash_input.toda │ │ ├── reqsat_reqsat_test_predecessor_has_an_unknown_shape__input.toda │ │ ├── reqsat_reqsat_test_successor_is_an_arb_not_a_twist__input.toda │ │ ├── reqsat_reqsatlist_test_four_entries_green_weight_355_input.toda │ │ ├── reqsat_reqsatlist_test_req_entry_s_weight_is_missing_input.toda │ │ ├── reqsat_reqsatlist_test_req_value_is_missing_from_lat_input.toda │ │ ├── reqsat_reqsat_test_predecessor_is_a_symbol_not_a_twist__input.toda │ │ ├── reqsat_reqsat_test_predecessor_is_an_arb_not_a_twist__input.toda │ │ ├── reqsat_reqsat_test_secp256r1_signature_value_is_null__input.toda │ │ ├── reqsat_reqsat_test_successor_is_a_pairtrie_not_a_twist__input.toda │ │ ├── reqsat_reqsatlist_test_both_green_but_total_weight_254_input.toda │ │ ├── reqsat_reqsatlist_test_green_weight_128_red_weight_256_input.toda │ │ ├── atomic_pairtrie_test_duplicate_keys_with_identical_values_input.toda │ │ ├── reqsat_reqsatlist_test_green_weight_128_yellow_weight_256_input.toda │ │ ├── reqsat_reqsatlist_test_green_weight_256_yellow_weight_128_input.toda │ │ ├── reqsat_reqsatlist_test_req_value_is_null_not_a_hash_list_input.toda │ │ ├── reqsat_reqsatlist_test_sat_value_is_null_not_a_hash_list_input.toda │ │ ├── reqsat_reqsat_test_secp256r1_req_value_is_not_an_arb_packet__input.toda │ │ ├── reqsat_reqsat_test_successor_body_is_a_pairtrie_not_a_body__input.toda │ │ ├── reqsat_reqsatlist_test_mismatch_req_has_2_entries_sat_has_3_input.toda │ │ ├── reqsat_reqsatlist_test_mismatch_req_has_3_entries_sat_has_2_input.toda │ │ ├── reqsat_reqsatlist_test_req_entry_has_only_one_entry_not_two_input.toda │ │ ├── reqsat_reqsatlist_test_req_entry_has_three_entries_not_two_input.toda │ │ ├── reqsat_reqsatlist_test_req_entry_s_weight_is_null_not_an_arb_input.toda │ │ ├── reqsat_reqsatlist_test_req_value_is_symbol_not_a_hash_list_input.toda │ │ ├── reqsat_reqsatlist_test_sat_value_is_a_symbol_not_a_hash_list_input.toda │ │ ├── atomic_pairtrie_test_duplicate_keys_with_non_identical_values_input.toda │ │ ├── reqsat_reqsat_test_predecessor_body_is_a_pairtrie_not_a_body__input.toda │ │ ├── reqsat_reqsat_test_secp256r1_req_value_is_a_symbol_not_an_arb__input.toda │ │ ├── reqsat_reqsatlist_test_req_entry_value_is_null_not_a_hash_list_input.toda │ │ ├── atomic_packet_test_packet_content_must_contain_at_least_one_byte_input.toda │ │ ├── reqsat_reqsatlist_test_req_entry_s_weight_is_a_symbol_not_an_arb_input.toda │ │ ├── reqsat_reqsatlist_test_req_value_is_an_arb_packet_not_a_hash_list_input.toda │ │ ├── reqsat_reqsatlist_test_sat_value_is_an_arb_packet_not_a_hash_list_input.toda │ │ ├── reqsat_reqsat_test_secp256r1_signature_value_is_not_an_arb_packet__input.toda │ │ ├── reqsat_reqsatlist_test_four_entries_green_weight_254_red_weight_100_input.toda │ │ ├── reqsat_reqsatlist_test_req_entry_s_weight_is_a_hash_list_not_an_arb_input.toda │ │ ├── reqsat_reqsatlist_test_req_entry_value_is_a_symbol_not_a_hash_list_input.toda │ │ ├── reqsat_reqsat_test_secp256r1_signature_value_is_a_symbol_not_an_arb__input.toda │ │ ├── reqsat_reqsatlist_test_four_entries_green_weight_254_yellow_weight_100_input.toda │ │ ├── reqsat_reqsatlist_test_four_entries_green_weight_255_yellow_weight_100_input.toda │ │ ├── reqsat_reqsatlist_test_green_weight_128_yellow_weight_128_red_weight_128_input.toda │ │ ├── reqsat_reqsatlist_test_req_entry_value_is_an_arb_packet_not_a_hash_list_input.toda │ │ ├── reqsat_reqsat_test_secp256r1_requirement_satisfied_signature_len_71_bytes__input.toda │ │ ├── reqsat_reqsat_test_secp256r1_requirement_satisfied_signature_len_72_bytes__input.toda │ │ ├── reqsat_reqsat_test_secp256r1_requirement_unsatisfied_signed_over_prev_hash_input.toda │ │ ├── reqsat_reqsatlist_test_green_weight_200_missing_weight_with_red_reqsat_red_input.toda │ │ ├── reqsat_reqsatlist_test_req_entry_s_weight_is_an_arb_with_two_bytes_not_one_input.toda │ │ ├── reqsat_reqsatlist_test_green_weight_256_missing_weight_with_red_reqsat_green_input.toda │ │ ├── reqsat_reqsatlist_test_green_weight_200_missing_weight_with_green_reqsat_yellow_input.toda │ │ ├── reqsat_reqsatlist_test_green_weight_200_missing_weight_with_yellow_reqsat_yellow_input.toda │ │ ├── reqsat_reqsatlist_test_four_entries_green_weight_100_yellow_weight_100_red_weight_155_input.toda │ │ ├── reqsat_reqsatlist_test_four_entries_green_weight_155_yellow_weight_100_red_weight_100_input.toda │ │ └── reqsat_reqsat_test_secp256r1_requirement_unsatisfied_signed_over_body_s_serialized_content_input.toda │ ├── descriptions │ │ ├── atomic_body_test_empty_body_description.toda │ │ ├── atomic_hash_test_no_spec_01_description.toda │ │ ├── atomic_hash_test_null_hash_description.toda │ │ ├── atomic_hash_test_sha256_hash_description.toda │ │ ├── atomic_hash_test_symbol_hash_description.toda │ │ ├── atomic_hash_test_unit_hash_description.toda │ │ ├── atomic_atom_test_hash_mismatch_description.toda │ │ ├── atomic_packet_test_arb_packet_description.toda │ │ ├── atomic_twist_test_twist_empty_description.toda │ │ ├── atomic_body_test_valid_body_test_description.toda │ │ ├── atomic_hash_list_test_empty_list_description.toda │ │ ├── atomic_packet_test_hashes_packet_description.toda │ │ ├── atomic_lat_test_valid_list_of_atoms_description.toda │ │ ├── atomic_packet_test_no_spec_47_shape_description.toda │ │ ├── atomic_packet_test_packet_too_short_description.toda │ │ ├── atomic_packet_test_pairtrie_packet_description.toda │ │ ├── atomic_pairtrie_test_empty_pairtrie_description.toda │ │ ├── atomic_pairtrie_test_odd_of_hashes_description.toda │ │ ├── atomic_pairtrie_test_valid_pairtrie_description.toda │ │ ├── atomic_twist_test_valid_twist_test_description.toda │ │ ├── atomic_lat_test_lat_contains_null_hash_description.toda │ │ ├── atomic_lat_test_lat_contains_unit_hash_description.toda │ │ ├── atomic_packet_test_basic_body_packet_description.toda │ │ ├── atomic_packet_test_basic_twist_packet_description.toda │ │ ├── atomic_pairtrie_test_odd_of_hashes_ii_description.toda │ │ ├── reqsat_reqsat_test_predecessor_is_null_description.toda │ │ ├── reqsat_reqsat_test_reqtrie_all_green_description.toda │ │ ├── reqsat_reqsat_test_reqtrie_one_red_red_description.toda │ │ ├── reqsat_reqsat_test_reqtrie_two_red_red_description.toda │ │ ├── reqsat_reqsat_test_trie_null_mismatch_description.toda │ │ ├── reqsat_reqsat_test_unknown_reqsat_type_description.toda │ │ ├── atomic_body_test_body_contains_7_hashes_description.toda │ │ ├── atomic_hash_list_test_valid_hashes_list_description.toda │ │ ├── atomic_lat_test_lat_contains_shape_error_description.toda │ │ ├── atomic_lat_test_lat_contains_symbol_hash_description.toda │ │ ├── reqsat_reqsat_test_reqsat_keys_mismatch_description.toda │ │ ├── reqsat_reqsat_test_trie_null_mismatch_ii_description.toda │ │ ├── atomic_body_test_last_hash_ends_prematurely_description.toda │ │ ├── atomic_lat_test_atom_bytes_ends_prematurely_description.toda │ │ ├── atomic_lat_test_lat_contains_shape_error_ii_description.toda │ │ ├── atomic_packet_test_packet_length_mismatch_description.toda │ │ ├── atomic_twist_test_twist_contains_3_hashes_description.toda │ │ ├── reqsat_reqsat_test_predecessor_is_missing__description.toda │ │ ├── reqsat_reqsat_test_reqsat_keys_mismatch_ii_description.toda │ │ ├── reqsat_reqsat_test_reqsat_keys_mismatch_iii_description.toda │ │ ├── reqsat_reqsatlist_test_sat_value_is_missing_description.toda │ │ ├── atomic_body_test_body_contains_only_5_hashes_description.toda │ │ ├── atomic_lat_test_lat_contains_shape_error_iii_description.toda │ │ ├── atomic_pairtrie_test_incorrectly_sorted_keys_description.toda │ │ ├── atomic_twist_test_last_hash_ends_prematurely_description.toda │ │ ├── atomic_twist_test_twist_contains_only_1_hash_description.toda │ │ ├── reqsat_reqsat_test_reqtrie_one_yellow_yellow_description.toda │ │ ├── reqsat_reqsat_test_reqtrie_two_yellow_yellow_description.toda │ │ ├── reqsat_reqsat_test_successor_body_is_missing__description.toda │ │ ├── reqsat_reqsatlist_test_total_green_weight_384_description.toda │ │ ├── atomic_hash_list_test_last_hash_ends_prematurely_description.toda │ │ ├── atomic_pairtrie_test_last_hash_ends_prematurely_description.toda │ │ ├── reqsat_reqsat_test_predecessor_body_is_missing__description.toda │ │ ├── reqsat_reqsat_test_secp256r1_invalid_signature_description.toda │ │ ├── reqsat_reqsat_test_secp256r1_req_value_is_null__description.toda │ │ ├── reqsat_reqsat_test_unknown_reqsat_type_mismatch_description.toda │ │ ├── reqsat_reqsat_test_valid_null_reqsat_succession_description.toda │ │ ├── reqsat_reqsat_test_reqtrie_one_yellow_one_red_red_description.toda │ │ ├── reqsat_reqsat_test_successor_has_an_unknown_shape__description.toda │ │ ├── reqsat_reqsat_test_unknown_reqsat_type_mismatch_ii_description.toda │ │ ├── reqsat_reqsatlist_test_req_entry_value_is_missing_description.toda │ │ ├── atomic_lat_test_lat_contains_unit_hash_and_null_hash_description.toda │ │ ├── reqsat_reqsat_test_predecessor_has_an_unknown_shape__description.toda │ │ ├── reqsat_reqsat_test_predecessor_is_an_arb_not_a_twist__description.toda │ │ ├── reqsat_reqsat_test_secp256r1_signature_value_is_null__description.toda │ │ ├── reqsat_reqsat_test_successor_is_an_arb_not_a_twist__description.toda │ │ ├── reqsat_reqsatlist_test_four_entries_green_weight_355_description.toda │ │ ├── reqsat_reqsatlist_test_req_entry_s_weight_is_missing_description.toda │ │ ├── reqsat_reqsatlist_test_req_value_is_missing_from_lat_description.toda │ │ ├── reqsat_reqsat_test_predecessor_is_a_symbol_not_a_twist__description.toda │ │ ├── reqsat_reqsat_test_successor_is_a_pairtrie_not_a_twist__description.toda │ │ ├── reqsat_reqsatlist_test_both_green_but_total_weight_254_description.toda │ │ ├── reqsat_reqsatlist_test_green_weight_128_red_weight_256_description.toda │ │ ├── atomic_pairtrie_test_duplicate_keys_with_identical_values_description.toda │ │ ├── reqsat_reqsatlist_test_green_weight_128_yellow_weight_256_description.toda │ │ ├── reqsat_reqsatlist_test_green_weight_256_yellow_weight_128_description.toda │ │ ├── reqsat_reqsatlist_test_req_entry_has_three_entries_not_two_description.toda │ │ ├── reqsat_reqsatlist_test_req_value_is_null_not_a_hash_list_description.toda │ │ ├── reqsat_reqsatlist_test_req_value_is_symbol_not_a_hash_list_description.toda │ │ ├── reqsat_reqsatlist_test_sat_value_is_null_not_a_hash_list_description.toda │ │ ├── reqsat_reqsat_test_secp256r1_req_value_is_not_an_arb_packet__description.toda │ │ ├── reqsat_reqsat_test_successor_body_is_a_pairtrie_not_a_body__description.toda │ │ ├── reqsat_reqsatlist_test_mismatch_req_has_2_entries_sat_has_3_description.toda │ │ ├── reqsat_reqsatlist_test_mismatch_req_has_3_entries_sat_has_2_description.toda │ │ ├── reqsat_reqsatlist_test_req_entry_has_only_one_entry_not_two_description.toda │ │ ├── reqsat_reqsatlist_test_req_entry_s_weight_is_null_not_an_arb_description.toda │ │ ├── reqsat_reqsatlist_test_sat_value_is_a_symbol_not_a_hash_list_description.toda │ │ ├── atomic_pairtrie_test_duplicate_keys_with_non_identical_values_description.toda │ │ ├── reqsat_reqsat_test_predecessor_body_is_a_pairtrie_not_a_body__description.toda │ │ ├── reqsat_reqsat_test_secp256r1_req_value_is_a_symbol_not_an_arb__description.toda │ │ ├── reqsat_reqsatlist_test_req_entry_value_is_null_not_a_hash_list_description.toda │ │ ├── atomic_packet_test_packet_content_must_contain_at_least_one_byte_description.toda │ │ ├── reqsat_reqsatlist_test_req_entry_s_weight_is_a_symbol_not_an_arb_description.toda │ │ ├── reqsat_reqsatlist_test_req_value_is_an_arb_packet_not_a_hash_list_description.toda │ │ ├── reqsat_reqsatlist_test_sat_value_is_an_arb_packet_not_a_hash_list_description.toda │ │ ├── reqsat_reqsat_test_secp256r1_signature_value_is_a_symbol_not_an_arb__description.toda │ │ ├── reqsat_reqsat_test_secp256r1_signature_value_is_not_an_arb_packet__description.toda │ │ ├── reqsat_reqsatlist_test_four_entries_green_weight_254_red_weight_100_description.toda │ │ ├── reqsat_reqsatlist_test_req_entry_s_weight_is_a_hash_list_not_an_arb_description.toda │ │ ├── reqsat_reqsatlist_test_req_entry_value_is_a_symbol_not_a_hash_list_description.toda │ │ ├── reqsat_reqsatlist_test_four_entries_green_weight_254_yellow_weight_100_description.toda │ │ ├── reqsat_reqsatlist_test_four_entries_green_weight_255_yellow_weight_100_description.toda │ │ ├── reqsat_reqsatlist_test_green_weight_128_yellow_weight_128_red_weight_128_description.toda │ │ ├── reqsat_reqsatlist_test_req_entry_value_is_an_arb_packet_not_a_hash_list_description.toda │ │ ├── reqsat_reqsat_test_secp256r1_requirement_satisfied_signature_len_71_bytes__description.toda │ │ ├── reqsat_reqsat_test_secp256r1_requirement_satisfied_signature_len_72_bytes__description.toda │ │ ├── reqsat_reqsat_test_secp256r1_requirement_unsatisfied_signed_over_prev_hash_description.toda │ │ ├── reqsat_reqsatlist_test_green_weight_200_missing_weight_with_red_reqsat_red_description.toda │ │ ├── reqsat_reqsatlist_test_req_entry_s_weight_is_an_arb_with_two_bytes_not_one_description.toda │ │ ├── reqsat_reqsatlist_test_green_weight_256_missing_weight_with_red_reqsat_green_description.toda │ │ ├── reqsat_reqsatlist_test_green_weight_200_missing_weight_with_green_reqsat_yellow_description.toda │ │ ├── reqsat_reqsatlist_test_green_weight_200_missing_weight_with_yellow_reqsat_yellow_description.toda │ │ ├── reqsat_reqsatlist_test_four_entries_green_weight_100_yellow_weight_100_red_weight_155_description.toda │ │ ├── reqsat_reqsatlist_test_four_entries_green_weight_155_yellow_weight_100_red_weight_100_description.toda │ │ └── reqsat_reqsat_test_secp256r1_requirement_unsatisfied_signed_over_body_s_serialized_content_description.toda │ ├── atomic-test.js │ ├── util.js │ └── reqsat-test.js ├── core │ ├── map_test.js │ ├── key_import_test.js │ ├── packet_test.js │ ├── atoms_test.js │ └── twist_test.js ├── fixtures.js ├── util.js └── abject │ ├── di_test.js │ ├── actionable_test.js │ └── primitive_test.js ├── .editorconfig ├── .dockerignore ├── config.yml ├── src ├── abject │ ├── media.js │ ├── relation.js │ ├── todaize.js │ ├── primitive.js │ └── simple-historic.js ├── core │ ├── error.js │ ├── shield.js │ ├── fsMap.js │ ├── byteUtil.js │ ├── map.js │ └── atoms.js └── client │ ├── inventory_docs.md │ └── secp256r1.js ├── .github └── workflows │ └── toda.yaml ├── .eslintrc.json ├── toda.js ├── package.json ├── .gitignore ├── README.md └── docs ├── web.md └── quickstart.md /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /test/client/files/salt: -------------------------------------------------------------------------------- 1 | salt-foobarbaz 2 | -------------------------------------------------------------------------------- /test/toda-tests/rigging/green/unit_rig.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/green/unit_rig.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/green/simple_last.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/green/simple_last.toda -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [js] 2 | indent_size = 4 3 | 4 | [*] 5 | indent_style = space 6 | trim_trailing_whitespace = true 7 | insert_final_newline = true 8 | -------------------------------------------------------------------------------- /test/client/remoteRelay_files/411e92391c496a74d168f67cc434dd18b46b536f719f5691cabd96377f2606efaf.shield: -------------------------------------------------------------------------------- 1 | `$d9eeceeb-d24a-4eb6-b3ef-b652ff522dda -------------------------------------------------------------------------------- /test/client/remoteRelay_files/4131c65001117d57a1eaad04b84457d1b74ddb0a6a07b58cc207623351e20f5a9f.shield: -------------------------------------------------------------------------------- 1 | `$a1736fe6-9972-4e20-945e-a5756ae50bf0 -------------------------------------------------------------------------------- /test/client/remoteRelay_files/417fb3920df356573f6dcc283e6f2f8dd9866ac9e5469e8da5816aa742bd424b57.shield: -------------------------------------------------------------------------------- 1 | `$1975a7dd-fcb4-4f0d-90be-f04c4273fa59 -------------------------------------------------------------------------------- /test/toda-tests/reqsat/rslist/green/overkill.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/rslist/green/overkill.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/green/simple_lash_f1.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/green/simple_lash_f1.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/green/simple_lash_f2.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/green/simple_lash_f2.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/green/unit_rig_multi.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/green/unit_rig_multi.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/green/valid_kiwano.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/green/valid_kiwano.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/green/valid_kiwano_0.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/green/valid_kiwano_0.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/green/valid_kiwano_1.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/green/valid_kiwano_1.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/red/cork_reqsat_fail.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/red/cork_reqsat_fail.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/red/self_referential.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/red/self_referential.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/red/splice_mismatch.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/red/splice_mismatch.toda -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .gitignore 3 | .git/ 4 | .github/ 5 | **/config/ 6 | **/data/ 7 | **/dist/ 8 | **/node_modules/ 9 | **/secrets/ 10 | -------------------------------------------------------------------------------- /test/toda-tests/reqsat/reqsattrie/red/both_red.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/reqsattrie/red/both_red.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/rslist/red/exactly_254.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/rslist/red/exactly_254.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/green/valid_kiwano_f1.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/green/valid_kiwano_f1.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/green/valid_kiwano_f2.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/green/valid_kiwano_f2.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/green/valid_kiwano_f5.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/green/valid_kiwano_f5.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/red/cork_prev_invalid.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/red/cork_prev_invalid.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/red/meets_do_not_match.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/red/meets_do_not_match.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/yellow/missing_rigging.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/yellow/missing_rigging.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/yellow/missing_shield.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/yellow/missing_shield.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/rslist/green/exactly_255.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/rslist/green/exactly_255.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/rslist/green/green_red_mix.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/rslist/green/green_red_mix.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/rslist/red/invalid_weight.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/rslist/red/invalid_weight.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/rslist/red/red_green_mix.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/rslist/red/red_green_mix.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/rslist/red/red_wt_missing.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/rslist/red/red_wt_missing.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/secp256r1/red/req_not_arb.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/secp256r1/red/req_not_arb.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/secp256r1/red/sat_not_arb.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/secp256r1/red/sat_not_arb.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/green/cork_prev_invalid.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/green/cork_prev_invalid.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/red/lashed_non_colinear.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/red/lashed_non_colinear.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/reqsattrie/green/both_green.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/reqsattrie/green/both_green.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/secp256r1/yellow/req_missing.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/secp256r1/yellow/req_missing.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/secp256r1/yellow/sat_missing.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/secp256r1/yellow/sat_missing.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/green/invalid_rigging_green.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/green/invalid_rigging_green.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/green/multiple_hoists_green.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/green/multiple_hoists_green.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/yellow/cork_missing_rigging.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/yellow/cork_missing_rigging.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/reqsattrie/red/req_null_sat_not.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/reqsattrie/red/req_null_sat_not.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/reqsattrie/red/reqtrie_invalid.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/reqsattrie/red/reqtrie_invalid.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/reqsattrie/red/sat_null_req_not.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/reqsattrie/red/sat_null_req_not.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/reqsattrie/red/sattrie_invalid.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/reqsattrie/red/sattrie_invalid.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/reqsattrie/yellow/both_yellow.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/reqsattrie/yellow/both_yellow.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/rslist/green/green_yellow_mix.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/rslist/green/green_yellow_mix.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/rslist/yellow/green_wt_missing.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/rslist/yellow/green_wt_missing.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/rslist/yellow/req_entry_missing.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/rslist/yellow/req_entry_missing.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/rslist/yellow/yellow_green_mix.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/rslist/yellow/yellow_green_mix.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/rslist/yellow/yellow_wt_missing.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/rslist/yellow/yellow_wt_missing.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/secp256r1/green/satisfied_sig.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/secp256r1/green/satisfied_sig.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/green/invalid_shielding_green.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/green/invalid_shielding_green.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/red/corkline_incomplete_early.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/red/corkline_incomplete_early.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/red/corkline_incomplete_late.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/red/corkline_incomplete_late.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_body_test_empty_body_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_body_test_empty_body_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_hash_test_no_spec_01_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_hash_test_no_spec_01_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_hash_test_null_hash_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_hash_test_null_hash_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_hash_test_unit_hash_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_hash_test_unit_hash_input.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/reqsattrie/green/req_and_sat_null.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/reqsattrie/green/req_and_sat_null.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/reqsattrie/red/sattrie_key_extra.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/reqsattrie/red/sattrie_key_extra.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/reqsattrie/yellow/reqtrie_missing.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/reqsattrie/yellow/reqtrie_missing.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/reqsattrie/yellow/sattrie_missing.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/reqsattrie/yellow/sattrie_missing.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/rslist/red/req_list_fewer_entries.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/rslist/red/req_list_fewer_entries.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/rslist/red/sat_list_fewer_entries.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/rslist/red/sat_list_fewer_entries.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/secp256r1/red/wrong_priv_key_used.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/secp256r1/red/wrong_priv_key_used.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/red/lash_succession_reqsat_fail.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/red/lash_succession_reqsat_fail.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/yellow/corkline_incomplete_early.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/yellow/corkline_incomplete_early.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_atom_test_hash_mismatch_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_atom_test_hash_mismatch_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_hash_test_sha256_hash_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_hash_test_sha256_hash_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_hash_test_symbol_hash_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_hash_test_symbol_hash_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_packet_test_arb_packet_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_packet_test_arb_packet_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_twist_test_twist_empty_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_twist_test_twist_empty_input.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/secp256r1/red/signed_over_wrong_hash.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/secp256r1/red/signed_over_wrong_hash.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/red/lash_succession_no_fast_twist.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/red/lash_succession_no_fast_twist.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/red/post_rigging_missing_post_key.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/red/post_rigging_missing_post_key.toda -------------------------------------------------------------------------------- /test/toda-tests/rigging/yellow/lash_succession_missing_prev.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/rigging/yellow/lash_succession_missing_prev.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_body_test_valid_body_test_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_body_test_valid_body_test_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_hash_list_test_empty_list_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_hash_list_test_empty_list_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_packet_test_hashes_packet_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_packet_test_hashes_packet_input.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/reqsattrie/yellow/unknown_interpreter.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/reqsattrie/yellow/unknown_interpreter.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/rslist/red/rslist_req_value_not_hashes.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/rslist/red/rslist_req_value_not_hashes.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/rslist/red/rslist_sat_value_not_hashes.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/rslist/red/rslist_sat_value_not_hashes.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/rslist/yellow/rslist_req_value_missing.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/rslist/yellow/rslist_req_value_missing.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/rslist/yellow/rslist_sat_value_missing.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/rslist/yellow/rslist_sat_value_missing.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_lat_test_valid_list_of_atoms_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_lat_test_valid_list_of_atoms_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_packet_test_no_spec_47_shape_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_packet_test_no_spec_47_shape_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_packet_test_packet_too_short_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_packet_test_packet_too_short_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_packet_test_pairtrie_packet_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_packet_test_pairtrie_packet_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_pairtrie_test_empty_pairtrie_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_pairtrie_test_empty_pairtrie_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_pairtrie_test_odd_of_hashes_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_pairtrie_test_odd_of_hashes_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_pairtrie_test_valid_pairtrie_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_pairtrie_test_valid_pairtrie_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_twist_test_valid_twist_test_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_twist_test_valid_twist_test_input.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/reqsattrie/red/sattrie_key_not_included.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/reqsattrie/red/sattrie_key_not_included.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/reqsattrie/red/secp256r1_red_rslist_green.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/reqsattrie/red/secp256r1_red_rslist_green.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/rslist/green/green_wt_missing_irrelevant.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/rslist/green/green_wt_missing_irrelevant.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/secp256r1/red/req_missing_and_sat_not_arb.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/secp256r1/red/req_missing_and_sat_not_arb.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_packet_test_basic_body_packet_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_packet_test_basic_body_packet_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_packet_test_basic_twist_packet_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_packet_test_basic_twist_packet_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_pairtrie_test_odd_of_hashes_ii_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_pairtrie_test_odd_of_hashes_ii_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_reqtrie_all_green_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_reqtrie_all_green_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_trie_null_mismatch_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_trie_null_mismatch_input.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/reqsattrie/red/secp256r1_red_rslist_yellow.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/reqsattrie/red/secp256r1_red_rslist_yellow.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_body_test_empty_body_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_body_test_empty_body_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_hash_test_no_spec_01_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_hash_test_no_spec_01_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_hash_test_null_hash_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_hash_test_null_hash_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_hash_test_sha256_hash_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_hash_test_sha256_hash_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_hash_test_symbol_hash_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_hash_test_symbol_hash_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_hash_test_unit_hash_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_hash_test_unit_hash_description.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_body_test_body_contains_7_hashes_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_body_test_body_contains_7_hashes_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_hash_list_test_valid_hashes_list_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_hash_list_test_valid_hashes_list_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_lat_test_lat_contains_null_hash_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_lat_test_lat_contains_null_hash_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_lat_test_lat_contains_shape_error_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_lat_test_lat_contains_shape_error_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_lat_test_lat_contains_symbol_hash_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_lat_test_lat_contains_symbol_hash_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_lat_test_lat_contains_unit_hash_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_lat_test_lat_contains_unit_hash_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_predecessor_is_null_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_predecessor_is_null_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_reqsat_keys_mismatch_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_reqsat_keys_mismatch_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_reqtrie_one_red_red_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_reqtrie_one_red_red_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_reqtrie_two_red_red_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_reqtrie_two_red_red_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_trie_null_mismatch_ii_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_trie_null_mismatch_ii_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_unknown_reqsat_type_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_unknown_reqsat_type_input.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/reqsattrie/red/reqtrie_sattrie_different_keys.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/reqsattrie/red/reqtrie_sattrie_different_keys.toda -------------------------------------------------------------------------------- /config.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # Inventory Server ./src/inventory 3 | INVENTORY: 4 | inventory: "/.toda/store" 5 | port: 3000 6 | 7 | # CLI ./src/cli 8 | CLI: 9 | configPath: "/.toda/config" 10 | -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_atom_test_hash_mismatch_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_atom_test_hash_mismatch_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_packet_test_arb_packet_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_packet_test_arb_packet_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_twist_test_twist_empty_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_twist_test_twist_empty_description.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_packet_test_packet_length_mismatch_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_packet_test_packet_length_mismatch_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_twist_test_twist_contains_3_hashes_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_twist_test_twist_contains_3_hashes_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_predecessor_is_missing__input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_predecessor_is_missing__input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_reqsat_keys_mismatch_ii_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_reqsat_keys_mismatch_ii_input.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/reqsattrie/yellow/secp256r1_yellow_rslist_green.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/reqsattrie/yellow/secp256r1_yellow_rslist_green.toda -------------------------------------------------------------------------------- /test/toda-tests/reqsat/reqsattrie/yellow/unknown_interpreter_the_sequel.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/toda-tests/reqsat/reqsattrie/yellow/unknown_interpreter_the_sequel.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_body_test_valid_body_test_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_body_test_valid_body_test_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_hash_list_test_empty_list_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_hash_list_test_empty_list_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_packet_test_hashes_packet_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_packet_test_hashes_packet_description.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_body_test_body_contains_only_5_hashes_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_body_test_body_contains_only_5_hashes_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_body_test_last_hash_ends_prematurely_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_body_test_last_hash_ends_prematurely_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_lat_test_atom_bytes_ends_prematurely_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_lat_test_atom_bytes_ends_prematurely_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_lat_test_lat_contains_shape_error_ii_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_lat_test_lat_contains_shape_error_ii_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_lat_test_lat_contains_shape_error_iii_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_lat_test_lat_contains_shape_error_iii_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_pairtrie_test_incorrectly_sorted_keys_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_pairtrie_test_incorrectly_sorted_keys_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_twist_test_last_hash_ends_prematurely_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_twist_test_last_hash_ends_prematurely_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_twist_test_twist_contains_only_1_hash_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_twist_test_twist_contains_only_1_hash_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_reqsat_keys_mismatch_iii_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_reqsat_keys_mismatch_iii_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_reqtrie_one_yellow_yellow_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_reqtrie_one_yellow_yellow_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_reqtrie_two_yellow_yellow_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_reqtrie_two_yellow_yellow_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_successor_body_is_missing__input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_successor_body_is_missing__input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_sat_value_is_missing_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_sat_value_is_missing_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_total_green_weight_384_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_total_green_weight_384_input.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_lat_test_valid_list_of_atoms_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_lat_test_valid_list_of_atoms_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_packet_test_no_spec_47_shape_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_packet_test_no_spec_47_shape_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_packet_test_packet_too_short_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_packet_test_packet_too_short_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_packet_test_pairtrie_packet_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_packet_test_pairtrie_packet_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_pairtrie_test_empty_pairtrie_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_pairtrie_test_empty_pairtrie_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_pairtrie_test_odd_of_hashes_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_pairtrie_test_odd_of_hashes_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_pairtrie_test_valid_pairtrie_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_pairtrie_test_valid_pairtrie_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_twist_test_valid_twist_test_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_twist_test_valid_twist_test_description.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_pairtrie_test_last_hash_ends_prematurely_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_pairtrie_test_last_hash_ends_prematurely_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_predecessor_body_is_missing__input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_predecessor_body_is_missing__input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_secp256r1_invalid_signature_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_secp256r1_invalid_signature_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_secp256r1_req_value_is_null__input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_secp256r1_req_value_is_null__input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_unknown_reqsat_type_mismatch_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_unknown_reqsat_type_mismatch_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_valid_null_reqsat_succession_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_valid_null_reqsat_succession_input.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_lat_test_lat_contains_null_hash_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_lat_test_lat_contains_null_hash_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_lat_test_lat_contains_unit_hash_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_lat_test_lat_contains_unit_hash_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_packet_test_basic_body_packet_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_packet_test_basic_body_packet_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_packet_test_basic_twist_packet_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_packet_test_basic_twist_packet_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_pairtrie_test_odd_of_hashes_ii_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_pairtrie_test_odd_of_hashes_ii_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_predecessor_is_null_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_predecessor_is_null_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_reqtrie_all_green_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_reqtrie_all_green_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_reqtrie_one_red_red_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_reqtrie_one_red_red_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_reqtrie_two_red_red_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_reqtrie_two_red_red_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_trie_null_mismatch_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_trie_null_mismatch_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_unknown_reqsat_type_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_unknown_reqsat_type_description.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_hash_list_test_last_hash_ends_prematurely_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_hash_list_test_last_hash_ends_prematurely_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_reqtrie_one_yellow_one_red_red_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_reqtrie_one_yellow_one_red_red_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_successor_has_an_unknown_shape__input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_successor_has_an_unknown_shape__input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_unknown_reqsat_type_mismatch_ii_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_unknown_reqsat_type_mismatch_ii_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_req_entry_value_is_missing_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_req_entry_value_is_missing_input.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_body_test_body_contains_7_hashes_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_body_test_body_contains_7_hashes_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_hash_list_test_valid_hashes_list_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_hash_list_test_valid_hashes_list_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_lat_test_lat_contains_shape_error_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_lat_test_lat_contains_shape_error_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_lat_test_lat_contains_symbol_hash_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_lat_test_lat_contains_symbol_hash_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_reqsat_keys_mismatch_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_reqsat_keys_mismatch_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_trie_null_mismatch_ii_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_trie_null_mismatch_ii_description.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_lat_test_lat_contains_unit_hash_and_null_hash_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_lat_test_lat_contains_unit_hash_and_null_hash_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_predecessor_has_an_unknown_shape__input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_predecessor_has_an_unknown_shape__input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_successor_is_an_arb_not_a_twist__input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_successor_is_an_arb_not_a_twist__input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_four_entries_green_weight_355_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_four_entries_green_weight_355_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_req_entry_s_weight_is_missing_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_req_entry_s_weight_is_missing_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_req_value_is_missing_from_lat_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_req_value_is_missing_from_lat_input.toda -------------------------------------------------------------------------------- /test/client/files/410987b906628e0708296a4cb9034121ddf275f1d5ecd1302642c552428368bf19.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/files/410987b906628e0708296a4cb9034121ddf275f1d5ecd1302642c552428368bf19.toda -------------------------------------------------------------------------------- /test/client/files/41313b593c91b6b5c5ab23be3d561cea76d6dba74d8455f01807010580dddbf280.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/files/41313b593c91b6b5c5ab23be3d561cea76d6dba74d8455f01807010580dddbf280.toda -------------------------------------------------------------------------------- /test/client/files/41452470c4bb57365d701783172f27e00a917aeeb6f97d15c390fe5c8423b5d85f.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/files/41452470c4bb57365d701783172f27e00a917aeeb6f97d15c390fe5c8423b5d85f.toda -------------------------------------------------------------------------------- /test/client/files/4151a40bde66fc10e07b1cef4668811f68c570658ead8bb192098cacb55171bd29.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/files/4151a40bde66fc10e07b1cef4668811f68c570658ead8bb192098cacb55171bd29.toda -------------------------------------------------------------------------------- /test/client/files/4174355864aafbb67e84237a74c7a9ef6e49e3b70c0a7518c0b2b4a6f4c4594da7.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/files/4174355864aafbb67e84237a74c7a9ef6e49e3b70c0a7518c0b2b4a6f4c4594da7.toda -------------------------------------------------------------------------------- /test/client/files/419cf32881947c306cd6dc425ca3fc1b43b9d2e03effd7eb35b526c00ba5691bc1.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/files/419cf32881947c306cd6dc425ca3fc1b43b9d2e03effd7eb35b526c00ba5691bc1.toda -------------------------------------------------------------------------------- /test/client/files/41d3b8000e5959b81bcf55a4c4782deab8583f9b4c0624cdf9fec731cd2b06f40e.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/files/41d3b8000e5959b81bcf55a4c4782deab8583f9b4c0624cdf9fec731cd2b06f40e.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_body_test_last_hash_ends_prematurely_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_body_test_last_hash_ends_prematurely_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_lat_test_atom_bytes_ends_prematurely_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_lat_test_atom_bytes_ends_prematurely_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_lat_test_lat_contains_shape_error_ii_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_lat_test_lat_contains_shape_error_ii_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_packet_test_packet_length_mismatch_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_packet_test_packet_length_mismatch_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_twist_test_twist_contains_3_hashes_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_twist_test_twist_contains_3_hashes_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_predecessor_is_missing__description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_predecessor_is_missing__description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_reqsat_keys_mismatch_ii_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_reqsat_keys_mismatch_ii_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_reqsat_keys_mismatch_iii_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_reqsat_keys_mismatch_iii_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_sat_value_is_missing_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_sat_value_is_missing_description.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_predecessor_is_a_symbol_not_a_twist__input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_predecessor_is_a_symbol_not_a_twist__input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_predecessor_is_an_arb_not_a_twist__input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_predecessor_is_an_arb_not_a_twist__input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_secp256r1_signature_value_is_null__input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_secp256r1_signature_value_is_null__input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_successor_is_a_pairtrie_not_a_twist__input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_successor_is_a_pairtrie_not_a_twist__input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_both_green_but_total_weight_254_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_both_green_but_total_weight_254_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_green_weight_128_red_weight_256_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_green_weight_128_red_weight_256_input.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_body_test_body_contains_only_5_hashes_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_body_test_body_contains_only_5_hashes_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_lat_test_lat_contains_shape_error_iii_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_lat_test_lat_contains_shape_error_iii_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_pairtrie_test_incorrectly_sorted_keys_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_pairtrie_test_incorrectly_sorted_keys_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_twist_test_last_hash_ends_prematurely_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_twist_test_last_hash_ends_prematurely_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_twist_test_twist_contains_only_1_hash_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_twist_test_twist_contains_only_1_hash_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_reqtrie_one_yellow_yellow_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_reqtrie_one_yellow_yellow_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_reqtrie_two_yellow_yellow_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_reqtrie_two_yellow_yellow_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_successor_body_is_missing__description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_successor_body_is_missing__description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_total_green_weight_384_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_total_green_weight_384_description.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_pairtrie_test_duplicate_keys_with_identical_values_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_pairtrie_test_duplicate_keys_with_identical_values_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_green_weight_128_yellow_weight_256_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_green_weight_128_yellow_weight_256_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_green_weight_256_yellow_weight_128_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_green_weight_256_yellow_weight_128_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_req_value_is_null_not_a_hash_list_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_req_value_is_null_not_a_hash_list_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_sat_value_is_null_not_a_hash_list_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_sat_value_is_null_not_a_hash_list_input.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_hash_list_test_last_hash_ends_prematurely_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_hash_list_test_last_hash_ends_prematurely_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_pairtrie_test_last_hash_ends_prematurely_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_pairtrie_test_last_hash_ends_prematurely_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_predecessor_body_is_missing__description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_predecessor_body_is_missing__description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_secp256r1_invalid_signature_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_secp256r1_invalid_signature_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_secp256r1_req_value_is_null__description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_secp256r1_req_value_is_null__description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_unknown_reqsat_type_mismatch_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_unknown_reqsat_type_mismatch_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_valid_null_reqsat_succession_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_valid_null_reqsat_succession_description.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_secp256r1_req_value_is_not_an_arb_packet__input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_secp256r1_req_value_is_not_an_arb_packet__input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_successor_body_is_a_pairtrie_not_a_body__input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_successor_body_is_a_pairtrie_not_a_body__input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_mismatch_req_has_2_entries_sat_has_3_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_mismatch_req_has_2_entries_sat_has_3_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_mismatch_req_has_3_entries_sat_has_2_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_mismatch_req_has_3_entries_sat_has_2_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_req_entry_has_only_one_entry_not_two_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_req_entry_has_only_one_entry_not_two_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_req_entry_has_three_entries_not_two_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_req_entry_has_three_entries_not_two_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_req_entry_s_weight_is_null_not_an_arb_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_req_entry_s_weight_is_null_not_an_arb_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_req_value_is_symbol_not_a_hash_list_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_req_value_is_symbol_not_a_hash_list_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_sat_value_is_a_symbol_not_a_hash_list_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_sat_value_is_a_symbol_not_a_hash_list_input.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_reqtrie_one_yellow_one_red_red_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_reqtrie_one_yellow_one_red_red_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_successor_has_an_unknown_shape__description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_successor_has_an_unknown_shape__description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_unknown_reqsat_type_mismatch_ii_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_unknown_reqsat_type_mismatch_ii_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_req_entry_value_is_missing_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_req_entry_value_is_missing_description.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_pairtrie_test_duplicate_keys_with_non_identical_values_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_pairtrie_test_duplicate_keys_with_non_identical_values_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_predecessor_body_is_a_pairtrie_not_a_body__input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_predecessor_body_is_a_pairtrie_not_a_body__input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_secp256r1_req_value_is_a_symbol_not_an_arb__input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_secp256r1_req_value_is_a_symbol_not_an_arb__input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_req_entry_value_is_null_not_a_hash_list_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_req_entry_value_is_null_not_a_hash_list_input.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_lat_test_lat_contains_unit_hash_and_null_hash_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_lat_test_lat_contains_unit_hash_and_null_hash_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_predecessor_has_an_unknown_shape__description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_predecessor_has_an_unknown_shape__description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_predecessor_is_an_arb_not_a_twist__description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_predecessor_is_an_arb_not_a_twist__description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_secp256r1_signature_value_is_null__description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_secp256r1_signature_value_is_null__description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_successor_is_an_arb_not_a_twist__description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_successor_is_an_arb_not_a_twist__description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_four_entries_green_weight_355_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_four_entries_green_weight_355_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_req_entry_s_weight_is_missing_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_req_entry_s_weight_is_missing_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_req_value_is_missing_from_lat_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_req_value_is_missing_from_lat_description.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/atomic_packet_test_packet_content_must_contain_at_least_one_byte_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/atomic_packet_test_packet_content_must_contain_at_least_one_byte_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_req_entry_s_weight_is_a_symbol_not_an_arb_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_req_entry_s_weight_is_a_symbol_not_an_arb_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_req_value_is_an_arb_packet_not_a_hash_list_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_req_value_is_an_arb_packet_not_a_hash_list_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_sat_value_is_an_arb_packet_not_a_hash_list_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_sat_value_is_an_arb_packet_not_a_hash_list_input.toda -------------------------------------------------------------------------------- /test/client/remoteRelay_files/411764d35c547a131caeed1bee31208942bb6b3b019dc5d13a030036ea37a921cf.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/remoteRelay_files/411764d35c547a131caeed1bee31208942bb6b3b019dc5d13a030036ea37a921cf.toda -------------------------------------------------------------------------------- /test/client/remoteRelay_files/411e92391c496a74d168f67cc434dd18b46b536f719f5691cabd96377f2606efaf.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/remoteRelay_files/411e92391c496a74d168f67cc434dd18b46b536f719f5691cabd96377f2606efaf.toda -------------------------------------------------------------------------------- /test/client/remoteRelay_files/4131c65001117d57a1eaad04b84457d1b74ddb0a6a07b58cc207623351e20f5a9f.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/remoteRelay_files/4131c65001117d57a1eaad04b84457d1b74ddb0a6a07b58cc207623351e20f5a9f.toda -------------------------------------------------------------------------------- /test/client/remoteRelay_files/417b666fe45dfd709954328b145be7c4ade6b636433c0e70da7e37b98a52ef8e54.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/remoteRelay_files/417b666fe45dfd709954328b145be7c4ade6b636433c0e70da7e37b98a52ef8e54.toda -------------------------------------------------------------------------------- /test/client/remoteRelay_files/417fb3920df356573f6dcc283e6f2f8dd9866ac9e5469e8da5816aa742bd424b57.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/remoteRelay_files/417fb3920df356573f6dcc283e6f2f8dd9866ac9e5469e8da5816aa742bd424b57.toda -------------------------------------------------------------------------------- /test/client/remoteRelay_files/418f79797eca5a8d46d3183737f0a9c50e4950a1f86298621785939cf6d41bee5b.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/remoteRelay_files/418f79797eca5a8d46d3183737f0a9c50e4950a1f86298621785939cf6d41bee5b.toda -------------------------------------------------------------------------------- /test/client/remoteRelay_files/41c23ccbe5731c4b77e15ade38d5fc305a5986dc810b0707d40d3fd4aa1236f8b2.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/remoteRelay_files/41c23ccbe5731c4b77e15ade38d5fc305a5986dc810b0707d40d3fd4aa1236f8b2.toda -------------------------------------------------------------------------------- /test/client/remoteRelay_files/41c9e07a006115beb76b92273e1612754750a51de90769361f05cfa0a62999fc76.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/remoteRelay_files/41c9e07a006115beb76b92273e1612754750a51de90769361f05cfa0a62999fc76.toda -------------------------------------------------------------------------------- /test/client/remoteRelay_files/41e1b0a489cf9a8a8e0da57d18a72bd7f4fca0fe507af4cea607eea804b7d93f3b.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/remoteRelay_files/41e1b0a489cf9a8a8e0da57d18a72bd7f4fca0fe507af4cea607eea804b7d93f3b.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_predecessor_is_a_symbol_not_a_twist__description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_predecessor_is_a_symbol_not_a_twist__description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_successor_is_a_pairtrie_not_a_twist__description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_successor_is_a_pairtrie_not_a_twist__description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_both_green_but_total_weight_254_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_both_green_but_total_weight_254_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_green_weight_128_red_weight_256_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_green_weight_128_red_weight_256_description.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_secp256r1_signature_value_is_not_an_arb_packet__input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_secp256r1_signature_value_is_not_an_arb_packet__input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_four_entries_green_weight_254_red_weight_100_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_four_entries_green_weight_254_red_weight_100_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_req_entry_s_weight_is_a_hash_list_not_an_arb_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_req_entry_s_weight_is_a_hash_list_not_an_arb_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_req_entry_value_is_a_symbol_not_a_hash_list_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_req_entry_value_is_a_symbol_not_a_hash_list_input.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_pairtrie_test_duplicate_keys_with_identical_values_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_pairtrie_test_duplicate_keys_with_identical_values_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_green_weight_128_yellow_weight_256_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_green_weight_128_yellow_weight_256_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_green_weight_256_yellow_weight_128_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_green_weight_256_yellow_weight_128_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_req_entry_has_three_entries_not_two_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_req_entry_has_three_entries_not_two_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_req_value_is_null_not_a_hash_list_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_req_value_is_null_not_a_hash_list_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_req_value_is_symbol_not_a_hash_list_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_req_value_is_symbol_not_a_hash_list_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_sat_value_is_null_not_a_hash_list_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_sat_value_is_null_not_a_hash_list_description.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_secp256r1_signature_value_is_a_symbol_not_an_arb__input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_secp256r1_signature_value_is_a_symbol_not_an_arb__input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_four_entries_green_weight_254_yellow_weight_100_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_four_entries_green_weight_254_yellow_weight_100_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_four_entries_green_weight_255_yellow_weight_100_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_four_entries_green_weight_255_yellow_weight_100_input.toda -------------------------------------------------------------------------------- /test/client/remoteRelay_files/411764d35c547a131caeed1bee31208942bb6b3b019dc5d13a030036ea37a921cf.next.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/remoteRelay_files/411764d35c547a131caeed1bee31208942bb6b3b019dc5d13a030036ea37a921cf.next.toda -------------------------------------------------------------------------------- /test/client/remoteRelay_files/411e92391c496a74d168f67cc434dd18b46b536f719f5691cabd96377f2606efaf.next.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/remoteRelay_files/411e92391c496a74d168f67cc434dd18b46b536f719f5691cabd96377f2606efaf.next.toda -------------------------------------------------------------------------------- /test/client/remoteRelay_files/4131c65001117d57a1eaad04b84457d1b74ddb0a6a07b58cc207623351e20f5a9f.next.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/remoteRelay_files/4131c65001117d57a1eaad04b84457d1b74ddb0a6a07b58cc207623351e20f5a9f.next.toda -------------------------------------------------------------------------------- /test/client/remoteRelay_files/417b666fe45dfd709954328b145be7c4ade6b636433c0e70da7e37b98a52ef8e54.next.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/remoteRelay_files/417b666fe45dfd709954328b145be7c4ade6b636433c0e70da7e37b98a52ef8e54.next.toda -------------------------------------------------------------------------------- /test/client/remoteRelay_files/417fb3920df356573f6dcc283e6f2f8dd9866ac9e5469e8da5816aa742bd424b57.next.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/remoteRelay_files/417fb3920df356573f6dcc283e6f2f8dd9866ac9e5469e8da5816aa742bd424b57.next.toda -------------------------------------------------------------------------------- /test/client/remoteRelay_files/418f79797eca5a8d46d3183737f0a9c50e4950a1f86298621785939cf6d41bee5b.next.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/remoteRelay_files/418f79797eca5a8d46d3183737f0a9c50e4950a1f86298621785939cf6d41bee5b.next.toda -------------------------------------------------------------------------------- /test/client/remoteRelay_files/41c23ccbe5731c4b77e15ade38d5fc305a5986dc810b0707d40d3fd4aa1236f8b2.next.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/remoteRelay_files/41c23ccbe5731c4b77e15ade38d5fc305a5986dc810b0707d40d3fd4aa1236f8b2.next.toda -------------------------------------------------------------------------------- /test/client/remoteRelay_files/41c9e07a006115beb76b92273e1612754750a51de90769361f05cfa0a62999fc76.next.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/client/remoteRelay_files/41c9e07a006115beb76b92273e1612754750a51de90769361f05cfa0a62999fc76.next.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_secp256r1_req_value_is_not_an_arb_packet__description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_secp256r1_req_value_is_not_an_arb_packet__description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_successor_body_is_a_pairtrie_not_a_body__description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_successor_body_is_a_pairtrie_not_a_body__description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_mismatch_req_has_2_entries_sat_has_3_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_mismatch_req_has_2_entries_sat_has_3_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_mismatch_req_has_3_entries_sat_has_2_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_mismatch_req_has_3_entries_sat_has_2_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_req_entry_has_only_one_entry_not_two_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_req_entry_has_only_one_entry_not_two_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_req_entry_s_weight_is_null_not_an_arb_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_req_entry_s_weight_is_null_not_an_arb_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_sat_value_is_a_symbol_not_a_hash_list_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_sat_value_is_a_symbol_not_a_hash_list_description.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_green_weight_128_yellow_weight_128_red_weight_128_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_green_weight_128_yellow_weight_128_red_weight_128_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_req_entry_value_is_an_arb_packet_not_a_hash_list_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_req_entry_value_is_an_arb_packet_not_a_hash_list_input.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_pairtrie_test_duplicate_keys_with_non_identical_values_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_pairtrie_test_duplicate_keys_with_non_identical_values_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_predecessor_body_is_a_pairtrie_not_a_body__description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_predecessor_body_is_a_pairtrie_not_a_body__description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_secp256r1_req_value_is_a_symbol_not_an_arb__description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_secp256r1_req_value_is_a_symbol_not_an_arb__description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_req_entry_value_is_null_not_a_hash_list_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_req_entry_value_is_null_not_a_hash_list_description.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_secp256r1_requirement_satisfied_signature_len_71_bytes__input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_secp256r1_requirement_satisfied_signature_len_71_bytes__input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_secp256r1_requirement_satisfied_signature_len_72_bytes__input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_secp256r1_requirement_satisfied_signature_len_72_bytes__input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_secp256r1_requirement_unsatisfied_signed_over_prev_hash_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_secp256r1_requirement_unsatisfied_signed_over_prev_hash_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_green_weight_200_missing_weight_with_red_reqsat_red_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_green_weight_200_missing_weight_with_red_reqsat_red_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_req_entry_s_weight_is_an_arb_with_two_bytes_not_one_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_req_entry_s_weight_is_an_arb_with_two_bytes_not_one_input.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/atomic_packet_test_packet_content_must_contain_at_least_one_byte_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/atomic_packet_test_packet_content_must_contain_at_least_one_byte_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_req_entry_s_weight_is_a_symbol_not_an_arb_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_req_entry_s_weight_is_a_symbol_not_an_arb_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_req_value_is_an_arb_packet_not_a_hash_list_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_req_value_is_an_arb_packet_not_a_hash_list_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_sat_value_is_an_arb_packet_not_a_hash_list_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_sat_value_is_an_arb_packet_not_a_hash_list_description.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_green_weight_256_missing_weight_with_red_reqsat_green_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_green_weight_256_missing_weight_with_red_reqsat_green_input.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_secp256r1_signature_value_is_a_symbol_not_an_arb__description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_secp256r1_signature_value_is_a_symbol_not_an_arb__description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_secp256r1_signature_value_is_not_an_arb_packet__description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_secp256r1_signature_value_is_not_an_arb_packet__description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_four_entries_green_weight_254_red_weight_100_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_four_entries_green_weight_254_red_weight_100_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_req_entry_s_weight_is_a_hash_list_not_an_arb_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_req_entry_s_weight_is_a_hash_list_not_an_arb_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_req_entry_value_is_a_symbol_not_a_hash_list_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_req_entry_value_is_a_symbol_not_a_hash_list_description.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_green_weight_200_missing_weight_with_green_reqsat_yellow_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_green_weight_200_missing_weight_with_green_reqsat_yellow_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_green_weight_200_missing_weight_with_yellow_reqsat_yellow_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_green_weight_200_missing_weight_with_yellow_reqsat_yellow_input.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_four_entries_green_weight_254_yellow_weight_100_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_four_entries_green_weight_254_yellow_weight_100_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_four_entries_green_weight_255_yellow_weight_100_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_four_entries_green_weight_255_yellow_weight_100_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_green_weight_128_yellow_weight_128_red_weight_128_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_green_weight_128_yellow_weight_128_red_weight_128_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_req_entry_value_is_an_arb_packet_not_a_hash_list_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_req_entry_value_is_an_arb_packet_not_a_hash_list_description.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_four_entries_green_weight_100_yellow_weight_100_red_weight_155_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_four_entries_green_weight_100_yellow_weight_100_red_weight_155_input.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsatlist_test_four_entries_green_weight_155_yellow_weight_100_red_weight_100_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsatlist_test_four_entries_green_weight_155_yellow_weight_100_red_weight_100_input.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_secp256r1_requirement_satisfied_signature_len_71_bytes__description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_secp256r1_requirement_satisfied_signature_len_71_bytes__description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_secp256r1_requirement_satisfied_signature_len_72_bytes__description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_secp256r1_requirement_satisfied_signature_len_72_bytes__description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_secp256r1_requirement_unsatisfied_signed_over_prev_hash_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_secp256r1_requirement_unsatisfied_signed_over_prev_hash_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_green_weight_200_missing_weight_with_red_reqsat_red_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_green_weight_200_missing_weight_with_red_reqsat_red_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_req_entry_s_weight_is_an_arb_with_two_bytes_not_one_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_req_entry_s_weight_is_an_arb_with_two_bytes_not_one_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_green_weight_256_missing_weight_with_red_reqsat_green_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_green_weight_256_missing_weight_with_red_reqsat_green_description.toda -------------------------------------------------------------------------------- /test/test-suite/inputs/reqsat_reqsat_test_secp256r1_requirement_unsatisfied_signed_over_body_s_serialized_content_input.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/inputs/reqsat_reqsat_test_secp256r1_requirement_unsatisfied_signed_over_body_s_serialized_content_input.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_green_weight_200_missing_weight_with_green_reqsat_yellow_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_green_weight_200_missing_weight_with_green_reqsat_yellow_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_green_weight_200_missing_weight_with_yellow_reqsat_yellow_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_green_weight_200_missing_weight_with_yellow_reqsat_yellow_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_four_entries_green_weight_100_yellow_weight_100_red_weight_155_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_four_entries_green_weight_100_yellow_weight_100_red_weight_155_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsatlist_test_four_entries_green_weight_155_yellow_weight_100_red_weight_100_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsatlist_test_four_entries_green_weight_155_yellow_weight_100_red_weight_100_description.toda -------------------------------------------------------------------------------- /test/test-suite/descriptions/reqsat_reqsat_test_secp256r1_requirement_unsatisfied_signed_over_body_s_serialized_content_description.toda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TODAQopen/toda/HEAD/test/test-suite/descriptions/reqsat_reqsat_test_secp256r1_requirement_unsatisfied_signed_over_body_s_serialized_content_description.toda -------------------------------------------------------------------------------- /test/core/map_test.js: -------------------------------------------------------------------------------- 1 | import { HashMap } from "../../src/core/map.js"; 2 | import assert from "assert"; 3 | 4 | describe("HashMap", () => { 5 | it("can be cloned", () => { 6 | let x = new HashMap(); 7 | x.set("a",1); 8 | x.set("b",2); 9 | let y = x.clone(); 10 | assert.equal(y.size, 2); 11 | assert.equal(y.get("b"),2); 12 | }); 13 | }); -------------------------------------------------------------------------------- /test/fixtures.js: -------------------------------------------------------------------------------- 1 | import { RemoteRelayClient } from "../src/client/relay.js"; 2 | import { Twist } from "../src/core/twist.js"; 3 | import nock from "nock"; 4 | 5 | export const mochaHooks = { 6 | beforeEach: async function () { 7 | // Wipe all polluting state before each test 8 | nock.cleanAll(); 9 | RemoteRelayClient.clearCache(); 10 | Twist.clearShieldCache(); 11 | } 12 | }; -------------------------------------------------------------------------------- /src/abject/media.js: -------------------------------------------------------------------------------- 1 | /************************************************************* 2 | * TODAQ Open: TODA File Implementation 3 | * Toronto 2022 4 | * 5 | * Apache License 2.0 6 | *************************************************************/ 7 | 8 | import { Abject } from './abject.js'; 9 | 10 | import { Primitive } from './primitive.js'; 11 | 12 | class Media extends Abject { 13 | 14 | static interpreter = this.gensym("/interpreters/m1"); 15 | static fieldSyms = { 16 | typeName: this.gensym("field/type-name"), 17 | subTypeName: this.gensym("field/subtype-name"), 18 | value: Primitive.fieldSyms.value 19 | }; 20 | 21 | } 22 | 23 | export { Media }; 24 | -------------------------------------------------------------------------------- /src/core/error.js: -------------------------------------------------------------------------------- 1 | /************************************************************* 2 | * TODAQ Open: TODA File Implementation 3 | * Toronto 2022 4 | * 5 | * Apache License 2.0 6 | *************************************************************/ 7 | 8 | class NamedError extends Error { 9 | get name() { 10 | return this.constructor.name; 11 | } 12 | } 13 | 14 | class HashNotFoundError extends NamedError { 15 | constructor(hash, meta) { 16 | let msg = "Hash not found in store: " + hash; 17 | super(msg); 18 | 19 | this.details = msg; 20 | this.hash = hash; 21 | this.meta = meta; 22 | } 23 | } 24 | 25 | export { 26 | NamedError, 27 | HashNotFoundError 28 | }; 29 | -------------------------------------------------------------------------------- /.github/workflows/toda.yaml: -------------------------------------------------------------------------------- 1 | name: toda 2 | 3 | on: 4 | pull_request: 5 | push: 6 | branches: 7 | - master 8 | 9 | jobs: 10 | test: 11 | runs-on: ubuntu-20.04 12 | timeout-minutes: 5 13 | 14 | permissions: 15 | id-token: write 16 | contents: read 17 | 18 | strategy: 19 | matrix: 20 | version: [16, 18] 21 | 22 | steps: 23 | - name: Use Node.JS ${{ matrix.version }} 24 | uses: actions/setup-node@v3 25 | with: 26 | node-version: ${{ matrix.version }} 27 | 28 | - name: Checkout 29 | uses: actions/checkout@v3 30 | 31 | - name: Build toda 32 | run: npm ci 33 | 34 | - name: Test 35 | run: npm test 36 | 37 | - name: Lint 38 | run: npm run lint -------------------------------------------------------------------------------- /test/util.js: -------------------------------------------------------------------------------- 1 | import { utf8ToBytes } from "../src/core/byteUtil.js"; 2 | import { Sha256 } from "../src/core/hash.js"; 3 | import { Atoms } from "../src/core/atoms.js"; 4 | import { HashMap } from "../src/core/map.js"; 5 | import { PairTriePacket } from "../src/core/packet.js"; 6 | import { v4 as uuid } from "uuid"; 7 | 8 | // string-bytes-hash 9 | function sbh (s) { 10 | return Sha256.fromBytes(utf8ToBytes(s)); 11 | } 12 | 13 | function randH() { 14 | return Sha256.fromBytes(utf8ToBytes(uuid())); 15 | } 16 | 17 | function uuidCargo() { 18 | const hs = new HashMap(); 19 | hs.set(randH(), randH()); 20 | const packet = PairTriePacket.createFromUnsorted(hs); 21 | const atoms = new Atoms(); 22 | const h = Sha256.fromPacket(packet); 23 | atoms.set(h, packet); 24 | atoms.focus = h; 25 | return atoms; 26 | } 27 | 28 | export { sbh, 29 | randH, 30 | uuidCargo }; -------------------------------------------------------------------------------- /test/client/dq_cache_dummies/sampleCache.json: -------------------------------------------------------------------------------- 1 | {"416ef975f0c646daa44bec0469384436ccc6cd459ac40562bd676d568187625b67": 2 | {"quantity": 40, 3 | "displayPrecision": 1, 4 | "rootId": "41c2ca3b2cea20d8426a324a0e4c8cf59522c7cb8fa6bf12ab46925a84e2d2ca46", 5 | "poptop": "418426a352c2ca3b2cea20d2c7925a84e2d2ca46cb8fa624a0e4c8cf59bf12ab46"}, 6 | "41cffc535f9e57097584e8aa213013932487b1cc74e1f7d1b289fef88b9a1ac698": 7 | {"quantity": 45, 8 | "displayPrecision": 2, 9 | "rootId": "414a0347b5d47a2d5f841f98a31a1df58a6e9ce5ba81dd898463424a711b6fc4a9", 10 | "poptop": "41a31a1df5847b5d47a2d5f841f9898463424a711b6fc4a9a6e9ce5ba81dd84a03"}, 11 | "419491d887eff0cda77411e3fa2408607f60b395785abe623394f9f6cbfa101cd3": 12 | {"quantity": 3, 13 | "displayPrecision": 2, 14 | "rootId": "414a0347b5d47a2d5f841f98a31a1df58a6e9ce5ba81dd898463424a711b6fc4a9", 15 | "poptop": "41a31a1df5847b5d47a2d5f841f9898463424a711b6fc4a9a6e9ce5ba81dd84a03"}} -------------------------------------------------------------------------------- /src/abject/relation.js: -------------------------------------------------------------------------------- 1 | /************************************************************* 2 | * TODAQ Open: TODA File Implementation 3 | * Toronto 2022 4 | * 5 | * Apache License 2.0 6 | *************************************************************/ 7 | 8 | import { Abject } from './abject'; 9 | 10 | import { Symbol } from './symbol'; 11 | import { Primitive } from './primitive'; 12 | 13 | class Relation extends Abject { 14 | static interpreter = Symbol.gen("/interpreters/r1"); 15 | static fieldSyms = { 16 | entity: this.gensym("entity"), 17 | attr: this.gensym("attribute"), 18 | val: Primitive.fieldSyms.value 19 | }; 20 | 21 | /** 22 | * Your basic EAV gizmo 23 | * @param entity 24 | * @param attr 25 | * @param val 26 | */ 27 | constructor(entity, attr, val) { 28 | super(); 29 | this.setFieldHash(this.fieldSyms.entity, entity); 30 | this.setFieldHash(this.fieldSyms.attr, attr); 31 | this.setFieldHash(this.fieldSyms.val, val); 32 | } 33 | 34 | // TODO: add getters, helpers 35 | } 36 | 37 | Abject.registerInterpreter(Relation); 38 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "node": true, 5 | "commonjs": true, 6 | "es2021": true, 7 | "mocha": true 8 | }, 9 | "extends": "eslint:recommended", 10 | "overrides": [ 11 | ], 12 | "parserOptions": { 13 | "ecmaVersion": "latest", 14 | "sourceType": "module" 15 | }, 16 | "ignorePatterns": [ 17 | "**/sjcl.js" 18 | ], 19 | "rules": { 20 | "semi": [ 21 | "error", 22 | "always" 23 | ], 24 | "consistent-return": [ 25 | "error" 26 | ], 27 | "brace-style": [ 28 | "error", 29 | "1tbs", 30 | { "allowSingleLine": true } 31 | ], 32 | "no-unused-vars": [ 33 | "warn" 34 | ], 35 | "block-spacing": [ 36 | "error", 37 | "always" 38 | ], 39 | "no-useless-escape": [ 40 | "warn" 41 | ], 42 | "eol-last": [ 43 | "error", 44 | "always" 45 | ], 46 | "max-len": [ 47 | "warn", 48 | { "code": 80 } 49 | ] 50 | } 51 | } -------------------------------------------------------------------------------- /src/client/inventory_docs.md: -------------------------------------------------------------------------------- 1 | # Inventory 2 | 3 | ## On Disk Caches 4 | 5 | LocalInventoryClient has 3 on disk caches to speed up startup and remove the need to read in lots of file to get their values. 6 | 7 | ### filesCache.json / "this.files" 8 | 9 | An unordered mapping of: 10 | 11 | ``` 12 | { 13 | : { 14 | hash: , 15 | n: 16 | }, 17 | ... 18 | } 19 | ``` 20 | 21 | Where for every line, is the first twist in that line, is the latest twist in the line, and is the number of twists in that line. 22 | 23 | ### twistIdxCache.json / "this.twistIdx" 24 | 25 | An unordered mapping of: 26 | 27 | ``` 28 | { 29 | : , 30 | ... 31 | } 32 | ``` 33 | 34 | For every twist in every line, map the hash of each twist to the first twist in that line. 35 | 36 | ### dqCache.json / this.dqCache 37 | 38 | A persistent and in-memory cache of DQ information owned by a client. 39 | 40 | Stored structure: 41 | 42 | ``` 43 | { 44 | : , 45 | ... 46 | } 47 | ``` 48 | 49 | Where DQInfo is an object as follows: 50 | @typedef {Object} DQInfo 51 | @property {Number} displayPrecision 52 | @property {Number} quantity 53 | @property {Hash} rootId 54 | @property {Hash} poptop 55 | -------------------------------------------------------------------------------- /test/core/key_import_test.js: -------------------------------------------------------------------------------- 1 | import { join } from "path"; 2 | import { tmpdir } from "os"; 3 | import { readFileSync, writeFileSync, mkdtempSync } from "fs"; 4 | 5 | import { SECP256r1 as secp } from "../../src/client/secp256r1.js"; 6 | 7 | async function toDisk(keypair, privateKeyPath, publicKeyPath) { 8 | let publicKey = await crypto.subtle.exportKey("spki", keypair.publicKey); 9 | let privateKey = await crypto.subtle.exportKey("pkcs8", keypair.privateKey); 10 | writeFileSync( 11 | publicKeyPath, 12 | keypair.constructor._toPEM(Buffer.from(publicKey), "PUBLIC KEY"), 13 | { mode: 0o600 } 14 | ); 15 | 16 | writeFileSync( 17 | privateKeyPath, 18 | keypair.constructor._toPEM(Buffer.from(privateKey), "PRIVATE KEY"), 19 | { mode: 0o600 } 20 | ); 21 | } 22 | 23 | describe("Key Import", () => { 24 | it("works", async () => { 25 | const dir = mkdtempSync(join(tmpdir(), "keyTestDir-")); 26 | const pubKeyPath = join(dir, "pub"); 27 | const privKeyPath = join(dir, "priv"); 28 | 29 | const key = await secp.generate(); 30 | await toDisk(key, privKeyPath, pubKeyPath); 31 | 32 | new secp( 33 | await secp.importKey("pkcs8", readFileSync(privKeyPath)), 34 | await secp.importKey("spki", readFileSync(pubKeyPath)) 35 | ); 36 | }); 37 | }); 38 | -------------------------------------------------------------------------------- /toda.js: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs'; 2 | const packageJSON = JSON.parse(fs.readFileSync('./package.json')); 3 | 4 | /** Core **/ 5 | export { Hash, 6 | Sha256 as Sha256Hash, 7 | Symbol as SymbolHash, 8 | NullHash } from "./src/core/hash.js"; 9 | export { Interpreter } from "./src/core/interpret.js"; 10 | export { Twist, TwistBuilder } from "./src/core/twist.js"; 11 | /** SignatureRequirement used by server/test/test_import_integration */ 12 | export { SignatureRequirement } from "./src/core/reqsat.js"; 13 | 14 | /** Abjects **/ 15 | export { Abject } from "./src/abject/abject.js"; 16 | export { SimpleRigged, 17 | Actionable, 18 | DelegableActionable } from "./src/abject/actionable.js"; 19 | export { Capability } from "./src/abject/capability.js"; 20 | export { P1String, P1Date } from "./src/abject/primitive.js"; 21 | export { DI, DIAssetClassClass, AssetClassField } from "./src/abject/di.js"; 22 | export { DQ } from "./src/abject/quantity.js"; 23 | 24 | /** Client **/ 25 | export { LocalInventoryClient } from "./src/client/inventory.js"; 26 | export { LocalRelayClient, RemoteRelayClient } 27 | from "./src/client/relay.js"; 28 | export { TodaClient } from "./src/client/client.js"; 29 | 30 | /** Signature Implementations */ 31 | export { SECP256r1 } from "./src/client/secp256r1.js"; 32 | 33 | /** Testing */ 34 | export { TestRelayServer } from "./test/client/relay_server.js"; 35 | 36 | 37 | 38 | export const version = packageJSON.version; 39 | -------------------------------------------------------------------------------- /src/core/shield.js: -------------------------------------------------------------------------------- 1 | /************************************************************* 2 | * TODAQ Open: TODA File Implementation 3 | * Toronto 2022 4 | * 5 | * Apache License 2.0 6 | *************************************************************/ 7 | 8 | import { PairTriePacket } from './packet.js'; 9 | import { byteConcat } from './byteUtil.js'; 10 | 11 | // doesn't really need a class 12 | class Shield { 13 | 14 | /** 15 | * @returns 16 | */ 17 | static _shield(twistHash, bytesToShield, shieldBytes) { 18 | return twistHash.constructor.fromBytes(shieldBytes ? 19 | byteConcat(shieldBytes, bytesToShield) : 20 | bytesToShield); 21 | } 22 | 23 | /** 24 | * @returns 25 | */ 26 | static shield(twistHash, hashToShield, shieldPacket) { 27 | if (shieldPacket) { 28 | return this._shield(twistHash, 29 | hashToShield.toBytes(), 30 | shieldPacket.toBytes().subarray(5)); // dx: perf 31 | } 32 | return this._shield(twistHash, hashToShield.toBytes()); 33 | } 34 | 35 | /** 36 | * @returns 37 | */ 38 | static doubleShield(twistHash, hashToShield, shieldPacket) { 39 | return this.shield(twistHash, this.shield(twistHash, 40 | hashToShield, 41 | shieldPacket), 42 | shieldPacket); 43 | } 44 | 45 | static rigForHoist(leadHash, meatHash, shieldPacket) { 46 | return PairTriePacket.createFromUnsorted( 47 | new Map([[this.shield(leadHash, leadHash, shieldPacket), meatHash], 48 | [this.doubleShield(leadHash, leadHash, shieldPacket), 49 | this.shield(leadHash, meatHash, shieldPacket)]])); 50 | } 51 | } 52 | 53 | export { Shield }; 54 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module", 3 | "name": "todajs", 4 | "version": "1.1.33", 5 | "description": "", 6 | "author": "TodaQ", 7 | "license": "Apache License 2.0", 8 | "homepage": "https://engineering.todaq.net", 9 | "repository": { 10 | "url": "https://github.com/TODAQopen/toda", 11 | "type": "git" 12 | }, 13 | "bin": { 14 | "toda": "./src/cli/bin/toda", 15 | "todaize": "./src/cli/bin/todaize" 16 | }, 17 | "main": "./toda.js", 18 | "exports": { 19 | ".": "./toda.js", 20 | "./web": "./dist/toda.web.dist.js" 21 | }, 22 | "directories": { 23 | "test": "test" 24 | }, 25 | "engines": { 26 | "node": ">=16.0.0 <21.0.0" 27 | }, 28 | "scripts": { 29 | "test-debugger": " echo 'Visit chrome://inspect in chrome for your debugger\n'; mocha --inspect-brk --recursive --timeout 60000 --require test/fixtures.js", 30 | "test": "mocha --recursive --forbid-only --timeout 60000 --require test/fixtures.js", 31 | "build": "cd ./build && NODE_ENV=production npx webpack && cd ..", 32 | "test-only": "mocha --timeout 60000 --require test/fixtures.js", 33 | "lint": "npx eslint src/*" 34 | }, 35 | "dependencies": { 36 | "@peculiar/webcrypto": "^1.3.3", 37 | "axios": "^0.27.2", 38 | "buffer": "^6.0.3", 39 | "express": "^4.18.1", 40 | "fs-extra": "^10.1.0", 41 | "uuid": "^8.3.2", 42 | "webpack": "^5.75.0" 43 | }, 44 | "devDependencies": { 45 | "babel-loader": "^9.1.0", 46 | "crypto-browserify": "^3.12.0", 47 | "eslint": "^8.23.1", 48 | "eslint-plugin-header": "^3.1.1", 49 | "mocha": "^10.0.0", 50 | "nock": "^13.2.6", 51 | "stream-browserify": "^3.0.0", 52 | "webpack-cli": "^4.10.0" 53 | }, 54 | "browserslist": [ 55 | "> 1%", 56 | "last 2 years" 57 | ] 58 | } 59 | -------------------------------------------------------------------------------- /src/core/fsMap.js: -------------------------------------------------------------------------------- 1 | /************************************************************* 2 | * TODAQ Open: TODA File Implementation 3 | * Toronto 2024 4 | * 5 | * Apache License 2.0 6 | *************************************************************/ 7 | 8 | /** 9 | * Implementation of Javascript Map which understands equality of our 10 | * Hash objects and backed by the file system. 11 | * 12 | * Is not opinionated about what values are used. 13 | */ 14 | 15 | import fs from 'fs-extra'; 16 | import path from 'path'; 17 | import { HashMap } from './map.js'; 18 | import { v4 } from 'uuid'; 19 | 20 | /* HashMap subclass that stores the values in a given json file and tries to 21 | * load them upon initialization 22 | */ 23 | class JSONFileBackedHashMap extends HashMap { 24 | constructor( 25 | filePath, 26 | iterable = [], 27 | deserializer = (x) => x, 28 | serializer = (x) => x 29 | ) { 30 | const fullFilePath = path.resolve(filePath); 31 | if (fs.existsSync(fullFilePath)) { 32 | const diskData = deserializer( 33 | JSON.parse(fs.readFileSync(fullFilePath)) 34 | ); 35 | iterable = iterable.concat(Object.entries(diskData)); 36 | } 37 | super(iterable); 38 | this.filePath = fullFilePath; 39 | this.serializer = serializer; 40 | } 41 | 42 | commit() { 43 | const tmpPath = `${this.filePath}_${v4()}.tmp`; 44 | fs.writeFileSync( 45 | tmpPath, 46 | JSON.stringify(this.serializer(Object.fromEntries(this))) 47 | ); 48 | fs.moveSync(tmpPath, this.filePath, { overwrite: true }); 49 | } 50 | 51 | clone() { 52 | throw new Error("Not Implemented"); 53 | } 54 | } 55 | 56 | export { JSONFileBackedHashMap }; 57 | -------------------------------------------------------------------------------- /test/test-suite/atomic-test.js: -------------------------------------------------------------------------------- 1 | import "../../src/abject/di.js"; 2 | import "../../src/abject/primitive.js"; 3 | import { Atoms } from "../../src/core/atoms.js"; 4 | import { listTests, loadTest } from './util.js'; 5 | import assert from "assert"; 6 | 7 | function runParse(b) { 8 | let lat = Atoms.fromBytes(b).toPairs().map(pair => pair[1]); 9 | lat.forEach((p) => { 10 | p.getShapedValue(); 11 | }); 12 | } 13 | 14 | function runTest(test) { 15 | // Returns string if error 16 | describe("test-suite/atomic-test " + test["moniker"], async() => { 17 | it("Test input properly loaded", async() => { 18 | assert(test["input"] instanceof Buffer); 19 | }); 20 | if (test["colour"] === "green") { 21 | it ("Parsing LAT should succeed", async() => { 22 | runParse(test["input"]); 23 | }); 24 | } else { 25 | it("Parsing LAT should fail", async () => { 26 | assert.throws(() => runParse(test["input"])); 27 | }); 28 | } 29 | }); 30 | } 31 | 32 | function testFilter(testName) { 33 | if (!testName.startsWith("atomic_")) { 34 | return false; 35 | } 36 | // FIXME! These currently DO NOT WORK 37 | if (testName != "atomic_hash_list_test_empty_list_description.toda" && 38 | testName != "atomic_packet_test_packet_content_must_contain_at_least_one_byte_description.toda" && 39 | testName != "atomic_pairtrie_test_empty_pairtrie_description.toda") { 40 | return true; 41 | } 42 | console.warn("Skipping over test " + testName + "!"); 43 | return false; 44 | } 45 | 46 | let testNames = listTests().filter(testFilter); 47 | 48 | describe("test-suite/atomic-test", () => { 49 | it("Make sure at least one test was loaded.", () => assert(testNames.length > 0)); 50 | }); 51 | 52 | testNames.forEach(function (s) { 53 | let test = loadTest(s); 54 | runTest(test); 55 | }); -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | .DS_Store 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # TypeScript cache 43 | *.tsbuildinfo 44 | 45 | # Optional npm cache directory 46 | .npm 47 | 48 | # Optional eslint cache 49 | .eslintcache 50 | 51 | # Optional REPL history 52 | .node_repl_history 53 | 54 | # Output of 'npm pack' 55 | *.tgz 56 | 57 | # Yarn Integrity file 58 | .yarn-integrity 59 | 60 | # dotenv environment variables file 61 | .env 62 | .env.test 63 | 64 | # parcel-bundler cache (https://parceljs.org/) 65 | .cache 66 | 67 | # next.js build output 68 | .next 69 | 70 | # nuxt.js build output 71 | .nuxt 72 | 73 | # vuepress build output 74 | .vuepress/dist 75 | 76 | # Serverless directories 77 | .serverless/ 78 | 79 | # FuseBox cache 80 | .fusebox/ 81 | 82 | # DynamoDB Local files 83 | .dynamodb/ 84 | 85 | # Webpack 86 | .webpack/ 87 | 88 | # Electron-Forge 89 | dist/ 90 | !/dist/toda.dist.js 91 | !/dist/toda.web.dist.js 92 | 93 | src/main.js 94 | adot-electron-certs.p12 95 | 96 | # emacs 97 | *~ 98 | \#*\# 99 | .\#* 100 | 101 | # IntelliJ 102 | .idea 103 | .vscode 104 | 105 | # Test files 106 | test/client/files/* 107 | files/ 108 | 109 | # Test TODA files 110 | .toda/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | Bootstrap logo 4 | 5 |

6 | 7 |

TODA Files: A Cryptographic Asset Structure

8 | 9 | A TODA file is a representation of a digital asset. It is based on a novel cryptographic data structure. 10 |
11 |
12 | This package contains the library for interacting with low-level structures, as well as higher-level abstractions for application design. 13 | 14 | * Authors: https://engineering.todaq.net 15 | * Theoretics: https://arxiv.org/abs/2208.13617 16 | * Institute: https://trie.site 17 | * Specifications: https://trie.site/rigging_specifications.pdf 18 | 19 | ## Table of contents 20 | 21 | - [Code Layout](#code-layout) 22 | - [TODA Client](#toda-client) 23 | 24 | 25 | ## Code Layout 26 | 27 | ### core: 28 | Defines Hash and Packet, the only two core data structures. 29 | Includes a rig (structure) checker, which assesses asset integrity. 30 | 31 | - Atoms: an ordered hashmap of : pairs 32 | - Shield: utilities for creating and checking shielded values 33 | - ReqSat: utilities for creating and parsing Requirements and Satisfactions packets 34 | - Interpret: the rig checker 35 | - Twist: an abstraction over Hash and Packets which represents twists 36 | - TwistBuilder: a factory for Twists 37 | 38 | ### abject: 39 | Higher-level structures describing contents of TODA assets, and how to apply the rig checker to determine their integrity. 40 | - Actionable: any TODA object requiring a line of integrity 41 | - DelegableActionable: a TODA object which depends on the integrity of a another in a particular way 42 | - DI: Basic container for fields and values 43 | - Primitive: Boxes up values for float, string, boolean in a well-specified byte representation 44 | - Capability: a DelegableActionable intended for authorization 45 | 46 | ## client: 47 | Runtime object for interacting with TODA data and servers. 48 | -------------------------------------------------------------------------------- /test/core/packet_test.js: -------------------------------------------------------------------------------- 1 | import { bytesToHex, utf8ToBytes } from "../../src/core/byteUtil.js"; 2 | import { Sha256 } from "../../src/core/hash.js"; 3 | import { Packet, ArbitraryPacket, HashPacket, PairTriePacket } 4 | from "../../src/core/packet.js"; 5 | import assert from "assert"; 6 | 7 | describe("ArbitraryPacket", () => { 8 | it("can be created, serialized, parsed", () => { 9 | let p = Packet.parse(new ArbitraryPacket(utf8ToBytes("bbq")).toBytes()); 10 | assert.equal(p.constructor.shapeCode, 0x60); 11 | bytesToHex(utf8ToBytes("bbq")) === 12 | bytesToHex(p.getShapedValue()); 13 | }); 14 | }); 15 | 16 | describe("HashPacket", () => { 17 | it("can be created, serialized, parsed", () => { 18 | let hashes = ["b","b","q"].map((x) => Sha256.fromPacket(new ArbitraryPacket(utf8ToBytes(x)))); 19 | let p = Packet.parse(new HashPacket(hashes).toBytes()); 20 | assert.equal(p.constructor.shapeCode, 0x61); 21 | let s = p.getShapedValue(); 22 | for (let idx in hashes) { 23 | assert(hashes[idx].equals(s[idx])); 24 | } 25 | }); 26 | }); 27 | 28 | describe("PairTriePacket", () => { 29 | it("can be created, serialized, parsed", () => { 30 | let hashes = ["a","b","c","d"].map((x) => Sha256.fromBytes(utf8ToBytes(x))); 31 | let pairs = [[hashes[1], hashes[0]], 32 | [hashes[0], hashes[1]]]; 33 | let p = Packet.parse(new PairTriePacket(new Map(pairs)).toBytes()); 34 | assert.equal(p.constructor.shapeCode, 0x63); 35 | let s = p.getShapedValue(); 36 | let ks = s.keys(); 37 | assert(pairs[0][1].equals(s.get(ks.next().value))); 38 | assert(pairs[1][1].equals(s.get(ks.next().value))); 39 | }); 40 | 41 | it("throws on incorrect order", () => { 42 | let hashes = ["a","b","c","d"].map((x) => Sha256.fromBytes(utf8ToBytes(x))); 43 | let pairs = [[hashes[0], hashes[1]], 44 | [hashes[1], hashes[0]]]; 45 | assert.throws(() => new PairTriePacket(new Map(pairs)), 46 | { message: "SHAPE_ORDER"}); 47 | }); 48 | }); 49 | -------------------------------------------------------------------------------- /src/core/byteUtil.js: -------------------------------------------------------------------------------- 1 | /************************************************************* 2 | * TODAQ Open: TODA File Implementation 3 | * Toronto 2022 4 | * 5 | * Apache License 2.0 6 | *************************************************************/ 7 | 8 | const hexes_helper = Array.from(Array(256)). 9 | map((n,i)=>i.toString(16).padStart(2, '0')); 10 | 11 | function byteConcat(b0, b1) { // dx: exterminate 12 | let res = new Uint8Array(b0.length + b1.length); 13 | res.set(b0); 14 | res.set(b1, b0.length); 15 | return res; 16 | } 17 | 18 | function hexToBytes(str) { 19 | let result = []; 20 | for (let i = 0; i < str.length; i += 2) { 21 | result.push(parseInt(str.substring(i, i + 2), 16)); 22 | } 23 | return new Uint8Array(result); 24 | } 25 | 26 | /** 27 | * @param {int} offset starting byte 28 | * @param {int} length total length of bytes 29 | * @returns {string} 30 | **/ 31 | function bytesToHex(bytes, offset=0, length=0) { 32 | let hex = ''; 33 | const hh = hexes_helper; 34 | const o = offset || 0; 35 | const l = o + (length || bytes.byteLength); 36 | for (let i = o; i < l; i++) { 37 | hex += hh[bytes[i]]; 38 | } 39 | return hex; 40 | } 41 | 42 | // Reads utf8 string data into a Uint8Array 43 | function utf8ToBytes(str) { 44 | return new TextEncoder("utf-8").encode(str); 45 | } 46 | 47 | // dx: perf: make this fast; accept offset and length 48 | function bytesToUtf8(bytes) { 49 | return new TextDecoder("utf-8").decode(bytes); 50 | } 51 | 52 | function bytesToInt(bytes, offset=0, length=0) { 53 | return new DataView(bytes.buffer, offset || 54 | bytes.byteOffset, length || 55 | bytes.byteLength).getUint32(0, false); 56 | } 57 | 58 | function fourByteInt(n) { 59 | let bytes = new Uint8Array(4); 60 | for (let i = 3; i >= 0; i--) { 61 | bytes[i] = n & (255); 62 | n = n >> 8; 63 | } 64 | return bytes; 65 | } 66 | 67 | export { byteConcat, 68 | hexToBytes, 69 | bytesToHex, 70 | utf8ToBytes, 71 | bytesToUtf8, 72 | bytesToInt, 73 | fourByteInt }; 74 | -------------------------------------------------------------------------------- /test/test-suite/util.js: -------------------------------------------------------------------------------- 1 | import { Atoms } from "../../src/core/atoms.js"; 2 | import { Abject } from "../../src/abject/abject.js"; 3 | import { Hash } from "../../src/core/hash.js"; 4 | import fs from 'fs'; 5 | 6 | const descriptionDirectory = new URL('./descriptions', import.meta.url); 7 | 8 | function listTests() { 9 | return fs.readdirSync(descriptionDirectory, function (err, files) { 10 | if (err) { 11 | throw new Error("Cannot load description files!"); 12 | } 13 | return files; 14 | }); 15 | } 16 | 17 | function parseColour(sym) { 18 | if (sym.equals(green)) { 19 | return "green"; 20 | } 21 | if (sym.equals(yellow)) { 22 | return "yellow"; 23 | } 24 | if (sym.equals(red)) { 25 | return "red"; 26 | } 27 | throw Error("Unknown colour? " + sym); 28 | } 29 | 30 | function loadInput(fileName) { 31 | return fs.readFileSync(new URL('./inputs/' + fileName, import.meta.url)); 32 | } 33 | 34 | function loadTest(fileName) { 35 | let bytes = new Uint8Array(fs.readFileSync( 36 | new URL('./descriptions/' + fileName, import.meta.url))); 37 | let atoms = Atoms.fromBytes(bytes); 38 | let abj = Abject.parse(atoms, atoms.focus); 39 | let linkedFile = Abject.parse(atoms, abj.getFieldHash(linkedInputFile)); 40 | return {"colour": parseColour(abj.getFieldHash(colour)), 41 | "moniker": Abject.parse(atoms, abj.getFieldHash(moniker)), 42 | "input": loadInput(linkedFile)}; 43 | } 44 | 45 | const colour = Hash.fromHex("22c04949412ab90e79aab7c0300224f02d2456b6c4428850aced1256eddc0699e2"); 46 | const green = Hash.fromHex("22ed032bab5c6bfbde1c8efb762e8bf89e5c7de4a307b934a652be3bbcc2dda8a0"); 47 | const yellow = Hash.fromHex("223c708a180dab1e2ba2ee3b07c7b6b7fb5028d1402308c24e8f68597b86dc319c"); 48 | const red = Hash.fromHex("22e0194bb1db085d3f6675a255febf60620bdfce80ef53f5fe44c2a27ff61333a9"); 49 | const moniker = Hash.fromHex("22e71e2b7b3ca0425254c242a681b3a0d8d63f3d7c2c53bc4f98ad3271b017915d"); 50 | const linkedInputFile = Hash.fromHex("2255fb096446bb57d0f6d5410a61336a7ed4a4b5fad5c37baf1075a7b2a47763b1"); 51 | 52 | export { listTests }; 53 | export { loadTest }; 54 | export { colour }; 55 | export { moniker }; -------------------------------------------------------------------------------- /src/core/map.js: -------------------------------------------------------------------------------- 1 | /************************************************************* 2 | * TODAQ Open: TODA File Implementation 3 | * Toronto 2022 4 | * 5 | * Apache License 2.0 6 | *************************************************************/ 7 | 8 | /** 9 | * Implementation of Javascript Map which understands equality of our 10 | * Hash objects. 11 | * 12 | * Is not opinionated about what values are used. 13 | */ 14 | 15 | class HashMap extends Map { 16 | // This could be probably done more efficiently, but this is a 17 | // first-pass stab we've used other places. 18 | 19 | constructor(iterable) { 20 | super(iterable); 21 | if (this.hashes === undefined) { 22 | this.hashes = {}; /** @type Object. */ 23 | } 24 | } 25 | 26 | clear() { 27 | this.hashes = {}; 28 | return super.clear(); 29 | } 30 | 31 | delete(key) { 32 | let res = super.delete(this.hashes[key]); 33 | delete this.hashes[key]; 34 | return res; 35 | } 36 | 37 | get(key) { // dx: perf: this is expensive! how can we make it faster? 38 | if (!key) { 39 | return undefined; 40 | } 41 | let h = key.toString(); 42 | let k = this.hashes[h]; 43 | return super.get(k); 44 | } 45 | 46 | has(key) { 47 | if (!key) { 48 | return false; 49 | } 50 | return !!this.hashes[key.toString()]; 51 | } 52 | 53 | set(key, value) { 54 | // XXX(acg): hack - if args are passed to super(), 55 | // 'set' will otherwise fail 56 | if (this.hashes === undefined) { 57 | this.hashes = {}; 58 | } 59 | 60 | let keystring = key.toString(); 61 | let currentKey = this.hashes[keystring]; 62 | 63 | if (!currentKey) { 64 | this.hashes[keystring] = key; 65 | currentKey = key; 66 | } 67 | 68 | return super.set(currentKey, value); 69 | } 70 | 71 | clone() { 72 | return new this.constructor(this); 73 | } 74 | 75 | // Destructively updates in-place 76 | merge(atoms) { 77 | for (let [k,v] of atoms) { 78 | this.set(k,v); 79 | } 80 | return this.atoms; 81 | } 82 | } 83 | 84 | export { HashMap }; 85 | -------------------------------------------------------------------------------- /test/abject/di_test.js: -------------------------------------------------------------------------------- 1 | import { DI, DIAssetClassClass, AssetClassField } from "../../src/abject/di.js"; 2 | import { Primitive, P1String, P1Float, P1Date, P1Boolean } from "../../src/abject/primitive.js"; 3 | import { Media } from "../../src/abject/media.js"; 4 | import assert from 'node:assert/strict'; 5 | 6 | // Output key values for our use 7 | describe("Give me hashes", () => { 8 | it("gives me hashes", () => { 9 | 10 | console.log("B1/value:", Primitive.fieldSyms.value.toString()); 11 | 12 | console.log("B1/UTF8:", P1String.interpreter.toString()); 13 | console.log("B1/IEEE754:", P1Float.interpreter.toString()); 14 | console.log("B1/Date:", P1Date.interpreter.toString()); 15 | console.log("B1/Boolean", P1Boolean.interpreter.toString()); 16 | 17 | console.log("M1:", Media.interpreter.toString()); 18 | console.log("M1/fields/typename:", Media.fieldSyms.typeName.toString()); 19 | console.log("M1/fields/subtypename:", Media.fieldSyms.subTypeName.toString()); 20 | 21 | console.log("DI:", DI.interpreter.toString()); 22 | 23 | console.log("DI/fields/asset-class", DI.fieldSyms.assetClass.toString()); 24 | 25 | }); 26 | }); 27 | 28 | //TODO: many, many more di tests: lists, etc. etc. 29 | describe("Consolidate fields", () => { 30 | let ac = new DIAssetClassClass(); 31 | let f1 = new AssetClassField(); 32 | f1.consolidation = DI.consolidations.lastWriteWins; 33 | let f1name = DI.gensym("mytests/field/name"); 34 | ac.addACField(f1name, f1); 35 | 36 | let f2 = new AssetClassField(); 37 | f2.consolidation = DI.consolidations.append; 38 | let f2friends = DI.gensym("mytests/field/friends"); 39 | ac.addACField(f2friends, f2); 40 | 41 | let x = new DI(); 42 | x.setAssetClass(ac); 43 | x.setFieldAbject(f1name, new P1String("huerto juanita de la fuerto conseuella von schmidt")); 44 | let y = new DI(); 45 | y.setAssetClass(ac); 46 | y.setFieldAbject(f1name, new P1String("smith")); 47 | 48 | it("reports asset class fields", () => { 49 | let fields = ac.getFieldHashes(); 50 | assert.equal(fields.length, 2); 51 | }); 52 | 53 | it("can create and use an asset class", () => { 54 | assert.equal(DI.consolidate([x,y]).getFieldAbject(f1name),"smith"); 55 | }); 56 | 57 | }); 58 | -------------------------------------------------------------------------------- /docs/web.md: -------------------------------------------------------------------------------- 1 | # TODA Web tools 2 | ## Inventory viewer web application 3 | 4 | ### Compiles and hot-reloads for development 5 | ``` 6 | npm run serve-web 7 | ``` 8 | 9 | ### toda.web.dist.js 10 | Note that TodaWeb relies on a bundled version of the core `toda` library. If you make any changes to todajs, you will need to rebuild the web distribution with `npm run build` before they are reflected in the web app. 11 | 12 | ### Compiles and minifies for production 13 | - Change the `server` variable in `config.yml` to point to your inventory server 14 | - Update the `publicPath` variable in `vue.config.js` to point to the relative path where you will be hosting the web app. (Defaults to `"/"`) 15 | - eg. If you want to host todaweb at `http://localhost:3000/some/deeper/path`, set `publicPath: /some/deeper/path`. 16 | 17 | Then: 18 | ``` 19 | npm run build-web 20 | ``` 21 | 22 | - Copy the resulting `dist` folder to your server's root directory. 23 | - You'll need to configure `/dist` as a static assets folder. If you're using express: 24 | 25 | ``` 26 | app.use('/some/deeper/path', express.static(path.join(__dirname, '/dist'))); 27 | ``` 28 | 29 | ### Sass 30 | Have any changes to your sass files automatically compile to `main.css` 31 | ``` 32 | npm run watch-sass 33 | ``` 34 | 35 | ### Customize configuration 36 | See [Configuration Reference](https://cli.vuejs.org/config/). 37 | 38 | ## Inventory server 39 | Runs a server to list and retrieve files from a local inventory store. Details for active dev: 40 | 41 | ### Run the servers 42 | ``` 43 | $ toda serve 44 | Web && Inventory server running on http://localhost:3000 45 | ``` 46 | 47 | Go ahead and navigate to `http://localhost:3000` and you should be able to view all of the files we've created. In particular take a look at the Capability we authorized! You'll see the hash (in our example here, `417b3b2061ab152ca4bb10552cffe89f6d025801f12ffc2bec052092f04eb716c2`) in the inventory listing, or you can navigate directly to it at `http://localhost:3000/#/417b3b2061ab152ca4bb10552cffe89f6d025801f12ffc2bec052092f04eb716c2` 48 | 49 | 50 | ### Configuration 51 | Edit `config.yml` to change configurable parameters: 52 | - inventory: a home dir relative path to local inventory; i.e., absolute path will be `~/` 53 | - port: the port on which the server will start with `npm run server` 54 | -------------------------------------------------------------------------------- /test/test-suite/reqsat-test.js: -------------------------------------------------------------------------------- 1 | import "../../src/abject/di.js"; 2 | import "../../src/abject/primitive.js"; 3 | import "../../src/client/secp256r1.js"; 4 | import { Atoms } from "../../src/core/atoms.js"; 5 | import { Interpreter } from "../../src/core/interpret.js"; 6 | import { Line } from "../../src/core/line.js"; 7 | import { Twist } from "../../src/core/twist.js"; 8 | import { listTests, loadTest } from './util.js'; 9 | import assert from "assert"; 10 | 11 | async function checkInterpret(b) { 12 | try { 13 | let atoms = Atoms.fromBytes(b); 14 | let line = Line.fromAtoms(atoms); 15 | let interpreter = new Interpreter(line, null); 16 | let successorH = atoms.focus; 17 | let predecessorH = line.prev(successorH); 18 | let successor = new Twist(atoms, successorH); 19 | let predecessor = new Twist(atoms, predecessorH); 20 | await interpreter._verifyLegit(predecessor, successor); 21 | await interpreter.verifyCollectedReqSats(); 22 | return true; 23 | } catch (err) { 24 | return false; 25 | } 26 | } 27 | 28 | function runTest(test) { 29 | // Returns string if error 30 | describe("test-suite/reqsat-test " + test["moniker"], async () => { 31 | it("Test input properly loaded", async () => { 32 | assert(test["input"] instanceof Buffer); 33 | }); 34 | if (test["colour"] === "green") { 35 | it("Reqsat should succeed", async () => { 36 | assert(await checkInterpret(test["input"])); 37 | }); 38 | } else { 39 | it("Reqsat should fail", async () => { 40 | assert.ifError(await checkInterpret(test["input"]) || null); 41 | }); 42 | } 43 | }); 44 | } 45 | 46 | function testFilter(testName) { 47 | if (!testName.startsWith("reqsat_")) { 48 | return false; 49 | } 50 | // FIXME! These currently DO NOT WORK 51 | if (!testName.match("reqsatlist") && !testName.match("reqtrie")) { 52 | return true; 53 | } 54 | console.warn("Skipping over test " + testName + "!"); 55 | return false; 56 | } 57 | 58 | 59 | let testNames = listTests().filter(testFilter); 60 | 61 | describe("test-suite/reqsat-test", () => { 62 | it("Make sure at least one test was loaded.", 63 | () => assert(testNames.length > 0)); 64 | 65 | // it("should wait forever for perf debugging", () => { 66 | // while(1) {} 67 | // }) 68 | }); 69 | 70 | testNames.forEach(function (s) { 71 | let test = loadTest(s); 72 | runTest(test); 73 | }); 74 | -------------------------------------------------------------------------------- /test/client/util.js: -------------------------------------------------------------------------------- 1 | import { LocalInventoryClient } from "../../src/client/inventory.js"; 2 | import { TodaClient } from "../../src/client/client.js"; 3 | import { SECP256r1 } from "../../src/client/secp256r1.js"; 4 | import { TestRelayServer } from "./relay_server.js"; 5 | import { v4 as uuid } from "uuid"; 6 | import path from "path"; 7 | import fs from "fs"; 8 | 9 | async function initRelay(port, upstreamBaseUrl, upstreamHash, initTwists = 2) { 10 | const inv = new LocalInventoryClient("./files/" + uuid()); 11 | const toda = new TodaClient(inv, upstreamBaseUrl + "/files"); 12 | await toda.populateInventory(); 13 | toda.shieldSalt = path.join(inv.invRoot, "salt"); 14 | fs.writeFileSync(toda.shieldSalt, Buffer.from(uuid(), "utf-8")); 15 | const req = await SECP256r1.generate(); 16 | toda.addSatisfier(req); 17 | toda.defaultRelayUrl = upstreamBaseUrl + "/hoist"; 18 | toda.defaultRelayHash = upstreamHash; 19 | const config = { port }; 20 | if (upstreamBaseUrl) { 21 | config.fileServerRedirects = [upstreamBaseUrl + "/files"]; 22 | } 23 | const server = new TestRelayServer(toda, config); 24 | await server.start(); 25 | 26 | const t0 = await toda.create(upstreamHash, req); 27 | const twists = [t0]; 28 | for (let i = 1; i < initTwists; i ++) { 29 | twists.push(await toda.append(twists[twists.length - 1], upstreamHash)); 30 | } 31 | return { toda, server, twists, req }; 32 | } 33 | 34 | async function createLine(relayHash, 35 | topLineHash = relayHash, 36 | remoteFileServer = "http://localhost:8090/files", 37 | remoteRelayUrl = "http://localhost:8090/hoist") { 38 | const inv = new LocalInventoryClient("./files/" + uuid()); 39 | const toda = new TodaClient(inv, remoteFileServer); 40 | await toda.populateInventory(); 41 | toda.shieldSalt = path.join(inv.invRoot, "salt"); 42 | fs.writeFileSync(toda.shieldSalt, Buffer.from(uuid(), "utf-8")); 43 | toda.defaultRelayUrl = remoteRelayUrl; 44 | toda.defaultTopLineHash = topLineHash; 45 | const req = await SECP256r1.generate(); 46 | toda.addSatisfier(req); 47 | const t0 = await toda.create(relayHash, req); 48 | toda.defaultRelayHash = t0.getHash(); 49 | await toda.append(t0, relayHash, req); 50 | return { toda, hash: t0.getHash(), req }; 51 | } 52 | 53 | async function mint(toda, qty, precision, tetherHash, topLineHash) { 54 | return await toda.mint(qty, 55 | precision, 56 | tetherHash, 57 | topLineHash, 58 | JSON.stringify({uuid: uuid()})); 59 | } 60 | 61 | export { initRelay, createLine, mint }; 62 | -------------------------------------------------------------------------------- /test/core/atoms_test.js: -------------------------------------------------------------------------------- 1 | import { Atoms } from "../../src/core/atoms.js"; 2 | import { Sha256 } from "../../src/core/hash.js"; 3 | import { ArbitraryPacket } from "../../src/core/packet.js"; 4 | import { utf8ToBytes } from "../../src/core/byteUtil.js"; 5 | import assert from "assert"; 6 | 7 | function pairFromStr(str) { 8 | let p = new ArbitraryPacket(utf8ToBytes(str)); 9 | return [Sha256.fromPacket(p), p]; 10 | } 11 | 12 | describe("Basic Atoms operations", () => { 13 | let atoms = new Atoms(); 14 | let pairs = ['one', 'two', 'three'].map(pairFromStr); 15 | 16 | it("Should set hash-packet pairs", () => { 17 | atoms.set(...pairs[0]); 18 | atoms.set(...pairs[1]); 19 | atoms.set(...pairs[2]); 20 | }); 21 | 22 | it("Should get those packets back", () => { 23 | assert.equal(JSON.stringify(pairs[0][1]), JSON.stringify(atoms.get(pairs[0][0]))); 24 | assert.equal(JSON.stringify(pairs[1][1]), JSON.stringify(atoms.get(pairs[1][0]))); 25 | assert.equal(JSON.stringify(pairs[2][1]), JSON.stringify(atoms.get(pairs[2][0]))); 26 | }); 27 | 28 | it("Should return the original pairs", () => { 29 | assert.equal(JSON.stringify(pairs), JSON.stringify(atoms.toPairs())); 30 | }); 31 | 32 | it("Should convert Atoms to bytes and back", () => { 33 | assert.equal(JSON.stringify(atoms.toPairs()), JSON.stringify(Atoms.fromBytes(atoms.toBytes()).toPairs())); 34 | }); 35 | }); 36 | 37 | 38 | describe("Fancy Atoms operations", () => { 39 | let a1, a2, a3, a4; 40 | 41 | it("Should make atoms from pairs", () => { 42 | let pairs = ['one', 'two', 'three'].map(pairFromStr); 43 | a1 = Atoms.fromPairs(pairs); 44 | assert.equal(JSON.stringify(a1.toPairs()), JSON.stringify(pairs)); 45 | }); 46 | 47 | it("Should make atoms from atoms", () => { 48 | let pairs = ['four', 'five', 'six'].map(pairFromStr); 49 | let atoms = Atoms.fromPairs(pairs); 50 | a2 = Atoms.fromAtoms(atoms); 51 | assert.equal(JSON.stringify(a2.toPairs()), JSON.stringify(atoms.toPairs())); 52 | }); 53 | 54 | it("Should merge atoms", () => { 55 | a3 = new Atoms(); 56 | a3.merge(a1); 57 | assert.equal(JSON.stringify(a3.toPairs()), JSON.stringify(a1.toPairs())); 58 | }); 59 | 60 | it("Should merge more atoms", () => { 61 | a3.merge(a2); 62 | assert.equal(JSON.stringify(a3.toPairs()), JSON.stringify(a1.toPairs().concat(a2.toPairs()))); 63 | }); 64 | 65 | it("Should dedupe atoms", () => { 66 | a4 = Atoms.fromAtoms(a1, a2, a3); 67 | assert.equal(JSON.stringify(a4.toPairs()), JSON.stringify(a1.toPairs().concat(a2.toPairs()))); 68 | }); 69 | 70 | it("Should convert Atoms to bytes and back", () => { 71 | assert.equal(JSON.stringify(a3.toPairs()), JSON.stringify(Atoms.fromBytes(a3.toBytes()).toPairs())); 72 | }); 73 | }); 74 | -------------------------------------------------------------------------------- /src/client/secp256r1.js: -------------------------------------------------------------------------------- 1 | /************************************************************* 2 | * TODAQ Open: TODA File Implementation 3 | * Toronto 2022 4 | * 5 | * Apache License 2.0 6 | *************************************************************/ 7 | 8 | 9 | import { LocalKeyPair } from './keypair.js'; 10 | import { SignatureRequirement, RequirementSatisfier } from '../core/reqsat.js'; 11 | import { bytesToUtf8 } from '../core/byteUtil.js'; 12 | 13 | if(typeof window === 'undefined') { 14 | const { Crypto } = await import('@peculiar/webcrypto'); 15 | globalThis.crypto = new Crypto(); 16 | } 17 | 18 | class SECP256r1 extends LocalKeyPair { 19 | static requirementTypeHash = SignatureRequirement.REQ_SECP256r1; 20 | 21 | static curve = { 22 | name: "ECDSA", 23 | namedCurve: "P-256" 24 | }; 25 | static sigParams = { 26 | name: "ECDSA", 27 | hash: { name: "SHA-256" } 28 | }; 29 | 30 | /** 31 | * @param privateKey 32 | * @param publicKey 33 | */ 34 | constructor(privateKey, publicKey) { 35 | super(); 36 | this.privateKey = privateKey; 37 | this.publicKey = publicKey; 38 | } 39 | 40 | static importRawPubKey(keyFormat, buffer) { 41 | // NB: webcrypto will subtly throw if you import a pubkey with "sign" usage 42 | return crypto.subtle.importKey( 43 | keyFormat, 44 | buffer, 45 | this.curve, 46 | true, // extractable 47 | ["verify"] 48 | ); 49 | } 50 | 51 | static importKey(keyFormat, buffer) { 52 | let b = this._fromPEM(bytesToUtf8(buffer)); 53 | return crypto.subtle.importKey( 54 | keyFormat, 55 | b, 56 | this.curve, 57 | true, // extractable 58 | ["sign", "verify"] 59 | ); 60 | } 61 | 62 | static async generate() { 63 | let keyPair = await crypto.subtle.generateKey( 64 | this.curve, 65 | true, // extractable 66 | ["sign", "verify"] //can be any combination of "sign" and "verify" 67 | ); 68 | return new SECP256r1(keyPair.privateKey, keyPair.publicKey); 69 | } 70 | 71 | async signBytes(bytes) { 72 | let signedString = await crypto.subtle.sign( 73 | SECP256r1.sigParams, 74 | this.privateKey, 75 | bytes 76 | ); 77 | 78 | return LocalKeyPair._toDER(signedString); 79 | } 80 | 81 | static async verifySig(rawPublicKeyBuffer, derSignatureBuffer, data) { 82 | let signedString = this._fromDER(derSignatureBuffer); 83 | let pubKey = await this.importRawPubKey("spki", rawPublicKeyBuffer); 84 | return crypto.subtle.verify( 85 | this.sigParams, 86 | pubKey, 87 | signedString, 88 | data 89 | ); 90 | } 91 | } 92 | 93 | RequirementSatisfier.registerSatisfier( 94 | SECP256r1.requirementTypeHash, SECP256r1); 95 | 96 | export { SECP256r1 }; 97 | -------------------------------------------------------------------------------- /test/abject/actionable_test.js: -------------------------------------------------------------------------------- 1 | import { MockSimpleHistoricRelay } from '../client/mocks.js'; 2 | import { Abject } from '../../src/abject/abject.js'; 3 | import { DQ } from '../../src/abject/quantity.js'; 4 | import { Sha256 } from '../../src/core/hash.js'; 5 | import { Shield } from '../../src/core/shield.js'; 6 | import { hexToBytes } from '../../src/core/byteUtil.js'; 7 | import { ArbitraryPacket } from '../../src/core/packet.js'; 8 | import { Atoms } from '../../src/core/atoms.js'; 9 | import assert from 'node:assert/strict'; 10 | 11 | // Builds a root and a delegate that point up to a topline 12 | async function buildMockDelegate() { 13 | let relay = new MockSimpleHistoricRelay("http://localhost:8083"); 14 | await relay.initialize(); 15 | await relay.append(); 16 | 17 | let root0 = DQ.mint(12, 1); 18 | root0.setPopTop(relay.first().getHash()); 19 | let root0_shield = new ArbitraryPacket(hexToBytes("001122")); 20 | root0.buildTwist().setShield(root0_shield); 21 | root0.buildTwist().setTether(relay.latest()); 22 | 23 | let delegate0 = root0.delegate(7); 24 | let delegate0_shield = new ArbitraryPacket(hexToBytes("334455")); 25 | delegate0.buildTwist().setShield(delegate0_shield); 26 | delegate0.buildTwist().setTether(relay.latest()); 27 | 28 | let root1 = root0.createSuccessor(); 29 | root1.confirmDelegate(delegate0); 30 | root1.buildTwist().setTether(relay.latest()); 31 | 32 | let delegate1 = delegate0.createSuccessor(); 33 | delegate1.completeDelegate(root1); 34 | delegate1.buildTwist().setTether(relay.latest()); 35 | 36 | await relay.append(null, Shield.rigForHoist(delegate0.getHash(), delegate1.getHash(), delegate0_shield)); 37 | await relay.append(null, Shield.rigForHoist(root0.getHash(), root1.getHash(), root0_shield)); 38 | 39 | let final_tw = delegate1.buildTwist().twist(); 40 | final_tw.addAtoms(relay.latest().getAtoms()); 41 | 42 | return {topline: relay.twists(), 43 | delegate: Abject.fromTwist(final_tw), 44 | root0_shield, delegate0_shield}; 45 | } 46 | 47 | describe("checkAllRigs", async () => { 48 | it("Valid root, delegate, and topline: ", async () => { 49 | let mock = await buildMockDelegate(); 50 | await mock.delegate.checkAllRigs(); 51 | }); 52 | 53 | it("Valid delegate and topline, root's shield missing: ", async () => { 54 | let mock = await buildMockDelegate(); 55 | let atoms = mock.delegate.getAtoms(); 56 | let hash = Sha256.fromPacket(mock.root0_shield); 57 | mock.delegate.atoms = Atoms.fromPairs(atoms.toPairs().filter(([h,p]) => h+"" === hash+"")); 58 | await assert.rejects(() => mock.delegate.checkAllRigs()); 59 | }); 60 | 61 | it("Valid root and topline, delegates's shield missing: ", async () => { 62 | let mock = await buildMockDelegate(); 63 | let atoms = mock.delegate.getAtoms(); 64 | let hash = Sha256.fromPacket(mock.delegate0_shield); 65 | mock.delegate.atoms = Atoms.fromPairs(atoms.toPairs().filter(([h,p]) => h+"" === hash+"")); 66 | await assert.rejects(() => mock.delegate.checkAllRigs()); 67 | }); 68 | 69 | it("Valid root and delegate, topline sat missing: ", async () => { 70 | let mock = await buildMockDelegate(); 71 | let satHash = mock.topline[1].packet.getSatsHash(); 72 | let atoms = mock.delegate.getAtoms(); 73 | mock.delegate.atoms = Atoms.fromPairs(atoms.toPairs().filter(([h,p]) => h+"" === satHash + "")); 74 | await assert.rejects(() => mock.delegate.checkAllRigs()); 75 | }); 76 | }); 77 | -------------------------------------------------------------------------------- /test/core/twist_test.js: -------------------------------------------------------------------------------- 1 | import { MissingHashPacketError, Twist, TwistBuilder } from "../../src/core/twist.js"; 2 | import { ArbitraryPacket, BasicBodyPacket, BasicTwistPacket, PairTriePacket } from "../../src/core/packet.js"; 3 | import { Hash, NullHash, Sha256 } from "../../src/core/hash.js"; 4 | import { utf8ToBytes } from "../../src/core/byteUtil.js"; 5 | import assert from 'assert'; 6 | import { Atoms } from "../../src/core/atoms.js"; 7 | 8 | describe("TwistBuilder/getBodyPacket", () => { 9 | it("properly merges an existing packet with additional rig entries", () => { 10 | let x = new TwistBuilder(); 11 | x.setRiggingPacket(PairTriePacket.createFromUnsorted(new Map([[Sha256.fromBytes(utf8ToBytes("bbq")), 12 | Sha256.fromBytes(utf8ToBytes("bbq"))], 13 | [Sha256.fromBytes(utf8ToBytes("bbq2")), 14 | Sha256.fromBytes(utf8ToBytes("bbq2"))] 15 | ]))); 16 | x.addRigging(Sha256.fromBytes(utf8ToBytes("sauce")), 17 | Sha256.fromBytes(utf8ToBytes("sauce"))); 18 | let body = x.getBodyPacket(); 19 | let riggingPacket = x.atoms.get(body.getRiggingHash()); 20 | let rigging = riggingPacket.getShapedValue(); 21 | assert.equal(rigging.size, 3); 22 | assert(riggingPacket.get(Sha256.fromBytes(utf8ToBytes("sauce"))) 23 | .equals(Sha256.fromBytes(utf8ToBytes("sauce")))); 24 | }); 25 | }); 26 | 27 | describe("Shield function caching", async function () { 28 | it("Works as expected", async function () { 29 | const p = new ArbitraryPacket(utf8ToBytes("some shieldy shield")); 30 | const tb = new TwistBuilder(); 31 | tb.setShield(p); 32 | const t = tb.twist(); 33 | const h = Sha256.fromHex("4170ba33708cbfb103f1a8e34afef333ba7dc021022b2d9aaa583aabb8058d8d67"); 34 | const s0 = t.shieldFunction(h); 35 | assert.ok(Twist._shieldCacheGet(t.getShieldHash(), h)); 36 | //HACK: Super duper hack shim 37 | p.content = "I am clearly not bytes this should explode everything if we try to use it."; 38 | const s1 = t.shieldFunction(h); 39 | assert.ok(s0.equals(s1)); 40 | }); 41 | 42 | it("Shielding with the same shield on different hashes works without clobbering", async function () { 43 | const p = new ArbitraryPacket(utf8ToBytes("some shieldy shield 2")); 44 | const tb = new TwistBuilder(); 45 | tb.setShield(p); 46 | const t = tb.twist(); 47 | const h0 = Sha256.fromHex("4170ba33708cbfb103f1a8e34afef333ba7dc021022b2d9aaa583aabb8058d8d67"); 48 | const h1 = Sha256.fromHex("4103f1a8e3ba33708cbfb19aaa583aabb8058d8d674afef333ba7dc021022b2d70"); 49 | const s0 = t.shieldFunction(h0); 50 | const s1 = t.shieldFunction(h1); 51 | assert.ok(t.shieldFunction(h0).equals(s0)); 52 | assert.ok(t.shieldFunction(h1).equals(s1)); 53 | //sanity 54 | assert.ok(!s0.equals(s1)); 55 | }); 56 | 57 | it("Twists missing shield are not allowed to access the cache", async function () { 58 | const p = new ArbitraryPacket(utf8ToBytes("some shieldy shield")); 59 | const tb = new TwistBuilder(); 60 | tb.setShield(p); 61 | const t = tb.twist(); 62 | const h = Sha256.fromHex("4170ba33708cbfb103f1a8e34afef333ba7dc021022b2d9aaa583aabb8058d8d67"); 63 | t.shieldFunction(h); 64 | 65 | const bp = new BasicBodyPacket(new NullHash(), 66 | new NullHash(), 67 | new NullHash(), 68 | new NullHash(), 69 | new NullHash(), 70 | t.getShieldHash()); 71 | const bh = Sha256.fromPacket(bp); 72 | const tp = new BasicTwistPacket(bh, new NullHash()); 73 | const th = Sha256.fromPacket(tp); 74 | const atoms = new Atoms(); 75 | atoms.set(bh, bp); 76 | atoms.set(th, tp); 77 | atoms.focus = th; 78 | const t2 = new Twist(atoms); 79 | assert.throws(() => t2.shieldFunction(h), MissingHashPacketError); 80 | }); 81 | }); 82 | -------------------------------------------------------------------------------- /src/abject/todaize.js: -------------------------------------------------------------------------------- 1 | /************************************************************* 2 | * TODAQ Open: TODA File Implementation 3 | * Toronto 2022 4 | * 5 | * Apache License 2.0 6 | *************************************************************/ 7 | 8 | import { DI, DIAssetClassClass, AssetClassField } from './di.js'; 9 | 10 | import { SimpleRigged } from './actionable.js'; 11 | import { P1String, P1Float } from './primitive.js'; 12 | import { ArbitraryPacket } from '../core/packet.js'; 13 | 14 | /** 15 | * Creates a todaized file 16 | * 17 | * @param byteArray representing the data 18 | * that will be included in the payload 19 | * @param popTopHash the pop top that this abject will be tethered to 20 | * @param opts Containing the following params: 21 | * @param fileName a string representing the name of the file 22 | * @param description a string describing the file 23 | * @param timeCreated a string (in ISO 8601 format) 24 | * representing the time this file was created 25 | * @param timeModified a string (in ISO 8601 format) 26 | * representing the time this file was last modified 27 | * @returns the todaized SimpleRigged abject 28 | */ 29 | function todaize(byteArray, 30 | popTopHash, 31 | opts = {}) { 32 | let packet = new ArbitraryPacket(byteArray); 33 | let x = new DI(); 34 | x.setAssetClass(Todaized); 35 | x.setField(Todaized.fieldSyms.fFileContent, packet); 36 | x.setFieldAbject(Todaized.fieldSyms.fFileSize, 37 | new P1Float(byteArray.length)); 38 | if (opts.fileName) { 39 | x.setFieldAbject(Todaized.fieldSyms.fFileName, 40 | new P1String(opts.fileName)); 41 | } 42 | if (opts.timeCreated) { 43 | x.setFieldAbject(Todaized.fieldSyms.fFileCreated, 44 | new P1String(opts.timeCreated)); 45 | } 46 | if (opts.timeModified) { 47 | x.setFieldAbject(Todaized.fieldSyms.fFileModified, 48 | new P1String(opts.timeModified)); 49 | } 50 | if (opts.description) { 51 | x.setFieldAbject(Todaized.fieldSyms.fFileDescr, 52 | new P1String(opts.description)); 53 | } 54 | let sr = new SimpleRigged(); 55 | sr.setContext(x); 56 | sr.setPopTop(popTopHash); 57 | return sr; 58 | } 59 | 60 | let fFileName = new AssetClassField(); 61 | fFileName.consolidation = DI.consolidations.lastWriteWins; 62 | fFileName.type = P1String.interpreter; 63 | fFileName.required = false; 64 | 65 | let fFileSize = new AssetClassField(); 66 | fFileSize.consolidation = DI.consolidations.firstWriteWins; 67 | fFileSize.type = P1Float.interpreter; 68 | fFileSize.required = false; 69 | 70 | let fFileDescr = new AssetClassField(); 71 | fFileDescr.consolidation = DI.consolidations.lastWriteWins; 72 | fFileDescr.type = P1String.interpreter; 73 | fFileDescr.required = false; 74 | 75 | let fFileContent = new AssetClassField(); 76 | fFileDescr.consolidation = DI.consolidations.firstWriteWins; 77 | fFileDescr.required = true; 78 | 79 | let fFileCreated = new AssetClassField(); 80 | fFileCreated.consolidation = DI.consolidations.firstWriteWins; 81 | fFileCreated.type = P1String.interpreter; 82 | fFileCreated.required = false; 83 | 84 | let fFileModified = new AssetClassField(); 85 | fFileModified.consolidation = DI.consolidations.firstWriteWins; 86 | fFileModified.type = P1String.interpreter; 87 | fFileModified.required = false; 88 | 89 | var Todaized = new DIAssetClassClass(); 90 | Todaized.fieldSyms = {fFileName: DI.gensym('todaized/field/fFileName'), 91 | fFileSize: DI.gensym('todaized/field/fFileSize'), 92 | fFileDescr: DI.gensym('todaized/field/fFileDescr'), 93 | fFileContent: DI.gensym('todaized/field/fFileContent'), 94 | fFileCreated: DI.gensym('todaized/field/fFileCreated'), 95 | fFileModified: DI.gensym('todaized/field/fFileModified')}; 96 | 97 | Todaized.addACField(Todaized.fieldSyms.fFileName, fFileName); 98 | Todaized.addACField(Todaized.fieldSyms.fFileSize, fFileSize); 99 | Todaized.addACField(Todaized.fieldSyms.fFileDescr, fFileDescr); 100 | Todaized.addACField(Todaized.fieldSyms.fFileContent, fFileContent); 101 | Todaized.addACField(Todaized.fieldSyms.fFileCreated, fFileCreated); 102 | Todaized.addACField(Todaized.fieldSyms.fFileModified, fFileModified); 103 | 104 | export { Todaized }; 105 | export { todaize }; 106 | -------------------------------------------------------------------------------- /test/abject/primitive_test.js: -------------------------------------------------------------------------------- 1 | import { P1String, P1Float, P1Date, P1Boolean } from "../../src/abject/primitive.js"; 2 | import { Abject } from "../../src/abject/abject.js"; 3 | import { Sha256 } from "../../src/core/hash.js"; 4 | import assert from 'node:assert/strict'; 5 | 6 | // TODO(acg): A lot of edge-testing with various AbjectErrors, etc. 7 | 8 | describe("P1String", () => { 9 | it("can be created", () => { 10 | let p1s = new P1String("introduction to the calculus of variations"); 11 | let atoms = p1s.serialize(Sha256); 12 | assert.equal(atoms.toPairs().length, 2); 13 | 14 | // we expect two atoms. One containing the raw utf8 string 15 | // above, and one containing a trie with [x] entries: the 16 | // interpreter, and a reference to the string packet. 17 | 18 | // XX(acg): these are more testing Abject internals: 19 | let keys = [...atoms.keys()]; 20 | let triePacket = atoms.get(keys[1]).getShapedValue(); 21 | // TODO: massage this test: the triePacket Map keys aren't object-pointer equal any more, but they are serialized equal... 22 | // assert.equal(triePacket.get(Abject.NULL), P1String.interpreter); 23 | // assert.equal(triePacket.get(Primitive.fieldSyms.value), keys[0]); 24 | assert.equal(triePacket.size, 2); 25 | 26 | assert.equal(Buffer.from(atoms.get(keys[0]).getShapedValue()).toString(), 27 | "introduction to the calculus of variations"); 28 | }); 29 | 30 | it("can be read", () => { 31 | let p1s = new P1String("introduction to the calculus of variations"); 32 | let atoms = p1s.serialize(Sha256); 33 | assert.equal(Abject.parse(atoms), "introduction to the calculus of variations"); 34 | 35 | }); 36 | 37 | it("handles unicode", () => { 38 | const str = "🈚️🍶♉️⛈🌐😢💋🔙🏯♨️☁️🤘📖🍮➕😌🏚🕯🔌🙃" 39 | let p1s = new P1String(str); 40 | let atoms = p1s.serialize(Sha256); 41 | assert.equal(Abject.parse(atoms), str); 42 | }); 43 | 44 | it("confirms ascii strings from old charCodeAt method are compatible with TextDecoder", ()=> { 45 | const str = "Hello, I am a basic ascii string with all code points smaller than 127" 46 | 47 | // encode string using old encoder 48 | const enc = new Uint8Array(str.split("").map(x => x.charCodeAt())); 49 | 50 | // decode using current decoder 51 | const dec = new TextDecoder("utf-8").decode(enc); 52 | 53 | assert.equal(str, dec); 54 | }); 55 | }); 56 | 57 | describe("P1Float", () => { 58 | 59 | it("integers work", () => { 60 | let p1n = new P1Float(42); 61 | let atoms = p1n.serialize(Sha256); 62 | assert.equal(atoms.toPairs().length, 2); 63 | 64 | // we expect two atoms. One containing the raw ieee num 65 | // above, and one containing a trie with [x] entries: the 66 | // interpreter, and a reference to the num packet 67 | 68 | // XX(acg): these are more testing Abject internals: 69 | let keys = [...atoms.keys()]; 70 | let triePacket = atoms.get(keys[1]).getShapedValue(); 71 | // TODO: massage this test: the triePacket Map keys aren't object-pointer equal any more, but they are serialized equal... 72 | // assert.equal(triePacket.get(Abject.NULL), P1Float.interpreter); 73 | // assert.equal(triePacket.get(Primitive.fieldSyms.value), keys[0]); 74 | assert.equal(triePacket.size, 2); 75 | 76 | assert.equal(Abject.parse(atoms), 42); 77 | 78 | atoms = new P1Float(-42).serialize(Sha256); 79 | assert.equal(Abject.parse(atoms), -42); 80 | 81 | }); 82 | 83 | it("handles floats", () => { 84 | let atoms = new P1Float(3.14159/3).serialize(Sha256); 85 | assert.equal(Abject.parse(atoms), 3.14159/3); 86 | 87 | atoms = new P1Float(6.023e-23).serialize(Sha256); 88 | assert.equal(Abject.parse(atoms), 6.023e-23); 89 | }); 90 | 91 | }); 92 | 93 | describe("P1Date", () => { 94 | 95 | it("dates work", () => { 96 | let now = new Date(); 97 | let p1d = new P1Date(now); 98 | let atoms = p1d.serialize(Sha256); 99 | assert.equal(atoms.toPairs().length, 2); 100 | 101 | assert.equal(Abject.parse(atoms).getTime(), now.getTime()); 102 | }); 103 | 104 | }); 105 | 106 | describe("P1Boolean", () => { 107 | 108 | it("bools work", () => { 109 | let atoms = new P1Boolean(true).serialize(Sha256); 110 | assert.equal(atoms.toPairs().length, 2); 111 | assert.equal(Abject.parse(atoms), true); 112 | 113 | atoms = new P1Boolean(false).serialize(Sha256); 114 | assert.equal(atoms.toPairs().length, 2); 115 | assert.equal(Abject.parse(atoms), false); 116 | }); 117 | 118 | }); 119 | -------------------------------------------------------------------------------- /src/abject/primitive.js: -------------------------------------------------------------------------------- 1 | /************************************************************* 2 | * TODAQ Open: TODA File Implementation 3 | * Toronto 2022 4 | * 5 | * Apache License 2.0 6 | *************************************************************/ 7 | 8 | import { utf8ToBytes, bytesToUtf8 } from '../core/byteUtil.js'; 9 | import { ArbitraryPacket } from '../core/packet.js'; 10 | 11 | import { Abject, AbjectError, AbjectAtomMissingError } from './abject.js'; 12 | import { Hash } from '../core/hash.js'; 13 | 14 | class PrimitiveError extends AbjectError {} 15 | class PrimitiveFieldMissingError extends PrimitiveError { 16 | constructor(atoms, field) { 17 | super(atoms); 18 | this.missingField = field; 19 | } 20 | } 21 | 22 | class Primitive extends Abject { 23 | static fieldSyms = { 24 | value: Hash.fromHex("22882f98c8f0396585a5a040258ee7af1fa658b12b323747207a634bfee62b7095") 25 | }; 26 | 27 | value() { 28 | return this.constructor.parsePrimitive( 29 | this.getField(Primitive.fieldSyms.value)); 30 | } 31 | 32 | setPrimitiveValue(valuePacket) { 33 | this.setField(Primitive.fieldSyms.value, valuePacket); 34 | } 35 | 36 | static parse(atoms, focus) { 37 | 38 | let cargo; //slighty duplicated.. we could put pass the focusPacket 39 | if (focus) { 40 | cargo = atoms.get(focus); 41 | } else { 42 | // cargo = atoms.lastPacket(); 43 | cargo = atoms.get(atoms.focus); 44 | } 45 | 46 | let primitiveValueHash = cargo.get(this.fieldSyms.value); 47 | if (!primitiveValueHash) { 48 | throw new PrimitiveFieldMissingError(atoms, 49 | Primitive.fieldSyms.value); 50 | } 51 | 52 | let primitiveValue = atoms.get(primitiveValueHash); 53 | if (!primitiveValue) { 54 | throw new AbjectAtomMissingError(atoms, 55 | primitiveValueHash, 56 | [Primitive.fieldSyms.value]); 57 | } 58 | 59 | return this.parsePrimitive(primitiveValue, atoms); 60 | } 61 | } 62 | 63 | /** 64 | * Primitive UTF8-encoded string 65 | */ 66 | class P1String extends Primitive { 67 | static interpreter = Hash.fromHex("22afcfeed9b1c0a28ed7d197f23e7d33272bdb562aa8d9ccf151b8f9767ca09032"); 68 | 69 | /** 70 | * @param str 71 | */ 72 | constructor(str) { 73 | super(); 74 | this.setPrimitiveValue(new ArbitraryPacket(utf8ToBytes(str))); 75 | } 76 | 77 | /** 78 | * @param value 79 | * @return 80 | */ 81 | static parsePrimitive(value) { 82 | return bytesToUtf8(value.getShapedValue()); 83 | } 84 | } 85 | 86 | /** 87 | * Primitive IEEE 754-encoded number 88 | */ 89 | class P1Float extends Primitive { 90 | static interpreter = Hash.fromHex("22f2781cc0020c300c84c3b9bfbe38ceb8949f2c1ced61e29f25c90ff853eb83e4"); 91 | 92 | /** 93 | * @param num 94 | */ 95 | constructor(num) { 96 | super(); 97 | let dv = new DataView(new ArrayBuffer(8)); 98 | dv.setFloat64(0, num); 99 | this.setPrimitiveValue(new ArbitraryPacket(new Uint8Array(dv.buffer))); 100 | // TODO: ensure this is not NaN or Infinity or -Infinity 101 | } 102 | 103 | /** 104 | * @param value 105 | * @return 106 | */ 107 | static parsePrimitive(value) { 108 | // TODO: ensure this is not NaN or Infinity or -Infinity 109 | const sv = value.getShapedValue(); 110 | return new DataView(sv.buffer.slice(sv.byteOffset, sv.byteLength + sv.byteOffset)).getFloat64(0); 111 | } 112 | } 113 | 114 | /** 115 | * Primitive IEEE 8601-encoded date 116 | */ 117 | class P1Date extends Primitive { 118 | static interpreter = this.gensym("val/date"); 119 | 120 | /** 121 | * @param date 122 | */ 123 | constructor(date) { 124 | super(); 125 | this.setPrimitiveValue(new ArbitraryPacket( 126 | utf8ToBytes(date.toISOString()))); 127 | } 128 | 129 | /** 130 | * @param value bytes for iso8601 date 131 | * @return 132 | */ 133 | static parsePrimitive(value) { 134 | return new Date(Date.parse(P1String.parsePrimitive(value))); 135 | } 136 | } 137 | 138 | /** 139 | * Primitive boolean value 140 | */ 141 | class P1Boolean extends Primitive { 142 | static interpreter = Hash.fromHex("2209b7efb95a393d9ee01f6446f362e5cf56d5eee55b00e6118db367e28c6a945e"); 143 | 144 | /** 145 | * @param truthVal 146 | */ 147 | constructor(truthVal) { 148 | super(); 149 | this.setPrimitiveValue(new ArbitraryPacket( 150 | new Uint8Array([truthVal? 1 : 0]))); 151 | } 152 | 153 | /** 154 | * @param value 155 | * @return 156 | */ 157 | static parsePrimitive(value) { 158 | // TODO: any values other than 0x00 and 0x01 will be errors. 159 | return !value.getShapedValue()[0] == 0; 160 | } 161 | 162 | isFalse() { 163 | return !this.isTrue(); 164 | } 165 | 166 | isTrue() { 167 | return this.value(); 168 | } 169 | } 170 | 171 | Abject.registerInterpreter(P1String); 172 | Abject.registerInterpreter(P1Float); 173 | Abject.registerInterpreter(P1Date); 174 | Abject.registerInterpreter(P1Boolean); 175 | 176 | export { Primitive }; 177 | export { P1String }; 178 | export { P1Float }; 179 | export { P1Date }; 180 | export { P1Boolean }; 181 | -------------------------------------------------------------------------------- /src/core/atoms.js: -------------------------------------------------------------------------------- 1 | /************************************************************* 2 | * TODAQ Open: TODA File Implementation 3 | * Toronto 2022 4 | * 5 | * Apache License 2.0 6 | *************************************************************/ 7 | 8 | import { Hash } from './hash.js'; 9 | import { Packet } from './packet.js'; 10 | 11 | /** 12 | * Adds helpful utilities when using HashMap as HashMap 13 | */ 14 | class Atoms { 15 | 16 | static _packets = {}; 17 | 18 | hashes = {}; 19 | _focus = null; // dx: think: hash or string? what about list? 20 | // maybe it's a list of hashes? then we don't need Atoms.hashes? ... 21 | 22 | static fromAtoms(...listOfAtoms) { 23 | let atoms = new Atoms(); 24 | let args = listOfAtoms.map(a => a.hashes); 25 | args.unshift(atoms.hashes); 26 | Object.assign.apply({}, args); 27 | atoms._focus = listOfAtoms[listOfAtoms.length-1]._focus; 28 | return atoms; 29 | } 30 | 31 | static fromPairs(pairs) { 32 | let atoms = new Atoms(); 33 | pairs.forEach(([h, p]) => atoms.set(h, p)); 34 | atoms.focus = pairs[pairs.length-1][0]; 35 | return atoms; 36 | } 37 | 38 | toPairs(focus) { 39 | // dx: perf: keep pairs as a cached structure 40 | // internally once focus is removed 41 | let pairs = []; 42 | let fh = focus+""; 43 | 44 | for (var h in this.hashes) { 45 | if (h !== fh) { 46 | pairs.push([this.hashes[h], Atoms._getFromCache(h)]); 47 | } 48 | } 49 | 50 | if (this.hashes[fh]) { 51 | pairs.push([this.hashes[fh], Atoms._getFromCache(fh)]); 52 | } 53 | 54 | return pairs; 55 | } 56 | 57 | keys() { 58 | // dx: todo: delete this function? 59 | // it's only used three places, and two are tests 60 | return Object.values(this.hashes); 61 | } 62 | 63 | set focus(hash) { 64 | let h = hash.toString(); 65 | this.hashes[h] = hash; 66 | this._focus = h; 67 | } 68 | 69 | get focus() { 70 | return this.hashes[this._focus]; 71 | } 72 | 73 | /** 74 | * @param {Hash} hash 75 | * @param {Packet} packet 76 | * @returns {void} 77 | * @throws things 78 | **/ 79 | set(hash, packet) { 80 | if (!packet) { 81 | throw new Error("Cannot set null packet"); 82 | } 83 | 84 | let h = hash.toString(); 85 | if (!h) { 86 | throw new Error("Cannot set an undefined hash"); 87 | } 88 | 89 | Atoms._addToCache(hash, h, packet); 90 | 91 | this.hashes[h] = hash; 92 | return this; 93 | } 94 | 95 | static _addToCache(hash, hashHex, packet) { 96 | if (!Object.prototype.hasOwnProperty.call(Atoms._packets, hashHex)) { 97 | // dx: think: could throw if packet != p already... 98 | // but then we'd have to do an expensive equality check every time 99 | hash.assertVerifiesPacket(packet); // throws 100 | Atoms._packets[hashHex] = packet; 101 | } 102 | } 103 | 104 | static _getFromCache(hashHex) { 105 | return Atoms._packets[hashHex]; 106 | } 107 | 108 | get(hash) { 109 | if (!hash) { 110 | return undefined; 111 | } 112 | let h = hash.toString(); 113 | if (this.hashes[h]) { 114 | return Atoms._getFromCache(h); 115 | } 116 | return null; 117 | } 118 | 119 | mergeNOFOCUS(atoms) { 120 | // dx: todo: this is very silly, remove this whole 121 | // function once focus is removed 122 | this.hashes = {...this.hashes, ...atoms.hashes}; 123 | } 124 | 125 | merge(atoms) { 126 | Object.assign(this.hashes, atoms.hashes); 127 | this._focus = atoms._focus; 128 | } 129 | 130 | toBytes(focus) { 131 | // dx: todo: remove the || once we lose focus 132 | focus = focus || this._focus; 133 | let a = this.toPairs(focus); 134 | 135 | let len = a.reduce((acc, [h,p]) => 136 | acc + h.numBytes() + p.getLength(), 0); 137 | let ret = new Uint8Array(len); 138 | let off = 0; 139 | a.forEach(([h, p]) => { 140 | ret.set(h.toBytes(), off); 141 | off += h.toBytes().byteLength; 142 | ret.set(p.toBytes(), off); 143 | off += p.getLength(); 144 | }); 145 | return ret; 146 | } 147 | 148 | /** 149 | * @param {Buffer|Uint8Array} bytes 150 | * @returns {Atoms} 151 | **/ 152 | static fromBytes(bytes) { 153 | bytes = new Uint8Array(bytes); 154 | let atoms = new Atoms(); 155 | let lasthash; 156 | let i = 0, bl = bytes.length; 157 | 158 | while (i < bl) { 159 | let hash = Hash.parse(bytes, i); 160 | i += hash.numBytes(); 161 | let h = hash.toString(); 162 | let packet = Atoms._getFromCache(h); 163 | 164 | if (!packet) { 165 | packet = Packet.parse(bytes, i); 166 | Atoms._addToCache(hash, h, packet); 167 | } else { 168 | //todo(dx): make sure the bytes match... how is this not tested? 169 | } 170 | 171 | i += packet.getLength(); 172 | atoms.hashes[h] = hash; 173 | lasthash = hash; 174 | } 175 | 176 | atoms.focus = lasthash; 177 | return atoms; 178 | } 179 | } 180 | 181 | export { Atoms }; 182 | -------------------------------------------------------------------------------- /test/client/relay_server.js: -------------------------------------------------------------------------------- 1 | import express from "express"; 2 | import { PairTriePacket } from "../../src/core/packet.js"; 3 | import { HashMap } from "../../src/core/map.js"; 4 | import axios from "axios"; 5 | import { LocalRelayClient } from "../../src/client/relay.js"; 6 | import { Hash } from "../../src/core/hash.js"; 7 | 8 | class TestRelayServer { 9 | constructor(toda, config = {}) { 10 | const CONFIG_DEFAULTS = { 11 | maxFileSize: "100kb", 12 | fileServerRedirects: [] 13 | }; 14 | config = { 15 | ...CONFIG_DEFAULTS, 16 | ...config 17 | }; 18 | 19 | this.toda = toda; 20 | this.shims = {}; 21 | this.config = config; 22 | this.requestLogs = []; 23 | this._configureApp(toda, config, this.requestLogs, this.shims); 24 | } 25 | 26 | async _start(app, port) { 27 | let runningServer; 28 | return new Promise((res, rej) => { 29 | runningServer = app.listen(port, (err) => { 30 | if (err) { 31 | rej(err); 32 | } 33 | res(); 34 | }); 35 | }).then(() => runningServer); 36 | } 37 | 38 | async start() { 39 | this.server = await this._start(this.app, this.config.port); 40 | return this; 41 | } 42 | 43 | async stop() { 44 | await this.server.close(); 45 | } 46 | 47 | _configureApp(toda, config, requestLogs, shims) { 48 | const app = express(); 49 | app.use(express.json()); 50 | 51 | app.use((req, res, next) => { 52 | requestLogs.push(req.method + " " + req.url); 53 | next(); 54 | }); 55 | 56 | app.use(express.raw({ limit: config.maxFileSize })); 57 | 58 | async function redirect(file) { 59 | for (const url of config.fileServerRedirects) { 60 | const req = await axios({ 61 | method: "GET", 62 | url: file, 63 | baseURL: url, 64 | responseType: "arraybuffer" 65 | }).catch(r => r); 66 | if (req?.status == 200) { 67 | return req.data; 68 | } 69 | } 70 | return null; 71 | } 72 | 73 | async function findLocal(file) { 74 | const hex = file.substring(0, file.indexOf('.')); 75 | const ext = file.substring(file.indexOf('.')); 76 | const hash = Hash.fromHex(hex); 77 | const relay = new LocalRelayClient(toda, hash); 78 | if (ext == ".shield") { 79 | const shield = await relay._getShield(hash); 80 | if (!shield) { 81 | return null; 82 | } 83 | return Buffer.from(shield.toBytes()); 84 | } 85 | if (ext == ".next.toda") { 86 | // HACK: Force the population of the relay's cachedLine 87 | // If this is used in a production environment 88 | // it will be very expensive 89 | await relay._populateLine(); 90 | if (!relay.cachedLine) { 91 | return null; 92 | } 93 | const twist = await relay._getNext(hash); 94 | if (!twist) { 95 | return null; 96 | } 97 | return Buffer.from(twist.getAtoms().toBytes()); 98 | } 99 | return null; 100 | } 101 | 102 | app.get("/files/:file", async function (req, res, next) { 103 | try { 104 | const file = req.params.file; 105 | const b = await findLocal(file) ?? await redirect(file); 106 | if (b) { 107 | return res.status(200).send(b); 108 | } 109 | return res.status(404).send(); 110 | } catch (err) { 111 | return next(err); 112 | } 113 | }); 114 | 115 | app.get("/ticket/:hex", async function (req, res, next) { 116 | const hash = Hash.fromHex(req.params.hex); 117 | res.json({ 118 | itinerary: [ 119 | { 120 | twist: (await toda.get(hash)).prev().getHash(), 121 | url: "TODO", 122 | }, 123 | ], 124 | }); 125 | }); 126 | 127 | app.post("/hoist", async function (req, res, next) { 128 | if (shims.hoist) { 129 | const r = await shims.hoist(); 130 | return res.status(r).send(); 131 | } 132 | 133 | const hex = req.body["relay-twist"]; 134 | try { 135 | const hash = Hash.fromHex(hex); 136 | const quad = req.body["hoist-request"]; 137 | const hashes = new HashMap(); 138 | for (const [k, v] of Object.entries(quad)) { 139 | hashes.set(Hash.fromHex(k), Hash.fromHex(v)); 140 | } 141 | 142 | const updatedTwist = await toda.get(hash); 143 | const pairtrie = PairTriePacket.createFromUnsorted(hashes); 144 | // DON'T WAIT! 145 | toda.append(updatedTwist, 146 | updatedTwist.lastFast()?.getTetherHash(), 147 | null, 148 | null, 149 | () => {}, 150 | pairtrie); 151 | return res.status(204).send(); 152 | } catch (err) { 153 | return next(err); 154 | } 155 | }); 156 | 157 | app.use((err, req, res, next) => { 158 | console.error(err); 159 | return res.status(500); 160 | }); 161 | 162 | this.app = app; 163 | } 164 | } 165 | 166 | export { TestRelayServer }; 167 | -------------------------------------------------------------------------------- /test/client/requirements_test.js: -------------------------------------------------------------------------------- 1 | import { 2 | Interpreter 3 | } from "../../src/core/interpret.js"; 4 | 5 | import { Line } from "../../src/core/line.js"; 6 | import { SerialStore } from "../../src/core/store.js"; 7 | import { TodaClient, CannotSatisfyError } from "../../src/client/client.js"; 8 | import { SECP256r1 } from "../../src/client/secp256r1.js"; 9 | import { VirtualInventoryClient } from "../../src/client/inventory.js"; 10 | import { Twist } from "../../src/core/twist.js"; 11 | import assert from "assert"; 12 | import fs from "fs"; 13 | 14 | import path from "path"; 15 | import { fileURLToPath } from "url"; 16 | const __filename = fileURLToPath(import.meta.url); 17 | const __dirname = path.dirname(__filename); 18 | 19 | describe("setRequirements", () => { 20 | it("should set the requirements trie on the twistbuilder", async () => { 21 | let keyPair = await SECP256r1.generate(); 22 | let toda = new TodaClient(new VirtualInventoryClient()); 23 | await toda.populateInventory(); 24 | let x = await toda.create(null, keyPair); 25 | assert(SECP256r1.requirementTypeHash.equals(Array.from(x.reqs().getShapedValue().keys())[0])); 26 | 27 | }); 28 | // we can bring this back later. 29 | /* 30 | it("should throw an exception if the keys are not paired", async () => { 31 | let keyPair = await crypto.subtle.generateKey({name: "ECDSA", namedCurve: "P-256"}, 32 | true, 33 | ["sign", "verify"]); 34 | 35 | let keyPair2 = await crypto.subtle.generateKey({name: "ECDSA", namedCurve: "P-256"}, 36 | true, 37 | ["sign", "verify"]); 38 | 39 | let tb = new TwistBuilder(); 40 | await assert.rejects( 41 | async () => setRequirements(tb, keyPair.privateKey, { type: SignatureRequirement.REQ_SECP256r1, key: keyPair2.publicKey }), 42 | (err) => { 43 | assert.equal(err.exitCode, 1); 44 | assert.equal(err.reason, "WARN: The specified identity does not satisfy the specified requirements."); 45 | return true; 46 | }); 47 | });*/ 48 | }); 49 | 50 | describe("satisfyRequirements", () => { 51 | it("should set the satisfactions trie on the twistbuilder", async () => { 52 | let keyPair = await SECP256r1.generate(); 53 | let toda = new TodaClient(new VirtualInventoryClient()); 54 | await toda.populateInventory(); 55 | toda.addSatisfier(keyPair); 56 | 57 | let prev = await toda.create(null, keyPair); 58 | let next = await toda.append(prev); 59 | assert(SECP256r1.requirementTypeHash.equals(Array.from(next.sats().getShapedValue().keys())[0])); 60 | }); 61 | 62 | it("should throw an exception if a requirement cannot be met", async () => { 63 | let keyPair = await SECP256r1.generate(); 64 | let toda = new TodaClient(new VirtualInventoryClient()); 65 | await toda.populateInventory(); 66 | let prev = await toda.create(null, keyPair); 67 | 68 | await assert.rejects( 69 | () => toda.append(prev), 70 | (err) => { 71 | assert(err instanceof CannotSatisfyError); 72 | // test error names are being set correctly 73 | assert.equal(err.name, "CannotSatisfyError") 74 | return true; 75 | }); 76 | }); 77 | }); 78 | 79 | describe("Runs pickled secp256r1 tests (v1)", () => { 80 | let runPassTest = async (todaFile) => { 81 | const data = new Uint8Array(fs.readFileSync(todaFile)); 82 | let s = new SerialStore(data); 83 | let line = new Line(); 84 | await s.copyInto(line); 85 | let i = new Interpreter(line, undefined); 86 | 87 | let twist1 = Twist.fromBytes(data); 88 | let twist0 = twist1.prev(); 89 | 90 | return i._verifyLegit(twist0, twist1); 91 | }; 92 | 93 | let runThrowTest = async (todaFile, expectedErrorType) => { 94 | const data = new Uint8Array(fs.readFileSync(todaFile)); 95 | let s = new SerialStore(data); 96 | let line = new Line(); 97 | await s.copyInto(line); 98 | let i = new Interpreter(line, undefined); 99 | 100 | let twist1 = Twist.fromBytes(data); 101 | let twist0 = twist1.prev(); 102 | 103 | let err; 104 | try { 105 | await i.verifyLegit(twist0, twist1); 106 | await i.verifyCollectedReqSats(); 107 | } catch (e) { 108 | err = e; 109 | } 110 | if (err) { 111 | assert(err instanceof expectedErrorType); 112 | } else { 113 | assert(false, "expected error."); 114 | } 115 | }; 116 | 117 | it("green: satisfied sig", async() => { 118 | return runPassTest(`${__dirname}/../toda-tests/reqsat/secp256r1/green/satisfied_sig.toda`); 119 | }); 120 | 121 | it("yellow: sat missing", async() => { 122 | return runThrowTest(`${__dirname}/../toda-tests/reqsat/secp256r1/yellow/sat_missing.toda`, Error); 123 | }); 124 | 125 | it("yellow: req missing", async() => { 126 | return runThrowTest(`${__dirname}/../toda-tests/reqsat/secp256r1/yellow/req_missing.toda`, Error); 127 | }); 128 | 129 | it("red: req missing and sat not arb", async() => { 130 | return runThrowTest(`${__dirname}/../toda-tests/reqsat/secp256r1/red/req_missing_and_sat_not_arb.toda`, Error); 131 | }); 132 | 133 | it("red: req not arb", async() => { 134 | return runThrowTest(`${__dirname}/../toda-tests/reqsat/secp256r1/red/req_not_arb.toda`, Error); 135 | }); 136 | 137 | it("red: sat not arb", async() => { 138 | return runThrowTest(`${__dirname}/../toda-tests/reqsat/secp256r1/red/sat_not_arb.toda`, Error); 139 | }); 140 | 141 | it("red: signed over wrong hash", async() => { 142 | return runThrowTest(`${__dirname}/../toda-tests/reqsat/secp256r1/red/signed_over_wrong_hash.toda`, Error); 143 | }); 144 | 145 | it("red: wrong private key used", async() => { 146 | return runThrowTest(`${__dirname}/../toda-tests/reqsat/secp256r1/red/wrong_priv_key_used.toda`, Error); 147 | }); 148 | }); 149 | -------------------------------------------------------------------------------- /src/abject/simple-historic.js: -------------------------------------------------------------------------------- 1 | /************************************************************* 2 | * TODAQ Open: TODA File Implementation 3 | * Toronto 2022 4 | * 5 | * Apache License 2.0 6 | *************************************************************/ 7 | 8 | import { Hash } from '../core/hash.js'; 9 | 10 | import { Abject } from './abject.js'; 11 | import { Actionable } from './actionable.js'; 12 | import { HashMap } from '../core/map.js'; 13 | import { AssetClassField, DI, DIAssetClassClass } from './di.js'; 14 | import { P1String } from './primitive.js'; 15 | import { TwistBuilder } from '../core/twist.js'; 16 | 17 | //todo(mje): Presumably we need a way to set requirements on this 18 | class SimpleHistoric extends Abject { 19 | static interpreter = Hash.fromHex("22a79a7b8b0ee38c196cfefb263cc4a7310d801db8df332e31021267c8c30e1f7c"); 20 | 21 | constructor() { 22 | super(); 23 | this.twistHash = null; 24 | this.twistBuilder = new TwistBuilder(); 25 | } 26 | 27 | static fieldSyms = { 28 | timestamp: Hash.fromHex("22c7df9af32847a5425b1c9577fef55431732ca50889110b3e6ac9897a7e5583b4"), 29 | tetherUrl: Hash.fromHex("2260d93fcffc9b40a3beb1aee1e288fcabf39a46b0e8f2652812891d362c2bcc26"), 30 | thisUrl: Hash.fromHex("22a2ab56e06159160bc71471930b8351cdb2349d2e1558975a701cf851765d100f"), 31 | infoUrl: Hash.fromHex("22dfac92e85bb22a8c02afb90398b0ee159ce72c5a179b85370643950186826ce6"), 32 | moniker: Hash.fromHex("229f6c4ba9f5d85c850530d33e7c5482b5074a26d6849e00b7e346aa9425c6158d"), 33 | }; 34 | 35 | //todo(mje): For a super quick interpretation of 36 | // this line just read the di in the cargo of the last twist 37 | // So you can treat the whole line as one simple historic abject 38 | static parse(atoms, focusHash, cargoHash) { 39 | let x = new this(); 40 | x.atoms = atoms; 41 | x.data = new HashMap(atoms.get(cargoHash).getShapedValue()); 42 | x.twistHash = focusHash || atoms.focus; 43 | return x; 44 | } 45 | 46 | //todo(mje): HACK - Temporary fix to read 47 | // the focus correctly with `getHash()` 48 | getHash() { 49 | return this.twistHash ?? this.buildTwist().getHash(); 50 | } 51 | 52 | serialize(hashImp) { 53 | return this.buildTwist().serialize(hashImp); 54 | } 55 | 56 | getContext() { 57 | return this.getFieldAbject(Actionable.fieldSyms.context); 58 | } 59 | 60 | setContext(abject) { 61 | return this.setFieldAbject(Actionable.fieldSyms.context, abject); 62 | } 63 | 64 | buildTwist() { 65 | this.twistBuilder.atoms.merge(this.atoms); 66 | this.twistBuilder.data.merge(this.data); 67 | return this.twistBuilder; 68 | } 69 | 70 | createSuccessor() { 71 | let next = new this.constructor(); 72 | next.twistBuilder.setPrevHash(this.getHash()); 73 | next.addAtoms(this.serialize()); 74 | return next; 75 | } 76 | 77 | timestamp() { 78 | let c = this.getContext(); 79 | return c.getFieldAbject(SimpleHistoric.fieldSyms.timestamp); 80 | } 81 | 82 | tetherUrl() { 83 | let c = this.getContext(); 84 | return c.getFieldAbject(SimpleHistoric.fieldSyms.tetherUrl); 85 | } 86 | 87 | thisUrl() { 88 | let c = this.getContext(); 89 | return c.getFieldAbject(SimpleHistoric.fieldSyms.thisUrl); 90 | } 91 | 92 | infoUrl() { 93 | let c = this.getContext(); 94 | return c.getFieldAbject(SimpleHistoric.fieldSyms.infoUrl); 95 | } 96 | 97 | moniker() { 98 | let c = this.getContext(); 99 | return c.getFieldAbject(SimpleHistoric.fieldSyms.moniker); 100 | } 101 | 102 | set(timestamp, tetherUrl, thisUrl, infoUrl, moniker) { 103 | let context = new DI(); 104 | context.setAssetClass(SimpleHistoric.AC); 105 | context.setFieldAbject(SimpleHistoric.AC.fieldSyms.timestamp, 106 | new P1String(timestamp)); 107 | 108 | if (tetherUrl) { 109 | context.setFieldAbject(SimpleHistoric.AC.fieldSyms.tetherUrl, 110 | new P1String(tetherUrl)); 111 | } 112 | 113 | if (thisUrl) { 114 | context.setFieldAbject(SimpleHistoric.AC.fieldSyms.thisUrl, 115 | new P1String(thisUrl)); 116 | } 117 | 118 | if (infoUrl) { 119 | context.setFieldAbject(SimpleHistoric.AC.fieldSyms.infoUrl, 120 | new P1String(infoUrl)); 121 | } 122 | 123 | if (moniker) { 124 | context.setFieldAbject(SimpleHistoric.AC.fieldSyms.moniker, 125 | new P1String(moniker)); 126 | } 127 | 128 | this.setContext(context); 129 | } 130 | } 131 | 132 | Abject.registerInterpreter(SimpleHistoric); 133 | 134 | let fTimestamp = new AssetClassField(); 135 | fTimestamp.consolidation = DI.consolidations.lastWriteWins; 136 | fTimestamp.type = P1String.interpreter; 137 | fTimestamp.required = true; 138 | 139 | let fTetherUrl = new AssetClassField(); 140 | fTetherUrl.consolidation = DI.consolidations.lastWriteWins; 141 | fTetherUrl.type = P1String.interpreter; 142 | 143 | let fThisUrl = new AssetClassField(); 144 | fThisUrl.consolidation = DI.consolidations.lastWriteWins; 145 | fThisUrl.type = P1String.interpreter; 146 | 147 | let fInfoUrl = new AssetClassField(); 148 | fInfoUrl.consolidation = DI.consolidations.lastWriteWins; 149 | fInfoUrl.type = P1String.interpreter; 150 | 151 | let fMoniker = new AssetClassField(); 152 | fMoniker.consolidation = DI.consolidations.lastWriteWins; 153 | fMoniker.type = P1String.interpreter; 154 | 155 | SimpleHistoric.AC = new DIAssetClassClass(); 156 | SimpleHistoric.AC.fieldSyms = SimpleHistoric.fieldSyms; 157 | 158 | SimpleHistoric.AC.addACField(SimpleHistoric.AC.fieldSyms.timestamp, fTimestamp); 159 | SimpleHistoric.AC.addACField(SimpleHistoric.AC.fieldSyms.tetherUrl, fTetherUrl); 160 | SimpleHistoric.AC.addACField(SimpleHistoric.AC.fieldSyms.thisUrl, fThisUrl); 161 | SimpleHistoric.AC.addACField(SimpleHistoric.AC.fieldSyms.infoUrl, fInfoUrl); 162 | SimpleHistoric.AC.addACField(SimpleHistoric.AC.fieldSyms.moniker, fMoniker); 163 | 164 | export { SimpleHistoric }; 165 | -------------------------------------------------------------------------------- /docs/quickstart.md: -------------------------------------------------------------------------------- 1 | ## Quick Start Tutorial 2 | Please refer to our [CLI Docs](cli.md) for a more detailed walkthrough and examples. 3 | 4 | - Install with [npm](https://www.npmjs.com/): `npm install -g toda-js` 5 | - Requires node >= 16 LTS 6 | 7 | The first time you run a toda command a few files will be automatically generated: 8 | - A new keypair: `~/.toda/secure/id_secp256r1`, `~/.toda/secure/id_secp256r1` 9 | - A local line secured with your keypair and tethered to the TodaQ Fast Line: `~/.toda/store/line.toda` 10 | - A user config file: `~/.toda/config` 11 | 12 | ### Create a Twist 13 | - Generate a simple twist by running `toda create --empty` 14 | 15 | The hash of the twist will be displayed in the console. This twist will automatically be tethered to your local line (`TodaQ Fast Line`) and stored in the configured store (`~/.toda/store`) 16 | 17 | eg. 18 | ``` 19 | $ toda create --empty 20 | 4129f42cab09603b43d89d23778d99f00859601ae46dbba4cc80f44d3e263176d9 21 | ``` 22 | 23 | ### List Twists 24 | - Verify that our twist was created by running `toda list` 25 | ``` 26 | $ toda list 27 | 4129f42c [Twist] AIP 41d43078 [default] ✓ Local control 28 | 41d43078 [Twist] AIP 41d43078 [default] ✓ Local control 29 | ``` 30 | 31 | Notice that two twists appear - the twist we've created, `4129f42c`, and the hash of our local line, `41d43078`. 32 | 33 | 34 | #### Append to a Twist 35 | - Append to the Twist we just created with `toda append --prev 4129f42c --empty` 36 | ``` 37 | $ toda append --prev 4129f42c --empty 38 | Abject refreshed! 39 | >3e263176d9...............Material received [/Users/meverson/.toda/store/line.toda] 40 | >fea12ced43...............Material received [https://line.todaq.net/line] 41 | >48ddf57e56...............Reached AIP 42 | 43 | 44 | 416372b92f4814fbf541f7b1e330c118ca116c64faf75f50e6785a94164d8c5f30 45 | ``` 46 | 47 | Notice the logs indicating that control of the Twist has been verified before appending to it. If control of the Twist can't be verified the process will exit with an error code. 48 | 49 | ### View Twist History 50 | - We can view our Twist's history by running `toda history 416372` 51 | 52 | ``` 53 | $ toda history 416372 54 | twist 4129f42cab09603b43d89d23778d99f00859601ae46dbba4cc80f44d3e263176d9 55 | sats 00 56 | prev 00 57 | tether 41d430785b0a54750320b701021a5c657451bb268bb2f16ad4de8db9fea12ced43 58 | shield 00 59 | reqs 00 60 | rigging 00 61 | cargo 00 62 | 63 | twist 416372b92f4814fbf541f7b1e330c118ca116c64faf75f50e6785a94164d8c5f30 64 | sats 00 65 | prev 4129f42cab09603b43d89d23778d99f00859601ae46dbba4cc80f44d3e263176d9 66 | tether 41d430785b0a54750320b701021a5c657451bb268bb2f16ad4de8db9fea12ced43 67 | shield 00 68 | reqs 00 69 | rigging 00 70 | cargo 00 71 | ``` 72 | 73 | There are a few things to notice here: 74 | - There are two entries, one for each ancestor of this Twist, ordered from least to most recent. 75 | - The prev hash `4129f4` matches the original Twist we created, and also matches the first entry in this list. 76 | - The twist's tether hash `41d430` refers to our local line, as we saw above with `toda list`. 77 | 78 | ### Verify Control of a Twist 79 | - Verify control of a Twist by running `toda control 416372` 80 | 81 | ``` 82 | $ toda control 416372 83 | Abject refreshed! 84 | >3e263176d9...............Material received [/Users/meverson/.toda/store/line.toda] 85 | >fea12ced43...............Material received [https://line.todaq.net/line] 86 | >48ddf57e56...............Reached AIP 87 | 88 | 89 | 41d430785b0a54750320b701021a5c657451bb268bb2f16ad4de8db9fea12ced43 90 | The Local Line integrity has been verified. This system has control of this file as of 41208b960dd57e65659c59919dc8b46e0a0dae8c92830200ad7e0ea0760b6cbaf7 [2022-08-31T18:53:57.408041Z]. 91 | ``` 92 | 93 | There are a few things to notice here: 94 | - The latest proof information has been retrieved in order to verify control of the file. 95 | - A list of the twist's tethers is displayed 96 | - The latest hash on the topline for which we can verify control is displayed, along with its associated timestamp 97 | 98 | ### Transfer control of a file to another party 99 | - Append to the twist, setting the tether hash to that of another user's local line: 100 | ``` 101 | $ toda append --prev 416372 --tether 416d4e7a220a21a0142bebebbf73ae9fdd5d869387d0aea8c7762b283400e8a3bb 102 | Abject refreshed! 103 | >3e263176d9...............Material received [/Users/meverson/.toda/store/line.toda] 104 | >fea12ced43...............Material received [https://line.todaq.net/line] 105 | >48ddf57e56...............Reached AIP 106 | 107 | 108 | 416f050cdfbc9c21045c2fcd875fc074366f8540e53aeabdce3c61ea85a1ef6765 109 | ``` 110 | 111 | - Verify that we no longer have control of this Twist: 112 | ``` 113 | $ toda control 416f05 114 | Abject refreshed! 115 | >3e263176d9...............Material received [/Users/meverson/.toda/store/line.toda] 116 | >fea12ced43...............Material received [https://line.todaq.net/line] 117 | >48ddf57e56...............Reached AIP 118 | 119 | 120 | Unable to establish local control of this file (verifying controller) 121 | ``` 122 | 123 | - Send the file to the target user, either directly or by posting it to the configured inventory server: 124 | ``` 125 | $ toda post 416f05 126 | Posting to the inventory server... 127 | >85a1ef6765...............Material received [/Users/meverson/.toda/store/line.toda] 128 | >e23271f0cf...............Material received [https://line.todaq.net/line] 129 | >e9f6ab2ea6...............Reached AIP 130 | 131 | 132 | ✔ Successfully stored abject 85a1ef6765 on https://inventory.todaq.net 133 | ``` 134 | 135 | - Finally, the target user can download the file and verify that they now have control over it: 136 | ``` 137 | $ toda control 416372 138 | Abject refreshed! 139 | >3e263176d9...............Material received [/Users/meverson/.toda/store/line.toda] 140 | >fea12ced43...............Material received [https://line.todaq.net/line] 141 | >48ddf57e56...............Reached AIP 142 | 143 | 144 | 41d430785b0a54750320b701021a5c657451bb268bb2f16ad4de8db9fea12ced43 145 | The Local Line integrity has been verified. This system has control of this file as of 41208b960dd57e65659c59919dc8b46e0a0dae8c92830200ad7e0ea0760b6cbaf7 [2022-08-31T18:53:57.408041Z]. 146 | ``` 147 | --------------------------------------------------------------------------------