),
+}
+```
+
+A sample DAO policy can be seen below:
+
+
+Sample DAO policy
+
+
+``` bash
+View call: moondao.sputnikv2.testnet.get_policy()
+{
+ roles: [
+ { name: 'all', kind: 'Everyone', permissions: [], vote_policy: {} },
+ {
+ name: 'council',
+ kind: { Group: [ 'minqi.testnet' ] },
+ permissions: [
+ 'add_member_to_role:VoteRemove',
+ 'upgrade_self:VoteRemove',
+ 'policy:VoteReject',
+ 'bounty_done:AddProposal',
+ 'policy:VoteRemove',
+ 'set_vote_token:VoteReject',
+ 'upgrade_remote:AddProposal',
+ 'remove_member_from_role:VoteApprove',
+ 'add_bounty:VoteRemove',
+ 'vote:VoteApprove',
+ '*:Finalize',
+ 'bounty_done:VoteApprove',
+ 'transfer:VoteRemove',
+ 'add_bounty:VoteReject',
+ 'add_member_to_role:VoteReject',
+ 'set_vote_token:VoteRemove',
+ 'transfer:VoteApprove',
+ 'transfer:VoteReject',
+ 'config:VoteReject',
+ 'call:VoteReject',
+ 'remove_member_from_role:VoteReject',
+ 'policy:AddProposal',
+ 'bounty_done:VoteRemove',
+ 'set_vote_token:AddProposal',
+ 'upgrade_self:AddProposal',
+ 'set_vote_token:VoteApprove',
+ 'config:VoteApprove',
+ 'policy:VoteApprove',
+ 'add_bounty:VoteApprove',
+ 'remove_member_from_role:VoteRemove',
+ 'transfer:AddProposal',
+ 'upgrade_remote:VoteReject',
+ 'call:VoteApprove',
+ 'add_member_to_role:AddProposal',
+ 'call:AddProposal',
+ 'call:VoteRemove',
+ 'config:AddProposal',
+ 'remove_member_from_role:AddProposal',
+ 'upgrade_remote:VoteApprove',
+ 'upgrade_remote:VoteRemove',
+ 'upgrade_self:VoteApprove',
+ 'upgrade_self:VoteReject',
+ 'vote:VoteReject',
+ 'vote:VoteRemove',
+ 'vote:AddProposal',
+ 'add_member_to_role:VoteApprove',
+ 'config:VoteRemove',
+ 'add_bounty:AddProposal',
+ 'bounty_done:VoteReject'
+ ],
+ vote_policy: {
+ add_member_to_role: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] },
+ policy: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] },
+ vote: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] },
+ set_vote_token: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] },
+ remove_member_from_role: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] },
+ transfer: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] },
+ add_bounty: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] },
+ upgrade_self: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] },
+ bounty_done: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] },
+ call: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] },
+ config: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] },
+ upgrade_remote: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] }
+ }
+ },
+ {
+ name: 'Keypom DAO Bot',
+ kind: { Group: [ 'keypom-dao-bot.testnet' ] },
+ permissions: [
+ 'add_member_to_role:VoteApprove',
+ 'add_member_to_role:VoteRemove',
+ 'add_member_to_role:VoteReject',
+ 'add_member_to_role:AddProposal'
+ ],
+ vote_policy: {
+ transfer: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] },
+ upgrade_self: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] },
+ remove_member_from_role: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] },
+ set_vote_token: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] },
+ bounty_done: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] },
+ policy: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] },
+ add_member_to_role: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] },
+ call: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] },
+ config: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] },
+ upgrade_remote: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] },
+ vote: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] },
+ add_bounty: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] }
+ }
+ }
+ ],
+ default_vote_policy: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] },
+ proposal_bond: '100000000000000000000000',
+ proposal_period: '604800000000000',
+ bounty_bond: '100000000000000000000000',
+ bounty_forgiveness_period: '604800000000000'
+}
+```
+
+
+
+
+### Verifying Funder and Getting DAO Policy
+
+The first step is to call `get_policy` on the DAO contract. After `get_policy` is called, a callback function is invoked to receive and parse the policy.
+
+``` rust reference
+https://github.com/keypom/dao-bot/blob/2c3a7bac8b18e1134483f0736e2ca9e2152f8509/src/lib.rs#L103-L119
+```
+
+### Ensuring Funder is Council
+After the policy is received, the council role is found using a filter. The role's hashset is then searched to see if the funder exists in that set. If yes, then the auto-registration continues and `add_proposal` is called.
+
+```rust reference
+https://github.com/keypom/dao-bot/blob/2c3a7bac8b18e1134483f0736e2ca9e2152f8509/src/lib.rs#L122-L164
+```
+
+---
+
+## Human Gating the DAO Bot (Mainnet Only)
+With the introduction of the [SoulBound Token Standard](https://github.com/robert-zaremba/NEPs/blob/robert/nep-sbt/neps/nep-0393.md), a proof-of-humanity protocol was implemented on NEAR, known as [I-Am-Human](https://i-am-human.app/). With this came the ability to human-gate certain actions, such as self-nominating or participating in governance.
+
+As DAOs are critical in governance and community, the need to human-gate these automatic DAO registrations became a high priority. By leveraging the I-Am-Human Registry's [`is_human`](https://github.com/near-ndc/i-am-human#additional-queries) human checker, you can open up the option for you DAO auto-registrations to be human-gated using the following code to parse the `is_human` response.
+
+``` rust reference
+https://github.com/keypom/dao-bot/blob/a19a2d29b42514a1e9d5f11c993b79f207c4a00f/src/lib.rs#L158-L180
+```
+
+:::info
+This check will only be performed **if specified in the drop**! By default, human-gating is turned **off**.
+
+Below is an example of a drop that is human-gated. Notice the `human_only` parameter!
+:::
+
+``` js reference
+https://github.com/keypom/keypom-docs-examples/blob/290cbce2c939573dbc8cb2b03598c2b2af5f91c2/advanced-tutorials/dao-onboarding/createDaoDrop-mainnet.js#L48-L84
+```
+
+
+---
+
+## Full Code
+The code for this can be seen below:
+
+```rust reference
+https://github.com/keypom/dao-bot/blob/2c3a7bac8b18e1134483f0736e2ca9e2152f8509/src/lib.rs#L103-L164
+```
+
+:::info
+The full code for the completed DAO bot can be found [here](https://github.com/keypom/dao-bot/blob/main/src/lib.rs).
+:::
+
+---
+
+
+## Conclusion
+
+In this tutorial, you learned how people can use [malicious drops](#breaking-down-the-problem) to exploit your DAO. You then saw how you can protect yourself, by checking the incoming call's drop funder and their roles in your DAO. This started with [receiving the drop funder](#receiving-the-drop-funder) by using `keypom_args`, then [verifying injected arguments](#checking-the-drop-funder) and finally parsing the DAO policy and [checking the funder's roles](#ensuring-funder-is-council) in the DAO.
+
+All of this work ensures that only approved members (such as Council) can use Keypom FC drops to create auto-registration campaigns for your DAO. This helps ensure the integrity of your DAO as you bring on more new members.
+
+This concept and approach can be used any time where important assets or processes are gated only by arguments such as a DAO contract or NFT series ID. It is important to ensure that the incoming drop is coming from a trusted source and that the arguments are validated as having been injected by Keypom. This will protect you from malicious actors creating identical Keypom drops to exploit your products.
+
+In the next section, you'll be reviewing all of your work so far by testing the whole auto-registration system.
\ No newline at end of file
diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/homepage.md b/versioned_docs/version-2.0/Tutorials/Advanced/homepage.md
new file mode 100644
index 00000000..4d8ecddb
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Advanced/homepage.md
@@ -0,0 +1,6 @@
+---
+sidebar_label: 'Coming Soon...'
+---
+# Advanced Tutorials
+
+Advanced Tutorials are in progress!
\ No newline at end of file
diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/multi-sig/concept.md b/versioned_docs/version-2.0/Tutorials/Advanced/multi-sig/concept.md
new file mode 100644
index 00000000..07faeccd
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Advanced/multi-sig/concept.md
@@ -0,0 +1,4 @@
+---
+sidebar_label: 'Concept'
+---
+# Concept
\ No newline at end of file
diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/multi-sig/final.md b/versioned_docs/version-2.0/Tutorials/Advanced/multi-sig/final.md
new file mode 100644
index 00000000..d90001ba
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Advanced/multi-sig/final.md
@@ -0,0 +1,4 @@
+---
+sidebar_label: 'Final Product'
+---
+# Final Product
\ No newline at end of file
diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/multi-sig/skeleton.md b/versioned_docs/version-2.0/Tutorials/Advanced/multi-sig/skeleton.md
new file mode 100644
index 00000000..d5e552ef
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Advanced/multi-sig/skeleton.md
@@ -0,0 +1,4 @@
+---
+sidebar_label: 'Skeleton Code'
+---
+# Skeleton Code
\ No newline at end of file
diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/subscriptions/final.md b/versioned_docs/version-2.0/Tutorials/Advanced/subscriptions/final.md
new file mode 100644
index 00000000..d90001ba
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Advanced/subscriptions/final.md
@@ -0,0 +1,4 @@
+---
+sidebar_label: 'Final Product'
+---
+# Final Product
\ No newline at end of file
diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/subscriptions/introduction.md b/versioned_docs/version-2.0/Tutorials/Advanced/subscriptions/introduction.md
new file mode 100644
index 00000000..a7982f0e
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Advanced/subscriptions/introduction.md
@@ -0,0 +1,18 @@
+---
+sidebar_label: 'Introduction'
+---
+# Introduction
+
+Recurring payments are quite a common situation. Letโs say you need to send a contractor $50 USDC every week for 10 weeks. With Web2, you would need to provide a payment method and trust the end user with this sensitive information.
+
+Using Keypom, you can eliminate this risk by sending them a key with limited funds attached. Instead of exposing your private information, you could create a key with 10 uses, usable once a week. You can then pre-load $500 USDC for the 10 weeks, or $50 USDC for the first week and fund the rest as the work continues. At that point, you would simply hand over the key to the user and they can claim once a week.
+
+
+
+
+
+In this tutorial, you'll learn how to utilize Keypom to create Web3 recurring payments.
+
+:::info
+๐ง Full tutorial coming soon... ๐ง
+:::
\ No newline at end of file
diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/subscriptions/skeleton.md b/versioned_docs/version-2.0/Tutorials/Advanced/subscriptions/skeleton.md
new file mode 100644
index 00000000..d5e552ef
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Advanced/subscriptions/skeleton.md
@@ -0,0 +1,4 @@
+---
+sidebar_label: 'Skeleton Code'
+---
+# Skeleton Code
\ No newline at end of file
diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/analytics.md b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/analytics.md
new file mode 100644
index 00000000..ea0d32c3
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/analytics.md
@@ -0,0 +1,80 @@
+---
+sidebar_label: 'View Event Analytics'
+---
+# View Event Analytics
+## Introduction
+In this section you'll learn how to track your event's analytics, such as number of attendees that showed up, those that claimed POAPs and more! This can be broken down into two approaches:
+
+1) Creating a script.
+2) Using existing BOS tools.
+
+The focus for now will be the script. The next tutorial section will showcase the existing BOS tools.
+
+Starting at the `keypom-docs-examples` directory, navigate to the `ticket-app-skeleton/others` folder and open the `event-analytics.js` file.
+
+```bash
+cd advanced-tutorials/ticket-app-skeleton/others
+```
+
+There, you can see the following skeleton code in the file `event-analytics.js`.
+``` js reference
+https://github.com/keypom/keypom-docs-examples/blob/449992de80888934dcbccfadefd88601d9d6638d/advanced-tutorials/ticket-app-skeleton/others/event-analytics.js#L1-L31
+```
+
+---
+
+## Connecting to NEAR
+Connecting to the NEAR network is done with `NEAR-API-JS` and consists of:
+
+* Selecting which network to connect to (testnet or mainnet).
+
+* Specifying the location where the keys are stored for the drop funder's account. This location is commonly in the `~/.near-credentials` folder on your local machine.
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/449992de80888934dcbccfadefd88601d9d6638d/advanced-tutorials/ticket-app/others/event-analytics.js#L21-L38
+```
+
+---
+
+## Getting Drop and Keys
+Here, you want to make sure you get the proper drop that represents your event. To do this, you want to use the drop's `dropId`. In order to include the keys in the returned data, ensure that `withKeys` is true.
+
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/449992de80888934dcbccfadefd88601d9d6638d/advanced-tutorials/ticket-app/others/event-analytics.js#L42-L55
+```
+:::note
+If you don't have your `dropId`, you can use a key from the drop as well. This is done by passing in either `publicKey` or `secretKey` into `getDropInformation`
+:::
+
+The total number of tickets can also be found by using the drop's `next_key_id`. This will be helpful to determine how many keys have been fully claimed
+
+---
+
+## Compiling Data
+From the original [design of the ticket drop](architecture.md#keypom-solution), you know the following.
+
+* The first key use indicates when an attendee is scanned into the event.
+* The second key use sends the attendee a POAP, after which the key is deleted
+
+From this, you can derive the following about a key's [remaining uses](../../../keypom-sdk/Core/interfaces/ProtocolReturnedKeyInfo.md#remaining_uses).
+
+* `remaining_uses == 2`: the ticket has not yet been scanned, hence the ticket holder did not attend.
+* `remaining_uses == 1`: the attendee was scanned in and thus attended
+
+Notice how there is no case for when `remaining_uses` = 0. This is because when keys are fully used, they are deleted. This is when collecting the total number of keys above becomes helpful. The number of fully used keys can be found by subtracting the number of found keys from the total.
+
+* `drop.next_key_id - keys.length` = number of fully used keys.
+
+All this can be put into the following code block.
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/449992de80888934dcbccfadefd88601d9d6638d/advanced-tutorials/ticket-app/others/event-analytics.js#L57-L73
+```
+
+---
+
+## Conclusion
+In this short bonus section, you saw how to get analytics for your events. This consisted of getting the keys from your drop and keeping track of the number of remaining uses for each key.
+
+In the following section, you'll see some pre-built BOS tooling for a no-code solution!
\ No newline at end of file
diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/architecture.md b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/architecture.md
new file mode 100644
index 00000000..590d1839
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/architecture.md
@@ -0,0 +1,69 @@
+---
+sidebar_label: 'Solution Architecture'
+---
+# Solution Architecture
+In this section, you'll break down the requirements of the ticketing system in order to better understand how to create a solution architecture. This means translating the features from the [ticketing introduction](introduction.md) into tangible goals for the specific Keypom drop and its configurations.
+
+## Breaking Down the Problem
+Recall from earlier, the following features are needed:
+
+### No wallet is needed to enter
+
+With traditional events, you would need to burn an NFT in order to gain entry to the event. This model requires the attendee to have a valid wallet with enough $NEAR to cover transaction costs.
+
+With a Keypom access key, all you need is the private key to gain entrance. This can be turned into a simple QR code that is scanned at the door to gain entrance.
+
+### Each ticket is unique and cannot be passed-back
+
+In order to satisfy the requirement that each ticket must be unique and can only be scanned once, the key should be used to sign a simple transaction when it's scanned. This will prevent ticket pass-backs since the host can check the on-chain status of each key. If it's been used already, the host can deny entry.
+
+When the host scans the QR code and signs the transaction using the key, it should simply modify some state on the contract reflecting that the key has been used. It shouldn't transfer $NEAR to anyone or create any accounts and should be a lightweight transaction on-chain.
+
+By default, every key has a counter of how many uses it has left before being deleted. In the above scenario, you could create a key with 1 use and once it has been scanned, it will be deleted. If the same QR code would be given to multiple people, the host would realize that the key no longer exists and deny entry.
+
+To make this transaction extremely lightweight, Keypom allows keys to have `null` function calls whose entire purpose is to decrement the key use counter to prove that the key has been used. These special types of function calls use up a very small amount of gas and are extremely cheap to execute.
+
+### Attendees are not required to have wifi at the door.
+
+If the ticket is just a private key in the form of a QR code, the attendee only needs to keep a screenshot or the webpage open on their phone to gain entry to the event. In addition, Apple users can add it to their Apple Wallets as well. This eliminates the need for everyone to have wifi as only the hosts that are scanning and making transactions need wifi to admit attendees.
+
+### Attendees can setup a new NEAR wallet
+
+Up until this point, tickets are single-use function calls that execute a `null` method on Keypom. In order for attendees to receive a NEAR wallet after the event for free, the key can be set with 2 uses instead of 1. The first is the `null` method and the second is pre-loaded with a small amount of $NEAR. This $NEAR will cover costs for account creation and sponsor their first couple transactions.
+
+### NFT POAP available for attendees
+
+In order to send the attendees a POAP, the second key use will need to not only contain a small amount of $NEAR but also mint an NFT to their new or existing NEAR wallet. This can be done by call a minting function on an existing NFT contract that will create an NFT and send it to the account.
+
+### Attendance required for POAP
+
+Currently, anyone with a ticket could manually claim the key (sign transactions) using the Keypom SDK. This means that people could first claim the `null` case and then claim the key again to receive the NFT without physically showing up.
+
+To solve this, the first key use can be protected with a [password](../../../Concepts/KeypomProtocol/GithubReadme/password-protect.md) that only the host knows. This password will be provided when the QR code is scanned. By password protected the uses, the only way to receive the NFT even if you have the ticket, is to be physically scanned by the host.
+
+
+## Keypom Solution
+
+From above, the drop must have the following properties to function as intended:
+
+* A [Function Call drop](../../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/fc-drops.md) must be used and configured so that each key has 2 uses.
+* The first key use is password protected and `null` (for when the host scans attendees into the event).
+* The second key use will have a small amount of $NEAR to cover account creation costs and sponsor the first few transactions.
+* The second key use will also call `nft_mint` on an NFT contract which will send the new or existing account a POAP.
+
+:::tip
+The first key use being `null` will allow for a lightweight transaction on-chain to reflect the key use decrement without needing to transfer any $NEAR to anyone or create any accounts.
+:::
+
+A flow chart of this process can be seen below.
+
+
+
+
+
+---
+
+## Conclusion
+In this section, you learned the solutions that would help meet the required features outlined in the introduction. These included using an access key as a ticket to remove the need for attendees to have both a wallet and an internet connection at the door. You also saw how using a multi-use function call drop could allow you to add a Proof-of-Attendance NFT to gift attendees who show up to your event.
+
+In the next section, you'll be taking the Keypom drop architecture you just created and using it to create the drop.
diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/bos-tool.md b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/bos-tool.md
new file mode 100644
index 00000000..f64f87c3
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/bos-tool.md
@@ -0,0 +1,61 @@
+---
+sidebar_label: '๐ BOS Version'
+---
+# BOS Version
+During the [ETHGlobal Waterloo Hackathon](https://ethglobal.com/showcase/keypom-x-bos-event-ticketing-pow2e), a chunk of this tutorial was ported over to BOS. This section is a quick guide on how to use it.
+
+> If you run into any bugs or issues, don't hesitate to reach out to [Min on Telegram](https://t.me/minlu00)!
+
+## Using the BOS Tool
+The BOS version of the ticket app is located [here](https://near.org/mintlu.near/widget/kp-ticket-homepage). On this page, you can view your previous tickets, as well as create a new ticket drop.
+
+
+
+
+
+:::note
+**All** your drops will appear in the viewer, not just the ticket drops.
+:::
+
+### Creating Ticket Drops
+This section of the tool allows you to create a standard ticket drop. These drops use the following structure:
+- 2 Key uses
+ - First is null and password protected.
+ - Second mints the POAP
+- A customizable password and POAP. The POAP is minted as part of a series on `nft-v2.keypom.near`
+
+
+
+
+
+When using the tool, there are a few tips to keep in mind:
+- **Save your POAP information before creating the drop**
+ - This is **very** important, if you do not, the drop will be created without the POAP ๐ข
+- The name of the event will automatically be hyphenated and lowercased
+- When creating the drop, the password will not appear in the transaction information. This will populate after you press "Confirm"
+
+
+
+
+---
+
+## Using the Scanner
+To open the scanner on your own machine, you can clone the code from the [Keypom Docs Examples](https://github.com/keypom/keypom-docs-examples) repository and run the following command in the root folder `keypom-docs-examples/`:
+
+``` bash
+cd advanced-tutorials/ticket-app-mainnet && yarn && yarn start
+```
+
+This should bring you to the following page at `localhost:1234`
+
+
+
+
+
+From there, you can navigate to the following URL:
+```
+http://localhost:1234/v2.keypom.near/scanner
+```
+
+It will immediately prompt you for a password. This is the password you set in the [creating tickets section](#creating-ticket-drops). If you enter it incorrectly, you can refresh the page and re-enter the password. From there, you can begin presenting tickets and allowing people into your event!
+
diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/drop-test.md b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/drop-test.md
new file mode 100644
index 00000000..06cb9911
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/drop-test.md
@@ -0,0 +1,266 @@
+---
+sidebar_label: 'Testing the Drop'
+---
+# Testing the Drop
+
+## Introduction
+In the last section you designed and created a drop according to the specifications you learned about in the [Solution Architecture](architecture.md#keypom-solution).
+
+In this tutorial, you'll create a generalized method that will determine whether or not to allow someone entry into the event. It will be used to both test the drop logic and power the core functionality of the ticketing app.
+
+Starting at the `keypom-docs-examples` directory, navigate to `advanced-tutorials/ticket-app-skeleton/utils` folder and open the `allowEntry.js` file.
+
+```bash
+cd advanced-tutorials/ticket-app-skeleton/utils
+```
+
+This should show the following skeleton code.
+
+``` js reference
+https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app-skeleton/utils/allowEntry.js#L1-L14
+```
+
+---
+
+## Host Claiming Code
+
+In order to test the drop logic, a utility function will be created to emulate the host scanning tickets at the door and will be used by the frontend.
+
+The primary purpose of this function is to ingest a private key and password, and determine whether or not a ticket is valid. This means it will check for a few conditions before returning a success value.
+
+* The ticket is valid and has not been scanned yet.
+* The password entered by the host was correct and the claim was successful
+
+The `allowEntry` utility function takes in a private key, and a `basePassword`.
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/utils/allowEntry.js#L9-L49
+```
+
+## Testing Logic
+
+Now that the utility function has been created, it can be used to test the drop logic. This will be done in a new file called `testTickDrop.js` that will live in the same util directory. It will contain two different test functions:
+
+* `wrongPasswordCheck` - This will test the case where the wrong password is used to claim the ticket.
+* `doubleClaimCheck` - This is meant to check for invalid tickets. In this case, it will try to claim the same ticket twice in a row.
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app-skeleton/utils/testTickDrop.js#L1-L26
+```
+
+With both the drop created utility function defined, some code can be written to test the actual logic to ensure that the ticket claiming process works as expected. This will be broken down into phases, similar to the actual ticketing experience.
+
+### Wrong Password Check
+
+The first phase of the ticketing experience can be labelled as `pre-entry`, when the attendee is looking to enter the event. Here, you want to ensure that only the host can allow them in, meaning the first key use must only be claimable with the correct password.
+
+The following code can be used to test this logic, following the drop creation.
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/utils/testTickDrop.js#L5-L30
+```
+
+It's expected that after claiming with the incorrect password, `allowEntry` will return `false` since the key use remains at 1. However, once the correct password is provided, the `allowEntry` function should return `true`. In the tests, an `assert` function is used to ensure the proper behavior.
+
+### Preventing Multiple Entries
+
+Once an attendee has been scanned into the event, they may try to give their ticket to someone else. To test and prevent this, `allowEntry` can be called multiple times on the same ticket. It is expected that the first call should return `true` but once it scans the same ticket again, `false` should be returned.
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/utils/testTickDrop.js#L32-L57
+```
+
+With the drop functionality tested, you can be confident in the logic behind the scenes and focus on the app behavior.
+
+---
+
+
+## Full Code
+Now that everything has been put together, the final code can be seen below.
+
+
+Full Testing Code
+
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/utils/testTickDrop.js#L1-L75
+```
+
+
+
+
+---
+
+## Running the Script
+Here, you'll learn how to run the code that was just covered, and what to expect. It's assumed that you have already cloned the code from the [Keypom Docs Examples](https://github.com/keypom/keypom-docs-examples) repo.
+
+:::caution
+Prior to running these scripts, ensure you replace all instances of `minqi.testnet` with an account found in your `~/.near-credentials` folder
+:::
+
+To run the script, run the following command inside the `keypom-docs-examples/advanced-tutorials/ticket-app-skeleton` directory:
+
+```bash
+yarn test-ticket-drop
+```
+
+:::note
+If you'd like to run the already completed code found in the `ticket-app` directory instead of the skeleton code, run the same `yarn test-ticket-drop` command but inside of the `keypom-docs-examples/advanced-tutorials/ticket-app` directory instead.
+:::
+
+This should return a successful test after outputting logs:
+
+```bash
+Password Test Responses:
+Expected false, got: false
+Expected true, got: true
+
+Double Claim Test Responses:
+Expected true, got: true
+Expected false, got: false
+```
+
+
+Full Script Output
+
+
+```bash
+Retrying transaction v2.keypom.testnet:2JdTtqWLNqLUjBL9CYJ1qkdUtYpDLXydvnCfHiW3LG3S with new nonce.
+Receipts: DL3AwUHW22wqEvJ24Soh39Zgsa8iQhyNNKsqzfUggDCn, Dt1yEoGZ36avyKqwF82GL54emJkfmUx2AM3fUtkhC1Vv
+ Log [v2.keypom.testnet]: Current Block Timestamp: 1680294425065581261
+ Log [v2.keypom.testnet]: 21 calls with 105000000000000 attached GAS. Pow outcome: 1.8602935. Required Allowance: 20248156910387200000000
+ Log [v2.keypom.testnet]: Total required storage Yocto 16330000000000000000000
+ Log [v2.keypom.testnet]: Current balance: 3.5921299,
+ Required Deposit: 0.2578263,
+ total_required_storage: 0.01633,
+ Drop Fee: 0,
+ Key Fee: 0 Total Key Fee: 0,
+ allowance: 0.0404963 total allowance: 0.0404963,
+ access key storage: 0.001 total access key storage: 0.001,
+ deposits less none FCs: 0.1 total deposits: 0.1 lazy registration: false,
+ deposits for FCs: 0.1 total deposits for FCs: 0.1,
+ uses per key: 2
+ None FCs: 1,
+ length: 1
+ GAS to attach: 100000000000000
+ Log [v2.keypom.testnet]: New user balance 3.3343036
+ Log [v2.keypom.testnet]: Fees collected 0
+Retrying transaction nft-v2.keypom.testnet:2iHrE9ooY2N4kUn9eqsScAyNjXkRkUBiQdzxYsXwFawm with new nonce.
+Receipts: 6jzxKRXmGjrtSKP9V38puWLZPcDHaVYRrohtj29rsMxR, FCmjrSPxuyKEXdghJAkrz8H8AH3GaCPnceoZKuHazmrN
+ Log [v2.keypom.testnet]: Current Block Timestamp: 1680294427597789158
+ Log [v2.keypom.testnet]: 21 calls with 105000000000000 attached GAS. Pow outcome: 1.8602935. Required Allowance: 20248156910387200000000
+ Log [v2.keypom.testnet]: Total required storage Yocto 16330000000000000000000
+ Log [v2.keypom.testnet]: Current balance: 3.6040689,
+ Required Deposit: 0.2578263,
+ total_required_storage: 0.01633,
+ Drop Fee: 0,
+ Key Fee: 0 Total Key Fee: 0,
+ allowance: 0.0404963 total allowance: 0.0404963,
+ access key storage: 0.001 total access key storage: 0.001,
+ deposits less none FCs: 0.1 total deposits: 0.1 lazy registration: false,
+ deposits for FCs: 0.1 total deposits for FCs: 0.1,
+ uses per key: 2
+ None FCs: 1,
+ length: 1
+ GAS to attach: 100000000000000
+ Log [v2.keypom.testnet]: New user balance 3.3462426
+ Log [v2.keypom.testnet]: Fees collected 0
+Retrying transaction nft-v2.keypom.testnet:CysD3CnodxvarnxUpQKKWWV1x9uhjEkCbWosy1DuDo7D with new nonce.
+
+
+ Ticket Links:
+
+ http://localhost:1234/v2.keypom.testnet/3aJq6s8pNYFGbuUVG5fj7nJ9bpfKZD7iH4oak27yZnjQytcyCAFMioJEZrVJBf3itMgrs3gm8U1UszewfhXbfKUH
+
+
+
+
+ Ticket Links:
+
+ http://localhost:1234/v2.keypom.testnet/2KxZarBh9hWy7JZGDvsJhdzP8Q3JtCy7ocZ4hvohHKEsSNjxTx3LWd8EDpHNfD2du8MQVftCNJKRCp99At1qigQU
+
+
+Claiming with wrong password...
+Receipt: BHH2ENLdWLpYDQDD8SmgbAXzVFGi9odnGwhgHxg6ifCR
+ Log [v2.keypom.testnet]: Beginning of process claim used gas: 479192976105 prepaid gas: 100000000000000
+ Log [v2.keypom.testnet]: passed global check
+ Log [v2.keypom.testnet]: hashed password: [97, 68, 238, 197, 167, 108, 73, 163, 74, 105, 140, 127, 22, 87, 3, 98, 76, 179, 110, 208, 118, 51, 58, 3, 88, 44, 22, 240, 45, 89, 85, 65]
+ Log [v2.keypom.testnet]: actualPass password: [61, 214, 44, 95, 159, 234, 2, 185, 182, 48, 134, 31, 65, 88, 184, 51, 51, 13, 201, 173, 75, 158, 56, 59, 33, 46, 185, 178, 239, 3, 44, 94] cur use: 1
+ Log [v2.keypom.testnet]: Incorrect password. Decrementing allowance by 1244250690277300000000. Used GAS: 2442506902773
+ Log [v2.keypom.testnet]: Allowance is now 39252063130497100000000
+ Log [v2.keypom.testnet]: Invalid claim. Returning.
+Claim has failed, check password
+claiming with correct password...
+Receipt: 4gAycg2B1jVNoJtUT3snHWDA1Ffdkxt1oPu8vH1TwoSC
+ Log [v2.keypom.testnet]: Beginning of process claim used gas: 479192976105 prepaid gas: 100000000000000
+ Log [v2.keypom.testnet]: passed global check
+ Log [v2.keypom.testnet]: hashed password: [61, 214, 44, 95, 159, 234, 2, 185, 182, 48, 134, 31, 65, 88, 184, 51, 51, 13, 201, 173, 75, 158, 56, 59, 33, 46, 185, 178, 239, 3, 44, 94]
+ Log [v2.keypom.testnet]: actualPass password: [61, 214, 44, 95, 159, 234, 2, 185, 182, 48, 134, 31, 65, 88, 184, 51, 51, 13, 201, 173, 75, 158, 56, 59, 33, 46, 185, 178, 239, 3, 44, 94] cur use: 1
+ Log [v2.keypom.testnet]: passed local check
+ Log [v2.keypom.testnet]: Key usage last used: 0 Num uses: 2 (before)
+ Log [v2.keypom.testnet]: Key has 1 uses left. Decrementing allowance by 10000000000000000000000. Allowance left: 29252063130497100000000
+ Log [v2.keypom.testnet]: Total storage freed: 0. Initial storage: 33083530. Final storage: 33083530
+ Log [v2.keypom.testnet]: Empty function call. Returning.
+Receipts: D2TGQDXYR4um28CgTt8Z1aU1LMSABMChW9MZJPfVBcpd, 7FKbgHx6eFnfMM15B1Tw7U8wpeQe2WKwYUQG7Hbqe69L
+ Log [v2.keypom.testnet]: Current Block Timestamp: 1680294442058016014
+ Log [v2.keypom.testnet]: 21 calls with 105000000000000 attached GAS. Pow outcome: 1.8602935. Required Allowance: 20248156910387200000000
+ Log [v2.keypom.testnet]: Total required storage Yocto 16330000000000000000000
+ Log [v2.keypom.testnet]: Current balance: 3.6160078,
+ Required Deposit: 0.2578263,
+ total_required_storage: 0.01633,
+ Drop Fee: 0,
+ Key Fee: 0 Total Key Fee: 0,
+ allowance: 0.0404963 total allowance: 0.0404963,
+ access key storage: 0.001 total access key storage: 0.001,
+ deposits less none FCs: 0.1 total deposits: 0.1 lazy registration: false,
+ deposits for FCs: 0.1 total deposits for FCs: 0.1,
+ uses per key: 2
+ None FCs: 1,
+ length: 1
+ GAS to attach: 100000000000000
+ Log [v2.keypom.testnet]: New user balance 3.3581815
+ Log [v2.keypom.testnet]: Fees collected 0
+
+
+ Ticket Links:
+
+ http://localhost:1234/v2.keypom.testnet/2LNJU2adYHgvyuczoNFkvdL92vuunNCESaZiWYh6cQJXcwVSJpHqgQpGVUHsEDDee2oQrSELAkRGPeYroW6hoPaN
+
+
+Claiming with correct password...
+Receipt: G7y6MWapxNwCCmCPAQ6iRWdvT292dq8hWp8ZQAnTbXwQ
+ Log [v2.keypom.testnet]: Beginning of process claim used gas: 479192976105 prepaid gas: 100000000000000
+ Log [v2.keypom.testnet]: passed global check
+ Log [v2.keypom.testnet]: hashed password: [105, 193, 27, 134, 73, 227, 30, 80, 12, 73, 201, 126, 217, 0, 80, 239, 38, 5, 216, 62, 44, 177, 19, 137, 73, 50, 159, 32, 38, 11, 59, 94]
+ Log [v2.keypom.testnet]: actualPass password: [105, 193, 27, 134, 73, 227, 30, 80, 12, 73, 201, 126, 217, 0, 80, 239, 38, 5, 216, 62, 44, 177, 19, 137, 73, 50, 159, 32, 38, 11, 59, 94] cur use: 1
+ Log [v2.keypom.testnet]: passed local check
+ Log [v2.keypom.testnet]: Key usage last used: 0 Num uses: 2 (before)
+ Log [v2.keypom.testnet]: Key has 1 uses left. Decrementing allowance by 10000000000000000000000. Allowance left: 30496313820774400000000
+ Log [v2.keypom.testnet]: Total storage freed: 0. Initial storage: 33085324. Final storage: 33085324
+ Log [v2.keypom.testnet]: Empty function call. Returning.
+claiming the same key twice...
+Key has already been scanned. Admission denied
+
+ Password Test Responses:
+ Expected false, got: false
+ Expected true, got: true
+
+ Double Claim Test Responses:
+ Expected true, got: true
+ Expected false, got: false
+
+โจ Done in 26.50s.
+```
+
+
+
+
+---
+
+## Conclusion
+
+So far, you've learned how to set up your React app, as well as break down the ticketing system into functional requirements. You then took those requirements and wrote a script to create the drop.
+
+In the next tutorial, the ticketing process will be broken down into stages for both the user side and event organizer side. From there, the flow of the app, and the Keypom variables that control it, can be established.
+
+
diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/drop.md b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/drop.md
new file mode 100644
index 00000000..9b31a5fa
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/drop.md
@@ -0,0 +1,320 @@
+---
+sidebar_label: 'Creating the Drop'
+---
+# Creating the Drop
+
+## Introduction
+In this section you'll take the first step to creating the ticketing experience by designing the drop. This drop will be tailored according to the functionality and specifications found in the [Solution Architecture](architecture.md#keypom-solution).
+
+Recall that the drop needs the following properties:
+
+* A [Function Call drop](../../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/fc-drops.md) must be used and configured so that each key has 2 uses.
+* The first key use is password protected and `null` (for when the host scans attendees into the event).
+* The second key use will have a small amount of $NEAR to cover account creation costs and sponsor the first few transactions.
+* The second key use will also call `nft_mint` on an NFT contract which will send the new or existing account a POAP.
+
+:::tip
+The first key use being `null` will allow for a lightweight transaction on-chain to reflect the key use decrement without needing to transfer any $NEAR to anyone or create any accounts.
+:::
+
+
+With this in mind, the aim of this tutorial will be to write a node script that will create the drop matching the above properties. This process can be broken down into three stages:
+
+1) Connect to the NEAR blockchain.
+2) Create the drop with function call data.
+3) Create the NFT collection for the post attendance gift.
+
+Starting at the `keypom-docs-examples` directory, navigate to the `ticket-app-skeleton/utils` folder and open the `createTickDrop.js` file.
+
+```bash
+cd advanced-tutorials/ticket-app-skeleton/utils
+```
+
+There, you can see the following skeleton code in the file `createTickDrop.js`.
+``` js reference
+https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app-skeleton/utils/createTickDrop.js#L1-L33
+```
+
+---
+
+## Connecting to NEAR
+In this section, you'll be addressing the first step which is connecting to the NEAR network.
+
+This is done with `NEAR-API-JS` and consists of:
+
+* Selecting which network to connect to (testnet or mainnet).
+
+* Specifying the location where the keys are stored for the drop funder's account. This location is commonly in the `~/.near-credentials` folder on your local machine.
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8b8e8bbf5fd89d8447e1b6b4533da3bb8673690c/advanced-tutorials/ticket-app/utils/createTickDrop.js#L22-L38
+```
+
+---
+
+## Creating the Drop
+In this section, you'll create the function call drop to meet the functional requirements defined earlier.
+
+### Function Call Drop Basics
+
+#### Initializing the SDK
+
+This process starts with calling the `initKeypom` function and will always be the first function you call to interact with the Keypom SDK.
+
+`initKeypom` initializes the SDK to allow for interactions with the Keypom smart contracts. Without it, none of the other SDK functions would work as expected.
+
+After `initKeypom` is called, the FC Drop can be created by calling `createDrop` and adding an `fcData` parameter.
+
+```js
+// Change this to your account ID
+const FUNDER_ACCOUNT_ID = "minqi.testnet";
+const NETWORK_ID = "testnet"
+async function createTickDrop() {
+ // Initiate connection to the NEAR blockchain.
+ const CREDENTIALS_DIR = ".near-credentials";
+ const credentialsPath = path.join(homedir, CREDENTIALS_DIR);
+ ...
+ ...
+ let near = new Near(nearConfig);
+ const fundingAccount = new Account(near.connection, FUNDER_ACCOUNT_ID)
+
+ await initKeypom({
+ near,
+ network: NETWORK_ID
+ });
+}
+```
+
+#### Defining the Function Call Data
+
+One the SDK has been initialized and the NEAR connection established, it's time to create the function call drop. This is done by passing in `fcData` into create drop. It is an object that defines the methods that will be called for any given key use:
+
+
+```bash
+fcData
+โโโ methods
+```
+
+For multi-use keys, each specific use can have a different set of methods that will be called. These methods are executed one by one. As an example, a key with 3 uses can be seen:
+
+1. `nft_mint`
+2. `null`
+3. `create_account_advanced` -> `setup` -> `nft_mint`
+
+The first time the key is used, an NFT will be minted. The second use will simply advance the key with nothing called. The third time the key is used, it will first call `create_account_advanced` followed by the `setup` method and then finally `nft_mint` all in the same transaction.
+
+This is represented with a 2D array, where the inner array is the set of methods per key use. The above example would be represented as:
+
+```js
+methods: [
+ [
+ "nft_mint"
+ ],
+ null,
+ [
+ "create_account_advanced",
+ "setup",
+ "nft_mint"
+ ]
+]
+```
+
+In reality, each method is not simply a string as shown above. The methods require the following parameters:
+
+- `receiverId`: The contract receiving the function call.
+- `methodName`: The function to be called on the receiver contract.
+- `args`: A stringified JSON object of all the arguments to be passed into `methodName`.
+- `attachedDeposit`: The yoctoNear deposit attached to the function call when the key is used.
+
+For more information on the `methods` parameter, please see the [TypeDocs](../../../keypom-sdk/Core/interfaces/Method.md)
+
+In summary, the `fcData` should look something like this, with a generic method for the POAP which you'll explore in the next section:
+
+```js
+fcData: {
+ methods: [
+ null,
+ [
+ {
+ receiverId: SOME_NFT_CONTRACT,
+ methodName: "nft_mint",
+ args: SOME_ARGS,
+ attachedDeposit: SOME_DEPOSIT
+ }
+ ],
+ ]
+}
+```
+
+#### POAP
+
+Now that the basics for creating an FC drop have been covered, it's time to define what the second key use method data should look like.
+
+Each NFT that is given out to participants will share the same artwork, title, description etc. They will be part of the same series and the only thing that differs between them is their unique ID. For a full tutorial about the series contract, see NEAR's [NFT tutorial.](https://docs.near.org/tutorials/nfts/series#nft-collections-and-series)
+
+To mint these NFTs, there is a contract deployed to `nft-v2.keypom.testnet`. When creating an FC drop, it is important to understand the interface of the receiver contract. In this case, the mint function has the following parameters:
+
+```rust
+pub fn nft_mint(
+ &mut self,
+ mint_id: U64,
+ receiver_id: AccountId
+)
+```
+Here, the `mint_id` is needed to identify and tell the NFT contract which series an NFT should belong to. The `receiver_id` field is needed to identify which account should receive the minted NFT.
+
+The `mint_id` field should be set as the drop's `dropId` and the `receiver_id` should be the attendee's NEAR `accountId`. At first glance, this might seem impossible because you don't know the attendee's accounts ahead of time. To solve this, you can use what's known as Keypom Arguments which are important pieces of information that can be passed into specified fields when a key is used.
+
+The following optional Keypom arguments are exposed for each individual method in the `fcData` alongside the required receiverId, methodName, attachedDeposit etc.
+
+They tell Keypom where to inject certain parameters for each function call.
+
+- [`accountIdField`](../../../keypom-sdk/Core/interfaces/Method.md#accountidfield): The name of the account that is claiming the linkdrop.
+- [`dropIdField`](../../../keypom-sdk/Core/interfaces/Method.md#dropidfield): The [`dropId`](../../../keypom-sdk/Core/interfaces/Drop.md#dropid) of the drop that the claim is being called on.
+- [`keyIdField`](../../../keypom-sdk/Core/interfaces/Method.md#keyidfield) The unique identifier, [`keyId`](../../../keypom-sdk/Core/interfaces/KeyInfo.md#keyid), of the key that is being used to claim.
+- [`funderIdField`](../../../keypom-sdk/Core/interfaces/Method.md#funderidfield) the `accountId` of the person funding the drop.
+
+In this case, the `dropIdField` should be set to `mint_id` and `accountIdField` set to `receiver_id`. This will result in the drop's ID being passed into the parameter `mint_id` and attendee's NEAR account passed into the `receiver_id` field.
+
+In summary, the final `fcData` should look as follows.
+
+```js
+fcData: {
+ methods: [
+ null,
+ [
+ {
+ receiverId: `nft-v2.keypom.testnet`,
+ methodName: "nft_mint",
+ args: "",
+ dropIdField: "mint_id",
+ accountIdField: "receiver_id",
+ attachedDeposit: parseNearAmount("0.1")
+ }
+ ],
+ ]
+}
+```
+:::note
+If you wish to use a different NFT contract for your POAP, ensure you know the contract's interface and tailor the `methods` arguments accordingly.
+:::
+
+#### Password Protected Keys
+
+To ensure each key has two uses with a password protected first use, the following `config`, `basePassword` and `passwordProtectedUses` can be added to `createDrop`.
+
+```js
+await createDrop(
+ // 2 Uses per key
+ config: {
+ usesPerKey: 2
+ },
+ // Create base password and ensure only first key use is password protected
+ basePassword: "event-password",
+ passwordProtectedUses: [1],
+ fcData: {
+ ...
+ }
+)
+```
+As the drop creator, you have the option of creating a password and applying it to the keys in your drop. This password is unique for each key use and comprises of a master password, the drop ID and the use (1st, 2nd, 3rd etc.)
+
+This behavior can be applied by providing the core component, a `basePassword`, into the `createDrop` arguments. In the ticketing case, only the first use should be protected which can be achieved by passing `[1]` into the `passwordProtectedUses` parameter.
+
+Once a key has been password protected, you must pass in `hash(basePassword + publicKey + current_key_use)` in order to successfully claim it.
+
+With this model, if the host were to simply know the `basePassword`, it could deterministically generate this hash for any given ticket link. Furthermore, if the host was the only person who knew the password, nobody could claim the key without going through them first.
+
+For an in-depth explanation around password protected keys, see the [Typedocs](../../../keypom-sdk/Core/modules.md#createdrop).
+
+### Final Drop Structure
+
+Putting it all together, the final drop structure should look something like this:
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8b8e8bbf5fd89d8447e1b6b4533da3bb8673690c/advanced-tutorials/ticket-app/utils/createTickDrop.js#L42-L73
+```
+
+---
+
+## Making NFT Series
+
+Up until now, the drop is pointing to an NFT series that doesn't exist yet. If a key were to be claimed, the function call would throw an error. In this section, you'll be creating the series of NFTs to be used as POAPs.
+
+The Keypom SDK provides a function to create an NFT series specifically for function call drops, called [`createNFTSeries`](../../../keypom-sdk/Core/modules.md#createnftseries). It requires the following parameters:
+
+- `dropId`: The drop ID for the drop that should have the NFT series associated with it.
+- `metadata`: The metadata that all minted NFTs will have.
+
+`metadata` is an object with these properties:
+* `title`: The title for the NFTs in the series.
+* `description`: Description for all NFTs in the series.
+* `media`: link to the artwork in the form of an IPFS CID.
+* `copies`: Number of NFTs in the series.
+
+The code for creating the series is shown below.
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8b8e8bbf5fd89d8447e1b6b4533da3bb8673690c/advanced-tutorials/ticket-app/utils/createTickDrop.js#L75-L84
+```
+
+Once both the series and drop are created, the key can be used to mint on-demand POAPs to wallets.
+
+---
+
+## Adding More Than 50 Tickets
+Due to gas restriction, `createDrop` is limited to 50 password protected keys (tickets). Rather than create multiple drops for the same event, you can simply add more keys to a single drop. This allows you to track your event metrics using a single `dropId`.
+
+To do this, you can use the following code:
+
+```js
+// Loop to add 200 keys
+let numKeys = 200
+let keysAdded = 0;
+let allSecretKeys = [];
+while (keysAdded < numKeys) {
+ const keysToAdd = Math.min(50, numKeys - keysAdded);
+ const {secretKeys, publicKeys} = await generateKeys({
+ numKeys: keysToAdd,
+ });
+ await addKeys({
+ account: fundingAccount,
+ dropId,
+ publicKeys
+ });
+ keysAdded += keysToAdd;
+ allSecretKeys = allSecretKeys.concat(secretKeys);
+}
+```
+
+For more, see [this example](../../../Cookbook/drops/NEAR.md#creating-a-large-drop) or
+
+---
+
+## Creating Ticket Links
+The last step in this process is to create the links themselves so that you can easily distribute the tickets to people. You can control the format of the URL, for now `localhost:1234` will be used.
+
+You can utilize the `formatLinkdropUrl` function for convenience. It can take a custom URL that contains `CONTRACT_ID` and `SECRET_KEY` and it will replace them with the contract ID and secret keys passed in.
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8b8e8bbf5fd89d8447e1b6b4533da3bb8673690c/advanced-tutorials/ticket-app/utils/createTickDrop.js#L86-L91
+```
+
+---
+
+## Final Code
+
+Putting everything together, the final code for the drop should be:
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8b8e8bbf5fd89d8447e1b6b4533da3bb8673690c/advanced-tutorials/ticket-app/utils/createTickDrop.js#L1-L107
+```
+
+
+## Conclusion
+
+So far, you've broken down the ticketing system into functional requirements and used them to write a script to create the drop.
+
+In the next tutorial, you'll be testing the drop you just created, starting with creating a script to emulate the host scanning a ticket.
+
+
diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/final.md b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/final.md
new file mode 100644
index 00000000..ce7623d4
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/final.md
@@ -0,0 +1,151 @@
+---
+sidebar_label: 'Final Product'
+---
+# Final Product
+Welcome to the last section of this ticketing app tutorial! Here, you'll be seeing the full app in action!
+
+:::note
+To run this app on your local machine, you will need a computer with working camera.
+:::
+
+## Getting Started
+To follow along with the app on your own machine, you can clone the code from the [Keypom Docs Examples](https://github.com/keypom/keypom-docs-examples) repository and run the following command in the root folder `keypom-docs-examples/`:
+
+``` bash
+cd advanced-tutorials/ticket-app-skeleton && yarn && yarn start
+```
+
+:::note
+If you'd like to run the already completed code found in the `ticket-app` directory instead of the skeleton code, run:
+
+``` bash
+cd advanced-tutorials/ticket-app && yarn && yarn start
+```
+:::
+
+This should bring you to the following page at `localhost:1234`
+
+
+
+
+
+---
+
+## Starting the Claim and Scanner Pages
+
+To begin the app, first you'll need to run the create drop script:
+
+```bash
+yarn create-ticket-drop
+```
+
+This will return a link:
+
+```bash
+Ticket Links:
+
+http://localhost:1234/v2.keypom.testnet/3pGPvPGiXUiMfW6TME1EPWGWHzx1FrLSLgu68UADpyjg6c9DPix1v2bxUWuY5K7ChWE5G5BNszMNTPmecTz7C15w
+```
+
+This should bring you to the following page. Feel free to take a picture of your QR code with another device, you will need to hold this QR code up to your computer's camera later.
+
+
+
+
+
+From there, you can duplicate this window and modify the URL to be:
+```
+http://localhost:1234/v2.keypom.testnet/scanner
+```
+It will immediately prompt you for a password. By default, the `createTickDrop` script you ran earlier has a password set to `event-password` but for now enter an incorrect password:
+```
+wrong-password
+```
+
+Once you enter this password, the scanner should appear, shown below.
+
+
+
+
+
+---
+
+## Scanning and Claiming
+### Incorrect Password Claim
+
+Now, you can begin testing the scanner by holding the photo of the QR code up to the camera of your computer. Ensure it has a clear unobstructed view of the code. Once the data is read in, the scanner's frame should change to yellow as it tries to claim.
+
+
+
+
+
+This should promptly return a failed claim, shown below.
+
+
+
+
+
+If you right click and inspect the page and go to the console, you should see the following error indicating an incorrect password.
+
+
+
+
+
+### Correct Password Claim
+To enter the correct password, simply refresh the scanner page. This should prompt you for the password again. You can now enter the correct password for your private key. By default, the `createTickDrop` script you ran earlier has a password of `event-password`.
+
+```
+event-password
+```
+
+Once the correct password has been entered, you can repeat the same steps as before and try to claim your ticket by holding the QR code up to the scanner. This time around after the yellow claiming frame, you will see the following successful claim page.
+
+
+
+
+
+### Double Scanning
+Now that the ticket has been successfully scanned and claimed, you can try to double scan the ticket. Recall that, if the second scan succeeds the attendee loses the opportunity to claim their POAP.
+
+Same as before, hold up the QR code up to your computer camera. Once the scanner reads the data and tries to claim, you should see this resultant page.
+
+
+
+
+
+---
+
+## Claiming POAP
+Now, after the ticket has been claimed **once**, if you go back and refresh your ticket page the QR code should now disappear and in its place is a button to claim your POAP.
+
+
+
+
+
+Clicking this should bring you to a MyNearWallet claim page. Once you claim, either to a new or existing NEAR account, you should be able to see our mascot, Moon, as an NFT in your collectibles tab!
+
+
+
+
+
+---
+
+## Claiming Deleted Keys
+Now that you've claimed the POAP, the private key is now deleted. If you go back to the ticket page and refresh it again, you should see the following page; indicating your key is depleted.
+
+
+
+
+
+If you try to holding up the screenshot of your QR code up to the QR reader, you will be greeted with the following failed claim page.
+
+
+
+
+
+---
+
+## Conclusion
+In this tutorial, you learned how you can use Keypom to create a seamless and powerful ticketing experience. You started from a few simple goals, translated those to tangible customizations to make to your Keypom function call drop, and then built a React app around the drop leveraging Keypom values to make it all run.
+
+In the next advanced tutorial, you will learn how you can auto-register people into a DAO with a simple link.
\ No newline at end of file
diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/introduction.md b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/introduction.md
new file mode 100644
index 00000000..983a82b6
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/introduction.md
@@ -0,0 +1,87 @@
+---
+sidebar_label: 'Introduction'
+---
+# Introduction
+In this tutorial, you'll learn how to create a seamless ticketing experience that is cheaper than alternative methods and can also handle very large audiences.
+## Background
+The most popular ticketing solutions in Web3 utilize NFT technologies. This approach, however, requires attendees to own a crypto wallet and sign transactions. This is a massive barrier to entry, particularly for users that are new to Web3.
+
+Keypom aims to solve these problems by empowering you to create a seamless ticketing system that has the following features.
+
+* Users are not required to have a wallet to enter the event.
+* Each ticket is unique and can only be used by one person.
+* Attendees are not required to have wifi to gain entry to the event.
+* Attendees that did not have a NEAR wallet can get one for free.
+* Attendees can choose to receive an NFT proving their attendance at the event. This is commonly known as a [POAP](https://academy.binance.com/en/glossary/proof-of-attendance-protocol-poap).
+* The post-attendance gifts can **only** be given to people that physically showed up to the event. You can't receive the NFT if you didn't show up.
+
+These features open the door to an entirely new class of non-technical attendees and create a smoother experience compared to existing NFT ticketing solutions.
+
+In this tutorial, you'll be creating a ticketing system with those features, and incorporating a POAP to further reward your community members that come out to your events.
+
+:::info note
+The NFT POAP is optional to include as the event organizer. You can choose to keep it, or replace it with a different attendance gift such as Fungible Tokens.
+:::
+
+---
+
+## Prerequisites
+
+For the this tutorial, you can choose to run the scripts on your own machine. To do so, you must have the following:
+
+1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)
+2. [NEAR-API-JS](https://docs.near.org/tools/near-api-js/quick-reference#install)
+3. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started)
+
+If you want to reference the finished code, that can be found [here](https://github.com/keypom/keypom-js/tree/min/ticketing-tutorial/docs-advanced-tutorials/ticket-app). To follow along and build out this ticketing app, see the steps below.
+
+---
+
+## Creating your Project
+In this section, you'll prepare to create the ticketing app using the skeleton code made available to you at the [Keypom Docs Examples](https://github.com/keypom/keypom-docs-examples) repo.
+
+First, you'll want to clone the repo:
+
+```bash
+git clone https://github.com/keypom/keypom-docs-examples.git && cd keypom-docs-examples
+```
+
+Second, install all dependencies for the ticketing app skeleton code using the following:
+
+```
+yarn ticketing:init-skeleton && cd advanced-tutorials/ticket-app-skeleton
+```
+
+:::note
+To install all dependencies for the completed ticketing app, run the following:
+```
+yarn ticketing:init-complete && cd advanced-tutorials/ticket-app
+```
+:::
+
+
+
+At this point, all the dependencies should be installed and you should be in the `advanced-tutorials/ticket-app-skeleton` folder. Here you'll find the following files required to build out your app.
+
+```bash
+/ticket-app-skeleton
+โโโ components
+โ โโโ scanner.js
+โ โโโ qrcode.js
+โโโ state
+โ โโโ App.js
+โ โโโ keyInfo.js
+โโโ utils
+โ โโโ allowEntry.js
+โ โโโ createTickDrop.js
+โ โโโ testTickDrop.js
+โโโ package.json
+```
+
+With this setup complete, you are ready to begin building out the ticket app, starting by breaking down the problem into its functional requirements.
+
+
+
+
+
+
diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/react-outline.md b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/react-outline.md
new file mode 100644
index 00000000..0746d765
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/react-outline.md
@@ -0,0 +1,80 @@
+---
+sidebar_label: 'App Design'
+---
+# App Design
+
+## Introduction
+In the previous sections, you've created the foundation for the ticketing system by breaking it down to its functional requirements and designing a drop accordingly. Here, you'll be learning the flow and design of the React app, to create a seamless ticketing experience for *both* the organizers and the attendees.
+
+With this tutorial, a React app with separate scanner and claim pages will be created. Although the attendees can access the scanner, it will be useless to them unless they know the drop password.
+
+---
+
+## Attendee Ticket Page Flow
+This page is for the attendees and will only consist of 3 stages.
+
+
+
+
+
+* **Stage 1, Pre-entry:** Page showing a unique QR code, corresponding to the private key from their ticket.
+* **Stage 2, Post-entry:** After the QR code has been scanned by the host, the user can choose to onboard to NEAR and receive a POAP.
+* **Stage 3, Post-gift:** If the user chooses to claim their POAP, the third stage will show a page of **your** choice. You can choose to leave it empty or customize it with additional resources or a redirect to your own website.
+
+To trigger a transition from Pre-entry to Post-entry and Post-entry and Post-gift, the following events must occur:
+1. **Pre-entry → Post-entry**: The host must scan the QR code and call `allowEntry` with the event password and private key.
+2. **Post-entry → Post-gift**: The user chooses to `claim` their POAP. Once that `claim` is complete and the POAP is in their wallet, the page will transition to post-gift.
+
+---
+
+## Host Scanner Page Flow
+
+The scanner page is for the host and consists of 3 stages that repeat in a loop.
+
+
+
+
+
+The event password will only be prompted once on app mount. If the host wishes to enter a different password once scanning starts, they can simply refresh the page and be prompted again.
+
+* **Stage 1, Pre-claim:** A page with the camera viewport open, constantly scanning for QR codes.
+* **Stage 2, Claiming:** Once a QR code is detected and information is scanned in, the app attempts to derive the private key from the QR code and calls `allowEntry` using the event password. During this time, the app will indicate it is in the process of claiming.
+* **Stage 3, Post-claim:** After the claim is processed, the page will indicate whether or not to admit the attendee depending on the return value of `allowEntry`.
+
+After post-claim, the entire cycle will loop back to pre-claim after three seconds. This time interval was set so the host could read any error messages that may appear. You can modify this time by changing the values passed into `timeout()`.
+
+---
+
+## Keypom Information
+
+There are a few key pieces of information needed from Keypom in order to allow the pages to perform as expected.
+
+### Claim Page
+The major parameter that controls what React will render is `cur_key_use` for the given private key. This value represents the key's current use number (1st use, 2nd use etc.) and will be stored in a React state variable called `curUse`.
+
+**Pre-entry → Post-entry:** To change between these two stages, the key's current use must be changed from 1 to 2. This is done when the QR code is scanned by the host.
+
+**Post-entry → Post-gift:** To change between these two stages, the key must be deleted and fully claimed. This happens when they claim the post attendance gifts.
+
+The following variables are needed to allow these state changes:
+
+* `curUse`, obtained from accessing the `cur_key_use` from calling [`getKeyInformation`](../../../keypom-sdk/Core/modules.md#getkeyinformation) with `pubKey`.
+* `pubKey`, derived from `privKey` using the SDK's [`getPubFromSecret`](../../../keypom-sdk/Core/modules.md#getpubfromsecret) method.
+* `privKey`, stored in the user's app link.
+
+### Scanner Page
+As the scanner page exclusively scans QR codes and admits people using the `allowEntry` utility function, the app itself does not store any Keypom parameters apart from the event password, which the host will manually enter on app mount.
+
+The scanner app obtains the `privKey` by scanning the QR code and parsing the obtained string. It then calls `allowEntry` and passes in the event password and the `privKey`.
+
+The following list of variables are used in the scanner app:
+* `privKey`, read in from the QR code.
+* `password`, set by the host on app mount.
+
+---
+
+## Conclusion
+In this section, you broke down the app's flow of logic for both the user claim page, and the scanner page. You then took that information and found Keypom information that can be used to facilitate that flow.
+
+In the following sections, you'll be applying what you just learned by going through the actual code for the claim and scanner pages.
+
diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/scanner-code.md b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/scanner-code.md
new file mode 100644
index 00000000..9ced629a
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/scanner-code.md
@@ -0,0 +1,144 @@
+---
+sidebar_label: 'Scanner Code'
+---
+# Scanner Code
+
+## Introduction
+In the previous sections, you designed the structure and components needed to meet the requirements of the ticket app and saw the code to create the user claim page. Building on that, this tutorial will guide you through the code to create the scanner app for your seamless ticketing system.
+
+:::note
+The focus of this section will be on the Keypom aspects of each script, such as getting key information and using it.
+
+The full code for each script will be shown, with highlights. For React resources, see [here](https://reactjs.org/docs/hello-world.html) as a starting point.
+:::
+
+Recall, from the [introduction](introduction.md) that your code had the following outline.
+
+```bash
+/ticket-app-skeleton
+โโโ components
+โ โโโ scanner.js
+โ โโโ qrcode.js
+โโโ state
+โ โโโ App.js
+โ โโโ keyInfo.js
+โโโ utils
+โ โโโ allowEntry.js
+โ โโโ createTickDrop.js
+โ โโโ testTickDrop.js
+โโโ package.json
+```
+
+This tutorial will be covering the code in `scanner.js`.
+
+---
+
+## Scanner App - `Scanner.js`
+### Breaking Down the Problem
+As a brief reminder, the host scanner page will have the following stages, best outlined with the diagram below.
+
+
+
+
+
+* **Stage 1, Pre-claim:** A page with the camera viewport open, constantly scanning for QR codes.
+* **Stage 2, Claiming:** Once a QR code is detected and information is scanned in, the app attempts to derive the private key from the QR code and calls `allowEntry` using the event password. During this time, the app will indicate it is in the process of claiming.
+* **Stage 3, Post-claim:** After the claim is processed, the page will indicate whether or not to admit the attendee depending on the return value of `allowEntry`.
+
+After post-claim, the entire cycle will loop back to pre-claim after three seconds. This time interval was set so the host could read any error messages that may appear. You can modify this time by changing the values passed into `timeout()`.
+
+
+In post-claim, a `allowEntry` might have returned false for a few reasons.
+* Incorrect password/key
+* A ticket may already be fully claimed and not exist when the host attempts to claim it.
+* The ticket has already been scanned by the host. This means the key's current use is 2.
+
+### `masterStatus` State Variable
+In order to track all these stages and possible outcomes, a set of enums will be defined.
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/components/scanner.js#L10-L22
+```
+
+All these stages will be stored in a `masterStatus` state variable object.
+
+
+|**`masterStatus.stage`**| **Description** |
+|------------------------|-----------------------------------------------------------------------------------------|
+| `Stages.preClaim` | *Pre-claim:* Host scanner page is scanning, waiting to read in data |
+| `Stages.claiming` | *Claiming:* Data has been read, scanner is trying to claim |
+| `Stages.sucessClaim` | *Post-claim:* Successful claim (`true` returned from `allowEntry`) |
+| `Stages.failClaim` | *Post-claim:* Failed to claim (`false` returned from `allowEntry`) |
+| `default` | *Unknow State:* Display error message |
+
+
+| **`masterStatus.data`** | **Description** |
+|-------------------------|---------------------------------------------------|
+| `Data.empty` | No data has been read, cannot call `claim` |
+| `Data.captured` | Data has been read, scanner can now try to claim |
+
+### Initialization and Scanning
+Upon app mount, the host scanner page will immediately do the following.
+
+1) Prompt the host for the base password.
+2) Begin scanning.
+
+These features can be seen in the code snippet below.
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/components/scanner.js#L9-L53
+```
+
+### Claiming
+The claiming process can be controlled using a React `useEffect` hook, that runs every time the data status, `masterStatus.data`, is updated, indicating that data was read by the scanner.
+
+The primary task of the claim process is to determine if a claim is:
+
+* Successful - `masterStatus.stage == Stages.successClaim`
+* Unsuccessful - `masterStatus.stage == Stages.failClaim`
+
+This is accomplished using the `allowEntry` function that you created earlier. If it returns `true`, the master status stage should be set to `Stages.successClaim`. Otherwise, it should be set to `Stages.failClaim`.
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/components/scanner.js#L55-L92
+```
+
+### Rendering
+
+The rendering part of the scanner app is relatively simple, as all the logic for states was taken care of during the claim process. The following table outlines what the page should render based on the value of `masterStatus.stage`, as outlined [above](scanner-code.md#masterstatus-state-variable).
+
+The focus of the renders is on the scanner frame (coloured square) and the text below it. The QR code visible is a code on a phone screen held up to the camera.
+
+| **Condition and Description** | **Render** |
+|----------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `masterStatus.stage` == `Stages.preClaim`, *Pre-claim:* Host scanner page is scanning, waiting to read in data | .default})
|
+| `masterStatus.stage` == `Stages.claiming`, *Claiming:* Data has been read, scanner is trying to claim | .default})
|
+| `masterStatus.stage` == `Stages.successClaim`, *Post-claim:* Successful `claim` | .default})
|
+| `masterStatus.stage` == `Stages.failClaim`, *Post-claim:* Invalid password, key invalid/scanned already etc. | .default})
|
+| `default`, *Unknown State:* Display error message | .default})
|
+
+The following expandable section contains code for rendering.
+
+
+Full scanner.js rendering code
+
+
+```jsx reference
+https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/components/scanner.js#L94-L147
+```
+
+
+
+
+### Full Code
+The full code, including the set up, claiming, and the rendering, can be seen below.
+
+``` jsx reference
+https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/components/scanner.js#L1-L148
+```
+
+---
+
+## Conclusion
+In this section, you learned about the `scanner.js` component. Its primary role is to handle the data read in from the QR code reader, and `claim` the private key embedded within the QR code. It is also designed to handle different kinds of errors, such as deleted keys, and tickets that have already been scanned.
+
+In the next section, you'll be seeing the final product of what you just built!
\ No newline at end of file
diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/user-code.md b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/user-code.md
new file mode 100644
index 00000000..5e1614af
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/user-code.md
@@ -0,0 +1,138 @@
+---
+sidebar_label: 'Attendee Ticket Page Code'
+---
+# Attendee Ticket Page Code
+
+## Introduction
+In the previous section, you broke down the flow and logic of the ticket app. You also learned what Keypom information is needed in order to render the pages properly.
+
+In this tutorial, you'll learn about the actual code needed to create the attendee ticket page for your seamless ticketing system.
+
+:::note
+The focus of this section will be on the Keypom aspects of each script, such as getting key information and using it.
+
+The full code for each script will be shown, with highlights. For React resources, see [here](https://reactjs.org/docs/hello-world.html) as a starting point.
+:::
+
+Recall, from the [introduction](introduction.md) that your code had the following outline.
+
+```bash
+/ticket-app-skeleton
+โโโ components
+โ โโโ scanner.js
+โ โโโ qrcode.js
+โโโ state
+โ โโโ App.js
+โ โโโ keyInfo.js
+โโโ utils
+โ โโโ allowEntry.js
+โ โโโ createTickDrop.js
+โ โโโ testTickDrop.js
+โโโ package.json
+```
+
+This tutorial will be covering the code in `App.js`, `KeyInfo.js`, and `qrcode.js`.
+
+---
+
+## `App.js`
+### Setting Up
+The primary purpose of `App.js` is to display the different states of the attendee ticket page. This will involve getting the current key uses, and then rendering based on the value returned.
+
+The first step is to initialize a connection to NEAR and setup all the state variables that will be needed to render the page.
+
+```jsx reference showLineNumbers
+https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/state/App.js#L13-L57
+```
+
+When the page is loaded, the function `setup` is called and the URL is parsed for `contractId` and `privateKey`. These will be stored in their own respective state variables for further use.
+
+Once the URL has been parsed and the resulting values stored, `connectNear` is called. This function handles the NEAR connection, as well as the Keypom connection.
+
+:::note
+When connecting to NEAR, a `BrowserLocalStorageKeyStore` is used rather than an `UnencryptedFileSystemKeyStore`. This will create a key store in the user's browser for future use. For more on key stores, see [here](https://docs.near.org/tools/near-api-js/quick-reference#key-store)
+:::
+
+With the NEAR connection established, your browser can now talk to the NEAR blockchain. The next step, is to call `initKeypom`. This initializes the SDK to allow for interactions with the Keypom smart contracts.
+
+After the Keypom initialization is complete, the QR code information can be created following the format `${contractId}/${privKey}`.
+
+### Rendering
+
+The process of rendering is simple: retrieve the key's current use number, and render the page differently based on the stages outlined in the [App Design](react-outline.md).
+
+The information is passed into both a QR code component and a KeyInfo component. The `KeyInfo` component takes in both the Keypom contract and private key. It then calls `getKeyInformation` and updates the `curUse` state variable accordingly. `QRCode` uses the `qrcode.react` library to display a QR code based on a string input.
+
+The following table outlines what the page should render based on a set of conditions including the current key use.
+
+| **Condition and Description** | **Render** |
+|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| **`curUse` is 1**: The attendee ticket page should show a QR code representing the ticket data (contract and secret key). The `QrCode` component is rendered by passing in the `link` state variable created earlier. | .default})
|
+| **`curUse` is 2**: The first claim was done by the host, and thus should give the user the option to claim their POAP. This is done with the same linkdrop link. | .default})
|
+| **`curUse` is 0**: The second claim was used, and thus the key was depleted and deleted. Here, the user will be given resources to continue learning about NEAR. You can choose to show anything here. | .default})
|
+| This should act as a landing page for your event and will be shown if any URL is invalid. In this case, `curUse` is 0 **and** splitRes[3] is '' or undefined | .default})
|
+
+The code to render can be found in the exandable section below.
+
+
+app.js rendering code
+
+
+```jsx reference showLineNumbers
+https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/state/App.js#L54-L134
+```
+
+
+
+
+
+### Full Code
+The full code, including the set up and the rendering, can be seen below.
+
+Full app.js code
+
+
+``` jsx reference
+https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/state/App.js#L1-L136
+```
+
+
+
+
+---
+
+## `Qrcode.js`
+
+`Qrcode.js` is a simple component that returns a QR code based on the string passed in. On the attendee ticket page, this is the linkdrop URL for the host to scan.
+
+The full code can be seen below.
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/components/qrcode.js#L1-L22
+```
+
+---
+
+## `Keyinfo.js`
+
+`Keyinfo.js` is responsible for updating Keypom related state variables, `pubKey`, and `curUse`.
+
+When `curUse` is 1 and the QR code is being rendered, the public key and use number is shown for educational purposes.
+
+A `useEffect` hook is used to update the needed Keypom state variables whenever the `KeyInfo` component is rendered. To do this, two SDK functions are used: [`getPubFromSecret`](../../../keypom-sdk/Core/modules.md#getpubfromsecret) to get the public key and [`getKeyInformation`](../../../keypom-sdk/Core/modules.md#getkeyinformation) to get the current key use. This can be seen below.
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/state/keyInfo.js#L6-L42
+```
+
+---
+
+## Conclusion
+In this section, you learned about the 3 components that make up the attendee ticket page: `App.js`, `Qrcode.js`, and `KeyInfo.js`.
+
+In summary, `App.js` is the "homepage" of the attendee ticket page and takes care of setting up all the state variables based on the URL and then rendering the page. `Qrcode.js` simply renders a QR code based on an input string. `KeyInfo` is in charge of updating all Keypom state variables whenever `App.js` re-renders.
+
+You also went through the code for each of these components and saw the expected [render results](user-code.md#rendering).
+
+In the next section, you'll be going through a similar process with the scanner page.
+
diff --git a/versioned_docs/version-2.0/Tutorials/BOS/welcome.md b/versioned_docs/version-2.0/Tutorials/BOS/welcome.md
new file mode 100644
index 00000000..500b82b2
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/BOS/welcome.md
@@ -0,0 +1,42 @@
+---
+sidebar_label: 'Keypom BOS Components'
+---
+# Keypom BOS Components
+Welcome! This a collection of useful BOS components from both Keypom and the community!
+- [Event Ticketing on BOS](https://test.near.social/#/minqi.testnet/widget/kp-ticket-homepage?tab=my-ticket-drops)
+ - Built for [ETHGlobal Waterloo](https://ethglobal.com/showcase/keypom-x-bos-event-ticketing-pow2e) by Min
+ - Special thanks to [Kent - cuongdcdev](https://near.org/near/widget/ProfilePage?accountId=cuongdcdev.near) for API support, [Elliot Bream](https://near.org/near/widget/ProfilePage?accountId=elliotbraem.near&tab=apps) for gateway support, and [Kiskesis](https://near.org/near/widget/ProfilePage?accountId=kiskesis.near) for drop-viewer frontend beautification
+
+
+
+
+
+- [My Keypom Drops Info](https://near.org/kiskesis.near/widget/Keypom-Drop-Viewer-fork) by [Kiskesis](https://near.org/near/widget/ProfilePage?accountId=kiskesis.near).
+ - Forked from [here](https://near.org/mintlu.near/widget/Keypom-Drop-Viewer)
+
+
+
+
+- [Number of Keypom Drops per User](https://near.org/mintlu.near/widget/view-number-of-keypom-drops)
+
+
+
+
+
+- [All my Drops](https://near.org/mintlu.near/widget/all-my-drops)
+
+
+
+
+- [Linkdrop Plus](https://near.org/cuongdcdev.near/widget/linkdrop_plus) by [Kent - cuongdcdev](https://near.org/near/widget/ProfilePage?accountId=cuongdcdev.near)
+-
+
+
+
+- [Linkdrop Viewer](https://near.org/cuongdcdev.near/widget/linkdrop-viewer) by [Kent - cuongdcdev](https://near.org/near/widget/ProfilePage?accountId=cuongdcdev.near)
+
+
+- [DAO viewer](https://near.org/hack.near/widget/DAO.Profile?daoId=keypom-test.sputnik-dao.near)
+
+
+
\ No newline at end of file
diff --git a/versioned_docs/version-2.0/Tutorials/Basics/fc-drops.md b/versioned_docs/version-2.0/Tutorials/Basics/fc-drops.md
new file mode 100644
index 00000000..95bc583e
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Basics/fc-drops.md
@@ -0,0 +1,425 @@
+---
+sidebar_label: 'Function Call Drop'
+---
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+# Function Call Drop
+
+## Introduction
+
+In this tutorial, you are going to learn how to create a Function Call Drop from scratch. Similar to how the other drops can be claimed by both new and existing users, FC drops are a great onboarding tool. The difference, is that FC drops can invoke methods on external smart contracts when the link is claimed. This allows for a ton of flexibility and use-cases such as [auto-registering users into a DAO](../../Tutorials/Advanced/daos/introduction.md) as part of the onboarding process.
+
+In this tutorial, the function call will be to Lazy Mint an NFT.
+
+
+
+To learn more about what the FC drop, see the [concepts page](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/fc-drops.md)
+
+
+---
+
+## Prerequisites
+For the basic tutorials, you can choose to run the scripts on your own machine. To do so, you must have the following:
+
+1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)
+2. [NEAR-API-JS](https://docs.near.org/tools/near-api-js/quick-reference#install)
+3. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started)
+
+With this tutorial, you can either create your own script by following along, or view the completed script available in the [Keypom Documentation Examples](https://github.com/keypom/keypom-docs-examples) repo.
+
+### Creating your Project
+In this section, you're going to create your project and install the SDK to prepare for the tutorial. If you have a completed script and have installed the SDK, you can skip [forward](simple-drops.md#breaking-down-the-problem).
+
+First, you need to give your project a home.
+
+```bash
+mkdir my-keypom-project && cd my-keypom-project
+```
+
+Next, you'll want to create a default `package.json` file using the following command. You can accept all default values.
+```bash
+npm init
+```
+
+At this point, your project structure should look like this.
+```bash
+/my-keypom-project
+โโโ package.json
+```
+
+If you open `package.json`, you should see this.
+
+
+Default package.json
+
+
+``` bash
+{
+ "name": "my-keypom-project",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC"
+}
+```
+
+
+
+
+The next step is to create an empty JavaScript file.
+
+
+
+```bash
+touch fc-keypom.js
+```
+
+
+
+
+```bash
+fsutil file createnew fc-keypom.js 0
+```
+
+
+
+
+Finally, the last step is to install the Keypom JS SDK.
+```bash
+npm install @keypom/core
+```
+
+After installing the SDK, your `package.json` file should now look slightly different.
+
+
+package.json after installing the SDK
+
+
+```bash
+{
+ "name": "my-keypom-project",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC",
+ # highlight-start
+ "dependencies": {
+ "@keypom/core": "^1.0.0"
+ }
+ # highlight-end
+}
+```
+
+
+
+
+With these steps complete, your project folder should look like this.
+
+```bash
+/my-keypom-project
+โโโ fc-keypom.js
+โโโ package.json
+โโโ package-lock.json
+โโโ node_modules
+โ โโโ keypom-js
+โ โโโ ...
+```
+
+You are now ready to begin creating your drop!
+
+---
+
+
+## Breaking Down the Problem
+
+A Function Call Drop is Keypom's most powerful drop type. A brief breakdown of how an FC drop works is as follows:
+
+For every key-use, a set of functions is called in the order that they are defined. For multi-use keys, this set can vary across different key uses.
+
+An example scenario for a multi-use key can be seen below.
+
+
+| Key Use | Functions called during nth Key Use |
+| -----------| ---------------------------------------------- |
+| Key Use 1 | `nft_mint` |
+| Key Use 2 | `sign_message`, `update_message` |
+| Key Use 3 | `mint_fungible_tokens` |
+
+:::note
+In this tutorial, the key will be single use and only call `nft_mint`.
+:::
+
+The process of creating an FC drop is similar to the other drop types:
+
+1) Connect to the NEAR blockchain
+2) Create drop with function call data
+
+The following skeleton code can be used as a starting point:
+``` js
+// Each of the two methods to create this drop will have their own unique set of imports
+
+// Imports used in the Keypom SDK method:
+const { initKeypom, createDrop, getEnv, formatLinkdropUrl } = require("@keypom/core");
+const { parseNearAmount } = require("@near-js/utils");
+const { UnencryptedFileSystemKeyStore } = require("@near-js/keystores-node");
+const { Near } = require("@near-js/wallet-account");
+const { Account } = require("@near-js/accounts");
+const path = require("path");
+const homedir = require("os").homedir();
+
+// Imports used in the NEAR-API-JS method:
+const { parseNearAmount } = require("@near-js/utils");
+const { KeyPair } = require("@near-js/crypto")
+const { UnencryptedFileSystemKeyStore } = require("@near-js/keystores-node");
+const { Near } = require("@near-js/wallet-account");
+const { Account } = require("@near-js/accounts");
+const path = require("path");
+const homedir = require("os").homedir();
+
+
+async function fcDropKeypom(){
+// STEP 1: Initiate a NEAR connection.
+
+// STEP 2: Create the drop with function call data.
+}
+
+fcDropKeypom()
+
+```
+## Getting Started
+In this section, you'll be addressing the first step: connecting to NEAR.
+
+This is done with `NEAR-API-JS` and consists of:
+
+1) Create a Keystore, which stores your access keys used to sign transactions
+ * select a network, either `testnet` or `mainnet`
+ * choose a location where the keypairs live, either a folder on your local machine, or in-memory
+
+2) Define a NEAR configuration using the Keystore
+3) Use the configuration to initialize a connection to NEAR
+
+More information about this process can be found [here](https://docs.near.org/tools/near-api-js/quick-reference#key-store).
+
+:::note
+For simplicity, this tutorial will choose a file-based keystore and point to the `~/.near-credentials` folder on your local machine since this is where most of your keys are stored. For more information about KeyStores, visit NEAR's [official docs](https://docs.near.org/tools/near-api-js/quick-reference#key-store).
+:::
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/function-call-drop/fc-example.js#L10-L30
+```
+
+## Creating Drop with Function Call Data
+In this section, you'll learn about the process of creating an FC drop using the SDK.
+
+This process starts with calling the `initKeypom` function and will always be the first function you call to interact with the Keypom SDK.
+
+`initKeypom` initializes the SDK to allow for interactions with the Keypom smart contracts. Without it, none of the other SDK functions would work as expected. If a NEAR connection is not already present, it will initialize a new one for you. More info on the `initKeypom` function can be found [here](../../keypom-sdk/Core/modules.md#initkeypom).
+
+After `initKeypom` is called, the FC Drop can be created by calling `createDrop` and adding an `fcData` parameter.
+
+:::tip
+Recall that the private keys being generated using `createDrop` are used to store the assets. These keys are then embedded within a link.
+
+In an FC Drop, the assets consist of a set of invokable methods and optional $NEAR.
+:::
+
+The primary task in creating the Function Call Drop is to define fcData. It is an object containing a methods field that outlines what methods should be called for a given key use:
+
+
+```bash
+fcData
+โโโ methods
+```
+
+For multi-use keys, each specific use can have a different set of methods that will be called. These methods are executed sequentially and not in parallel. As an example, a key with 3 uses can be seen:
+
+1. `nft_mint`
+2. `null`
+3. `create_account_advanced`, `setup`, `nft_mint`
+
+The first time the key is used, an NFT will be minted. The second use will simply advance the key and nothing will be called. The third time the key is used, it will first call `create_account_advanced`. Once that's finished it will call the `setup` method and then finally `nft_mint`.
+
+This is represented with a 2D array, where each inner is the set of methods per key use. The above example would be represented as:
+
+```js
+methods: [
+ [
+ "nft_mint"
+ ],
+ null,
+ [
+ "create_account_advanced",
+ "setup",
+ "nft_mint"
+ ]
+]
+```
+
+Every method listed represents a function call and requires the following parameters:
+
+- `receiverId`: The contract receiving the function call.
+- `methodName`: The function to be called on the receiver contract.
+- `args`: A stringified JSON object of all the arguments to be passed into `methodName`.
+- `attachedDeposit`: The yoctoNear deposit attached to the function call when the key is used.
+
+In this tutorial only one function call will be made: `nft_mint` in order to lazy mint an NFT.
+
+Including the `fcData` parameter categorizes this as an FC drop. Without it, the Keypom Protocol would treat this drop as a Simple Drop. More information on the `fcData` parameter can be found [here](../../keypom-sdk/Core/interfaces/FCData.md).
+
+To see what the SDK is doing behind the scenes, a `NEAR-API-JS` equivalent NodeJS script has been provided.
+
+
+
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/function-call-drop/fc-example.js#L32-L71
+```
+
+
+
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/function-call-drop/fc-near-example.js#L33-L82
+```
+
+
+
+
+---
+
+## Creating Linkdrops
+The last step in this process is to create the links themselves so that you can easily distribute the assets to people. This is done by embedding the private key, containing the $NEAR, into the link along with the Keypom contract ID.
+
+With the Keypom SDK, this is all neatly wrapped up in the function [`formatLinkdropUrl`](../../keypom-sdk/Core/modules.md#formatlinkdropurl). You just need to provide the base URL format and the private key you wish to embed.
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/function-call-drop/fc-example.js#L73-L79
+```
+
+---
+
+## Complete Code
+Now that everything has been put together, the final code can be seen below.
+
+
+
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/function-call-drop/fc-example.js#L1-L86
+```
+
+
+
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/function-call-drop/fc-near-example.js#L1-L95
+```
+
+
+
+
+---
+
+## Testing
+### Running the Script
+Here, you'll learn how to run the code that was just covered, and what to expect.
+
+To view the completed code, clone the [Keypom Docs Examples](https://github.com/keypom/keypom-docs-examples) repository and navigate to the `basic-tutorials/fc-drop`.
+``` bash
+git clone https://github.com/keypom/keypom-docs-examples.git && cd keypom-docs-examples/basic-tutorials/fc-drop
+```
+From there, you can and open the `fc-example.js` file.
+
+To run the code you just cloned, return to the `keypom-docs-examples` directory and install all the necessary packages.
+```bash
+cd .. && cd .. && yarn
+```
+
+:::caution
+Prior to running these scripts, ensure you replace all instances of `keypom-docs-demo.testnet` in the script with the credentials of your account found in your `~/.near-credentials` folder
+:::
+
+From there, you can run this FC Drop script that was made in this tutorial using the following command:
+``` bash
+yarn basic:fc:keypom
+```
+:::note
+The SDK script is being tested here; use `yarn basic:fc:naj` to test the `NEAR-API-JS` script instead.
+:::
+This should return a successful drop creation and console log a Public Key and Linkdrop
+``` bash
+Public Keys: [ 'ed25519:55FkiRc4J3c1zLgzuTYxJMebVrpraXU3P7zPymDtbssN' ]
+Linkdrops: [
+ 'https://testnet.mynearwallet.com/linkdrop/v2.keypom.testnet/2BB8cx2xaKzY1ENBCoVz7bTFUgq8Gx6Ar27D5PbCv39NnZLfWxw3XqWr37HZ1xm3KdQ5uCt8hvt6ztF1eGBQC1Hi'
+]
+Keypom Contract Explorer Link: explorer.testnet.near.org/accounts/v2.keypom.testnet.com
+```
+To see the full console log from this drop creation, see the expandable section below.
+
+
+Console Log of Test
+
+
+``` bash
+Receipts: 4MTrVP1cvemzA1XhmX4hHErYvmcgMCgfrXydwNTeez3Y, 8LDCtYSsN5ccFY5udxbYqoVzmxyubqZBRLvMR33FUREN
+ Log [v2.keypom.testnet]: Current Block Timestamp: 1682352446955649219
+ Log [v2.keypom.testnet]: 21 calls with 105000000000000 attached GAS. Pow outcome: 1.8602935. Required Allowance: 20248156910387200000000
+ Log [v2.keypom.testnet]: Total required storage Yocto 14230000000000000000000
+ Log [v2.keypom.testnet]: Current balance: 9.3089748,
+ Required Deposit: 2.0354781,
+ total_required_storage: 0.01423,
+ Drop Fee: 0,
+ Key Fee: 0 Total Key Fee: 0,
+ allowance: 0.0202481 total allowance: 0.0202481,
+ access key storage: 0.001 total access key storage: 0.001,
+ deposits less none FCs: 1 total deposits: 1 lazy registration: false,
+ deposits for FCs: 1 total deposits for FCs: 1,
+ uses per key: 1
+ None FCs: 0,
+ length: 1
+ GAS to attach: 100000000000000
+ Log [v2.keypom.testnet]: New user balance 7.2734966
+ Log [v2.keypom.testnet]: Fees collected 0
+Public Keys: [ 'ed25519:55FkiRc4J3c1zLgzuTYxJMebVrpraXU3P7zPymDtbssN' ]
+Linkdrops: [
+ 'https://testnet.mynearwallet.com/linkdrop/v2.keypom.testnet/2BB8cx2xaKzY1ENBCoVz7bTFUgq8Gx6Ar27D5PbCv39NnZLfWxw3XqWr37HZ1xm3KdQ5uCt8hvt6ztF1eGBQC1Hi'
+]
+Keypom Contract Explorer Link: explorer.testnet.near.org/accounts/v2.keypom.testnet.com
+```
+
+
+
+
+### Claiming and Explorer Transactions
+Once you click the link, it will take you to the following NEAR Wallet page, where you will have the choice to claim with an existing account or create a new one.
+
+
+To check the transactions, click the final link in the console log when you run the script.
+```bash
+Keypom Contract Explorer Link: https://explorer.testnet.near.org/accounts/v2.keypom.testnet
+```
+
+From there, you should be able to see the [`create_drop`](https://explorer.testnet.near.org/transactions/DF6awbmts4hhACBTA8oBSGdt1oJh7FNCBkv36wZboZXR) and [`claim`](https://explorer.testnet.near.org/transactions/m2LJE2Xv1TMwpbEm5SVj2VGqZxBybkQphXouupJKMg8) transactions.
+
+
+Within the [`claim`](https://explorer.testnet.near.org/transactions/Cgckyr9EEC3o9MDiL8E2mvs6JYPuCApYqWjpgZvy3z6U) transaction, you can also see that `nft_mint` was called on the `nft.examples.testnet` contract.
+
+
+This can be confirmed by visiting the "Collectibles" tab in your NEAR wallet. You should see the newly minted NFT in your wallet.
+
+
+---
+
+## Conclusion
+In this tutorial, you learned the how to [create a function call drop](fc-drops.md#creating-drop-with-function-call-data) using the `fcData` parameter. Once the drop was created, you constructed a valid linkdrop using the private keys in order to claim the assets.
+
+Now that you've had a good introduction to creating all 4 Keypom drop types, feel free to modify the scripts created or move on to the [Advanced Tutorials](../Advanced/ticketing/introduction.md) for more challenging and practical examples.
diff --git a/versioned_docs/version-2.0/Tutorials/Basics/ft-drops.md b/versioned_docs/version-2.0/Tutorials/Basics/ft-drops.md
new file mode 100644
index 00000000..19197f2c
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Basics/ft-drops.md
@@ -0,0 +1,447 @@
+---
+sidebar_label: 'Fungible Token Drop'
+---
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+# Fungible Token Drop
+
+## Introduction
+In this tutorial, you will learn how to create a fungible token drop from scratch. This allows you onboard users both with $NEAR and a set of FTs with the click of a link. An excellent use case can be seamlessly offering in-game currency to players.
+
+
+
+To learn more about the FT drop, see the [concepts page](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/ft-drops.md)
+
+
+---
+
+## Prerequisites
+For the basic tutorials, you can choose to run the scripts on your own machine. To do so, you must have the following:
+
+1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)
+2. [NEAR-API-JS](https://docs.near.org/tools/near-api-js/quick-reference#install)
+3. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started)
+
+With this tutorial, you can either create your own script by following along, or view the completed script available in the [Keypom Documentation Examples](https://github.com/keypom/keypom-docs-examples) repo.
+
+### Creating your Project
+In this section, you're going to create your project and install the SDK to prepare for the tutorial. If you have a completed script and have installed the SDK, you can skip [forward](simple-drops.md#breaking-down-the-problem).
+
+First, you need to give your project a home.
+
+```bash
+mkdir my-keypom-project && cd my-keypom-project
+```
+
+Next, you'll want to create a default `package.json` file using the following command. You can accept all default values.
+```bash
+npm init
+```
+
+At this point, your project structure should look like this.
+```bash
+/my-keypom-project
+โโโ package.json
+```
+
+If you open `package.json`, you should see this.
+
+
+Default package.json
+
+
+``` bash
+{
+ "name": "my-keypom-project",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC"
+}
+```
+
+
+
+
+The next step is to create an empty JavaScript file.
+
+
+
+```bash
+touch ft-keypom.js
+```
+
+
+
+
+```bash
+fsutil file createnew ft-keypom.js 0
+```
+
+
+
+
+Finally, the last step is to install the Keypom JS SDK.
+```bash
+npm install @keypom/core
+```
+
+After installing the SDK, your `package.json` file should now look slightly different.
+
+
+package.json after installing the SDK
+
+
+```bash
+{
+ "name": "my-keypom-project",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC",
+ # highlight-start
+ "dependencies": {
+ "@keypom/core": "^1.0.0"
+ }
+ # highlight-end
+}
+```
+
+
+
+
+With these steps complete, your project folder should look like this.
+
+```bash
+/my-keypom-project
+โโโ ft-keypom.js
+โโโ package.json
+โโโ package-lock.json
+โโโ node_modules
+โ โโโ @keypom/core
+โ โโโ ...
+```
+
+You are now ready to begin creating your drop!
+
+---
+
+
+## Breaking Down the Problem
+
+The process of creating an FT drop can be broken down into the following steps.
+
+1) Connect to the NEAR blockchain.
+2) Ensure the funder has enough FTs to fund the drop.
+3) Create the drop.
+4) Transfer Keypom the necessary Fungible Tokens.
+5) Create linkdrops.
+
+The following skeleton code can be used as a starting point:
+```js
+// Each of the two methods to create this drop will have their own unique set of imports
+
+// Imports used in the Keypom SDK method:
+const { initKeypom, createDrop, getEnv, formatLinkdropUrl } = require("@keypom/core");
+const { parseNearAmount } = require("@near-js/utils");
+const { UnencryptedFileSystemKeyStore } = require("@near-js/keystores-node");
+const { Near } = require("@near-js/wallet-account");
+const { Account } = require("@near-js/accounts");
+const { BN } = require("bn.js");
+const path = require("path");
+const homedir = require("os").homedir();
+
+// Imports used in the NEAR-API-JS method:
+const { parseNearAmount } = require("@near-js/utils");
+const { KeyPair } = require("@near-js/crypto")
+const { Near } = require("@near-js/wallet-account");
+const { Account } = require("@near-js/accounts");
+const { UnencryptedFileSystemKeyStore } = require("@near-js/keystores-node");
+const { getRecentDropId } = require("../utils/general.js")
+const { BN } = require("bn.js");
+const path = require("path");
+const homedir = require("os").homedir();
+
+
+async function FTDropKeypom(){
+// GETTING STARTED
+
+// STEP 1 Initialize NEAR blockchain connection.
+
+// STEP 2 Ensure the funder has enough FTs to fund the drop.
+
+// CREATING DROP AND TRANSFERRING FTs
+
+// STEP 3 Create the drop.
+
+// STEP 4 Transfer Keypom the necessary Fungible Tokens.
+
+// CREATING LINKDROPS
+
+// STEP 5 Create Linkdrops
+}
+
+FTDropKeypom()
+```
+Steps 1 and 2 will be covered in "[Getting Started](ft-drops.md#getting-Started)" and Steps 3, 4, and 5 will be under "[Creating FT drop and Transferring FTs](ft-drops.md#creating-drop-and-transferring-fts)". Step 6 will have its own section called "[Creating Linkrops](ft-drops.md#creating-linkdrops)".
+
+---
+
+## Getting Started
+In this section, you'll be addressing the first two steps: connecting to NEAR and ensuring the funder has enough FTs for the drop.
+
+Connecting to the NEAR blockchain will be done using `NEAR-API-JS` and consists of the following steps:
+
+1) Create a Keystore, which stores your access keys used to sign transactions
+ * select a network, either `testnet` or `mainnet`
+ * choose a location where the keypairs live, either a folder on your local machine, or in-memory
+
+2) Define a NEAR configuration using the Keystore
+3) Use the configuration to initialize a connection to NEAR
+
+More information about this process can be found [here](https://docs.near.org/tools/near-api-js/quick-reference#key-store).
+
+:::note
+For simplicity, this tutorial will choose a file-based keystore and point to the `~/.near-credentials` folder on your local machine since this is where most of your keys are stored. For more information about KeyStores, visit NEAR's [official docs](https://docs.near.org/tools/near-api-js/quick-reference#key-store).
+:::
+
+To ensure the funder has enough FTs to fund the drop, a new concept is to be defined.
+
+:::info
+`amountToTransfer` = *FT per use* * *number of keys* * *uses per key*.
+:::
+
+Using `NEAR-API-JS`, a `viewFunction` to the FT contract can be made to call `ft_balance_of`. This will return the funder's FT balance, which can be compared with `amountToTransfer` to ensure the funder has enough FTs to fund the drop.
+
+
+
+The code for setting up the NEAR connection and ensuring sufficient funder FT balance is shown below. In the skeleton code, these are steps 1 and 2.
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/fungible-token-drop/ft-example.js#L11-L45
+```
+:::note
+In the code, you may notice the balances defined using `BN`. These are simply *Big Numbers* and is a library built to handle numbers beyond JavaScript's [max safe integer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER).
+
+The FTs in this example have a `decimal` of 24. This is the same as 1 $NEAR -> 1024 YoctoNEAR, which allows the use of [`parseNearAmount`](https://docs.near.org/tools/near-api-js/utils) to convert between the two. Read more on the decimal parameter [here](https://docs.openzeppelin.com/contracts/3.x/erc20#a-note-on-decimals).
+:::
+
+---
+
+## Creating Drop and Transferring FTs
+In this section of the tutorial, you'll be creating the drop and transferring the FTs to Keypom using the Keypom SDK.
+
+As outlined in to introduction, there are 2 tasks to complete in this section.
+
+- Create the drop
+- Transfer the FTs to Keypom
+
+
+This process starts with calling the `initKeypom` function and will always be the first function you call to interact with the SDK.
+
+`initKeypom` initializes the SDK to allow for interactions with the Keypom smart contracts. Without it, none of the other SDK functions would work as expected. If a NEAR connection is not already present, it will initialize a new one for you. More info on the `initKeypom` function can be found [here](../../keypom-sdk/Core/modules.md#initkeypom).
+
+Following the `initKeypom` call, the FT Drop is created. This is done by calling `createDrop` and adding an `ftData` parameter.
+
+:::tip
+Recall that the private keys being generated using `createDrop` are used to store the assets. These keys are then embedded within a link.
+
+In an FT Drop, the assets consist of FTs and optional $NEAR.
+:::
+
+
+`ftData` is an object with the following properties.
+```bash
+ftData
+โโโ contractId
+โโโ senderId
+โโโ amount
+```
+
+
+- `contractId`: The FT contract ID
+- `senderId`: The account from which the FTs will be sent to Keypom.
+- `amount`: This is the human readable amount of FT, based on the [decimals value](https://docs.openzeppelin.com/contracts/3.x/erc20#a-note-on-decimals) of the token
+
+Including the `ftData` parameter categorizes this as an FT drop. Without it, the Keypom Protocol would treat this drop as a Simple Drop.
+
+More information on the `ftData` parameter can be found [here](../../keypom-sdk/Core/interfaces/FTData.md).
+
+:::info
+So long as the funder has an adequate FT balance, all you need to do is call `createDrop` with `ftData` to create the drop.
+
+The SDK will **automatically** register Keypom on the FT contract and transfer the FTs to Keypom for you.
+:::
+
+To see what the SDK is doing behind the scenes, a `NEAR-API-JS` equivalent NodeJS script has been provided.
+
+
+
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/fungible-token-drop/ft-example.js#L47-L70
+```
+
+
+
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/fungible-token-drop/ft-near-example.js#L50-L115
+```
+
+
+
+
+---
+
+## Creating Linkdrops
+The last step in this process is to create the links themselves so that you can easily distribute the assets to people. This is done by embedding the private key, containing the $NEAR, into the link along with the Keypom contract ID.
+
+With the Keypom SDK, this is all neatly wrapped up in the function [`formatLinkdropUrl`](../../keypom-sdk/Core/modules.md#formatlinkdropurl). You just need to provide the base URL format and the private key you wish to embed.
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/fungible-token-drop/ft-example.js#L72-L78
+```
+
+---
+
+## Full Code
+Now that everything has been put together, the final code can be seen below.
+
+
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/fungible-token-drop/ft-example.js#L1-L86
+```
+
+
+
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/fungible-token-drop/ft-near-example.js#L1-L127
+```
+
+
+
+
+---
+
+## Testing
+### Running the Script
+Here, you'll learn how to run the code that was just covered, and what to expect.
+
+To view the completed code, clone the [Keypom Docs Examples](https://github.com/keypom/keypom-docs-examples) repository and navigate to the `basic-tutorials/ft-drop`.
+``` bash
+git clone https://github.com/keypom/keypom-docs-examples.git && cd keypom-docs-examples/basic-tutorials/ft-drop
+```
+From there, you can and open the `ft-example.js` file.
+
+To run the code you just cloned, return to the `keypom-docs-examples` directory and install all the necessary packages.
+```bash
+cd .. && cd .. && yarn
+```
+
+:::caution
+Prior to running these scripts, ensure you replace all instances of `keypom-docs-demo.testnet` in the script with the credentials of your account found in your `~/.near-credentials` folder
+:::
+
+From there, you can run this FT Drop script that was made in this tutorial using the following command:
+``` bash
+yarn basic:ft:keypom
+```
+:::note
+The SDK script is being tested here; use `yarn basic:ft:naj` to test the `NEAR-API-JS` script instead.
+:::
+This should return a successful drop creation and console log a Public Key and Linkdrop
+
+```bash
+Public Keys: [ 'ed25519:DkvGVA8UuBRKtsXvBxnKkHs2aHzd221QSquinokfJ71a' ]
+Linkdrops: [
+ 'https://testnet.mynearwallet.com/linkdrop/v2.keypom.testnet/2H8i9Snk4v3wBBHeTxBFuzzi1SF5DL4nFHvMUp1nDz4ARSW3tB5b8z2Xxm6Y5rMzzVS3sDppPxM4jtRhyYkHfF2Y'
+]
+Keypom Contract Explorer Link: explorer.testnet.near.org/accounts/v2.keypom.testnet.com
+```
+
+To see the full console log from this drop creation, see the expandable section below.
+
+
+Console Log of Test
+
+
+``` bash
+Receipts: AxiAwWNkKQsyvdcAhwBr2B2Qqc5gVCBw2MLrbL7dLq6d, 6QCHm8YtpfreHYQvw9VAHU7rJXGgfVv4T1TDcuXHEtvC, 5CTcWfQ1BC1nensRK6NhcNSv5NjxdSaVSwti4j34fCa3
+ Log [v2.keypom.testnet]: Current Block Timestamp: 1682352345716601116
+ Log [v2.keypom.testnet]: 21 calls with 105000000000000 attached GAS. Pow outcome: 1.8602935. Required Allowance: 20248156910387200000000
+ Log [v2.keypom.testnet]: was_ft_registered: true
+ Log [v2.keypom.testnet]: Total required storage Yocto 11980000000000000000000
+ Log [v2.keypom.testnet]: Current balance: 8.2955772,
+ Required Deposit: 1.0332281,
+ total_required_storage: 0.01198,
+ Drop Fee: 0,
+ Key Fee: 0 Total Key Fee: 0,
+ allowance: 0.0202481 total allowance: 0.0202481,
+ access key storage: 0.001 total access key storage: 0.001,
+ deposits less none FCs: 1 total deposits: 1 lazy registration: false,
+ deposits for FCs: 0 total deposits for FCs: 0,
+ uses per key: 1
+ None FCs: 0,
+ length: 1
+ GAS to attach: 100000000000000
+ Log [v2.keypom.testnet]: New user balance 7.262349
+ Log [v2.keypom.testnet]: Fees collected 0
+ Log [v2.keypom.testnet]: Performing CCC to get storage from FT contract
+Receipts: 4PPt4W1C9xYP2yc67CLVX6vvYshf1oCoDr9hBiZUniTZ, 8iSu5McdW8rvPApvYjbPhew6wGZ9raAPiR8SEA43tV86
+ Log [v2.keypom.testnet]: User has enough balance to cover FT storage. Subtracting 0.0025 from user balance. User balance is now 7.259849
+ Log [v2.keypom.testnet]: 21 calls with 105000000000000 attached GAS. Pow outcome: 1.8602935. Required Allowance: 20248156910387200000000
+ Log [v2.keypom.testnet]: FT contract already registered. Refunding user balance for 0.00125. Balance is now 7.261099
+Receipts: 9FEiXh19PMMRirF4CGDTEfopWxf6eLWxNvJmUMnrrVX8, AwJ362Sj4PZ3EbusnwLo4qoyExXRRZPAyqUUT1uZ64oi, 8KquU3a2BA3AWb9keYfwYvYpD6iD5CQG1Vn78efBex9B
+ Log [ft.keypom.testnet]: EVENT_JSON:{"standard":"nep141","version":"1.0.0","event":"ft_transfer","data":[{"old_owner_id":"keypom-docs-demo.testnet","new_owner_id":"v2.keypom.testnet","amount":"1"}]}
+Receipt: 9Ls4K4vm8pW7HcjD6PMBbJoWSsjwN16YEq3GdCqnahPx
+ Log [ft.keypom.testnet]: New uses registered 1
+Public Keys: [ 'ed25519:DkvGVA8UuBRKtsXvBxnKkHs2aHzd221QSquinokfJ71a' ]
+Linkdrops: [
+ 'https://testnet.mynearwallet.com/linkdrop/v2.keypom.testnet/2H8i9Snk4v3wBBHeTxBFuzzi1SF5DL4nFHvMUp1nDz4ARSW3tB5b8z2Xxm6Y5rMzzVS3sDppPxM4jtRhyYkHfF2Y'
+]
+Keypom Contract Explorer Link: explorer.testnet.near.org/accounts/v2.keypom.testnet.com
+```
+
+
+
+
+### Claiming and Explorer Transactions
+Once you click the link, it will take you to the following NEAR Wallet page, where you will have the choice to claim with an existing account or create a new one.
+
+
+In your NEAR wallet, you should now be able to see the FT tokens that were transferred to you.
+
+
+To check the transactions, click the final link in the console log when you run the script.
+```bash
+Keypom Contract Explorer Link: https://explorer.testnet.near.org/accounts/v2.keypom.testnet
+```
+
+From there, you should be able to see the [`create_drop`](https://explorer.testnet.near.org/transactions/6HkwpwWVA7m1tAGj75JGpF975toStWRF1y8FSRDMPPfT), [`ft_transfer_call`](https://explorer.testnet.near.org/transactions/47HmGKAHx4TDp6vNbnBAb9ifS1gTXrC58o7svFmZDYzk) and [`claim`](https://explorer.testnet.near.org/transactions/62gQiyQjx9z9WJsVQNaaa4fje9PeeTpCuHun2PZ8WjNm) transactions.
+
+
+
+:::note
+Recall that `ft_transfer_call` is never explicitly called but rather `createDrop` calls it for you; this can be seen in the explorer shown above.
+
+This is the SDK in action!
+:::
+
+---
+
+## Conclusion
+In this tutorial, you've learned to ensure the funder has a [sufficient FT balance](ft-drops.md#getting-started) for the drop, [create an FT drop](ft-drops.md#creating-drop-and-transferring-fts) with the SDK, and to [transfer FTs](ft-drops.md#creating-drop-and-transferring-fts) to Keypom. Once the drop was created, you constructed a valid linkdrop using the private keys in order to claim the assets.
+
+In the next tutorial, you will learn to create a function call drop.
\ No newline at end of file
diff --git a/versioned_docs/version-2.0/Tutorials/Basics/getting-started.md b/versioned_docs/version-2.0/Tutorials/Basics/getting-started.md
new file mode 100644
index 00000000..9d0ffd2f
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Basics/getting-started.md
@@ -0,0 +1,43 @@
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+# Getting Started
+The primary goal of a Keypom drop is to send assets to users with the click of a link regardless of whether they have a wallet or not. These assets can come in many forms which will be broken down below.
+
+The basic tutorials are meant as introductory guides that will help you create your first Keypom drops and understand the differences between the [types](/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/introduction.md) of Keypom drops and the assets they contain.
+
+There are **four** types of drops, each with different types of assets. These drops can be claimed either with a brand new NEAR account or an existing one.
+
+
+| Drop Type | Assets |
+| -------------------------------------------------------------------------------------------------- | -------------------------------------------|
+| [Simple Drop](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/simple-drops.md) | $NEAR |
+| [Non-Fungible Token Drop](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/nft-drops.md) | NFT and optionally $NEAR |
+| [Fungible Token Drop](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/ft-drops.md) | Fungible Tokens and optionally $NEAR |
+| [Function Call Drop](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/fc-drops.md) | Set of function-calls and optionally $NEAR |
+
+
+The [Simple Drop](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/simple-drops.md) is the most basic type of drop, it allows you to send $NEAR via a link to new or existing users.
+
+[NFT Drops](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/nft-drops.md) and [FT Drops](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/ft-drops.md) are extensions of the Simple drop, they allow you to send NFTs and FTs in addition to $NEAR.
+
+The [Function Call Drop](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/fc-drops.md) is Keypom's most powerful type of drop. It allows you send a link that is capable of calling almost any function on any smart contract that you predefine. A simple example of this is auto-registering users into a DAO as part of the onboarding process.
+
+While there are many [drop configurations](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/customization-homepage.md) available to developers such as multi-use keys or time-based restrictions, in these basic tutorials, a single use key with no additional configurations will be created.
+
+Throughout each tutorial, two simple NodeJS scripts will be created that use both NEAR's native [NEAR-API-JS](https://docs.near.org/tools/near-api-js/reference) library, and Keypom's [JS-SDK](https://github.com/keypom/keypom-js).
+
+---
+
+## Prerequisites
+For the basic tutorials, you can choose to run the scripts on your own machine. To do so, you must have the following:
+
+1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)
+2. [NEAR-API-JS](https://docs.near.org/tools/near-api-js/quick-reference#install)
+3. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started)
+
+At this point, you are ready to start the tutorials.
+
+Alternatively, if you wish to use ready-to-use scripts that can be customized to your liking in order to quickly create Keypom drops, visit the [Keypom Protocol](https://github.com/keypom/keypom#deploy-scripts).
+
+
diff --git a/versioned_docs/version-2.0/Tutorials/Basics/nft-drops.md b/versioned_docs/version-2.0/Tutorials/Basics/nft-drops.md
new file mode 100644
index 00000000..0d7bee2b
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Basics/nft-drops.md
@@ -0,0 +1,429 @@
+---
+sidebar_label: 'Non Fungible Token Drop'
+---
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+# Non Fungible Token Drop
+
+## Introduction
+In this tutorial, you will learn how to create a non-fungible token drop from scratch. This allows you onboard users both with $NEAR and an existing NFT with the click of a link. This is great for sending an NFT that you own to your friends without needing to worry about whether or not they have a NEAR wallet.
+
+
+
+
+To learn more about the NFT drop, see the [concepts page](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/nft-drops.md)
+
+---
+
+## Prerequisites
+For the basic tutorials, you can choose to run the scripts on your own machine. To do so, you must have the following:
+
+1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)
+2. [NEAR-API-JS](https://docs.near.org/tools/near-api-js/quick-reference#install)
+3. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started)
+
+With this tutorial, you can either create your own script by following along, or view the completed script available in the [Keypom Documentation Examples](https://github.com/keypom/keypom-docs-examples) repo.
+
+### Creating your Project
+In this section, you're going to create your project and install the SDK to prepare for the tutorial. If you have a completed script and have installed the SDK, you can skip [forward](simple-drops.md#breaking-down-the-problem).
+
+First, you need to give your project a home.
+
+```bash
+mkdir my-keypom-project && cd my-keypom-project
+```
+
+Next, you'll want to create a default `package.json` file using the following command. You can accept all default values.
+```bash
+npm init
+```
+
+At this point, your project structure should look like this.
+```bash
+/my-keypom-project
+โโโ package.json
+```
+
+If you open `package.json`, you should see this.
+
+
+Default package.json
+
+
+``` bash
+{
+ "name": "my-keypom-project",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC"
+}
+```
+
+
+
+
+The next step is to create an empty JavaScript file.
+
+
+
+```bash
+touch nft-keypom.js
+```
+
+
+
+
+```bash
+fsutil file createnew nft-keypom.js 0
+```
+
+
+
+
+Finally, the last step is to install the Keypom JS SDK.
+```bash
+npm install @keypom/core
+```
+
+After installing the SDK, your `package.json` file should now look slightly different.
+
+
+package.json after installing the SDK
+
+
+```bash
+{
+ "name": "my-keypom-project",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC",
+ # highlight-start
+ "dependencies": {
+ "@keypom/core": "^1.0.0"
+ }
+ # highlight-end
+}
+```
+
+
+
+
+With these steps complete, your project folder should look like this.
+
+```bash
+/my-keypom-project
+โโโ nft-keypom.js
+โโโ package.json
+โโโ package-lock.json
+โโโ node_modules
+โ โโโ @keypom/core
+โ โโโ ...
+```
+
+You are now ready to begin creating your drop!
+
+---
+
+## Breaking Down the Problem
+
+The process of creating an NFT drop can be broken down into the following steps.
+
+1) Establish a connection to the NEAR blockchain.
+2) If you don't own the NFT, mint it using the `nft_mint` function.
+3) Create the keys and the drop with the NFT information.
+4) Transfer ownership of the NFTs to Keypom.
+5) Create linkdrops.
+
+:::info
+The NFT ownership must be transferred to Keypom so that it can send the NFT to the user when they claim their drop.
+:::
+
+The following skeleton code can be used as a starting point:
+
+```js
+// Each of the two methods to create this drop will have their own unique set of imports
+
+// Imports used in the Keypom SDK method:
+const { initKeypom, createDrop, getEnv, formatLinkdropUrl } = require("@keypom/core");
+const { parseNearAmount } = require("@near-js/utils");
+const { UnencryptedFileSystemKeyStore } = require("@near-js/keystores-node");
+const { Near } = require("@near-js/wallet-account");
+const { Account } = require("@near-js/accounts");
+const path = require("path");
+const homedir = require("os").homedir();
+
+// Imports used in the NEAR-API-JS method:
+const { parseNearAmount } = require("@near-js/utils");
+const { KeyPair } = require("@near-js/crypto")
+const { UnencryptedFileSystemKeyStore } = require("@near-js/keystores-node");
+const { Near } = require("@near-js/wallet-account");
+const { Account } = require("@near-js/accounts");
+const { getRecentDropId } = require("../utils/general.js")
+const path = require("path");
+const homedir = require("os").homedir();
+
+
+async function NFTDropKeypom(){
+// GETTING STARTED
+
+// STEP 1: Initiate a NEAR connection.
+
+// STEP 2: Mint NFTs
+
+// CREATING DROP AND TRANSFERRING NFTs
+
+// STEP 3: Create NFT drop
+
+// STEP 4: Transfer NFTs to Keypom
+
+// CREATING LINKDROPS
+
+// STEP 5: Create Linkdrops
+}
+
+NFTDropKeypom()
+```
+
+For this tutorial, steps 1 and 2 will be grouped under "[Getting Started](nft-drops.md#getting-started)", steps 3 and 4 will be grouped under "[Creating drop and transferring NFT](nft-drops.md#creating-drop-and-transferring-nft)", and step 5 will have its own section called "[Creating Linkrops](nft-drops.md#creating-linkdrops)".
+
+---
+
+## Getting Started
+In this section, the NEAR blockchain connection is set up and the NFTs will be minted to ensure you are transferring NFTs that *you* own. If you already own the NFTs you wish to add to the drop, there is no need to mint them here.
+
+Connecting to the NEAR blockchain will be done using `NEAR-API-JS` and consists of the following steps:
+
+1) Create a Keystore, which stores your access keys used to sign transactions
+ * select a network, either `testnet` or `mainnet`
+ * choose a location where the keypairs live, either a folder on your local machine, or in-memory
+
+2) Define a NEAR configuration using the Keystore
+3) Use the configuration to initialize a connection to NEAR
+
+More information about this process can be found [here](https://docs.near.org/tools/near-api-js/quick-reference#key-store).
+
+:::note
+For simplicity, this tutorial will choose a file-based keystore and point to the `~/.near-credentials` folder on your local machine since this is where most of your keys are stored. For more information about KeyStores, visit NEAR's [official docs](https://docs.near.org/tools/near-api-js/quick-reference#key-store).
+:::
+
+The code for setting up the NEAR connection and minting the NFT is shown below. In the skeleton code, these are steps 1 and 2.
+
+``` js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/non-fungible-token-drop/nft-example.js#L11-L49
+```
+
+:::note
+The NFT must be minted with a `NEAR-API-JS` `functionCall` to the NFT contract.
+
+Function arguments for `functionCall` can be found [here](https://docs.near.org/tools/near-api-js/reference/modules/transaction#functioncall)
+:::
+
+---
+
+## Creating Drop and Transferring NFT
+
+In this section of the tutorial, you'll be creating the NFT drop and transferring the NFT to Keypom using the Keypom SDK.
+
+This process starts with calling the `initKeypom` function and will always be the first function you call to interact with the SDK.
+
+`initKeypom` initializes the SDK to allow for interactions with the Keypom smart contracts. Without it, none of the other SDK functions would work as expected. If a NEAR connection is not already present, it will initialize a new one for you. More info on the `initKeypom` function can be found [here](../../keypom-sdk/Core/modules.md#initkeypom).
+
+After calling `initKeypom`, the NFT Drop is created. This is done by calling `createDrop` and adding an `nftData` parameter.
+
+:::tip
+Recall that the private keys being generated using `createDrop` are used to store the assets. These keys are then embedded within a link.
+
+In an NFT Drop, the assets consist of an NFT and optional $NEAR.
+:::
+
+`nftData` is an object with the following properties.
+
+```bash
+nftData
+โโโ contractId
+โโโ senderId
+โโโ tokenIds
+```
+
+- `contractId`: The contract ID where the NFTs for this drop are coming from
+- `senderId`: The current owner of the NFTs that will be sent to Keypom
+- `tokenIds`: A list of all the token IDs to be sent to Keypom during the NFT drop creation process.
+
+Including the `nftData` parameter categorizes this as an NFT drop. Without it, the Keypom Protocol would treat this drop as a Simple Drop.
+
+More information on the `nftData` parameter can be found [here](../../keypom-sdk/Core/interfaces/NFTData.md).
+
+To see what the SDK is doing behind the scenes, a `NEAR-API-JS` equivalent NodeJS script has been provided.
+
+
+
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/non-fungible-token-drop/nft-example.js#L51-L74
+```
+
+
+
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/non-fungible-token-drop/nft-near-example.js#L52-L101
+```
+
+
+
+
+:::note
+All function parameters and default values for the SDK and Keypom functions can be found in the [SDK Typedocs](../../keypom-sdk/Core/modules.md). For `NEAR-API-JS` functions, their arguments can be found [here](https://docs.near.org/tools/near-api-js/reference)
+:::
+
+---
+
+## Creating Linkdrops
+The last step in this process is to create the links themselves so that you can easily distribute the assets to people. This is done by embedding the private key, containing the $NEAR, into the link along with the Keypom contract ID.
+
+With the Keypom SDK, this is all neatly wrapped up in the function [`formatLinkdropUrl`](../../keypom-sdk/Core/modules.md#formatlinkdropurl). You just need to provide the base URL format and the private key you wish to embed.
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/non-fungible-token-drop/nft-example.js#L76-L82
+```
+
+---
+
+## Full Solution
+Now that everything has been put together, the final code can be seen below.
+
+
+
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/non-fungible-token-drop/nft-example.js#L1-L89
+```
+
+
+
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/non-fungible-token-drop/nft-near-example.js#L1-L114
+```
+
+
+
+
+---
+
+## Testing
+### Running the Script
+Here, you'll learn how to run the code that was just covered, and what to expect.
+
+To view the completed code, clone the [Keypom Docs Examples](https://github.com/keypom/keypom-docs-examples) repository and navigate to the `basic-tutorials/nft-drop`.
+``` bash
+git clone https://github.com/keypom/keypom-docs-examples.git && cd keypom-docs-examples/basic-tutorials/nft-drop
+```
+From there, you can and open the `nft-example.js` file.
+
+To run the code you just cloned, return to the `keypom-docs-examples` directory and install all the necessary packages.
+```bash
+cd .. && cd .. && yarn
+```
+
+:::caution
+Prior to running these scripts, ensure you replace all instances of `keypom-docs-demo.testnet` in the script with the credentials of your account found in your `~/.near-credentials` folder
+:::
+
+From there, you run this NFT Drop script that was made in this tutorial using the following command:
+``` bash
+yarn basic:nft:keypom
+```
+:::note
+The SDK script is being tested here; use `yarn basic:nft:naj` to test the `NEAR-API-JS` script instead.
+:::
+This should return a successful drop creation and console log a Public Key and Linkdrop:
+```bash
+Public Keys: [ 'ed25519:Cf48tjtLrRDm5qYN5fyNvPHBTNVkSsX2mP2mfw2W2f3N' ]
+Linkdrops: [
+ 'https://testnet.mynearwallet.com/linkdrop/v2.keypom.testnet/4iBKGBMhKo3BLi8wfc6qDPxUG3xrsXygDbzVwXBsh3tEvLVE2a4EGDtHreH89a7peAhC8yot1Zm5vd3nfnxxmzv4'
+]
+Keypom Contract Explorer Link: explorer.testnet.near.org/accounts/v2.keypom.testnet.com
+```
+
+To see the full console log from this drop creation, see the expandable section below.
+
+
+Console Log of Test
+
+
+``` bash
+Receipts: 94Hxiw6dy2VbgfWWuL8scyAKutgmZ6TnyaGLuSdw8bdw, EPBCevWD8jCmVmRhH4r7nEWY5P5mHNXBzxRs8FFmjh1s
+ Log [nft.examples.testnet]: EVENT_JSON:{"standard":"nep171","version":"nft-1.0.0","event":"nft_mint","data":[{"owner_id":"keypom-docs-demo.testnet","token_ids":["keypom-token-1682351707371"]}]}
+Receipts: 8VKpVfRZkPBJzZR42aBiytbECXFYqAvLF72jRUgaccHt, AV5tmBbWuzkV7DLNX6o4LgkeBysShJ647VmdY3ye15s
+ Log [v2.keypom.testnet]: Current Block Timestamp: 1682351728091701553
+ Log [v2.keypom.testnet]: 21 calls with 105000000000000 attached GAS. Pow outcome: 1.8602935. Required Allowance: 20248156910387200000000
+ Log [v2.keypom.testnet]: Total required storage Yocto 12140000000000000000000
+ Log [v2.keypom.testnet]: Current balance: 8.2333838,
+ Required Deposit: 1.0333881,
+ total_required_storage: 0.01214,
+ Drop Fee: 0,
+ Key Fee: 0 Total Key Fee: 0,
+ allowance: 0.0202481 total allowance: 0.0202481,
+ access key storage: 0.001 total access key storage: 0.001,
+ deposits less none FCs: 1 total deposits: 1 lazy registration: false,
+ deposits for FCs: 0 total deposits for FCs: 0,
+ uses per key: 1
+ None FCs: 0,
+ length: 1
+ GAS to attach: 100000000000000
+ Log [v2.keypom.testnet]: New user balance 7.1999957
+ Log [v2.keypom.testnet]: Fees collected 0
+Receipts: HwvpQcMKQdWczLsbBsvZD72UdJTpY6BTDPZBFwk7YZFy, DGs58AziaMcgkZbhki2caZBAFC6fYa83qXfziQmmwaeU, 3zs1apRpLhdfYpdRJUidgP8YJzkPr2YKaoVT8Hitau5p
+ Log [nft.examples.testnet]: EVENT_JSON:{"standard":"nep171","version":"nft-1.0.0","event":"nft_transfer","data":[{"old_owner_id":"keypom-docs-demo.testnet","new_owner_id":"v2.keypom.testnet","token_ids":["keypom-token-1682351707371"]}]}
+Receipt: 4HJAWvH67JtsdDVQP1vsRTniFwkALWokPRpkPbMxqArY
+ Log [nft.examples.testnet]: drop.registered_uses 1
+ Log [nft.examples.testnet]: Subtracting 1110000000000000000000 from funder to cover storage. New balance is 7198885721113380930000000
+Public Keys: [ 'ed25519:Cf48tjtLrRDm5qYN5fyNvPHBTNVkSsX2mP2mfw2W2f3N' ]
+Linkdrops: [
+ 'https://testnet.mynearwallet.com/linkdrop/v2.keypom.testnet/4iBKGBMhKo3BLi8wfc6qDPxUG3xrsXygDbzVwXBsh3tEvLVE2a4EGDtHreH89a7peAhC8yot1Zm5vd3nfnxxmzv4'
+]
+Keypom Contract Explorer Link: explorer.testnet.near.org/accounts/v2.keypom.testnet.com
+```
+
+
+
+
+### Claiming and Explorer Transactions
+Once you click the link, it will take you to the following NEAR Wallet page, where you will have the choice to claim with an existing account or create a new one.
+
+
+After the claim transaction succeeds, you can view the NFT in your collectibles tab.
+
+
+To check the transactions, click the final link in the console log when you run the script.
+```bash
+Keypom Contract Explorer Link: https://explorer.testnet.near.org/accounts/v2.keypom.testnet
+```
+
+From there, you should be able to see the [`create_drop`](https://explorer.testnet.near.org/transactions/9rR6mPjoQFKC2Euuvn5yh5e6hPv3WTrMYjwja3ppkjaD), [`nft_transfer_call`](https://explorer.testnet.near.org/transactions/A2hdnm6mHQNLupFLP1vMNZ1J8QHkxLqDLqocUnQxNC5F) and [`claim`](https://explorer.testnet.near.org/transactions/5Kx9F5nxjbWpq8qUr7rRuDun8zipvR7TFbVuPoP5qwBW) transactions.
+
+
+:::note
+Recall that `nft_transfer_call` is never explicitly called but rather `createDrop` calls it for you; this can be seen in the explorer shown above.
+
+This is the SDK in action!
+:::
+
+---
+
+## Conclusion
+In this NFT tutorial, you learned about the steps needed while [initializing an NFT drop](nft-drops.md#getting-started) and the process of [creating the NFT drop](nft-drops.md#creating-drop-and-transferring-nft). Once the drop was created, you constructed a valid linkdrop using the private keys in order to claim the assets.
+
+In the next tutorial, you will learn how to create a Fungible Token drop, which is similar to the NFT drop, but transfers FTs instead of NFTs.
\ No newline at end of file
diff --git a/versioned_docs/version-2.0/Tutorials/Basics/simple-drops.md b/versioned_docs/version-2.0/Tutorials/Basics/simple-drops.md
new file mode 100644
index 00000000..264624c4
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Basics/simple-drops.md
@@ -0,0 +1,371 @@
+---
+sidebar_label: 'Simple Drop'
+---
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+# Simple Drop
+
+## Introduction
+In this tutorial, you will learn how to create a simple $NEAR drop from scratch. By embedding $NEAR in a Web2 style link, the simple drop allows you to onboard both existing and new users.
+
+Being the simplest Keypom drop type, it acts as the foundation for the other 3 kinds of Keypom drops. Despite this, the simple drop opens the door to more complex use cases such as [subscription services](../../Tutorials/Advanced/subscriptions/introduction.md).
+
+
+
+To learn more about the Simple Drop, see the [concepts page](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/simple-drops.md)
+
+---
+
+## Prerequisites
+For the basic tutorials, you can choose to run the scripts on your own machine. To do so, you must have the following:
+
+1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)
+2. [NEAR-API-JS](https://docs.near.org/tools/near-api-js/quick-reference#install)
+3. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started)
+
+With this tutorial, you can either create your own script by following along, or view the completed script available in the [Keypom Documentation Examples](https://github.com/keypom/keypom-docs-examples) repo.
+
+### Creating your Project
+In this section, you're going to create your project and install the SDK to prepare for the tutorial. If you have a completed script and have installed the SDK, you can skip [forward](simple-drops.md#breaking-down-the-problem).
+
+First, you need to give your project a home.
+
+```bash
+mkdir my-keypom-project && cd my-keypom-project
+```
+
+Next, you'll want to create a default `package.json` file using the following command. You can accept all default values.
+```bash
+npm init
+```
+
+At this point, your project structure should look like this.
+```bash
+/my-keypom-project
+โโโ package.json
+```
+
+If you open `package.json`, you should see this.
+
+
+Default package.json
+
+
+``` bash
+{
+ "name": "my-keypom-project",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC"
+}
+```
+
+
+
+
+The next step is to create an empty JavaScript file.
+
+
+
+```bash
+touch simple-keypom.js
+```
+
+
+
+
+```bash
+fsutil file createnew simple-keypom.js 0
+```
+
+
+
+
+Finally, the last step is to install the Keypom JS SDK.
+```bash
+npm install @keypom/core
+```
+
+After installing the SDK, your `package.json` file should now look slightly different.
+
+
+package.json after installing the SDK
+
+
+```bash
+{
+ "name": "my-keypom-project",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC",
+ # highlight-start
+ "dependencies": {
+ "@keypom/core": "^1.0.0"
+ }
+ # highlight-end
+}
+```
+
+
+
+
+With these steps complete, your project folder should look like this.
+
+```bash
+/my-keypom-project
+โโโ simple-keypom.js
+โโโ package.json
+โโโ package-lock.json
+โโโ node_modules
+โ โโโ @keypom/core
+โ โโโ ...
+```
+
+You are now ready to begin creating your drop!
+
+---
+
+## Breaking Down the Problem
+
+Creating a simple drop is a four step process:
+
+1) Establish a connection to the NEAR blockchain.
+2) Create a set of access keys where the assets will be stored.
+3) Use the Keypom SDK to create the drop.
+4) Create linkdrops.
+
+The following skeleton code can be used as a starting point:
+``` js
+// Each of the two methods to create this drop will have their own unique set of imports
+
+// Imports used in the Keypom SDK method:
+const { initKeypom, createDrop, getEnv, formatLinkdropUrl } = require("@keypom/core");
+const { UnencryptedFileSystemKeyStore } = require("@near-js/keystores-node");
+const { connect, Near } = require("@near-js/wallet-account");
+const path = require("path");
+const homedir = require("os").homedir();
+
+// Imports used in the NEAR-API-JS method:
+const { parseNearAmount } = require("@near-js/utils");
+const { KeyPair } = require("@near-js/crypto")
+const { Near } = require("@near-js/wallet-account");
+const { Account } = require("@near-js/accounts");
+const { UnencryptedFileSystemKeyStore } = require("@near-js/keystores-node");
+const path = require("path");
+const homedir = require("os").homedir();
+
+
+async function simpleDropKeypom(){
+// STEP 1: Initiate a NEAR connection.
+
+// STEP 2: Create a set of access keys
+
+// STEP 3: Create the drop.
+
+// STEP 4: Create linkdrops
+}
+
+simpleDropKeypom()
+
+```
+
+---
+
+## Getting Started - Connecting to NEAR
+The first step to create a Keypom drop is connecting to the NEAR blockchain.
+
+This is done with `NEAR-API-JS` and consists of the following steps:
+
+1) Create a Keystore, which stores your access keys used to sign transactions
+ * select a network, either `testnet` or `mainnet`
+ * choose a location where the keypairs live, either a folder on your local machine, or in-memory
+
+2) Define a NEAR configuration using the Keystore
+3) Use the configuration to initialize a connection to NEAR
+
+More information about this process can be found [here](https://docs.near.org/tools/near-api-js/quick-reference#key-store).
+
+:::note
+For simplicity, this tutorial will choose a file-based keystore and point to the `~/.near-credentials` folder on your local machine since this is where most of your keys are stored. For more information about KeyStores, visit NEAR's [official docs](https://docs.near.org/tools/near-api-js/quick-reference#key-store).
+:::
+
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/simple-drop/simple-example.js#L10-L28
+```
+
+---
+
+## Creating the Simple Drop
+Now that the connection to the NEAR blockchain is set up, the next step is to create the Keypairs and the drop using the Keypom SDK.
+
+
+
+`initKeypom` initializes the SDK to allow for interactions with the Keypom smart contracts. Without it, none of the other SDK functions would work as expected. If a NEAR connection is not already present, it will initialize a new one for you. More info on the `initKeypom` function can be found [here](../../keypom-sdk/Core/modules.md#initkeypom).
+
+After `initKeypom` is called, the key generation and drop creation can be done. These two tasks are combined into one function, `createDrop`. This function can be either given a set of pre-created keypairs, **or** it can generate them automatically based on the `numKeys` parameter.
+
+:::tip
+Recall that the private keys being generated are used to store the assets. These keys are then embedded within a link.
+
+In a Simple Drop, the assest is $NEAR.
+:::
+
+To see what the SDK is doing behind the scenes, a `NEAR-API-JS` equivalent NodeJS script has been provided.
+
+
+
+
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/simple-drop/simple-example.js#L30-L45
+```
+
+
+
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/simple-drop/simple-near-example.js#L34-L59
+```
+
+
+
+
+:::note
+All function parameters and default values for the SDK and Keypom functions can be found in the [SDK Typedocs](../../keypom-sdk/Core/modules.md). For `NEAR-API-JS` functions, their arguments can be found [here](https://docs.near.org/tools/near-api-js/reference)
+:::
+
+---
+
+## Creating Linkdrops
+The last step in this process is to create the links themselves so that you can easily distribute the assets to people. This is done by embedding the private key, containing the $NEAR, into the link along with the Keypom contract ID.
+
+With the Keypom SDK, this is all neatly wrapped up in the function [`formatLinkdropUrl`](../../keypom-sdk/Core/modules.md#formatlinkdropurl). You just need to provide the base URL format and the private key you wish to embed.
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/simple-drop/simple-example.js#L47-L53
+```
+
+---
+
+## Full Solution
+Now that everything has been put together, the final code can be seen below.
+
+
+
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/simple-drop/simple-example.js#L1-L61
+```
+
+
+
+
+```js reference
+https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/simple-drop/simple-near-example.js#L1-L71
+```
+
+
+
+
+---
+
+## Testing
+### Running the Script
+Here, you'll learn how to run the code that was just covered, and what to expect.
+
+To view the completed code, clone the [Keypom Docs Examples](https://github.com/keypom/keypom-docs-examples) repository and navigate to the `basic-tutorials/simple-drop`.
+``` bash
+git clone https://github.com/keypom/keypom-docs-examples.git && cd keypom-docs-examples/basic-tutorials/simple-drop
+```
+From there, you can and open the `simple-example.js` file.
+
+To run the code you just cloned, return to the `keypom-docs-examples` directory and install all the necessary packages.
+```bash
+cd .. && cd .. && yarn
+```
+
+:::caution
+Prior to running these scripts, ensure you replace all instances of `keypom-docs-demo.testnet` in the script with the credentials of your account found in your `~/.near-credentials` folder
+:::
+
+From there, you can run this Simple Drop script that was made in this tutorial using the following command:
+``` bash
+yarn basic:simple:keypom
+```
+:::note
+The SDK script is being tested here; use `yarn basic:simple:naj` to test the `NEAR-API-JS` script instead.
+:::
+This should return a successful drop creation and console log a Public Key and Linkdrop:
+```bash
+Public Keys: [ 'ed25519:CsTpJ3pSZUkkcfVEsA6Fqkgz6BFgmhNfCGzPuqdj24wc' ]
+Linkdrops: [
+ 'https://testnet.mynearwallet.com/linkdrop/v2.keypom.testnet/CNbTQgJ83dLPvg4ibCQGH9Wi1sJhSQkh4YDXKxibXU3cn66oZP5eqLE83m5z5eTqBKxSvJzmDXH7gYTMXzMEfdk'
+]
+Keypom Contract Explorer Link: explorer.testnet.near.org/accounts/v2.keypom.testnet.com
+```
+To see the full console log from this drop creation, see the expandable section below.
+
+
+Console Log of Test
+
+
+``` bash
+Receipts: GZegewWCTMfpKWZ8ffpVkRb3fLYjyfnyCvqRRmwRkKSt, 3tueZ12bwu86EYEgPVaMjQJuSUNfWcwnDENQGk6jGzmo
+ Log [v2.keypom.testnet]: Current Block Timestamp: 1682352132162930850
+ Log [v2.keypom.testnet]: 21 calls with 105000000000000 attached GAS. Pow outcome: 1.8602935. Required Allowance: 20248156910387200000000
+ Log [v2.keypom.testnet]: Total required storage Yocto 11170000000000000000000
+ Log [v2.keypom.testnet]: Current balance: 8.2496314,
+ Required Deposit: 1.0324181,
+ total_required_storage: 0.01117,
+ Drop Fee: 0,
+ Key Fee: 0 Total Key Fee: 0,
+ allowance: 0.0202481 total allowance: 0.0202481,
+ access key storage: 0.001 total access key storage: 0.001,
+ deposits less none FCs: 1 total deposits: 1 lazy registration: false,
+ deposits for FCs: 0 total deposits for FCs: 0,
+ uses per key: 1
+ None FCs: 0,
+ length: 1
+ GAS to attach: 100000000000000
+ Log [v2.keypom.testnet]: New user balance 7.2172133
+ Log [v2.keypom.testnet]: Fees collected 0
+Public Keys: [ 'ed25519:CsTpJ3pSZUkkcfVEsA6Fqkgz6BFgmhNfCGzPuqdj24wc' ]
+Linkdrops: [
+ 'https://testnet.mynearwallet.com/linkdrop/v2.keypom.testnet/CNbTQgJ83dLPvg4ibCQGH9Wi1sJhSQkh4YDXKxibXU3cn66oZP5eqLE83m5z5eTqBKxSvJzmDXH7gYTMXzMEfdk'
+]
+Keypom Contract Explorer Link: explorer.testnet.near.org/accounts/v2.keypom.testnet.com
+```
+
+
+
+
+### Claiming and Explorer Transactions
+Once you click the link, it will take you to the following NEAR Wallet page, where you will have the choice to claim with an existing account or create a new one.
+
+
+To check the transactions, click the final link in the console log when you run the script.
+``` md
+Keypom Contract Explorer Link: explorer.testnet.near.org/accounts/v2.keypom.testnet.com
+```
+
+From there, you should be able to see the [`create_drop`](https://explorer.testnet.near.org/transactions/6cQGRMJhmn16LCEDLKWYnFJrz3cAP7zSW36jhFwwk5sT) and [`claim`](https://explorer.testnet.near.org/transactions/BkNe1Dwzer22WW6vVBbCY75qHbkDitYYca7e4cjPTBsJ) transactions.
+
+
+---
+
+## Conclusion
+In this tutorial, you learned the basic steps of [creating a simple drop](simple-drops.md#introduction), steps to [initialize](simple-drops.md#getting-started---connecting-to-near) a NEAR blockchain connection, and how to [create](simple-drops.md#creating-the-simple-drop) the keys and drop. You also learned the purpose of the `initKeypom` function and when to use it. Once the drop was created, you constructed a valid linkdrop using the private keys in order to claim the assets.
+
+In the next tutorial, you'll be learning how to create and fund an NFT drop using the Keypom SDK.
diff --git a/versioned_docs/version-2.0/Tutorials/Misc/sign-txn.md b/versioned_docs/version-2.0/Tutorials/Misc/sign-txn.md
new file mode 100644
index 00000000..2875c55b
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/Misc/sign-txn.md
@@ -0,0 +1,6 @@
+# Methods of Signing Transactions
+Place holder page to discuss different methods of signing transactions.
+1. Using funder object -> Unencrypted local keystore
+2. Wallet object
+3. Account object
+4. Parsing/Exposing private key
\ No newline at end of file
diff --git a/versioned_docs/version-2.0/Tutorials/welcome.md b/versioned_docs/version-2.0/Tutorials/welcome.md
new file mode 100644
index 00000000..c8be6cd5
--- /dev/null
+++ b/versioned_docs/version-2.0/Tutorials/welcome.md
@@ -0,0 +1,94 @@
+---
+sidebar_label: 'Home'
+---
+# Examples and Tutorials
+Welcome to the examples and tutorials section of Keypom's developer documentation. Here you'll learn how to use the power of Keypom to creating some awesome user onboarding experiences.
+
+There are several ways to get started using Keypom.
+
+## Basic Tutorials
+
+The basic tutorials are meant as introductory guides that will help you create your first Keypom drops and understand the differences between the [types](/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/introduction.md) of drops and the assets they contain. All drops created in these tutorials skip [drop configurations](../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/customization-homepage.md) to keep it simple.`
+
+
+It is recommended you read through the [Getting Started](Basics/getting-started.md) guide before going into the tutorials.
+
+
+
+
+## Advanced Tutorials
+
+These tutorials are meant to provide examples of real world use cases. These can range from ticketing, to seamless DAO onboarding experiences.
+
+
+
+
+Other use cases can range from subscriptions to DAO voting. These other advanced tutorials are currently in progress, stay tuned!
diff --git a/versioned_docs/version-2.0/exec-summary.md b/versioned_docs/version-2.0/exec-summary.md
new file mode 100644
index 00000000..a448aa93
--- /dev/null
+++ b/versioned_docs/version-2.0/exec-summary.md
@@ -0,0 +1,119 @@
+# Keypom Executive Summary
+
+> To discover the features and details of Keypom, begin your journey [here](Concepts/welcome.md).
+
+Keypom provides **zero friction onboarding** and transactions for NEAR. We allow people to **experience** the value of blockchain technology *regardless of if they have a wallet or not*.
+
+All of the complications such as seed-phrases, private keys, transactions and other crypto jargon can be abstracted away from the end-user. We provide a means for people to use decentralized applications **without knowing theyโre on-chain**.
+
+Our goal is to be a community driven, public good that aims to show the world what is possible when you push NEARโs technology to its limits. For the foreseeable future, our APIs (the Keypom Protocol) will be completely **fee-free**. Our entire solution is on-chain. There are no centralized databases and everything is run using NEAR smart contracts.
+
+Our debut talk at NEARCON can be found [here](https://www.youtube.com/watch?v=J-BOnfhHV50&ab_channel=MattLockyer).
+
+## The Blockchain Problem
+Blockchain technology comes with many benefits such as sovereign ownership, digital rights, privacy, freedom, peer to peer coordination and much more. The problem with this technology, however, is that there is an *extremely high barrier to entry for an everyday individual*. None of it matters if nobody can onboard.
+
+*Itโs confusing to create and fund a crypto wallet*. People are unfamiliar with the process, technical jargon, general flow, and need to go through barriers such as KYC. *Why go through such hurdles just to experience an app?* In Web2, users can accrue value from applications without being forced to onboard first. Why canโt Web3 be the same?
+
+## The Keypom Solution
+On other chains, a common approach to onboarding users is to send them a pre-created, pre-loaded wallet. Keypom operates on the basis of NEARโs unique [access key model](https://docs.near.org/concepts/basics/accounts/access-keys) which allows for much more flexibility in the end user-experience. With Keypom, you give the user a special type of access key that can be turned into a wallet. This key can be embedded within a simple Web2 style link that, once clicked, will allow them to input a desired account ID to be created.
+
+The immediate benefit of this approach is that it allows the end-user to *customize their wallet with a name of their choosing* as opposed to being given a pre-created account.
+
+### Sending Assets with Keypom
+One of the simplest ways to onboard a user into the NEAR ecosystem is to use the Keypom protocol to create a link and load it with $NEAR and other assets. Behind the scenes, the protocol will associate the access key (embedded within the link) to the specified amount of $NEAR. Anyone who has the link can then gain access to the funds.
+
+These funds can be used to either create an entirely new named account, or can be sent to an existing wallet if the user already has one.
+
+The concept of sending NEAR can then be expanded to allow someone to not only load a link with native $NEAR, but also with Fungible Tokens and Non-Fungible Tokens as well.
+
+The end user journey would be that an organization or funder deposits assets (either fungible or non-fungible) into the Keypom contract and generates a unique link. This link is then given to the user that wishes to onboard onto NEAR. When the link is clicked, the user either creates a new account or uses an existing one for the assets to be automatically sent to.
+
+In the NEAR ecosystem, this process is known as a linkdrop. With Keypom, a series of identical linkdrops can be created at once and is referred to as **a drop**.
+
+### Customizable Linkdrops
+The Keypom Protocol allows for a huge variety of customizations that can be embedded into the onboarding experience. For example, as the funder, you can specify the amount of times a link can be used before itโs invalidated. Rather than someone using a link once, they can potentially use it many times and receive assets over a long period of time.
+
+### Function Calls with Keypom
+The Keypom Protocol can also be used to execute predefined function calls on smart contracts when a link is used. For example, you could create a link that, when claimed, will automatically call a function to register the user into a DAO. This simple idea carries many powerful use-cases that, when paired with the customizable configurations and multi-use links, can create truly immersive and amazing onboarding experiences.
+
+Learn more about Keypom's Drop types below
+
+
+
+## Use Cases
+
+Here are just a few of the possibilities with Keypom
+
+### NFT Ticketing
+The problem with current NFT ticketing systems is that they require users to have a wallet. This is a huge barrier to entry for people that are attending events but donโt have wallets. In addition, there is often no proof of attendance for the event as the NFT is burned in order to get into the event which requires an internet connection.
+
+Keypom aims to solve these problems by having a ticketing system that has the following features.
+
+* Users are not required to have a wallet to enter the event.
+* Each ticket is unique and can only be used by one person.
+* Attendees are not required to have wifi to gain entry to the event.
+* Attendees that did not have a NEAR wallet can get one for free.
+* Attendees can choose to receive an NFT proving their attendance at the event. This is commonly known as a [POAP](https://academy.binance.com/en/glossary/proof-of-attendance-protocol-poap).
+
+
+In addition, some way to provide analytics to event organizers that contains information such as links that were:
+* Given out but not clicked at all.
+* Clicked but not attended.
+* Partially claimed indicating the number of people that attended but did not onboard or receive a POAP.
+* Fully claimed indicating the number of people that attended and received a POAP.
+
+### Recurring Payments/Subscriptions
+Recurring payments are quite a common situation. Letโs say you need to send someone $50 USDC every week. You could create a key with 5 claims that has a throttle_timestamp of 1 week. You would then pre-load maybe the first weekโs deposit of $50 USDC and register 1 use or you could send $500 USDC for the first 10 weeks. At that point, you would simply hand over the key to the user and they can claim once a week.
+
+
+### Auto-Registration in to DAOs
+DAOs are a raging topic in crypto. The problem with DAOs, however, is there is a barrier to entry for users that arenโt familiar with the specific chain theyโre built on top of. Users might not have wallets or understand how to interact with contracts. On the contrary, they might be very well versed or immersed in the DAOโs topics. They shouldnโt be required to create a wallet and learn the onboarding process.
+
+With Keypom, you can create a function call drop with the main purpose of registering users into a DAO. For people that have a wallet, this will act as an easy way of registering them with the click of a link. For users that donโt have a wallet and are unfamiliar with NEAR, they can be onboarded and registered into the DAO with the same click of a link.
+
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/_category_.yml b/versioned_docs/version-2.0/keypom-sdk/Core/_category_.yml
new file mode 100644
index 00000000..5893a319
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/_category_.yml
@@ -0,0 +1,3 @@
+label: "Core TypeDocs"
+position: 0
+collapsed: false
\ No newline at end of file
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/BasicTransaction.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/BasicTransaction.md
new file mode 100644
index 00000000..b537263c
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/BasicTransaction.md
@@ -0,0 +1,37 @@
+---
+id: "BasicTransaction"
+title: "Interface: BasicTransaction"
+sidebar_label: "BasicTransaction"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+## Properties
+
+### actions
+
+ **actions**: `Action`[]
+
+#### Defined in
+
+[lib/types/general.ts:108](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L108)
+
+___
+
+### receiverId
+
+ **receiverId**: `string`
+
+#### Defined in
+
+[lib/types/general.ts:106](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L106)
+
+___
+
+### signerId
+
+ **signerId**: `string`
+
+#### Defined in
+
+[lib/types/general.ts:107](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L107)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ContractSourceMetadata.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ContractSourceMetadata.md
new file mode 100644
index 00000000..0656191a
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ContractSourceMetadata.md
@@ -0,0 +1,34 @@
+---
+id: "ContractSourceMetadata"
+title: "Interface: ContractSourceMetadata"
+sidebar_label: "ContractSourceMetadata"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Information returned from `getContractSourceMetadata` about the deployed Keypom contract. This is part of [NEP-330](https://nomicon.io/Standards/SourceMetadata) and
+can allow you to view exactly what code is deployed to the contract.
+
+## Properties
+
+### link
+
+ **link**: `string`
+
+Link to the specific commit and code on GitHub that is deployed to the Keypom account
+
+#### Defined in
+
+[lib/types/general.ts:102](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L102)
+
+___
+
+### version
+
+ **version**: `string`
+
+Versioning used by the Keypom developers to indicate which version of the contract is deployed.
+
+#### Defined in
+
+[lib/types/general.ts:100](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L100)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/CreateDropProtocolArgs.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/CreateDropProtocolArgs.md
new file mode 100644
index 00000000..46659a70
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/CreateDropProtocolArgs.md
@@ -0,0 +1,117 @@
+---
+id: "CreateDropProtocolArgs"
+title: "Interface: CreateDropProtocolArgs"
+sidebar_label: "CreateDropProtocolArgs"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+## Properties
+
+### config
+
+ `Optional` **config**: [`ProtocolReturnedDropConfig`](ProtocolReturnedDropConfig.md)
+
+#### Defined in
+
+[lib/types/params.ts:54](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L54)
+
+___
+
+### deposit\_per\_use
+
+ **deposit\_per\_use**: `string`
+
+#### Defined in
+
+[lib/types/params.ts:51](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L51)
+
+___
+
+### drop\_id
+
+ `Optional` **drop\_id**: `string`
+
+#### Defined in
+
+[lib/types/params.ts:53](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L53)
+
+___
+
+### fc
+
+ `Optional` **fc**: [`ProtocolReturnedFCData`](ProtocolReturnedFCData.md)
+
+#### Defined in
+
+[lib/types/params.ts:60](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L60)
+
+___
+
+### ft
+
+ `Optional` **ft**: [`ProtocolReturnedFTData`](ProtocolReturnedFTData.md)
+
+#### Defined in
+
+[lib/types/params.ts:58](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L58)
+
+___
+
+### metadata
+
+ `Optional` **metadata**: `string`
+
+#### Defined in
+
+[lib/types/params.ts:55](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L55)
+
+___
+
+### nft
+
+ `Optional` **nft**: [`ProtocolReturnedNFTData`](ProtocolReturnedNFTData.md)
+
+#### Defined in
+
+[lib/types/params.ts:59](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L59)
+
+___
+
+### passwords\_per\_use
+
+ `Optional` **passwords\_per\_use**: [`PasswordPerUse`](PasswordPerUse.md)[][]
+
+#### Defined in
+
+[lib/types/params.ts:61](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L61)
+
+___
+
+### public\_keys
+
+ `Optional` **public\_keys**: `string`[]
+
+#### Defined in
+
+[lib/types/params.ts:50](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L50)
+
+___
+
+### required\_gas
+
+ `Optional` **required\_gas**: `string`
+
+#### Defined in
+
+[lib/types/params.ts:56](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L56)
+
+___
+
+### simple
+
+ `Optional` **simple**: [`ProtocolReturnedSimpleData`](ProtocolReturnedSimpleData.md)
+
+#### Defined in
+
+[lib/types/params.ts:57](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L57)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/CreateOrAddReturn.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/CreateOrAddReturn.md
new file mode 100644
index 00000000..ae461116
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/CreateOrAddReturn.md
@@ -0,0 +1,69 @@
+---
+id: "CreateOrAddReturn"
+title: "Interface: CreateOrAddReturn"
+sidebar_label: "CreateOrAddReturn"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Information returned when creating a drop or adding keys via `createDrop` and `addKeys` respectively.
+
+## Properties
+
+### dropId
+
+ **dropId**: `string`
+
+The drop ID for the drop that is being interacted with.
+
+#### Defined in
+
+[lib/types/params.ts:34](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L34)
+
+___
+
+### keys
+
+ `Optional` **keys**: [`GeneratedKeyPairs`](GeneratedKeyPairs.md)
+
+Any keys that were automatically generated.
+
+#### Defined in
+
+[lib/types/params.ts:32](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L32)
+
+___
+
+### requiredDeposit
+
+ `Optional` **requiredDeposit**: `string`
+
+The required deposit that should be attached to the transaction.
+
+#### Defined in
+
+[lib/types/params.ts:30](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L30)
+
+___
+
+### responses
+
+ `Optional` **responses**: `any`
+
+The responses to any transactions that were signed and sent to the network.
+
+#### Defined in
+
+[lib/types/params.ts:26](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L26)
+
+___
+
+### transactions
+
+ `Optional` **transactions**: `Transaction`[]
+
+Information about the transactions if `returnTransactions` is specified in the arguments. This will result in the information being returned instead of signed and sent.
+
+#### Defined in
+
+[lib/types/params.ts:28](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L28)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/Drop.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/Drop.md
new file mode 100644
index 00000000..c1547b53
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/Drop.md
@@ -0,0 +1,153 @@
+---
+id: "Drop"
+title: "Interface: Drop"
+sidebar_label: "Drop"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Information related to a specific drop.
+
+## Properties
+
+### config
+
+ `Optional` **config**: [`DropConfig`](DropConfig.md)
+
+All drops regardless of their type can have a suite of configurations such as how many uses each key has or how often a key can be used.
+
+#### Defined in
+
+[lib/types/drops.ts:50](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L50)
+
+___
+
+### depositPerUse
+
+ **depositPerUse**: `string`
+
+How much $yoctoNEAR will be transferred anytime a key is used that is part of this drop.
+
+#### Defined in
+
+[lib/types/drops.ts:40](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L40)
+
+___
+
+### dropId
+
+ **dropId**: `string`
+
+Drop ID for this specific drop.
+
+#### Defined in
+
+[lib/types/drops.ts:36](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L36)
+
+___
+
+### fc
+
+ `Optional` **fc**: [`FCData`](FCData.md)
+
+For Function-Call drops, important information needs to be stored such as which methods, the attached deposit, args etc.
+
+#### Defined in
+
+[lib/types/drops.ts:48](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L48)
+
+___
+
+### ft
+
+ `Optional` **ft**: [`FTData`](FTData.md)
+
+For Fungible Token drops, important information such as the amount of tokens to transfer, or contract need to be stored.
+
+#### Defined in
+
+[lib/types/drops.ts:46](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L46)
+
+___
+
+### metadata
+
+ `Optional` **metadata**: `string`
+
+Any extra information about the drop can be stored as metadata. This is up to the drop creator and can be stringified JSON, or any other string.
+
+#### Defined in
+
+[lib/types/drops.ts:52](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L52)
+
+___
+
+### nextKeyId
+
+ **nextKeyId**: `number`
+
+What is the next unique ID that will be given to the next access key added to this drop.
+
+#### Defined in
+
+[lib/types/drops.ts:58](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L58)
+
+___
+
+### nft
+
+ `Optional` **nft**: [`NFTData`](NFTData.md)
+
+For NFT drops, important information such as the token IDs, or contract need to be stored.
+
+#### Defined in
+
+[lib/types/drops.ts:44](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L44)
+
+___
+
+### ownerId
+
+ **ownerId**: `string`
+
+Which account created this drop.
+
+#### Defined in
+
+[lib/types/drops.ts:38](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L38)
+
+___
+
+### registeredUses
+
+ **registeredUses**: `number`
+
+How many key uses are registered for this drop? This is only applicable to simple drops with lazy registrations, FT drops, and NFT drops.
+
+#### Defined in
+
+[lib/types/drops.ts:54](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L54)
+
+___
+
+### requiredGas
+
+ **requiredGas**: `string`
+
+In order to use an access key that's part of this drop, how much Gas *needs* to be attached to the call?
+
+#### Defined in
+
+[lib/types/drops.ts:56](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L56)
+
+___
+
+### simple
+
+ `Optional` **simple**: [`SimpleData`](SimpleData.md)
+
+For simple drops, there are specific, optional configurations.
+
+#### Defined in
+
+[lib/types/drops.ts:42](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L42)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/DropConfig.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/DropConfig.md
new file mode 100644
index 00000000..99aad8cd
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/DropConfig.md
@@ -0,0 +1,71 @@
+---
+id: "DropConfig"
+title: "Interface: DropConfig"
+sidebar_label: "DropConfig"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Configurable options for any drop regardless of type.
+
+## Properties
+
+### dropRoot
+
+ `Optional` **dropRoot**: `string`
+
+Override the global root account that all created sub-accounts will have (currently `near` or `testnet`). This allows users to drops that have a custom root.
+For example, Fayyr could specify a root of `fayyr.near` By which all sub-accounts will then be `ACCOUNT.fayyr.near`.
+It's important to note that this root account *MUST* have a smart contract deployed that has a method `create_account`.
+
+#### Defined in
+
+[lib/types/drops.ts:81](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L81)
+
+___
+
+### sale
+
+ `Optional` **sale**: [`PublicSaleConfig`](PublicSaleConfig.md)
+
+Any information related to primary market sales for access keys added to this drop.
+
+#### Defined in
+
+[lib/types/drops.ts:75](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L75)
+
+___
+
+### time
+
+ `Optional` **time**: [`TimeConfig`](TimeConfig.md)
+
+Any information related to time-based configurations such as a starting date for keys etc.
+
+#### Defined in
+
+[lib/types/drops.ts:69](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L69)
+
+___
+
+### usage
+
+ `Optional` **usage**: [`UsageConfig`](UsageConfig.md)
+
+Any information related to how access keys are used such as which methods they can call or whether an empty drop should be automatically deleted etc.
+
+#### Defined in
+
+[lib/types/drops.ts:72](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L72)
+
+___
+
+### usesPerKey
+
+ `Optional` **usesPerKey**: `number`
+
+How many uses can each key have before it's deleted. If this isn't specified, it defaults to 1 use per key.
+
+#### Defined in
+
+[lib/types/drops.ts:66](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L66)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/EnvVars.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/EnvVars.md
new file mode 100644
index 00000000..5a17a087
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/EnvVars.md
@@ -0,0 +1,223 @@
+---
+id: "EnvVars"
+title: "Interface: EnvVars"
+sidebar_label: "EnvVars"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Important context that is used throughout the SDK. This is generated when `initKeypom` is called and can be retrieved by calling `useKeypom`.
+All parameters will start off as undefined until the Keypom SDK is initialized.
+
+## Properties
+
+### attachedGas
+
+ `Optional` **attachedGas**: `string`
+
+The amount of Gas that will be attached to the `claim` and `create_account_and_claim` functions for claiming linkdrops (100 TGas).
+
+#### Defined in
+
+[lib/types/general.ts:77](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L77)
+
+___
+
+### connection
+
+ `Optional` **connection**: `Connection`
+
+The connection instance that is part of the NEAR object
+
+#### Defined in
+
+[lib/types/general.ts:59](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L59)
+
+___
+
+### contractAccount
+
+ `Optional` **contractAccount**: `Account`
+
+The NEAR Account object for the Keypom contract being used. This lets you know the account ID for the contract and can be used to sign transactions for claiming linkdrops.
+
+#### Defined in
+
+[lib/types/general.ts:69](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L69)
+
+___
+
+### contractId
+
+ `Optional` **contractId**: `string`
+
+The account ID where the Keypom contract is deployed to.
+
+#### Defined in
+
+[lib/types/general.ts:79](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L79)
+
+___
+
+### error
+
+ `Optional` **error**: `string`
+
+#### Defined in
+
+[lib/types/general.ts:83](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L83)
+
+___
+
+### execute
+
+ `Optional` **execute**: `any`
+
+#### Defined in
+
+[lib/types/general.ts:87](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L87)
+
+___
+
+### fundingAccount
+
+ `Optional` **fundingAccount**: `Account`
+
+The NEAR Account object for the Funder
+
+#### Defined in
+
+[lib/types/general.ts:65](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L65)
+
+___
+
+### fundingAccountDetails
+
+ `Optional` **fundingAccountDetails**: [`Funder`](Funder.md)
+
+The details for the funder such as any `rootEntropy` or their `secretKey` etc.
+
+#### Defined in
+
+[lib/types/general.ts:67](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L67)
+
+___
+
+### gas
+
+ `Optional` **gas**: `string`
+
+The default amount of Gas that will be attached to transactions (200 TGas).
+
+#### Defined in
+
+[lib/types/general.ts:73](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L73)
+
+___
+
+### gas300
+
+ `Optional` **gas300**: `string`
+
+The max amount of Gas that will be attached to transactions (300 TGas).
+
+#### Defined in
+
+[lib/types/general.ts:75](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L75)
+
+___
+
+### getAccount
+
+ `Optional` **getAccount**: `any`
+
+#### Defined in
+
+[lib/types/general.ts:85](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L85)
+
+___
+
+### keyStore
+
+ `Optional` **keyStore**: `KeyStore`
+
+Which type of KeyStore is used when locating keys and signing transactions throughout the SDK (In Memory, Unencrypted FileStore etc.)
+
+#### Defined in
+
+[lib/types/general.ts:61](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L61)
+
+___
+
+### near
+
+ `Optional` **near**: `Near`
+
+The specific NEAR object that contains important information such as the KeyStore and connection. This is used to interact with the chain and can either be manually passed in or will be automatically created during `initKeypom`
+
+#### Defined in
+
+[lib/types/general.ts:57](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L57)
+
+___
+
+### networkId
+
+ `Optional` **networkId**: `string`
+
+What network is the SDK using (`testnet` or `mainnet`)
+
+#### Defined in
+
+[lib/types/general.ts:63](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L63)
+
+___
+
+### receiverId
+
+ `Optional` **receiverId**: `string`
+
+#### Defined in
+
+[lib/types/general.ts:81](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L81)
+
+___
+
+### supportedKeypomContracts
+
+ `Optional` **supportedKeypomContracts**: `Object`
+
+Object containing the supported Keypom contracts for both mainnet and testnet
+
+#### Type declaration
+
+| Name | Type |
+| :------ | :------ |
+| `mainnet` | {} |
+| `testnet` | {} |
+
+#### Defined in
+
+[lib/types/general.ts:89](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L89)
+
+___
+
+### viewAccount
+
+ `Optional` **viewAccount**: `any`
+
+#### Defined in
+
+[lib/types/general.ts:71](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L71)
+
+___
+
+### viewCall
+
+ `Optional` **viewCall**: `any`
+
+Function that allows you to invoke a view method. This takes in a `receiverId`, `methodName`, and `args`.
+
+#### Defined in
+
+[lib/types/general.ts:91](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L91)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/FCData.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/FCData.md
new file mode 100644
index 00000000..82846117
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/FCData.md
@@ -0,0 +1,22 @@
+---
+id: "FCData"
+title: "Interface: FCData"
+sidebar_label: "FCData"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Information pertaining to all Function-Call drops. This should be passed in if the drop will be a Function-Call drop.
+
+## Properties
+
+### methods
+
+ **methods**: [`Method`](Method.md)[][]
+
+The top level array indicates a different set of methods that can be called for every key use. It is possible that for a given key use, no methods are called thus acting as a "free" key use whereby the use is reflected on-chain but no assets are transferred.
+If a given key use does not have an undefined set of methods, when it is used, all the methods in the set will be called.
+
+#### Defined in
+
+[lib/types/fc.ts:73](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L73)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/FTData.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/FTData.md
new file mode 100644
index 00000000..e38ebbaa
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/FTData.md
@@ -0,0 +1,59 @@
+---
+id: "FTData"
+title: "Interface: FTData"
+sidebar_label: "FTData"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Information pertaining to all Fungible-Token drops. This should be passed in if the drop will be used to transfer any fungible tokens.
+
+## Properties
+
+### absoluteAmount
+
+ `Optional` **absoluteAmount**: `string`
+
+Amount of tokens to transfer but considering the decimal amount.
+Example: transferring one wNEAR should be passed in as "1000000000000000000000000" and NOT "1"
+
+#### Defined in
+
+[lib/types/ft.ts:22](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/ft.ts#L22)
+
+___
+
+### amount
+
+ `Optional` **amount**: `string`
+
+Human readable format for the amount of tokens to transfer every time the FT key is used.
+Example: transferring one wNEAR should be passed in as "1" and NOT "1000000000000000000000000"
+
+#### Defined in
+
+[lib/types/ft.ts:17](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/ft.ts#L17)
+
+___
+
+### contractId
+
+ **contractId**: `string`
+
+Which contract do the FTs belong to?
+
+#### Defined in
+
+[lib/types/ft.ts:8](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/ft.ts#L8)
+
+___
+
+### senderId
+
+ `Optional` **senderId**: `string`
+
+By default, anyone can fund your drop with FTs. This field allows you to set a specific account ID that will be locked into sending the FTs.
+
+#### Defined in
+
+[lib/types/ft.ts:12](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/ft.ts#L12)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/Funder.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/Funder.md
new file mode 100644
index 00000000..a3cb4015
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/Funder.md
@@ -0,0 +1,75 @@
+---
+id: "Funder"
+title: "Interface: Funder"
+sidebar_label: "Funder"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Outlines how the structure of the *funder* object should be passed into `initKeypom` or `updateFunder`. This contains important information such as the
+secret key, account ID and any root entropy associated with the account.
+
+**`Throws`**
+
+if neither `secretKey` or `seedPhrase` are provided. One of these need to be passed in.
+
+## Properties
+
+### accountId
+
+ **accountId**: `string`
+
+The account ID of the funder that will be used to sign transactions.
+
+#### Defined in
+
+[lib/types/general.ts:35](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L35)
+
+___
+
+### fundingKeyPair
+
+ `Optional` **fundingKeyPair**: `KeyPair`
+
+#### Defined in
+
+[lib/types/general.ts:48](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L48)
+
+___
+
+### rootEntropy
+
+ `Optional` **rootEntropy**: `string`
+
+When interacting with the SDK, there are several places where KeyPairs can be generated automatically rather than you having to pass them in.
+For example, during `createDrop` and `addKeys`, if `publicKeys` isn't passed in, the SDK will generate `numKeys` number of keys automatically.
+These generated keys can either be completely random or deterministically generated based off some entropy. If `rootEntropy` is provided, all the
+keys that are auto-generated will be based off this entropy.
+
+#### Defined in
+
+[lib/types/general.ts:46](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L46)
+
+___
+
+### secretKey
+
+ `Optional` **secretKey**: `string`
+
+A valid private key associated with the funder's account. This can be function-call or full access (depending on what limitations and security measures are in place).
+
+#### Defined in
+
+[lib/types/general.ts:37](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L37)
+
+___
+
+### seedPhrase
+
+ `Optional` **seedPhrase**: `string`
+
+12 word seedphrase that can be used to derive the `secretKey`. If this is present, it will override the passed in `secretKey`.
+
+#### Defined in
+
+[lib/types/general.ts:39](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L39)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/FungibleTokenMetadata.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/FungibleTokenMetadata.md
new file mode 100644
index 00000000..c69b3456
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/FungibleTokenMetadata.md
@@ -0,0 +1,96 @@
+---
+id: "FungibleTokenMetadata"
+title: "Interface: FungibleTokenMetadata"
+sidebar_label: "FungibleTokenMetadata"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+General structure of Fungible Token Metadata as per official NEP-148 standard (https://github.com/near/NEPs/blob/master/neps/nep-0148.md).
+
+## Properties
+
+### decimals
+
+ **decimals**: `number`
+
+Used in frontends to show the proper significant digits of a token. This concept is explained well in this OpenZeppelin post (https://docs.openzeppelin.com/contracts/3.x/erc20#a-note-on-decimals).
+
+#### Defined in
+
+[lib/types/ft.ts:36](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/ft.ts#L36)
+
+___
+
+### icon
+
+ `Optional` **icon**: `string`
+
+A small image associated with this token. Must be a data URL, to help consumers display it quickly while protecting user data.
+Recommendation: use optimized SVG, which can result in high-resolution images with only 100s of bytes of storage cost.
+(Note that these storage costs are incurred to the token owner/deployer, but that querying these icons is a very cheap & cacheable read operation for all consumers of the contract and the RPC nodes that serve the data.)
+Recommendation: create icons that will work well with both light-mode and dark-mode websites by either using middle-tone color schemes, or by embedding media queries in the SVG.
+
+#### Defined in
+
+[lib/types/ft.ts:43](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/ft.ts#L43)
+
+___
+
+### name
+
+ **name**: `string`
+
+The human-readable name of the token.
+
+#### Defined in
+
+[lib/types/ft.ts:32](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/ft.ts#L32)
+
+___
+
+### reference
+
+ `Optional` **reference**: `string`
+
+A link to a valid JSON file containing various keys offering supplementary details on the token. Example: /ipfs/QmdmQXB2mzChmMeKY47C43LxUdg1NDJ5MWcKMKxDu7RgQm, https://example.com/token.json, etc. If the information given in this document conflicts with the on-chain attributes, the values in reference shall be considered the source of truth.
+
+#### Defined in
+
+[lib/types/ft.ts:45](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/ft.ts#L45)
+
+___
+
+### reference\_hash
+
+ `Optional` **reference\_hash**: `string`
+
+The base64-encoded sha256 hash of the JSON file contained in the reference field. This is to guard against off-chain tampering.
+
+#### Defined in
+
+[lib/types/ft.ts:47](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/ft.ts#L47)
+
+___
+
+### spec
+
+ **spec**: `string`
+
+A string. Should be ft-1.0.0 to indicate that a Fungible Token contract adheres to the current versions of this Metadata and the Fungible Token Core specs. This will allow consumers of the Fungible Token to know if they support the features of a given contract.
+
+#### Defined in
+
+[lib/types/ft.ts:30](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/ft.ts#L30)
+
+___
+
+### symbol
+
+ **symbol**: `string`
+
+The abbreviation, like wETH or AMPL.
+
+#### Defined in
+
+[lib/types/ft.ts:34](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/ft.ts#L34)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/GeneratedKeyPairs.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/GeneratedKeyPairs.md
new file mode 100644
index 00000000..505479f3
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/GeneratedKeyPairs.md
@@ -0,0 +1,46 @@
+---
+id: "GeneratedKeyPairs"
+title: "Interface: GeneratedKeyPairs"
+sidebar_label: "GeneratedKeyPairs"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+For each generated KeyPair (either through `createDrop`, `addKeys` or `generateKeys`), the public and private keys are returned.
+In addition, the actual KeyPair objects are returned as well.
+
+## Properties
+
+### keyPairs
+
+ **keyPairs**: `KeyPair`[]
+
+Actual KeyPair objects that can be used to sign messages, verify signatures, and get the public and private keys
+
+#### Defined in
+
+[lib/types/general.ts:20](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L20)
+
+___
+
+### publicKeys
+
+ **publicKeys**: `string`[]
+
+Set of public keys that were generated
+
+#### Defined in
+
+[lib/types/general.ts:22](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L22)
+
+___
+
+### secretKeys
+
+ **secretKeys**: `string`[]
+
+Set of private keys that were generated
+
+#### Defined in
+
+[lib/types/general.ts:24](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L24)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/KeyInfo.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/KeyInfo.md
new file mode 100644
index 00000000..a84ca835
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/KeyInfo.md
@@ -0,0 +1,93 @@
+---
+id: "KeyInfo"
+title: "Interface: KeyInfo"
+sidebar_label: "KeyInfo"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Important information returned in many view calls regarding a specific access key.
+
+## Properties
+
+### allowance
+
+ **allowance**: `number`
+
+How much allowance does the key have left (measured in $yoctoNEAR). When the key is deleted, this is refunded to the funder's balance.
+
+#### Defined in
+
+[lib/types/drops.ts:25](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L25)
+
+___
+
+### curKeyUse
+
+ **curKeyUse**: `number`
+
+Which use is the key currently on? For single-use keys, this is always 1.
+
+#### Defined in
+
+[lib/types/drops.ts:16](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L16)
+
+___
+
+### dropId
+
+ **dropId**: `string`
+
+Drop ID for the specific drop that the key belongs to.
+
+#### Defined in
+
+[lib/types/drops.ts:11](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L11)
+
+___
+
+### keyId
+
+ **keyId**: `number`
+
+The unique ID associated to this key. IDs are *not* unique across drops but they are unique for any key in the drop.
+
+#### Defined in
+
+[lib/types/drops.ts:28](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L28)
+
+___
+
+### lastUsed
+
+ **lastUsed**: `number`
+
+At what timestamp was the key last used? Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/drops.ts:22](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L22)
+
+___
+
+### publicKey
+
+ **publicKey**: `string`
+
+Public key for this access key.
+
+#### Defined in
+
+[lib/types/drops.ts:13](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L13)
+
+___
+
+### remainingUses
+
+ **remainingUses**: `number`
+
+How many uses this key has left before it's deleted.
+
+#### Defined in
+
+[lib/types/drops.ts:19](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L19)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/Method.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/Method.md
new file mode 100644
index 00000000..bd31581d
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/Method.md
@@ -0,0 +1,153 @@
+---
+id: "Method"
+title: "Interface: Method"
+sidebar_label: "Method"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Outlines the information needed for any given method as part of a Function-Call drop.
+Each individual key use can have an array of Methods that can be called.
+
+## Properties
+
+### accountIdField
+
+ `Optional` **accountIdField**: `string`
+
+Specifies what field Keypom should auto-inject the account that claimed the drop's ID into when calling the function.
+As an example, if the methodName was `nft_mint` and it expected a field `receiver_id` to be passed in, indicating who should receive the token, then the `accountIdField` would be `receiver_id`.
+To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field"
+
+#### Defined in
+
+[lib/types/fc.ts:34](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L34)
+
+___
+
+### args
+
+ **args**: `string`
+
+What arguments should be passed to the method. This should be in stringified JSON.
+
+#### Defined in
+
+[lib/types/fc.ts:19](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L19)
+
+___
+
+### attachedDeposit
+
+ **attachedDeposit**: `string`
+
+How much yoctoNEAR should be attached to the call.
+
+#### Defined in
+
+[lib/types/fc.ts:23](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L23)
+
+___
+
+### attachedGas
+
+ `Optional` **attachedGas**: `string`
+
+How much gas to attach to this method call. If none, all the gas is split between the parallel method calls in a given claim.
+If this is specified, the key can ONLY be used to call `claim` and no `deposit_per_use` can be specified. This leads the key to act like a method calling proxy instead of a linkdrop.
+
+#### Defined in
+
+[lib/types/fc.ts:28](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L28)
+
+___
+
+### dropIdField
+
+ `Optional` **dropIdField**: `string`
+
+Specifies what field Keypom should auto-inject the drops ID into when calling the function.
+As an example, if an NFT contract expected the Keypom drop ID to be passed in as the field `keypom_drop_id` in order to gate access to who can mint NFTs, then the `dropIdField` would be `keypom_drop_id`.
+To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field"
+
+#### Defined in
+
+[lib/types/fc.ts:40](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L40)
+
+___
+
+### funderIdField
+
+ `Optional` **funderIdField**: `string`
+
+Specifies what field Keypom should auto-inject the drop funder's account ID into when calling the function.
+As an example, if an NFT contract wanted to gate only users that had a key coming from a specific funder's drops, it could expect a field called `keypom_funder_id` and the `funderIdField` would be `keypom_funder_id`.
+To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field"
+
+#### Defined in
+
+[lib/types/fc.ts:52](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L52)
+
+___
+
+### keyIdField
+
+ `Optional` **keyIdField**: `string`
+
+Specifies what field Keypom should auto-inject the key's ID into when calling the function.
+As an example, if an NFT contract wanted to gate only users with an odd key ID to be able to mint an NFT and their parameter was called `keypom_key_id`, then the `keyIdField` would be `keypom_key_id`.
+To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field"
+
+#### Defined in
+
+[lib/types/fc.ts:46](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L46)
+
+___
+
+### methodName
+
+ **methodName**: `string`
+
+The method that should be invoked on the `receiverId`'s contract.
+
+#### Defined in
+
+[lib/types/fc.ts:15](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L15)
+
+___
+
+### receiverId
+
+ **receiverId**: `string`
+
+The account ID that the contract is deployed to that the method will be called on.
+
+#### Defined in
+
+[lib/types/fc.ts:11](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L11)
+
+___
+
+### receiverToClaimer
+
+ `Optional` **receiverToClaimer**: `boolean`
+
+If set to true, the claiming account ID will be the receiver ID of the method call.
+This receiver must be a valid account and non-malicious (cannot be set to the keypom contract)
+
+#### Defined in
+
+[lib/types/fc.ts:57](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L57)
+
+___
+
+### userArgsRule
+
+ `Optional` **userArgsRule**: ``"AllUser"`` \| ``"FunderPreferred"`` \| ``"UserPreferred"``
+
+What permissions does the user have when providing custom arguments to the function call?
+By default, the user cannot provide any custom arguments
+
+#### Defined in
+
+[lib/types/fc.ts:62](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L62)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/NFTData.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/NFTData.md
new file mode 100644
index 00000000..61f9000c
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/NFTData.md
@@ -0,0 +1,47 @@
+---
+id: "NFTData"
+title: "Interface: NFTData"
+sidebar_label: "NFTData"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+General structure of a Non-Fungible Token drop. This should be passed into `createDrop` if you wish to have an NFT drop.
+
+## Properties
+
+### contractId
+
+ **contractId**: `string`
+
+The account ID that the NFT contract is deployed to. This contract is where all the NFTs for the specific drop must come from.
+
+#### Defined in
+
+[lib/types/nft.ts:6](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L6)
+
+___
+
+### senderId
+
+ `Optional` **senderId**: `string`
+
+By default, anyone can fund your drop with NFTs. This field allows you to set a specific account ID that will be locked into sending the NFTs.
+
+#### Defined in
+
+[lib/types/nft.ts:8](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L8)
+
+___
+
+### tokenIds
+
+ `Optional` **tokenIds**: `string`[]
+
+If there are any token IDs that you wish to be automatically sent to the Keypom contract in order to register keys as part of `createDrop`, specify them here.
+A maximum of 2 token IDs can be sent as part of the transaction. If you wish to register more keys by sending more NFTs, you must do this in a separate call by invoking
+the `nftTransferCall` method separately.
+
+#### Defined in
+
+[lib/types/nft.ts:14](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L14)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/NonFungibleTokenMetadata.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/NonFungibleTokenMetadata.md
new file mode 100644
index 00000000..fdd4d598
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/NonFungibleTokenMetadata.md
@@ -0,0 +1,153 @@
+---
+id: "NonFungibleTokenMetadata"
+title: "Interface: NonFungibleTokenMetadata"
+sidebar_label: "NonFungibleTokenMetadata"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+General structure of Non-Fungible Token Metadata (in camelCase) as per official NEP-177 standard (https://github.com/near/NEPs/blob/master/neps/nep-0177.md).
+
+## Properties
+
+### copies
+
+ `Optional` **copies**: `number`
+
+number of copies of this set of metadata in existence when token was minted.
+
+#### Defined in
+
+[lib/types/nft.ts:76](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L76)
+
+___
+
+### description
+
+ `Optional` **description**: `string`
+
+free-form description
+
+#### Defined in
+
+[lib/types/nft.ts:70](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L70)
+
+___
+
+### expiresAt
+
+ `Optional` **expiresAt**: `number`
+
+When token expires, Unix epoch in milliseconds
+
+#### Defined in
+
+[lib/types/nft.ts:80](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L80)
+
+___
+
+### extra
+
+ `Optional` **extra**: `string`
+
+anything extra the NFT wants to store on-chain. Can be stringified JSON.
+
+#### Defined in
+
+[lib/types/nft.ts:86](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L86)
+
+___
+
+### issuedAt
+
+ `Optional` **issuedAt**: `number`
+
+When token was issued or minted, Unix epoch in milliseconds
+
+#### Defined in
+
+[lib/types/nft.ts:78](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L78)
+
+___
+
+### media
+
+ `Optional` **media**: `string`
+
+URL to associated media, preferably to decentralized, content-addressed storage
+
+#### Defined in
+
+[lib/types/nft.ts:72](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L72)
+
+___
+
+### mediaHash
+
+ `Optional` **mediaHash**: `string`
+
+Base64-encoded sha256 hash of content referenced by the `media` field. Required if `media` is included.
+
+#### Defined in
+
+[lib/types/nft.ts:74](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L74)
+
+___
+
+### reference
+
+ `Optional` **reference**: `string`
+
+URL to an off-chain JSON file with more info.
+
+#### Defined in
+
+[lib/types/nft.ts:88](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L88)
+
+___
+
+### referenceHash
+
+ `Optional` **referenceHash**: `string`
+
+Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included.
+
+#### Defined in
+
+[lib/types/nft.ts:90](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L90)
+
+___
+
+### startsAt
+
+ `Optional` **startsAt**: `number`
+
+When token starts being valid, Unix epoch in milliseconds
+
+#### Defined in
+
+[lib/types/nft.ts:82](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L82)
+
+___
+
+### title
+
+ `Optional` **title**: `string`
+
+ex. "Arch Nemesis: Mail Carrier" or "Parcel #5055"
+
+#### Defined in
+
+[lib/types/nft.ts:68](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L68)
+
+___
+
+### updatedAt
+
+ `Optional` **updatedAt**: `number`
+
+When token was last updated, Unix epoch in milliseconds
+
+#### Defined in
+
+[lib/types/nft.ts:84](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L84)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/PasswordPerUse.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/PasswordPerUse.md
new file mode 100644
index 00000000..ea683acb
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/PasswordPerUse.md
@@ -0,0 +1,33 @@
+---
+id: "PasswordPerUse"
+title: "Interface: PasswordPerUse"
+sidebar_label: "PasswordPerUse"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Keeps track of the password for a given key use. This should be passed in as an array for each key that has passwords.
+
+## Properties
+
+### key\_use
+
+ **key\_use**: `number`
+
+Which use does the password belong to? These uses are *NOT* zero-indexed so the first use corresponds to `1` not `0`.
+
+#### Defined in
+
+[lib/types/drops.ts:196](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L196)
+
+___
+
+### pw
+
+ **pw**: `string`
+
+The password for this given use
+
+#### Defined in
+
+[lib/types/drops.ts:194](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L194)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedDrop.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedDrop.md
new file mode 100644
index 00000000..608829a3
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedDrop.md
@@ -0,0 +1,166 @@
+---
+id: "ProtocolReturnedDrop"
+title: "Interface: ProtocolReturnedDrop"
+sidebar_label: "ProtocolReturnedDrop"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Drop information returned from the Protocol. This interface is exactly the same as the `Drop`, except all the fields are
+snake cased instead of camel cased due to what the Protocol returns.
+
+## Properties
+
+### config
+
+ `Optional` **config**: [`ProtocolReturnedDropConfig`](ProtocolReturnedDropConfig.md)
+
+All drops regardless of their type can have a suite of configurations such as how many uses each key has or how often a key can be used.
+
+#### Defined in
+
+[lib/types/protocol.ts:49](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L49)
+
+___
+
+### deposit\_per\_use
+
+ **deposit\_per\_use**: `string`
+
+How much $yoctoNEAR will be transferred anytime a key is used that is part of this drop.
+
+#### Defined in
+
+[lib/types/protocol.ts:39](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L39)
+
+___
+
+### drop\_id
+
+ **drop\_id**: `string`
+
+Drop ID for this specific drop.
+
+#### Defined in
+
+[lib/types/protocol.ts:35](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L35)
+
+___
+
+### fc
+
+ `Optional` **fc**: [`ProtocolReturnedFCData`](ProtocolReturnedFCData.md)
+
+For Function-Call drops, important information needs to be stored such as which methods, the attached deposit, args etc.
+
+#### Defined in
+
+[lib/types/protocol.ts:47](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L47)
+
+___
+
+### ft
+
+ `Optional` **ft**: [`ProtocolReturnedFTData`](ProtocolReturnedFTData.md)
+
+For Fungible Token drops, important information such as the amount of tokens to transfer, or contract need to be stored.
+
+#### Defined in
+
+[lib/types/protocol.ts:45](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L45)
+
+___
+
+### keys
+
+ `Optional` **keys**: [`ProtocolReturnedKeyInfo`](ProtocolReturnedKeyInfo.md)[]
+
+If calling `getDrops` or `getDropInformation` and `withKeys` is passed in as true, an extra view call will be done to get a set of keys that are currently on the drop.
+
+#### Defined in
+
+[lib/types/protocol.ts:59](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L59)
+
+___
+
+### metadata
+
+ `Optional` **metadata**: `string`
+
+Any extra information about the drop can be stored as metadata. This is up to the drop creator and can be stringified JSON, or any other string.
+
+#### Defined in
+
+[lib/types/protocol.ts:51](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L51)
+
+___
+
+### next\_key\_id
+
+ **next\_key\_id**: `number`
+
+What is the next unique ID that will be given to the next access key added to this drop.
+
+#### Defined in
+
+[lib/types/protocol.ts:57](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L57)
+
+___
+
+### nft
+
+ `Optional` **nft**: [`ProtocolReturnedNFTData`](ProtocolReturnedNFTData.md)
+
+For NFT drops, important information such as the token IDs, or contract need to be stored.
+
+#### Defined in
+
+[lib/types/protocol.ts:43](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L43)
+
+___
+
+### owner\_id
+
+ **owner\_id**: `string`
+
+Which account created this drop.
+
+#### Defined in
+
+[lib/types/protocol.ts:37](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L37)
+
+___
+
+### registered\_uses
+
+ **registered\_uses**: `number`
+
+How many key uses are registered for this drop? This is only applicable to simple drops with lazy registrations, FT drops, and NFT drops.
+
+#### Defined in
+
+[lib/types/protocol.ts:53](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L53)
+
+___
+
+### required\_gas
+
+ **required\_gas**: `string`
+
+In order to use an access key that's part of this drop, how much Gas *needs* to be attached to the call?
+
+#### Defined in
+
+[lib/types/protocol.ts:55](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L55)
+
+___
+
+### simple
+
+ `Optional` **simple**: [`ProtocolReturnedSimpleData`](ProtocolReturnedSimpleData.md)
+
+For simple drops, there are specific, optional configurations.
+
+#### Defined in
+
+[lib/types/protocol.ts:41](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L41)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedDropConfig.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedDropConfig.md
new file mode 100644
index 00000000..a43cfbfb
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedDropConfig.md
@@ -0,0 +1,70 @@
+---
+id: "ProtocolReturnedDropConfig"
+title: "Interface: ProtocolReturnedDropConfig"
+sidebar_label: "ProtocolReturnedDropConfig"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Drop config returned from the Protocol. This interface is exactly the same as the `DropConfig`, except all the fields are
+snake cased instead of camel cased due to what the Protocol returns.
+
+## Properties
+
+### root\_account\_id
+
+ `Optional` **root\_account\_id**: `string`
+
+Override the global root account that all created sub-accounts will have (currently `near` or `testnet`). This allows users to drops that have a custom root.
+For example, Fayyr could specify a root of `fayyr.near` By which all sub-accounts will then be `ACCOUNT.fayyr.near`.
+It's important to note that this root account *MUST* have a smart contract deployed that has a method `create_account`.
+
+#### Defined in
+
+[lib/types/protocol.ts:83](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L83)
+
+___
+
+### sale
+
+ `Optional` **sale**: [`ProtocolReturnedPublicSaleConfig`](ProtocolReturnedPublicSaleConfig.md)
+
+#### Defined in
+
+[lib/types/protocol.ts:76](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L76)
+
+___
+
+### time
+
+ `Optional` **time**: [`ProtocolReturnedTimeConfig`](ProtocolReturnedTimeConfig.md)
+
+Any information related to time-based configurations such as a starting date for keys etc.
+
+#### Defined in
+
+[lib/types/protocol.ts:71](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L71)
+
+___
+
+### usage
+
+ `Optional` **usage**: [`ProtocolReturnedUsageConfig`](ProtocolReturnedUsageConfig.md)
+
+Any information related to how access keys are used such as which methods they can call or whether an empty drop should be automatically deleted etc.
+
+#### Defined in
+
+[lib/types/protocol.ts:74](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L74)
+
+___
+
+### uses\_per\_key
+
+ `Optional` **uses\_per\_key**: `number`
+
+How many uses can each key have before it's deleted. If this isn't specified, it defaults to 1 use per key.
+
+#### Defined in
+
+[lib/types/protocol.ts:68](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L68)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedFCData.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedFCData.md
new file mode 100644
index 00000000..196082b7
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedFCData.md
@@ -0,0 +1,23 @@
+---
+id: "ProtocolReturnedFCData"
+title: "Interface: ProtocolReturnedFCData"
+sidebar_label: "ProtocolReturnedFCData"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+FC Data returned from the Protocol. This interface is exactly the same as the `FCData`, except all the fields are
+snake cased instead of camel cased due to what the Protocol returns.
+
+## Properties
+
+### methods
+
+ **methods**: [`ProtocolReturnedMethod`](ProtocolReturnedMethod.md)[][]
+
+The top level array indicates a different set of methods that can be called for every key use. It is possible that for a given key use, no methods are called thus acting as a "free" key use whereby the use is reflected on-chain but no assets are transferred.
+If a given key use does not have an undefined set of methods, when it is used, all the methods in the set will be called.
+
+#### Defined in
+
+[lib/types/protocol.ts:300](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L300)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedFTData.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedFTData.md
new file mode 100644
index 00000000..a83e62de
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedFTData.md
@@ -0,0 +1,47 @@
+---
+id: "ProtocolReturnedFTData"
+title: "Interface: ProtocolReturnedFTData"
+sidebar_label: "ProtocolReturnedFTData"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+FT Data returned from the Protocol. This interface is exactly the same as the `FTData`, except all the fields are
+snake cased instead of camel cased due to what the Protocol returns.
+
+## Properties
+
+### balance\_per\_use
+
+ `Optional` **balance\_per\_use**: `string`
+
+Amount of tokens to transfer but considering the decimal amount.
+Example: transferring one wNEAR should be passed in as "1000000000000000000000000" and NOT "1"
+
+#### Defined in
+
+[lib/types/protocol.ts:226](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L226)
+
+___
+
+### contract\_id
+
+ **contract\_id**: `string`
+
+Which contract do the FTs belong to?
+
+#### Defined in
+
+[lib/types/protocol.ts:217](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L217)
+
+___
+
+### sender\_id
+
+ `Optional` **sender\_id**: `string`
+
+By default, anyone can fund your drop with FTs. This field allows you to set a specific account ID that will be locked into sending the FTs.
+
+#### Defined in
+
+[lib/types/protocol.ts:221](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L221)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedKeyInfo.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedKeyInfo.md
new file mode 100644
index 00000000..17abcf50
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedKeyInfo.md
@@ -0,0 +1,94 @@
+---
+id: "ProtocolReturnedKeyInfo"
+title: "Interface: ProtocolReturnedKeyInfo"
+sidebar_label: "ProtocolReturnedKeyInfo"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Key information returned from the Protocol. This interface is exactly the same as the `KeyInfo`, except all the fields are
+snake cased instead of camel cased due to what the Protocol returns.
+
+## Properties
+
+### allowance
+
+ **allowance**: `number`
+
+How much allowance does the key have left (measured in $yoctoNEAR). When the key is deleted, this is refunded to the funder's balance.
+
+#### Defined in
+
+[lib/types/protocol.ts:23](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L23)
+
+___
+
+### cur\_key\_use
+
+ **cur\_key\_use**: `number`
+
+Which use is the key currently on? For single-use keys, this is always 1.
+
+#### Defined in
+
+[lib/types/protocol.ts:14](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L14)
+
+___
+
+### drop\_id
+
+ **drop\_id**: `string`
+
+Drop ID for the specific drop that the key belongs to.
+
+#### Defined in
+
+[lib/types/protocol.ts:9](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L9)
+
+___
+
+### key\_id
+
+ **key\_id**: `number`
+
+The unique ID associated to this key. IDs are *not* unique across drops but they are unique for any key in the drop.
+
+#### Defined in
+
+[lib/types/protocol.ts:26](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L26)
+
+___
+
+### last\_used
+
+ **last\_used**: `number`
+
+At what timestamp was the key last used? Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/protocol.ts:20](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L20)
+
+___
+
+### public\_key
+
+ **public\_key**: `string`
+
+Public key for this access key.
+
+#### Defined in
+
+[lib/types/protocol.ts:11](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L11)
+
+___
+
+### remaining\_uses
+
+ **remaining\_uses**: `number`
+
+How many uses this key has left before it's deleted.
+
+#### Defined in
+
+[lib/types/protocol.ts:17](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L17)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedMethod.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedMethod.md
new file mode 100644
index 00000000..bb5a0e98
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedMethod.md
@@ -0,0 +1,153 @@
+---
+id: "ProtocolReturnedMethod"
+title: "Interface: ProtocolReturnedMethod"
+sidebar_label: "ProtocolReturnedMethod"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Method information returned from the Protocol. This interface is exactly the same as the `Method`, except all the fields are
+snake cased instead of camel cased due to what the Protocol returns.
+
+## Properties
+
+### account\_id\_field
+
+ `Optional` **account\_id\_field**: `string`
+
+Specifies what field Keypom should auto-inject the account that claimed the drop's ID into when calling the function.
+As an example, if the methodName was `nft_mint` and it expected a field `receiver_id` to be passed in, indicating who should receive the token, then the `accountIdField` would be `receiver_id`.
+To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field"
+
+#### Defined in
+
+[lib/types/protocol.ts:260](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L260)
+
+___
+
+### args
+
+ **args**: `string`
+
+What arguments should be passed to the method. This should be in stringified JSON.
+
+#### Defined in
+
+[lib/types/protocol.ts:245](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L245)
+
+___
+
+### attached\_deposit
+
+ **attached\_deposit**: `string`
+
+How much yoctoNEAR should be attached to the call.
+
+#### Defined in
+
+[lib/types/protocol.ts:249](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L249)
+
+___
+
+### attached\_gas
+
+ `Optional` **attached\_gas**: `string`
+
+How much gas to attach to this method call. If none, all the gas is split between the parallel method calls in a given claim.
+If this is specified, the key can ONLY be used to call `claim` and no `deposit_per_use` can be specified. This leads the key to act like a method calling proxy instead of a linkdrop.
+
+#### Defined in
+
+[lib/types/protocol.ts:254](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L254)
+
+___
+
+### drop\_id\_field
+
+ `Optional` **drop\_id\_field**: `string`
+
+Specifies what field Keypom should auto-inject the drops ID into when calling the function.
+As an example, if an NFT contract expected the Keypom drop ID to be passed in as the field `keypom_drop_id` in order to gate access to who can mint NFTs, then the `dropIdField` would be `keypom_drop_id`.
+To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field"
+
+#### Defined in
+
+[lib/types/protocol.ts:266](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L266)
+
+___
+
+### funder\_id\_field
+
+ `Optional` **funder\_id\_field**: `string`
+
+Specifies what field Keypom should auto-inject the funder's account ID into when calling the function.
+As an example, if an NFT contract wanted to gate only users with an odd key ID to be able to mint an NFT and their parameter was called `keypom_key_id`, then the `keyIdField` would be `keypom_key_id`.
+To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field"
+
+#### Defined in
+
+[lib/types/protocol.ts:278](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L278)
+
+___
+
+### key\_id\_field
+
+ `Optional` **key\_id\_field**: `string`
+
+Specifies what field Keypom should auto-inject the key's ID into when calling the function.
+As an example, if an NFT contract wanted to gate only users with an odd key ID to be able to mint an NFT and their parameter was called `keypom_key_id`, then the `keyIdField` would be `keypom_key_id`.
+To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field"
+
+#### Defined in
+
+[lib/types/protocol.ts:272](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L272)
+
+___
+
+### method\_name
+
+ **method\_name**: `string`
+
+The method that should be invoked on the `receiverId`'s contract.
+
+#### Defined in
+
+[lib/types/protocol.ts:241](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L241)
+
+___
+
+### receiver\_id
+
+ **receiver\_id**: `string`
+
+The account ID that the contract is deployed to that the method will be called on.
+
+#### Defined in
+
+[lib/types/protocol.ts:237](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L237)
+
+___
+
+### receiver\_to\_claimer
+
+ `Optional` **receiver\_to\_claimer**: `boolean`
+
+If set to true, the claiming account ID will be the receiver ID of the method call.
+This receiver must be a valid account and non-malicious (cannot be set to the keypom contract)
+
+#### Defined in
+
+[lib/types/protocol.ts:283](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L283)
+
+___
+
+### user\_args\_rule
+
+ `Optional` **user\_args\_rule**: ``"AllUser"`` \| ``"FunderPreferred"`` \| ``"UserPreferred"``
+
+What permissions does the user have when providing custom arguments to the function call?
+By default, the user cannot provide any custom arguments
+
+#### Defined in
+
+[lib/types/protocol.ts:288](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L288)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedNFTData.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedNFTData.md
new file mode 100644
index 00000000..16051f15
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedNFTData.md
@@ -0,0 +1,34 @@
+---
+id: "ProtocolReturnedNFTData"
+title: "Interface: ProtocolReturnedNFTData"
+sidebar_label: "ProtocolReturnedNFTData"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+NFT Data information returned from the Protocol. This interface is exactly the same as the `NFTData`, except all the fields are
+snake cased instead of camel cased due to what the Protocol returns.
+
+## Properties
+
+### contract\_id
+
+ **contract\_id**: `string`
+
+The account ID that the NFT contract is deployed to. This contract is where all the NFTs for the specific drop must come from.
+
+#### Defined in
+
+[lib/types/protocol.ts:204](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L204)
+
+___
+
+### sender\_id
+
+ `Optional` **sender\_id**: `string`
+
+By default, anyone can fund your drop with NFTs. This field allows you to set a specific account ID that will be locked into sending the NFTs.
+
+#### Defined in
+
+[lib/types/protocol.ts:206](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L206)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedNonFungibleTokenMetadata.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedNonFungibleTokenMetadata.md
new file mode 100644
index 00000000..5f65274c
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedNonFungibleTokenMetadata.md
@@ -0,0 +1,153 @@
+---
+id: "ProtocolReturnedNonFungibleTokenMetadata"
+title: "Interface: ProtocolReturnedNonFungibleTokenMetadata"
+sidebar_label: "ProtocolReturnedNonFungibleTokenMetadata"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+General structure of Non-Fungible Token Metadata as per official NEP-177 standard (https://github.com/near/NEPs/blob/master/neps/nep-0177.md).
+
+## Properties
+
+### copies
+
+ `Optional` **copies**: `number`
+
+number of copies of this set of metadata in existence when token was minted.
+
+#### Defined in
+
+[lib/types/nft.ts:46](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L46)
+
+___
+
+### description
+
+ `Optional` **description**: `string`
+
+free-form description
+
+#### Defined in
+
+[lib/types/nft.ts:40](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L40)
+
+___
+
+### expires\_at
+
+ `Optional` **expires\_at**: `number`
+
+When token expires, Unix epoch in milliseconds
+
+#### Defined in
+
+[lib/types/nft.ts:50](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L50)
+
+___
+
+### extra
+
+ `Optional` **extra**: `string`
+
+anything extra the NFT wants to store on-chain. Can be stringified JSON.
+
+#### Defined in
+
+[lib/types/nft.ts:56](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L56)
+
+___
+
+### issued\_at
+
+ `Optional` **issued\_at**: `number`
+
+When token was issued or minted, Unix epoch in milliseconds
+
+#### Defined in
+
+[lib/types/nft.ts:48](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L48)
+
+___
+
+### media
+
+ `Optional` **media**: `string`
+
+URL to associated media, preferably to decentralized, content-addressed storage
+
+#### Defined in
+
+[lib/types/nft.ts:42](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L42)
+
+___
+
+### media\_hash
+
+ `Optional` **media\_hash**: `string`
+
+Base64-encoded sha256 hash of content referenced by the `media` field. Required if `media` is included.
+
+#### Defined in
+
+[lib/types/nft.ts:44](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L44)
+
+___
+
+### reference
+
+ `Optional` **reference**: `string`
+
+URL to an off-chain JSON file with more info.
+
+#### Defined in
+
+[lib/types/nft.ts:58](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L58)
+
+___
+
+### reference\_hash
+
+ `Optional` **reference\_hash**: `string`
+
+Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included.
+
+#### Defined in
+
+[lib/types/nft.ts:60](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L60)
+
+___
+
+### starts\_at
+
+ `Optional` **starts\_at**: `number`
+
+When token starts being valid, Unix epoch in milliseconds
+
+#### Defined in
+
+[lib/types/nft.ts:52](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L52)
+
+___
+
+### title
+
+ `Optional` **title**: `string`
+
+ex. "Arch Nemesis: Mail Carrier" or "Parcel #5055"
+
+#### Defined in
+
+[lib/types/nft.ts:38](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L38)
+
+___
+
+### updated\_at
+
+ `Optional` **updated\_at**: `number`
+
+When token was last updated, Unix epoch in milliseconds
+
+#### Defined in
+
+[lib/types/nft.ts:54](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L54)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedNonFungibleTokenObject.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedNonFungibleTokenObject.md
new file mode 100644
index 00000000..029b8f45
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedNonFungibleTokenObject.md
@@ -0,0 +1,69 @@
+---
+id: "ProtocolReturnedNonFungibleTokenObject"
+title: "Interface: ProtocolReturnedNonFungibleTokenObject"
+sidebar_label: "ProtocolReturnedNonFungibleTokenObject"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+General structure of a Non-Fungible Token object as per official NEP-171 standard (https://github.com/near/NEPs/blob/master/neps/nep-0171.md).
+
+## Properties
+
+### approved\_account\_ids
+
+ `Optional` **approved\_account\_ids**: `Map`<`string`, `number`\>
+
+Map of account IDs to approval IDs as per official NEP-178 standard (https://github.com/near/NEPs/blob/master/neps/nep-0178.md).
+
+#### Defined in
+
+[lib/types/nft.ts:28](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L28)
+
+___
+
+### metadata
+
+ `Optional` **metadata**: [`ProtocolReturnedNonFungibleTokenMetadata`](ProtocolReturnedNonFungibleTokenMetadata.md)
+
+Metadata for the token
+
+#### Defined in
+
+[lib/types/nft.ts:26](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L26)
+
+___
+
+### owner\_id
+
+ **owner\_id**: `string`
+
+Account ID of the owner
+
+#### Defined in
+
+[lib/types/nft.ts:24](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L24)
+
+___
+
+### royalty
+
+ `Optional` **royalty**: `Map`<`string`, `number`\>
+
+A mapping of NEAR accounts to the amount each should be paid out as per official NEP-199 standard (https://github.com/near/NEPs/blob/master/neps/nep-0199.md).
+
+#### Defined in
+
+[lib/types/nft.ts:30](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L30)
+
+___
+
+### token\_id
+
+ **token\_id**: `string`
+
+String ID for the token
+
+#### Defined in
+
+[lib/types/nft.ts:22](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L22)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedPublicSaleConfig.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedPublicSaleConfig.md
new file mode 100644
index 00000000..74dfde00
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedPublicSaleConfig.md
@@ -0,0 +1,97 @@
+---
+id: "ProtocolReturnedPublicSaleConfig"
+title: "Interface: ProtocolReturnedPublicSaleConfig"
+sidebar_label: "ProtocolReturnedPublicSaleConfig"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Within the config, there are configurable options related to how keys can be sold and a funder can potentially make a profit.
+
+## Properties
+
+### allowlist
+
+ `Optional` **allowlist**: `string`[]
+
+Which accounts are allowed to add keys? If the allowlist is empty, anyone that is not in the blocklist can add keys.
+
+#### Defined in
+
+[lib/types/protocol.ts:173](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L173)
+
+___
+
+### auto\_withdraw\_funds
+
+ `Optional` **auto\_withdraw\_funds**: `boolean`
+
+Should the revenue generated be sent to the funder's account balance or
+automatically withdrawn and sent to their NEAR wallet?
+
+#### Defined in
+
+[lib/types/protocol.ts:180](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L180)
+
+___
+
+### blocklist
+
+ `Optional` **blocklist**: `string`[]
+
+Which accounts are NOT allowed to add keys?
+
+#### Defined in
+
+[lib/types/protocol.ts:175](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L175)
+
+___
+
+### end
+
+ `Optional` **end**: `number`
+
+Block timestamp dictating the end of the public sale. If None, keys can be added indefinitely
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/protocol.ts:190](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L190)
+
+___
+
+### max\_num\_keys
+
+ `Optional` **max\_num\_keys**: `number`
+
+Maximum number of keys that can be added to this drop. If None, there is no max.
+
+#### Defined in
+
+[lib/types/protocol.ts:166](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L166)
+
+___
+
+### price\_per\_key
+
+ `Optional` **price\_per\_key**: `string`
+
+Amount of $NEAR that the user needs to attach (if they are not the funder) on top of costs. This amount will be
+Automatically sent to the funder's balance. If None, the keys are free to the public.
+
+#### Defined in
+
+[lib/types/protocol.ts:171](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L171)
+
+___
+
+### start
+
+ `Optional` **start**: `number`
+
+Minimum block timestamp before the public sale starts. If None, keys can be added immediately
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/protocol.ts:185](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L185)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedSimpleData.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedSimpleData.md
new file mode 100644
index 00000000..92ea9441
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedSimpleData.md
@@ -0,0 +1,17 @@
+---
+id: "ProtocolReturnedSimpleData"
+title: "Interface: ProtocolReturnedSimpleData"
+sidebar_label: "ProtocolReturnedSimpleData"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+## Properties
+
+### lazy\_register
+
+ `Optional` **lazy\_register**: `boolean`
+
+#### Defined in
+
+[lib/types/protocol.ts:195](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L195)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedTimeConfig.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedTimeConfig.md
new file mode 100644
index 00000000..c9da47ff
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedTimeConfig.md
@@ -0,0 +1,63 @@
+---
+id: "ProtocolReturnedTimeConfig"
+title: "Interface: ProtocolReturnedTimeConfig"
+sidebar_label: "ProtocolReturnedTimeConfig"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Time Config information returned from the Protocol. This interface is exactly the same as the `TimeConfig`, except all the fields are
+snake cased instead of camel cased due to what the Protocol returns.
+
+## Properties
+
+### end
+
+ `Optional` **end**: `number`
+
+Block timestamp that keys must be used before. If this isn't specified, keys can be used indefinitely.
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/protocol.ts:101](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L101)
+
+___
+
+### interval
+
+ `Optional` **interval**: `number`
+
+Interval of time after the `start_timestamp` that must pass before a key can be used. If multiple intervals pass, the key can be used multiple times.
+This has nothing to do With the throttle timestamp. It only pertains to the start timestamp and the current timestamp. The last_used timestamp is not taken into account.
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/protocol.ts:114](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L114)
+
+___
+
+### start
+
+ `Optional` **start**: `number`
+
+Minimum block timestamp before keys can be used. If this isn't specified, keys can be used immediately.
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/protocol.ts:95](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L95)
+
+___
+
+### throttle
+
+ `Optional` **throttle**: `number`
+
+Amount of time that *must* pass in between each key use. If this isn't specified, there is no delay between key uses.
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/protocol.ts:107](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L107)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedUsageConfig.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedUsageConfig.md
new file mode 100644
index 00000000..80dbe93a
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedUsageConfig.md
@@ -0,0 +1,80 @@
+---
+id: "ProtocolReturnedUsageConfig"
+title: "Interface: ProtocolReturnedUsageConfig"
+sidebar_label: "ProtocolReturnedUsageConfig"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Usage Config information returned from the Protocol. This interface is exactly the same as the `UsageConfig`, except all the fields are
+snake cased instead of camel cased due to what the Protocol returns.
+
+## Properties
+
+### account\_creation\_fields
+
+ `Optional` **account\_creation\_fields**: `Object`
+
+When calling `create_account` on the root account, which keypom args should be attached to the payload.
+
+#### Type declaration
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `account_id_field?` | `string` | Specifies what field Keypom should auto-inject the account that claimed the drop's ID into when calling the `create_account` function. |
+| `drop_id_field?` | `string` | Specifies what field Keypom should auto-inject the drop's ID into when calling the `create_account` function. |
+| `funder_id_field?` | `string` | Specifies what field Keypom should auto-inject the drop funder's account ID into when calling the `create_account` function. |
+| `key_id_field?` | `string` | Specifies what field Keypom should auto-inject the key's ID into when calling the `create_account` function. |
+
+#### Defined in
+
+[lib/types/protocol.ts:141](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L141)
+
+___
+
+### auto\_delete\_drop
+
+ `Optional` **auto\_delete\_drop**: `boolean`
+
+When a key is used and deleted, if it results in the drop being empty, should the drop automatically be deleted? If this isn't specified, it defaults to false.
+
+#### Defined in
+
+[lib/types/protocol.ts:134](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L134)
+
+___
+
+### auto\_withdraw
+
+ `Optional` **auto\_withdraw**: `boolean`
+
+In the case where `autoDeleteDrop` is set to true and the drop is the owner's last, should their balance be automatically withdrawn? If this isn't specified, it defaults to false.
+
+#### Defined in
+
+[lib/types/protocol.ts:138](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L138)
+
+___
+
+### permissions
+
+ `Optional` **permissions**: `string`
+
+Specify which methods can be called by the access key (either `claim` or `create_account_and_claim`). If this isn't specified, both methods can be called.
+
+#### Defined in
+
+[lib/types/protocol.ts:125](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L125)
+
+___
+
+### refund\_deposit
+
+ `Optional` **refund\_deposit**: `boolean`
+
+If the method `claim` is called rather than `create_account_and_claim`, should the `deposit_per_use` be refunded to the owner's balance?
+If this isn't specified, it defaults to false.
+
+#### Defined in
+
+[lib/types/protocol.ts:130](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L130)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/PublicSaleConfig.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/PublicSaleConfig.md
new file mode 100644
index 00000000..6b4d3617
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/PublicSaleConfig.md
@@ -0,0 +1,107 @@
+---
+id: "PublicSaleConfig"
+title: "Interface: PublicSaleConfig"
+sidebar_label: "PublicSaleConfig"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Within the config, there are configurable options related to how keys can be sold and a funder can potentially make a profit.
+
+## Properties
+
+### allowlist
+
+ `Optional` **allowlist**: `string`[]
+
+Which accounts are allowed to add keys? If the allowlist is empty, anyone that is not in the blocklist can add keys.
+
+#### Defined in
+
+[lib/types/drops.ts:169](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L169)
+
+___
+
+### autoWithdrawFunds
+
+ `Optional` **autoWithdrawFunds**: `boolean`
+
+Should the revenue generated be sent to the funder's account balance or
+automatically withdrawn and sent to their NEAR wallet?
+
+#### Defined in
+
+[lib/types/drops.ts:176](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L176)
+
+___
+
+### blocklist
+
+ `Optional` **blocklist**: `string`[]
+
+Which accounts are NOT allowed to add keys?
+
+#### Defined in
+
+[lib/types/drops.ts:171](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L171)
+
+___
+
+### end
+
+ `Optional` **end**: `number`
+
+Block timestamp dictating the end of the public sale. If None, keys can be added indefinitely
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/drops.ts:186](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L186)
+
+___
+
+### maxNumKeys
+
+ `Optional` **maxNumKeys**: `number`
+
+Maximum number of keys that can be added to this drop. If None, there is no max.
+
+#### Defined in
+
+[lib/types/drops.ts:161](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L161)
+
+___
+
+### pricePerKeyNEAR
+
+ `Optional` **pricePerKeyNEAR**: `number`
+
+Amount of $NEAR that the user needs to attach (if they are not the funder) on top of costs. This amount will be
+Automatically sent to the funder's balance. If None, the keys are free to the public.
+
+#### Defined in
+
+[lib/types/drops.ts:166](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L166)
+
+___
+
+### pricePerKeyYocto
+
+ `Optional` **pricePerKeyYocto**: `string`
+
+#### Defined in
+
+[lib/types/drops.ts:167](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L167)
+
+___
+
+### start
+
+ `Optional` **start**: `number`
+
+Minimum block timestamp before the public sale starts. If None, keys can be added immediately
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/drops.ts:181](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L181)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/SimpleData.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/SimpleData.md
new file mode 100644
index 00000000..fefc4f35
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/SimpleData.md
@@ -0,0 +1,21 @@
+---
+id: "SimpleData"
+title: "Interface: SimpleData"
+sidebar_label: "SimpleData"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Specific configurable information for Simple drops.
+
+## Properties
+
+### lazyRegister
+
+ `Optional` **lazyRegister**: `boolean`
+
+If this is set to true, keys can be created and registered AFTER they've been created (for simple and FC drops only).
+
+#### Defined in
+
+[lib/types/simple.ts:6](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/simple.ts#L6)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/TimeConfig.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/TimeConfig.md
new file mode 100644
index 00000000..40fc7152
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/TimeConfig.md
@@ -0,0 +1,62 @@
+---
+id: "TimeConfig"
+title: "Interface: TimeConfig"
+sidebar_label: "TimeConfig"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Within the config, there are configurable options related to timing such as how often a key can be used.
+
+## Properties
+
+### end
+
+ `Optional` **end**: `number`
+
+Block timestamp that keys must be used before. If this isn't specified, keys can be used indefinitely.
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/drops.ts:98](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L98)
+
+___
+
+### interval
+
+ `Optional` **interval**: `number`
+
+Interval of time after the `start_timestamp` that must pass before a key can be used. If multiple intervals pass, the key can be used multiple times.
+This has nothing to do With the throttle timestamp. It only pertains to the start timestamp and the current timestamp. The last_used timestamp is not taken into account.
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/drops.ts:111](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L111)
+
+___
+
+### start
+
+ `Optional` **start**: `number`
+
+Minimum block timestamp before keys can be used. If this isn't specified, keys can be used immediately.
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/drops.ts:92](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L92)
+
+___
+
+### throttle
+
+ `Optional` **throttle**: `number`
+
+Amount of time that *must* pass in between each key use. If this isn't specified, there is no delay between key uses.
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/drops.ts:104](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L104)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/UsageConfig.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/UsageConfig.md
new file mode 100644
index 00000000..ceb10cf7
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/UsageConfig.md
@@ -0,0 +1,79 @@
+---
+id: "UsageConfig"
+title: "Interface: UsageConfig"
+sidebar_label: "UsageConfig"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Within the config, there are configurable options related to how keys can be used. What permissions they have, whether an empty drop should be automatically deleted etc.
+
+## Properties
+
+### accountCreationFields
+
+ `Optional` **accountCreationFields**: `Object`
+
+When calling `create_account` on the root account, which keypom args should be attached to the payload.
+
+#### Type declaration
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `accountIdField?` | `string` | Specifies what field Keypom should auto-inject the account that claimed the drop's ID into when calling the `create_account` function. |
+| `dropIdField?` | `string` | Specifies what field Keypom should auto-inject the drop's ID into when calling the `create_account` function. |
+| `funderIdField?` | `string` | Specifies what field Keypom should auto-inject the drop funder's account ID into when calling the `create_account` function. |
+| `keyIdField?` | `string` | Specifies what field Keypom should auto-inject the key's ID into when calling the `create_account` function. |
+
+#### Defined in
+
+[lib/types/drops.ts:136](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L136)
+
+___
+
+### autoDeleteDrop
+
+ `Optional` **autoDeleteDrop**: `boolean`
+
+When a key is used and deleted, if it results in the drop being empty, should the drop automatically be deleted? If this isn't specified, it defaults to false.
+
+#### Defined in
+
+[lib/types/drops.ts:130](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L130)
+
+___
+
+### autoWithdraw
+
+ `Optional` **autoWithdraw**: `boolean`
+
+When the last key in this drop is used, in the case where `autoDeleteDrop` is set to true and the drop is the owner's last, should their balance be automatically withdrawn? If this isn't specified, it defaults to false.
+
+#### Defined in
+
+[lib/types/drops.ts:134](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L134)
+
+___
+
+### permissions
+
+ `Optional` **permissions**: `string`
+
+Specify which methods can be called by the access key (either `claim` or `create_account_and_claim`). If this isn't specified, both methods can be called.
+
+#### Defined in
+
+[lib/types/drops.ts:121](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L121)
+
+___
+
+### refundDeposit
+
+ `Optional` **refundDeposit**: `boolean`
+
+If the method `claim` is called rather than `create_account_and_claim`, should the `deposit_per_use` be refunded to the owner's balance?
+If this isn't specified, it defaults to false.
+
+#### Defined in
+
+[lib/types/drops.ts:126](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L126)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/_category_.yml b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/_category_.yml
new file mode 100644
index 00000000..43bec88c
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/_category_.yml
@@ -0,0 +1,2 @@
+label: "Interfaces"
+position: 4
\ No newline at end of file
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/modules.md b/versioned_docs/version-2.0/keypom-sdk/Core/modules.md
new file mode 100644
index 00000000..a7b6445b
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/modules.md
@@ -0,0 +1,3290 @@
+---
+id: "modules"
+title: "@keypom/core - v1.0.2"
+sidebar_label: "Exports"
+sidebar_position: 0.5
+custom_edit_url: null
+---
+
+## Interfaces
+
+- [BasicTransaction](interfaces/BasicTransaction.md)
+- [ContractSourceMetadata](interfaces/ContractSourceMetadata.md)
+- [CreateDropProtocolArgs](interfaces/CreateDropProtocolArgs.md)
+- [CreateOrAddReturn](interfaces/CreateOrAddReturn.md)
+- [Drop](interfaces/Drop.md)
+- [DropConfig](interfaces/DropConfig.md)
+- [EnvVars](interfaces/EnvVars.md)
+- [FCData](interfaces/FCData.md)
+- [FTData](interfaces/FTData.md)
+- [Funder](interfaces/Funder.md)
+- [FungibleTokenMetadata](interfaces/FungibleTokenMetadata.md)
+- [GeneratedKeyPairs](interfaces/GeneratedKeyPairs.md)
+- [KeyInfo](interfaces/KeyInfo.md)
+- [Method](interfaces/Method.md)
+- [NFTData](interfaces/NFTData.md)
+- [NonFungibleTokenMetadata](interfaces/NonFungibleTokenMetadata.md)
+- [PasswordPerUse](interfaces/PasswordPerUse.md)
+- [ProtocolReturnedDrop](interfaces/ProtocolReturnedDrop.md)
+- [ProtocolReturnedDropConfig](interfaces/ProtocolReturnedDropConfig.md)
+- [ProtocolReturnedFCData](interfaces/ProtocolReturnedFCData.md)
+- [ProtocolReturnedFTData](interfaces/ProtocolReturnedFTData.md)
+- [ProtocolReturnedKeyInfo](interfaces/ProtocolReturnedKeyInfo.md)
+- [ProtocolReturnedMethod](interfaces/ProtocolReturnedMethod.md)
+- [ProtocolReturnedNFTData](interfaces/ProtocolReturnedNFTData.md)
+- [ProtocolReturnedNonFungibleTokenMetadata](interfaces/ProtocolReturnedNonFungibleTokenMetadata.md)
+- [ProtocolReturnedNonFungibleTokenObject](interfaces/ProtocolReturnedNonFungibleTokenObject.md)
+- [ProtocolReturnedPublicSaleConfig](interfaces/ProtocolReturnedPublicSaleConfig.md)
+- [ProtocolReturnedSimpleData](interfaces/ProtocolReturnedSimpleData.md)
+- [ProtocolReturnedTimeConfig](interfaces/ProtocolReturnedTimeConfig.md)
+- [ProtocolReturnedUsageConfig](interfaces/ProtocolReturnedUsageConfig.md)
+- [PublicSaleConfig](interfaces/PublicSaleConfig.md)
+- [SimpleData](interfaces/SimpleData.md)
+- [TimeConfig](interfaces/TimeConfig.md)
+- [UsageConfig](interfaces/UsageConfig.md)
+
+## Type Aliases
+
+### AnyWallet
+
+ **AnyWallet**: `BrowserWalletBehaviour` \| `Wallet` \| `Promise`<`Wallet`\>
+
+#### Defined in
+
+[lib/types/params.ts:19](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L19)
+
+___
+
+### NearKeyPair
+
+ **NearKeyPair**: `KeyPair`
+
+#### Defined in
+
+[lib/types/general.ts:12](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L12)
+
+## Variables
+
+### TRIAL\_ERRORS
+
+ `Const` **TRIAL\_ERRORS**: `Object`
+
+#### Type declaration
+
+| Name | Type |
+| :------ | :------ |
+| `EXIT_EXPECTED` | `string` |
+| `INSUFFICIENT_BALANCE` | `string` |
+| `INVALID_ACTION` | `string` |
+
+#### Defined in
+
+[lib/trial-accounts/utils.ts:13](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/trial-accounts/utils.ts#L13)
+
+___
+
+### networks
+
+ `Const` **networks**: `Object`
+
+#### Type declaration
+
+| Name | Type |
+| :------ | :------ |
+| `localnet` | { `networkId`: `string` = 'localnet'; `viewAccountId`: `string` = 'test.near' } |
+| `localnet.networkId` | `string` |
+| `localnet.viewAccountId` | `string` |
+| `mainnet` | { `helperUrl`: `string` = 'https://helper.mainnet.near.org'; `networkId`: `string` = 'mainnet'; `nodeUrl`: `string` = 'https://rpc.mainnet.near.org'; `viewAccountId`: `string` = 'near'; `walletUrl`: `string` = 'https://wallet.near.org' } |
+| `mainnet.helperUrl` | `string` |
+| `mainnet.networkId` | `string` |
+| `mainnet.nodeUrl` | `string` |
+| `mainnet.viewAccountId` | `string` |
+| `mainnet.walletUrl` | `string` |
+| `testnet` | { `helperUrl`: `string` = 'https://helper.testnet.near.org'; `networkId`: `string` = 'testnet'; `nodeUrl`: `string` = 'https://rpc.testnet.near.org'; `viewAccountId`: `string` = 'testnet'; `walletUrl`: `string` = 'https://wallet.testnet.near.org' } |
+| `testnet.helperUrl` | `string` |
+| `testnet.networkId` | `string` |
+| `testnet.nodeUrl` | `string` |
+| `testnet.viewAccountId` | `string` |
+| `testnet.walletUrl` | `string` |
+
+#### Defined in
+
+[lib/keypom.ts:25](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom.ts#L25)
+
+## Keypom SDK Environment
+
+### accountMappingContract
+
+ `Const` **accountMappingContract**: `Object`
+
+Recovery mapping contracts used to keep track of trial account IDs for given public keys.
+
+#### Type declaration
+
+| Name | Type |
+| :------ | :------ |
+| `mainnet` | `string` |
+| `testnet` | `string` |
+
+#### Defined in
+
+[lib/keypom.ts:93](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom.ts#L93)
+
+___
+
+### supportedKeypomContracts
+
+ `Const` **supportedKeypomContracts**: `Object`
+
+List of supported Keypom contracts that can be used with the SDK.
+
+#### Type declaration
+
+| Name | Type |
+| :------ | :------ |
+| `localnet` | { `keypom.test.near`: `boolean` = true } |
+| `localnet.keypom.test.near` | `boolean` |
+| `mainnet` | { `v1-3.keypom.near`: `boolean` = false; `v1-4.keypom.near`: `boolean` = true; `v1.keypom.near`: `boolean` = false; `v2.keypom.near`: `boolean` = true } |
+| `mainnet.v1-3.keypom.near` | `boolean` |
+| `mainnet.v1-4.keypom.near` | `boolean` |
+| `mainnet.v1.keypom.near` | `boolean` |
+| `mainnet.v2.keypom.near` | `boolean` |
+| `testnet` | { `v1-3.keypom.testnet`: `boolean` = false; `v1-4.keypom.testnet`: `boolean` = true; `v1.keypom.testnet`: `boolean` = false; `v2.keypom.testnet`: `boolean` = true } |
+| `testnet.v1-3.keypom.testnet` | `boolean` |
+| `testnet.v1-4.keypom.testnet` | `boolean` |
+| `testnet.v1.keypom.testnet` | `boolean` |
+| `testnet.v2.keypom.testnet` | `boolean` |
+
+#### Defined in
+
+[lib/keypom.ts:51](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom.ts#L51)
+
+___
+
+### supportedLinkdropClaimPages
+
+ `Const` **supportedLinkdropClaimPages**: `Object`
+
+Official linkdrop claim pages for wallets and other applications
+
+#### Type declaration
+
+| Name | Type |
+| :------ | :------ |
+| `mainnet` | { `keypom`: `string` = 'https://keypom.xyz/claim/CONTRACT\_ID#SECRET\_KEY'; `meteor`: `string` = 'https://wallet.meteorwallet.app/linkdrop/CONTRACT\_ID/SECRET\_KEY'; `mynearwallet`: `string` = 'https://app.mynearwallet.com/linkdrop/CONTRACT\_ID/SECRET\_KEY' } |
+| `mainnet.keypom` | `string` |
+| `mainnet.meteor` | `string` |
+| `mainnet.mynearwallet` | `string` |
+| `testnet` | { `keypom`: `string` = 'https://testnet.keypom.xyz/claim/CONTRACT\_ID#SECRET\_KEY'; `meteor`: `string` = 'https://wallet.meteorwallet.app/linkdrop/CONTRACT\_ID/SECRET\_KEY'; `mynearwallet`: `string` = 'https://testnet.mynearwallet.com/linkdrop/CONTRACT\_ID/SECRET\_KEY' } |
+| `testnet.keypom` | `string` |
+| `testnet.meteor` | `string` |
+| `testnet.mynearwallet` | `string` |
+
+#### Defined in
+
+[lib/keypom.ts:74](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom.ts#L74)
+
+___
+
+### getEnv
+
+**getEnv**(): [`EnvVars`](interfaces/EnvVars.md)
+
+#### Returns
+
+[`EnvVars`](interfaces/EnvVars.md)
+
+The environment variables used by the Keypom library.
+
+#### Defined in
+
+[lib/keypom.ts:119](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom.ts#L119)
+
+___
+
+### initKeypom
+
+**initKeypom**(`ยซdestructuredยป`): `Promise`<`any`\>
+
+Initializes the SDK to allow for interactions with the Keypom Protocol. By default, a new NEAR connection will be established but this can be overloaded by
+passing in an existing connection object. In either case, if a funder is passed in, the credentials will be added to the keystore to sign transactions.
+
+To update the funder account, refer to the `updateFunder` function. If you only wish to use view methods and not sign transactions, no funder account is needed.
+If you wish to update the Keypom Contract ID being used, refer to the `updateKeypomContractId` function.
+
+**`Example`**
+
+Using a pre-created NEAR connection instance with an UnencryptedFileSystemKeyStore:
+```js
+const path = require("path");
+const homedir = require("os").homedir();
+const { KeyPair, keyStores, connect } = require("near-api-js");
+const { initKeypom, getDrops } = require("keypom-js");
+
+// Establish the network we wish to work on
+const network = "testnet";
+// Get the location where the credentials are stored for our KeyStore
+const CREDENTIALS_DIR = ".near-credentials";
+const credentialsPath = (await path).join(homedir, CREDENTIALS_DIR);
+(await path).join;
+let keyStore = new keyStores.UnencryptedFileSystemKeyStore(credentialsPath);
+
+// Establish the configuration for the connection
+let nearConfig = {
+ networkId: network,
+ keyStore,
+ nodeUrl: `https://rpc.${network}.near.org`,
+ walletUrl: `https://wallet.${network}.near.org`,
+ helperUrl: `https://helper.${network}.near.org`,
+ explorerUrl: `https://explorer.${network}.near.org`,
+};
+// Connect to the NEAR blockchain and get the connection instance
+let near = await connect(nearConfig);
+
+// Initialize the SDK for the given network and NEAR connection
+await initKeypom({
+ near,
+ network
+});
+
+// Get the drops for the given owner
+const dropsForOwner = await getDrops({accountId: "benjiman.testnet"});
+```
+
+**`Example`**
+
+Creating an entirely new NEAR connection instance by using initKeypom and passing in a funder account:
+```js
+const { initKeypom, getDrops } = require("keypom-js");
+
+// Initialize the SDK for the given network and NEAR connection
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+// Get the drops for the given owner
+const dropsForOwner = await getDrops({accountId: "benjiman.testnet"});
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `funder?` | [`Funder`](interfaces/Funder.md) | The account that will sign transactions to create drops and interact with the Keypom contract. This account will be added to the KeyStore if provided. If rootEntropy is provided for the funder, all access keys will be derived deterministically based off this string. |
+| โบย `keypomContractId?` | `string` | Instead of using the most up-to-date, default Keypom contract, you can specify a specific account ID to use. If an older version is specified, some features of the SDK might not be usable. |
+| โบย `near?` | `Near` | The NEAR connection instance to use. If not passed in, it will create a new one. |
+| โบย `network?` | `string` | The network to connect to either `mainnet` or `testnet`. If a near object is passed in, this field can be omitted |
+
+#### Returns
+
+`Promise`<`any`\>
+
+If a funder is passed in, its account object is returned. Otherwise, it null is returned.
+
+#### Defined in
+
+[lib/keypom.ts:239](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom.ts#L239)
+
+___
+
+### updateFunder
+
+**updateFunder**(`funder`): `Promise`<`any`\>
+
+Once the SDK is initialized, this function allows the current funder account to be updated. Having a funder is only necessary if you wish to sign transactions on the Keypom Protocol.
+
+**`Example`**
+
+After initializing the SDK, the funder is updated.
+```js
+const path = require("path");
+const homedir = require("os").homedir();
+const { KeyPair, keyStores, connect } = require("near-api-js");
+const { initKeypom, updateFunder, getDrops } = require("keypom-js");
+
+ // Initialize the SDK for the given network and NEAR connection
+ await initKeypom({
+ network: "testnet",
+ });
+
+ // Update the current funder account
+ await updateFunder({
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+ })
+
+ // Get the drops for the given owner
+ const dropsForOwner = await getDrops({accountId: "benjiman.testnet"});
+ console.log('dropsForOwner: ', dropsForOwner)
+
+ return;
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `funder` | `Object` | The account that will sign transactions to create drops and interact with the Keypom contract. This account will be added to the KeyStore if provided. If rootEntropy is provided for the funder, all access keys will be derived deterministically based off this string. |
+| `funder.funder` | [`Funder`](interfaces/Funder.md) | - |
+
+#### Returns
+
+`Promise`<`any`\>
+
+The funder's account object is returned.
+
+#### Defined in
+
+[lib/keypom.ts:369](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom.ts#L369)
+
+___
+
+### updateKeypomContractId
+
+**updateKeypomContractId**(`keypomContractId`): `any`
+
+This allows the desired Keypom contract ID to be set. By default, the most up-to-date Keypom contract for the given network is set during initKeypom.
+
+**`Example`**
+
+After initializing the SDK, the Keypom contract ID is updated.
+```js
+const path = require("path");
+const homedir = require("os").homedir();
+const { KeyPair, keyStores, connect } = require("near-api-js");
+const { initKeypom, updateKeypomContractId, getDrops } = require("keypom-js");
+
+ // Initialize the SDK for the given network and NEAR connection
+ await initKeypom({
+ network: "testnet",
+ });
+
+ // Update the current Keypom contract ID
+ updateKeypomContractId({
+ keypomContractId: "v1.keypom.testnet"
+ })
+
+ //Get the drops for the given owner
+ const dropsForOwner = await getDrops({accountId: "benjiman.testnet"});
+ console.log('dropsForOwner: ', dropsForOwner)
+
+ return;
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `keypomContractId` | `Object` | The account ID that should be used for the Keypom contract. |
+| `keypomContractId.keypomContractId` | `string` | - |
+
+#### Returns
+
+`any`
+
+#### Defined in
+
+[lib/keypom.ts:430](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom.ts#L430)
+
+## Utility
+
+### accountExists
+
+**accountExists**(`accountId`): `Promise`<`boolean`\>
+
+Check whether or not a given account ID exists on the network.
+
+**`Example`**
+
+```js
+const accountExists = await accountExists("benji.near");
+console.log(accountExists); // true
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `accountId` | `any` | The account ID you wish to check |
+
+#### Returns
+
+`Promise`<`boolean`\>
+
+- A boolean indicating whether or not the account exists
+
+#### Defined in
+
+[lib/keypom-utils.ts:87](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L87)
+
+___
+
+### createNFTSeries
+
+**createNFTSeries**(`ยซdestructuredยป`): `Promise`<`void` \| `FinalExecutionOutcome`[]\>
+
+Creates a new NFT series on the official Keypom Series contracts. This is for lazy minting NFTs as part of an FC drop.
+
+**`Example`**
+
+Send 3 NFTs using the funder account (not passing in any accounts into the call):
+```js
+ await initKeypom({
+ // near,
+ network: 'testnet',
+ funder: {
+ accountId,
+ secretKey,
+ }
+ })
+
+ const {keys, dropId} = await createDrop({
+ numKeys: 1,
+ config: {
+ usesPerKey: 100
+ },
+ metadata: "My Cool Drop Title!",
+ depositPerUseNEAR: 0.5,
+ fcData: {
+ methods: [[
+ {
+ receiverId: `nft-v2.keypom.testnet`,
+ methodName: "nft_mint",
+ args: "",
+ dropIdField: "mint_id",
+ accountIdField: "receiver_id",
+ attachedDeposit: parseNearAmount("0.1")
+ }
+ ]]
+ }
+ })
+
+ const res = await createNFTSeries({
+ dropId,
+ metadata: {
+ title: "Moon NFT!",
+ description: "A cool NFT for the best dog in the world.",
+ media: "bafybeibwhlfvlytmttpcofahkukuzh24ckcamklia3vimzd4vkgnydy7nq",
+ copies: 500
+ }
+ });
+ console.log('res: ', res)
+
+ const URLs = formatLinkdropUrl({
+ baseUrl: "localhost:3000/claim",
+ secretKeys: keys.secretKeys
+ })
+ console.log('URLs: ', URLs)
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. |
+| โบย `dropId` | `string` | The drop ID for the drop that should have a series associated with it. |
+| โบย `metadata` | [`NonFungibleTokenMetadata`](interfaces/NonFungibleTokenMetadata.md) | The metadata that all minted NFTs will have. |
+| โบย `royalty?` | `Map`<`string`, `number`\> | Any royalties associated with the series (as per official NEP-199 standard: https://github.com/near/NEPs/blob/master/neps/nep-0199.md) |
+| โบย `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. |
+
+#### Returns
+
+`Promise`<`void` \| `FinalExecutionOutcome`[]\>
+
+#### Defined in
+
+[lib/keypom-utils.ts:227](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L227)
+
+___
+
+### estimateRequiredDeposit
+
+**estimateRequiredDeposit**(`ยซdestructuredยป`): `Promise`<`string`\>
+
+Initiate the connection to the NEAR blockchain.
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `attachedGas` | `number` | How much Gas will be attached to each key's use. |
+| โบย `depositPerUse` | `string` | How much yoctoNEAR each key will transfer upon use. |
+| โบย `fcData?` | [`FCData`](interfaces/FCData.md) | The FC data for the drop that is being created. |
+| โบย `ftData?` | [`FTData`](interfaces/FTData.md) | The FT data for the drop that is being created. |
+| โบย `keyStorage?` | `string` | How much storage an individual key uses. |
+| โบย `near` | `Near` | The NEAR connection instance used to interact with the chain. This can either the connection that the SDK uses from `getEnv` or a separate connection. |
+| โบย `numKeys` | `number` | How many keys are being added to the drop. |
+| โบย `storage?` | `string` | The estimated storage costs (can be retrieved through `getStorageBase`). |
+| โบย `usesPerKey` | `number` | How many uses each key has. |
+
+#### Returns
+
+`Promise`<`string`\>
+
+#### Defined in
+
+[lib/keypom-utils.ts:1162](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L1162)
+
+___
+
+### execute
+
+**execute**(`args`): `Promise`<`void` \| `FinalExecutionOutcome`[] \| (`void` \| `FinalExecutionOutcome`)[]\>
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `args` | `any` |
+
+#### Returns
+
+`Promise`<`void` \| `FinalExecutionOutcome`[] \| (`void` \| `FinalExecutionOutcome`)[]\>
+
+#### Defined in
+
+[lib/keypom.ts:147](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom.ts#L147)
+
+___
+
+### formatLinkdropUrl
+
+**formatLinkdropUrl**(`ยซdestructuredยป`): `string`[]
+
+Constructs a valid linkdrop URL for a given claim page or custom URL. To view the list of supported claim pages, see the exported `supportedLinkdropClaimPages` variable.
+
+**`Example`**
+
+Use the keypom claim page:
+```js
+await initKeypom({
+ network: 'testnet',
+ funder: {
+ accountId,
+ secretKey,
+ }
+})
+
+const {keys} = await createDrop({
+ numKeys: 1,
+ depositPerUseNEAR: 1
+});
+
+const linkdropUrl = formatLinkdropUrl({
+ claimPage: "keypom",
+ contractId: "v2.keypom.testnet",
+ secretKeys: keys.secretKeys[0] // Can be either the array or individual secret key string
+})
+
+console.log('linkdropUrl: ', linkdropUrl)
+```
+
+**`Example`**
+
+Use a custom claim page with ONLY the secret key
+```js
+await initKeypom({
+ network: 'testnet',
+ funder: {
+ accountId,
+ secretKey,
+ }
+})
+
+const {keys} = await createDrop({
+ numKeys: 1,
+ depositPerUseNEAR: 1
+});
+
+const linkdropUrl = formatLinkdropUrl({
+ customURL: "foobar/SECRET_KEY/barfoo",
+ contractId: "v2.keypom.testnet",
+ secretKeys: keys.secretKeys[0] // Can be either the array or individual secret key string
+})
+
+console.log('linkdropUrl: ', linkdropUrl)
+```
+
+**`Example`**
+
+Use a custom claim page with both the secret key and contract ID
+```js
+await initKeypom({
+ network: 'testnet',
+ funder: {
+ accountId,
+ secretKey,
+ }
+})
+
+const {keys} = await createDrop({
+ numKeys: 1,
+ depositPerUseNEAR: 1
+});
+
+const linkdropUrl = formatLinkdropUrl({
+ customURL: "foobar/SECRET_KEY/barfoo/CONTRACT_ID",
+ contractId: "v2.keypom.testnet",
+ secretKeys: keys.secretKeys[0] // Can be either the array or individual secret key string
+})
+
+console.log('linkdropUrl: ', linkdropUrl)
+```
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `ยซdestructuredยป` | `Object` |
+| โบย `claimPage?` | `string` |
+| โบย `contractId?` | `string` |
+| โบย `customURL?` | `string` |
+| โบย `networkId?` | `string` |
+| โบย `secretKeys` | `string` \| `string`[] |
+
+#### Returns
+
+`string`[]
+
+- An array of the linkdrop URLs
+
+#### Defined in
+
+[lib/keypom-utils.ts:384](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L384)
+
+___
+
+### generateKeys
+
+**generateKeys**(`ยซdestructuredยป`): `Promise`<[`GeneratedKeyPairs`](interfaces/GeneratedKeyPairs.md)\>
+
+Generate ed25519 KeyPairs that can be used for Keypom linkdrops, or full access keys to claimed accounts. These keys can optionally be derived from some entropy such as a root password and metadata pertaining to each key (user provided password etc.).
+Entropy is useful for creating an onboarding experience where in order to recover a keypair, the client simply needs to provide the meta entropy (could be a user's password) and the secret root key like a UUID).
+
+**`Example`**
+
+Generating 10 unique random keypairs with no entropy:
+```js
+// Generate 10 keys with no entropy (all random)
+let keys = await generateKeys({
+ numKeys: 10,
+})
+
+let pubKey1 = keys.publicKeys[0];
+let secretKey1 = keys.secretKeys[0];
+
+console.log('1st Public Key: ', pubKey1);
+console.log('1st Secret Key: ', secretKey1)
+```
+
+**`Example`**
+
+Generating 1 keypair based on entropy:
+```js
+// Generate 1 key with the given entropy
+let {publicKeys, secretKeys} = await generateKeys({
+ numKeys: 1,
+ rootEntropy: "my-global-password",
+ metaEntropy: "user-password-123" // In this case, since there is only 1 key, the entropy can be an array of size 1 as well.
+})
+
+let pubKey = publicKeys[0];
+let secretKey = secretKeys[0];
+
+console.log('Public Key: ', pubKey);
+console.log('Secret Key: ', secretKey)
+```
+
+**`Example`**
+
+Generating 2 keypairs each with their own entropy:
+```js
+// Generate 2 keys each with their own unique entropy
+let keys = await generateKeys({
+ numKeys: 2,
+ rootEntropy: "my-global-password",
+ metaEntropy: [
+ `first-password:0`,
+ `second-password:1`
+ ]
+})
+
+console.log('Pub Keys ', keys.publicKeys);
+console.log('Secret Keys ', keys.secretKeys);
+```
+ *
+
+**`Example`**
+
+Generate 50 keys exactly how the auto key generation would in createDrop and addKeys:
+```js
+const dropId = '1676913490360';
+const basePassword = "my-password";
+// Generate 50 keys each with their own unique entropy
+let keys = await generateKeys({
+ numKeys: 50,
+ rootEntropy: `${basePassword}-${dropId}`,
+ autoMetaNonceStart: 0
+})
+
+console.log('Pub Keys ', keys.publicKeys);
+console.log('Secret Keys ', keys.secretKeys);
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `autoMetaNonceStart?` | `number` | - |
+| โบย `metaEntropy?` | `string` \| `string`[] | An array of entropies to use in conjunction with a base rootEntropy to deterministically generate the private keys. For single key generation, you can either pass in a string array with a single element, or simply pass in the string itself directly (not within an array). |
+| โบย `numKeys` | `number` | The number of keys to generate. |
+| โบย `rootEntropy?` | `string` | A root string that will be used as a baseline for all keys in conjunction with different metaEntropies (if provided) to deterministically generate a keypair. If not provided, the keypair will be completely random. |
+
+#### Returns
+
+`Promise`<[`GeneratedKeyPairs`](interfaces/GeneratedKeyPairs.md)\>
+
+- An object containing an array of KeyPairs, Public Keys and Secret Keys.
+
+#### Defined in
+
+[lib/keypom-utils.ts:536](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L536)
+
+___
+
+### generatePerUsePasswords
+
+**generatePerUsePasswords**(`ยซdestructuredยป`): `Promise`<[`PasswordPerUse`](interfaces/PasswordPerUse.md)[][]\>
+
+Generate passwords for a set of public keys. A unique password will be created for each specified use of a public key where the use is NOT zero indexed (i.e 1st use = 1).
+The passwords will be generated via a double hash of the base password + public key + specific use
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `ยซdestructuredยป` | `Object` |
+| โบย `basePassword` | `string` |
+| โบย `publicKeys` | `string`[] |
+| โบย `uses` | `number`[] |
+
+#### Returns
+
+`Promise`<[`PasswordPerUse`](interfaces/PasswordPerUse.md)[][]\>
+
+An array of objects for each key where each object has a password and maps it to its specific key use.
+
+#### Defined in
+
+[lib/keypom-utils.ts:1358](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L1358)
+
+___
+
+### getFTMetadata
+
+**getFTMetadata**(`contractId`): `Promise`<[`FungibleTokenMetadata`](interfaces/FungibleTokenMetadata.md)\>
+
+Get the FT Metadata for a given fungible token contract. This is used to display important information such as the icon for the token, decimal format etc.
+
+**`Example`**
+
+```js
+const ft = await getFTMetadata({
+ contractId: "ft.keypom.testnet"
+});
+console.log(ft);
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `contractId` | `Object` | The contract ID of the FT contract |
+| `contractId.contractId` | `string` | - |
+
+#### Returns
+
+`Promise`<[`FungibleTokenMetadata`](interfaces/FungibleTokenMetadata.md)\>
+
+- The FT Metadata
+
+#### Defined in
+
+[lib/keypom-utils.ts:156](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L156)
+
+___
+
+### getNFTMetadata
+
+**getNFTMetadata**(`ยซdestructuredยป`): `Promise`<[`ProtocolReturnedNonFungibleTokenObject`](interfaces/ProtocolReturnedNonFungibleTokenObject.md)\>
+
+Get the NFT Object (metadata, owner, approval IDs etc.) for a given token ID on a given contract.
+
+**`Example`**
+
+```js
+const nft = await getNFTMetadata({
+ contractId: "nft.keypom.testnet",
+ tokenId: "1"
+});
+console.log(nft);
+```
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `ยซdestructuredยป` | `Object` |
+| โบย `contractId` | `string` |
+| โบย `tokenId` | `string` |
+
+#### Returns
+
+`Promise`<[`ProtocolReturnedNonFungibleTokenObject`](interfaces/ProtocolReturnedNonFungibleTokenObject.md)\>
+
+- The NFT Object
+
+#### Defined in
+
+[lib/keypom-utils.ts:120](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L120)
+
+___
+
+### getPubFromSecret
+
+**getPubFromSecret**(`secretKey`): `string`
+
+Get the public key from a given secret key.
+
+**`Example`**
+
+```js
+const pubKey = getPubFromSecret("ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1");
+console.log(pubKey);
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `secretKey` | `string` | The secret key you wish to get the public key from |
+
+#### Returns
+
+`string`
+
+- The public key
+
+#### Defined in
+
+[lib/keypom-utils.ts:68](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L68)
+
+___
+
+### getStorageBase
+
+**getStorageBase**(`ยซdestructuredยป`): `string`
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `ยซdestructuredยป` | [`CreateDropProtocolArgs`](interfaces/CreateDropProtocolArgs.md) |
+
+#### Returns
+
+`string`
+
+#### Defined in
+
+[lib/keypom-utils.ts:1073](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L1073)
+
+___
+
+### hashPassword
+
+**hashPassword**(`str`, `fromHex?`): `Promise`<`string`\>
+
+Generate a sha256 hash of a passed in string. If the string is hex encoded, set the fromHex flag to true.
+
+**`Example`**
+
+Generating the required password to pass into `claim` given a base password:
+```js
+ // Create the password to pass into claim which is a hash of the basePassword, public key and whichever use we are on
+let currentUse = 1;
+let passwordForClaim = await hashPassword(basePassword + publicKey + currentUse.toString());
+```
+
+#### Parameters
+
+| Name | Type | Default value | Description |
+| :------ | :------ | :------ | :------ |
+| `str` | `string` | `undefined` | the string you wish to hash. By default, this should be utf8 encoded. If the string is hex encoded, set the fromHex flag to true. |
+| `fromHex` | `boolean` | `false` | (OPTIONAL) - A flag that should be set if the string is hex encoded. Defaults to false. |
+
+#### Returns
+
+`Promise`<`string`\>
+
+- The resulting hash
+
+#### Defined in
+
+[lib/keypom-utils.ts:451](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L451)
+
+___
+
+### viewAccessKeyData
+
+**viewAccessKeyData**(`ยซdestructuredยป`): `Promise`<`any`\>
+
+Query for important access key data such as the nonce, allowance, method names etc. that is stored on the NEAR protocol for a given account and public key.
+
+**`Example`**
+
+Check if an access key belongs to a trial account
+```js
+const keyInfo = await viewAccessKeyData({accountId, secretKey});
+let keyPerms = keyInfo.permission.FunctionCall;
+isValidTrialInfo = keyPerms.receiver_id === accountId && keyPerms.method_names.includes('execute')
+console.log('isValidTrialInfo: ', isValidTrialInfo)
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `accountId` | `string` | The account that the access key belongs to. |
+| โบย `publicKey?` | `string` | The public key of the access key |
+| โบย `secretKey?` | `string` | The secret key of the access key |
+
+#### Returns
+
+`Promise`<`any`\>
+
+#### Defined in
+
+[lib/keypom-utils.ts:623](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L623)
+
+## Creating, And Claiming Drops
+
+### addKeys
+
+**addKeys**(`ยซdestructuredยป`): `Promise`<[`CreateOrAddReturn`](interfaces/CreateOrAddReturn.md)\>
+
+Add keys that are manually generated and passed in, or automatically generated to an existing drop. If they're
+automatically generated, they can be based off a set of entropy. For NFT and FT drops, assets can automatically be sent to Keypom to register keys as part of the payload.
+The deposit is estimated based on parameters that are passed in and the transaction can be returned instead of signed and sent to the network. This can allow you to get the
+required deposit from the return value and use that to fund the account's Keypom balance to avoid multiple transactions being signed in the case of a drop with many keys.
+
+**`Example`**
+
+Create a basic empty simple drop and add 10 keys. Each key is completely random:
+```js
+// Initialize the SDK for the given network and NEAR connection. No entropy passed in so any auto generated keys will
+// be completely random unless otherwise overwritten.
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+// Create an empty simple drop with no keys.
+const {dropId} = await createDrop({
+ depositPerUseNEAR: 1,
+});
+
+// Add 10 completely random keys. The return value `keys` contains information about the generated keys
+const {keys} = await addKeys({
+ dropId,
+ numKeys: 10
+})
+
+console.log('public keys: ', keys.publicKeys);
+console.log('private keys: ', keys.secretKeys);
+```
+
+**`Example`**
+
+Init funder with root entropy, create empty drop and add generate deterministic keys. Compare with manually generated keys:
+```js
+// Initialize the SDK for the given network and NEAR connection. Root entropy is passed into the funder account so any generated keys
+// Will be based off that entropy.
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1",
+ rootEntropy: "my-global-secret-password"
+ }
+});
+
+// Create a simple drop with no keys
+const { dropId } = await createDrop({
+ depositPerUseNEAR: 1,
+});
+
+// Add 5 keys to the empty simple drop. Each key will be derived based on the rootEntropy of the funder, the drop ID, and key nonce.
+const {keys: keysFromDrop} = await addKeys({
+ dropId,
+ numKeys: 5
+})
+
+// Deterministically Generate the Private Keys:
+const nonceDropIdMeta = Array.from({length: 5}, (_, i) => `${dropId}_${i}`);
+const manualKeys = await generateKeys({
+ numKeys: 5,
+ rootEntropy: "my-global-secret-password",
+ metaEntropy: nonceDropIdMeta
+})
+
+// Get the public and private keys from the keys generated by addKeys
+const {publicKeys, secretKeys} = keysFromDrop;
+// Get the public and private keys from the keys that were manually generated
+const {publicKeys: pubKeysGenerated, secretKeys: secretKeysGenerated} = manualKeys;
+// These should match!
+console.log('secretKeys: ', secretKeys)
+console.log('secretKeysGenerated: ', secretKeysGenerated)
+
+// These should match!
+console.log('publicKeys: ', publicKeys)
+console.log('pubKeysGenerated: ', pubKeysGenerated)
+```
+
+**`Example`**
+
+Create an empty drop and add manually created keys:
+```js
+// Initialize the SDK for the given network and NEAR connection. No entropy passed in so any auto generated keys will
+// be completely random unless otherwise overwritten.
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+// Create an empty simple drop using the keys that were generated. Since keys are passed in, the return value won't contain information about the keys.
+const {dropId} = await createDrop({
+ publicKeys,
+ depositPerUseNEAR: 1,
+});
+
+// Generate 10 random keys
+const {publicKeys} = await generateKeys({
+ numKeys: 10
+});
+
+// Add keys to the drop using the keys that were generated. Since keys are passed in, the return value won't contain information about the keys.
+await addKeys({
+ publicKeys,
+ dropId
+})
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. |
+| โบย `basePassword?` | `string` | For doing password protected drops, this is the base password that will be used to generate all the passwords. It will be double hashed with the public keys. If specified, by default, all key uses will have their own unique password unless passwordProtectedUses is passed in. |
+| โบย `drop?` | [`ProtocolReturnedDrop`](interfaces/ProtocolReturnedDrop.md) | If the drop information from getDropInformation is already known to the client, it can be passed in instead of the drop ID to reduce computation. |
+| โบย `dropId?` | `string` | Specify the drop ID for which you want to add keys to. |
+| โบย `extraDepositNEAR?` | `number` | For Public Sales, drops might require an additional fee for adding keys. This specifies the amount of $NEAR in human readable format (i.e `1.5` = 1.5 $NEAR) |
+| โบย `extraDepositYocto?` | `string` | For Public Sales, drops might require an additional fee for adding keys. This specifies the amount of $NEAR in yoctoNEAR (i.e `1` = 1 $yoctoNEAR = 1e-24 $NEAR) |
+| โบย `nftTokenIds?` | `string`[] | If the drop type is an NFT drop, the token IDs can be passed in so that the tokens are automatically sent to the Keypom contract rather than having to do two separate transactions. A maximum of 2 token IDs can be sent during the `addKeys` function. To send more token IDs in order to register key uses, use the `nftTransferCall` function. |
+| โบย `numKeys` | `number` | Specify how many keys should be generated for the drop. If the funder has rootEntropy set OR rootEntropy is passed in, the keys will be deterministically generated using the drop ID, key nonce, and entropy. Otherwise, each key will be generated randomly. |
+| โบย `passwordProtectedUses?` | `number`[] | For doing password protected drops, specifies exactly which uses will be password protected. The uses are NOT zero indexed (i.e 1st use = 1). Each use will have a different, unique password generated via double hashing the base password + public key + key use. |
+| โบย `publicKeys?` | `string`[] | Pass in a custom set of publicKeys to add to the drop. If this is not passed in, keys will be generated based on the numKeys parameter. |
+| โบย `returnTransactions?` | `boolean` | If true, the transaction will be returned instead of being signed and sent. This is useful for getting the requiredDeposit from the return value without actually signing the transaction. |
+| โบย `rootEntropy?` | `string` | Specify an entropy to use for generating keys (will overload the funder's rootEntropy if applicable). This parameter only matters if the publicKeys variable is not passed in. |
+| โบย `useBalance?` | `boolean` | If the account has a balance within the Keypom contract, set this to true to avoid the need to attach a deposit. If the account doesn't have enough balance, an error will throw. |
+| โบย `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. |
+
+#### Returns
+
+`Promise`<[`CreateOrAddReturn`](interfaces/CreateOrAddReturn.md)\>
+
+Object containing: the drop ID, the responses of the execution, as well as any auto generated keys (if any).
+
+#### Defined in
+
+[lib/keys.ts:148](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keys.ts#L148)
+
+___
+
+### claim
+
+**claim**(`ยซdestructuredยป`): `Promise`<`any`\>
+
+Allows a specific Keypom drop to be claimed via the secret key.
+
+**`Example`**
+
+Creating a simple $NEAR drop and claiming to an existing account:
+```js
+// Initialize the SDK for the given network and NEAR connection
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+// create 1 keys with no entropy (random key)
+const {publicKeys, secretKeys} = await generateKeys({
+ numKeys: 1
+});
+
+// Create a simple drop with 1 $NEAR
+await createDrop({
+ publicKeys,
+ depositPerUseNEAR: 1,
+});
+
+// Claim the drop to the passed in account ID
+await claim({
+ secretKey: secretKeys[0],
+ accountId: "benjiman.testnet"
+})
+```
+
+**`Example`**
+
+Creating a simple $NEAR drop and using it to create a brand new NEAR account:
+```js
+// Initialize the SDK for the given network and NEAR connection
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+// create 2 keys with no entropy (all random). The first will be used for the drop and the second
+// will be used as the full access key for the newly created account
+const {publicKeys, secretKeys} = await generateKeys({
+ numKeys: 2
+});
+
+// Create a simple drop with 1 $NEAR
+await createDrop({
+ publicKeys: [publicKeys[0]],
+ depositPerUseNEAR: 1,
+});
+
+// Claim the drop and create a new account
+await claim({
+ secretKey: secretKeys[0],
+ newAccountId: "my-newly-creating-account.testnet",
+ newPublicKey: publicKeys[1]
+})
+```
+
+**`Example`**
+
+Creating a drop and adding a password to it. Generate the password using the hash function and pass it into claim the drop:
+```js
+// Initialize the SDK for the given network and NEAR connection
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+const basePassword = "my-cool-password123";
+// Create a simple drop with 1 $NEAR and pass in a base password to create a unique password for each use of each key
+const {keys} = await createDrop({
+ numKeys: 1,
+ depositPerUseNEAR: 1,
+ basePassword
+});
+
+// Create the password to pass into claim which is a hash of the basePassword, public key and whichever use we are on
+let currentUse = 1;
+let passwordForClaim = await hashPassword(basePassword + keys.publicKeys[0] + currentUse.toString());
+
+// Claim the drop to the passed in account ID and use the password we generated above.
+await claim({
+ secretKey: keys.secretKeys[0],
+ accountId: "benjiman.testnet",
+ password: passwordForClaim
+})
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `accountId?` | `string` | The account ID of an existing account that will be used to claim the drop. |
+| โบย `fcArgs?` | `string`[] | For FC drops, if `user_args_rule` is set by the funder, when claiming, custom arguments can be passed into the function. The number of args in the array need to match the number of methods being executed. |
+| โบย `newAccountId?` | `string` | If passed in, a new account ID will be created and the drop will be claimed to that account. This must be an account that does not exist yet. |
+| โบย `newPublicKey?` | `string` | If creating a new account, a public key must be passed in to be used as the full access key for the newly created account. |
+| โบย `password?` | `string` | If a password is required to use the key, it can be passed in |
+| โบย `secretKey` | `string` | The private key associated with the Keypom link. This can either contain the `ed25519:` prefix or not. |
+
+#### Returns
+
+`Promise`<`any`\>
+
+#### Defined in
+
+[lib/claims.ts:108](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/claims.ts#L108)
+
+___
+
+### createDrop
+
+**createDrop**(`ยซdestructuredยป`): `Promise`<[`CreateOrAddReturn`](interfaces/CreateOrAddReturn.md)\>
+
+Creates a new drop based on parameters passed in. This drop can have keys that are manually generated and passed in, or automatically generated. If they're
+automatically generated, they can be based off a set of entropy. For NFT and FT drops, assets can automatically be sent to Keypom to register keys as part of the payload.
+The deposit is estimated based on parameters that are passed in and the transaction can be returned instead of signed and sent to the network. This can allow you to get the
+required deposit from the return value and use that to fund the account's Keypom balance to avoid multiple transactions being signed in the case of a drop with many keys.
+
+**`Example`**
+
+Create a basic simple drop containing 10 keys each with 1 $NEAR. Each key is completely random:
+```js
+// Initialize the SDK for the given network and NEAR connection. No entropy passed in so any auto generated keys will
+// be completely random unless otherwise overwritten.
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+// Create a drop with 10 completely random keys. The return value `keys` contains information about the generated keys
+const {keys} = await createDrop({
+ numKeys: 10,
+ depositPerUseNEAR: 1,
+});
+
+console.log('public keys: ', keys.publicKeys);
+console.log('private keys: ', keys.secretKeys);
+```
+
+**`Example`**
+
+Init funder with root entropy and generate deterministic keys for a drop. Compare with manually generated keys:
+```js
+// Initialize the SDK for the given network and NEAR connection. Root entropy is passed into the funder account so any generated keys
+// Will be based off that entropy.
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1",
+ rootEntropy: "my-global-secret-password"
+ }
+});
+
+// Create a simple drop with 5 keys. Each key will be derived based on the rootEntropy of the funder, the drop ID, and key nonce.
+const { keys: keysFromDrop, dropId } = await createDrop({
+ numKeys: 5,
+ depositPerUseNEAR: 1,
+});
+
+// Deterministically Generate the Private Keys:
+const nonceDropIdMeta = Array.from({length: 5}, (_, i) => `${dropId}_${i}`);
+const manualKeys = await generateKeys({
+ numKeys: 5,
+ rootEntropy: "my-global-secret-password",
+ metaEntropy: nonceDropIdMeta
+})
+
+// Get the public and private keys from the keys generated by the drop
+const {publicKeys, secretKeys} = keysFromDrop;
+// Get the public and private keys from the keys that were manually generated
+const {publicKeys: pubKeysGenerated, secretKeys: secretKeysGenerated} = manualKeys;
+// These should match!
+console.log('secretKeys: ', secretKeys)
+console.log('secretKeysGenerated: ', secretKeysGenerated)
+
+// These should match!
+console.log('publicKeys: ', publicKeys)
+console.log('pubKeysGenerated: ', pubKeysGenerated)
+```
+
+**`Example`**
+
+Use manually generated keys to create a drop:
+```js
+// Initialize the SDK for the given network and NEAR connection. No entropy passed in so any auto generated keys will
+// be completely random unless otherwise overwritten.
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+// Generate 10 random keys
+const {publicKeys} = await generateKeys({
+ numKeys: 10
+});
+
+// Create a drop using the keys that were generated. Since keys are passed in, the return value won't contain information about the keys.
+await createDrop({
+ publicKeys,
+ depositPerUseNEAR: 1,
+});
+```
+
+**`Example`**
+
+Create a simple drop with 1 key and 1 use per key. This 1 use-key should be password protected based on a base-password:
+```js
+// Initialize the SDK for the given network and NEAR connection
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+const basePassword = "my-cool-password123";
+// Create a simple drop with 1 $NEAR and pass in a base password to create a unique password for each use of each key
+const {keys} = await createDrop({
+ numKeys: 1,
+ depositPerUseNEAR: 1,
+ basePassword
+});
+
+// Create the password to pass into claim which is a hash of the basePassword, public key and whichever use we are on
+let currentUse = 1;
+let passwordForClaim = await hashPassword(basePassword + keys.publicKeys[0] + currentUse.toString());
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. |
+| โบย `basePassword?` | `string` | For doing password protected drops, this is the base password that will be used to generate all the passwords. It will be double hashed with the public keys. If specified, by default, all key uses will have their own unique password unless passwordProtectedUses is passed in. |
+| โบย `config?` | [`DropConfig`](interfaces/DropConfig.md) | Allows specific drop behaviors to be configured such as the number of uses each key / link will have. |
+| โบย `depositPerUseNEAR?` | `string` \| `number` | How much $NEAR should be contained in each link. Unit in $NEAR (i.e `1` = 1 $NEAR) |
+| โบย `depositPerUseYocto?` | `string` | How much $yoctoNEAR should be contained in each link. Unit in yoctoNEAR (1 yoctoNEAR = 1e-24 $NEAR) |
+| โบย `dropId?` | `string` | Specify a custom drop ID rather than using the incrementing nonce on the contract. |
+| โบย `fcData?` | [`FCData`](interfaces/FCData.md) | For creating a function call drop, this contains necessary configurable information about the drop. |
+| โบย `ftData?` | [`FTData`](interfaces/FTData.md) | For creating a fungible token drop, this contains necessary configurable information about the drop. |
+| โบย `metadata?` | `string` | String of metadata to attach to the drop. This can be whatever you would like and is optional. Often this is stringified JSON. |
+| โบย `nftData?` | [`NFTData`](interfaces/NFTData.md) | For creating a non-fungible token drop, this contains necessary configurable information about the drop. |
+| โบย `numKeys?` | `number` | Specify how many keys should be generated for the drop. If the funder has rootEntropy set OR rootEntropy is passed in, the keys will be deterministically generated using the drop ID, key nonce, and entropy. Otherwise, each key will be generated randomly. If this is not passed in, the publicKeys parameter *must* be passed in. |
+| โบย `passwordProtectedUses?` | `number`[] | For doing password protected drops, specifies exactly which uses will be password protected. The uses are NOT zero indexed (i.e 1st use = 1). Each use will have a different, unique password generated via double hashing the base password + public key + key use. |
+| โบย `publicKeys?` | `string`[] | Pass in a custom set of publicKeys to add to the drop. If this is not passed in, keys will be generated based on the numKeys parameter. |
+| โบย `requiredGas?` | `string` | Allows you to overload how much gas should be attached to the transaction when the key is claimed. This should be in Gas units (1 TGas = 1000000000000). By default, 100 TGas is attached. |
+| โบย `returnTransactions?` | `boolean` | If true, the transaction will be returned instead of being signed and sent. This is useful for getting the requiredDeposit from the return value without actually signing the transaction. |
+| โบย `rootEntropy?` | `string` | Specify an entropy to use for generating keys (will overload the funder's rootEntropy if applicable). This parameter only matters if the publicKeys variable is not passed in. |
+| โบย `simpleData?` | [`SimpleData`](interfaces/SimpleData.md) | For creating a simple drop, this contains necessary configurable information about the drop. |
+| โบย `successUrl?` | `string` | When signing with a wallet, a success URl can be included that the user will be redirected to once the transaction has been successfully signed. |
+| โบย `useBalance?` | `boolean` | If the account has a balance within the Keypom contract, set this to true to avoid the need to attach a deposit. If the account doesn't have enough balance, an error will throw. |
+| โบย `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. |
+
+#### Returns
+
+`Promise`<[`CreateOrAddReturn`](interfaces/CreateOrAddReturn.md)\>
+
+Object containing: the drop ID, the responses of the execution, as well as any auto generated keys (if any).
+
+#### Defined in
+
+[lib/drops.ts:176](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/drops.ts#L176)
+
+## User Balance Functions
+
+### addToBalance
+
+**addToBalance**(`ยซdestructuredยป`): `Promise`<`any`\>
+
+Deposit some amount of $NEAR or yoctoNEAR$ into the Keypom contract. This amount can then be used to create drops or add keys without
+Having to explicitly attach a deposit every time. It can be thought of like a bank account.
+
+**`Example`**
+
+Add 1 $NEAR to the account balance
+```js
+// Initialize the SDK on testnet
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+await addToBalance({
+ amount: "1",
+)};
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. |
+| โบย `amountNear?` | `string` | Human readable format for the amount of tokens to add. **`Example`** ```ts Example: transferring one $NEAR should be passed in as "1" and NOT "1000000000000000000000000" ``` |
+| โบย `amountYocto?` | `string` | Amount of tokens to add but considering the decimal amount (non human-readable). **`Example`** ```ts Transferring one $NEAR should be passed in as "1000000000000000000000000" and NOT "1" ``` |
+| โบย `successUrl?` | `string` | When signing with a wallet, a success URl can be included that the user will be redirected to once the transaction has been successfully signed. |
+| โบย `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. |
+
+#### Returns
+
+`Promise`<`any`\>
+
+#### Defined in
+
+[lib/balances.ts:37](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/balances.ts#L37)
+
+___
+
+### withdrawBalance
+
+**withdrawBalance**(`ยซdestructuredยป`): `Promise`<`any`\>
+
+Withdraw all the $NEAR from your balance in the Keypom contract.
+
+**`Example`**
+
+Add 1 $NEAR to the account balance and then withdraw it
+```js
+// Initialize the SDK on testnet
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+await addToBalance({
+ amount: "1",
+});
+
+await withdrawBalance({});
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. |
+| โบย `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. |
+
+#### Returns
+
+`Promise`<`any`\>
+
+#### Defined in
+
+[lib/balances.ts:118](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/balances.ts#L118)
+
+## Public Sale Functions
+
+### addToSaleAllowlist
+
+**addToSaleAllowlist**(`ยซdestructuredยป`): `Promise`<`any`\>
+
+Add a list of account IDs to a drop's sale allowlist. If the allowlist is empty, anyone can purchase keys. The sale object must exist in the drop's config for this to go through.
+
+**`Example`**
+
+```js
+const {dropId} = await createDrop({
+ numKeys: 0,
+ depositPerUseNEAR: 0.1,
+ config: {
+ sale: {
+ maxNumKeys: 2,
+ pricePerKeyNEAR: 1
+ }
+ }
+ });
+
+ let canAddKeys = await canUserAddKeys({dropId, accountId: "foobar.testnet"});
+ t.is(canAddKeys, true);
+
+ await addToSaleAllowlist({dropId, accountIds: ["barfoo.testnet"]});
+ canAddKeys = await canUserAddKeys({dropId, accountId: "foobar.testnet"});
+ t.is(canAddKeys, false);
+ ```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. |
+| โบย `accountIds` | `string`[] | A list of account IDs that should be added to the sale allowlist |
+| โบย `dropId` | `string` | The drop ID for the drop |
+| โบย `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. |
+
+#### Returns
+
+`Promise`<`any`\>
+
+#### Defined in
+
+[lib/sales.ts:44](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/sales.ts#L44)
+
+___
+
+### addToSaleBlocklist
+
+**addToSaleBlocklist**(`ยซdestructuredยป`): `Promise`<`any`\>
+
+Add a list of account IDs to a drop's sale blocklist. The sale object must exist in the drop's config for this to go through.
+
+**`Example`**
+
+```js
+ const {dropId} = await createDrop({
+ numKeys: 0,
+ depositPerUseNEAR: 0.1,
+ config: {
+ sale: {
+ maxNumKeys: 2,
+ pricePerKeyNEAR: 1
+ }
+ }
+ });
+
+ let canAddKeys = await canUserAddKeys({dropId, accountId: "foobar.testnet"});
+ t.is(canAddKeys, true);
+
+ await addToSaleBlocklist({dropId, accountIds: ["foobar.testnet"]});
+ canAddKeys = await canUserAddKeys({dropId, accountId: "foobar.testnet"});
+ t.is(canAddKeys, false);
+ ```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. |
+| โบย `accountIds` | `string`[] | A list of account IDs that should be added to the sale blocklist |
+| โบย `dropId` | `string` | The drop ID for the drop |
+| โบย `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. |
+
+#### Returns
+
+`Promise`<`any`\>
+
+#### Defined in
+
+[lib/sales.ts:224](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/sales.ts#L224)
+
+___
+
+### removeFromSaleAllowlist
+
+**removeFromSaleAllowlist**(`ยซdestructuredยป`): `Promise`<`any`\>
+
+Remove a list of account IDs from a drop's sale allowlist. If the allowlist is empty, anyone can purchase keys. The sale object must exist in the drop's config for this to go through.
+
+**`Example`**
+
+```js
+ const {dropId} = await createDrop({
+ numKeys: 0,
+ depositPerUseNEAR: 0.1,
+ config: {
+ sale: {
+ maxNumKeys: 2,
+ pricePerKeyNEAR: 1,
+ allowlist: ["foobar.testnet", "barfoo.testnet"]
+ }
+ }
+ });
+
+ let canAddKeys = await canUserAddKeys({dropId, accountId: "foobar.testnet"});
+ t.is(canAddKeys, true);
+
+ canAddKeys = await canUserAddKeys({dropId, accountId: "not_in_allowlist.testnet"});
+ t.is(canAddKeys, false);
+
+ await removeFromSaleAllowlist({dropId, accountIds: ["foobar.testnet"]});
+ canAddKeys = await canUserAddKeys({dropId, accountId: "foobar.testnet"});
+ t.is(canAddKeys, false);
+
+ await removeFromSaleAllowlist({dropId, accountIds: ["barfoo.testnet"]});
+ canAddKeys = await canUserAddKeys({dropId, accountId: "foobar.testnet"});
+ t.is(canAddKeys, true);
+ ```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. |
+| โบย `accountIds` | `string`[] | A list of account IDs that should be removed from the sale's allowlist |
+| โบย `dropId` | `string` | The drop ID for the drop |
+| โบย `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. |
+
+#### Returns
+
+`Promise`<`any`\>
+
+#### Defined in
+
+[lib/sales.ts:138](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/sales.ts#L138)
+
+___
+
+### removeFromSaleBlocklist
+
+**removeFromSaleBlocklist**(`ยซdestructuredยป`): `Promise`<`any`\>
+
+Remove a list of account IDs from a drop's sale blocklist. The sale object must exist in the drop's config for this to go through.
+
+**`Example`**
+
+```js
+ const {dropId} = await createDrop({
+ numKeys: 0,
+ depositPerUseNEAR: 0.1,
+ config: {
+ sale: {
+ maxNumKeys: 2,
+ pricePerKeyNEAR: 1,
+ blocklist: ["foobar.testnet"]
+ }
+ }
+ });
+
+ let canAddKeys = await canUserAddKeys({dropId, accountId: "foobar.testnet"});
+ t.is(canAddKeys, false);
+
+ canAddKeys = await canUserAddKeys({dropId, accountId: "not_in_blocklist.testnet"});
+ t.is(canAddKeys, true);
+
+ await removeFromSaleBlocklist({dropId, accountIds: ["foobar.testnet"]});
+ canAddKeys = await canUserAddKeys({dropId, accountId: "foobar.testnet"});
+ t.is(canAddKeys, true);
+ ```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. |
+| โบย `accountIds` | `string`[] | A list of account IDs that should be removed from the sale's allowlist |
+| โบย `dropId` | `string` | The drop ID for the drop |
+| โบย `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. |
+
+#### Returns
+
+`Promise`<`any`\>
+
+#### Defined in
+
+[lib/sales.ts:314](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/sales.ts#L314)
+
+___
+
+### updateSale
+
+**updateSale**(`ยซdestructuredยป`): `Promise`<`any`\>
+
+Remove a list of account IDs from a drop's sale blocklist. The sale object must exist in the drop's config for this to go through.
+
+**`Example`**
+
+```js
+ const {dropId} = await createDrop({
+ numKeys: 0,
+ depositPerUseNEAR: 0.1,
+ config: {
+ sale: {
+ maxNumKeys: 2,
+ pricePerKeyNEAR: 1
+ }
+ }
+ });
+
+ await updateSale({
+ dropId,
+ pricePerKeyNEAR: 2
+ })
+ ```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. |
+| โบย `autoWithdrawFunds?` | `boolean` | Should the revenue generated be sent to the funder's account balance or automatically withdrawn and sent to their NEAR wallet? |
+| โบย `dropId` | `string` | The drop ID for the drop |
+| โบย `end?` | `number` | Block timestamp dictating the end of the public sale. If None, keys can be added indefinitely Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. |
+| โบย `maxNumKeys?` | `number` | Maximum number of keys that can be added to this drop. If None, there is no max. |
+| โบย `pricePerKeyNEAR?` | `number` | Amount of $NEAR that the user needs to attach (if they are not the funder) on top of costs. This amount will be Automatically sent to the funder's balance. If None, the keys are free to the public. |
+| โบย `pricePerKeyYocto?` | `string` | - |
+| โบย `start?` | `number` | Minimum block timestamp before the public sale starts. If None, keys can be added immediately Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. |
+| โบย `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. |
+
+#### Returns
+
+`Promise`<`any`\>
+
+#### Defined in
+
+[lib/sales.ts:399](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/sales.ts#L399)
+
+## Trial Accounts
+
+### canExitTrial
+
+**canExitTrial**(`ยซdestructuredยป`): `Promise`<`boolean`\>
+
+Check whether a trial account is able to exit their trial state and become a fully fledged normal account.
+
+**`Example`**
+
+Create a trial account and check whether it can immediately exit
+```js
+ await initKeypom({
+ // near,
+ network: 'testnet',
+ funder: {
+ accountId: fundingAccountId,
+ secretKey: fundingAccountSecretKey,
+ }
+ });
+
+ const callableContracts = [
+ `nft.examples.testnet`
+ ]
+
+ const {dropId, keys: {secretKeys: trialSecretKeys, publicKeys: trialPublicKeys}}
+ = await createTrialAccountDrop({
+ numKeys: 1,
+ contractBytes: [...readFileSync('./test/ext-wasm/trial-accounts.wasm')],
+ startingBalanceNEAR: 0.5,
+ callableContracts: callableContracts,
+ callableMethods: ['*'],
+ maxAttachableNEARPerContract: [1],
+ trialEndFloorNEAR: 0.33 + 0.3
+ })
+
+ const desiredAccountId = `${dropId}-keypom.testnet`
+ const trialSecretKey = trialSecretKeys[0]
+ await claimTrialAccountDrop({
+ desiredAccountId,
+ secretKey: trialSecretKey
+ })
+
+ const canExitTrial = await keypom.canExitTrial({
+ trialAccountId: desiredAccountId
+ })
+ console.log('canExitTrial: ', canExitTrial)
+ ```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `trialAccountId` | `string` | The account ID of the trial account |
+
+#### Returns
+
+`Promise`<`boolean`\>
+
+#### Defined in
+
+[lib/trial-accounts/trial-active.ts:403](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/trial-accounts/trial-active.ts#L403)
+
+___
+
+### claimTrialAccountDrop
+
+**claimTrialAccountDrop**(`ยซdestructuredยป`): `Promise`<`any`\>
+
+Claim a Keypom trial account drop which will create a new account, deploy and initialize the trial account contract, and setup the account with initial conditions as specified in the drop.
+
+**`Example`**
+
+Creating a trial account with any callable methods, an amount of 0.5 $NEAR and 5 keys.
+```js
+const callableContracts = [
+ `v1.social08.testnet`,
+ 'guest-book.examples.keypom.testnet',
+]
+
+const {dropId, keys: {secretKeys: trialSecretKeys, publicKeys: trialPublicKeys}}
+= await createTrialAccountDrop({
+ numKeys: 1,
+ contractBytes: [...readFileSync('./test/ext-wasm/trial-accounts.wasm')],
+ startingBalanceNEAR: 0.5,
+ callableContracts: callableContracts,
+ callableMethods: ['set:grant_write_permission', '*'],
+ maxAttachableNEARPerContract: callableContracts.map(() => '1'),
+ trialEndFloorNEAR: 0.33
+})
+
+const newAccountId = `${Date.now().toString()}.linkdrop-beta.keypom.testnet`
+await claimTrialAccountDrop({
+ secretKey: trialSecretKeys[0],
+ desiredAccountId: newAccountId,
+})
+
+console.log(`
+
+${JSON.stringify({
+ account_id: newAccountId,
+ public_key: trialPublicKeys[0],
+ private_key: trialSecretKeys[0]
+})}
+
+`)
+
+console.log(`http://localhost:1234/keypom-url/${newAccountId}#${trialSecretKeys[0]}`)
+
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `desiredAccountId` | `string` | The account ID that will be created for the trial |
+| โบย `secretKey` | `string` | The private key associated with the Keypom link. This can either contain the `ed25519:` prefix or not. |
+
+#### Returns
+
+`Promise`<`any`\>
+
+#### Defined in
+
+[lib/trial-accounts/pre-trial.ts:505](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/trial-accounts/pre-trial.ts#L505)
+
+___
+
+### createTrialAccountDrop
+
+**createTrialAccountDrop**(`ยซdestructuredยป`): `Promise`<[`CreateOrAddReturn`](interfaces/CreateOrAddReturn.md)\>
+
+Creates a new trial account drop which can be used to instantly sign users into decentralized applications that support the Keypom wallet selector plugin.
+
+The trial account is locked into certain behaviors depending on what is passed into `createTrialAccountDrop`. These behaviors include callable contracts, methods on
+those contracts, the maximum amount of $NEAR that can be spent on each contract as well as an exit condition. Once the trial account has run out of funds, the only way to
+retain any assets from the trial or continue using the account ID, is to repay the specific account ID for the amount of $NEAR specified.
+
+**`Example`**
+
+Creating a trial account with any callable methods, an amount of 0.5 $NEAR and 5 keys.
+```js
+const {keys: {secretKeys: trialSecretKeys, publicKeys: trialPublicKeys}} = await createTrialAccountDrop({
+ contractBytes: [...readFileSync('./test/ext-wasm/trial-accounts.wasm')],
+ trialFundsNEAR: 0.5,
+ callableContracts: ['dev-1676298343226-57701595703433'],
+ callableMethods: ['*'],
+ amounts: ['0.5'],
+ numKeys: 5,
+ config: {
+ dropRoot: "linkdrop-beta.keypom.testnet"
+ }
+})
+
+const newAccountId = `${Date.now().toString()}.linkdrop-beta.keypom.testnet`
+await claimTrialAccountDrop({
+ secretKey: trialSecretKeys[0],
+ desiredAccountId: newAccountId,
+})
+
+console.log(`
+
+${JSON.stringify({
+ account_id: newAccountId,
+ public_key: trialPublicKeys[0],
+ private_key: trialSecretKeys[0]
+})}
+
+`)
+
+console.log(`http://localhost:1234/keypom-url/${newAccountId}#${trialSecretKeys[0]}`)
+
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. |
+| โบย `callableContracts` | `string`[] | The contracts that the trial account should be able to call. |
+| โบย `callableMethods` | `string`[][] | An array that contains the list of methods that the trial account should be able to call on each respective contract. To allow any methods to be called on the receiver contract, pass in `[*]`. |
+| โบย `config?` | [`DropConfig`](interfaces/DropConfig.md) | Allows specific drop behaviors to be configured such as the number of uses each key / link will have. |
+| โบย `contractBytes` | `number`[] | Bytes of the trial account smart contract |
+| โบย `dropId?` | `string` | Specify a custom drop ID rather than using the incrementing nonce on the contract. |
+| โบย `maxAttachableNEARPerContract` | (`string` \| `number`)[] | The upper bound of $NEAR that trial account is able to attach to calls associated with each contract passed in. For no upper limit, pass in `*`. Units are in $NEAR (i.e `1` = 1 $NEAR). |
+| โบย `maxAttachableYoctoPerContract` | `string`[] | The upper bound of $yocto that trial account is able to attach to calls associated with each contract passed in. For no upper limit, pass in `*`. Units are in $yoctoNEAR (i.e `1` = 1 $yoctoNEAR). |
+| โบย `metadata?` | `string` | String of metadata to attach to the drop. This can be whatever you would like and is optional. Often this is stringified JSON. |
+| โบย `numKeys` | `number` | Specify how many keys should be generated for the drop. If the funder has rootEntropy set OR rootEntropy is passed in, the keys will be deterministically generated using the drop ID, key nonce, and entropy. Otherwise, each key will be generated randomly. |
+| โบย `publicKeys?` | `string`[] | Pass in a custom set of publicKeys to add to the drop. If this is not passed in, keys will be generated based on the numKeys parameter. |
+| โบย `repayAmountNEAR?` | `string` \| `number` | How much $NEAR should be paid back to the specified funder in order to unlock the trial account. Unit in $NEAR (i.e `1` = 1 $NEAR) |
+| โบย `repayAmountYocto?` | `string` | How much $NEAR should be paid back to the specified funder in order to unlock the trial account. Unit in yoctoNEAR (1 yoctoNEAR = 1e-24 $NEAR) |
+| โบย `repayTo?` | `string` | The account that should receive the repayment of the trial account. If not specified, the drop funder will be used. |
+| โบย `returnTransactions?` | `boolean` | If true, the transaction will be returned instead of being signed and sent. This is useful for getting the requiredDeposit from the return value without actually signing the transaction. |
+| โบย `rootEntropy?` | `string` | Specify an entropy to use for generating keys (will overload the funder's rootEntropy if applicable). This parameter only matters if the publicKeys variable is not passed in. |
+| โบย `startingBalanceNEAR?` | `string` \| `number` | How much $NEAR should the trial account start with? Unit in $NEAR (i.e `1` = 1 $NEAR) |
+| โบย `startingBalanceYocto?` | `string` | How much $NEAR should the trial account start with? Unit in yoctoNEAR (1 yoctoNEAR = 1e-24 $NEAR) |
+| โบย `successUrl?` | `string` | When signing with a wallet, a success URl can be included that the user will be redirected to once the transaction has been successfully signed. |
+| โบย `trialEndFloorNEAR` | `string` \| `number` | Once the account has spent more than this amount (in $NEAR), the trial is over and the exit conditions must be met. |
+| โบย `trialEndFloorYocto` | `string` | Once the account has spent more than this amount (in yocto), the trial is over and the exit conditions must be met. |
+| โบย `useBalance?` | `boolean` | If the account has a balance within the Keypom contract, set this to true to avoid the need to attach a deposit. If the account doesn't have enough balance, an error will throw. |
+| โบย `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. |
+
+#### Returns
+
+`Promise`<[`CreateOrAddReturn`](interfaces/CreateOrAddReturn.md)\>
+
+Object containing: the drop ID, the responses of the execution, as well as any auto generated keys (if any).
+
+#### Defined in
+
+[lib/trial-accounts/pre-trial.ts:81](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/trial-accounts/pre-trial.ts#L81)
+
+___
+
+### trialCallMethod
+
+**trialCallMethod**(`ยซdestructuredยป`): `Promise`<`FinalExecutionOutcome`[]\>
+
+Execute a method using a trial account. If the trial account is in the exit state, this will throw an error. Similarly, if the given method data
+cannot be executed by the trial account (e.g. the attached deposit exceeds the trial account's restrictions), this will throw an error.
+
+**`Example`**
+
+Using a trial account to mint a new NFT:
+```js
+ await initKeypom({
+ network: 'testnet',
+ funder: {
+ accountId: fundingAccountId,
+ secretKey: fundingAccountSecretKey,
+ }
+ });
+
+ const callableContracts = [
+ `nft.examples.testnet`
+ ]
+
+ const {dropId, keys: {secretKeys: trialSecretKeys, publicKeys: trialPublicKeys}}
+ = await createTrialAccountDrop({
+ numKeys: 1,
+ contractBytes: [...readFileSync('./test/ext-wasm/trial-accounts.wasm')],
+ startingBalanceNEAR: 0.5,
+ callableContracts: callableContracts,
+ callableMethods: ['*'],
+ maxAttachableNEARPerContract: [1],
+ trialEndFloorNEAR: 0.33 + 0.3
+ })
+
+ const desiredAccountId = `${dropId}-keypom.testnet`
+ const trialSecretKey = trialSecretKeys[0]
+ await claimTrialAccountDrop({
+ desiredAccountId,
+ secretKey: trialSecretKeys[0],
+ })
+
+ console.log('desiredAccountId: ', desiredAccountId)
+ console.log(`trialSecretKey: ${JSON.stringify(trialSecretKey)}`)
+
+ await trialCallMethod({
+ trialAccountId: desiredAccountId,
+ trialAccountSecretKey: trialSecretKey,
+ contractId: callableContracts[0],
+ methodName: 'nft_mint',
+ args: {
+ token_id: 'asdkasldkjasdlkajsldajsldaskjd',
+ receiver_id: 'foo.testnet',
+ metadata: {
+ title: 'test',
+ description: 'test',
+ media: 'test',
+ }
+ },
+ attachedDeposit: parseNearAmount('0.1'),
+ attachedGas: '30000000000000',
+ })
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `args` | `Object` | The arguments to pass to the method |
+| โบย `attachedDeposit` | `string` | The amount of NEAR to attach to the transaction |
+| โบย `attachedGas` | `string` | The amount of gas to attach to the transaction |
+| โบย `contractId` | `string` | The contract ID of the contract to call |
+| โบย `methodName` | `string` | The method name to call |
+| โบย `trialAccountId` | `string` | The account ID of the trial account |
+| โบย `trialAccountSecretKey` | `string` | The secret key of the trial account |
+
+#### Returns
+
+`Promise`<`FinalExecutionOutcome`[]\>
+
+The outcome of the transaction
+
+#### Defined in
+
+[lib/trial-accounts/trial-active.ts:248](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/trial-accounts/trial-active.ts#L248)
+
+___
+
+### trialSignAndSendTxns
+
+**trialSignAndSendTxns**(`ยซdestructuredยป`): `Promise`<`FinalExecutionOutcome`[]\>
+
+Execute a transaction that can contain multiple actions using a trial account. If the trial account is in the exit state, this will throw an error. Similarly, if any action
+cannot be executed by the trial account (e.g. the attached deposit exceeds the trial account's restrictions), this will throw an error.
+
+**`Example`**
+
+Use a Trial Account to min2
+```js
+await initKeypom({
+ // near,
+ network: 'testnet',
+ funder: {
+ accountId: fundingAccountId,
+ secretKey: fundingAccountSecretKey,
+ }
+ });
+
+ const callableContracts = [
+ `nft.examples.testnet`
+ ]
+
+ const {dropId, keys: {secretKeys: trialSecretKeys, publicKeys: trialPublicKeys}}
+ = await createTrialAccountDrop({
+ numKeys: 1,
+ contractBytes: [...readFileSync('./test/ext-wasm/trial-accounts.wasm')],
+ startingBalanceNEAR: 0.5,
+ callableContracts: callableContracts,
+ callableMethods: ['*'],
+ maxAttachableNEARPerContract: [1],
+ trialEndFloorNEAR: 0.33 + 0.3
+ })
+
+ const desiredAccountId = `${dropId}-keypom.testnet`
+ const trialSecretKey = trialSecretKeys[0]
+ await claimTrialAccountDrop({
+ desiredAccountId,
+ secretKey: trialSecretKeys[0],
+ })
+
+ console.log('desiredAccountId: ', desiredAccountId)
+ console.log(`trialSecretKey: ${JSON.stringify(trialSecretKey)}`)
+ const txns = [{
+ receiverId: callableContracts[0],
+ actions: [
+ {
+ type: 'FunctionCall',
+ params: {
+ methodName: 'nft_mint',
+ args: {
+ token_id: 'tokenId-keypom-1',
+ receiver_id: 'foo.testnet',
+ metadata: {
+ title: 'test1',
+ description: 'test1',
+ media: 'test1',
+ }
+ },
+ gas: '30000000000000',
+ deposit: parseNearAmount('0.1')
+ },
+ },
+ {
+ type: 'FunctionCall',
+ params: {
+ methodName: 'nft_mint',
+ args: {
+ token_id: 'tokenId-keypom-2',
+ receiver_id: 'foo.testnet',
+ metadata: {
+ title: 'test2',
+ description: 'test2',
+ media: 'test2',
+ }
+ },
+ gas: '30000000000000',
+ deposit: parseNearAmount('0.1')
+ },
+ },
+ ],
+ }];
+
+ await trialSignAndSendTxns({
+ trialAccountId: desiredAccountId,
+ trialAccountSecretKey: trialSecretKey,
+ txns
+ })
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `trialAccountId` | `string` | The trial account ID to use |
+| โบย `trialAccountSecretKey` | `string` | The trial account secret key to use |
+| โบย `txns` | `Transaction`[] | The transactions to execute |
+
+#### Returns
+
+`Promise`<`FinalExecutionOutcome`[]\>
+
+The outcomes of the transactions
+
+#### Defined in
+
+[lib/trial-accounts/trial-active.ts:106](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/trial-accounts/trial-active.ts#L106)
+
+## View Functions
+
+### canUserAddKeys
+
+**canUserAddKeys**(`ยซdestructuredยป`): `Promise`<`boolean`\>
+
+Check if a given user can add keys to a drop. The only case where a user *other than the funder* could add keys is if the drop has a public sale running.
+
+**`Example`**
+
+```js
+await createDrop({
+ numKeys: 0,
+ depositPerUseNEAR: 0,
+ config: {
+ sale: {
+ maxNumKeys: 2,
+ pricePerKeyNEAR: 1
+ }
+ }
+});
+
+const canAddKeys = await canUserAddKeys({accountId: "foobar.testnet"});
+t.is(canAddKeys, true);
+```
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `ยซdestructuredยป` | `Object` |
+| โบย `accountId` | `string` |
+| โบย `dropId` | `string` |
+
+#### Returns
+
+`Promise`<`boolean`\>
+
+Whether or not the user can add keys to the drop
+
+#### Defined in
+
+[lib/views.ts:854](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L854)
+
+___
+
+### getContractSourceMetadata
+
+**getContractSourceMetadata**(): `Promise`<[`ContractSourceMetadata`](interfaces/ContractSourceMetadata.md)\>
+
+Returns the source metadata for the Keypom contract that the SDK has been initialized on. This includes valuable information
+such as which specific version the contract is on and link to exactly which GitHub commit is deployed.
+
+**`Example`**
+
+Query for the current Keypom contract's source metadata:
+```js
+// Initialize the SDK on testnet. No funder is passed in since we're only doing view calls.
+await initKeypom({
+network: "testnet",
+});
+
+// Query for the Keypom contract's source metadata
+const metadata = await getContractSourceMetadata();
+
+console.log('metadata: ', metadata)
+```
+
+#### Returns
+
+`Promise`<[`ContractSourceMetadata`](interfaces/ContractSourceMetadata.md)\>
+
+The contract's source metadata
+
+#### Defined in
+
+[lib/views.ts:896](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L896)
+
+___
+
+### getCurMethodData
+
+**getCurMethodData**(`ยซdestructuredยป`): `Promise`<[`ProtocolReturnedMethod`](interfaces/ProtocolReturnedMethod.md)[]\>
+
+Query for the current method data for a given key. This pertains to FC drops and the current method data is either null or an array of methods that will be invoked when the key is claimed next.
+
+**`Example`**
+
+```js
+const fcData = {
+ methods: [
+ null,
+ [
+ {
+ methodName: "nft_token",
+ receiverId: "nft.examples.testnet",
+ args: JSON.stringify({
+ token_id: "1"
+ }),
+ attachedDeposit: "0"
+ },
+ {
+ methodName: "nft_token",
+ receiverId: "nft.examples.testnet",
+ args: JSON.stringify({
+ token_id: "2"
+ }),
+ attachedDeposit: "0"
+ }
+ ],
+ null
+ ]
+}
+
+const {keys: {publicKeys, secretKeys}} = await createDrop({
+ numKeys: 1,
+ depositPerUseNEAR: 0,
+ fcData,
+ config: {
+ usesPerKey: 3
+ }
+});
+const secretKey = secretKeys[0];
+
+let curMethodData = await getCurMethodData({secretKey});
+console.log('curMethodData (first): ', curMethodData)
+t.is(curMethodData, null);
+
+ curMethodData = await getCurMethodData({secretKey, keyUse: 1});
+ t.is(curMethodData, null);
+ curMethodData = await getCurMethodData({secretKey, keyUse: 2});
+ t.true(curMethodData != null);
+ curMethodData = await getCurMethodData({secretKey, keyUse: 3});
+ t.is(curMethodData, null);
+
+await claim({secretKey, accountId: 'foobar'})
+curMethodData = await getCurMethodData({secretKey});
+t.true(curMethodData != null);
+
+await claim({secretKey, accountId: 'foobar'})
+curMethodData = await getCurMethodData({secretKey});
+console.log('curMethodData (third): ', curMethodData)
+t.is(curMethodData, null);
+```
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `ยซdestructuredยป` | `Object` |
+| โบย `keyUse?` | `number` |
+| โบย `publicKey?` | `string` |
+| โบย `secretKey?` | `string` |
+
+#### Returns
+
+`Promise`<[`ProtocolReturnedMethod`](interfaces/ProtocolReturnedMethod.md)[]\>
+
+The current method data for the key
+
+#### Defined in
+
+[lib/views.ts:797](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L797)
+
+___
+
+### getDropInformation
+
+**getDropInformation**(`ยซdestructuredยป`): `Promise`<[`ProtocolReturnedDrop`](interfaces/ProtocolReturnedDrop.md)\>
+
+Get information about a specific drop by passing in either a drop ID, public key, or secret key.
+
+**`Example`**
+
+Create a simple drop and retrieve information about it:
+```js
+// Initialize the SDK on testnet.
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+// Create a drop with 1 key automatically created. That key will be completely random since there is no entropy.
+const {dropId} = await createDrop({
+ numKeys: 1,
+ depositPerUseNEAR: 1
+});
+
+// Query for the drop information and also return the key information as well
+const dropInfo = await getDropInformation({
+ dropId,
+ withKeys: true
+})
+
+console.log('dropInfo: ', dropInfo)
+```
+
+**`Example`**
+
+Create a simple drop and get the drop information based on a public key and then the secret key:
+```js
+// Initialize the SDK on testnet.
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+// Create a drop with 1 key automatically created. That key will be completely random since there is no entropy.
+const {keys} = await createDrop({
+ numKeys: 1,
+ depositPerUseNEAR: 1
+});
+
+// Query for the drop information and also return the key information as well
+let dropInfo = await getDropInformation({
+ publicKey: keys.publicKeys[0],
+ withKeys: true
+})
+
+console.log('dropInfo via public key: ', dropInfo)
+
+// Query for the drop information and also return the key information as well
+dropInfo = await getDropInformation({
+ secretKey: keys.secretKeys[0],
+ withKeys: true
+})
+
+console.log('dropInfo via secret key: ', dropInfo)
+```
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `ยซdestructuredยป` | `Object` |
+| โบย `dropId?` | `string` |
+| โบย `publicKey?` | `string` |
+| โบย `secretKey?` | `string` |
+| โบย `withKeys?` | `boolean` |
+
+#### Returns
+
+`Promise`<[`ProtocolReturnedDrop`](interfaces/ProtocolReturnedDrop.md)\>
+
+Drop information which may or may not have a keys field of type `KeyInfo` depending on if withKeys is specified as true.
+
+#### Defined in
+
+[lib/views.ts:336](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L336)
+
+___
+
+### getDropSupplyForOwner
+
+**getDropSupplyForOwner**(`accountId`): `Promise`<`number`\>
+
+Returns the total supply of active drops for a given account ID
+
+**`Example`**
+
+Create a drop and check how many the owner has:
+```js
+// Initialize the SDK on testnet.
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+// Create a drop with no keys
+await createDrop({
+ depositPerUseNEAR: 1
+});
+
+// Query for the amount of drops owned by the account
+const dropSupply = await getDropSupplyForOwner({
+ accountId: "benji_demo.testnet"
+})
+
+console.log('dropSupply: ', dropSupply)
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `accountId` | `Object` | The account that the drops belong to. |
+| `accountId.accountId` | `string` | - |
+
+#### Returns
+
+`Promise`<`number`\>
+
+Amount of drops
+
+#### Defined in
+
+[lib/views.ts:517](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L517)
+
+___
+
+### getDrops
+
+**getDrops**(`ยซdestructuredยป`): `Promise`<[`ProtocolReturnedDrop`](interfaces/ProtocolReturnedDrop.md)[]\>
+
+Paginate through drops owned by an account. If specified, information for the first 50 keys in each drop can be returned as well.
+
+**`Example`**
+
+Get drop information for the last 5 drops owned by a given account:
+```js
+// Initialize the SDK on testnet. No funder is passed in since we're only doing view calls.
+await initKeypom({
+ network: "testnet",
+});
+
+// Get the number of drops the account has.
+const numDrops = await getDropSupply({
+ accountId: "benjiman.testnet"
+});
+
+// Query for drop information for the last 5 drops and their respective keys
+const dropsAndKeys = await getDrops({
+ accountId: "benjiman.testnet",
+ start: numDrops - 5,
+ withKeys: true
+})
+
+console.log('dropsAndKeys: ', dropsAndKeys)
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `accountId` | `string` | The funding account that the drops belong to. |
+| โบย `limit` | `number` | How many drops to paginate through. |
+| โบย `start` | `string` \| `number` | Where to start paginating through drops. |
+| โบย `withKeys` | `boolean` | Whether or not to include key information for the first 50 keys in each drop. |
+
+#### Returns
+
+`Promise`<[`ProtocolReturnedDrop`](interfaces/ProtocolReturnedDrop.md)[]\>
+
+#### Defined in
+
+[lib/views.ts:562](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L562)
+
+___
+
+### getKeyBalance
+
+**getKeyBalance**(`ยซdestructuredยป`): `Promise`<`string`\>
+
+Returns the balance associated a with given public key. If only the secret key is known, this can be passed in instead. This is used by the NEAR wallet to display the amount of the linkdrop
+
+**`Example`**
+
+Create a 1 $NEAR linkdrop and query for its balance:
+```js
+// Initialize the SDK on testnet.
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+// Create a drop with 1 key automatically created. That key will be completely random since there is no entropy.
+const {keys} = await createDrop({
+ numKeys: 1,
+ depositPerUseNEAR: 1
+});
+
+// Query for the amount of yoctoNEAR contained within the key
+const keyBalance = await getKeyBalance({
+ publicKey: keys.publicKeys[0]
+})
+
+console.log('keyBalance: ', keyBalance)
+```
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `ยซdestructuredยป` | `Object` |
+| โบย `publicKey?` | `string` |
+| โบย `secretKey?` | `string` |
+
+#### Returns
+
+`Promise`<`string`\>
+
+The amount of yoctoNEAR that is contained within the key
+
+#### Defined in
+
+[lib/views.ts:47](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L47)
+
+___
+
+### getKeyInformation
+
+**getKeyInformation**(`ยซdestructuredยป`): `Promise`<[`ProtocolReturnedKeyInfo`](interfaces/ProtocolReturnedKeyInfo.md)\>
+
+Returns the KeyInfo corresponding to a specific public key
+
+**`Example`**
+
+Create a drop and query for the key information:
+```js
+// Initialize the SDK on testnet.
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+// Create a drop with 1 key automatically created. That key will be completely random since there is no entropy.
+const {keys} = await createDrop({
+ numKeys: 1,
+ depositPerUseNEAR: 1
+});
+
+// Query for the key information for the key that was created
+const keyInfo = await getKeyInformation({
+ publicKey: keys.publicKeys[0]
+})
+
+console.log('keyInfo: ', keyInfo)
+```
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `ยซdestructuredยป` | `Object` |
+| โบย `publicKey?` | `string` |
+| โบย `secretKey?` | `string` |
+
+#### Returns
+
+`Promise`<[`ProtocolReturnedKeyInfo`](interfaces/ProtocolReturnedKeyInfo.md)\>
+
+Key information struct for that specific key.
+
+#### Defined in
+
+[lib/views.ts:177](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L177)
+
+___
+
+### getKeyInformationBatch
+
+**getKeyInformationBatch**(`ยซdestructuredยป`): `Promise`<[`ProtocolReturnedKeyInfo`](interfaces/ProtocolReturnedKeyInfo.md)[]\>
+
+Returns a vector of KeyInfo corresponding to a set of public keys passed in.
+
+**`Example`**
+
+Create a drop and query for the key information for all keys created:
+```js
+// Initialize the SDK on testnet.
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+// Create a drop with 5 keys automatically created. That key will be completely random since there is no entropy.
+const {keys} = await createDrop({
+ numKeys: 5,
+ depositPerUseNEAR: 1
+});
+
+// Query for the key information for the key that was created
+const keyInfos = await getKeyInformationBatch({
+ publicKeys: keys.publicKeys
+})
+
+console.log('keyInfos: ', keyInfos)
+```
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `ยซdestructuredยป` | `Object` |
+| โบย `publicKeys?` | `string`[] |
+| โบย `secretKeys?` | `string`[] |
+
+#### Returns
+
+`Promise`<[`ProtocolReturnedKeyInfo`](interfaces/ProtocolReturnedKeyInfo.md)[]\>
+
+Array of Key information structs for the keys passed in
+
+#### Defined in
+
+[lib/views.ts:236](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L236)
+
+___
+
+### getKeySupplyForDrop
+
+**getKeySupplyForDrop**(`dropId`): `Promise`<`number`\>
+
+Returns the total supply of active keys for a given drop
+
+**`Example`**
+
+Create a drop with 5 keys and query for the key supply:
+```js
+// Initialize the SDK on testnet.
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+// Create a drop with 5 keys automatically created. That key will be completely random since there is no entropy.
+const {keys, dropId} = await createDrop({
+ numKeys: 5,
+ depositPerUseNEAR: 1
+});
+
+// Query for the key supply for the drop that was created
+const keySupply = await getKeySupplyForDrop({
+ dropId
+})
+
+console.log('keySupply: ', keySupply)
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `dropId` | `Object` | The drop ID for the specific drop that you want to get information about. |
+| `dropId.dropId` | `string` | - |
+
+#### Returns
+
+`Promise`<`number`\>
+
+Number of active keys
+
+#### Defined in
+
+[lib/views.ts:416](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L416)
+
+___
+
+### getKeyTotalSupply
+
+**getKeyTotalSupply**(): `Promise`<`number`\>
+
+Query for the total supply of keys currently on the Keypom contract
+
+**`Example`**
+
+Query for the key supply on the `v1.keypom.testnet` contract:
+```js
+// Initialize the SDK on testnet. No funder is passed in since we're only doing view calls
+await initKeypom({
+ network: "testnet",
+ keypomContractId: "v1.keypom.testnet"
+});
+
+// Query for the number of keys on the contract
+const numKeys = await getKeyTotalSupply();
+
+console.log('numKeys: ', numKeys)
+```
+
+#### Returns
+
+`Promise`<`number`\>
+
+The amount of keys.
+
+#### Defined in
+
+[lib/views.ts:92](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L92)
+
+___
+
+### getKeys
+
+**getKeys**(`ยซdestructuredยป`): `Promise`<[`ProtocolReturnedKeyInfo`](interfaces/ProtocolReturnedKeyInfo.md)[]\>
+
+Paginate through all active keys on the contract and return a vector of key info.
+
+**`Example`**
+
+Query for first 50 keys on the `v1.keypom.testnet` contract:
+```js
+// Initialize the SDK on testnet. No funder is passed in since we're only doing view calls
+await initKeypom({
+ network: "testnet",
+ keypomContractId: "v1.keypom.testnet"
+});
+
+// Query for the first 50 keys on the contract
+const keyInfo = await getKeys({
+ start: 0,
+ limit: 50
+});
+
+console.log('keyInfo: ', keyInfo)
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `limit?` | `number` | (OPTIONAL) How many keys to paginate through. |
+| โบย `start?` | `string` \| `number` | (OPTIONAL) Where to start paginating through keys. |
+
+#### Returns
+
+`Promise`<[`ProtocolReturnedKeyInfo`](interfaces/ProtocolReturnedKeyInfo.md)[]\>
+
+Vector of KeyInfo.
+
+#### Defined in
+
+[lib/views.ts:126](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L126)
+
+___
+
+### getKeysForDrop
+
+**getKeysForDrop**(`ยซdestructuredยป`): `Promise`<[`ProtocolReturnedKeyInfo`](interfaces/ProtocolReturnedKeyInfo.md)[]\>
+
+Paginate through all keys in a specific drop, returning an array of KeyInfo.
+
+**`Example`**
+
+Create a drop with 5 keys and return all the key info objects:
+```js
+// Initialize the SDK on testnet.
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+// Create a drop with 5 keys automatically created. That key will be completely random since there is no entropy.
+const {dropId} = await createDrop({
+ numKeys: 5,
+ depositPerUseNEAR: 1
+});
+
+// Query for the key supply for the drop that was created
+const keyInfos = await getKeysForDrop({
+ dropId
+})
+
+console.log('keyInfos: ', keyInfos)
+```
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `ยซdestructuredยป` | `Object` |
+| โบย `dropId` | `string` |
+| โบย `limit?` | `number` |
+| โบย `start?` | `string` \| `number` |
+
+#### Returns
+
+`Promise`<[`ProtocolReturnedKeyInfo`](interfaces/ProtocolReturnedKeyInfo.md)[]\>
+
+Vector of KeyInfo objects returned from pagination
+
+#### Defined in
+
+[lib/views.ts:465](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L465)
+
+___
+
+### getNftSupplyForDrop
+
+**getNftSupplyForDrop**(`dropId`): `Promise`<`number`\>
+
+Return the total supply of token IDs for a given NFT drop.
+
+**`Example`**
+
+Query for the supply of tokens on a specific drop:
+```js
+// Initialize the SDK on testnet. No funder is passed in since we're only doing view calls.
+await initKeypom({
+network: "testnet",
+});
+
+// Query for the amount of token IDs on the drop
+const tokenSupply = await getNftSupplyForDrop({
+ dropId: "1669840629120"
+})
+
+console.log('tokenSupply: ', tokenSupply)
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `dropId` | `Object` | The drop ID that the tokens belong to. |
+| `dropId.dropId` | `string` | - |
+
+#### Returns
+
+`Promise`<`number`\>
+
+The amount of token IDs on the drop
+
+#### Defined in
+
+[lib/views.ts:634](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L634)
+
+___
+
+### getNftTokenIDsForDrop
+
+**getNftTokenIDsForDrop**(`ยซdestructuredยป`): `Promise`<`string`[]\>
+
+Paginate through token IDs in an NFT drop to return a vector of token IDs.
+
+**`Example`**
+
+Query for a list of token IDs on a specific drop:
+```js
+// Initialize the SDK on testnet. No funder is passed in since we're only doing view calls.
+await initKeypom({
+network: "testnet",
+});
+
+// Query for a set of token IDs on the drop
+const tokenList = await getNftTokenIDsForDrop({
+ dropId: "1669840629120"
+})
+
+console.log('tokenList: ', tokenList)
+```
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `ยซdestructuredยป` | `Object` |
+| โบย `dropId` | `string` |
+| โบย `limit?` | `number` |
+| โบย `start?` | `string` \| `number` |
+
+#### Returns
+
+`Promise`<`string`[]\>
+
+Vector of token IDs
+
+#### Defined in
+
+[lib/views.ts:673](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L673)
+
+___
+
+### getUserBalance
+
+**getUserBalance**(`accountId`): `Promise`<`string`\>
+
+Query for a user's current balance on the Keypom contract
+
+**`Example`**
+
+Query for a user's current balance on the Keypom contract:
+```js
+// Initialize the SDK on testnet. No funder is passed in since we're only doing view calls.
+await initKeypom({
+network: "testnet",
+});
+
+// Query for the drop information for a specific drop
+const userBal = await getUserBalance({
+accountId: "benjiman.testnet",
+})
+
+console.log('userBal: ', userBal)
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `accountId` | `Object` | The account ID of the user to retrieve the balance for. |
+| `accountId.accountId` | `string` | - |
+
+#### Returns
+
+`Promise`<`string`\>
+
+The user's current balance
+
+#### Defined in
+
+[lib/views.ts:716](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L716)
+
+## Functions
+
+### convertBasicTransaction
+
+**convertBasicTransaction**(`ยซdestructuredยป`): `Promise`<`Transaction`\>
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `ยซdestructuredยป` | `Object` |
+| โบย `signerId` | `string` |
+| โบย `signerPk` | `PublicKey` |
+| โบย `txnInfo` | [`BasicTransaction`](interfaces/BasicTransaction.md) |
+
+#### Returns
+
+`Promise`<`Transaction`\>
+
+#### Defined in
+
+[lib/keypom-utils.ts:1445](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L1445)
+
+___
+
+### isUnclaimedTrialDrop
+
+**isUnclaimedTrialDrop**(`ยซdestructuredยป`): `Promise`<`boolean`\>
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `ยซdestructuredยป` | `Object` |
+
+#### Returns
+
+`Promise`<`boolean`\>
+
+#### Defined in
+
+[lib/trial-accounts/utils.ts:232](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/trial-accounts/utils.ts#L232)
+
+___
+
+### wrapTxnParamsForTrial
+
+**wrapTxnParamsForTrial**(`params`, `newParams?`): `Object`
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `params` | `any` |
+| `newParams` | `Object` |
+
+#### Returns
+
+`Object`
+
+#### Defined in
+
+[lib/trial-accounts/utils.ts:103](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/trial-accounts/utils.ts#L103)
+
+## Deleting State
+
+### deleteDrops
+
+**deleteDrops**(`ยซdestructuredยป`): `Promise`<(`void` \| `FinalExecutionOutcome`[])[][]\>
+
+Delete a set of drops and optionally withdraw any remaining balance you have on the Keypom contract.
+
+**`Example`**
+
+Create 5 drops and delete each of them:
+```js
+// Initialize the SDK for the given network and NEAR connection
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+// loop to create 5 simple drops each with 5 more keys than the next
+for(var i = 0; i < 5; i++) {
+ // create 10 keys with no entropy (all random)
+ const {publicKeys} = await generateKeys({
+ numKeys: 5 * (i+1) // First drop will have 5, then 10, then 15 etc..
+ });
+
+ // Create the simple
+ await createDrop({
+ publicKeys,
+ depositPerUseNEAR: 1,
+ });
+}
+
+let drops = await getDrops({accountId: "benji_demo.testnet"});
+console.log('drops: ', drops)
+
+await deleteDrops({
+ drops
+})
+
+ // Get the number of drops the account has after deletion (should be zero)
+ const numDrops = await getDropSupply({
+ accountId: "benjiman.testnet"
+});
+console.log('numDrops: ', numDrops)
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. |
+| โบย `dropIds?` | `string`[] | Specify a set of drop IDs to delete. |
+| โบย `drops?` | [`ProtocolReturnedDrop`](interfaces/ProtocolReturnedDrop.md)[] | If the set of drop information for the drops you want to delete (from `getDropInformation` or `getDrops`) is already known to the client, it can be passed in instead of the drop IDs to reduce computation. |
+| โบย `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. |
+| โบย `withdrawBalance?` | `boolean` | Whether or not to withdraw any remaining balance on the Keypom contract. |
+
+#### Returns
+
+`Promise`<(`void` \| `FinalExecutionOutcome`[])[][]\>
+
+#### Defined in
+
+[lib/drops.ts:599](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/drops.ts#L599)
+
+___
+
+### deleteKeys
+
+**deleteKeys**(`ยซdestructuredยป`): `Promise`<`any`\>
+
+Delete a set of keys from a drop and optionally withdraw any remaining balance you have on the Keypom contract.
+
+**`Example`**
+
+Create a drop with 5 keys and delete the first one:
+```js
+// Initialize the SDK for the given network and NEAR connection
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+// Create the simple drop with 5 random keys
+const {keys, dropId} = await createDrop({
+ numKeys: 5,
+ depositPerUseNEAR: 1,
+});
+
+await deleteKeys({
+ dropId,
+ publicKeys: keys.publicKeys[0] // Can be wrapped in an array as well
+})
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. |
+| โบย `dropId` | `string` | Which drop ID do the keys belong to? |
+| โบย `publicKeys` | `string` \| `string`[] | Specify a set of public keys to delete. If deleting a single publicKey, the string can be passed in without wrapping it in an array. |
+| โบย `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. |
+| โบย `withdrawBalance?` | `boolean` | Whether or not to withdraw any remaining balance on the Keypom contract. |
+
+#### Returns
+
+`Promise`<`any`\>
+
+#### Defined in
+
+[lib/keys.ts:441](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keys.ts#L441)
+
+## Registering Key Uses
+
+### ftTransferCall
+
+**ftTransferCall**(`ยซdestructuredยป`): `Promise`<`Transaction` \| `Promise`<`void` \| `FinalExecutionOutcome`[]\>\>
+
+For FT Drops, keys need to be registered before they can be used. This is done via the `ft_transfer_call` method on the FT contract.
+This is a convenience method to make that process easier.
+
+**`Example`**
+
+Send FTs using the funder account (not passing in any accounts into the call):
+```js
+// Initialize the SDK on testnet
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+await ftTransferCall({
+ contractId: "ft.keypom.testnet",
+ amount: "1",
+ dropId: "1231231",
+)};
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `absoluteAmount?` | `string` | Amount of tokens to transfer but considering the decimal amount (non human-readable). Example: transferring one wNEAR should be passed in as "1000000000000000000000000" and NOT "1" |
+| โบย `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. |
+| โบย `amount?` | `string` | Human readable format for the amount of tokens to transfer. Example: transferring one wNEAR should be passed in as "1" and NOT "1000000000000000000000000" |
+| โบย `contractId` | `string` | The fungible token contract ID. |
+| โบย `dropId` | `string` | The drop ID to register the keys for. |
+| โบย `returnTransaction?` | `boolean` | If true, the transaction will be returned instead of being signed and sent. |
+| โบย `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. |
+
+#### Returns
+
+`Promise`<`Transaction` \| `Promise`<`void` \| `FinalExecutionOutcome`[]\>\>
+
+#### Defined in
+
+[lib/keypom-utils.ts:797](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L797)
+
+___
+
+### nftTransferCall
+
+**nftTransferCall**(`ยซdestructuredยป`): `Promise`<`Transaction`[] \| (`void` \| `FinalExecutionOutcome`[])[]\>
+
+For NFT Drops, keys need to be registered before they can be used. This is done via the `nft_transfer_call` method on the NFT contract.
+This is a convenience method to make that process easier.
+
+**`Example`**
+
+Send 3 NFTs using the funder account (not passing in any accounts into the call):
+```js
+// Initialize the SDK on testnet
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+await nftTransferCall({
+ contractId: "nft.keypom.testnet",
+ tokenIds: ["1", "2", "3],
+ dropId: "1231231",
+)};
+```
+
+#### Parameters
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `ยซdestructuredยป` | `Object` | - |
+| โบย `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. |
+| โบย `contractId` | `string` | The non-fungible token contract ID. |
+| โบย `dropId` | `string` | The drop ID to register the keys for. |
+| โบย `returnTransactions?` | `boolean` | If true, the transaction will be returned instead of being signed and sent. |
+| โบย `tokenIds` | `string`[] | A set of token IDs that should be sent to the Keypom contract in order to register keys. |
+| โบย `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. |
+
+#### Returns
+
+`Promise`<`Transaction`[] \| (`void` \| `FinalExecutionOutcome`[])[]\>
+
+#### Defined in
+
+[lib/keypom-utils.ts:906](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L906)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/welcome.md b/versioned_docs/version-2.0/keypom-sdk/Core/welcome.md
new file mode 100644
index 00000000..3fcc11a5
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Core/welcome.md
@@ -0,0 +1,216 @@
+---
+id: "welcome"
+title: "@keypom/core - v1.0.2"
+sidebar_label: "Readme"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+
+
+
+
+
+ Keypom Core SDK
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+The core package serves as a way to interact with Keypom through a set of easy to use methods that abstract away the complexities of the protocol. The package includes ways to:
+- Create drops of all kinds
+- Claim drops
+- Create and use trial accounts
+- View information about drops and keys
+- Delete drops and refund assets
+- Manage user balances
+
+# Table of Contents
+- [Table of Contents](#table-of-contents)
+- [Installation](#installation)
+- [Getting Started](#getting-started)
+ - [View Methods \& Utility Functions Only](#view-methods--utility-functions-only)
+ - [Funder Object](#funder-object)
+ - [Customized KeyStore \& Multiple Signers](#customized-keystore--multiple-signers)
+- [Costs](#costs)
+ - [Per Drop](#per-drop)
+ - [Per Key](#per-key)
+ - [Key Costs for Simple Drop](#key-costs-for-simple-drop)
+ - [Additional Costs for NFT Drops](#additional-costs-for-nft-drops)
+ - [Additional Costs for FT Drops](#additional-costs-for-ft-drops)
+ - [Additional Costs for FC Drops](#additional-costs-for-fc-drops)
+- [Contributing](#contributing)
+- [License](#license)
+
+---
+
+# Installation
+
+To install the Keypom Core SDK, run the following command:
+
+```bash
+npm install @keypom/core
+# or
+yarn add @keypom/core
+# or
+pnpm add @keypom/core
+```
+
+# Getting Started
+
+The first thing you must *always* do when using the SDK is to call `initKeypom`. This will initialize the package state and establish a connection to the NEAR blockchain.
+
+By default, the SDK will create a new [InMemoryKeyStore](https://github.com/near/near-api-js/blob/master/packages/keystores/src/in_memory_key_store.ts) to sign transactions with. Thus, if you don't pass in a `funder` object, you won't be able to sign transactions and can only invoke utility and view methods. Alternatively, if you'd like to use a different keystore, you can pass in a customized `near` object to the initialization function.
+
+With the SDK, every function that requires transactions to be signed can be carried through in 1 of two ways:
+1. Passing in an [Account](https://github.com/near/near-api-js/blob/master/packages/accounts/src/account.ts) object into the function whose keys are kept in the SDK's keystore.
+2. Passing in a `funder` object once during initialization whose keys will be kept in the SDK's [InMemoryKeyStore](https://github.com/near/near-api-js/blob/master/packages/keystores/src/in_memory_key_store.ts).
+
+## View Methods & Utility Functions Only
+
+If your only purpose is to query information from the chain or use Keypom's utility functions such as `generateKeys`, you don't need to pass in a `near` or `funder` object to `initKeypom`:
+
+```js
+await initKeypom({
+ network: "testnet"
+});
+
+const keys = await generateKeys({
+ numKeys: 1
+})
+console.log('keys: ', keys)
+
+const dropSupply = await getKeyTotalSupply();
+console.log('dropSupply: ', dropSupply)
+```
+
+## Funder Object
+
+If you have the private key of an account that you'd like to use to sign transactions with, you can pass in a `funder` object to `initKeypom`. The private key can either be hardcoded or passed in through environment variables / secrets.
+
+Using this method, you only need to pass the funder object once on initialization and can freely invoke any of the SDK methods moving forward. To update the funder object, you can call `updateFunder` and pass in different information.
+
+```js
+await initKeypom({
+ network: "testnet",
+ funder: {
+ accountId: "benji_demo.testnet",
+ secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"
+ }
+});
+
+const dropSupply = await getKeyTotalSupply();
+console.log('dropSupply: ', dropSupply)
+
+const {keys} = await createDrop({
+ numKeys: 1,
+ depositPerUseNEAR: 1
+})
+console.log('keys: ', keys)
+```
+
+## Customized KeyStore & Multiple Signers
+
+Passing in a custom `near` object when initializing Keypom has several benefits as seen below:
+- If you have multiple accounts that will be signing transactions and don't want to keep calling `updateFunder`.
+- You don't want to hardcode the private key in the `funder` object.
+- You have a keystore containing keys that will be used to sign transactions already in scope.
+
+In this case, you can pass in an existing `near` object and then pass in `Account` objects when calling the SDK methods.
+
+```js
+let keyStore = new UnencryptedFileSystemKeyStore(credentialsPath);
+let nearConfig = {
+ networkId: NETWORK_ID,
+ keyStore: keyStore,
+ nodeUrl: `https://rpc.${NETWORK_ID}.near.org`,
+ walletUrl: `https://wallet.${NETWORK_ID}.near.org`,
+ helperUrl: `https://helper.${NETWORK_ID}.near.org`,
+ explorerUrl: `https://explorer.${NETWORK_ID}.near.org`,
+};
+let near = new Near(nearConfig);
+
+await initKeypom({
+ near
+});
+
+const dropSupply = await getKeyTotalSupply();
+console.log('dropSupply: ', dropSupply)
+
+const fundingAccount = new Account(near.connection, funderAccountId);
+const {keys} = await createDrop({
+ account: fundingAccount,
+ numKeys: 1,
+ depositPerUseNEAR: 1
+})
+console.log('keys: ', keys)
+```
+
+# Costs
+
+It is important to note that the Keypom contracts are 100% **FEE FREE** and will remain that way for the *foreseeable future*. These contracts are a public good and are meant to inspire change in the NEAR ecosystem.
+
+With that being said, there are several mandatory costs that must be taken into account when using Keypom. These costs are broken down into two categories: per key and per drop.
+
+> **NOTE:** Creating an empty drop and then adding 100 keys in separate calls will incur the same cost as creating a drop with 100 keys in the same call.
+
+## Per Drop
+
+When creating an empty drop, there is only one cost to keep in mind regardless of the drop type:
+- Storage cost (**~0.006 $NEAR** for simple drops)
+
+## Per Key
+Whenever keys are added to a drop (either when the drop is first created or at a later date), the costs are outlined below.
+
+### Key Costs for Simple Drop
+
+- $NEAR sent whenever the key is used (can be 0).
+- Access key allowance (**~0.0187 $NEAR per use**).
+- Storage for creating access key (**0.001 $NEAR**).
+- Storage cost (**~0.006 $NEAR** for simple drops)
+
+### Additional Costs for NFT Drops
+
+Since keys aren't registered for use until **after** the contract has received the NFT, we don't know how much storage the token IDs will use on the contract. To combat this, the Keypom contract will automatically measure the storage used up for storing each token ID in the `nft_on_transfer` function and that $NEAR will be taken from the funder's balance.
+
+### Additional Costs for FT Drops
+
+Since accounts claiming FTs may or may not be registered on the Fungible Token contract, Keypom will automatically try to register **all** accounts. This means that the drop creators must front the cost of registering users depending on the `storage_balance_bounds` returned from the FT contract. This applies to every use for every key.
+
+In addition, Keypom must be registered on the FT contract. If you create a FT drop and are the first person to ever do so for a specific FT contract on Keypom, Keypom will be automatically registered when the drop is created. This is a one time cost and once it is done, no other account will need to register Keypom for that specific FT contract.
+
+### Additional Costs for FC Drops
+
+Drop creators have a ton of customization available to them when creation Function Call drops. A cost that they might incur is the attached deposit being sent alongside the function call. Keypom will charge creators for all the attached deposits they specify.
+
+> **NOTE:** The storage costs are dynamically calculated and will vary depending on the information you store on-chain.
+
+# Contributing
+
+First off, thanks for taking the time to contribute! Contributions are what makes the open-source community such an amazing place to learn, inspire, and create. Any contributions you make will benefit everybody else and are **greatly appreciated**.
+
+Please try to create bug reports that are:
+
+- _Reproducible._ Include steps to reproduce the problem.
+- _Specific._ Include as much detail as possible: which version, what environment, etc.
+- _Unique._ Do not duplicate existing opened issues.
+- _Scoped to a Single Bug._ One bug per report.
+
+You can use [markdownlint-cli](https://github.com/igorshubovych/markdownlint-cli) to check for common markdown style inconsistency.
+
+# License
+
+This project is licensed under the **GPL License**.
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/_category_.yml b/versioned_docs/version-2.0/keypom-sdk/Selector/_category_.yml
new file mode 100644
index 00000000..368d9d7e
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/_category_.yml
@@ -0,0 +1,3 @@
+label: "Selector TypeDocs"
+position: 0
+collapsed: false
\ No newline at end of file
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/classes/KeypomWallet.md b/versioned_docs/version-2.0/keypom-sdk/Selector/classes/KeypomWallet.md
new file mode 100644
index 00000000..b105c864
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/classes/KeypomWallet.md
@@ -0,0 +1,465 @@
+---
+id: "KeypomWallet"
+title: "Class: KeypomWallet"
+sidebar_label: "KeypomWallet"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+## Implements
+
+- `InstantLinkWalletBehaviour`
+
+## Constructors
+
+### constructor
+
+**new KeypomWallet**(`ยซdestructuredยป`)
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `ยซdestructuredยป` | `Object` |
+| โบย `instantSignInSpecs?` | `InstantSignInSpecs` |
+| โบย `networkId` | `string` |
+| โบย `signInContractId` | `string` |
+| โบย `trialAccountSpecs?` | `TrialSignInSpecs` |
+
+#### Defined in
+
+[core/wallet.ts:33](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L33)
+
+## Properties
+
+### accountId
+
+ `Optional` **accountId**: `string`
+
+#### Defined in
+
+[core/wallet.ts:19](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L19)
+
+___
+
+### instantSignInSpecs
+
+ `Optional` **instantSignInSpecs**: `InternalInstantSignInSpecs`
+
+#### Defined in
+
+[core/wallet.ts:29](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L29)
+
+___
+
+### keyStore
+
+ **keyStore**: `BrowserLocalStorageKeyStore`
+
+#### Defined in
+
+[core/wallet.ts:26](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L26)
+
+___
+
+### modal
+
+ `Optional` **modal**: `KeypomTrialModal`
+
+#### Defined in
+
+[core/wallet.ts:31](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L31)
+
+___
+
+### moduleId
+
+ `Optional` **moduleId**: `string`
+
+#### Defined in
+
+[core/wallet.ts:21](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L21)
+
+___
+
+### near
+
+ **near**: `Near`
+
+#### Defined in
+
+[core/wallet.ts:25](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L25)
+
+___
+
+### secretKey
+
+ `Optional` **secretKey**: `string`
+
+#### Defined in
+
+[core/wallet.ts:20](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L20)
+
+___
+
+### signInContractId
+
+ **signInContractId**: `string`
+
+#### Defined in
+
+[core/wallet.ts:23](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L23)
+
+___
+
+### trialAccountSpecs
+
+ `Optional` **trialAccountSpecs**: `InternalTrialSignInSpecs`
+
+#### Defined in
+
+[core/wallet.ts:28](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L28)
+
+## Methods
+
+### assertSignedIn
+
+`Private` **assertSignedIn**(): `void`
+
+#### Returns
+
+`void`
+
+#### Defined in
+
+[core/wallet.ts:337](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L337)
+
+___
+
+### checkValidTrialInfo
+
+**checkValidTrialInfo**(): `boolean`
+
+#### Returns
+
+`boolean`
+
+#### Defined in
+
+[core/wallet.ts:287](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L287)
+
+___
+
+### getAccountId
+
+**getAccountId**(): `string`
+
+#### Returns
+
+`string`
+
+#### Defined in
+
+[core/wallet.ts:63](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L63)
+
+___
+
+### getAccounts
+
+**getAccounts**(): `Promise`<`Account`[]\>
+
+#### Returns
+
+`Promise`<`Account`[]\>
+
+#### Implementation of
+
+InstantLinkWalletBehaviour.getAccounts
+
+#### Defined in
+
+[core/wallet.ts:306](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L306)
+
+___
+
+### getAvailableBalance
+
+**getAvailableBalance**(`id?`): `Promise`<`BN`\>
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `id?` | `string` |
+
+#### Returns
+
+`Promise`<`BN`\>
+
+#### Defined in
+
+[core/wallet.ts:301](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L301)
+
+___
+
+### getContractId
+
+**getContractId**(): `string`
+
+#### Returns
+
+`string`
+
+#### Implementation of
+
+InstantLinkWalletBehaviour.getContractId
+
+#### Defined in
+
+[core/wallet.ts:59](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L59)
+
+___
+
+### internalSignIn
+
+`Private` **internalSignIn**(`accountId`, `secretKey`, `moduleId`): `Promise`<`Account`[]\>
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `accountId` | `any` |
+| `secretKey` | `any` |
+| `moduleId` | `any` |
+
+#### Returns
+
+`Promise`<`Account`[]\>
+
+#### Defined in
+
+[core/wallet.ts:319](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L319)
+
+___
+
+### isSignedIn
+
+**isSignedIn**(): `Promise`<`boolean`\>
+
+#### Returns
+
+`Promise`<`boolean`\>
+
+#### Defined in
+
+[core/wallet.ts:68](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L68)
+
+___
+
+### setSpecsFromKeypomParams
+
+`Private` **setSpecsFromKeypomParams**(`ยซdestructuredยป`): `void`
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `ยซdestructuredยป` | `Object` |
+| โบย `instantSignInSpecs?` | `InstantSignInSpecs` |
+| โบย `shouldSetupModal` | `boolean` |
+| โบย `trialAccountSpecs?` | `TrialSignInSpecs` |
+
+#### Returns
+
+`void`
+
+#### Defined in
+
+[core/wallet.ts:343](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L343)
+
+___
+
+### showModal
+
+**showModal**(`modalType?`): `void`
+
+#### Parameters
+
+| Name | Type | Default value |
+| :------ | :------ | :------ |
+| `modalType` | `Object` | `undefined` |
+| `modalType.id` | `string` | `MODAL_TYPE_IDS.TRIAL_OVER` |
+
+#### Returns
+
+`void`
+
+#### Defined in
+
+[core/wallet.ts:282](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L282)
+
+___
+
+### signAndSendTransaction
+
+**signAndSendTransaction**(`params`): `Promise`<`FinalExecutionOutcome`\>
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `params` | `any` |
+
+#### Returns
+
+`Promise`<`FinalExecutionOutcome`\>
+
+#### Implementation of
+
+InstantLinkWalletBehaviour.signAndSendTransaction
+
+#### Defined in
+
+[core/wallet.ts:201](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L201)
+
+___
+
+### signAndSendTransactions
+
+**signAndSendTransactions**(`params`): `Promise`<`FinalExecutionOutcome`[]\>
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `params` | `Object` |
+| `params.transactions` | `Transaction`[] |
+
+#### Returns
+
+`Promise`<`FinalExecutionOutcome`[]\>
+
+#### Implementation of
+
+InstantLinkWalletBehaviour.signAndSendTransactions
+
+#### Defined in
+
+[core/wallet.ts:225](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L225)
+
+___
+
+### signIn
+
+**signIn**(): `Promise`<`Account`[]\>
+
+#### Returns
+
+`Promise`<`Account`[]\>
+
+#### Implementation of
+
+InstantLinkWalletBehaviour.signIn
+
+#### Defined in
+
+[core/wallet.ts:147](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L147)
+
+___
+
+### signInInstantAccount
+
+**signInInstantAccount**(`accountId`, `secretKey`, `moduleId`): `Promise`<`Account`[]\>
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `accountId` | `any` |
+| `secretKey` | `any` |
+| `moduleId` | `any` |
+
+#### Returns
+
+`Promise`<`Account`[]\>
+
+#### Defined in
+
+[core/wallet.ts:128](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L128)
+
+___
+
+### signInTrialAccount
+
+**signInTrialAccount**(`accountId`, `secretKey`): `Promise`<`Account`[]\>
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `accountId` | `any` |
+| `secretKey` | `any` |
+
+#### Returns
+
+`Promise`<`Account`[]\>
+
+#### Defined in
+
+[core/wallet.ts:72](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L72)
+
+___
+
+### signOut
+
+**signOut**(): `Promise`<`void`\>
+
+#### Returns
+
+`Promise`<`void`\>
+
+#### Implementation of
+
+InstantLinkWalletBehaviour.signOut
+
+#### Defined in
+
+[core/wallet.ts:191](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L191)
+
+___
+
+### switchAccount
+
+**switchAccount**(`id`): `Promise`<`void`\>
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `id` | `string` |
+
+#### Returns
+
+`Promise`<`void`\>
+
+#### Defined in
+
+[core/wallet.ts:315](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L315)
+
+___
+
+### verifyOwner
+
+**verifyOwner**(): `Promise`<`void`\>
+
+#### Returns
+
+`Promise`<`void`\>
+
+#### Implementation of
+
+InstantLinkWalletBehaviour.verifyOwner
+
+#### Defined in
+
+[core/wallet.ts:295](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L295)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/classes/_category_.yml b/versioned_docs/version-2.0/keypom-sdk/Selector/classes/_category_.yml
new file mode 100644
index 00000000..55c7980a
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/classes/_category_.yml
@@ -0,0 +1,2 @@
+label: "Classes"
+position: 3
\ No newline at end of file
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/BasicTransaction.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/BasicTransaction.md
new file mode 100644
index 00000000..83586f31
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/BasicTransaction.md
@@ -0,0 +1,37 @@
+---
+id: "BasicTransaction"
+title: "Interface: BasicTransaction"
+sidebar_label: "BasicTransaction"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+## Properties
+
+### actions
+
+ **actions**: `Action`[]
+
+#### Defined in
+
+[lib/types/general.ts:108](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L108)
+
+___
+
+### receiverId
+
+ **receiverId**: `string`
+
+#### Defined in
+
+[lib/types/general.ts:106](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L106)
+
+___
+
+### signerId
+
+ **signerId**: `string`
+
+#### Defined in
+
+[lib/types/general.ts:107](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L107)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ContractSourceMetadata.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ContractSourceMetadata.md
new file mode 100644
index 00000000..1f98bad4
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ContractSourceMetadata.md
@@ -0,0 +1,34 @@
+---
+id: "ContractSourceMetadata"
+title: "Interface: ContractSourceMetadata"
+sidebar_label: "ContractSourceMetadata"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Information returned from `getContractSourceMetadata` about the deployed Keypom contract. This is part of [NEP-330](https://nomicon.io/Standards/SourceMetadata) and
+can allow you to view exactly what code is deployed to the contract.
+
+## Properties
+
+### link
+
+ **link**: `string`
+
+Link to the specific commit and code on GitHub that is deployed to the Keypom account
+
+#### Defined in
+
+[lib/types/general.ts:102](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L102)
+
+___
+
+### version
+
+ **version**: `string`
+
+Versioning used by the Keypom developers to indicate which version of the contract is deployed.
+
+#### Defined in
+
+[lib/types/general.ts:100](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L100)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/CreateDropProtocolArgs.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/CreateDropProtocolArgs.md
new file mode 100644
index 00000000..628606b8
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/CreateDropProtocolArgs.md
@@ -0,0 +1,117 @@
+---
+id: "CreateDropProtocolArgs"
+title: "Interface: CreateDropProtocolArgs"
+sidebar_label: "CreateDropProtocolArgs"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+## Properties
+
+### config
+
+ `Optional` **config**: [`ProtocolReturnedDropConfig`](ProtocolReturnedDropConfig.md)
+
+#### Defined in
+
+[lib/types/params.ts:54](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L54)
+
+___
+
+### deposit\_per\_use
+
+ **deposit\_per\_use**: `string`
+
+#### Defined in
+
+[lib/types/params.ts:51](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L51)
+
+___
+
+### drop\_id
+
+ `Optional` **drop\_id**: `string`
+
+#### Defined in
+
+[lib/types/params.ts:53](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L53)
+
+___
+
+### fc
+
+ `Optional` **fc**: [`ProtocolReturnedFCData`](ProtocolReturnedFCData.md)
+
+#### Defined in
+
+[lib/types/params.ts:60](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L60)
+
+___
+
+### ft
+
+ `Optional` **ft**: [`ProtocolReturnedFTData`](ProtocolReturnedFTData.md)
+
+#### Defined in
+
+[lib/types/params.ts:58](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L58)
+
+___
+
+### metadata
+
+ `Optional` **metadata**: `string`
+
+#### Defined in
+
+[lib/types/params.ts:55](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L55)
+
+___
+
+### nft
+
+ `Optional` **nft**: [`ProtocolReturnedNFTData`](ProtocolReturnedNFTData.md)
+
+#### Defined in
+
+[lib/types/params.ts:59](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L59)
+
+___
+
+### passwords\_per\_use
+
+ `Optional` **passwords\_per\_use**: [`PasswordPerUse`](PasswordPerUse.md)[][]
+
+#### Defined in
+
+[lib/types/params.ts:61](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L61)
+
+___
+
+### public\_keys
+
+ `Optional` **public\_keys**: `string`[]
+
+#### Defined in
+
+[lib/types/params.ts:50](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L50)
+
+___
+
+### required\_gas
+
+ `Optional` **required\_gas**: `string`
+
+#### Defined in
+
+[lib/types/params.ts:56](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L56)
+
+___
+
+### simple
+
+ `Optional` **simple**: [`ProtocolReturnedSimpleData`](ProtocolReturnedSimpleData.md)
+
+#### Defined in
+
+[lib/types/params.ts:57](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L57)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/CreateOrAddReturn.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/CreateOrAddReturn.md
new file mode 100644
index 00000000..098ae1bc
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/CreateOrAddReturn.md
@@ -0,0 +1,69 @@
+---
+id: "CreateOrAddReturn"
+title: "Interface: CreateOrAddReturn"
+sidebar_label: "CreateOrAddReturn"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Information returned when creating a drop or adding keys via `createDrop` and `addKeys` respectively.
+
+## Properties
+
+### dropId
+
+ **dropId**: `string`
+
+The drop ID for the drop that is being interacted with.
+
+#### Defined in
+
+[lib/types/params.ts:34](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L34)
+
+___
+
+### keys
+
+ `Optional` **keys**: [`GeneratedKeyPairs`](GeneratedKeyPairs.md)
+
+Any keys that were automatically generated.
+
+#### Defined in
+
+[lib/types/params.ts:32](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L32)
+
+___
+
+### requiredDeposit
+
+ `Optional` **requiredDeposit**: `string`
+
+The required deposit that should be attached to the transaction.
+
+#### Defined in
+
+[lib/types/params.ts:30](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L30)
+
+___
+
+### responses
+
+ `Optional` **responses**: `any`
+
+The responses to any transactions that were signed and sent to the network.
+
+#### Defined in
+
+[lib/types/params.ts:26](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L26)
+
+___
+
+### transactions
+
+ `Optional` **transactions**: `Transaction`[]
+
+Information about the transactions if `returnTransactions` is specified in the arguments. This will result in the information being returned instead of signed and sent.
+
+#### Defined in
+
+[lib/types/params.ts:28](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L28)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/Drop.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/Drop.md
new file mode 100644
index 00000000..906fde01
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/Drop.md
@@ -0,0 +1,153 @@
+---
+id: "Drop"
+title: "Interface: Drop"
+sidebar_label: "Drop"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Information related to a specific drop.
+
+## Properties
+
+### config
+
+ `Optional` **config**: [`DropConfig`](DropConfig.md)
+
+All drops regardless of their type can have a suite of configurations such as how many uses each key has or how often a key can be used.
+
+#### Defined in
+
+[lib/types/drops.ts:50](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L50)
+
+___
+
+### depositPerUse
+
+ **depositPerUse**: `string`
+
+How much $yoctoNEAR will be transferred anytime a key is used that is part of this drop.
+
+#### Defined in
+
+[lib/types/drops.ts:40](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L40)
+
+___
+
+### dropId
+
+ **dropId**: `string`
+
+Drop ID for this specific drop.
+
+#### Defined in
+
+[lib/types/drops.ts:36](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L36)
+
+___
+
+### fc
+
+ `Optional` **fc**: [`FCData`](FCData.md)
+
+For Function-Call drops, important information needs to be stored such as which methods, the attached deposit, args etc.
+
+#### Defined in
+
+[lib/types/drops.ts:48](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L48)
+
+___
+
+### ft
+
+ `Optional` **ft**: [`FTData`](FTData.md)
+
+For Fungible Token drops, important information such as the amount of tokens to transfer, or contract need to be stored.
+
+#### Defined in
+
+[lib/types/drops.ts:46](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L46)
+
+___
+
+### metadata
+
+ `Optional` **metadata**: `string`
+
+Any extra information about the drop can be stored as metadata. This is up to the drop creator and can be stringified JSON, or any other string.
+
+#### Defined in
+
+[lib/types/drops.ts:52](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L52)
+
+___
+
+### nextKeyId
+
+ **nextKeyId**: `number`
+
+What is the next unique ID that will be given to the next access key added to this drop.
+
+#### Defined in
+
+[lib/types/drops.ts:58](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L58)
+
+___
+
+### nft
+
+ `Optional` **nft**: [`NFTData`](NFTData.md)
+
+For NFT drops, important information such as the token IDs, or contract need to be stored.
+
+#### Defined in
+
+[lib/types/drops.ts:44](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L44)
+
+___
+
+### ownerId
+
+ **ownerId**: `string`
+
+Which account created this drop.
+
+#### Defined in
+
+[lib/types/drops.ts:38](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L38)
+
+___
+
+### registeredUses
+
+ **registeredUses**: `number`
+
+How many key uses are registered for this drop? This is only applicable to simple drops with lazy registrations, FT drops, and NFT drops.
+
+#### Defined in
+
+[lib/types/drops.ts:54](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L54)
+
+___
+
+### requiredGas
+
+ **requiredGas**: `string`
+
+In order to use an access key that's part of this drop, how much Gas *needs* to be attached to the call?
+
+#### Defined in
+
+[lib/types/drops.ts:56](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L56)
+
+___
+
+### simple
+
+ `Optional` **simple**: [`SimpleData`](SimpleData.md)
+
+For simple drops, there are specific, optional configurations.
+
+#### Defined in
+
+[lib/types/drops.ts:42](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L42)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/DropConfig.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/DropConfig.md
new file mode 100644
index 00000000..caf9f428
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/DropConfig.md
@@ -0,0 +1,71 @@
+---
+id: "DropConfig"
+title: "Interface: DropConfig"
+sidebar_label: "DropConfig"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Configurable options for any drop regardless of type.
+
+## Properties
+
+### dropRoot
+
+ `Optional` **dropRoot**: `string`
+
+Override the global root account that all created sub-accounts will have (currently `near` or `testnet`). This allows users to drops that have a custom root.
+For example, Fayyr could specify a root of `fayyr.near` By which all sub-accounts will then be `ACCOUNT.fayyr.near`.
+It's important to note that this root account *MUST* have a smart contract deployed that has a method `create_account`.
+
+#### Defined in
+
+[lib/types/drops.ts:81](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L81)
+
+___
+
+### sale
+
+ `Optional` **sale**: [`PublicSaleConfig`](PublicSaleConfig.md)
+
+Any information related to primary market sales for access keys added to this drop.
+
+#### Defined in
+
+[lib/types/drops.ts:75](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L75)
+
+___
+
+### time
+
+ `Optional` **time**: [`TimeConfig`](TimeConfig.md)
+
+Any information related to time-based configurations such as a starting date for keys etc.
+
+#### Defined in
+
+[lib/types/drops.ts:69](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L69)
+
+___
+
+### usage
+
+ `Optional` **usage**: [`UsageConfig`](UsageConfig.md)
+
+Any information related to how access keys are used such as which methods they can call or whether an empty drop should be automatically deleted etc.
+
+#### Defined in
+
+[lib/types/drops.ts:72](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L72)
+
+___
+
+### usesPerKey
+
+ `Optional` **usesPerKey**: `number`
+
+How many uses can each key have before it's deleted. If this isn't specified, it defaults to 1 use per key.
+
+#### Defined in
+
+[lib/types/drops.ts:66](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L66)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/EnvVars.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/EnvVars.md
new file mode 100644
index 00000000..f4334f13
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/EnvVars.md
@@ -0,0 +1,223 @@
+---
+id: "EnvVars"
+title: "Interface: EnvVars"
+sidebar_label: "EnvVars"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Important context that is used throughout the SDK. This is generated when `initKeypom` is called and can be retrieved by calling `useKeypom`.
+All parameters will start off as undefined until the Keypom SDK is initialized.
+
+## Properties
+
+### attachedGas
+
+ `Optional` **attachedGas**: `string`
+
+The amount of Gas that will be attached to the `claim` and `create_account_and_claim` functions for claiming linkdrops (100 TGas).
+
+#### Defined in
+
+[lib/types/general.ts:77](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L77)
+
+___
+
+### connection
+
+ `Optional` **connection**: `Connection`
+
+The connection instance that is part of the NEAR object
+
+#### Defined in
+
+[lib/types/general.ts:59](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L59)
+
+___
+
+### contractAccount
+
+ `Optional` **contractAccount**: `Account`
+
+The NEAR Account object for the Keypom contract being used. This lets you know the account ID for the contract and can be used to sign transactions for claiming linkdrops.
+
+#### Defined in
+
+[lib/types/general.ts:69](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L69)
+
+___
+
+### contractId
+
+ `Optional` **contractId**: `string`
+
+The account ID where the Keypom contract is deployed to.
+
+#### Defined in
+
+[lib/types/general.ts:79](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L79)
+
+___
+
+### error
+
+ `Optional` **error**: `string`
+
+#### Defined in
+
+[lib/types/general.ts:83](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L83)
+
+___
+
+### execute
+
+ `Optional` **execute**: `any`
+
+#### Defined in
+
+[lib/types/general.ts:87](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L87)
+
+___
+
+### fundingAccount
+
+ `Optional` **fundingAccount**: `Account`
+
+The NEAR Account object for the Funder
+
+#### Defined in
+
+[lib/types/general.ts:65](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L65)
+
+___
+
+### fundingAccountDetails
+
+ `Optional` **fundingAccountDetails**: [`Funder`](Funder.md)
+
+The details for the funder such as any `rootEntropy` or their `secretKey` etc.
+
+#### Defined in
+
+[lib/types/general.ts:67](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L67)
+
+___
+
+### gas
+
+ `Optional` **gas**: `string`
+
+The default amount of Gas that will be attached to transactions (200 TGas).
+
+#### Defined in
+
+[lib/types/general.ts:73](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L73)
+
+___
+
+### gas300
+
+ `Optional` **gas300**: `string`
+
+The max amount of Gas that will be attached to transactions (300 TGas).
+
+#### Defined in
+
+[lib/types/general.ts:75](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L75)
+
+___
+
+### getAccount
+
+ `Optional` **getAccount**: `any`
+
+#### Defined in
+
+[lib/types/general.ts:85](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L85)
+
+___
+
+### keyStore
+
+ `Optional` **keyStore**: `KeyStore`
+
+Which type of KeyStore is used when locating keys and signing transactions throughout the SDK (In Memory, Unencrypted FileStore etc.)
+
+#### Defined in
+
+[lib/types/general.ts:61](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L61)
+
+___
+
+### near
+
+ `Optional` **near**: `Near`
+
+The specific NEAR object that contains important information such as the KeyStore and connection. This is used to interact with the chain and can either be manually passed in or will be automatically created during `initKeypom`
+
+#### Defined in
+
+[lib/types/general.ts:57](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L57)
+
+___
+
+### networkId
+
+ `Optional` **networkId**: `string`
+
+What network is the SDK using (`testnet` or `mainnet`)
+
+#### Defined in
+
+[lib/types/general.ts:63](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L63)
+
+___
+
+### receiverId
+
+ `Optional` **receiverId**: `string`
+
+#### Defined in
+
+[lib/types/general.ts:81](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L81)
+
+___
+
+### supportedKeypomContracts
+
+ `Optional` **supportedKeypomContracts**: `Object`
+
+Object containing the supported Keypom contracts for both mainnet and testnet
+
+#### Type declaration
+
+| Name | Type |
+| :------ | :------ |
+| `mainnet` | {} |
+| `testnet` | {} |
+
+#### Defined in
+
+[lib/types/general.ts:89](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L89)
+
+___
+
+### viewAccount
+
+ `Optional` **viewAccount**: `any`
+
+#### Defined in
+
+[lib/types/general.ts:71](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L71)
+
+___
+
+### viewCall
+
+ `Optional` **viewCall**: `any`
+
+Function that allows you to invoke a view method. This takes in a `receiverId`, `methodName`, and `args`.
+
+#### Defined in
+
+[lib/types/general.ts:91](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L91)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/FCData.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/FCData.md
new file mode 100644
index 00000000..8a814cde
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/FCData.md
@@ -0,0 +1,22 @@
+---
+id: "FCData"
+title: "Interface: FCData"
+sidebar_label: "FCData"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Information pertaining to all Function-Call drops. This should be passed in if the drop will be a Function-Call drop.
+
+## Properties
+
+### methods
+
+ **methods**: [`Method`](Method.md)[][]
+
+The top level array indicates a different set of methods that can be called for every key use. It is possible that for a given key use, no methods are called thus acting as a "free" key use whereby the use is reflected on-chain but no assets are transferred.
+If a given key use does not have an undefined set of methods, when it is used, all the methods in the set will be called.
+
+#### Defined in
+
+[lib/types/fc.ts:73](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L73)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/FTData.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/FTData.md
new file mode 100644
index 00000000..2b0726d5
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/FTData.md
@@ -0,0 +1,59 @@
+---
+id: "FTData"
+title: "Interface: FTData"
+sidebar_label: "FTData"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Information pertaining to all Fungible-Token drops. This should be passed in if the drop will be used to transfer any fungible tokens.
+
+## Properties
+
+### absoluteAmount
+
+ `Optional` **absoluteAmount**: `string`
+
+Amount of tokens to transfer but considering the decimal amount.
+Example: transferring one wNEAR should be passed in as "1000000000000000000000000" and NOT "1"
+
+#### Defined in
+
+[lib/types/ft.ts:22](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/ft.ts#L22)
+
+___
+
+### amount
+
+ `Optional` **amount**: `string`
+
+Human readable format for the amount of tokens to transfer every time the FT key is used.
+Example: transferring one wNEAR should be passed in as "1" and NOT "1000000000000000000000000"
+
+#### Defined in
+
+[lib/types/ft.ts:17](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/ft.ts#L17)
+
+___
+
+### contractId
+
+ **contractId**: `string`
+
+Which contract do the FTs belong to?
+
+#### Defined in
+
+[lib/types/ft.ts:8](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/ft.ts#L8)
+
+___
+
+### senderId
+
+ `Optional` **senderId**: `string`
+
+By default, anyone can fund your drop with FTs. This field allows you to set a specific account ID that will be locked into sending the FTs.
+
+#### Defined in
+
+[lib/types/ft.ts:12](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/ft.ts#L12)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/Funder.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/Funder.md
new file mode 100644
index 00000000..6230c715
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/Funder.md
@@ -0,0 +1,75 @@
+---
+id: "Funder"
+title: "Interface: Funder"
+sidebar_label: "Funder"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Outlines how the structure of the *funder* object should be passed into `initKeypom` or `updateFunder`. This contains important information such as the
+secret key, account ID and any root entropy associated with the account.
+
+**`Throws`**
+
+if neither `secretKey` or `seedPhrase` are provided. One of these need to be passed in.
+
+## Properties
+
+### accountId
+
+ **accountId**: `string`
+
+The account ID of the funder that will be used to sign transactions.
+
+#### Defined in
+
+[lib/types/general.ts:35](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L35)
+
+___
+
+### fundingKeyPair
+
+ `Optional` **fundingKeyPair**: `KeyPair`
+
+#### Defined in
+
+[lib/types/general.ts:48](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L48)
+
+___
+
+### rootEntropy
+
+ `Optional` **rootEntropy**: `string`
+
+When interacting with the SDK, there are several places where KeyPairs can be generated automatically rather than you having to pass them in.
+For example, during `createDrop` and `addKeys`, if `publicKeys` isn't passed in, the SDK will generate `numKeys` number of keys automatically.
+These generated keys can either be completely random or deterministically generated based off some entropy. If `rootEntropy` is provided, all the
+keys that are auto-generated will be based off this entropy.
+
+#### Defined in
+
+[lib/types/general.ts:46](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L46)
+
+___
+
+### secretKey
+
+ `Optional` **secretKey**: `string`
+
+A valid private key associated with the funder's account. This can be function-call or full access (depending on what limitations and security measures are in place).
+
+#### Defined in
+
+[lib/types/general.ts:37](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L37)
+
+___
+
+### seedPhrase
+
+ `Optional` **seedPhrase**: `string`
+
+12 word seedphrase that can be used to derive the `secretKey`. If this is present, it will override the passed in `secretKey`.
+
+#### Defined in
+
+[lib/types/general.ts:39](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L39)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/FungibleTokenMetadata.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/FungibleTokenMetadata.md
new file mode 100644
index 00000000..184f02f1
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/FungibleTokenMetadata.md
@@ -0,0 +1,96 @@
+---
+id: "FungibleTokenMetadata"
+title: "Interface: FungibleTokenMetadata"
+sidebar_label: "FungibleTokenMetadata"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+General structure of Fungible Token Metadata as per official NEP-148 standard (https://github.com/near/NEPs/blob/master/neps/nep-0148.md).
+
+## Properties
+
+### decimals
+
+ **decimals**: `number`
+
+Used in frontends to show the proper significant digits of a token. This concept is explained well in this OpenZeppelin post (https://docs.openzeppelin.com/contracts/3.x/erc20#a-note-on-decimals).
+
+#### Defined in
+
+[lib/types/ft.ts:36](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/ft.ts#L36)
+
+___
+
+### icon
+
+ `Optional` **icon**: `string`
+
+A small image associated with this token. Must be a data URL, to help consumers display it quickly while protecting user data.
+Recommendation: use optimized SVG, which can result in high-resolution images with only 100s of bytes of storage cost.
+(Note that these storage costs are incurred to the token owner/deployer, but that querying these icons is a very cheap & cacheable read operation for all consumers of the contract and the RPC nodes that serve the data.)
+Recommendation: create icons that will work well with both light-mode and dark-mode websites by either using middle-tone color schemes, or by embedding media queries in the SVG.
+
+#### Defined in
+
+[lib/types/ft.ts:43](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/ft.ts#L43)
+
+___
+
+### name
+
+ **name**: `string`
+
+The human-readable name of the token.
+
+#### Defined in
+
+[lib/types/ft.ts:32](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/ft.ts#L32)
+
+___
+
+### reference
+
+ `Optional` **reference**: `string`
+
+A link to a valid JSON file containing various keys offering supplementary details on the token. Example: /ipfs/QmdmQXB2mzChmMeKY47C43LxUdg1NDJ5MWcKMKxDu7RgQm, https://example.com/token.json, etc. If the information given in this document conflicts with the on-chain attributes, the values in reference shall be considered the source of truth.
+
+#### Defined in
+
+[lib/types/ft.ts:45](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/ft.ts#L45)
+
+___
+
+### reference\_hash
+
+ `Optional` **reference\_hash**: `string`
+
+The base64-encoded sha256 hash of the JSON file contained in the reference field. This is to guard against off-chain tampering.
+
+#### Defined in
+
+[lib/types/ft.ts:47](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/ft.ts#L47)
+
+___
+
+### spec
+
+ **spec**: `string`
+
+A string. Should be ft-1.0.0 to indicate that a Fungible Token contract adheres to the current versions of this Metadata and the Fungible Token Core specs. This will allow consumers of the Fungible Token to know if they support the features of a given contract.
+
+#### Defined in
+
+[lib/types/ft.ts:30](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/ft.ts#L30)
+
+___
+
+### symbol
+
+ **symbol**: `string`
+
+The abbreviation, like wETH or AMPL.
+
+#### Defined in
+
+[lib/types/ft.ts:34](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/ft.ts#L34)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/GeneratedKeyPairs.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/GeneratedKeyPairs.md
new file mode 100644
index 00000000..adb8ab92
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/GeneratedKeyPairs.md
@@ -0,0 +1,46 @@
+---
+id: "GeneratedKeyPairs"
+title: "Interface: GeneratedKeyPairs"
+sidebar_label: "GeneratedKeyPairs"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+For each generated KeyPair (either through `createDrop`, `addKeys` or `generateKeys`), the public and private keys are returned.
+In addition, the actual KeyPair objects are returned as well.
+
+## Properties
+
+### keyPairs
+
+ **keyPairs**: `KeyPair`[]
+
+Actual KeyPair objects that can be used to sign messages, verify signatures, and get the public and private keys
+
+#### Defined in
+
+[lib/types/general.ts:20](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L20)
+
+___
+
+### publicKeys
+
+ **publicKeys**: `string`[]
+
+Set of public keys that were generated
+
+#### Defined in
+
+[lib/types/general.ts:22](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L22)
+
+___
+
+### secretKeys
+
+ **secretKeys**: `string`[]
+
+Set of private keys that were generated
+
+#### Defined in
+
+[lib/types/general.ts:24](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L24)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/KeyInfo.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/KeyInfo.md
new file mode 100644
index 00000000..4f60ca08
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/KeyInfo.md
@@ -0,0 +1,93 @@
+---
+id: "KeyInfo"
+title: "Interface: KeyInfo"
+sidebar_label: "KeyInfo"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Important information returned in many view calls regarding a specific access key.
+
+## Properties
+
+### allowance
+
+ **allowance**: `number`
+
+How much allowance does the key have left (measured in $yoctoNEAR). When the key is deleted, this is refunded to the funder's balance.
+
+#### Defined in
+
+[lib/types/drops.ts:25](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L25)
+
+___
+
+### curKeyUse
+
+ **curKeyUse**: `number`
+
+Which use is the key currently on? For single-use keys, this is always 1.
+
+#### Defined in
+
+[lib/types/drops.ts:16](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L16)
+
+___
+
+### dropId
+
+ **dropId**: `string`
+
+Drop ID for the specific drop that the key belongs to.
+
+#### Defined in
+
+[lib/types/drops.ts:11](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L11)
+
+___
+
+### keyId
+
+ **keyId**: `number`
+
+The unique ID associated to this key. IDs are *not* unique across drops but they are unique for any key in the drop.
+
+#### Defined in
+
+[lib/types/drops.ts:28](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L28)
+
+___
+
+### lastUsed
+
+ **lastUsed**: `number`
+
+At what timestamp was the key last used? Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/drops.ts:22](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L22)
+
+___
+
+### publicKey
+
+ **publicKey**: `string`
+
+Public key for this access key.
+
+#### Defined in
+
+[lib/types/drops.ts:13](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L13)
+
+___
+
+### remainingUses
+
+ **remainingUses**: `number`
+
+How many uses this key has left before it's deleted.
+
+#### Defined in
+
+[lib/types/drops.ts:19](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L19)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/Method.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/Method.md
new file mode 100644
index 00000000..475cd370
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/Method.md
@@ -0,0 +1,153 @@
+---
+id: "Method"
+title: "Interface: Method"
+sidebar_label: "Method"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Outlines the information needed for any given method as part of a Function-Call drop.
+Each individual key use can have an array of Methods that can be called.
+
+## Properties
+
+### accountIdField
+
+ `Optional` **accountIdField**: `string`
+
+Specifies what field Keypom should auto-inject the account that claimed the drop's ID into when calling the function.
+As an example, if the methodName was `nft_mint` and it expected a field `receiver_id` to be passed in, indicating who should receive the token, then the `accountIdField` would be `receiver_id`.
+To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field"
+
+#### Defined in
+
+[lib/types/fc.ts:34](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L34)
+
+___
+
+### args
+
+ **args**: `string`
+
+What arguments should be passed to the method. This should be in stringified JSON.
+
+#### Defined in
+
+[lib/types/fc.ts:19](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L19)
+
+___
+
+### attachedDeposit
+
+ **attachedDeposit**: `string`
+
+How much yoctoNEAR should be attached to the call.
+
+#### Defined in
+
+[lib/types/fc.ts:23](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L23)
+
+___
+
+### attachedGas
+
+ `Optional` **attachedGas**: `string`
+
+How much gas to attach to this method call. If none, all the gas is split between the parallel method calls in a given claim.
+If this is specified, the key can ONLY be used to call `claim` and no `deposit_per_use` can be specified. This leads the key to act like a method calling proxy instead of a linkdrop.
+
+#### Defined in
+
+[lib/types/fc.ts:28](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L28)
+
+___
+
+### dropIdField
+
+ `Optional` **dropIdField**: `string`
+
+Specifies what field Keypom should auto-inject the drops ID into when calling the function.
+As an example, if an NFT contract expected the Keypom drop ID to be passed in as the field `keypom_drop_id` in order to gate access to who can mint NFTs, then the `dropIdField` would be `keypom_drop_id`.
+To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field"
+
+#### Defined in
+
+[lib/types/fc.ts:40](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L40)
+
+___
+
+### funderIdField
+
+ `Optional` **funderIdField**: `string`
+
+Specifies what field Keypom should auto-inject the drop funder's account ID into when calling the function.
+As an example, if an NFT contract wanted to gate only users that had a key coming from a specific funder's drops, it could expect a field called `keypom_funder_id` and the `funderIdField` would be `keypom_funder_id`.
+To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field"
+
+#### Defined in
+
+[lib/types/fc.ts:52](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L52)
+
+___
+
+### keyIdField
+
+ `Optional` **keyIdField**: `string`
+
+Specifies what field Keypom should auto-inject the key's ID into when calling the function.
+As an example, if an NFT contract wanted to gate only users with an odd key ID to be able to mint an NFT and their parameter was called `keypom_key_id`, then the `keyIdField` would be `keypom_key_id`.
+To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field"
+
+#### Defined in
+
+[lib/types/fc.ts:46](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L46)
+
+___
+
+### methodName
+
+ **methodName**: `string`
+
+The method that should be invoked on the `receiverId`'s contract.
+
+#### Defined in
+
+[lib/types/fc.ts:15](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L15)
+
+___
+
+### receiverId
+
+ **receiverId**: `string`
+
+The account ID that the contract is deployed to that the method will be called on.
+
+#### Defined in
+
+[lib/types/fc.ts:11](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L11)
+
+___
+
+### receiverToClaimer
+
+ `Optional` **receiverToClaimer**: `boolean`
+
+If set to true, the claiming account ID will be the receiver ID of the method call.
+This receiver must be a valid account and non-malicious (cannot be set to the keypom contract)
+
+#### Defined in
+
+[lib/types/fc.ts:57](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L57)
+
+___
+
+### userArgsRule
+
+ `Optional` **userArgsRule**: ``"AllUser"`` \| ``"FunderPreferred"`` \| ``"UserPreferred"``
+
+What permissions does the user have when providing custom arguments to the function call?
+By default, the user cannot provide any custom arguments
+
+#### Defined in
+
+[lib/types/fc.ts:62](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L62)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/NFTData.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/NFTData.md
new file mode 100644
index 00000000..b16cde0b
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/NFTData.md
@@ -0,0 +1,47 @@
+---
+id: "NFTData"
+title: "Interface: NFTData"
+sidebar_label: "NFTData"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+General structure of a Non-Fungible Token drop. This should be passed into `createDrop` if you wish to have an NFT drop.
+
+## Properties
+
+### contractId
+
+ **contractId**: `string`
+
+The account ID that the NFT contract is deployed to. This contract is where all the NFTs for the specific drop must come from.
+
+#### Defined in
+
+[lib/types/nft.ts:6](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L6)
+
+___
+
+### senderId
+
+ `Optional` **senderId**: `string`
+
+By default, anyone can fund your drop with NFTs. This field allows you to set a specific account ID that will be locked into sending the NFTs.
+
+#### Defined in
+
+[lib/types/nft.ts:8](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L8)
+
+___
+
+### tokenIds
+
+ `Optional` **tokenIds**: `string`[]
+
+If there are any token IDs that you wish to be automatically sent to the Keypom contract in order to register keys as part of `createDrop`, specify them here.
+A maximum of 2 token IDs can be sent as part of the transaction. If you wish to register more keys by sending more NFTs, you must do this in a separate call by invoking
+the `nftTransferCall` method separately.
+
+#### Defined in
+
+[lib/types/nft.ts:14](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L14)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/NonFungibleTokenMetadata.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/NonFungibleTokenMetadata.md
new file mode 100644
index 00000000..1aff33fc
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/NonFungibleTokenMetadata.md
@@ -0,0 +1,153 @@
+---
+id: "NonFungibleTokenMetadata"
+title: "Interface: NonFungibleTokenMetadata"
+sidebar_label: "NonFungibleTokenMetadata"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+General structure of Non-Fungible Token Metadata (in camelCase) as per official NEP-177 standard (https://github.com/near/NEPs/blob/master/neps/nep-0177.md).
+
+## Properties
+
+### copies
+
+ `Optional` **copies**: `number`
+
+number of copies of this set of metadata in existence when token was minted.
+
+#### Defined in
+
+[lib/types/nft.ts:76](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L76)
+
+___
+
+### description
+
+ `Optional` **description**: `string`
+
+free-form description
+
+#### Defined in
+
+[lib/types/nft.ts:70](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L70)
+
+___
+
+### expiresAt
+
+ `Optional` **expiresAt**: `number`
+
+When token expires, Unix epoch in milliseconds
+
+#### Defined in
+
+[lib/types/nft.ts:80](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L80)
+
+___
+
+### extra
+
+ `Optional` **extra**: `string`
+
+anything extra the NFT wants to store on-chain. Can be stringified JSON.
+
+#### Defined in
+
+[lib/types/nft.ts:86](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L86)
+
+___
+
+### issuedAt
+
+ `Optional` **issuedAt**: `number`
+
+When token was issued or minted, Unix epoch in milliseconds
+
+#### Defined in
+
+[lib/types/nft.ts:78](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L78)
+
+___
+
+### media
+
+ `Optional` **media**: `string`
+
+URL to associated media, preferably to decentralized, content-addressed storage
+
+#### Defined in
+
+[lib/types/nft.ts:72](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L72)
+
+___
+
+### mediaHash
+
+ `Optional` **mediaHash**: `string`
+
+Base64-encoded sha256 hash of content referenced by the `media` field. Required if `media` is included.
+
+#### Defined in
+
+[lib/types/nft.ts:74](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L74)
+
+___
+
+### reference
+
+ `Optional` **reference**: `string`
+
+URL to an off-chain JSON file with more info.
+
+#### Defined in
+
+[lib/types/nft.ts:88](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L88)
+
+___
+
+### referenceHash
+
+ `Optional` **referenceHash**: `string`
+
+Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included.
+
+#### Defined in
+
+[lib/types/nft.ts:90](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L90)
+
+___
+
+### startsAt
+
+ `Optional` **startsAt**: `number`
+
+When token starts being valid, Unix epoch in milliseconds
+
+#### Defined in
+
+[lib/types/nft.ts:82](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L82)
+
+___
+
+### title
+
+ `Optional` **title**: `string`
+
+ex. "Arch Nemesis: Mail Carrier" or "Parcel #5055"
+
+#### Defined in
+
+[lib/types/nft.ts:68](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L68)
+
+___
+
+### updatedAt
+
+ `Optional` **updatedAt**: `number`
+
+When token was last updated, Unix epoch in milliseconds
+
+#### Defined in
+
+[lib/types/nft.ts:84](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L84)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/PasswordPerUse.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/PasswordPerUse.md
new file mode 100644
index 00000000..4d76ef2f
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/PasswordPerUse.md
@@ -0,0 +1,33 @@
+---
+id: "PasswordPerUse"
+title: "Interface: PasswordPerUse"
+sidebar_label: "PasswordPerUse"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Keeps track of the password for a given key use. This should be passed in as an array for each key that has passwords.
+
+## Properties
+
+### key\_use
+
+ **key\_use**: `number`
+
+Which use does the password belong to? These uses are *NOT* zero-indexed so the first use corresponds to `1` not `0`.
+
+#### Defined in
+
+[lib/types/drops.ts:196](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L196)
+
+___
+
+### pw
+
+ **pw**: `string`
+
+The password for this given use
+
+#### Defined in
+
+[lib/types/drops.ts:194](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L194)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedDrop.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedDrop.md
new file mode 100644
index 00000000..e1af40d1
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedDrop.md
@@ -0,0 +1,166 @@
+---
+id: "ProtocolReturnedDrop"
+title: "Interface: ProtocolReturnedDrop"
+sidebar_label: "ProtocolReturnedDrop"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Drop information returned from the Protocol. This interface is exactly the same as the `Drop`, except all the fields are
+snake cased instead of camel cased due to what the Protocol returns.
+
+## Properties
+
+### config
+
+ `Optional` **config**: [`ProtocolReturnedDropConfig`](ProtocolReturnedDropConfig.md)
+
+All drops regardless of their type can have a suite of configurations such as how many uses each key has or how often a key can be used.
+
+#### Defined in
+
+[lib/types/protocol.ts:49](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L49)
+
+___
+
+### deposit\_per\_use
+
+ **deposit\_per\_use**: `string`
+
+How much $yoctoNEAR will be transferred anytime a key is used that is part of this drop.
+
+#### Defined in
+
+[lib/types/protocol.ts:39](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L39)
+
+___
+
+### drop\_id
+
+ **drop\_id**: `string`
+
+Drop ID for this specific drop.
+
+#### Defined in
+
+[lib/types/protocol.ts:35](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L35)
+
+___
+
+### fc
+
+ `Optional` **fc**: [`ProtocolReturnedFCData`](ProtocolReturnedFCData.md)
+
+For Function-Call drops, important information needs to be stored such as which methods, the attached deposit, args etc.
+
+#### Defined in
+
+[lib/types/protocol.ts:47](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L47)
+
+___
+
+### ft
+
+ `Optional` **ft**: [`ProtocolReturnedFTData`](ProtocolReturnedFTData.md)
+
+For Fungible Token drops, important information such as the amount of tokens to transfer, or contract need to be stored.
+
+#### Defined in
+
+[lib/types/protocol.ts:45](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L45)
+
+___
+
+### keys
+
+ `Optional` **keys**: [`ProtocolReturnedKeyInfo`](ProtocolReturnedKeyInfo.md)[]
+
+If calling `getDrops` or `getDropInformation` and `withKeys` is passed in as true, an extra view call will be done to get a set of keys that are currently on the drop.
+
+#### Defined in
+
+[lib/types/protocol.ts:59](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L59)
+
+___
+
+### metadata
+
+ `Optional` **metadata**: `string`
+
+Any extra information about the drop can be stored as metadata. This is up to the drop creator and can be stringified JSON, or any other string.
+
+#### Defined in
+
+[lib/types/protocol.ts:51](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L51)
+
+___
+
+### next\_key\_id
+
+ **next\_key\_id**: `number`
+
+What is the next unique ID that will be given to the next access key added to this drop.
+
+#### Defined in
+
+[lib/types/protocol.ts:57](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L57)
+
+___
+
+### nft
+
+ `Optional` **nft**: [`ProtocolReturnedNFTData`](ProtocolReturnedNFTData.md)
+
+For NFT drops, important information such as the token IDs, or contract need to be stored.
+
+#### Defined in
+
+[lib/types/protocol.ts:43](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L43)
+
+___
+
+### owner\_id
+
+ **owner\_id**: `string`
+
+Which account created this drop.
+
+#### Defined in
+
+[lib/types/protocol.ts:37](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L37)
+
+___
+
+### registered\_uses
+
+ **registered\_uses**: `number`
+
+How many key uses are registered for this drop? This is only applicable to simple drops with lazy registrations, FT drops, and NFT drops.
+
+#### Defined in
+
+[lib/types/protocol.ts:53](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L53)
+
+___
+
+### required\_gas
+
+ **required\_gas**: `string`
+
+In order to use an access key that's part of this drop, how much Gas *needs* to be attached to the call?
+
+#### Defined in
+
+[lib/types/protocol.ts:55](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L55)
+
+___
+
+### simple
+
+ `Optional` **simple**: [`ProtocolReturnedSimpleData`](ProtocolReturnedSimpleData.md)
+
+For simple drops, there are specific, optional configurations.
+
+#### Defined in
+
+[lib/types/protocol.ts:41](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L41)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedDropConfig.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedDropConfig.md
new file mode 100644
index 00000000..aa4df5c3
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedDropConfig.md
@@ -0,0 +1,70 @@
+---
+id: "ProtocolReturnedDropConfig"
+title: "Interface: ProtocolReturnedDropConfig"
+sidebar_label: "ProtocolReturnedDropConfig"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Drop config returned from the Protocol. This interface is exactly the same as the `DropConfig`, except all the fields are
+snake cased instead of camel cased due to what the Protocol returns.
+
+## Properties
+
+### root\_account\_id
+
+ `Optional` **root\_account\_id**: `string`
+
+Override the global root account that all created sub-accounts will have (currently `near` or `testnet`). This allows users to drops that have a custom root.
+For example, Fayyr could specify a root of `fayyr.near` By which all sub-accounts will then be `ACCOUNT.fayyr.near`.
+It's important to note that this root account *MUST* have a smart contract deployed that has a method `create_account`.
+
+#### Defined in
+
+[lib/types/protocol.ts:83](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L83)
+
+___
+
+### sale
+
+ `Optional` **sale**: [`ProtocolReturnedPublicSaleConfig`](ProtocolReturnedPublicSaleConfig.md)
+
+#### Defined in
+
+[lib/types/protocol.ts:76](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L76)
+
+___
+
+### time
+
+ `Optional` **time**: [`ProtocolReturnedTimeConfig`](ProtocolReturnedTimeConfig.md)
+
+Any information related to time-based configurations such as a starting date for keys etc.
+
+#### Defined in
+
+[lib/types/protocol.ts:71](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L71)
+
+___
+
+### usage
+
+ `Optional` **usage**: [`ProtocolReturnedUsageConfig`](ProtocolReturnedUsageConfig.md)
+
+Any information related to how access keys are used such as which methods they can call or whether an empty drop should be automatically deleted etc.
+
+#### Defined in
+
+[lib/types/protocol.ts:74](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L74)
+
+___
+
+### uses\_per\_key
+
+ `Optional` **uses\_per\_key**: `number`
+
+How many uses can each key have before it's deleted. If this isn't specified, it defaults to 1 use per key.
+
+#### Defined in
+
+[lib/types/protocol.ts:68](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L68)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedFCData.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedFCData.md
new file mode 100644
index 00000000..34d8c655
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedFCData.md
@@ -0,0 +1,23 @@
+---
+id: "ProtocolReturnedFCData"
+title: "Interface: ProtocolReturnedFCData"
+sidebar_label: "ProtocolReturnedFCData"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+FC Data returned from the Protocol. This interface is exactly the same as the `FCData`, except all the fields are
+snake cased instead of camel cased due to what the Protocol returns.
+
+## Properties
+
+### methods
+
+ **methods**: [`ProtocolReturnedMethod`](ProtocolReturnedMethod.md)[][]
+
+The top level array indicates a different set of methods that can be called for every key use. It is possible that for a given key use, no methods are called thus acting as a "free" key use whereby the use is reflected on-chain but no assets are transferred.
+If a given key use does not have an undefined set of methods, when it is used, all the methods in the set will be called.
+
+#### Defined in
+
+[lib/types/protocol.ts:300](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L300)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedFTData.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedFTData.md
new file mode 100644
index 00000000..be0e8340
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedFTData.md
@@ -0,0 +1,47 @@
+---
+id: "ProtocolReturnedFTData"
+title: "Interface: ProtocolReturnedFTData"
+sidebar_label: "ProtocolReturnedFTData"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+FT Data returned from the Protocol. This interface is exactly the same as the `FTData`, except all the fields are
+snake cased instead of camel cased due to what the Protocol returns.
+
+## Properties
+
+### balance\_per\_use
+
+ `Optional` **balance\_per\_use**: `string`
+
+Amount of tokens to transfer but considering the decimal amount.
+Example: transferring one wNEAR should be passed in as "1000000000000000000000000" and NOT "1"
+
+#### Defined in
+
+[lib/types/protocol.ts:226](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L226)
+
+___
+
+### contract\_id
+
+ **contract\_id**: `string`
+
+Which contract do the FTs belong to?
+
+#### Defined in
+
+[lib/types/protocol.ts:217](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L217)
+
+___
+
+### sender\_id
+
+ `Optional` **sender\_id**: `string`
+
+By default, anyone can fund your drop with FTs. This field allows you to set a specific account ID that will be locked into sending the FTs.
+
+#### Defined in
+
+[lib/types/protocol.ts:221](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L221)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedKeyInfo.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedKeyInfo.md
new file mode 100644
index 00000000..fc5551be
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedKeyInfo.md
@@ -0,0 +1,94 @@
+---
+id: "ProtocolReturnedKeyInfo"
+title: "Interface: ProtocolReturnedKeyInfo"
+sidebar_label: "ProtocolReturnedKeyInfo"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Key information returned from the Protocol. This interface is exactly the same as the `KeyInfo`, except all the fields are
+snake cased instead of camel cased due to what the Protocol returns.
+
+## Properties
+
+### allowance
+
+ **allowance**: `number`
+
+How much allowance does the key have left (measured in $yoctoNEAR). When the key is deleted, this is refunded to the funder's balance.
+
+#### Defined in
+
+[lib/types/protocol.ts:23](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L23)
+
+___
+
+### cur\_key\_use
+
+ **cur\_key\_use**: `number`
+
+Which use is the key currently on? For single-use keys, this is always 1.
+
+#### Defined in
+
+[lib/types/protocol.ts:14](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L14)
+
+___
+
+### drop\_id
+
+ **drop\_id**: `string`
+
+Drop ID for the specific drop that the key belongs to.
+
+#### Defined in
+
+[lib/types/protocol.ts:9](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L9)
+
+___
+
+### key\_id
+
+ **key\_id**: `number`
+
+The unique ID associated to this key. IDs are *not* unique across drops but they are unique for any key in the drop.
+
+#### Defined in
+
+[lib/types/protocol.ts:26](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L26)
+
+___
+
+### last\_used
+
+ **last\_used**: `number`
+
+At what timestamp was the key last used? Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/protocol.ts:20](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L20)
+
+___
+
+### public\_key
+
+ **public\_key**: `string`
+
+Public key for this access key.
+
+#### Defined in
+
+[lib/types/protocol.ts:11](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L11)
+
+___
+
+### remaining\_uses
+
+ **remaining\_uses**: `number`
+
+How many uses this key has left before it's deleted.
+
+#### Defined in
+
+[lib/types/protocol.ts:17](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L17)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedMethod.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedMethod.md
new file mode 100644
index 00000000..0746a1e0
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedMethod.md
@@ -0,0 +1,153 @@
+---
+id: "ProtocolReturnedMethod"
+title: "Interface: ProtocolReturnedMethod"
+sidebar_label: "ProtocolReturnedMethod"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Method information returned from the Protocol. This interface is exactly the same as the `Method`, except all the fields are
+snake cased instead of camel cased due to what the Protocol returns.
+
+## Properties
+
+### account\_id\_field
+
+ `Optional` **account\_id\_field**: `string`
+
+Specifies what field Keypom should auto-inject the account that claimed the drop's ID into when calling the function.
+As an example, if the methodName was `nft_mint` and it expected a field `receiver_id` to be passed in, indicating who should receive the token, then the `accountIdField` would be `receiver_id`.
+To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field"
+
+#### Defined in
+
+[lib/types/protocol.ts:260](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L260)
+
+___
+
+### args
+
+ **args**: `string`
+
+What arguments should be passed to the method. This should be in stringified JSON.
+
+#### Defined in
+
+[lib/types/protocol.ts:245](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L245)
+
+___
+
+### attached\_deposit
+
+ **attached\_deposit**: `string`
+
+How much yoctoNEAR should be attached to the call.
+
+#### Defined in
+
+[lib/types/protocol.ts:249](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L249)
+
+___
+
+### attached\_gas
+
+ `Optional` **attached\_gas**: `string`
+
+How much gas to attach to this method call. If none, all the gas is split between the parallel method calls in a given claim.
+If this is specified, the key can ONLY be used to call `claim` and no `deposit_per_use` can be specified. This leads the key to act like a method calling proxy instead of a linkdrop.
+
+#### Defined in
+
+[lib/types/protocol.ts:254](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L254)
+
+___
+
+### drop\_id\_field
+
+ `Optional` **drop\_id\_field**: `string`
+
+Specifies what field Keypom should auto-inject the drops ID into when calling the function.
+As an example, if an NFT contract expected the Keypom drop ID to be passed in as the field `keypom_drop_id` in order to gate access to who can mint NFTs, then the `dropIdField` would be `keypom_drop_id`.
+To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field"
+
+#### Defined in
+
+[lib/types/protocol.ts:266](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L266)
+
+___
+
+### funder\_id\_field
+
+ `Optional` **funder\_id\_field**: `string`
+
+Specifies what field Keypom should auto-inject the funder's account ID into when calling the function.
+As an example, if an NFT contract wanted to gate only users with an odd key ID to be able to mint an NFT and their parameter was called `keypom_key_id`, then the `keyIdField` would be `keypom_key_id`.
+To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field"
+
+#### Defined in
+
+[lib/types/protocol.ts:278](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L278)
+
+___
+
+### key\_id\_field
+
+ `Optional` **key\_id\_field**: `string`
+
+Specifies what field Keypom should auto-inject the key's ID into when calling the function.
+As an example, if an NFT contract wanted to gate only users with an odd key ID to be able to mint an NFT and their parameter was called `keypom_key_id`, then the `keyIdField` would be `keypom_key_id`.
+To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field"
+
+#### Defined in
+
+[lib/types/protocol.ts:272](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L272)
+
+___
+
+### method\_name
+
+ **method\_name**: `string`
+
+The method that should be invoked on the `receiverId`'s contract.
+
+#### Defined in
+
+[lib/types/protocol.ts:241](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L241)
+
+___
+
+### receiver\_id
+
+ **receiver\_id**: `string`
+
+The account ID that the contract is deployed to that the method will be called on.
+
+#### Defined in
+
+[lib/types/protocol.ts:237](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L237)
+
+___
+
+### receiver\_to\_claimer
+
+ `Optional` **receiver\_to\_claimer**: `boolean`
+
+If set to true, the claiming account ID will be the receiver ID of the method call.
+This receiver must be a valid account and non-malicious (cannot be set to the keypom contract)
+
+#### Defined in
+
+[lib/types/protocol.ts:283](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L283)
+
+___
+
+### user\_args\_rule
+
+ `Optional` **user\_args\_rule**: ``"AllUser"`` \| ``"FunderPreferred"`` \| ``"UserPreferred"``
+
+What permissions does the user have when providing custom arguments to the function call?
+By default, the user cannot provide any custom arguments
+
+#### Defined in
+
+[lib/types/protocol.ts:288](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L288)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedNFTData.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedNFTData.md
new file mode 100644
index 00000000..1f809b8b
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedNFTData.md
@@ -0,0 +1,34 @@
+---
+id: "ProtocolReturnedNFTData"
+title: "Interface: ProtocolReturnedNFTData"
+sidebar_label: "ProtocolReturnedNFTData"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+NFT Data information returned from the Protocol. This interface is exactly the same as the `NFTData`, except all the fields are
+snake cased instead of camel cased due to what the Protocol returns.
+
+## Properties
+
+### contract\_id
+
+ **contract\_id**: `string`
+
+The account ID that the NFT contract is deployed to. This contract is where all the NFTs for the specific drop must come from.
+
+#### Defined in
+
+[lib/types/protocol.ts:204](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L204)
+
+___
+
+### sender\_id
+
+ `Optional` **sender\_id**: `string`
+
+By default, anyone can fund your drop with NFTs. This field allows you to set a specific account ID that will be locked into sending the NFTs.
+
+#### Defined in
+
+[lib/types/protocol.ts:206](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L206)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedNonFungibleTokenMetadata.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedNonFungibleTokenMetadata.md
new file mode 100644
index 00000000..1460ffac
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedNonFungibleTokenMetadata.md
@@ -0,0 +1,153 @@
+---
+id: "ProtocolReturnedNonFungibleTokenMetadata"
+title: "Interface: ProtocolReturnedNonFungibleTokenMetadata"
+sidebar_label: "ProtocolReturnedNonFungibleTokenMetadata"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+General structure of Non-Fungible Token Metadata as per official NEP-177 standard (https://github.com/near/NEPs/blob/master/neps/nep-0177.md).
+
+## Properties
+
+### copies
+
+ `Optional` **copies**: `number`
+
+number of copies of this set of metadata in existence when token was minted.
+
+#### Defined in
+
+[lib/types/nft.ts:46](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L46)
+
+___
+
+### description
+
+ `Optional` **description**: `string`
+
+free-form description
+
+#### Defined in
+
+[lib/types/nft.ts:40](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L40)
+
+___
+
+### expires\_at
+
+ `Optional` **expires\_at**: `number`
+
+When token expires, Unix epoch in milliseconds
+
+#### Defined in
+
+[lib/types/nft.ts:50](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L50)
+
+___
+
+### extra
+
+ `Optional` **extra**: `string`
+
+anything extra the NFT wants to store on-chain. Can be stringified JSON.
+
+#### Defined in
+
+[lib/types/nft.ts:56](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L56)
+
+___
+
+### issued\_at
+
+ `Optional` **issued\_at**: `number`
+
+When token was issued or minted, Unix epoch in milliseconds
+
+#### Defined in
+
+[lib/types/nft.ts:48](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L48)
+
+___
+
+### media
+
+ `Optional` **media**: `string`
+
+URL to associated media, preferably to decentralized, content-addressed storage
+
+#### Defined in
+
+[lib/types/nft.ts:42](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L42)
+
+___
+
+### media\_hash
+
+ `Optional` **media\_hash**: `string`
+
+Base64-encoded sha256 hash of content referenced by the `media` field. Required if `media` is included.
+
+#### Defined in
+
+[lib/types/nft.ts:44](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L44)
+
+___
+
+### reference
+
+ `Optional` **reference**: `string`
+
+URL to an off-chain JSON file with more info.
+
+#### Defined in
+
+[lib/types/nft.ts:58](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L58)
+
+___
+
+### reference\_hash
+
+ `Optional` **reference\_hash**: `string`
+
+Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included.
+
+#### Defined in
+
+[lib/types/nft.ts:60](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L60)
+
+___
+
+### starts\_at
+
+ `Optional` **starts\_at**: `number`
+
+When token starts being valid, Unix epoch in milliseconds
+
+#### Defined in
+
+[lib/types/nft.ts:52](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L52)
+
+___
+
+### title
+
+ `Optional` **title**: `string`
+
+ex. "Arch Nemesis: Mail Carrier" or "Parcel #5055"
+
+#### Defined in
+
+[lib/types/nft.ts:38](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L38)
+
+___
+
+### updated\_at
+
+ `Optional` **updated\_at**: `number`
+
+When token was last updated, Unix epoch in milliseconds
+
+#### Defined in
+
+[lib/types/nft.ts:54](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L54)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedNonFungibleTokenObject.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedNonFungibleTokenObject.md
new file mode 100644
index 00000000..6170554a
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedNonFungibleTokenObject.md
@@ -0,0 +1,69 @@
+---
+id: "ProtocolReturnedNonFungibleTokenObject"
+title: "Interface: ProtocolReturnedNonFungibleTokenObject"
+sidebar_label: "ProtocolReturnedNonFungibleTokenObject"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+General structure of a Non-Fungible Token object as per official NEP-171 standard (https://github.com/near/NEPs/blob/master/neps/nep-0171.md).
+
+## Properties
+
+### approved\_account\_ids
+
+ `Optional` **approved\_account\_ids**: `Map`<`string`, `number`\>
+
+Map of account IDs to approval IDs as per official NEP-178 standard (https://github.com/near/NEPs/blob/master/neps/nep-0178.md).
+
+#### Defined in
+
+[lib/types/nft.ts:28](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L28)
+
+___
+
+### metadata
+
+ `Optional` **metadata**: [`ProtocolReturnedNonFungibleTokenMetadata`](ProtocolReturnedNonFungibleTokenMetadata.md)
+
+Metadata for the token
+
+#### Defined in
+
+[lib/types/nft.ts:26](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L26)
+
+___
+
+### owner\_id
+
+ **owner\_id**: `string`
+
+Account ID of the owner
+
+#### Defined in
+
+[lib/types/nft.ts:24](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L24)
+
+___
+
+### royalty
+
+ `Optional` **royalty**: `Map`<`string`, `number`\>
+
+A mapping of NEAR accounts to the amount each should be paid out as per official NEP-199 standard (https://github.com/near/NEPs/blob/master/neps/nep-0199.md).
+
+#### Defined in
+
+[lib/types/nft.ts:30](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L30)
+
+___
+
+### token\_id
+
+ **token\_id**: `string`
+
+String ID for the token
+
+#### Defined in
+
+[lib/types/nft.ts:22](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L22)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedPublicSaleConfig.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedPublicSaleConfig.md
new file mode 100644
index 00000000..936dcc77
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedPublicSaleConfig.md
@@ -0,0 +1,97 @@
+---
+id: "ProtocolReturnedPublicSaleConfig"
+title: "Interface: ProtocolReturnedPublicSaleConfig"
+sidebar_label: "ProtocolReturnedPublicSaleConfig"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Within the config, there are configurable options related to how keys can be sold and a funder can potentially make a profit.
+
+## Properties
+
+### allowlist
+
+ `Optional` **allowlist**: `string`[]
+
+Which accounts are allowed to add keys? If the allowlist is empty, anyone that is not in the blocklist can add keys.
+
+#### Defined in
+
+[lib/types/protocol.ts:173](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L173)
+
+___
+
+### auto\_withdraw\_funds
+
+ `Optional` **auto\_withdraw\_funds**: `boolean`
+
+Should the revenue generated be sent to the funder's account balance or
+automatically withdrawn and sent to their NEAR wallet?
+
+#### Defined in
+
+[lib/types/protocol.ts:180](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L180)
+
+___
+
+### blocklist
+
+ `Optional` **blocklist**: `string`[]
+
+Which accounts are NOT allowed to add keys?
+
+#### Defined in
+
+[lib/types/protocol.ts:175](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L175)
+
+___
+
+### end
+
+ `Optional` **end**: `number`
+
+Block timestamp dictating the end of the public sale. If None, keys can be added indefinitely
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/protocol.ts:190](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L190)
+
+___
+
+### max\_num\_keys
+
+ `Optional` **max\_num\_keys**: `number`
+
+Maximum number of keys that can be added to this drop. If None, there is no max.
+
+#### Defined in
+
+[lib/types/protocol.ts:166](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L166)
+
+___
+
+### price\_per\_key
+
+ `Optional` **price\_per\_key**: `string`
+
+Amount of $NEAR that the user needs to attach (if they are not the funder) on top of costs. This amount will be
+Automatically sent to the funder's balance. If None, the keys are free to the public.
+
+#### Defined in
+
+[lib/types/protocol.ts:171](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L171)
+
+___
+
+### start
+
+ `Optional` **start**: `number`
+
+Minimum block timestamp before the public sale starts. If None, keys can be added immediately
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/protocol.ts:185](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L185)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedSimpleData.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedSimpleData.md
new file mode 100644
index 00000000..9b62136b
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedSimpleData.md
@@ -0,0 +1,17 @@
+---
+id: "ProtocolReturnedSimpleData"
+title: "Interface: ProtocolReturnedSimpleData"
+sidebar_label: "ProtocolReturnedSimpleData"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+## Properties
+
+### lazy\_register
+
+ `Optional` **lazy\_register**: `boolean`
+
+#### Defined in
+
+[lib/types/protocol.ts:195](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L195)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedTimeConfig.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedTimeConfig.md
new file mode 100644
index 00000000..0d0eeb09
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedTimeConfig.md
@@ -0,0 +1,63 @@
+---
+id: "ProtocolReturnedTimeConfig"
+title: "Interface: ProtocolReturnedTimeConfig"
+sidebar_label: "ProtocolReturnedTimeConfig"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Time Config information returned from the Protocol. This interface is exactly the same as the `TimeConfig`, except all the fields are
+snake cased instead of camel cased due to what the Protocol returns.
+
+## Properties
+
+### end
+
+ `Optional` **end**: `number`
+
+Block timestamp that keys must be used before. If this isn't specified, keys can be used indefinitely.
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/protocol.ts:101](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L101)
+
+___
+
+### interval
+
+ `Optional` **interval**: `number`
+
+Interval of time after the `start_timestamp` that must pass before a key can be used. If multiple intervals pass, the key can be used multiple times.
+This has nothing to do With the throttle timestamp. It only pertains to the start timestamp and the current timestamp. The last_used timestamp is not taken into account.
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/protocol.ts:114](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L114)
+
+___
+
+### start
+
+ `Optional` **start**: `number`
+
+Minimum block timestamp before keys can be used. If this isn't specified, keys can be used immediately.
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/protocol.ts:95](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L95)
+
+___
+
+### throttle
+
+ `Optional` **throttle**: `number`
+
+Amount of time that *must* pass in between each key use. If this isn't specified, there is no delay between key uses.
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/protocol.ts:107](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L107)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedUsageConfig.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedUsageConfig.md
new file mode 100644
index 00000000..5fc090bd
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedUsageConfig.md
@@ -0,0 +1,80 @@
+---
+id: "ProtocolReturnedUsageConfig"
+title: "Interface: ProtocolReturnedUsageConfig"
+sidebar_label: "ProtocolReturnedUsageConfig"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Usage Config information returned from the Protocol. This interface is exactly the same as the `UsageConfig`, except all the fields are
+snake cased instead of camel cased due to what the Protocol returns.
+
+## Properties
+
+### account\_creation\_fields
+
+ `Optional` **account\_creation\_fields**: `Object`
+
+When calling `create_account` on the root account, which keypom args should be attached to the payload.
+
+#### Type declaration
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `account_id_field?` | `string` | Specifies what field Keypom should auto-inject the account that claimed the drop's ID into when calling the `create_account` function. |
+| `drop_id_field?` | `string` | Specifies what field Keypom should auto-inject the drop's ID into when calling the `create_account` function. |
+| `funder_id_field?` | `string` | Specifies what field Keypom should auto-inject the drop funder's account ID into when calling the `create_account` function. |
+| `key_id_field?` | `string` | Specifies what field Keypom should auto-inject the key's ID into when calling the `create_account` function. |
+
+#### Defined in
+
+[lib/types/protocol.ts:141](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L141)
+
+___
+
+### auto\_delete\_drop
+
+ `Optional` **auto\_delete\_drop**: `boolean`
+
+When a key is used and deleted, if it results in the drop being empty, should the drop automatically be deleted? If this isn't specified, it defaults to false.
+
+#### Defined in
+
+[lib/types/protocol.ts:134](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L134)
+
+___
+
+### auto\_withdraw
+
+ `Optional` **auto\_withdraw**: `boolean`
+
+In the case where `autoDeleteDrop` is set to true and the drop is the owner's last, should their balance be automatically withdrawn? If this isn't specified, it defaults to false.
+
+#### Defined in
+
+[lib/types/protocol.ts:138](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L138)
+
+___
+
+### permissions
+
+ `Optional` **permissions**: `string`
+
+Specify which methods can be called by the access key (either `claim` or `create_account_and_claim`). If this isn't specified, both methods can be called.
+
+#### Defined in
+
+[lib/types/protocol.ts:125](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L125)
+
+___
+
+### refund\_deposit
+
+ `Optional` **refund\_deposit**: `boolean`
+
+If the method `claim` is called rather than `create_account_and_claim`, should the `deposit_per_use` be refunded to the owner's balance?
+If this isn't specified, it defaults to false.
+
+#### Defined in
+
+[lib/types/protocol.ts:130](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L130)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/PublicSaleConfig.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/PublicSaleConfig.md
new file mode 100644
index 00000000..2f2fe27f
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/PublicSaleConfig.md
@@ -0,0 +1,107 @@
+---
+id: "PublicSaleConfig"
+title: "Interface: PublicSaleConfig"
+sidebar_label: "PublicSaleConfig"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Within the config, there are configurable options related to how keys can be sold and a funder can potentially make a profit.
+
+## Properties
+
+### allowlist
+
+ `Optional` **allowlist**: `string`[]
+
+Which accounts are allowed to add keys? If the allowlist is empty, anyone that is not in the blocklist can add keys.
+
+#### Defined in
+
+[lib/types/drops.ts:169](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L169)
+
+___
+
+### autoWithdrawFunds
+
+ `Optional` **autoWithdrawFunds**: `boolean`
+
+Should the revenue generated be sent to the funder's account balance or
+automatically withdrawn and sent to their NEAR wallet?
+
+#### Defined in
+
+[lib/types/drops.ts:176](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L176)
+
+___
+
+### blocklist
+
+ `Optional` **blocklist**: `string`[]
+
+Which accounts are NOT allowed to add keys?
+
+#### Defined in
+
+[lib/types/drops.ts:171](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L171)
+
+___
+
+### end
+
+ `Optional` **end**: `number`
+
+Block timestamp dictating the end of the public sale. If None, keys can be added indefinitely
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/drops.ts:186](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L186)
+
+___
+
+### maxNumKeys
+
+ `Optional` **maxNumKeys**: `number`
+
+Maximum number of keys that can be added to this drop. If None, there is no max.
+
+#### Defined in
+
+[lib/types/drops.ts:161](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L161)
+
+___
+
+### pricePerKeyNEAR
+
+ `Optional` **pricePerKeyNEAR**: `number`
+
+Amount of $NEAR that the user needs to attach (if they are not the funder) on top of costs. This amount will be
+Automatically sent to the funder's balance. If None, the keys are free to the public.
+
+#### Defined in
+
+[lib/types/drops.ts:166](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L166)
+
+___
+
+### pricePerKeyYocto
+
+ `Optional` **pricePerKeyYocto**: `string`
+
+#### Defined in
+
+[lib/types/drops.ts:167](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L167)
+
+___
+
+### start
+
+ `Optional` **start**: `number`
+
+Minimum block timestamp before the public sale starts. If None, keys can be added immediately
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/drops.ts:181](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L181)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/SimpleData.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/SimpleData.md
new file mode 100644
index 00000000..ea3cb6fb
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/SimpleData.md
@@ -0,0 +1,21 @@
+---
+id: "SimpleData"
+title: "Interface: SimpleData"
+sidebar_label: "SimpleData"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Specific configurable information for Simple drops.
+
+## Properties
+
+### lazyRegister
+
+ `Optional` **lazyRegister**: `boolean`
+
+If this is set to true, keys can be created and registered AFTER they've been created (for simple and FC drops only).
+
+#### Defined in
+
+[lib/types/simple.ts:6](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/simple.ts#L6)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/TimeConfig.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/TimeConfig.md
new file mode 100644
index 00000000..ac76a265
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/TimeConfig.md
@@ -0,0 +1,62 @@
+---
+id: "TimeConfig"
+title: "Interface: TimeConfig"
+sidebar_label: "TimeConfig"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Within the config, there are configurable options related to timing such as how often a key can be used.
+
+## Properties
+
+### end
+
+ `Optional` **end**: `number`
+
+Block timestamp that keys must be used before. If this isn't specified, keys can be used indefinitely.
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/drops.ts:98](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L98)
+
+___
+
+### interval
+
+ `Optional` **interval**: `number`
+
+Interval of time after the `start_timestamp` that must pass before a key can be used. If multiple intervals pass, the key can be used multiple times.
+This has nothing to do With the throttle timestamp. It only pertains to the start timestamp and the current timestamp. The last_used timestamp is not taken into account.
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/drops.ts:111](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L111)
+
+___
+
+### start
+
+ `Optional` **start**: `number`
+
+Minimum block timestamp before keys can be used. If this isn't specified, keys can be used immediately.
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/drops.ts:92](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L92)
+
+___
+
+### throttle
+
+ `Optional` **throttle**: `number`
+
+Amount of time that *must* pass in between each key use. If this isn't specified, there is no delay between key uses.
+Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC.
+
+#### Defined in
+
+[lib/types/drops.ts:104](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L104)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/UsageConfig.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/UsageConfig.md
new file mode 100644
index 00000000..e86b592d
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/UsageConfig.md
@@ -0,0 +1,79 @@
+---
+id: "UsageConfig"
+title: "Interface: UsageConfig"
+sidebar_label: "UsageConfig"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+Within the config, there are configurable options related to how keys can be used. What permissions they have, whether an empty drop should be automatically deleted etc.
+
+## Properties
+
+### accountCreationFields
+
+ `Optional` **accountCreationFields**: `Object`
+
+When calling `create_account` on the root account, which keypom args should be attached to the payload.
+
+#### Type declaration
+
+| Name | Type | Description |
+| :------ | :------ | :------ |
+| `accountIdField?` | `string` | Specifies what field Keypom should auto-inject the account that claimed the drop's ID into when calling the `create_account` function. |
+| `dropIdField?` | `string` | Specifies what field Keypom should auto-inject the drop's ID into when calling the `create_account` function. |
+| `funderIdField?` | `string` | Specifies what field Keypom should auto-inject the drop funder's account ID into when calling the `create_account` function. |
+| `keyIdField?` | `string` | Specifies what field Keypom should auto-inject the key's ID into when calling the `create_account` function. |
+
+#### Defined in
+
+[lib/types/drops.ts:136](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L136)
+
+___
+
+### autoDeleteDrop
+
+ `Optional` **autoDeleteDrop**: `boolean`
+
+When a key is used and deleted, if it results in the drop being empty, should the drop automatically be deleted? If this isn't specified, it defaults to false.
+
+#### Defined in
+
+[lib/types/drops.ts:130](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L130)
+
+___
+
+### autoWithdraw
+
+ `Optional` **autoWithdraw**: `boolean`
+
+When the last key in this drop is used, in the case where `autoDeleteDrop` is set to true and the drop is the owner's last, should their balance be automatically withdrawn? If this isn't specified, it defaults to false.
+
+#### Defined in
+
+[lib/types/drops.ts:134](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L134)
+
+___
+
+### permissions
+
+ `Optional` **permissions**: `string`
+
+Specify which methods can be called by the access key (either `claim` or `create_account_and_claim`). If this isn't specified, both methods can be called.
+
+#### Defined in
+
+[lib/types/drops.ts:121](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L121)
+
+___
+
+### refundDeposit
+
+ `Optional` **refundDeposit**: `boolean`
+
+If the method `claim` is called rather than `create_account_and_claim`, should the `deposit_per_use` be refunded to the owner's balance?
+If this isn't specified, it defaults to false.
+
+#### Defined in
+
+[lib/types/drops.ts:126](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L126)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/_category_.yml b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/_category_.yml
new file mode 100644
index 00000000..43bec88c
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/_category_.yml
@@ -0,0 +1,2 @@
+label: "Interfaces"
+position: 4
\ No newline at end of file
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/modules.md b/versioned_docs/version-2.0/keypom-sdk/Selector/modules.md
new file mode 100644
index 00000000..2dd4129f
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/modules.md
@@ -0,0 +1,31 @@
+---
+id: "modules"
+title: "@keypom/selector - v1.2.0"
+sidebar_label: "Exports"
+sidebar_position: 0.5
+custom_edit_url: null
+---
+
+## Classes
+
+- [KeypomWallet](classes/KeypomWallet.md)
+
+## Functions
+
+### setupKeypom
+
+**setupKeypom**(`ยซdestructuredยป`): `WalletModuleFactory`<`KeypomWalletInstant`\>
+
+#### Parameters
+
+| Name | Type |
+| :------ | :------ |
+| `ยซdestructuredยป` | `KeypomParams` |
+
+#### Returns
+
+`WalletModuleFactory`<`KeypomWalletInstant`\>
+
+#### Defined in
+
+[core/setup.ts:92](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/setup.ts#L92)
diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/welcome.md b/versioned_docs/version-2.0/keypom-sdk/Selector/welcome.md
new file mode 100644
index 00000000..27dff653
--- /dev/null
+++ b/versioned_docs/version-2.0/keypom-sdk/Selector/welcome.md
@@ -0,0 +1,407 @@
+---
+id: "welcome"
+title: "@keypom/selector - v1.2.0"
+sidebar_label: "Readme"
+sidebar_position: 0
+custom_edit_url: null
+---
+
+
+
+
+
+
+ Keypom Wallet Selector
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+The Keypom Wallet Selector is a package that allows apps to be fully compatible with both trial accounts and instant sign in experiences. See the following demos for examples of the user experience.
+- Instant Sign-In [Demo](https://www.youtube.com/watch?v=p_NOcYbRlJw&feature=youtu.be)
+- Trial Account [Demo](https://www.youtube.com/watch?v=p_NOcYbRlJw)
+
+# Table of Contents
+- [Table of Contents](#table-of-contents)
+- [Installation](#installation)
+- [Getting Started](#getting-started)
+ - [Setup Keypom Parameters](#setup-keypom-parameters)
+ - [IPFS Customizations](#ipfs-customizations)
+- [Keypom Trial Accounts](#keypom-trial-accounts)
+ - [Trial Account Specs](#trial-account-specs)
+ - [Modal Options](#modal-options)
+ - [Wallets](#wallets)
+ - [Theme And CSS](#theme-and-css)
+ - [Modal Text](#modal-text)
+ - [Example Trial Account Integration](#example-trial-account-integration)
+- [Keypom Instant Sign In Experiences](#keypom-instant-sign-in-experiences)
+ - [Instant Sign In Specs](#instant-sign-in-specs)
+- [Contributing](#contributing)
+- [License](#license)
+
+---
+
+# Installation
+
+To install the Keypom Wallet Selector, run the following command:
+
+```bash
+npm install @keypom/selector
+# or
+yarn add @keypom/selector
+# or
+pnpm add @keypom/selector
+```
+
+# Getting Started
+
+Most apps on NEAR should be compatible with the official [wallet selector](https://github.com/near/wallet-selector) to enable sign-in and sending transactions. For this reason, the Keypom selector has been made to fully support any app that uses the wallet selector.
+
+To get started, navigate to the app's `setupWalletSelector` code where the selector is initialized. Here, you can specify which wallet modules your app should support. Simply add Keypom's `setupKeypom` function to the list of modules and you're good to go!
+
+```js
+const selector = await setupWalletSelector({
+ network: "testnet",
+ modules: [
+ setupMyNearWallet(),
+ ...
+ setupSender(),
+ setupKeypom(PARAMS)
+ ],
+});
+```
+
+## Setup Keypom Parameters
+
+`setupKeypom` is the core of the Keypom wallet selector and is the only function you should know about. There are a ton of customizable features that you can make use of to tailor the user experience to your app's needs. At its core, the setup function takes the following parameters:
+
+- `networkId`: Either `testnet` or `mainnet`.
+- `signInContractId`: Which contract will be used to sign in users.
+- `trialAccountSpecs`: If specified, trial accounts will be supported on the app. These specifications outline two aspects:
+ 1. How the URL should be constructed for the app to trigger the trial account sign in flow.
+ 2. Customizable options for the trial account modals including *all* the text such as titles, descriptions, buttons, placeholders etc. In addition, you can specify exactly which off-boarding wallets you'd like to support.
+- `instantSignInSpecs`: If specified, trial accounts will be supported on the app. The instant sign in specs dictate how the URL should be constructed for the app to trigger the instant sign in flow.
+
+### IPFS Customizations
+
+For apps that wish to customize the Keypom parameters on a per page basis or even a per user basis, they can make use of IPFS CIDs. By adding a `?cid=` parameter to the URL, Keypom will fetch the parameters from the specified CID. The contents on IPFS must be JSON that match the Keypom parameters:
+
+```json
+{
+ "networkId": "testnet", // Or "mainnet",
+ "signInContractId": CONTRACT_ID,
+ "trialAccountSpecs": {
+ "url": "vandeley_industries.com/trial-sign-in/ACCOUNT_ID#SECRET_KEY",
+ "modalOptions": KEYPOM_OPTIONS
+ },
+ "instantSignInSpecs": {
+ "url": "vandeley_industries.com/instant-sign-in/ACCOUNT_ID#SECRET_KEY"
+ }
+}
+```
+
+An example CID can be found below:
+```
+bafkreidneri4ffymscahjprlapg4j62yleli73ncwdmopnkxpgczpusqn4
+```
+
+# Keypom Trial Accounts
+
+Keypom Trial Accounts are an exciting new opportunity for Web3 apps to seamlessly onboard users whether theyโre completely new to crypto or seasoned veterans. With the click of a link, users require no software, wallet setup, wallet connection, and are *instantly signed into apps* with their trial account, ready to make on-chain transactions. Unlike most other onboarding mechanisms, the entire experience can be embedded *directly in the app* to increase user retention and is entirely on-chain.
+
+This technology is perfect for dApps of all sizes ranging from small indie to large enterprise applications.
+
+- Trial Account [Demo](https://www.youtube.com/watch?v=p_NOcYbRlJw)
+
+In order to support trial accounts, your app must have the `setupKeypom` function embedded within the wallet selector with the `trialAccountSpecs` parameter specified.
+
+## Trial Account Specs
+
+The trial account specifications allows the Keypom wallet selector to support trial accounts on your app. In order to trigger the sign in flow, the user must be on the correct URL. This URL is specified in the specifications as a string and should look like this:
+
+```js
+https://near.org/#trial-url/ACCOUNT_ID/SECRET_KEY
+```
+
+The URL *must* have the `ACCOUNT_ID` and `SECRET_KEY` placeholders.
+
+As an example, if you wanted your trial users to sign in once they reached `https://near.org/#trial-url/`, and you wanted the account and secret key to be separated using `/`, your specs should look like this:
+
+```js
+trialAccountSpecs: {
+ url: "https://near.org/#trial-url/ACCOUNT_ID/SECRET_KEY",
+}
+```
+
+Alternatively, you could swap the `/` delimiter with a `#` instead:
+
+```js
+trialAccountSpecs: {
+ url: "https://near.org/#trial-url/ACCOUNT_ID#SECRET_KEY",
+}
+```
+
+> **NOTE:** The account ID must come first and the secret key must follow the delimiter. For unclaimed trial account linkdrops, the account ID will be the Keypom contract. For claimed trial account linkdrops, the account ID will be the account ID chosen by the user.
+
+## Modal Options
+
+The second field in the trial account specs is the `modalOptions`. This contains all the customizable options for the trial account modals as well as the wallets you want to support for user offboarding.
+
+```js
+export interface ModalCustomizations {
+ wallets: OffboardingWallet[];
+ theme?: Theme;
+ beginTrial?: BeginTrialCustomizations,
+ trialOver?: TrialOverCustomizations,
+ invalidAction?: InvalidActionCustomizations,
+ insufficientBalance?: InsufficientBalanceCustomizations,
+}
+```
+
+#### Wallets
+
+The only required field is `wallets`. This should be a list of valid domains that support trial account offboarding. Each of the wallets in the list will be displayed as a button once the trial is over.
+
+```js
+export interface OffboardingWallet {
+ name: string;
+ description: string;
+ iconUrl: string;
+ redirectUrl: string;
+}
+```
+
+For each wallet, you can specify a name to display, a description, an image (in the form of a URL), and where to redirect the user to once the button is clicked. The redirect URL follows the same format as the trial account URL and should look like this:
+
+```js
+https://app.mynearwallet.com/linkdrop/ACCOUNT_ID/SECRET_KEY
+```
+
+The URL *must* have the `ACCOUNT_ID` and `SECRET_KEY` placeholders.
+
+### Theme And CSS
+
+The modal used by Keypom uses the same CSS as the official wallet selector modal behind the scenes. To learn how to customize the theme to match your app, see the selector's [documentation](https://github.com/near/wallet-selector/tree/main/packages/modal-ui#react--vue).
+
+If you only wish to change the theme between light and dark mode, you can pass in a `theme` field in the modal options. This field should be either `light` or `dark`.
+
+### Modal Text
+
+In addition to the modal style, you have complete control over the text that is displayed at each stage of the claiming process. To see the default text, see the [Default Text](#modal-default-text) section.
+
+For the trial account creation process, there are currently 3 modals that can be customized:
+
+1. Landing page: what the user sees when they first click the link
+
+```bash
+landing?: {
+ title?: string;
+ body?: string;
+ fieldPlaceholder?: string;
+ buttonText?: string;
+ subText?: {
+ landing?: string;
+ invalidAccountId?: string;
+ accountIdTaken?: string;
+ accountIdAvailable?: string;
+ }
+},
+```
+
+2. Claiming: while the account is being created:
+```bash
+claiming?: {
+ title?: string;
+ body?: string;
+},
+```
+
+3. Claimed: once the account has been created:
+```bash
+claimed?: {
+ title?: string;
+ body?: string;
+ buttonText?: string;
+}
+```
+
+The next stage that can be customized is what the user sees once their trial is over and they need to choose a wallet to offboard to.
+
+```bash
+trialOver?: {
+ mainBody?: {
+ title?: string;
+ body?: string;
+ imageOne?: {
+ title: string;
+ body: string;
+ },
+ imageTwo?: {
+ title: string;
+ body: string;
+ },
+ button?: {
+ url?: string;
+ newTab?: boolean;
+ text?: string;
+ }
+ },
+ offboardingOptions?: {
+ title?: string;
+ }
+}
+```
+
+You can change the titles, descriptions, button text / behavior and more to tailor the experience to your app. Finally, you can change the text for when the user tries to perform an invalid action, or tries to spend more $NEAR than the account has available.
+
+## Example Trial Account Integration
+
+In the following example, you'll see how the trial account flow can be fully integrated into an application. The app has the domain `https://example.com` and the trial account modals should show up once the user lands on `https://example.com/trial-accounts`. In addition, the app doesn't want to expose the secret key in their analytics so they'll separate the account ID and secret key using a `#` instead of a `/`.
+
+The app will also support MyNEARWallet offboarding and will change the default text for the landing modal when the trial begins.
+
+```js
+const NETWORK_ID = "testnet";
+const CONTRACT_ID = "example.near";
+
+export const KEYPOM_OPTIONS = {
+ beginTrial: {
+ landing: {
+ title: "Welcome To My Cool Example App!",
+ },
+ },
+ wallets: [
+ {
+ name: "MyNEARWallet",
+ description: "Secure your account with a Seed Phrase",
+ redirectUrl: "https://testnet.mynearwallet.com/linkdrop/ACCOUNT_ID/SECRET_KEY",
+ iconUrl: "INSERT_ICON_URL_HERE"
+ },
+ ]
+}
+
+const selector = await setupWalletSelector({
+ network: NETWORK_ID,
+ modules: [
+ setupMyNearWallet(),
+ ...
+ setupSender(),
+ setupKeypom({
+ networkId: NETWORK_ID,
+ signInContractId: CONTRACT_ID,
+ trialAccountSpecs: {
+ url: "https://example.com/trial-accounts/ACCOUNT_ID#SECRET_KEY",
+ modalOptions: KEYPOM_OPTIONS
+ }
+ })
+ ],
+});
+```
+
+# Keypom Instant Sign In Experiences
+
+Instant sign in experiences are a great way to reduce friction for users signing into applications. Currently, the sign in flow for a new user is as follows:
+1. User creates an account.
+2. They navigate to an application.
+3. Sign-in is clicked.
+4. The wallet selector modal is opened and the user needs to scroll to find their wallet.
+5. The user clicks their wallet and is redirected to the wallet's website to approve a transaction.
+6. The user is redirected back to the app and is signed in.
+
+As NEAR pushes to abstract the crypto complexities and jargon away from the end user, this current approach is not scalable. Not only is there a huge amount of clicks and redirects which leads to a loss in conversion, but the user is also expected to know which wallet they own. This is a huge barrier to entry as often times, the wallet logic will be abstracted from the user as seen with SWEAT.
+
+The flow that Keypom offers is as follows:
+1. User creates an account.
+2. User clicks discovers an application from their wallet.
+3. User is instantly signed in and can start using the application.
+
+This flow is much more seamless and removes all the redirects and wallet selector modal friction.
+
+- Instant Sign-In [Demo](https://www.youtube.com/watch?v=p_NOcYbRlJw&feature=youtu.be)
+
+In order to support instant sign in, your app must have the `setupKeypom` function embedded within the wallet selector with the `instantSignInSpecs` parameter specified.
+
+## Instant Sign In Specs
+
+The instant sign in specifications allows the Keypom wallet selector to support instant sign on experiences for your app. In order to trigger the sign in flow, the user must be on the correct URL. This URL is specified in the specifications as a string and should look like this:
+
+```js
+https://near.org/#trial-url/ACCOUNT_ID/SECRET_KEY/MODULE_ID
+```
+
+The URL *must* have the `ACCOUNT_ID`, `SECRET_KEY`, and `MODULE_ID` placeholders.
+
+Behind the scenes, Keypom will take the secret key and use it to sign transactions on behalf of the account whenever they perform an action. Since this key is limited access, there needs to be a way to approve any transaction that requires full access. This is why the `MODULE_ID` field is present. This is the ID of the wallet that the user will be redirected to in order to approve any full access key required transactions.
+
+Currently, Keypom supports:
+- MyNEARWallet: `my-near-wallet`,
+- NEAR Wallet: `near-wallet`,
+- SWEAT Wallet: `sweat-wallet`
+
+As an example, if you wanted to support instant sign in for users once they reached `https://near.org/#instant-url/`, and you wanted the account and secret key to be separated using `#`, but the module ID and secret key to be separated by `/`, your specs should look like this:
+
+```js
+instantSignInSpecs: {
+ url: "https://near.org/#instant-url/ACCOUNT_ID#SECRET_KEY/MODULE_ID",
+}
+```
+
+> **NOTE:** The account ID must come first followed by the secret key and then finally the module ID.
+
+The wallet selector would then look as follows.
+
+```js
+const selector = await setupWalletSelector({
+ network: NETWORK_ID,
+ modules: [
+ setupMyNearWallet(),
+ ...
+ setupSender(),
+ setupKeypom({
+ networkId: NETWORK_ID,
+ signInContractId: CONTRACT_ID,
+ instantSignInSpecs: {
+ url: "https://near.org/#instant-url/ACCOUNT_ID#SECRET_KEY/MODULE_ID"
+ }
+ })
+ ],
+});
+```
+
+From this point onwards, any app or wallet could create a limited access key for the contract that your app is using and then redirect the user to your instant sign in URL. An example could be that that account `benjiman.near` wants to use the `near.org` app and the contract being used there is `social.near`. Benji came from MyNEARWallet and so the URL would be:
+
+```
+https://near.org/#instant-url/benjiman.near#3C6rhKRWLFmho9bQo32EUmk9Ldx47paRSMUdaoR551EtcaNSPziave55HJosi71tfWSRQjjRrL4exfaBi9o7XKUG/my-near-wallet
+```
+
+At this point, Benji would be instantly signed into `near.org` and can start using the app. If anything requires a full access key, he would be redirected to MyNEARWallet to approve the transaction and come back.
+
+# Contributing
+
+First off, thanks for taking the time to contribute! Contributions are what makes the open-source community such an amazing place to learn, inspire, and create. Any contributions you make will benefit everybody else and are **greatly appreciated**.
+
+Please try to create bug reports that are:
+
+- _Reproducible._ Include steps to reproduce the problem.
+- _Specific._ Include as much detail as possible: which version, what environment, etc.
+- _Unique._ Do not duplicate existing opened issues.
+- _Scoped to a Single Bug._ One bug per report.
+
+You can use [markdownlint-cli](https://github.com/igorshubovych/markdownlint-cli) to check for common markdown style inconsistency.
+
+# License
+
+This project is licensed under the **GPL License**.
diff --git a/versioned_sidebars/version-1.1-sidebars.json b/versioned_sidebars/version-1.1-sidebars.json
deleted file mode 100644
index 445b351d..00000000
--- a/versioned_sidebars/version-1.1-sidebars.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "version-1.1/tutorialSidebar": [
- {
- "type": "autogenerated",
- "dirName": "."
- }
- ]
-}
diff --git a/versioned_sidebars/version-1.2-sidebars.json b/versioned_sidebars/version-1.2-sidebars.json
deleted file mode 100644
index caea0c03..00000000
--- a/versioned_sidebars/version-1.2-sidebars.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "tutorialSidebar": [
- {
- "type": "autogenerated",
- "dirName": "."
- }
- ]
-}
diff --git a/versioned_sidebars/version-1.2.1-sidebars.json b/versioned_sidebars/version-1.2.1-sidebars.json
deleted file mode 100644
index caea0c03..00000000
--- a/versioned_sidebars/version-1.2.1-sidebars.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "tutorialSidebar": [
- {
- "type": "autogenerated",
- "dirName": "."
- }
- ]
-}
diff --git a/versioned_sidebars/version-2.0-sidebars.json b/versioned_sidebars/version-2.0-sidebars.json
new file mode 100644
index 00000000..4670a33f
--- /dev/null
+++ b/versioned_sidebars/version-2.0-sidebars.json
@@ -0,0 +1,180 @@
+{
+ "Concepts": [
+ "Concepts/welcome",
+ "exec-summary",
+ {
+ "type": "category",
+ "label": "Linkdrops and Access Keys",
+ "collapsed": false,
+ "items": [
+ "Concepts/LinkdropsAndAccessKeys/near-access-keys",
+ "Concepts/LinkdropsAndAccessKeys/linkdrop-basics"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Keypom Protocol",
+ "collapsed": false,
+ "items": [
+ "Concepts/KeypomProtocol/overview",
+ {
+ "type": "category",
+ "label": "Types of Drops",
+ "collapsed": true,
+ "items": [
+ "Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/introduction",
+ "Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/simple-drops",
+ "Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/nft-drops",
+ "Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/ft-drops",
+ "Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/fc-drops"
+ ]
+ },
+ "Concepts/KeypomProtocol/balances",
+ {
+ "type": "category",
+ "label": "Configuring Your Drop",
+ "collapsed": true,
+ "items": [
+ "Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/customization-homepage",
+ "Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/drop-customization",
+ "Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/time-customization",
+ "Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/usage-customization",
+ "Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/sale-customization"
+ ]
+ },
+ "Concepts/KeypomProtocol/GithubReadme/password-protect",
+ {
+ "type": "category",
+ "label": "Overhead Items",
+ "collapsed": true,
+ "items": [
+ "Concepts/KeypomProtocol/GithubReadme/costs",
+ "Concepts/KeypomProtocol/GithubReadme/querying",
+ "Concepts/KeypomProtocol/GithubReadme/testing",
+ "Concepts/KeypomProtocol/GithubReadme/contribute",
+ "Concepts/KeypomProtocol/GithubReadme/licenses"
+ ]
+ }
+ ]
+ }
+ ],
+ "Tutorials": [
+ "Tutorials/welcome",
+ {
+ "type": "category",
+ "label": "Basics",
+ "collapsed": false,
+ "items": [
+ "Tutorials/Basics/getting-started",
+ "Tutorials/Basics/simple-drops",
+ "Tutorials/Basics/nft-drops",
+ "Tutorials/Basics/ft-drops",
+ "Tutorials/Basics/fc-drops"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Advanced",
+ "collapsed": false,
+ "items": [
+ {
+ "type": "category",
+ "label": "Ticketing",
+ "collapsed": true,
+ "items": [
+ "Tutorials/Advanced/ticketing/introduction",
+ "Tutorials/Advanced/ticketing/architecture",
+ "Tutorials/Advanced/ticketing/drop",
+ "Tutorials/Advanced/ticketing/drop-test",
+ "Tutorials/Advanced/ticketing/react-outline",
+ "Tutorials/Advanced/ticketing/user-code",
+ "Tutorials/Advanced/ticketing/scanner-code",
+ "Tutorials/Advanced/ticketing/final",
+ "Tutorials/Advanced/ticketing/analytics",
+ "Tutorials/Advanced/ticketing/bos-tool"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "DAO Auto-Registration",
+ "collapsed": true,
+ "items": [
+ "Tutorials/Advanced/daos/introduction",
+ "Tutorials/Advanced/daos/architecture",
+ "Tutorials/Advanced/daos/drop",
+ "Tutorials/Advanced/daos/daobot",
+ "Tutorials/Advanced/daos/security",
+ "Tutorials/Advanced/daos/final"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Recurring Payments",
+ "collapsed": true,
+ "items": [
+ "Tutorials/Advanced/subscriptions/introduction"
+ ]
+ }
+ ]
+ },
+ {
+ "type": "category",
+ "label": "BOS",
+ "collapsed": false,
+ "items": [
+ "Tutorials/BOS/welcome"
+ ]
+ },
+ "Tutorials/Advanced/homepage"
+ ],
+ "TrialAccounts": [
+ "TrialAccounts/introduction",
+ {
+ "type": "category",
+ "label": "Creating Trial Experiences",
+ "collapsed": false,
+ "items": [
+ "TrialAccounts/Creation/getting-started",
+ "TrialAccounts/Creation/understanding-trial-accounts",
+ "TrialAccounts/Creation/drop-creation",
+ "TrialAccounts/Creation/integration"
+ ]
+ },
+ "TrialAccounts/offboarding"
+ ],
+ "Cookbook": [
+ "Cookbook/welcome",
+ {
+ "type": "category",
+ "label": "Drops",
+ "collapsed": false,
+ "items": [
+ "Cookbook/drops/NEAR",
+ "Cookbook/drops/nft",
+ "Cookbook/drops/ft",
+ "Cookbook/drops/fc",
+ "Cookbook/drops/trial",
+ {
+ "type": "category",
+ "label": "Customizations",
+ "collapsed": true,
+ "items": [
+ "Cookbook/drops/customizations/password",
+ "Cookbook/drops/customizations/dropConfig",
+ "Cookbook/drops/customizations/timeConfig",
+ "Cookbook/drops/customizations/saleConfig",
+ "Cookbook/drops/customizations/usageConfig"
+ ]
+ }
+ ]
+ },
+ "Cookbook/keys",
+ "Cookbook/balances"
+ ],
+ "TypeDocSDK": [
+ {
+ "type": "autogenerated",
+ "dirName": "keypom-sdk"
+ }
+ ]
+}
diff --git a/versions.json b/versions.json
index 6d3d1fb8..59f17b2b 100644
--- a/versions.json
+++ b/versions.json
@@ -1,5 +1,3 @@
[
- "1.2.1",
- "1.2",
- "1.1"
+ "2.0"
]