Compare commits

...

11 Commits

Author SHA1 Message Date
fiatjaf
54dbeac2f2 NIP-91 IoT skeleton. 2023-10-11 10:50:18 -03:00
fiatjaf_
09ffb951c6 rework NIP-03 so it is actually usable (#804)
* rework nip-03 to be actually useful and usable.
* fixes.
* add ots verification flow.
2023-10-11 10:17:43 -03:00
Don
324c7aafdc Change wording to imply that reactions can target any event (#815)
* kind:17 generic reactions.

* `kind 7` is available for all kind events.

* `k` tag is not required.
2023-10-11 08:55:27 -03:00
Vic
21c6c12c52 Update 57.md (#808)
Clarify how multiple relays should be included in the zap request event
2023-10-10 21:57:12 -07:00
Nostr.Band
e9f8bc27b7 add spring.site to nip-07 (#810)
Add Spring.site as NIP07 implementation
2023-10-10 14:12:21 -03:00
mattn
acbdacb625 Merge pull request #801 from badonyx/65-normalize-uri
65: Normalize relay URIs
2023-10-07 13:57:35 +09:00
Asai Toshiya
aa1bf6d268 Add NIP-24 to list 2023-10-06 08:26:02 -03:00
git
0d267aab5a Better RFC reference 2023-10-02 15:34:24 -07:00
fiatjaf
b33409c099 make it clear that relays can keep multiple replaceable event versions. 2023-09-29 16:49:55 -03:00
git
4de43f65a1 Update RFC reference 2023-09-29 12:00:07 -07:00
git
3b5d3ca677 65: normalize relay uri 2023-09-29 11:46:30 -07:00
8 changed files with 183 additions and 111 deletions

6
01.md
View File

@@ -82,12 +82,14 @@ Kinds specify how clients should interpret the meaning of each event and the oth
And also a convention for kind ranges that allow for easier experimentation and flexibility of relay implementation: And also a convention for kind ranges that allow for easier experimentation and flexibility of relay implementation:
- for kind `n` such that `1000 <= n < 10000`, events are **regular**, which means they're all expected to be stored by relays. - for kind `n` such that `1000 <= n < 10000`, events are **regular**, which means they're all expected to be stored by relays.
- for kind `n` such that `10000 <= n < 20000 || n == 0 || n == 3`, events are **replaceable**, which means that, for each combination of `pubkey` and `kind`, only the latest event is expected to (SHOULD) be stored by relays, older versions are expected to be discarded. - for kind `n` such that `10000 <= n < 20000 || n == 0 || n == 3`, events are **replaceable**, which means that, for each combination of `pubkey` and `kind`, only the latest event MUST be stored by relays, older versions MAY be discarded.
- for kind `n` such that `20000 <= n < 30000`, events are **ephemeral**, which means they are not expected to be stored by relays. - for kind `n` such that `20000 <= n < 30000`, events are **ephemeral**, which means they are not expected to be stored by relays.
- for kind `n` such that `30000 <= n < 40000`, events are **parameterized replaceable**, which means that, for each combination of `pubkey`, `kind` and the `d` tag's first value, only the latest event is expected to be stored by relays, older versions are expected to be discarded. - for kind `n` such that `30000 <= n < 40000`, events are **parameterized replaceable**, which means that, for each combination of `pubkey`, `kind` and the `d` tag's first value, only the latest event MUST be stored by relays, older versions MAY be discarded.
In case of replaceable events with the same timestamp, the event with the lowest id (first in lexical order) should be retained, and the other discarded. In case of replaceable events with the same timestamp, the event with the lowest id (first in lexical order) should be retained, and the other discarded.
When answering to `REQ` messages for replaceable events such as `{"kinds":[0],"authors":[<hex-key>]}`, even if the relay has more than one version stored, it SHOULD return just the latest one.
These are just conventions and relay implementations may differ. These are just conventions and relay implementations may differ.
## Communication between clients and relays ## Communication between clients and relays

33
03.md
View File

@@ -4,20 +4,33 @@ NIP-03
OpenTimestamps Attestations for Events OpenTimestamps Attestations for Events
-------------------------------------- --------------------------------------
`draft` `optional` `author:fiatjaf` `draft` `optional` `author:fiatjaf` `author:constant`
When there is an OTS available it MAY be included in the existing event body under the `ots` key: This NIP defines an event with `kind:1040` that can contain an [OpenTimestamps](https://opentimestamps.org/) proof for any other event:
``` ```json
{ {
"id": ..., "kind": 1040
"kind": ..., "tags": [
..., ["e", <event-id>, <relay-url>],
..., ["block", <block-height-as-string>, <block-hash>],
"ots": <base64-encoded OTS file data> ["alt", "opentimestamps attestation"]
],
"content": <base64-encoded OTS file data>
} }
``` ```
The _event id_ MUST be used as the raw hash to be included in the OpenTimestamps merkle tree. - The OpenTimestamps proof MUST prove the referenced `e` event id as its digest.
- The `block` tag is optional, it exists to establish a minimum date since which the given event has existed.
- The `content` MUST be the full content of an `.ots` file containing at least one Bitcoin attestation. This file SHOULD contain a **single** Bitcoin attestation and no reference to "pending" attestations since they are useless in this context.
The attestation can be either provided by relays automatically (and the OTS binary contents just appended to the events it receives) or by clients themselves when they first upload the event to relays — and used by clients to show that an event is really "at least as old as [OTS date]". ### Example OpenTimestamps proof verification flow
Using [`nak`](https://github.com/fiatjaf/nak), [`jq`](https://jqlang.github.io/jq/) and [`ots`](https://github.com/fiatjaf/ots):
```bash
~> nak req -i e71c6ea722987debdb60f81f9ea4f604b5ac0664120dd64fb9d23abc4ec7c323 wss://nostr-pub.wellorder.net | jq -r .content | ots verify
> using an esplora server at https://blockstream.info/api
- sequence ending on block 810391 is valid
timestamp validated at block [810391]
```

1
07.md
View File

@@ -33,3 +33,4 @@ async window.nostr.nip04.decrypt(pubkey, ciphertext): string // takes ciphertext
- [AKA Profiles](https://github.com/neilck/aka-extension) (Chrome, stores multiple keys) - [AKA Profiles](https://github.com/neilck/aka-extension) (Chrome, stores multiple keys)
- [TokenPocket](https://www.tokenpocket.pro/) (Android, IOS, Chrome and derivatives) - [TokenPocket](https://www.tokenpocket.pro/) (Android, IOS, Chrome and derivatives)
- [Nostrmo](https://github.com/haorendashu/nostrmo_faq#download) (Android, IOS) - [Nostrmo](https://github.com/haorendashu/nostrmo_faq#download) (Android, IOS)
- [Spring Browser](https://spring.site) (Android)

6
25.md
View File

@@ -7,7 +7,7 @@ Reactions
`draft` `optional` `author:jb55` `draft` `optional` `author:jb55`
A reaction is a `kind 7` note that is used to react to other notes. A reaction is a `kind 7` event that is used to react to other events.
The generic reaction, represented by the `content` set to a `+` string, SHOULD The generic reaction, represented by the `content` set to a `+` string, SHOULD
be interpreted as a "like" or "upvote". be interpreted as a "like" or "upvote".
@@ -34,6 +34,9 @@ The last `e` tag MUST be the `id` of the note that is being reacted to.
The last `p` tag MUST be the `pubkey` of the event being reacted to. The last `p` tag MUST be the `pubkey` of the event being reacted to.
The reaction event MAY include a `k` tag with the stringified kind number
of the reacted event as its value.
Example code Example code
```swift ```swift
@@ -43,6 +46,7 @@ func make_like_event(pubkey: String, privkey: String, liked: NostrEvent) -> Nost
} }
tags.append(["e", liked.id]) tags.append(["e", liked.id])
tags.append(["p", liked.pubkey]) tags.append(["p", liked.pubkey])
tags.append(["k", liked.kind])
let ev = NostrEvent(content: "+", pubkey: pubkey, kind: 7, tags: tags) let ev = NostrEvent(content: "+", pubkey: pubkey, kind: 7, tags: tags)
ev.calculate_id() ev.calculate_id()
ev.sign(privkey: privkey) ev.sign(privkey: privkey)

4
57.md
View File

@@ -45,7 +45,7 @@ Example:
"kind": 9734, "kind": 9734,
"content": "Zap!", "content": "Zap!",
"tags": [ "tags": [
["relays", "wss://nostr-pub.wellorder.com"], ["relays", "wss://nostr-pub.wellorder.com", "wss://anotherrelay.example.com"],
["amount", "21000"], ["amount", "21000"],
["lnurl", "lnurl1dp68gurn8ghj7um5v93kketj9ehx2amn9uh8wetvdskkkmn0wahz7mrww4excup0dajx2mrv92x9xp"], ["lnurl", "lnurl1dp68gurn8ghj7um5v93kketj9ehx2amn9uh8wetvdskkkmn0wahz7mrww4excup0dajx2mrv92x9xp"],
["p", "04c915daefee38317fa734444acee390a8269fe5810b2241e5e6dd343dfbecc9"], ["p", "04c915daefee38317fa734444acee390a8269fe5810b2241e5e6dd343dfbecc9"],
@@ -66,7 +66,7 @@ A signed `zap request` event is not published, but is instead sent using a HTTP
- `nostr` is the `9734` `zap request` event, JSON encoded then URI encoded - `nostr` is the `9734` `zap request` event, JSON encoded then URI encoded
- `lnurl` is the lnurl pay url of the recipient, encoded using bech32 with the prefix `lnurl` - `lnurl` is the lnurl pay url of the recipient, encoded using bech32 with the prefix `lnurl`
This request should return a JSON response with a `pr` key, which is the invoice the sender must pay to finalize his zap. Here is an example flow: This request should return a JSON response with a `pr` key, which is the invoice the sender must pay to finalize his zap. Here is an example flow in javascript:
```javascript ```javascript
const senderPubkey // The sender's pubkey const senderPubkey // The sender's pubkey

2
65.md
View File

@@ -60,4 +60,4 @@ This NIP allows Clients to connect directly with the most up-to-date relay set f
5. If a relay signals support for this NIP in their [NIP-11](11.md) document that means they're willing to accept kind 10002 events from a broad range of users, not only their paying customers or whitelisted group. 5. If a relay signals support for this NIP in their [NIP-11](11.md) document that means they're willing to accept kind 10002 events from a broad range of users, not only their paying customers or whitelisted group.
6. Clients SHOULD trim trailing slashes (`/`) from relay URIs to canonicalize connections. 6. Clients SHOULD deduplicate connections by normalizing relay URIs according to [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986#section-6).

48
91.md Normal file
View File

@@ -0,0 +1,48 @@
NIP-91
======
IoT sensors and intents
-----------------------
`draft` `optional` `author:BlackCoffee` `author:arcbtc` `author:fiatjaf`
This NIP standardizes communication of public sensor and intent events in order to create an open, pluggable and interoperable standard for "Internet of Things" devices to communicate.
The standard event format follows the following template:
```js
{
"kind": <a number from the table below>,
"tags": [
["device", <optional device id>],
["alt", <optional human-readable translation of the event>],
],
"content": "<data according to the format in the table below>"
...
}
```
Ideally each device would have its own public key, which allows for easy command-and-control and comes with built-in trus guarantees (i.e. you know you're getting the data from the correct device if you know its key and can check the signature), but the `device` tag exists for when that is too cumbersome and more than one device is using the same key.
The `alt` tag follows NIP-31 and can accomodate all human-readable needs, like the device name or the human-readable name of the place it is in.
Other generic tags, like `g` for geolocation, may be included.
### Event Kinds
Kinds between 8000-8999 (inclusive) are reserved for this NIP, to be filled in the table below.
| kind | name | type | unit | example | description |
| ----- | ----- | ------ | ----- | ----- | -------- |
| 8000 | intent | | | | someone wants to trigger an action on a device? |
| 8001 | on | empty | | | device was turned on |
| 8002 | off | empty | | | device will turn off |
| 8003 | temperature | number | celsius | 20.9 | |
| 8004 | pressure | number | pascals | 1013 | |
| 8005 | location | array | decimal degrees | [51.5053, -0.08737] | |
| 8006 | light | | | | |
| 8007 | humidity | | | | |
| 8008 | rain | | | | |
| 8009 | moisture | | | | |
| 8010 | unary switch | | empty | | a sensor that detects if a thing happened or not |
| 8011 | binary switch | boolean | | true / false | a switch that can be turned on or off |

194
README.md
View File

@@ -38,6 +38,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
- [NIP-21: `nostr:` URI scheme](21.md) - [NIP-21: `nostr:` URI scheme](21.md)
- [NIP-22: Event `created_at` Limits](22.md) - [NIP-22: Event `created_at` Limits](22.md)
- [NIP-23: Long-form Content](23.md) - [NIP-23: Long-form Content](23.md)
- [NIP-24: Extra metadata fields and tags](24.md)
- [NIP-25: Reactions](25.md) - [NIP-25: Reactions](25.md)
- [NIP-26: Delegated Event Signing](26.md) - [NIP-26: Delegated Event Signing](26.md)
- [NIP-27: Text Note References](27.md) - [NIP-27: Text Note References](27.md)
@@ -66,66 +67,69 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
- [NIP-75: Zap Goals](75.md) - [NIP-75: Zap Goals](75.md)
- [NIP-78: Application-specific data](78.md) - [NIP-78: Application-specific data](78.md)
- [NIP-89: Recommended Application Handlers](89.md) - [NIP-89: Recommended Application Handlers](89.md)
- [NIP-91: IoT Sensors and Intents](91.md)
- [NIP-94: File Metadata](94.md) - [NIP-94: File Metadata](94.md)
- [NIP-98: HTTP Auth](98.md) - [NIP-98: HTTP Auth](98.md)
- [NIP-99: Classified Listings](99.md) - [NIP-99: Classified Listings](99.md)
## Event Kinds ## Event Kinds
| kind | description | NIP | | kind | description | NIP |
| ------- | -------------------------- | ----------- | | ------- | -------------------------- | ----------- |
| `0` | Metadata | [1](01.md) | | `0` | Metadata | [1](01.md) |
| `1` | Short Text Note | [1](01.md) | | `1` | Short Text Note | [1](01.md) |
| `2` | Recommend Relay | | | `2` | Recommend Relay | |
| `3` | Contacts | [2](02.md) | | `3` | Contacts | [2](02.md) |
| `4` | Encrypted Direct Messages | [4](04.md) | | `4` | Encrypted Direct Messages | [4](04.md) |
| `5` | Event Deletion | [9](09.md) | | `5` | Event Deletion | [9](09.md) |
| `6` | Repost | [18](18.md) | | `6` | Repost | [18](18.md) |
| `7` | Reaction | [25](25.md) | | `7` | Reaction | [25](25.md) |
| `8` | Badge Award | [58](58.md) | | `8` | Badge Award | [58](58.md) |
| `16` | Generic Repost | [18](18.md) | | `16` | Generic Repost | [18](18.md) |
| `40` | Channel Creation | [28](28.md) | | `40` | Channel Creation | [28](28.md) |
| `41` | Channel Metadata | [28](28.md) | | `41` | Channel Metadata | [28](28.md) |
| `42` | Channel Message | [28](28.md) | | `42` | Channel Message | [28](28.md) |
| `43` | Channel Hide Message | [28](28.md) | | `43` | Channel Hide Message | [28](28.md) |
| `44` | Channel Mute User | [28](28.md) | | `44` | Channel Mute User | [28](28.md) |
| `1063` | File Metadata | [94](94.md) | | `1063` | File Metadata | [94](94.md) |
| `1311` | Live Chat Message | [53](53.md) | | `1311` | Live Chat Message | [53](53.md) |
| `1984` | Reporting | [56](56.md) | | `1040` | OpenTimestamps | [03](03.md) |
| `1985` | Label | [32](32.md) | | `1984` | Reporting | [56](56.md) |
| `4550` | Community Post Approval | [72](72.md) | | `1985` | Label | [32](32.md) |
| `9041` | Zap Goal | [75](75.md) | | `8000-8999` | IoT Sensors and Intents | [91](91.md) |
| `9734` | Zap Request | [57](57.md) | | `4550` | Community Post Approval | [72](72.md) |
| `9735` | Zap | [57](57.md) | | `9041` | Zap Goal | [75](75.md) |
| `10000` | Mute List | [51](51.md) | | `9734` | Zap Request | [57](57.md) |
| `10001` | Pin List | [51](51.md) | | `9735` | Zap | [57](57.md) |
| `10002` | Relay List Metadata | [65](65.md) | | `10000` | Mute List | [51](51.md) |
| `13194` | Wallet Info | [47](47.md) | | `10001` | Pin List | [51](51.md) |
| `22242` | Client Authentication | [42](42.md) | | `10002` | Relay List Metadata | [65](65.md) |
| `23194` | Wallet Request | [47](47.md) | | `13194` | Wallet Info | [47](47.md) |
| `23195` | Wallet Response | [47](47.md) | | `22242` | Client Authentication | [42](42.md) |
| `24133` | Nostr Connect | [46](46.md) | | `23194` | Wallet Request | [47](47.md) |
| `27235` | HTTP Auth | [98](98.md) | | `23195` | Wallet Response | [47](47.md) |
| `30000` | Categorized People List | [51](51.md) | | `24133` | Nostr Connect | [46](46.md) |
| `30001` | Categorized Bookmark List | [51](51.md) | | `27235` | HTTP Auth | [98](98.md) |
| `30008` | Profile Badges | [58](58.md) | | `30000` | Categorized People List | [51](51.md) |
| `30009` | Badge Definition | [58](58.md) | | `30001` | Categorized Bookmark List | [51](51.md) |
| `30017` | Create or update a stall | [15](15.md) | | `30008` | Profile Badges | [58](58.md) |
| `30018` | Create or update a product | [15](15.md) | | `30009` | Badge Definition | [58](58.md) |
| `30023` | Long-form Content | [23](23.md) | | `30017` | Create or update a stall | [15](15.md) |
| `30024` | Draft Long-form Content | [23](23.md) | | `30018` | Create or update a product | [15](15.md) |
| `30078` | Application-specific Data | [78](78.md) | | `30023` | Long-form Content | [23](23.md) |
| `30311` | Live Event | [53](53.md) | | `30024` | Draft Long-form Content | [23](23.md) |
| `30315` | User Statuses | [38](38.md) | | `30078` | Application-specific Data | [78](78.md) |
| `30402` | Classified Listing | [99](99.md) | | `30311` | Live Event | [53](53.md) |
| `30403` | Draft Classified Listing | [99](99.md) | | `30315` | User Statuses | [38](38.md) |
| `31922` | Date-Based Calendar Event | [52](52.md) | | `30402` | Classified Listing | [99](99.md) |
| `31923` | Time-Based Calendar Event | [52](52.md) | | `30403` | Draft Classified Listing | [99](99.md) |
| `31924` | Calendar | [52](52.md) | | `31922` | Date-Based Calendar Event | [52](52.md) |
| `31925` | Calendar Event RSVP | [52](52.md) | | `31923` | Time-Based Calendar Event | [52](52.md) |
| `31989` | Handler recommendation | [89](89.md) | | `31924` | Calendar | [52](52.md) |
| `31990` | Handler information | [89](89.md) | | `31925` | Calendar Event RSVP | [52](52.md) |
| `34550` | Community Definition | [72](72.md) | | `31989` | Handler recommendation | [89](89.md) |
| `31990` | Handler information | [89](89.md) |
| `34550` | Community Definition | [72](72.md) |
## Message types ## Message types
@@ -155,47 +159,47 @@ Please update these lists when proposing NIPs introducing new event kinds.
## Standardized Tags ## Standardized Tags
| name | value | other parameters | NIP | | name | value | other parameters | NIP |
| ----------------- | ------------------------------------ | -------------------- | ------------------------ | | ----------------- | ------------------------------------ | -------------------- | ------------------------------------- |
| `e` | event id (hex) | relay URL, marker | [01](01.md), [10](10.md) | | `e` | event id (hex) | relay URL, marker | [01](01.md), [10](10.md) |
| `p` | pubkey (hex) | relay URL, petname | [01](01.md), [02](02.md) | | `p` | pubkey (hex) | relay URL, petname | [01](01.md), [02](02.md) |
| `a` | coordinates to an event | relay URL | [01](01.md) | | `a` | coordinates to an event | relay URL | [01](01.md) |
| `d` | identifier | -- | [01](01.md) | | `d` | identifier | -- | [01](01.md) |
| `alt` | summary | -- | [31](31.md) | | `alt` | summary | -- | [31](31.md) |
| `g` | geohash | -- | [52](52.md) | | `g` | geohash | -- | [52](52.md) |
| `i` | identity | proof | [39](39.md) | | `i` | identity | proof | [39](39.md) |
| `k` | kind number (string) | -- | [18](18.md), [72](72.md) | | `k` | kind number (string) | -- | [18](18.md), [25](25.md), [72](72.md) |
| `l` | label, label namespace | annotations | [32](32.md) | | `l` | label, label namespace | annotations | [32](32.md) |
| `L` | label namespace | -- | [32](32.md) | | `L` | label namespace | -- | [32](32.md) |
| `m` | MIME type | -- | [94](94.md) | | `m` | MIME type | -- | [94](94.md) |
| `r` | a reference (URL, etc) | petname | | | `r` | a reference (URL, etc) | petname | |
| `r` | relay url | marker | [65](65.md) | | `r` | relay url | marker | [65](65.md) |
| `t` | hashtag | -- | | | `t` | hashtag | -- | |
| `amount` | millisatoshis, stringified | -- | [57](57.md) | | `amount` | millisatoshis, stringified | -- | [57](57.md) |
| `bolt11` | `bolt11` invoice | -- | [57](57.md) | | `bolt11` | `bolt11` invoice | -- | [57](57.md) |
| `challenge` | challenge string | -- | [42](42.md) | | `challenge` | challenge string | -- | [42](42.md) |
| `content-warning` | reason | -- | [36](36.md) | | `content-warning` | reason | -- | [36](36.md) |
| `delegation` | pubkey, conditions, delegation token | -- | [26](26.md) | | `delegation` | pubkey, conditions, delegation token | -- | [26](26.md) |
| `description` | invoice/badge description | -- | [57](57.md), [58](58.md) | | `description` | invoice/badge description | -- | [57](57.md), [58](58.md) |
| `emoji` | shortcode, image URL | -- | [30](30.md) | | `emoji` | shortcode, image URL | -- | [30](30.md) |
| `expiration` | unix timestamp (string) | -- | [40](40.md) | | `expiration` | unix timestamp (string) | -- | [40](40.md) |
| `goal` | event id (hex) | relay URL | [75](75.md) | | `goal` | event id (hex) | relay URL | [75](75.md) |
| `image` | image URL | dimensions in pixels | [23](23.md), [58](58.md) | | `image` | image URL | dimensions in pixels | [23](23.md), [58](58.md) |
| `lnurl` | `bech32` encoded `lnurl` | -- | [57](57.md) | | `lnurl` | `bech32` encoded `lnurl` | -- | [57](57.md) |
| `location` | location string | -- | [52](52.md), [99](99.md) | | `location` | location string | -- | [52](52.md), [99](99.md) |
| `name` | badge name | -- | [58](58.md) | | `name` | badge name | -- | [58](58.md) |
| `nonce` | random | -- | [13](13.md) | | `nonce` | random | -- | [13](13.md) |
| `preimage` | hash of `bolt11` invoice | -- | [57](57.md) | | `preimage` | hash of `bolt11` invoice | -- | [57](57.md) |
| `price` | price | currency, frequency | [99](99.md) | | `price` | price | currency, frequency | [99](99.md) |
| `proxy` | external ID | protocol | [48](48.md) | | `proxy` | external ID | protocol | [48](48.md) |
| `published_at` | unix timestamp (string) | -- | [23](23.md) | | `published_at` | unix timestamp (string) | -- | [23](23.md) |
| `relay` | relay url | -- | [42](42.md) | | `relay` | relay url | -- | [42](42.md) |
| `relays` | relay list | -- | [57](57.md) | | `relays` | relay list | -- | [57](57.md) |
| `subject` | subject | -- | [14](14.md) | | `subject` | subject | -- | [14](14.md) |
| `summary` | article summary | -- | [23](23.md) | | `summary` | article summary | -- | [23](23.md) |
| `thumb` | badge thumbnail | dimensions in pixels | [58](58.md) | | `thumb` | badge thumbnail | dimensions in pixels | [58](58.md) |
| `title` | article title | -- | [23](23.md) | | `title` | article title | -- | [23](23.md) |
| `zap` | pubkey (hex), relay URL | weight | [57](57.md) | | `zap` | pubkey (hex), relay URL | weight | [57](57.md) |
## Criteria for acceptance of NIPs ## Criteria for acceptance of NIPs