mirror of
https://github.com/nostr-protocol/nips.git
synced 2025-12-09 16:48:50 +00:00
Compare commits
1 Commits
alexgleaso
...
deleting-r
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0535f01508 |
4
02.md
4
02.md
@@ -8,9 +8,7 @@ Follow List
|
|||||||
|
|
||||||
A special event with kind `3`, meaning "follow list" is defined as having a list of `p` tags, one for each of the followed/known profiles one is following.
|
A special event with kind `3`, meaning "follow list" is defined as having a list of `p` tags, one for each of the followed/known profiles one is following.
|
||||||
|
|
||||||
Each tag entry should contain the key for the profile, a relay URL where events from that key can be found (can be set to an empty string if not needed), and a local name (or "petname") for that profile (can also be set to an empty string or not provided), i.e., `["p", <32-bytes hex key>, <main relay URL>, <petname>]`.
|
Each tag entry should contain the key for the profile, a relay URL where events from that key can be found (can be set to an empty string if not needed), and a local name (or "petname") for that profile (can also be set to an empty string or not provided), i.e., `["p", <32-bytes hex key>, <main relay URL>, <petname>]`. The `content` can be anything and should be ignored.
|
||||||
|
|
||||||
The `.content` is not used.
|
|
||||||
|
|
||||||
For example:
|
For example:
|
||||||
|
|
||||||
|
|||||||
15
09.md
15
09.md
@@ -14,14 +14,13 @@ The event's `content` field MAY contain a text note describing the reason for th
|
|||||||
|
|
||||||
For example:
|
For example:
|
||||||
|
|
||||||
```
|
```jsonc
|
||||||
{
|
{
|
||||||
"kind": 5,
|
"kind": 5,
|
||||||
"pubkey": <32-bytes hex-encoded public key of the event creator>,
|
"pubkey": <32-bytes hex-encoded public key of the event creator>,
|
||||||
"tags": [
|
"tags": [
|
||||||
["e", "dcd59..464a2"],
|
["e", "dcd59..464a2"],
|
||||||
["e", "968c5..ad7a4"],
|
["e", "968c5..ad7a4"],
|
||||||
["a", "<kind>:<pubkey>:<d-identifier>"]
|
|
||||||
],
|
],
|
||||||
"content": "these posts were published by accident",
|
"content": "these posts were published by accident",
|
||||||
...other fields
|
...other fields
|
||||||
@@ -34,9 +33,9 @@ Relays SHOULD continue to publish/share the deletion events indefinitely, as cli
|
|||||||
|
|
||||||
## Client Usage
|
## Client Usage
|
||||||
|
|
||||||
Clients MAY choose to fully hide any events that are referenced by valid deletion events. This includes text notes, direct messages, or other yet-to-be defined event kinds. Alternatively, they MAY show the event along with an icon or other indication that the author has "disowned" the event. The `content` field MAY also be used to replace the deleted events' own content, although a user interface should clearly indicate that this is a deletion reason, not the original content.
|
Clients MAY choose to fully hide any events that are referenced by valid deletion events. This includes text notes, direct messages, or other yet-to-be defined event kinds. Alternatively, they MAY show the event along with an icon or other indication that the author has "disowned" the event. The `content` field MAY also be used to replace the deleted events' own content, although a user interface should clearly indicate that this is a deletion reason, not the original content.
|
||||||
|
|
||||||
A client MUST validate that each event `pubkey` referenced in the `e` tag of the deletion request is identical to the deletion request `pubkey`, before hiding or deleting any event. Relays can not, in general, perform this validation and should not be treated as authoritative.
|
A client MUST validate that each event `pubkey` referenced in the `e` tag of the deletion request is identical to the deletion request `pubkey`, before hiding or deleting any event. Relays can not, in general, perform this validation and should not be treated as authoritative.
|
||||||
|
|
||||||
Clients display the deletion event itself in any way they choose, e.g., not at all, or with a prominent notice.
|
Clients display the deletion event itself in any way they choose, e.g., not at all, or with a prominent notice.
|
||||||
|
|
||||||
@@ -46,4 +45,10 @@ Relays MAY validate that a deletion event only references events that have the s
|
|||||||
|
|
||||||
## Deleting a Deletion
|
## Deleting a Deletion
|
||||||
|
|
||||||
Publishing a deletion event against a deletion has no effect. Clients and relays are not obliged to support "undelete" functionality.
|
Publishing a deletion event against a deletion has no effect. Clients and relays are not obliged to support "undelete" functionality.
|
||||||
|
|
||||||
|
## Deleting Replaceable Events
|
||||||
|
|
||||||
|
Because of their changing nature it's hard to get rid of all instance of a replaceable event (ranges `10000...19999` and `30000...39999`). We also don't want to publish a `kind:5` targeting an `a` reference and thus permanently delete any future events that could possibly have the same specifieds `kind` and `d`-tag forever.
|
||||||
|
|
||||||
|
So instead to delete a replaceable event we **overwrite** it with an event with the same `kind` and `d`-tag, plus a tag `["deleted"]` specifying no other tags.
|
||||||
|
|||||||
538
100.md
538
100.md
@@ -1,538 +0,0 @@
|
|||||||
# NIP-100
|
|
||||||
|
|
||||||
## Android Signer Application
|
|
||||||
|
|
||||||
`draft` `optional`
|
|
||||||
|
|
||||||
This NIP describes a method for 2-way communication between an Android signer and any Nostr client on Android. The Android signer is an Android Application and the client can be a web client or an Android application.
|
|
||||||
|
|
||||||
# Usage for Android applications
|
|
||||||
|
|
||||||
The Android signer uses Intents and Content Resolvers to communicate between applications.
|
|
||||||
|
|
||||||
To be able to use the Android signer in your application you should add this to your AndroidManifest.xml:
|
|
||||||
|
|
||||||
```xml
|
|
||||||
<queries>
|
|
||||||
<intent>
|
|
||||||
<action android:name="android.intent.action.VIEW" />
|
|
||||||
<category android:name="android.intent.category.BROWSABLE" />
|
|
||||||
<data android:scheme="nostrsigner" />
|
|
||||||
</intent>
|
|
||||||
</queries>
|
|
||||||
```
|
|
||||||
|
|
||||||
Then you can use this function to check if there's a signer application installed:
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
fun isExternalSignerInstalled(context: Context): Boolean {
|
|
||||||
val intent =
|
|
||||||
Intent().apply {
|
|
||||||
action = Intent.ACTION_VIEW
|
|
||||||
data = Uri.parse("nostrsigner:")
|
|
||||||
}
|
|
||||||
val infos = context.packageManager.queryIntentActivities(intent, 0)
|
|
||||||
return infos.size > 0
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Using Intents
|
|
||||||
|
|
||||||
To get the result back from the Signer Application you should use `registerForActivityResult` or `rememberLauncherForActivityResult` in Kotlin. If you are using another framework check the documentation of your framework or a third party library to get the result.
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val launcher = rememberLauncherForActivityResult(
|
|
||||||
contract = ActivityResultContracts.StartActivityForResult(),
|
|
||||||
onResult = { result ->
|
|
||||||
if (result.resultCode != Activity.RESULT_OK) {
|
|
||||||
Toast.makeText(
|
|
||||||
context,
|
|
||||||
"Sign request rejected",
|
|
||||||
Toast.LENGTH_SHORT
|
|
||||||
).show()
|
|
||||||
} else {
|
|
||||||
val signature = activityResult.data?.getStringExtra("signature")
|
|
||||||
// Do something with signature ...
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||
Create the Intent using the **nostrsigner** scheme:
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("nostrsigner:$content"))
|
|
||||||
```
|
|
||||||
|
|
||||||
Set the Signer package name:
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
intent.`package` = "com.example.signer"
|
|
||||||
```
|
|
||||||
|
|
||||||
Send the Intent:
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
launcher.launch(intent)
|
|
||||||
```
|
|
||||||
|
|
||||||
### Methods
|
|
||||||
|
|
||||||
- **get_public_key**
|
|
||||||
- params:
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("nostrsigner:"))
|
|
||||||
intent.`package` = "com.example.signer"
|
|
||||||
intent.putExtra("type", "get_public_key")
|
|
||||||
// You can send some default permissions for the user to authorize for ever
|
|
||||||
val permissions = listOf(
|
|
||||||
Permission(
|
|
||||||
type = "sign_event",
|
|
||||||
kind = 22242
|
|
||||||
),
|
|
||||||
Permission(
|
|
||||||
type = "nip44_decrypt"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
intent.putExtra("permissions", permissions.toJson())
|
|
||||||
context.startActivity(intent)
|
|
||||||
```
|
|
||||||
- result:
|
|
||||||
- If the user approved intent it will return the **npub** in the signature field
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val npub = intent.data?.getStringExtra("signature")
|
|
||||||
// The package name of the signer application
|
|
||||||
val packageName = intent.data?.getStringExtra("package")
|
|
||||||
```
|
|
||||||
|
|
||||||
- **sign_event**
|
|
||||||
- params:
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("nostrsigner:$eventJson"))
|
|
||||||
intent.`package` = "com.example.signer"
|
|
||||||
intent.putExtra("type", "sign_event")
|
|
||||||
// To handle results when not waiting between intents
|
|
||||||
intent.putExtra("id", event.id)
|
|
||||||
// Send the current logged in user npub
|
|
||||||
intent.putExtra("current_user", npub)
|
|
||||||
|
|
||||||
context.startActivity(intent)
|
|
||||||
```
|
|
||||||
- result:
|
|
||||||
- If the user approved intent it will return the **signature**, **id** and **event** fields
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val signature = intent.data?.getStringExtra("signature")
|
|
||||||
// The id you sent
|
|
||||||
val id = intent.data?.getStringExtra("id")
|
|
||||||
val signedEventJson = intent.data?.getStringExtra("event")
|
|
||||||
```
|
|
||||||
|
|
||||||
- **nip04_encrypt**
|
|
||||||
- params:
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("nostrsigner:$plaintext"))
|
|
||||||
intent.`package` = "com.example.signer"
|
|
||||||
intent.putExtra("type", "nip04_encrypt")
|
|
||||||
// to control the result in your application in case you are not waiting the result before sending another intent
|
|
||||||
intent.putExtra("id", "some_id")
|
|
||||||
// Send the current logged in user npub
|
|
||||||
intent.putExtra("current_user", account.keyPair.pubKey.toNpub())
|
|
||||||
// Send the hex pubKey that will be used for encrypting the data
|
|
||||||
intent.putExtra("pubKey", pubKey)
|
|
||||||
|
|
||||||
context.startActivity(intent)
|
|
||||||
```
|
|
||||||
- result:
|
|
||||||
- If the user approved intent it will return the **signature** and **id** fields
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val encryptedText = intent.data?.getStringExtra("signature")
|
|
||||||
// the id you sent
|
|
||||||
val id = intent.data?.getStringExtra("id")
|
|
||||||
```
|
|
||||||
|
|
||||||
- **nip44_encrypt**
|
|
||||||
- params:
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("nostrsigner:$plaintext"))
|
|
||||||
intent.`package` = "com.example.signer"
|
|
||||||
intent.putExtra("type", "nip44_encrypt")
|
|
||||||
// to control the result in your application in case you are not waiting the result before sending another intent
|
|
||||||
intent.putExtra("id", "some_id")
|
|
||||||
// Send the current logged in user npub
|
|
||||||
intent.putExtra("current_user", account.keyPair.pubKey.toNpub())
|
|
||||||
// Send the hex pubKey that will be used for encrypting the data
|
|
||||||
intent.putExtra("pubKey", pubKey)
|
|
||||||
|
|
||||||
context.startActivity(intent)
|
|
||||||
```
|
|
||||||
- result:
|
|
||||||
- If the user approved intent it will return the **signature** and **id** fields
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val encryptedText = intent.data?.getStringExtra("signature")
|
|
||||||
// the id you sent
|
|
||||||
val id = intent.data?.getStringExtra("id")
|
|
||||||
```
|
|
||||||
|
|
||||||
- **nip04_decrypt**
|
|
||||||
- params:
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("nostrsigner:$encryptedText"))
|
|
||||||
intent.`package` = "com.example.signer"
|
|
||||||
intent.putExtra("type", "nip04_decrypt")
|
|
||||||
// to control the result in your application in case you are not waiting the result before sending another intent
|
|
||||||
intent.putExtra("id", "some_id")
|
|
||||||
// Send the current logged in user npub
|
|
||||||
intent.putExtra("current_user", account.keyPair.pubKey.toNpub())
|
|
||||||
// Send the hex pubKey that will be used for decrypting the data
|
|
||||||
intent.putExtra("pubKey", pubKey)
|
|
||||||
|
|
||||||
context.startActivity(intent)
|
|
||||||
```
|
|
||||||
- result:
|
|
||||||
- If the user approved intent it will return the **signature** and **id** fields
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val plainText = intent.data?.getStringExtra("signature")
|
|
||||||
// the id you sent
|
|
||||||
val id = intent.data?.getStringExtra("id")
|
|
||||||
```
|
|
||||||
|
|
||||||
- **nip44_decrypt**
|
|
||||||
- params:
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("nostrsigner:$encryptedText"))
|
|
||||||
intent.`package` = "com.example.signer"
|
|
||||||
intent.putExtra("type", "nip04_decrypt")
|
|
||||||
// to control the result in your application in case you are not waiting the result before sending another intent
|
|
||||||
intent.putExtra("id", "some_id")
|
|
||||||
// Send the current logged in user npub
|
|
||||||
intent.putExtra("current_user", account.keyPair.pubKey.toNpub())
|
|
||||||
// Send the hex pubKey that will be used for decrypting the data
|
|
||||||
intent.putExtra("pubKey", pubKey)
|
|
||||||
|
|
||||||
context.startActivity(intent)
|
|
||||||
```
|
|
||||||
- result:
|
|
||||||
- If the user approved intent it will return the **signature** and **id** fields
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val plainText = intent.data?.getStringExtra("signature")
|
|
||||||
// the id you sent
|
|
||||||
val id = intent.data?.getStringExtra("id")
|
|
||||||
```
|
|
||||||
|
|
||||||
- **decrypt_zap_event**
|
|
||||||
- params:
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("nostrsigner:$eventJson"))
|
|
||||||
intent.`package` = "com.example.signer"
|
|
||||||
intent.putExtra("type", "decrypt_zap_event")
|
|
||||||
// to control the result in your application in case you are not waiting the result before sending another intent
|
|
||||||
intent.putExtra("id", "some_id")
|
|
||||||
// Send the current logged in user npub
|
|
||||||
intent.putExtra("current_user", account.keyPair.pubKey.toNpub())
|
|
||||||
context.startActivity(intent)
|
|
||||||
```
|
|
||||||
- result:
|
|
||||||
- If the user approved intent it will return the **signature** and **id** fields
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val eventJson = intent.data?.getStringExtra("signature")
|
|
||||||
// the id you sent
|
|
||||||
val id = intent.data?.getStringExtra("id")
|
|
||||||
```
|
|
||||||
|
|
||||||
## Using Content Resolver
|
|
||||||
|
|
||||||
To get the result back from Signer Application you should use contentResolver.query in Kotlin. If you are using another framework check the documentation of your framework or a third party library to get the result.
|
|
||||||
|
|
||||||
If the user did not check the "remember my choice" option, the npub is not in Signer Application or the signer type is not recognized the `contentResolver` will return null
|
|
||||||
|
|
||||||
For the SIGN_EVENT type Signer Application returns two columns "signature" and "event". The column event is the signed event json
|
|
||||||
|
|
||||||
For the other types Signer Application returns the column "signature"
|
|
||||||
|
|
||||||
If the user chose to always reject the event, signer application will return the column "rejected" and you should not open signer application
|
|
||||||
|
|
||||||
### Methods
|
|
||||||
|
|
||||||
- **get_public_key**
|
|
||||||
- params:
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val result = context.contentResolver.query(
|
|
||||||
Uri.parse("content://com.example.signer.GET_PUBLIC_KEY"),
|
|
||||||
listOf("login"),
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null
|
|
||||||
)
|
|
||||||
```
|
|
||||||
- result:
|
|
||||||
- Will return the **npub** in the signature column
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
if (result == null) return
|
|
||||||
|
|
||||||
if (result.moveToFirst()) {
|
|
||||||
val index = it.getColumnIndex("signature")
|
|
||||||
if (index < 0) return
|
|
||||||
val npub = it.getString(index)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- **sign_event**
|
|
||||||
- params:
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val result = context.contentResolver.query(
|
|
||||||
Uri.parse("content://com.example.signer.SIGN_EVENT"),
|
|
||||||
listOf("$eventJson", "", "${logged_in_user_npub}"),
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null
|
|
||||||
)
|
|
||||||
```
|
|
||||||
- result:
|
|
||||||
- Will return the **signature** and the **event** columns
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
if (result == null) return
|
|
||||||
|
|
||||||
if (result.moveToFirst()) {
|
|
||||||
val index = it.getColumnIndex("signature")
|
|
||||||
val indexJson = it.getColumnIndex("event")
|
|
||||||
val signature = it.getString(index)
|
|
||||||
val eventJson = it.getString(indexJson)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- **nip04_encrypt**
|
|
||||||
- params:
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val result = context.contentResolver.query(
|
|
||||||
Uri.parse("content://com.example.signer.NIP04_ENCRYPT"),
|
|
||||||
listOf("$plainText", "${hex_pub_key}", "${logged_in_user_npub}"),
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null
|
|
||||||
)
|
|
||||||
```
|
|
||||||
- result:
|
|
||||||
- Will return the **signature** column
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
if (result == null) return
|
|
||||||
|
|
||||||
if (result.moveToFirst()) {
|
|
||||||
val index = it.getColumnIndex("signature")
|
|
||||||
val encryptedText = it.getString(index)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- **nip44_encrypt**
|
|
||||||
- params:
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val result = context.contentResolver.query(
|
|
||||||
Uri.parse("content://com.example.signer.NIP44_ENCRYPT"),
|
|
||||||
listOf("$plainText", "${hex_pub_key}", "${logged_in_user_npub}"),
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null
|
|
||||||
)
|
|
||||||
```
|
|
||||||
- result:
|
|
||||||
- Will return the **signature** column
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
if (result == null) return
|
|
||||||
|
|
||||||
if (result.moveToFirst()) {
|
|
||||||
val index = it.getColumnIndex("signature")
|
|
||||||
val encryptedText = it.getString(index)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- **nip04_decrypt**
|
|
||||||
- params:
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val result = context.contentResolver.query(
|
|
||||||
Uri.parse("content://com.example.signer.NIP04_DECRYPT"),
|
|
||||||
listOf("$encryptedText", "${hex_pub_key}", "${logged_in_user_npub}"),
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null
|
|
||||||
)
|
|
||||||
```
|
|
||||||
- result:
|
|
||||||
- Will return the **signature** column
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
if (result == null) return
|
|
||||||
|
|
||||||
if (result.moveToFirst()) {
|
|
||||||
val index = it.getColumnIndex("signature")
|
|
||||||
val encryptedText = it.getString(index)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- **nip44_decrypt**
|
|
||||||
- params:
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val result = context.contentResolver.query(
|
|
||||||
Uri.parse("content://com.example.signer.NIP44_DECRYPT"),
|
|
||||||
listOf("$encryptedText", "${hex_pub_key}", "${logged_in_user_npub}"),
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null
|
|
||||||
)
|
|
||||||
```
|
|
||||||
- result:
|
|
||||||
- Will return the **signature** column
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
if (result == null) return
|
|
||||||
|
|
||||||
if (result.moveToFirst()) {
|
|
||||||
val index = it.getColumnIndex("signature")
|
|
||||||
val encryptedText = it.getString(index)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- **decrypt_zap_event**
|
|
||||||
- params:
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
val result = context.contentResolver.query(
|
|
||||||
Uri.parse("content://com.example.signer.DECRYPT_ZAP_EVENT"),
|
|
||||||
listOf("$eventJson", "", "${logged_in_user_npub}"),
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null
|
|
||||||
)
|
|
||||||
```
|
|
||||||
- result:
|
|
||||||
- Will return the **signature** column
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
if (result == null) return
|
|
||||||
|
|
||||||
if (result.moveToFirst()) {
|
|
||||||
val index = it.getColumnIndex("signature")
|
|
||||||
val eventJson = it.getString(index)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
# Usage for Web Applications
|
|
||||||
|
|
||||||
Since web applications can't receive a result from the intent, you should add a modal to paste the signature or the event json or create a callback url.
|
|
||||||
|
|
||||||
If you send the callback url parameter, Signer Application will send the result to the url.
|
|
||||||
|
|
||||||
If you don't send a callback url, Signer Application will copy the result to the clipboard.
|
|
||||||
|
|
||||||
You can configure the `returnType` to be **signature** or **event**.
|
|
||||||
|
|
||||||
Android intents and browser urls have limitations, so if you are using the `returnType` of **event** consider using the parameter **compressionType=gzip** that will return "Signer1" + Base64 gzip encoded event json
|
|
||||||
|
|
||||||
## Methods
|
|
||||||
|
|
||||||
- **get_public_key**
|
|
||||||
- params:
|
|
||||||
|
|
||||||
```js
|
|
||||||
window.href = `nostrsigner:?compressionType=none&returnType=signature&type=get_public_key&callbackUrl=https://example.com/?event=`;
|
|
||||||
```
|
|
||||||
|
|
||||||
- **sign_event**
|
|
||||||
- params:
|
|
||||||
|
|
||||||
```js
|
|
||||||
window.href = `nostrsigner:${eventJson}?compressionType=none&returnType=signature&type=sign_event&callbackUrl=https://example.com/?event=`;
|
|
||||||
```
|
|
||||||
|
|
||||||
- **nip04_encrypt**
|
|
||||||
- params:
|
|
||||||
|
|
||||||
```js
|
|
||||||
window.href = `nostrsigner:${plainText}?pubKey=${hex_pub_key}&compressionType=none&returnType=signature&type=nip04_encrypt&callbackUrl=https://example.com/?event=`;
|
|
||||||
```
|
|
||||||
|
|
||||||
- **nip44_encrypt**
|
|
||||||
- params:
|
|
||||||
|
|
||||||
```js
|
|
||||||
window.href = `nostrsigner:${plainText}?pubKey=${hex_pub_key}&compressionType=none&returnType=signature&type=nip44_encrypt&callbackUrl=https://example.com/?event=`;
|
|
||||||
```
|
|
||||||
|
|
||||||
- **nip04_decrypt**
|
|
||||||
- params:
|
|
||||||
|
|
||||||
```js
|
|
||||||
window.href = `nostrsigner:${encryptedText}?pubKey=${hex_pub_key}&compressionType=none&returnType=signature&type=nip04_decrypt&callbackUrl=https://example.com/?event=`;
|
|
||||||
```
|
|
||||||
|
|
||||||
- **nip44_decrypt**
|
|
||||||
- params:
|
|
||||||
|
|
||||||
```js
|
|
||||||
window.href = `nostrsigner:${encryptedText}?pubKey=${hex_pub_key}&compressionType=none&returnType=signature&type=nip44_decrypt&callbackUrl=https://example.com/?event=`;
|
|
||||||
```
|
|
||||||
|
|
||||||
- **decrypt_zap_event**
|
|
||||||
- params:
|
|
||||||
|
|
||||||
```js
|
|
||||||
window.href = `nostrsigner:${eventJson}?compressionType=none&returnType=signature&type=decrypt_zap_event&callbackUrl=https://example.com/?event=`;
|
|
||||||
```
|
|
||||||
|
|
||||||
## Example
|
|
||||||
|
|
||||||
```js
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>Document</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h1>Test</h1>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
window.onload = function() {
|
|
||||||
var url = new URL(window.location.href);
|
|
||||||
var params = url.searchParams;
|
|
||||||
if (params) {
|
|
||||||
var param1 = params.get("event");
|
|
||||||
if (param1) alert(param1)
|
|
||||||
}
|
|
||||||
let json = {
|
|
||||||
kind: 1,
|
|
||||||
content: "test"
|
|
||||||
}
|
|
||||||
let encodedJson = encodeURIComponent(JSON.stringify(json))
|
|
||||||
var newAnchor = document.createElement("a");
|
|
||||||
newAnchor.href = `nostrsigner:${encodedJson}?compressionType=none&returnType=signature&type=sign_event&callbackUrl=https://example.com/?event=`;
|
|
||||||
newAnchor.textContent = "Open External Signer";
|
|
||||||
document.body.appendChild(newAnchor)
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
```
|
|
||||||
3
25.md
3
25.md
@@ -67,7 +67,8 @@ content as an emoji if shortcode is specified.
|
|||||||
"tags": [
|
"tags": [
|
||||||
["emoji", "soapbox", "https://gleasonator.com/emoji/Gleasonator/soapbox.png"]
|
["emoji", "soapbox", "https://gleasonator.com/emoji/Gleasonator/soapbox.png"]
|
||||||
],
|
],
|
||||||
...other fields
|
"pubkey": "79c2cae114ea28a981e7559b4fe7854a473521a8d22a66bbab9fa248eb820ff6",
|
||||||
|
"created_at": 1682790000
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
4
38.md
4
38.md
@@ -46,8 +46,6 @@ Any other status types can be used but they are not defined by this NIP.
|
|||||||
|
|
||||||
The status MAY include an `r`, `p`, `e` or `a` tag linking to a URL, profile, note, or parameterized replaceable event.
|
The status MAY include an `r`, `p`, `e` or `a` tag linking to a URL, profile, note, or parameterized replaceable event.
|
||||||
|
|
||||||
The `content` MAY include emoji(s), or [NIP-30](30.md) custom emoji(s). If the `content` is an empty string then the client should clear the status.
|
|
||||||
|
|
||||||
# Client behavior
|
# Client behavior
|
||||||
|
|
||||||
Clients MAY display this next to the username on posts or profiles to provide live user status information.
|
Clients MAY display this next to the username on posts or profiles to provide live user status information.
|
||||||
@@ -59,3 +57,5 @@ Clients MAY display this next to the username on posts or profiles to provide li
|
|||||||
* Nostr music streaming services that update your music status when you're listening
|
* Nostr music streaming services that update your music status when you're listening
|
||||||
* Podcasting apps that update your music status when you're listening to a podcast, with a link for others to listen as well
|
* Podcasting apps that update your music status when you're listening to a podcast, with a link for others to listen as well
|
||||||
* Clients can use the system media player to update playing music status
|
* Clients can use the system media player to update playing music status
|
||||||
|
|
||||||
|
The `content` MAY include emoji(s), or [NIP-30](30.md) custom emoji(s). If the `content` is an empty string then the client should clear the status.
|
||||||
|
|||||||
2
53.md
2
53.md
@@ -77,7 +77,7 @@ Event `kind:1311` is live chat's channel message. Clients MUST include the `a` t
|
|||||||
|
|
||||||
## Use Cases
|
## Use Cases
|
||||||
|
|
||||||
Common use cases include meeting rooms/workshops, watch-together activities, or event spaces, such as [zap.stream](https://zap.stream).
|
Common use cases include meeting rooms/workshops, watch-together activities, or event spaces, such as [live.snort.social](https://live.snort.social) and [nostrnests.com](https://nostrnests.com).
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ reverse chronological order.
|
|||||||
|
|
||||||
| Date | Commit | NIP | Change |
|
| Date | Commit | NIP | Change |
|
||||||
| ----------- | --------- | -------- | ------ |
|
| ----------- | --------- | -------- | ------ |
|
||||||
| 2024-05-25 | [5d1d1c17](https://github.com/nostr-protocol/nips/commit/5d1d1c17) | [NIP-71](71.md) | 'aes-256-gcm' tag was removed |
|
|
||||||
| 2024-04-30 | [bad88262](https://github.com/nostr-protocol/nips/commit/bad88262) | [NIP-34](34.md) | 'earliest-unique-commit' tag was removed (use 'r' tag instead) |
|
| 2024-04-30 | [bad88262](https://github.com/nostr-protocol/nips/commit/bad88262) | [NIP-34](34.md) | 'earliest-unique-commit' tag was removed (use 'r' tag instead) |
|
||||||
| 2024-02-25 | [4a171cb0](https://github.com/nostr-protocol/nips/commit/4a171cb0) | [NIP-18](18.md) | quote repost should use `q` tag |
|
| 2024-02-25 | [4a171cb0](https://github.com/nostr-protocol/nips/commit/4a171cb0) | [NIP-18](18.md) | quote repost should use `q` tag |
|
||||||
| 2024-02-21 | [c6cd655c](https://github.com/nostr-protocol/nips/commit/c6cd655c) | [NIP-46](46.md) | Params were stringified |
|
| 2024-02-21 | [c6cd655c](https://github.com/nostr-protocol/nips/commit/c6cd655c) | [NIP-46](46.md) | Params were stringified |
|
||||||
|
|||||||
@@ -240,7 +240,7 @@ Please update these lists when proposing NIPs introducing new event kinds.
|
|||||||
| `L` | label namespace | -- | [32](32.md) |
|
| `L` | label namespace | -- | [32](32.md) |
|
||||||
| `m` | MIME type | -- | [94](94.md) |
|
| `m` | MIME type | -- | [94](94.md) |
|
||||||
| `q` | event id (hex) | relay URL | [18](18.md) |
|
| `q` | event id (hex) | relay URL | [18](18.md) |
|
||||||
| `r` | a reference (URL, etc) | petname | [24](24.md) |
|
| `r` | a reference (URL, etc) | petname | |
|
||||||
| `r` | relay url | marker | [65](65.md) |
|
| `r` | relay url | marker | [65](65.md) |
|
||||||
| `t` | hashtag | -- | |
|
| `t` | hashtag | -- | |
|
||||||
| `alt` | summary | -- | [31](31.md) |
|
| `alt` | summary | -- | [31](31.md) |
|
||||||
@@ -278,7 +278,7 @@ Please update these lists when proposing NIPs introducing new event kinds.
|
|||||||
|
|
||||||
## Criteria for acceptance of NIPs
|
## Criteria for acceptance of NIPs
|
||||||
|
|
||||||
1. They should be fully implemented in at least two clients and one relay -- when applicable.
|
1. They should be implemented in at least two clients and one relay -- when applicable.
|
||||||
2. They should make sense.
|
2. They should make sense.
|
||||||
3. They should be optional and backwards-compatible: care must be taken such that clients and relays that choose to not implement them do not stop working when interacting with the ones that choose to.
|
3. They should be optional and backwards-compatible: care must be taken such that clients and relays that choose to not implement them do not stop working when interacting with the ones that choose to.
|
||||||
4. There should be no more than one way of doing the same thing.
|
4. There should be no more than one way of doing the same thing.
|
||||||
|
|||||||
Reference in New Issue
Block a user