diff --git a/psf-memo-client/specs/mute-user.feature b/psf-memo-client/specs/mute-user.feature index b3a5c3f..36b1f8d 100644 --- a/psf-memo-client/specs/mute-user.feature +++ b/psf-memo-client/specs/mute-user.feature @@ -1,3 +1,7 @@ +# acceptance-mutation-manifest-begin +# {"version":1,"tested_at":"2026-08-29T03:40:05.260376914Z","feature_name":"Mute User","feature_path":"/home/trout/work/psf-memo/.worktrees/architect/psf-memo-client/specs/mute-user.feature","background_hash":"e1d5f81f1ed083ac6934c429ca3cb4a0f8d4dac44c2eaa45c0960920bde2c017","implementation_hash":"unknown","scenarios":[]} +# acceptance-mutation-manifest-end + # Scenarios: Mute User - 1, Mute User - 2, Mute User - 3, Mute User - 4, Mute User - 5 # # The mute/unmute OP_RETURN payload is the target's 20-byte hash160. diff --git a/psf-memo-client/src/services/memo-db.js b/psf-memo-client/src/services/memo-db.js index 0962c80..4d7727c 100644 --- a/psf-memo-client/src/services/memo-db.js +++ b/psf-memo-client/src/services/memo-db.js @@ -145,5 +145,5 @@ class MemoDb { export default MemoDb // mutate4javascript-manifest-begin -// {"version":1,"tested_at":"2026-08-28T18:23:08.799Z","module_hash":"c55696ecbf8f9c776dc025b308cefadf604950952002bc3a2f4a021f9c73085b","functions":[{"id":"func/MemoDb.constructor","name":"MemoDb.constructor","line":9,"end_line":11,"hash":"188825ae5983840d4e1a4df182966ef012297c336ea3b763c87ea1c384654279"},{"id":"func/MemoDb.getRecentProfiles","name":"MemoDb.getRecentProfiles","line":13,"end_line":15,"hash":"cb819c72881b70f719f964c607f64be70b40377297c738897eee495bcf6dff4d"},{"id":"func/MemoDb.getRecentPosts","name":"MemoDb.getRecentPosts","line":17,"end_line":19,"hash":"7c0fd29c2fdc67a27a05a190e2e4294a698a1fe5223d8017ca82c4f890c2d094"},{"id":"func/MemoDb.getProfile","name":"MemoDb.getProfile","line":21,"end_line":23,"hash":"6a250c7205799b40dbe97b8f17ddaee6eace8cb435b0561d9ff8f5eac93d2b20"},{"id":"func/MemoDb.getProfilePic","name":"MemoDb.getProfilePic","line":25,"end_line":27,"hash":"d61dd5aebce32ef28b69ad56f2f7108d6b5f333a4d94cd83f05f01a09fa8f1d7"},{"id":"func/MemoDb.getName","name":"MemoDb.getName","line":29,"end_line":31,"hash":"3f841735b93180c6aeeb14a563bb6d4eb0ca5d395fb960267c8896b06c1e85f3"},{"id":"func/MemoDb.getFollowState","name":"MemoDb.getFollowState","line":33,"end_line":49,"hash":"d62eb85c742b40f2d319230c6ef59e21738063d31bccf1f37ebdc52c20bac994"},{"id":"func/MemoDb.getTopics","name":"MemoDb.getTopics","line":51,"end_line":53,"hash":"8d392b8a4b1bef405a9872c2564c51d9343df7b1c628d016258ee1c165f713ef"},{"id":"func/MemoDb.getTopicPosts","name":"MemoDb.getTopicPosts","line":55,"end_line":57,"hash":"4cc1e13334b5b4a2b72942cbc5f3cce8493254628f7d51da33d7be9c60ef9ff7"},{"id":"func/MemoDb.getTopicFollowState","name":"MemoDb.getTopicFollowState","line":59,"end_line":72,"hash":"4f056870b5dee08dfffd7484f9d94cf1721297ffa4ea629dcc4208a8217b4d24"},{"id":"func/MemoDb.getTopicFollowers","name":"MemoDb.getTopicFollowers","line":74,"end_line":84,"hash":"65c9eff7e2afb949cc46b64f2091eed006d9b6800ca5aee6c7e8793ae13e3e94"},{"id":"func/MemoDb.getRecent","name":"MemoDb.getRecent","line":87,"end_line":98,"hash":"1565fd17dced45fbf1b6d6fd6b8003521129bbd88046ff52a4eb61c17862530d"},{"id":"func/MemoDb.getPage","name":"MemoDb.getPage","line":101,"end_line":112,"hash":"986ec43d7699d642b25a9f4627aa5420cc685a247c3caa4671797778bc84e3b5"},{"id":"func/MemoDb.getLevelResource","name":"MemoDb.getLevelResource","line":115,"end_line":128,"hash":"c2fb7338918b1e69aa8a14f65ae687532c843f0641f04074947731691001e4ea"},{"id":"func/MemoDb.getPostsByAddr","name":"MemoDb.getPostsByAddr","line":130,"end_line":132,"hash":"45bbfef12cd8e35da1d71299153b2e54304664d5e3191c497f105ba17b134431"},{"id":"func/MemoDb.getPostThread","name":"MemoDb.getPostThread","line":134,"end_line":145,"hash":"ed5ef157b457f8d984ff6a9488a4dccf7a37b0ae65adb40005df90508426661f"}]} +// {"version":1,"tested_at":"2026-08-29T03:07:44.409Z","module_hash":"f5be8c328e8a131cd5c2bb9170baf494dfaba0312d577cbf6d2d4b1c9b307bc7","functions":[{"id":"func/MemoDb.constructor","name":"MemoDb.constructor","line":9,"end_line":11,"hash":"188825ae5983840d4e1a4df182966ef012297c336ea3b763c87ea1c384654279"},{"id":"func/MemoDb.getRecentProfiles","name":"MemoDb.getRecentProfiles","line":13,"end_line":15,"hash":"cb819c72881b70f719f964c607f64be70b40377297c738897eee495bcf6dff4d"},{"id":"func/MemoDb.getRecentPosts","name":"MemoDb.getRecentPosts","line":17,"end_line":19,"hash":"7c0fd29c2fdc67a27a05a190e2e4294a698a1fe5223d8017ca82c4f890c2d094"},{"id":"func/MemoDb.getProfile","name":"MemoDb.getProfile","line":21,"end_line":23,"hash":"6a250c7205799b40dbe97b8f17ddaee6eace8cb435b0561d9ff8f5eac93d2b20"},{"id":"func/MemoDb.getProfilePic","name":"MemoDb.getProfilePic","line":25,"end_line":27,"hash":"d61dd5aebce32ef28b69ad56f2f7108d6b5f333a4d94cd83f05f01a09fa8f1d7"},{"id":"func/MemoDb.getName","name":"MemoDb.getName","line":29,"end_line":31,"hash":"3f841735b93180c6aeeb14a563bb6d4eb0ca5d395fb960267c8896b06c1e85f3"},{"id":"func/MemoDb.getFollowState","name":"MemoDb.getFollowState","line":33,"end_line":35,"hash":"a7e0ad2336b146a0748f43f14bbcb92aa8e2dbe784b205b27ca2ae2958954e76"},{"id":"func/MemoDb.getMuteState","name":"MemoDb.getMuteState","line":37,"end_line":39,"hash":"80dc5dd85911a4088b16f4a77ce076001226f8c55dc0ce259e3a3ad63e38576d"},{"id":"func/MemoDb.getMuted","name":"MemoDb.getMuted","line":41,"end_line":43,"hash":"79d8e81b255fcb50e8974a08e429ed3ec814bbac16726af71b4d33757e0d53fa"},{"id":"func/MemoDb.getTopics","name":"MemoDb.getTopics","line":45,"end_line":47,"hash":"8d392b8a4b1bef405a9872c2564c51d9343df7b1c628d016258ee1c165f713ef"},{"id":"func/MemoDb.getTopicPosts","name":"MemoDb.getTopicPosts","line":49,"end_line":51,"hash":"4cc1e13334b5b4a2b72942cbc5f3cce8493254628f7d51da33d7be9c60ef9ff7"},{"id":"func/MemoDb.getTopicFollowState","name":"MemoDb.getTopicFollowState","line":53,"end_line":55,"hash":"d943e39339d689a241251bdfc704b1d99b65ba463a37852afbfd2dad20070a95"},{"id":"func/MemoDb.getTopicFollowers","name":"MemoDb.getTopicFollowers","line":57,"end_line":59,"hash":"95c0f5dc416b2fe974150ba5d551cb81c11400ccffe0876d82ae68c52e23e9f1"},{"id":"func/MemoDb._getState","name":"MemoDb._getState","line":62,"end_line":70,"hash":"d1f571f2421e0c70795a5a12e381175c42b5d0b0c5db203ad852aeb218b40825"},{"id":"func/MemoDb._getList","name":"MemoDb._getList","line":73,"end_line":81,"hash":"11bb9f3afad183d5c37f662506d27c75e010364798f3d4b9646358165433a596"},{"id":"func/MemoDb.getRecent","name":"MemoDb.getRecent","line":84,"end_line":95,"hash":"1565fd17dced45fbf1b6d6fd6b8003521129bbd88046ff52a4eb61c17862530d"},{"id":"func/MemoDb.getPage","name":"MemoDb.getPage","line":98,"end_line":109,"hash":"986ec43d7699d642b25a9f4627aa5420cc685a247c3caa4671797778bc84e3b5"},{"id":"func/MemoDb.getLevelResource","name":"MemoDb.getLevelResource","line":112,"end_line":125,"hash":"c2fb7338918b1e69aa8a14f65ae687532c843f0641f04074947731691001e4ea"},{"id":"func/MemoDb.getPostsByAddr","name":"MemoDb.getPostsByAddr","line":127,"end_line":129,"hash":"45bbfef12cd8e35da1d71299153b2e54304664d5e3191c497f105ba17b134431"},{"id":"func/MemoDb.getPostThread","name":"MemoDb.getPostThread","line":131,"end_line":142,"hash":"ed5ef157b457f8d984ff6a9488a4dccf7a37b0ae65adb40005df90508426661f"}]} // mutate4javascript-manifest-end diff --git a/psf-memo-client/src/services/memo-mute.js b/psf-memo-client/src/services/memo-mute.js index 3d66b1b..892a796 100644 --- a/psf-memo-client/src/services/memo-mute.js +++ b/psf-memo-client/src/services/memo-mute.js @@ -114,3 +114,7 @@ MemoMute.MEMO_UNMUTE_PREFIX = MEMO_UNMUTE_PREFIX MemoMute.PK_HASH_LENGTH = PK_HASH_LENGTH module.exports = MemoMute + +// mutate4javascript-manifest-begin +// {"version":1,"tested_at":"2026-08-29T03:07:20.508Z","module_hash":"33469aed44ef4e9225a9ea952c5cd9335f46a0b1c1298525b3fd51ae2f77f817","functions":[{"id":"func/MemoMute.constructor","name":"MemoMute.constructor","line":35,"end_line":38,"hash":"9407b43605444074011b1da595c9d53356352c72b0d847e00365d79ad705663a"},{"id":"func/MemoMute.validate","name":"MemoMute.validate","line":42,"end_line":57,"hash":"4154af442c36324ba147dff352c55610397fb430c9b62fbbe44728ab0e379179"},{"id":"func/MemoMute.mute","name":"MemoMute.mute","line":60,"end_line":62,"hash":"60306e96a5b6ef4bac8cf3fc516785880b2ccab835730019bbd4b9bbfa27e464"},{"id":"func/MemoMute.unmute","name":"MemoMute.unmute","line":65,"end_line":67,"hash":"f6476de3d8b62b3f5e864dc83d005452bc9842d9accfed2c64f57082e0fec7b3"},{"id":"func/MemoMute._broadcastAction","name":"MemoMute._broadcastAction","line":70,"end_line":88,"hash":"05f7860e1db59b7611027186c859d790f8d8c74b150daf3b687a8c9dc453f751"},{"id":"func/MemoMute._toHash160","name":"MemoMute._toHash160","line":92,"end_line":94,"hash":"3ed2ba4853b718a8316345c9f988ed3bed3ef647de3fd9761ee3c9e0bee86070"},{"id":"func/MemoMute._ensureBchjs","name":"MemoMute._ensureBchjs","line":96,"end_line":100,"hash":"92828d9038c9a4d367e80edd7f129291e434d57aae80b332081a66af9896a5d6"},{"id":"func/MemoMute.reflect","name":"MemoMute.reflect","line":104,"end_line":109,"hash":"6053ec62558bbc19bd5e55b19541a6fe5cde28fe6fbf7c4eede209652e835bc4"}]} +// mutate4javascript-manifest-end diff --git a/psf-memo-client/src/services/profile-page.js b/psf-memo-client/src/services/profile-page.js index 986c12e..c46b909 100644 --- a/psf-memo-client/src/services/profile-page.js +++ b/psf-memo-client/src/services/profile-page.js @@ -130,5 +130,5 @@ ProfilePage.PROFILE_PATH_PREFIX = PROFILE_PATH_PREFIX module.exports = ProfilePage // mutate4javascript-manifest-begin -// {"version":1,"tested_at":"2026-08-27T17:52:10.673Z","module_hash":"556ad5297067de3e39ddbb028a87d502cc0a9ab6525b1bba2c3d36c669207e1d","functions":[{"id":"func/ProfilePage.constructor","name":"ProfilePage.constructor","line":17,"end_line":25,"hash":"5e8bd826d8059e2d86aa3064c7b7d3041d5cf2fff7eb8942976bda600d2812a2"},{"id":"func/ProfilePage.load","name":"ProfilePage.load","line":27,"end_line":41,"hash":"e6c81ab6dbfda80903b134bdfea626d7e82e567780fd577d7a78e6dd44a22f37"},{"id":"func/ProfilePage._assertReady","name":"ProfilePage._assertReady","line":44,"end_line":51,"hash":"e575f98fa1b492b4c11ae5275459d9f9996df4c566b84c7cae91413c72a02f38"},{"id":"func/ProfilePage._loadFollowState","name":"ProfilePage._loadFollowState","line":55,"end_line":60,"hash":"65ff871041cab36b5e45acad5c8ca904c411af197f77dbb528e31ac5666668b3"},{"id":"func/ProfilePage.isOwnProfile","name":"ProfilePage.isOwnProfile","line":62,"end_line":64,"hash":"4d149bfe7b183b5d38d496c0a8126d22bd9a919e684f375d66e2c8c1348dd773"},{"id":"func/ProfilePage.canFollow","name":"ProfilePage.canFollow","line":66,"end_line":68,"hash":"0bc2c0c17991d8f1a1d18fba29c901e42633b7cf2c2c8b5747a49e5832d7001d"},{"id":"func/ProfilePage.isFollowing","name":"ProfilePage.isFollowing","line":70,"end_line":72,"hash":"9fc0470db7ffea2da96d2dbbdceff55562e1f7e84377fbb0e8b60d53cc723b40"},{"id":"func/ProfilePage.follow","name":"ProfilePage.follow","line":74,"end_line":76,"hash":"7674b789a9d3c48e0f7a6e553613bac99b2f38449fcdd17faa3c6d7cd2773bdd"},{"id":"func/ProfilePage.unfollow","name":"ProfilePage.unfollow","line":78,"end_line":80,"hash":"69d278b09da1f284be6adacb7264f9c06ac71c42f8e8f1baf9e34d5b24a891fb"},{"id":"func/ProfilePage._setFollowState","name":"ProfilePage._setFollowState","line":83,"end_line":90,"hash":"8eda1a436468b17327e8e20df4f84bf0263591f320c494f2c74c1b5be21b2ad8"},{"id":"func/ProfilePage.getPost","name":"ProfilePage.getPost","line":92,"end_line":94,"hash":"1a6ae1a02b0f79b5b62a2b2324a5f1edbd743bec004fe73cfef7970bead56885"}]} +// {"version":1,"tested_at":"2026-08-29T03:10:07.663Z","module_hash":"be54fde7e97be7c83df6680f33b31151f5f2f91835ba404705c988c0baa84e6a","functions":[{"id":"func/ProfilePage.constructor","name":"ProfilePage.constructor","line":17,"end_line":27,"hash":"2a9265aa29bd66a11c2a627ecad5149b093f53b0892b848bef09ac2b949a2ee2"},{"id":"func/ProfilePage.load","name":"ProfilePage.load","line":29,"end_line":45,"hash":"c57316a8a92684b9506f340122361f69a7361f0190c4e8a0e7816a11de2db089"},{"id":"func/ProfilePage._assertReady","name":"ProfilePage._assertReady","line":48,"end_line":55,"hash":"e575f98fa1b492b4c11ae5275459d9f9996df4c566b84c7cae91413c72a02f38"},{"id":"func/ProfilePage._loadState","name":"ProfilePage._loadState","line":59,"end_line":64,"hash":"ab0376720ac75e6fd66d437fbb47a53176d76f681cb13b8794249f2a586549e8"},{"id":"func/ProfilePage.isOwnProfile","name":"ProfilePage.isOwnProfile","line":66,"end_line":68,"hash":"4d149bfe7b183b5d38d496c0a8126d22bd9a919e684f375d66e2c8c1348dd773"},{"id":"func/ProfilePage.canFollow","name":"ProfilePage.canFollow","line":70,"end_line":72,"hash":"0bc2c0c17991d8f1a1d18fba29c901e42633b7cf2c2c8b5747a49e5832d7001d"},{"id":"func/ProfilePage.isFollowing","name":"ProfilePage.isFollowing","line":74,"end_line":76,"hash":"9fc0470db7ffea2da96d2dbbdceff55562e1f7e84377fbb0e8b60d53cc723b40"},{"id":"func/ProfilePage.follow","name":"ProfilePage.follow","line":78,"end_line":80,"hash":"7674b789a9d3c48e0f7a6e553613bac99b2f38449fcdd17faa3c6d7cd2773bdd"},{"id":"func/ProfilePage.unfollow","name":"ProfilePage.unfollow","line":82,"end_line":84,"hash":"69d278b09da1f284be6adacb7264f9c06ac71c42f8e8f1baf9e34d5b24a891fb"},{"id":"func/ProfilePage._setFollowState","name":"ProfilePage._setFollowState","line":87,"end_line":89,"hash":"6cd937862bd6bf18d63fe767724b02ca23d1dc54f71ede23b84b9bde2930200b"},{"id":"func/ProfilePage.canMute","name":"ProfilePage.canMute","line":91,"end_line":93,"hash":"0076ea0e688df292dbe6bcde370aa32937cf7dad674e2168c3395d41b63850af"},{"id":"func/ProfilePage.isMuting","name":"ProfilePage.isMuting","line":95,"end_line":97,"hash":"c4fe9ea0501b7349da39321afd074e7ae48c2c1f2e0d1cfafafbf57f8a05c754"},{"id":"func/ProfilePage.mute","name":"ProfilePage.mute","line":99,"end_line":101,"hash":"228ff6bb19d81e92f99090b6242043b216b9ff8dd9f7aa49d4e50521b1270c26"},{"id":"func/ProfilePage.unmute","name":"ProfilePage.unmute","line":103,"end_line":105,"hash":"ea3e7cbf5a02898ea2a924fb42b683ef50a7a9985ac9118dd404e46fcaa78ed1"},{"id":"func/ProfilePage._setMuteState","name":"ProfilePage._setMuteState","line":108,"end_line":110,"hash":"721536335442a539a8ec7700d9db79abd18cfc24ed451fcd29e198f531d0896f"},{"id":"func/ProfilePage._setState","name":"ProfilePage._setState","line":114,"end_line":121,"hash":"8e01237a2cf48ca49a5c480d94a89cd6fbe3911bd476b17ca826a21bcbd60f4c"},{"id":"func/ProfilePage.getPost","name":"ProfilePage.getPost","line":123,"end_line":125,"hash":"1a6ae1a02b0f79b5b62a2b2324a5f1edbd743bec004fe73cfef7970bead56885"}]} // mutate4javascript-manifest-end diff --git a/psf-memo-client/src/services/profiles.js b/psf-memo-client/src/services/profiles.js index 485c1d0..3725876 100644 --- a/psf-memo-client/src/services/profiles.js +++ b/psf-memo-client/src/services/profiles.js @@ -95,5 +95,5 @@ class Profiles { module.exports = Profiles // mutate4javascript-manifest-begin -// {"version":1,"tested_at":"2026-08-28T18:21:58.102Z","module_hash":"1cec5125fb228d43d47e4ec171eb43c492f2bd773ca315748df78a16071e2802","functions":[{"id":"func/Profiles.constructor","name":"Profiles.constructor","line":13,"end_line":19,"hash":"247804207ec0220b6e6507f6beb6f86023a7c08b50737a52a0dbb99d262993d3"},{"id":"func/Profiles.setName","name":"Profiles.setName","line":21,"end_line":24,"hash":"5a36c6e237798608de0bedd8744b75000c0eec5c0a6a64c870a25bcdf20aed21"},{"id":"func/Profiles.getName","name":"Profiles.getName","line":26,"end_line":29,"hash":"2fcb9d84687ea0f3b24f3e34c0a72eda55a4e869b87e08a7f4551321a4166198"},{"id":"func/Profiles.setBio","name":"Profiles.setBio","line":31,"end_line":34,"hash":"3825665ead1ba9bb217694c45a17bb2e11c78ffa053e5e90111a4b9208183b56"},{"id":"func/Profiles.getBio","name":"Profiles.getBio","line":36,"end_line":39,"hash":"2e9708249db4a0e4fa642cbe52e6216144ec91283281c61dee2ff3cc3d8f1572"},{"id":"func/Profiles.setAvatarUrl","name":"Profiles.setAvatarUrl","line":41,"end_line":44,"hash":"e4ccb0164fee4ab6cc3a1290fb4bf85e4a79f2227ca72872b1f10bc616926fd9"},{"id":"func/Profiles.getAvatarUrl","name":"Profiles.getAvatarUrl","line":46,"end_line":49,"hash":"0aa58dc15fd519e553136d04d1954e18084f79a6cd9349dc89b1136cf0a22a2b"},{"id":"func/Profiles.setFollowState","name":"Profiles.setFollowState","line":52,"end_line":54,"hash":"805cafb46052f91bfa0a123842c25ff8ee0f7f4a7e661f51d289b0487738dbd4"},{"id":"func/Profiles.getFollowState","name":"Profiles.getFollowState","line":56,"end_line":58,"hash":"48fdf5a632825946c391146628cd6f51b4eb0169c7a6d6b89c795ff554e62b07"},{"id":"func/Profiles.setTopicFollowState","name":"Profiles.setTopicFollowState","line":61,"end_line":63,"hash":"54ab980e42018d64fbacee7d80347d530791b7ba21d8fac46f5ed85f33903f98"},{"id":"func/Profiles.getTopicFollowState","name":"Profiles.getTopicFollowState","line":65,"end_line":67,"hash":"90ce88799dda5477e20ce4de17404dace55abf1d2f2c1c87671e94fc2f270205"},{"id":"func/Profiles._setMapState","name":"Profiles._setMapState","line":70,"end_line":76,"hash":"13d2cad84be961b89482970f55f107d93fa1bdc10636dc64844c6a9263e88583"},{"id":"func/Profiles._getMapState","name":"Profiles._getMapState","line":79,"end_line":82,"hash":"c1c8966a797533614d35c7a13deb8f757572127ebcbde1d234c7d966346d89a8"}]} +// {"version":1,"tested_at":"2026-08-29T03:10:31.118Z","module_hash":"2bb4330e8e02efefe51d18cb91de66dc593f1c89ff0dfa76bde8a35a6d57ebe6","functions":[{"id":"func/Profiles.constructor","name":"Profiles.constructor","line":13,"end_line":20,"hash":"637a426a545e635a0e7a84fbee34fcd54a6194eb975cd8af9d7ae30c98a77697"},{"id":"func/Profiles.setName","name":"Profiles.setName","line":22,"end_line":25,"hash":"5a36c6e237798608de0bedd8744b75000c0eec5c0a6a64c870a25bcdf20aed21"},{"id":"func/Profiles.getName","name":"Profiles.getName","line":27,"end_line":30,"hash":"2fcb9d84687ea0f3b24f3e34c0a72eda55a4e869b87e08a7f4551321a4166198"},{"id":"func/Profiles.setBio","name":"Profiles.setBio","line":32,"end_line":35,"hash":"3825665ead1ba9bb217694c45a17bb2e11c78ffa053e5e90111a4b9208183b56"},{"id":"func/Profiles.getBio","name":"Profiles.getBio","line":37,"end_line":40,"hash":"2e9708249db4a0e4fa642cbe52e6216144ec91283281c61dee2ff3cc3d8f1572"},{"id":"func/Profiles.setAvatarUrl","name":"Profiles.setAvatarUrl","line":42,"end_line":45,"hash":"e4ccb0164fee4ab6cc3a1290fb4bf85e4a79f2227ca72872b1f10bc616926fd9"},{"id":"func/Profiles.getAvatarUrl","name":"Profiles.getAvatarUrl","line":47,"end_line":50,"hash":"0aa58dc15fd519e553136d04d1954e18084f79a6cd9349dc89b1136cf0a22a2b"},{"id":"func/Profiles.setFollowState","name":"Profiles.setFollowState","line":53,"end_line":55,"hash":"805cafb46052f91bfa0a123842c25ff8ee0f7f4a7e661f51d289b0487738dbd4"},{"id":"func/Profiles.getFollowState","name":"Profiles.getFollowState","line":57,"end_line":59,"hash":"48fdf5a632825946c391146628cd6f51b4eb0169c7a6d6b89c795ff554e62b07"},{"id":"func/Profiles.setTopicFollowState","name":"Profiles.setTopicFollowState","line":62,"end_line":64,"hash":"54ab980e42018d64fbacee7d80347d530791b7ba21d8fac46f5ed85f33903f98"},{"id":"func/Profiles.getTopicFollowState","name":"Profiles.getTopicFollowState","line":66,"end_line":68,"hash":"90ce88799dda5477e20ce4de17404dace55abf1d2f2c1c87671e94fc2f270205"},{"id":"func/Profiles.setMuteState","name":"Profiles.setMuteState","line":71,"end_line":73,"hash":"65d3abb143f092d856cb8acbbe697f65bb864ce1f32d8b2f8a3d7d490395bb8c"},{"id":"func/Profiles.getMuteState","name":"Profiles.getMuteState","line":75,"end_line":77,"hash":"43bbff3b9ad4345e59c3e759cd4894db803edde28ccdfeef5a244b11ef1e18df"},{"id":"func/Profiles._setMapState","name":"Profiles._setMapState","line":80,"end_line":86,"hash":"13d2cad84be961b89482970f55f107d93fa1bdc10636dc64844c6a9263e88583"},{"id":"func/Profiles._getMapState","name":"Profiles._getMapState","line":89,"end_line":92,"hash":"c1c8966a797533614d35c7a13deb8f757572127ebcbde1d234c7d966346d89a8"}]} // mutate4javascript-manifest-end diff --git a/psf-memo-client/test/unit/memo-mute.test.js b/psf-memo-client/test/unit/memo-mute.test.js index f2d6941..896f70e 100644 --- a/psf-memo-client/test/unit/memo-mute.test.js +++ b/psf-memo-client/test/unit/memo-mute.test.js @@ -93,6 +93,15 @@ test('unmute reflects the new unmute state on the profile store', async () => { assert.equal(profiles.getMuteState(MY_ADDRESS, MUTEE_ADDRESS), false) }) +test('validate returns ok for a valid mutee address', () => { + const wallet = makeWallet() + const memoMute = new MemoMute({ wallet }) + + const result = memoMute.validate(MUTEE_ADDRESS) + + assert.deepEqual(result, { ok: true }) +}) + test('mute rejects an empty address', async () => { const wallet = makeWallet() const memoMute = new MemoMute({ wallet }) diff --git a/psf-memo-client/test/unit/profile-page-mute.test.js b/psf-memo-client/test/unit/profile-page-mute.test.js index 7007285..02d153e 100644 --- a/psf-memo-client/test/unit/profile-page-mute.test.js +++ b/psf-memo-client/test/unit/profile-page-mute.test.js @@ -33,6 +33,30 @@ function makeMemoMute (page) { } } +test('constructor preserves an injected memo mute handler', () => { + const memoMute = { mute: async () => {}, unmute: async () => {} } + const page = new ProfilePage({ memoMute }) + + assert.equal(page.memoMute, memoMute) +}) + +test('load returns muteState false when viewing own profile', async () => { + const addr = 'bitcoincash:qqlrzp23w08434twmvr4fxw672whkjy0py26r63g3d' + const memoDb = makeMemoDb({}) + const page = new ProfilePage({ memoDb, addr, myAddr: addr }) + + const result = await page.load() + + assert.equal(result.muteState, false) +}) + +test('canMute returns false when viewing own profile', () => { + const addr = 'bitcoincash:qqlrzp23w08434twmvr4fxw672whkjy0py26r63g3d' + const page = new ProfilePage({ memoDb: {}, addr, myAddr: addr }) + + assert.equal(page.canMute(), false) +}) + test('load fetches mute state when a viewer address is provided', async () => { const myAddr = 'bitcoincash:qqlrzp23w08434twmvr4fxw672whkjy0py26r63g3d' const addr = 'bitcoincash:qr95sy3j9xwd2ap32xkykttr4cvcu7as4y0qverfuy' diff --git a/psf-memo-client/test/unit/profile-page.test.js b/psf-memo-client/test/unit/profile-page.test.js index d33e71f..a27f3f0 100644 --- a/psf-memo-client/test/unit/profile-page.test.js +++ b/psf-memo-client/test/unit/profile-page.test.js @@ -167,6 +167,13 @@ test('unfollow delegates to the memo follow handler and updates state', async () assert.equal(page.isFollowing(), false) }) +test('constructor preserves an injected memo follow handler', () => { + const memoFollow = { follow: async () => {}, unfollow: async () => {} } + const page = new ProfilePage({ memoFollow }) + + assert.equal(page.memoFollow, memoFollow) +}) + test('follow throws when no memo follow handler is injected', async () => { const myAddr = 'bitcoincash:qqlrzp23w08434twmvr4fxw672whkjy0py26r63g3d' const addr = 'bitcoincash:qr95sy3j9xwd2ap32xkykttr4cvcu7as4y0qverfuy' diff --git a/psf-memo-db/specs/mute-read.feature b/psf-memo-db/specs/mute-read.feature index ddb9627..e9b98a4 100644 --- a/psf-memo-db/specs/mute-read.feature +++ b/psf-memo-db/specs/mute-read.feature @@ -1,3 +1,7 @@ +# acceptance-mutation-manifest-begin +# {"version":1,"tested_at":"2026-08-29T03:43:35.749097546Z","feature_name":"Mute Read","feature_path":"/home/trout/work/psf-memo/.worktrees/architect/psf-memo-db/specs/mute-read.feature","background_hash":"a5f096996120c0f8eb55576184704c74a5e3487999edec263abee0d8fdd53348","implementation_hash":"unknown","scenarios":[{"index":1,"name":"Mute Read - 2 GET /mute/muted lists the addresses a muter mutes","scenario_hash":"ad2bc8a39c2450f1391aa39d246f30989536f3d94b461302bd9528c029641362","mutation_count":4,"result":{"Total":4,"Killed":4,"Survived":0,"Errors":0},"tested_at":"2026-08-29T03:43:35.749097546Z"}]} +# acceptance-mutation-manifest-end + # Scenarios: Mute Read - 1, Mute Read - 2 # # The mutes store keys mutees by 20-byte hash160. Use bch-js diff --git a/psf-memo-db/src/adapters/index.js b/psf-memo-db/src/adapters/index.js index 831846c..e17ab83 100644 --- a/psf-memo-db/src/adapters/index.js +++ b/psf-memo-db/src/adapters/index.js @@ -63,5 +63,5 @@ class Adapters { export default Adapters // mutate4javascript-manifest-begin -// {"version":1,"tested_at":"2026-08-28T23:02:23.414Z","module_hash":"b21f1e3f06db5dd67606fbc7021677bca4d9db8e900464185e89de2d1c2a61f1","functions":[{"id":"func/Adapters.constructor","name":"Adapters.constructor","line":14,"end_line":18,"hash":"065fc13eb85e8f884084eb672e5bf38175fb8305e576484804398dd902133c40"},{"id":"func/Adapters.openDatabases","name":"Adapters.openDatabases","line":20,"end_line":50,"hash":"6666e105f384adb9885d102b05b1be0f5b9885592c9ff1f8db34843ec351be01"},{"id":"func/Adapters.start","name":"Adapters.start","line":52,"end_line":56,"hash":"f9e62a9199f0259f5c22913625e6e497548b3887cc24871bba475e73e52b3750"}]} +// {"version":1,"tested_at":"2026-08-29T03:34:22.589Z","module_hash":"7137b595886dd88a8e876e38126ab9abe106b5b0e1054092297f508fb757adc4","functions":[{"id":"func/Adapters.constructor","name":"Adapters.constructor","line":15,"end_line":19,"hash":"065fc13eb85e8f884084eb672e5bf38175fb8305e576484804398dd902133c40"},{"id":"func/Adapters.openDatabases","name":"Adapters.openDatabases","line":21,"end_line":54,"hash":"588b692236c37e0940c82f235d15be1a8640b4afa8bc2a0a06ada5026dd417f5"},{"id":"func/Adapters.start","name":"Adapters.start","line":56,"end_line":60,"hash":"f9e62a9199f0259f5c22913625e6e497548b3887cc24871bba475e73e52b3750"}]} // mutate4javascript-manifest-end diff --git a/psf-memo-db/src/adapters/mute-query.js b/psf-memo-db/src/adapters/mute-query.js index 4464e3d..5f5a3a5 100644 --- a/psf-memo-db/src/adapters/mute-query.js +++ b/psf-memo-db/src/adapters/mute-query.js @@ -66,3 +66,7 @@ class MuteQuery { } export default MuteQuery + +// mutate4javascript-manifest-begin +// {"version":1,"tested_at":"2026-08-29T03:27:18.711Z","module_hash":"ea0307363359511b441e8b8dcdfb98c1020a605eac066df6dbdd8bf483d27cae","functions":[{"id":"func/MuteQuery.constructor","name":"MuteQuery.constructor","line":16,"end_line":25,"hash":"5f3104002d87ee9f837d862cbc64197963704c5fd3aa3631d5c5e71f6cc59f21"},{"id":"func/MuteQuery.isMuted","name":"MuteQuery.isMuted","line":29,"end_line":39,"hash":"76d1d6507cb040a3b3cecd1fee11b140f96d3836a05ee912f45b6534d55a1a50"},{"id":"func/MuteQuery.listMuted","name":"MuteQuery.listMuted","line":42,"end_line":51,"hash":"290ffc75a83bc51226d915b4962beacec7a48d611367e1bc7e4144056b3ae2f9"},{"id":"func/MuteQuery._toHash160","name":"MuteQuery._toHash160","line":53,"end_line":55,"hash":"248ed673be41bc9dcaa0d2fbeed1596784b7bde8877eafe43a05e29e430f9e8b"},{"id":"func/MuteQuery._toCashAddress","name":"MuteQuery._toCashAddress","line":57,"end_line":59,"hash":"0706292919ee44a25e63565558d4d9499188c7c49b3afc39eeb20438f4d5c4d4"},{"id":"func/MuteQuery._nextString","name":"MuteQuery._nextString","line":63,"end_line":65,"hash":"faa7823440ac998c3d5920ebcfe336d7b8df7e705dd6a1177dc8ccbd21f9ecf2"}]} +// mutate4javascript-manifest-end diff --git a/psf-memo-db/src/controllers/rest-api/mute/controller.js b/psf-memo-db/src/controllers/rest-api/mute/controller.js index b1857cb..f796bbb 100644 --- a/psf-memo-db/src/controllers/rest-api/mute/controller.js +++ b/psf-memo-db/src/controllers/rest-api/mute/controller.js @@ -77,3 +77,7 @@ class MuteRESTControllerLib { } export default MuteRESTControllerLib + +// mutate4javascript-manifest-begin +// {"version":1,"tested_at":"2026-08-29T03:32:28.766Z","module_hash":"d64a285141e5c61b633b087777d2649ee4d7597206e59bedc6dbdb797cefddae","functions":[{"id":"func/MuteRESTControllerLib.constructor","name":"MuteRESTControllerLib.constructor","line":8,"end_line":21,"hash":"05eda89865cbf8f59f0d9cafe012c2185eeff9082d90636e6f8675f9b2df8453"},{"id":"func/MuteRESTControllerLib.handleError","name":"MuteRESTControllerLib.handleError","line":23,"end_line":30,"hash":"a2129f52ffeeae961205b6fca5bf2f01e35494e724c5b72ee314013b343112c9"},{"id":"func/MuteRESTControllerLib.getMuteState","name":"MuteRESTControllerLib.getMuteState","line":47,"end_line":54,"hash":"3c140541ac30e5c8f029fc9b6b9c17ec09b096589e78f28b7565079fc50c639d"},{"id":"func/MuteRESTControllerLib.getMuted","name":"MuteRESTControllerLib.getMuted","line":69,"end_line":76,"hash":"aa4555e7b3ea3ec283273dd1ee53f8bf577fc591317cd211609c73f1863c4140"}]} +// mutate4javascript-manifest-end diff --git a/psf-memo-db/src/controllers/rest-api/mute/index.js b/psf-memo-db/src/controllers/rest-api/mute/index.js index 92bceb0..28b5527 100644 --- a/psf-memo-db/src/controllers/rest-api/mute/index.js +++ b/psf-memo-db/src/controllers/rest-api/mute/index.js @@ -33,3 +33,7 @@ class MuteRouter { } export default MuteRouter + +// mutate4javascript-manifest-begin +// {"version":1,"tested_at":"2026-08-29T03:31:02.844Z","module_hash":"0539f755b7b843d59c73484a1c2411539198ddb243bdda64f35b4cab9d84d62d","functions":[{"id":"func/MuteRouter.constructor","name":"MuteRouter.constructor","line":9,"end_line":24,"hash":"70b571eea7a91fc3c2b2eecff7dc9003d679b2510813999cc63f81559032f094"},{"id":"func/MuteRouter.attach","name":"MuteRouter.attach","line":26,"end_line":32,"hash":"0f54317bf9a10a21fcbf15a722394d483b9089ca22661e0c1a43de32f45fb460"}]} +// mutate4javascript-manifest-end diff --git a/psf-memo-db/src/use-cases/index.js b/psf-memo-db/src/use-cases/index.js index 8ea4014..9955d64 100644 --- a/psf-memo-db/src/use-cases/index.js +++ b/psf-memo-db/src/use-cases/index.js @@ -121,5 +121,5 @@ class UseCases { export default UseCases // mutate4javascript-manifest-begin -// {"version":1,"tested_at":"2026-08-28T23:02:43.390Z","module_hash":"cf2bffa7de787c479a3849641f6f6ead863cea555a6c2db995179732bcf05466","functions":[{"id":"func/UseCases.constructor","name":"UseCases.constructor","line":21,"end_line":44,"hash":"3fb83ec6337d0634fa8b1e7431e0e94c2aa4be2d3cbc930841d294a08b465f98"},{"id":"func/UseCases.start","name":"UseCases.start","line":46,"end_line":106,"hash":"c876c85df5fd28146e8f6bce6aa7c48eed7ff3303cb3384cf0a9704926b837a3"}]} +// {"version":1,"tested_at":"2026-08-29T03:34:22.727Z","module_hash":"bd1af3666615a359eb970d1576472fe7a792fbfd135972e81ba50f1441976e94","functions":[{"id":"func/UseCases.constructor","name":"UseCases.constructor","line":23,"end_line":48,"hash":"511ff53d6fe3084c42bc443e67183991e065fe6432d26291d8f44fcf3ee3fe94"},{"id":"func/UseCases.start","name":"UseCases.start","line":50,"end_line":118,"hash":"4a94f92a0c335ee536da858df44d13e81930b86df9e27ebff75d71753865e299"}]} // mutate4javascript-manifest-end diff --git a/psf-memo-db/src/use-cases/lib/follow-list-use-case.js b/psf-memo-db/src/use-cases/lib/follow-list-use-case.js index c65675c..5ec28bd 100644 --- a/psf-memo-db/src/use-cases/lib/follow-list-use-case.js +++ b/psf-memo-db/src/use-cases/lib/follow-list-use-case.js @@ -30,5 +30,5 @@ export class FollowListUseCase extends ListUseCase { } // mutate4javascript-manifest-begin -// {"version":1,"tested_at":"2026-08-27T18:16:27.234Z","module_hash":"1424c15ec8acd2179412ef5b347107746ef1e035a47fc1fac595e96c194526f8","functions":[{"id":"func/FollowListUseCase.constructor","name":"FollowListUseCase.constructor","line":15,"end_line":20,"hash":"f5f3b2832eb47baeb416b6b36122163d7479444e82f471a7d9b34f800639208c"},{"id":"func/FollowListUseCase.execute","name":"FollowListUseCase.execute","line":22,"end_line":29,"hash":"3d9258e7bb03192db5b56eac38819604dfdc43ee63b47cc6445754d36ab1848f"}]} +// {"version":1,"tested_at":"2026-08-29T03:30:18.194Z","module_hash":"24024ec5900b4097a6aa7aef2e5d4eb92834336ee99a7143ef59e3565b112029","functions":[{"id":"func/FollowListUseCase.constructor","name":"FollowListUseCase.constructor","line":15,"end_line":20,"hash":"3959516f05104386f09b2194feda32dd46038975dff2cfedf58b82da0bf08d10"},{"id":"func/FollowListUseCase.execute","name":"FollowListUseCase.execute","line":22,"end_line":29,"hash":"3d9258e7bb03192db5b56eac38819604dfdc43ee63b47cc6445754d36ab1848f"}]} // mutate4javascript-manifest-end diff --git a/psf-memo-db/src/use-cases/list-muted.js b/psf-memo-db/src/use-cases/list-muted.js index a64dda6..ca88e37 100644 --- a/psf-memo-db/src/use-cases/list-muted.js +++ b/psf-memo-db/src/use-cases/list-muted.js @@ -19,3 +19,7 @@ class ListMuted extends FollowListUseCase { } export default ListMuted + +// mutate4javascript-manifest-begin +// {"version":1,"tested_at":"2026-08-29T03:29:41.578Z","module_hash":"3fd8a3c1a800e95a07d8fe9d992b7004da225563ab47d76308aad93b2ee77efd","functions":[{"id":"func/ListMuted.constructor","name":"ListMuted.constructor","line":10,"end_line":18,"hash":"2c77d678a9c501f0a0c33f73155415928eeb0738247da09ebd5ad5cbf8003b84"}]} +// mutate4javascript-manifest-end diff --git a/psf-memo-db/src/use-cases/mute-state.js b/psf-memo-db/src/use-cases/mute-state.js index 6665525..364ef3e 100644 --- a/psf-memo-db/src/use-cases/mute-state.js +++ b/psf-memo-db/src/use-cases/mute-state.js @@ -27,3 +27,7 @@ class MuteState extends ListUseCase { } export default MuteState + +// mutate4javascript-manifest-begin +// {"version":1,"tested_at":"2026-08-29T03:29:04.639Z","module_hash":"0e37ef99c98cac6f23c11f10e4d9624ce6592d5842aa27b4ddebd69e0510a942","functions":[{"id":"func/MuteState.constructor","name":"MuteState.constructor","line":10,"end_line":12,"hash":"bf68be0e0fe9b7940cdcd450edd9e41a27e9bcc42f69a1d691461fd3f5ba5c9a"},{"id":"func/MuteState.execute","name":"MuteState.execute","line":14,"end_line":26,"hash":"0ff800d8e1f5c3a0fd25aa51aff6346eed3928739da7643071c12e4c02212399"}]} +// mutate4javascript-manifest-end diff --git a/psf-memo-db/test/unit/adapters/mute-query.unit.js b/psf-memo-db/test/unit/adapters/mute-query.unit.js index ae7fd21..f9a917c 100644 --- a/psf-memo-db/test/unit/adapters/mute-query.unit.js +++ b/psf-memo-db/test/unit/adapters/mute-query.unit.js @@ -75,6 +75,14 @@ describe('#MuteQuery', () => { assert.equal(result, false) }) + it('_nextString returns the lexicographic exclusive upper bound of a prefix', () => { + const query = new MuteQuery({ mutesDb: makeMutesDb({}) }) + + // 'abc:' -> drop the trailing ':', increment the last char (':' -> ';'). + assert.equal(query._nextString('abc:'), 'abc;') + assert.equal(query._nextString('a'), 'b') + }) + it('listMuted returns active mutees for a muter', async () => { const hash160 = 'cb481232299cd5743151ac4b2d63ae198e7bb0a9' const hash160Two = '44c44cfcb6e4e00386c7b0d14eaac6b7f47695e3' diff --git a/psf-memo-db/test/unit/controllers/mute.controller.unit.js b/psf-memo-db/test/unit/controllers/mute.controller.unit.js index 33021b6..833abce 100644 --- a/psf-memo-db/test/unit/controllers/mute.controller.unit.js +++ b/psf-memo-db/test/unit/controllers/mute.controller.unit.js @@ -60,4 +60,32 @@ describe('#MuteRESTController', () => { assert.equal(ctx.throw.callCount, 1) assert.equal(ctx.throw.firstCall.args[0], 500) }) + + it('should rethrow a statused error with its message', async () => { + const err = new Error('bad request') + err.status = 400 + const muteState = { execute: sandbox.stub().rejects(err) } + const uut = makeUut({ muteState }) + const ctx = makeCtx({ muter: 'a', mutee: 'b' }) + + await uut.getMuteState(ctx) + + assert.equal(ctx.throw.callCount, 1) + assert.equal(ctx.throw.firstCall.args[0], 400) + assert.equal(ctx.throw.firstCall.args[1], 'bad request') + }) + + it('should rethrow a statused error without a message', async () => { + const err = new Error() + err.status = 404 + const muteState = { execute: sandbox.stub().rejects(err) } + const uut = makeUut({ muteState }) + const ctx = makeCtx({ muter: 'a', mutee: 'b' }) + + await uut.getMuteState(ctx) + + assert.equal(ctx.throw.callCount, 1) + assert.equal(ctx.throw.firstCall.args[0], 404) + assert.equal(ctx.throw.firstCall.args[1], err) + }) }) diff --git a/psf-memo-db/test/unit/use-cases/mute-state.unit.js b/psf-memo-db/test/unit/use-cases/mute-state.unit.js index 0265bb5..975e5a4 100644 --- a/psf-memo-db/test/unit/use-cases/mute-state.unit.js +++ b/psf-memo-db/test/unit/use-cases/mute-state.unit.js @@ -69,4 +69,44 @@ describe('#MuteState', () => { assert.match(err.message, /muteeAddr is required/) } }) + + it('should reject an empty-string muterAddr', async () => { + const useCase = new MuteState({ adapters: makeAdapters(false) }) + try { + await useCase.execute({ muterAddr: '', muteeAddr: 'bitcoincash:mutee' }) + assert.fail('expected error') + } catch (err) { + assert.match(err.message, /muterAddr is required/) + } + }) + + it('should reject a non-string muterAddr', async () => { + const useCase = new MuteState({ adapters: makeAdapters(false) }) + try { + await useCase.execute({ muterAddr: 123, muteeAddr: 'bitcoincash:mutee' }) + assert.fail('expected error') + } catch (err) { + assert.match(err.message, /muterAddr is required/) + } + }) + + it('should reject an empty-string muteeAddr', async () => { + const useCase = new MuteState({ adapters: makeAdapters(false) }) + try { + await useCase.execute({ muterAddr: 'bitcoincash:muter', muteeAddr: '' }) + assert.fail('expected error') + } catch (err) { + assert.match(err.message, /muteeAddr is required/) + } + }) + + it('should reject a non-string muteeAddr', async () => { + const useCase = new MuteState({ adapters: makeAdapters(false) }) + try { + await useCase.execute({ muterAddr: 'bitcoincash:muter', muteeAddr: 456 }) + assert.fail('expected error') + } catch (err) { + assert.match(err.message, /muteeAddr is required/) + } + }) }) diff --git a/psf-memo-indexer/specs/mute-indexer.feature b/psf-memo-indexer/specs/mute-indexer.feature index c5bdb46..e64b245 100644 --- a/psf-memo-indexer/specs/mute-indexer.feature +++ b/psf-memo-indexer/specs/mute-indexer.feature @@ -1,3 +1,7 @@ +# acceptance-mutation-manifest-begin +# {"version":1,"tested_at":"2026-08-29T03:40:09.241155483Z","feature_name":"Mute Indexer","feature_path":"/home/trout/work/psf-memo/.worktrees/architect/psf-memo-indexer/specs/mute-indexer.feature","background_hash":"b019877abd54b08b22034bf036a8a6002e6e81638ca39a8620a5c66ec25439ae","implementation_hash":"unknown","scenarios":[]} +# acceptance-mutation-manifest-end + # Scenarios: Mute Indexer - 1, Mute Indexer - 2, Mute Indexer - 3 # # The indexer parses Memo mute actions and stores structured records: diff --git a/psf-memo-indexer/src/adapters/adapters-index.js b/psf-memo-indexer/src/adapters/adapters-index.js index 9af88c2..acd5e1c 100644 --- a/psf-memo-indexer/src/adapters/adapters-index.js +++ b/psf-memo-indexer/src/adapters/adapters-index.js @@ -50,5 +50,5 @@ class Adapters { export default Adapters // mutate4javascript-manifest-begin -// {"version":1,"tested_at":"2026-08-28T23:35:03.972Z","module_hash":"812d0c3cd8f63eb6c028112cd26891c3b9bc7a7bc1c22e97d96a153a590f1e44","functions":[{"id":"func/Adapters.constructor","name":"Adapters.constructor","line":14,"end_line":41,"hash":"17fe3057a44fa0f8a17ddbbc5ddb285e1d29bf651bae778ac87097196d34aab0"},{"id":"func/Adapters.initAdapters","name":"Adapters.initAdapters","line":43,"end_line":46,"hash":"e3fd321225d51de1199b7ea45e4c9ab323a474c6fe99252041271e45daa59650"}]} +// {"version":1,"tested_at":"2026-08-29T03:35:13.645Z","module_hash":"242418b52e79c7a6f10aadb18839617f2135b16246db9a204d2888bc93c80d78","functions":[{"id":"func/Adapters.constructor","name":"Adapters.constructor","line":14,"end_line":42,"hash":"dc398f0bb823376f488088fc628f94913babcbe494cfd7dc299e230c08813836"},{"id":"func/Adapters.initAdapters","name":"Adapters.initAdapters","line":44,"end_line":47,"hash":"e3fd321225d51de1199b7ea45e4c9ab323a474c6fe99252041271e45daa59650"}]} // mutate4javascript-manifest-end diff --git a/psf-memo-indexer/src/lib/memo-codes.js b/psf-memo-indexer/src/lib/memo-codes.js index a3b957b..f8a39ad 100644 --- a/psf-memo-indexer/src/lib/memo-codes.js +++ b/psf-memo-indexer/src/lib/memo-codes.js @@ -72,5 +72,5 @@ export function getActionFromPrefix (prefixBuf) { } // mutate4javascript-manifest-begin -// {"version":1,"tested_at":"2026-08-28T23:34:16.405Z","module_hash":"d2cadfbbec174eedf255ae25df8891bd27f5a337b390df97064fe80f9c1ee712","functions":[{"id":"func/isMemoPrefix","name":"isMemoPrefix","line":59,"end_line":61,"hash":"38aab4da302e269a0b2206cb93704a17ae8f42f49d3c969ef525243ce9a42792"},{"id":"func/getActionFromPrefix","name":"getActionFromPrefix","line":63,"end_line":66,"hash":"31ff61d788f5043d043f07abe79e9242ec1d31180b2737e81af95e7c97fdc71c"}]} +// {"version":1,"tested_at":"2026-08-29T03:33:07.592Z","module_hash":"986e2d6c404c4c8ae5d7667a7279f8fe47c36df1c17ec281263d234fdcd04613","functions":[{"id":"func/isMemoPrefix","name":"isMemoPrefix","line":65,"end_line":67,"hash":"38aab4da302e269a0b2206cb93704a17ae8f42f49d3c969ef525243ce9a42792"},{"id":"func/getActionFromPrefix","name":"getActionFromPrefix","line":69,"end_line":72,"hash":"31ff61d788f5043d043f07abe79e9242ec1d31180b2737e81af95e7c97fdc71c"}]} // mutate4javascript-manifest-end diff --git a/psf-memo-indexer/src/use-cases/action-types/index.js b/psf-memo-indexer/src/use-cases/action-types/index.js index c8d91a2..23b5c75 100644 --- a/psf-memo-indexer/src/use-cases/action-types/index.js +++ b/psf-memo-indexer/src/use-cases/action-types/index.js @@ -42,5 +42,5 @@ export async function dispatchMemoAction (ctx) { } // mutate4javascript-manifest-begin -// {"version":1,"tested_at":"2026-08-28T23:35:27.947Z","module_hash":"a46edb4e6c6464ab3bad2bcb1eb502f6f5e1a78a8cc21006086c7543e9ed1ce1","functions":[{"id":"func/dispatchMemoAction","name":"dispatchMemoAction","line":31,"end_line":39,"hash":"975fe763535301df68af8ec017104e93f5cc591539b79e850f5b70e01cb37fec"}]} +// {"version":1,"tested_at":"2026-08-29T03:35:13.616Z","module_hash":"dd4df3c6f2758eb0d8c2e7550a83a56918f54f42bffa1088f32161bd10faa5a5","functions":[{"id":"func/dispatchMemoAction","name":"dispatchMemoAction","line":34,"end_line":42,"hash":"975fe763535301df68af8ec017104e93f5cc591539b79e850f5b70e01cb37fec"}]} // mutate4javascript-manifest-end diff --git a/psf-memo-indexer/src/use-cases/action-types/mute.js b/psf-memo-indexer/src/use-cases/action-types/mute.js index 45e0ed9..59f3de3 100644 --- a/psf-memo-indexer/src/use-cases/action-types/mute.js +++ b/psf-memo-indexer/src/use-cases/action-types/mute.js @@ -28,3 +28,7 @@ export async function handleMute (ctx) { blockHeight }) } + +// mutate4javascript-manifest-begin +// {"version":1,"tested_at":"2026-08-29T03:33:07.635Z","module_hash":"7bf93c17bf9870e22376fae9d8c7748f66d74851ccd64a0e9799a7a246a0d809","functions":[{"id":"func/handleMute","name":"handleMute","line":4,"end_line":30,"hash":"fa1dfbff1aa2f2d09fb6ff6eb2cf391ae281d038876ae1d3602a25dfa2946fa3"}]} +// mutate4javascript-manifest-end