From 480ae479af3dbf909bc414d7b6536eed2f41d4eb Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 24 Jul 2023 11:09:43 -0400 Subject: [PATCH] Imports NostrPostr utility classes directly via source to avoid dependency issues on unnecessary libraries. --- app/build.gradle | 7 - .../amethyst/LocalPreferences.kt | 10 +- .../vitorpamplona/amethyst/model/Account.kt | 4 +- .../com/vitorpamplona/amethyst/model/Hex.kt | 11 +- .../com/vitorpamplona/amethyst/model/User.kt | 4 +- .../amethyst/service/Bech32Util.kt | 200 ++++++++++++++++++ .../vitorpamplona/amethyst/service/Persona.kt | 34 +++ .../vitorpamplona/amethyst/service/Utils.kt | 97 +++++++++ .../service/lnurl/LightningAddressResolver.kt | 2 +- .../amethyst/service/model/ATag.kt | 6 +- .../amethyst/service/model/AudioTrackEvent.kt | 2 +- .../service/model/BookmarkListEvent.kt | 2 +- .../service/model/ChannelCreateEvent.kt | 2 +- .../service/model/ChannelHideMessageEvent.kt | 2 +- .../service/model/ChannelMessageEvent.kt | 2 +- .../service/model/ChannelMetadataEvent.kt | 2 +- .../service/model/ChannelMuteUserEvent.kt | 2 +- .../service/model/ClassifiedsEvent.kt | 2 +- .../service/model/CommunityDefinitionEvent.kt | 2 +- .../model/CommunityPostApprovalEvent.kt | 2 +- .../service/model/ContactListEvent.kt | 2 +- .../amethyst/service/model/DeletionEvent.kt | 2 +- .../amethyst/service/model/EmojiPackEvent.kt | 2 +- .../service/model/EmojiPackSelectionEvent.kt | 2 +- .../amethyst/service/model/Event.kt | 5 +- .../amethyst/service/model/FileHeaderEvent.kt | 2 +- .../service/model/FileStorageEvent.kt | 2 +- .../service/model/FileStorageHeaderEvent.kt | 2 +- .../service/model/GeneralListEvent.kt | 2 +- .../service/model/GenericRepostEvent.kt | 2 +- .../service/model/HTTPAuthorizationEvent.kt | 2 +- .../amethyst/service/model/HighlightEvent.kt | 2 +- .../model/LiveActivitiesChatMessageEvent.kt | 2 +- .../service/model/LiveActivitiesEvent.kt | 2 +- .../service/model/LnZapPaymentRequestEvent.kt | 2 +- .../model/LnZapPaymentResponseEvent.kt | 2 +- .../service/model/LnZapRequestEvent.kt | 4 +- .../service/model/LongTextNoteEvent.kt | 2 +- .../amethyst/service/model/MetadataEvent.kt | 2 +- .../amethyst/service/model/MuteListEvent.kt | 2 +- .../amethyst/service/model/NNSEvent.kt | 2 +- .../amethyst/service/model/PeopleListEvent.kt | 2 +- .../amethyst/service/model/PinListEvent.kt | 2 +- .../amethyst/service/model/PollNoteEvent.kt | 2 +- .../amethyst/service/model/PrivateDmEvent.kt | 5 +- .../amethyst/service/model/ReactionEvent.kt | 2 +- .../service/model/RecommendRelayEvent.kt | 2 +- .../amethyst/service/model/RelayAuthEvent.kt | 2 +- .../amethyst/service/model/RelaySetEvent.kt | 2 +- .../amethyst/service/model/ReportEvent.kt | 2 +- .../amethyst/service/model/RepostEvent.kt | 2 +- .../amethyst/service/model/TextNoteEvent.kt | 2 +- .../amethyst/service/nip19/Nip19.kt | 6 +- .../amethyst/ui/note/NoteCompose.kt | 2 +- .../amethyst/ui/note/PubKeyFormatter.kt | 4 +- .../ui/screen/AccountStateViewModel.kt | 4 +- .../ui/screen/loggedIn/AccountBackupDialog.kt | 2 +- 57 files changed, 403 insertions(+), 82 deletions(-) create mode 100644 app/src/main/java/com/vitorpamplona/amethyst/service/Bech32Util.kt create mode 100644 app/src/main/java/com/vitorpamplona/amethyst/service/Persona.kt create mode 100644 app/src/main/java/com/vitorpamplona/amethyst/service/Utils.kt diff --git a/app/build.gradle b/app/build.gradle index 2f97639ba..c725784be 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -118,13 +118,6 @@ dependencies { // Bitcoin secp256k1 bindings to Android implementation 'fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.10.1' - // Nostr Base Protocol - implementation('com.github.vitorpamplona.NostrPostr:nostrpostrlib:master-SNAPSHOT') { - exclude group:'fr.acinq.secp256k1' - exclude module: 'guava' - exclude module: 'guava-testlib' - } - // Websockets API implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.11' diff --git a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt index d9fa8863d..defd27809 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt @@ -14,17 +14,17 @@ import com.vitorpamplona.amethyst.model.RelaySetupInfo import com.vitorpamplona.amethyst.model.Settings import com.vitorpamplona.amethyst.model.hexToByteArray import com.vitorpamplona.amethyst.model.parseConnectivityType +import com.vitorpamplona.amethyst.model.toHexKey import com.vitorpamplona.amethyst.service.HttpClient +import com.vitorpamplona.amethyst.service.Persona import com.vitorpamplona.amethyst.service.model.ContactListEvent import com.vitorpamplona.amethyst.service.model.Event import com.vitorpamplona.amethyst.service.model.Event.Companion.getRefinedEvent import com.vitorpamplona.amethyst.service.model.LnZapEvent +import com.vitorpamplona.amethyst.service.toNpub import com.vitorpamplona.amethyst.ui.actions.ServersAvailable import com.vitorpamplona.amethyst.ui.note.Nip47URI import fr.acinq.secp256k1.Hex -import nostr.postr.Persona -import nostr.postr.toHex -import nostr.postr.toNpub import java.io.File import java.util.Locale @@ -211,8 +211,8 @@ object LocalPreferences { fun saveToEncryptedStorage(account: Account) { val prefs = encryptedPreferences(account.userProfile().pubkeyNpub()) prefs.edit().apply { - account.loggedIn.privKey?.let { putString(PrefKeys.NOSTR_PRIVKEY, it.toHex()) } - account.loggedIn.pubKey.let { putString(PrefKeys.NOSTR_PUBKEY, it.toHex()) } + account.loggedIn.privKey?.let { putString(PrefKeys.NOSTR_PRIVKEY, it.toHexKey()) } + account.loggedIn.pubKey.let { putString(PrefKeys.NOSTR_PUBKEY, it.toHexKey()) } putStringSet(PrefKeys.FOLLOWING_CHANNELS, account.followingChannels) putStringSet(PrefKeys.FOLLOWING_COMMUNITIES, account.followingCommunities) putStringSet(PrefKeys.HIDDEN_USERS, account.hiddenUsers) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index 430f0a16c..960e93d4c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -10,6 +10,8 @@ import androidx.lifecycle.distinctUntilChanged import com.vitorpamplona.amethyst.OptOutFromFilters import com.vitorpamplona.amethyst.service.FileHeader import com.vitorpamplona.amethyst.service.NostrLnZapPaymentResponseDataSource +import com.vitorpamplona.amethyst.service.Persona +import com.vitorpamplona.amethyst.service.Utils import com.vitorpamplona.amethyst.service.model.* import com.vitorpamplona.amethyst.service.relays.Client import com.vitorpamplona.amethyst.service.relays.Constants @@ -27,8 +29,6 @@ import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch -import nostr.postr.Persona -import nostr.postr.Utils import java.math.BigDecimal import java.net.Proxy import java.util.Locale diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Hex.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Hex.kt index 612f1fdb5..35bcec42a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Hex.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Hex.kt @@ -1,13 +1,12 @@ package com.vitorpamplona.amethyst.model +import com.vitorpamplona.amethyst.service.Bech32 +import com.vitorpamplona.amethyst.service.Persona +import com.vitorpamplona.amethyst.service.bechToBytes import com.vitorpamplona.amethyst.service.nip19.Nip19 +import com.vitorpamplona.amethyst.service.toNpub import com.vitorpamplona.amethyst.ui.note.toShortenHex import fr.acinq.secp256k1.Hex -import nostr.postr.Bech32 -import nostr.postr.Persona -import nostr.postr.bechToBytes -import nostr.postr.toHex -import nostr.postr.toNpub /** Makes the distinction between String and Hex **/ typealias HexKey = String @@ -26,7 +25,7 @@ fun NoteId.toDisplayId(): String { fun ByteArray.toNote() = Bech32.encodeBytes(hrp = "note", this, Bech32.Encoding.Bech32) fun ByteArray.toHexKey(): HexKey { - return toHex() + return Hex.encode(this) } fun HexKey.hexToByteArray(): ByteArray { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt index 2e48e3355..ad630fdc6 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt @@ -3,6 +3,7 @@ package com.vitorpamplona.amethyst.model import androidx.compose.runtime.Immutable import androidx.compose.runtime.Stable import androidx.lifecycle.LiveData +import com.vitorpamplona.amethyst.service.Bech32 import com.vitorpamplona.amethyst.service.NostrSingleUserDataSource import com.vitorpamplona.amethyst.service.checkNotInMainThread import com.vitorpamplona.amethyst.service.model.BookmarkListEvent @@ -12,14 +13,13 @@ import com.vitorpamplona.amethyst.service.model.MetadataEvent import com.vitorpamplona.amethyst.service.model.ReportEvent import com.vitorpamplona.amethyst.service.relays.EOSETime import com.vitorpamplona.amethyst.service.relays.Relay +import com.vitorpamplona.amethyst.service.toNpub import com.vitorpamplona.amethyst.ui.actions.ImmutableListOfLists import com.vitorpamplona.amethyst.ui.actions.toImmutableListOfLists import com.vitorpamplona.amethyst.ui.components.BundledUpdate import com.vitorpamplona.amethyst.ui.note.toShortenHex import fr.acinq.secp256k1.Hex import kotlinx.coroutines.Dispatchers -import nostr.postr.Bech32 -import nostr.postr.toNpub import java.math.BigDecimal import java.util.regex.Pattern diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/Bech32Util.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/Bech32Util.kt new file mode 100644 index 000000000..c4229f2ff --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/Bech32Util.kt @@ -0,0 +1,200 @@ +package com.vitorpamplona.amethyst.service + +/* + * Copyright 2020 ACINQ SAS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import kotlin.jvm.JvmStatic + +/** + * Bech32 works with 5 bits values, we use this type to make it explicit: whenever you see Int5 it means 5 bits values, + * and whenever you see Byte it means 8 bits values. + */ +public typealias Int5 = Byte + +/** + * Bech32 and Bech32m address formats. + * See https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki and https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki. + */ +object Bech32 { + public const val alphabet: String = "qpzry9x8gf2tvdw0s3jn54khce6mua7l" + + public enum class Encoding(public val constant: Int) { + Bech32(1), + Bech32m(0x2bc830a3), + Beck32WithoutChecksum(0) + } + + // char -> 5 bits value + private val map = Array(255) { -1 } + + init { + for (i in 0..alphabet.lastIndex) { + map[alphabet[i].code] = i.toByte() + } + } + + private fun expand(hrp: String): Array { + val result = Array(hrp.length + 1 + hrp.length) { 0 } + for (i in hrp.indices) { + result[i] = hrp[i].code.shr(5).toByte() + result[hrp.length + 1 + i] = (hrp[i].code and 31).toByte() + } + result[hrp.length] = 0 + return result + } + + private fun polymod(values: Array, values1: Array): Int { + val GEN = arrayOf(0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3) + var chk = 1 + values.forEach { v -> + val b = chk shr 25 + chk = ((chk and 0x1ffffff) shl 5) xor v.toInt() + for (i in 0..5) { + if (((b shr i) and 1) != 0) chk = chk xor GEN[i] + } + } + values1.forEach { v -> + val b = chk shr 25 + chk = ((chk and 0x1ffffff) shl 5) xor v.toInt() + for (i in 0..5) { + if (((b shr i) and 1) != 0) chk = chk xor GEN[i] + } + } + return chk + } + + /** + * @param hrp human readable prefix + * @param int5s 5-bit data + * @param encoding encoding to use (bech32 or bech32m) + * @return hrp + data encoded as a Bech32 string + */ + @JvmStatic + public fun encode(hrp: String, int5s: Array, encoding: Encoding): String { + require(hrp.lowercase() == hrp || hrp.uppercase() == hrp) { "mixed case strings are not valid bech32 prefixes" } + val data = int5s.toByteArray().toTypedArray() + val checksum = when (encoding) { + Encoding.Beck32WithoutChecksum -> arrayOf() + else -> checksum(hrp, data, encoding) + } + return hrp + "1" + (data + checksum).map { i -> alphabet[i.toInt()] }.toCharArray().concatToString() + } + + /** + * @param hrp human readable prefix + * @param data data to encode + * @param encoding encoding to use (bech32 or bech32m) + * @return hrp + data encoded as a Bech32 string + */ + @JvmStatic + public fun encodeBytes(hrp: String, data: ByteArray, encoding: Encoding): String = encode(hrp, eight2five(data), encoding) + + /** + * decodes a bech32 string + * @param bech32 bech32 string + * @param noChecksum if true, the bech32 string doesn't have a checksum + * @return a (hrp, data, encoding) tuple + */ + @JvmStatic + public fun decode(bech32: String, noChecksum: Boolean = false): Triple, Encoding> { + require(bech32.lowercase() == bech32 || bech32.uppercase() == bech32) { "mixed case strings are not valid bech32" } + bech32.forEach { require(it.code in 33..126) { "invalid character " } } + val input = bech32.lowercase() + val pos = input.lastIndexOf('1') + val hrp = input.take(pos) + require(hrp.length in 1..83) { "hrp must contain 1 to 83 characters" } + val data = Array(input.length - pos - 1) { 0 } + for (i in 0..data.lastIndex) data[i] = map[input[pos + 1 + i].code] + return if (noChecksum) { + Triple(hrp, data, Encoding.Beck32WithoutChecksum) + } else { + val encoding = when (polymod(expand(hrp), data)) { + Encoding.Bech32.constant -> Encoding.Bech32 + Encoding.Bech32m.constant -> Encoding.Bech32m + else -> throw IllegalArgumentException("invalid checksum for $bech32") + } + Triple(hrp, data.dropLast(6).toTypedArray(), encoding) + } + } + + /** + * decodes a bech32 string + * @param bech32 bech32 string + * @param noChecksum if true, the bech32 string doesn't have a checksum + * @return a (hrp, data, encoding) tuple + */ + @JvmStatic + public fun decodeBytes(bech32: String, noChecksum: Boolean = false): Triple { + val (hrp, int5s, encoding) = decode(bech32, noChecksum) + return Triple(hrp, five2eight(int5s, 0), encoding) + } + + /** + * @param hrp Human Readable Part + * @param data data (a sequence of 5 bits integers) + * @param encoding encoding to use (bech32 or bech32m) + * @return a checksum computed over hrp and data + */ + private fun checksum(hrp: String, data: Array, encoding: Encoding): Array { + val values = expand(hrp) + data + val poly = polymod(values, arrayOf(0.toByte(), 0.toByte(), 0.toByte(), 0.toByte(), 0.toByte(), 0.toByte())) xor encoding.constant + return Array(6) { i -> (poly.shr(5 * (5 - i)) and 31).toByte() } + } + + /** + * @param input a sequence of 8 bits integers + * @return a sequence of 5 bits integers + */ + @JvmStatic + public fun eight2five(input: ByteArray): Array { + var buffer = 0L + val output = ArrayList() + var count = 0 + input.forEach { b -> + buffer = (buffer shl 8) or (b.toLong() and 0xff) + count += 8 + while (count >= 5) { + output.add(((buffer shr (count - 5)) and 31).toByte()) + count -= 5 + } + } + if (count > 0) output.add(((buffer shl (5 - count)) and 31).toByte()) + return output.toTypedArray() + } + + /** + * @param input a sequence of 5 bits integers + * @return a sequence of 8 bits integers + */ + @JvmStatic + public fun five2eight(input: Array, offset: Int): ByteArray { + var buffer = 0L + val output = ArrayList() + var count = 0 + for (i in offset..input.lastIndex) { + val b = input[i] + buffer = (buffer shl 5) or (b.toLong() and 31) + count += 5 + while (count >= 8) { + output.add(((buffer shr (count - 8)) and 0xff).toByte()) + count -= 8 + } + } + require(count <= 4) { "Zero-padding of more than 4 bits" } + require((buffer and ((1L shl count) - 1L)) == 0L) { "Non-zero padding in 8-to-5 conversion" } + return output.toByteArray() + } +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/Persona.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/Persona.kt new file mode 100644 index 000000000..64dbb376f --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/Persona.kt @@ -0,0 +1,34 @@ +package com.vitorpamplona.amethyst.service + +import com.vitorpamplona.amethyst.model.toHexKey + +class Persona( + privKey: ByteArray? = null, + pubKey: ByteArray? = null +) { + val privKey: ByteArray? + val pubKey: ByteArray + + init { + if (privKey == null) { + if (pubKey == null) { + // create new, random keys + this.privKey = Utils.privkeyCreate() + this.pubKey = Utils.pubkeyCreate(this.privKey) + } else { + // this is a read-only account + check(pubKey.size == 32) + this.privKey = null + this.pubKey = pubKey + } + } else { + // as private key is provided, ignore the public key and set keys according to private key + this.privKey = privKey + this.pubKey = Utils.pubkeyCreate(privKey) + } + } + + override fun toString(): String { + return "Persona(privateKey=${privKey?.toHexKey()}, publicKey=${pubKey.toHexKey()}" + } +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/Utils.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/Utils.kt new file mode 100644 index 000000000..0409cddd4 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/Utils.kt @@ -0,0 +1,97 @@ +package com.vitorpamplona.amethyst.service + +import fr.acinq.secp256k1.Hex +import fr.acinq.secp256k1.Secp256k1 +import java.security.MessageDigest +import java.security.SecureRandom +import java.util.Base64 +import javax.crypto.Cipher +import javax.crypto.spec.IvParameterSpec +import javax.crypto.spec.SecretKeySpec + +object Utils { + private val sha256: MessageDigest = MessageDigest.getInstance("SHA-256") + + /** + * Provides a 32B "private key" aka random number + */ + fun privkeyCreate(): ByteArray { + val bytes = ByteArray(32) + random.nextBytes(bytes) + return bytes + } + + fun pubkeyCreate(privKey: ByteArray) = + secp256k1.pubKeyCompress(secp256k1.pubkeyCreate(privKey)).copyOfRange(1, 33) + + fun sign(data: ByteArray, privKey: ByteArray): ByteArray = + secp256k1.signSchnorr(data, privKey, null) + + fun encrypt(msg: String, privateKey: ByteArray, pubKey: ByteArray): String { + val sharedSecret = getSharedSecret(privateKey, pubKey) + return encrypt(msg, sharedSecret) + } + + fun encrypt(msg: String, sharedSecret: ByteArray): String { + val iv = ByteArray(16) + random.nextBytes(iv) + val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding") + cipher.init(Cipher.ENCRYPT_MODE, SecretKeySpec(sharedSecret, "AES"), IvParameterSpec(iv)) + val ivBase64 = Base64.getEncoder().encode(iv) + val encryptedMsg = cipher.doFinal(msg.toByteArray()) + val encryptedMsgBase64 = Base64.getEncoder().encode(encryptedMsg) + return "$encryptedMsgBase64?iv=$ivBase64" + } + + fun decrypt(msg: String, privateKey: ByteArray, pubKey: ByteArray): String { + val sharedSecret = getSharedSecret(privateKey, pubKey) + return decrypt(msg, sharedSecret) + } + + fun decrypt(msg: String, sharedSecret: ByteArray): String { + val parts = msg.split("?iv=") + val iv = parts[1].run { Base64.getDecoder().decode(this) } + val encryptedMsg = parts.first().run { Base64.getDecoder().decode(this) } + val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding") + cipher.init(Cipher.DECRYPT_MODE, SecretKeySpec(sharedSecret, "AES"), IvParameterSpec(iv)) + return String(cipher.doFinal(encryptedMsg)) + } + + /** + * @return 32B shared secret + */ + fun getSharedSecret(privateKey: ByteArray, pubKey: ByteArray): ByteArray = + secp256k1.pubKeyTweakMul(Hex.decode("02") + pubKey, privateKey).copyOfRange(1, 33) + + fun sha256(byteArray: ByteArray): ByteArray = sha256.digest(byteArray) + + private val secp256k1 = Secp256k1.get() + + private val random = SecureRandom() +} + +fun Int.toByteArray(): ByteArray { + val bytes = ByteArray(4) + (0..3).forEach { + bytes[3 - it] = ((this ushr (8 * it)) and 0xFFFF).toByte() + } + return bytes +} + +fun ByteArray.toNsec() = Bech32.encodeBytes(hrp = "nsec", this, Bech32.Encoding.Bech32) +fun ByteArray.toNpub() = Bech32.encodeBytes(hrp = "npub", this, Bech32.Encoding.Bech32) + +fun String.bechToBytes(hrp: String? = null): ByteArray { + val decodedForm = Bech32.decodeBytes(this) + hrp?.also { + if (it != decodedForm.first) { + throw IllegalArgumentException("Expected $it but obtained ${decodedForm.first}") + } + } + return decodedForm.second +} + +/** + * Interpret the string as Bech32 encoded and return hrp and ByteArray as Pair + */ +fun String.bechToBytesWithHrp() = Bech32.decodeBytes(this).run { Pair(first, second) } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/lnurl/LightningAddressResolver.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/lnurl/LightningAddressResolver.kt index 2ef6456dc..d34bae6ad 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/lnurl/LightningAddressResolver.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/lnurl/LightningAddressResolver.kt @@ -2,6 +2,7 @@ package com.vitorpamplona.amethyst.service.lnurl import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.vitorpamplona.amethyst.BuildConfig +import com.vitorpamplona.amethyst.service.Bech32 import com.vitorpamplona.amethyst.service.HttpClient import com.vitorpamplona.amethyst.service.checkNotInMainThread import kotlinx.coroutines.CoroutineScope @@ -9,7 +10,6 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import nostr.postr.Bech32 import okhttp3.Call import okhttp3.Callback import okhttp3.Request diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ATag.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ATag.kt index 10749bc4c..941498c37 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ATag.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ATag.kt @@ -4,11 +4,11 @@ import android.util.Log import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.hexToByteArray import com.vitorpamplona.amethyst.model.toHexKey +import com.vitorpamplona.amethyst.service.Bech32 +import com.vitorpamplona.amethyst.service.bechToBytes import com.vitorpamplona.amethyst.service.nip19.Tlv +import com.vitorpamplona.amethyst.service.toByteArray import fr.acinq.secp256k1.Hex -import nostr.postr.Bech32 -import nostr.postr.bechToBytes -import nostr.postr.toByteArray @Immutable data class ATag(val kind: Int, val pubKeyHex: String, val dTag: String, val relay: String?) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/AudioTrackEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/AudioTrackEvent.kt index 063802c46..b0046f00c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/AudioTrackEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/AudioTrackEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class AudioTrackEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BookmarkListEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BookmarkListEvent.kt index d342e52e1..9544e3d3a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BookmarkListEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BookmarkListEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class BookmarkListEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelCreateEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelCreateEvent.kt index 205e2674c..b09fe5195 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelCreateEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelCreateEvent.kt @@ -5,7 +5,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class ChannelCreateEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelHideMessageEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelHideMessageEvent.kt index 7379df593..e23e0049a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelHideMessageEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelHideMessageEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class ChannelHideMessageEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMessageEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMessageEvent.kt index 03ab09130..44b799fb3 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMessageEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMessageEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class ChannelMessageEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMetadataEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMetadataEvent.kt index ea5540c4b..cde0be5ae 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMetadataEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMetadataEvent.kt @@ -5,7 +5,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class ChannelMetadataEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMuteUserEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMuteUserEvent.kt index 9525d55be..7fcf187be 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMuteUserEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMuteUserEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class ChannelMuteUserEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ClassifiedsEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ClassifiedsEvent.kt index 12111a47b..6b9c8643d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ClassifiedsEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ClassifiedsEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class ClassifiedsEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/CommunityDefinitionEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/CommunityDefinitionEvent.kt index bfe7dd8a6..227ac2c7a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/CommunityDefinitionEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/CommunityDefinitionEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class CommunityDefinitionEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/CommunityPostApprovalEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/CommunityPostApprovalEvent.kt index 9537dd6fb..9bc6b7270 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/CommunityPostApprovalEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/CommunityPostApprovalEvent.kt @@ -5,8 +5,8 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey +import com.vitorpamplona.amethyst.service.Utils import com.vitorpamplona.amethyst.service.relays.Client -import nostr.postr.Utils @Immutable class CommunityPostApprovalEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ContactListEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ContactListEvent.kt index 361aca741..096a0bfc6 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ContactListEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ContactListEvent.kt @@ -8,7 +8,7 @@ import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.decodePublicKey import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable data class Contact(val pubKeyHex: String, val relayUri: String?) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/DeletionEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/DeletionEvent.kt index ed6316e42..41d7d5b98 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/DeletionEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/DeletionEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class DeletionEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/EmojiPackEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/EmojiPackEvent.kt index 4ca9dcafb..2a2ad5127 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/EmojiPackEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/EmojiPackEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class EmojiPackEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/EmojiPackSelectionEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/EmojiPackSelectionEvent.kt index 1b013e832..9b7271547 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/EmojiPackSelectionEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/EmojiPackSelectionEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class EmojiPackSelectionEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt index abe1249be..36a1ce321 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt @@ -7,11 +7,10 @@ import com.google.gson.annotations.SerializedName import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey +import com.vitorpamplona.amethyst.service.Utils import com.vitorpamplona.amethyst.service.nip19.Nip19 import fr.acinq.secp256k1.Hex import fr.acinq.secp256k1.Secp256k1 -import nostr.postr.Utils -import nostr.postr.toHex import java.lang.reflect.Type import java.math.BigDecimal import java.security.MessageDigest @@ -251,7 +250,7 @@ open class Event( src: ByteArray, typeOfSrc: Type?, context: JsonSerializationContext? - ) = JsonPrimitive(src.toHex()) + ) = JsonPrimitive(src.toHexKey()) } companion object { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileHeaderEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileHeaderEvent.kt index 1a95c7595..ecf9aef7d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileHeaderEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileHeaderEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class FileHeaderEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageEvent.kt index 533432102..ee996595e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageEvent.kt @@ -5,7 +5,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils import java.util.Base64 @Immutable diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageHeaderEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageHeaderEvent.kt index 5d5dc6f14..d647fa2ee 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageHeaderEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageHeaderEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class FileStorageHeaderEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/GeneralListEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/GeneralListEvent.kt index fe7c599d3..a41fcf076 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/GeneralListEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/GeneralListEvent.kt @@ -5,7 +5,7 @@ import androidx.compose.runtime.Immutable import com.google.gson.reflect.TypeToken import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.hexToByteArray -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable abstract class GeneralListEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/GenericRepostEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/GenericRepostEvent.kt index bd816408b..39c5786e1 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/GenericRepostEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/GenericRepostEvent.kt @@ -4,8 +4,8 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey +import com.vitorpamplona.amethyst.service.Utils import com.vitorpamplona.amethyst.service.relays.Client -import nostr.postr.Utils @Immutable class GenericRepostEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/HTTPAuthorizationEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/HTTPAuthorizationEvent.kt index 57c7989d6..bfda59c88 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/HTTPAuthorizationEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/HTTPAuthorizationEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils import java.security.MessageDigest @Immutable diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/HighlightEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/HighlightEvent.kt index ef5837514..679445e4c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/HighlightEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/HighlightEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class HighlightEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LiveActivitiesChatMessageEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LiveActivitiesChatMessageEvent.kt index e5995e8f8..835eb10af 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LiveActivitiesChatMessageEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LiveActivitiesChatMessageEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class LiveActivitiesChatMessageEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LiveActivitiesEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LiveActivitiesEvent.kt index 17fdc331f..4f2e00038 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LiveActivitiesEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LiveActivitiesEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class LiveActivitiesEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentRequestEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentRequestEvent.kt index b5f759c3a..ad75af13b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentRequestEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentRequestEvent.kt @@ -10,7 +10,7 @@ import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.hexToByteArray import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils import java.lang.reflect.Type @Immutable diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentResponseEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentResponseEvent.kt index 4e4c41a90..fde765d0e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentResponseEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentResponseEvent.kt @@ -8,7 +8,7 @@ import com.google.gson.JsonElement import com.google.gson.JsonParseException import com.google.gson.annotations.SerializedName import com.vitorpamplona.amethyst.model.HexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils import java.lang.reflect.Type @Immutable diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapRequestEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapRequestEvent.kt index cc6a7c667..a12cfa9cf 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapRequestEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapRequestEvent.kt @@ -2,8 +2,8 @@ package com.vitorpamplona.amethyst.service.model import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.* -import nostr.postr.Bech32 -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Bech32 +import com.vitorpamplona.amethyst.service.Utils import java.nio.charset.Charset import java.security.MessageDigest import java.security.SecureRandom diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LongTextNoteEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LongTextNoteEvent.kt index d37d4e58a..b37f49555 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LongTextNoteEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LongTextNoteEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class LongTextNoteEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/MetadataEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/MetadataEvent.kt index bbf3cd904..aa27cf171 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/MetadataEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/MetadataEvent.kt @@ -10,7 +10,7 @@ import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.UserMetadata import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils import java.io.ByteArrayInputStream @Stable diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/MuteListEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/MuteListEvent.kt index 6f1237d92..6c5009f37 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/MuteListEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/MuteListEvent.kt @@ -7,7 +7,7 @@ import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.hexToByteArray import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class MuteListEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/NNSEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/NNSEvent.kt index 52d9a9100..2b36e4f43 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/NNSEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/NNSEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class NNSEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PeopleListEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PeopleListEvent.kt index 751c4630d..4e1e63f5e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PeopleListEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PeopleListEvent.kt @@ -4,10 +4,10 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey +import com.vitorpamplona.amethyst.service.Utils import kotlinx.collections.immutable.ImmutableSet import kotlinx.collections.immutable.persistentSetOf import kotlinx.collections.immutable.toImmutableSet -import nostr.postr.Utils @Immutable class PeopleListEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PinListEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PinListEvent.kt index d1319593e..2cfafaeb7 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PinListEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PinListEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class PinListEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PollNoteEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PollNoteEvent.kt index 5c9b72764..562a56312 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PollNoteEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PollNoteEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils const val POLL_OPTION = "poll_option" const val VALUE_MAXIMUM = "value_maximum" diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PrivateDmEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PrivateDmEvent.kt index 43cbc1174..ad06c8060 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PrivateDmEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PrivateDmEvent.kt @@ -6,9 +6,8 @@ import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey import com.vitorpamplona.amethyst.service.HexValidator +import com.vitorpamplona.amethyst.service.Utils import fr.acinq.secp256k1.Hex -import nostr.postr.Utils -import nostr.postr.toHex @Immutable class PrivateDmEvent( @@ -97,7 +96,7 @@ class PrivateDmEvent( val pubKey = Utils.pubkeyCreate(privateKey).toHexKey() val tags = mutableListOf>() publishedRecipientPubKey?.let { - tags.add(listOf("p", publishedRecipientPubKey.toHex())) + tags.add(listOf("p", publishedRecipientPubKey.toHexKey())) } replyTos?.forEach { tags.add(listOf("e", it)) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReactionEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReactionEvent.kt index 96a6cab14..7c5eef499 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReactionEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReactionEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class ReactionEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RecommendRelayEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RecommendRelayEvent.kt index 6f1e7fb17..8351e6c64 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RecommendRelayEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RecommendRelayEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils import java.net.URI @Immutable diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RelayAuthEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RelayAuthEvent.kt index cbc8ae6ed..8511d3e5b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RelayAuthEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RelayAuthEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class RelayAuthEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RelaySetEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RelaySetEvent.kt index 260adaacd..3c66e4cb0 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RelaySetEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RelaySetEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable class RelaySetEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReportEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReportEvent.kt index d137f3e9b..56475359c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReportEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReportEvent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Utils +import com.vitorpamplona.amethyst.service.Utils @Immutable data class ReportedKey(val key: String, val reportType: ReportEvent.ReportType) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RepostEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RepostEvent.kt index 9fb0da2d2..a6529b905 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RepostEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RepostEvent.kt @@ -4,8 +4,8 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey +import com.vitorpamplona.amethyst.service.Utils import com.vitorpamplona.amethyst.service.relays.Client -import nostr.postr.Utils @Immutable class RepostEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/TextNoteEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/TextNoteEvent.kt index 577c557bc..18f4fa877 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/TextNoteEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/TextNoteEvent.kt @@ -6,8 +6,8 @@ import com.linkedin.urls.detection.UrlDetectorOptions import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.toHexKey +import com.vitorpamplona.amethyst.service.Utils import com.vitorpamplona.amethyst.ui.screen.loggedIn.findHashtags -import nostr.postr.Utils @Immutable class TextNoteEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/nip19/Nip19.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/nip19/Nip19.kt index 57fe67051..d64606396 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/nip19/Nip19.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/nip19/Nip19.kt @@ -4,9 +4,9 @@ import android.util.Log import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.hexToByteArray import com.vitorpamplona.amethyst.model.toHexKey -import nostr.postr.Bech32 -import nostr.postr.bechToBytes -import nostr.postr.toByteArray +import com.vitorpamplona.amethyst.service.Bech32 +import com.vitorpamplona.amethyst.service.bechToBytes +import com.vitorpamplona.amethyst.service.toByteArray import java.util.regex.Pattern object Nip19 { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index ad6d0015e..a66792b96 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -118,6 +118,7 @@ import com.vitorpamplona.amethyst.service.model.RelaySetEvent import com.vitorpamplona.amethyst.service.model.ReportEvent import com.vitorpamplona.amethyst.service.model.RepostEvent import com.vitorpamplona.amethyst.service.model.TextNoteEvent +import com.vitorpamplona.amethyst.service.toNpub import com.vitorpamplona.amethyst.ui.actions.ImmutableListOfLists import com.vitorpamplona.amethyst.ui.actions.NewRelayListView import com.vitorpamplona.amethyst.ui.actions.toImmutableListOfLists @@ -191,7 +192,6 @@ import kotlinx.collections.immutable.persistentSetOf import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import nostr.postr.toNpub import java.io.File import java.math.BigDecimal import java.net.URL diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PubKeyFormatter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PubKeyFormatter.kt index af628e2e0..2ff0d3799 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PubKeyFormatter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PubKeyFormatter.kt @@ -1,9 +1,9 @@ package com.vitorpamplona.amethyst.ui.note -import nostr.postr.toHex +import com.vitorpamplona.amethyst.model.toHexKey fun ByteArray.toShortenHex(): String { - return toHex().toShortenHex() + return toHexKey().toShortenHex() } fun String.toShortenHex(): String { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt index f47718847..f4b35af51 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt @@ -9,6 +9,8 @@ import com.vitorpamplona.amethyst.ServiceManager import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.hexToByteArray import com.vitorpamplona.amethyst.service.HttpClient +import com.vitorpamplona.amethyst.service.Persona +import com.vitorpamplona.amethyst.service.bechToBytes import com.vitorpamplona.amethyst.service.nip19.Nip19 import fr.acinq.secp256k1.Hex import kotlinx.coroutines.CoroutineScope @@ -20,8 +22,6 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import nostr.postr.Persona -import nostr.postr.bechToBytes import java.util.regex.Pattern @Stable diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountBackupDialog.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountBackupDialog.kt index 561c1cbb4..64964c384 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountBackupDialog.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountBackupDialog.kt @@ -44,12 +44,12 @@ import com.halilibo.richtext.ui.material.MaterialRichText import com.halilibo.richtext.ui.resolveDefaults import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.Account +import com.vitorpamplona.amethyst.service.toNsec import com.vitorpamplona.amethyst.ui.actions.CloseButton import com.vitorpamplona.amethyst.ui.note.authenticate import com.vitorpamplona.amethyst.ui.theme.ButtonBorder import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch -import nostr.postr.toNsec @Composable fun AccountBackupDialog(account: Account, onClose: () -> Unit) {