diff --git a/.clabot b/.clabot
index 077442b9989..4f7ed127b5e 100644
--- a/.clabot
+++ b/.clabot
@@ -75,7 +75,10 @@
"deepsea514",
"Myestery",
"Supeeerpower",
- "blurpesec"
+ "blurpesec",
+ "cypherpepe",
+ "mdqst",
+ "leopardracer"
],
"message": "Thank you for your pull request and welcome to Unlock! We require contributors to sign our [Contributor License Agreement](https://github.com/unlock-protocol/unlock/blob/master/CLA.txt), and we don't seem to have the users {{usersWithoutCLA}} on file. \nIn order for us to review and merge your code, please open _another_ pull request with a single modification: your github username added to the file `.clabot`.\nThank you! "
}
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index 383d4ec0917..caee25cc415 100644
--- a/CODE_OF_CONDUCT.md
+++ b/CODE_OF_CONDUCT.md
@@ -3,7 +3,7 @@
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
-contributors and maintainers pledge to making participation in our project and
+contributors and maintainers pledge to make participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 2d0c2c5abc5..660f4b4f986 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -30,7 +30,7 @@ Unlock has multiple projects ongoing whose release cycles are decoupled because
We use the traditional web-dev approach to release early and often. This allows for quick iterations and fast progress. Once reviewed and approved, any change is merged into our master branch and immediately \(minutes\) deployed to our staging environment. Each commit in the `master` branch should be expected to be deployed in production and should hence be "production-grade".
-We also maintain a production branch which is used to deployed to ... production! This branch is also protected and the only way to add commits to it is to go thru a regular pull request process. This pull request has to be approved and manually merged by one of our team members. Once approved and merge the various production web applications are immediately updated.
+We also maintain a production branch which is used to deploy to ... production! This branch is also protected and the only way to add commits to it is to go thru a regular pull request process. This pull request has to be approved and manually merged by one of our team members. Once approved and merge the various production web applications are immediately updated.
If needed, we can also deploy specific versions to production. For this is recommended approach is to open a new pull request against the production branch containing **only** the commits to be deployed since the latest production deploy. One way to do this is to rebase a local production-fix branch against the remote production branch and cherry pick the commits to be deployed from master. After this is a pull request is made and has to be approved by some of our team members. Once approved the updated production branch is immediately deployed.
diff --git a/README.md b/README.md
index 7139fef03e8..d7bac05c1ff 100644
--- a/README.md
+++ b/README.md
@@ -82,7 +82,7 @@ cd docker
docker compose exec eth-node yarn provision
```
-### Run one of the app
+### Run one of the apps
The main dashboard lives in the `unlock-app` folder of this repo.
diff --git a/docs/docs/api/locksmith/add-event-to-collection.api.mdx b/docs/docs/api/locksmith/add-event-to-collection.api.mdx
new file mode 100644
index 00000000000..6495ba0bc71
--- /dev/null
+++ b/docs/docs/api/locksmith/add-event-to-collection.api.mdx
@@ -0,0 +1,71 @@
+---
+id: add-event-to-collection
+title: "addEventToCollection"
+description: "Add an event to a collection"
+sidebar_label: "addEventToCollection"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNVsmOGzcQ/RWiTgnQGhkD59I32RgHk9UYaZCDoEOJLEm02GSbi8ZCo/89KHZLrW1sODkkJ7W4VNV7rxY24GryGLWzjwpKQKUedmTjzL13xpDkDSggkExexz2U8waeA3ko54t2UUCNHiuK5EPeslgRlBBMWkMB2kIJNcYNFODpc9KeFJTRJyogyA1VCGUDcV/nO9Fru4aWrSoK0us6Oy9hopRAK4jjEtEJFPI0NrZMIb5zas/mLh1JZyPZyFtY10bLDHb8KbDt5joOt/xEMp5FPIfse8qoGLNnzqKmwNeGrRtYCog6GupAXBGbQ25bPuYp1M6GzuT9mzf8c87CNElJIaySMXuBSpEaGDnj4x8DPsel1ckZbSOtyUNbfBUvOz9E8uoRHSZ17d2OTh0snTOENpvwhJHUJF7fLmDlfIURSlAYaRR1RXwl1er7rpwIk1UZNJmE4KTOlPXSvL2lxqPdodFKaFunKDxJ0jtSd+IdKtEn5N2/0cImY3DJAa7QBLoUp6IQcE234CpaYTKM96nPKbF0ai86X0IHobvY767dsLzeO3/L7nCU6+qUwZ/Jkteyp4ST+iEbOdD39pq+2YaEjlSJvUsCPYkKt9quD9SJlfNCOQrCuijoi/4fsOkpuOQl5ZBWLll1g79rVv5w8UM+3LHx061kerZsgwuZq3ulzZEHlfIyl5+3aEQgvyMvskj/OSOzDXkSLxhyd+aQhLYHCKxm3NBpMXybrGmGN2RPW0BFceN4MtUu5CbF46SE8e5+nDvRaOg444bnTtuthzy12Fw3mZI3UMImxjqU47FxchsqHTd3yfL3qPYuOunMnXQVXA6gj96plF2ILkJoi0uLIeJa2/Xo+yxPu1tHs4th1E5Zu06NbuAepWCX0E/Q3DsJPXko+o8Ph373y18zbo6TITFOjGCtf6U9q9KNbKz1aJsX8tT+nMjvc5/kXHoaRuzDF6xqQxeT77S925XLfnppnzMN4rcDL1AAi9Lhv79i5HhO8IzQioJYotySVWKVbBYBjY773CKICydnmpZbitquC1FRRIURRYjO45oKgVZx0epVz4LYOLcNnJFGS7Ihg+lp+P1xllFztlVoT3ZQKZFnhZg5cfY4OgPQDDX5rYdLr0SkL3FcG9R5+uWsavo0n8OOGbpMdCig7J9Yfa4vCthwfZRzaJolBnr2pm15uROynC8K2KHXXf3NG1A68Lc6NoBXUfzw1D+EfhSvBX3IKcv5s0OT+B8UwAnVvwbbRVvAhlDlt2PTb73vvIxmbGC4etXLuN66GxMpqY5fPbs46Rof/5zOuDL6x2HlFN/x+MIPPHzpwnQZdS61vNaAQbtOuQFCZ5NzAhNrMjxZzssuo7pJRNN0J2ZuS7Ztj7xE/s/EtO3fr74GnQ==
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Add an event to a collection
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/add-event-verifier.api.mdx b/docs/docs/api/locksmith/add-event-verifier.api.mdx
new file mode 100644
index 00000000000..effe68cecf5
--- /dev/null
+++ b/docs/docs/api/locksmith/add-event-verifier.api.mdx
@@ -0,0 +1,71 @@
+---
+id: add-event-verifier
+title: "addEventVerifier"
+description: "Adds a verifier for an event."
+sidebar_label: "addEventVerifier"
+hide_title: true
+hide_table_of_contents: true
+api: eJzlVk1v4zYQ/SvEnFpAidO0PVQ3t0iLbbuLxcZpURg+jMWxxbVEasmRE6+g/14MKX/EdpJuUKCH+mKJGj7OvHmcmQ5cQx7ZOPtGQw6o9c2aLP9B3iwMecggUNF6wxvIpx3cBfKQT6FyxeotWlySh1k/y0BTKLxpBAhyGGsdFKr1gKIWziu0igT6EjJo0GNNTD5EVCN7GuQSMrBYE+QQqnYJGXj61BpPGnL2LR0fc5uMQlFSjZB3wJsmbmZv7BL6PjuLvXVrrLWnEF48RoJWmIwVO9UGUhh20T3rwSyBU+Afnd6Ixf6sBVaBMiicZbIs37BpKlPEdIw+Bjm8O8V2849UsLDoJXlsKMjXrTvvYpDHnhzH5OIDVvscRXL6+BOfQ+NsSMjXV9/I30mKSe92S1JfHYdtqwrnFe0Y2VM0hYF3mB3Hu/1wJtQjwD6Leh1/6YatwP/RBkt87/zqwNhYpmWUxxnrJ5K0txQhSibYsLzC7kamBH139e1pTqJQTVDWscKWS+fNZ9Ii2Yb8wvlacWmCwkLs/92UPc5NTSHg8gkZLrCtGHL4y7UKPR17K6Wi5ZIsizvPun/M6wFd7xyPD1F2tP1wStukJE/CG6rC2UVlCr5Uk5KUp+BaX5DCyhPqjaIHE/g/Jy75e48h1lTvnVfGqkVbVQtTGbtUHH2PVecFmn4hS94Ut+TX5G8EaiDq+6urM/qyAiMJGQ7bnqJ0G5dF8l6qSoiAybn/AV99BjVx6aSFNm2szdJxchitr0ex64VRJy2tH20rZhh1R32oj81WgFNXbH0FOZTMTchHIylIoTZcXrZWni8a79gVrrosXH1S3t97p9t4T1TyFaQXPkYMjEtjlxdfhnybdu1gZ/sJ4VaymPKS5oRdUuTIbZuU9zmhj5UxPfzsfI2SqV//nECfwXgvkQMQbMxvtNm3cWzMxSouxB7/qSW/kZ4PoqoP+6Z784B1U9Fpj9x1aUFYuHjUkOe7yIT6fUsNZLI3JAquT0jZ2anGu7XRFNQcixVZrRatLVKrNbyJgxDJLYqyM8WK2Nhlpmpi1MioAjuPS8oUWi2V0SwGIlTp3CqIPCtTkA0xnoGJt28mMfDGBa7RHnxBrVUc6NTBRPfI925/N18c24ZEMD3wqKnQWKEuiqobBD+FtbCTJA8Z5MMct1O9rB3PX7MMShdYdnfdHAPd+arvZTnlNJ/OMlijN+lSTjvQJsjzfoZ6MqSvPgyzxNdqmBbPBrGVmBU5rbFq5Q0yEH0Nw6hcoFed+/L4+AqXjjnsZ30GJaGO83k3WP2U/LmYCNYe5aQES2xpx7goqOFnbWcHxe793URu8TDa1k7LFo/3MlPjfXI4jZqxLMS1Diq0yzaWbUiQIl5p+ge3/ahExKDOUtJ1yWLiVmT7fscQy7vw0vd/A8dfgVg=
+sidebar_class_name: "put api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Adds a verifier for an event.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/add-manager-to-event-collection.api.mdx b/docs/docs/api/locksmith/add-manager-to-event-collection.api.mdx
new file mode 100644
index 00000000000..01478aece36
--- /dev/null
+++ b/docs/docs/api/locksmith/add-manager-to-event-collection.api.mdx
@@ -0,0 +1,71 @@
+---
+id: add-manager-to-event-collection
+title: "addManagerToEventCollection"
+description: "Add a new manager address to an event collection"
+sidebar_label: "addManagerToEventCollection"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNV21v2zYQ/ivEfdoAJe667ou+pUU6ZFu7onEwDIYxnMWzzVoiVfLk1DP034cjFUe2lPQNRffJMt/u7rnnjg/34GryyMbZKw05oNav0OKK/NRdbsnyC1eWVMg8ZBCoaLzhHeSzPdwE8pDP5u08gxo9VsTkQ5yyWBHkEMpmBRkYCznUyGvIwNP7xnjSkLNvKINQrKlCyPfAuzruYW/sClo5VVMovKmj8RwutFaoLN2qKnmoUGtPISh2Cq0icVcVfX/FGgV+7vROTJwaL5xlsixTWNelKSIOk3dB7O2HvrnFOyr4KIoZWLrtELtI7oDg4QVWNhRk+3DJSLwZsOGSUqDd8uh428qkp1A7G9KBT588kZ9jfK6boqAQlk1Z7gQa0qdAwVeEfBxRzOwwiEMMIzNHzo7MF25L/qrC1fj2BVorfBuZKo3dhDGfUWsj9rB8c+T9EPrqKD1Hq9B73AmLmaoHdheekElf8HA6g6XzFTLkoJHpjE1F4nNT68/dEvn9KZ6N01RKMjuUZMT5OCkZILM3i4ZpjMOxpEfQf5AK5sFcfowKPT++MFr2aPifuCKDLZYNDSPqrRlzIu0ayXfbr9XYI2E41GubacOzsZK9slssjVbG1g0rTwWZLelz9Ry16nrX+dcUrW3KEhfi1RLLQKcIVBTCaI4kRUtsSuHg267xqIXTO5VsKROUSb6fD80IV713I8XaXyotuA/br2TJm6KDRDrfZTzkDr6fhvDJDSSuWMcKG16TZcGG9MOgfXu8pmvypG4xxDtJQlDGKunKS1Mau1K8pn5yT8EbQnJNfkv+GI2fP46G8+Zf0nI51uSlpShem6AwsvK70+pv1yj0dOqt88eZfMT9R4B77fiif8oBtmdD2KZrUtJT1K7zqMKNpKlLkVo6r7SjhCt9MP+DkvQUXOOLBN7SNVZ/Eo9eO34ZFyc0fhnrSDdWzhDUO8YecNBNHDaWyVssVYisTAz/7oh8+6ITkUC8diKSaxeiJBJJm8Nk+3QS7+aze+052cu12E46XRGidpYDkz5ufAk5rJnrkE8mpSs2oTK8Pm+sfJ/V3rErXHleuApOZfAb73QTjajkI7TZ6YmBcWXs6uzzTr5Ouw7Hzu8F/7VkL+Ujyf5DMsQkdDpe/i8IPXnIuo+Xd1Lmt7+mcqteHLfiu7u9Nr+TXO7dwwFrc7aJA/Ht8L4hv4tKS9j09l7UX37Aqk56c0Rj97WIXbpor0vyTYRD/XGHj6gE8iHh8HSAzGGdqr3bGk1BLbDYkNVq2dgiaUzDu9gsSEoocs4UG2JjV5mqiFEjowrsPK4oU2i1lK9ZdmiotXObINwsTUE20L3ogldX0xi98K5C25tBrVUXtpo6FaWHOnqynWitQ5V+yXOqyxbTB57UJRoblawwb98Vwwy2gt5pOUAGeac8DxUxz2AtdZTPYL9fYKAbX7atDKd057O5iDBvUp3O9qBNkG99aBQPxvbD204L/qgecvuOeXZ3UIg5QAZCu+7l2s7bDNaEOr5z993Ui2TlbNoXl/mw50lVph0XRUE1P7p23usub/68nkr9dI/WymnZ4/FWNC7eJjddjDoWZBzbQ4l21cRGCelMYYzcpb06OynOGNUoEPt9WjF1G7Jte8CF5b8A07b/Ad4BrIU=
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Add a new manager address to an event collection
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/applications.api.mdx b/docs/docs/api/locksmith/applications.api.mdx
new file mode 100644
index 00000000000..d0c7ecbbd9c
--- /dev/null
+++ b/docs/docs/api/locksmith/applications.api.mdx
@@ -0,0 +1,63 @@
+---
+id: applications
+title: "applications"
+description: "List applications created the user."
+sidebar_label: "applications"
+hide_title: true
+hide_table_of_contents: true
+api: eJytVU1v4zYQ/SvEnJU4yLYX3XLYLrbdLQrEQVEYPtDSyOKaIrUzQ6euoP9eDOU4iuP9KLa+WJSGj/PevBkOEHskKy6G9zWUYPveuyqvGQpgrBI5OUC5GuCBkaBcrcd1ATVyRa7XOCjhg2Mx862mIrSCtZEWTWKkayiAkPsYGBnKAW5vbvTvAk5sXkLFx4C12Rwylk3SYhD9iPUJuYpBMIgCzrYuPrGiDsBVi53VJzn0CCXEzSesBAroSemLm3Ii5OSFZ4GWyB6gACfY8SWAkLy3G49QNtYzniO6erYppG6D9HrTWECwHc4iWciF7cXIHR6+HiiUNO7Reo9yV9eEzN8DPRYgTnQNd88awjj9Cvjp5s3rgqkljGMTouTSRHL/aNWj6ZGaSJ2R1rGxlcb/UKW+IXSHzHZ7UcMaG5u8QAl/xWQs4Xm2kc5s9eX0vyLa71Hu5igwyfbzJZ8/BAXRc5rkfeO8IfyckMXUKb92QZCC9YaR9kgGieKPOf3/0G/ZIqF5tGxsmFIyLjxRcGGbO/TI5BtqvcOA5Kr7TO+tQsHRZx1KG3UUbTF3qJUWSljsbxfzqbDwjiUPKAXgPJ8SeSihFem5XCx8rHbcOWmvU9Dnq56ixCr66yp2cD7B/qBYp1xmM+UEY3GOyGK3Lmyv/hvy/bTrBLt+nqr3Wq1J/2m2nsTXI5VdDoASNmgpj47p4ZdIndWK/PrnEsbiRcPOhlfvfkOdXtN00fXVLr9wmtjnhHQAldyFJuZ9x+I8ZFrmwxNPKEBFnvjcvmJ4ijM9xb2rkc3GVjsMtWlSyKJa7+RgmkgG1frZK67aobiwLUyHYmsr1rBEslssjA21dqlrjqxMG+OO1VPeVRg4G/VI6+P7ZWbRR5bOhtmXs8vsRdbDcyt95/V1VFXwb1n03rqgymeHDEeXrmCv6pwdm526LqCNLBozDBvL+EB+HPX1VIZytS5gb8lN/bJajwW0aOt84w7T1Ie7qsJeXb+3Pp0RnEaAuuvUQO/eLjWbpKmdTHHmpIz+5JdwmGEPwxSxjDsM4wjHqwdE1zCux3H8F/If4+c=
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+List applications created the user.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/approve-attendees-rsvp.api.mdx b/docs/docs/api/locksmith/approve-attendees-rsvp.api.mdx
new file mode 100644
index 00000000000..dc9a23f9a8a
--- /dev/null
+++ b/docs/docs/api/locksmith/approve-attendees-rsvp.api.mdx
@@ -0,0 +1,71 @@
+---
+id: approve-attendees-rsvp
+title: "approveAttendeesRsvp"
+description: "Approves users to attend an event. (does not airdrop!)"
+sidebar_label: "approveAttendeesRsvp"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNVkuP2zYQ/ivsnBJAaweL9KLbpkiKbdM02PWiB8OHsTi2GUskM6S8awj678WQ8mNtN0G3KFpfLJGjeXwz38x04DwxRuPsrYYS0Ht2G7qJkawmCndh46EAj4wNReIA5bQDY6EEj3EFBVhsCEqwFB8dr6EApq+tYdJQRm6pAE2hYuPFBJTwKcspo0dQQKhW1CCUHcStFzXGRloSQ98XF83UrlrfaM0UwndNfXTVWmEWvmgsRDZ2CX0/y6ooxHdOb0XiVHPlbCQb5Qq9r02VIBt/CWKpO1ft5l+oioIcC8DRUMhqK+MN2RiOZJEZt1CAidSES+6l32l0NzlTQbWBOKjoFKakKbSKNmTjSL3SjoKyLio0rNn5H14n0IJ3NmSHrt+8kb/nqu/bqqIQFm1dbxXu7MQVndmSs2QM/gFEtq1rnNcE5QLrQKeYHaf8HJwCxKdv3ecAsL54uSvbw51tm3kuQIgmileQSJBz8PYSXrd2g7XRyljfRsVUkdmQHql3qNVQV6N/EaCGQsAlnccnJbPAto4Sw5B1NXd6q7ItZYIy2ffRuZm+AGJ2fEnvQVTocYzVz2SJTTVAInR6n5Ts4Ht7Dt9kRUpqX21dq5BJNbg2drmDTi0cq30l05P5H6DJFFzLFSWXFq61+gJ+56h8cvFDEs5o/HipmB6s6BCOCf8Wpt7joNt0LC2SLdYqEG+IVUrSf47IZEVM6hFD6j/ikjJ2F4JkU1rFERm+D9Z9Cu9QPX0BDcWVkzHlXUjNVWZDCePN9ZjDxo+7gc79uDvqGv146GEyA5LSPMVarqGEVYw+lOOxfBAaE1ej1srzlWcXXeXqUeUaOO2+n9nptpIXlf0EGVjPNYaIS2OXV39P833+aq92Jk5XLZu4vZcM5pw8BDomppjcTTh5nxMyMRTDwwfHDUqWfvljIl3v5lAex3PIm19pe5i16M3VOh2kQfy1Jd6mvigVdXeYl++fsPE1nc636a5MZr1oWLhkasjxQ0JCfdxBAwVIXjIE12eg7OWUJNJoCmqO1VpG0KK1KQ9Ym7hNvYKEQankTLWmaOyyUA1F1BhRhegYl1QotFrYaxYDEGrl3DrtCbWpyIYUz4DEb7eTFLiUXYP26GaoLLVfmNSwMT3zvztw8+Vze8hSpKc49jUam4Yfp7mWiTCFjUDH2YPysJKVz9emHR1mBayESOUUum6OgR647ns5zrkup7MCNsgmE3XagTZBnvW+U/xlmK/uhg3qtXq+8l0MY1eBVqptg3Urb1CAlN9htxSKvciD003wBT4cI9hLRa8ItXBw2g0SP2XLVxPRc9Bw1oolivzFTVWRj9+UnR01vc+/30+E0sOK2jgt3zA+Ss7xMXvrEhJ52ZSzDmq0yzb1b8g65fcn60Uu0A==
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Approves users to attend an event. (does not airdrop!)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/approve-event.api.mdx b/docs/docs/api/locksmith/approve-event.api.mdx
new file mode 100644
index 00000000000..dcc76e5bfca
--- /dev/null
+++ b/docs/docs/api/locksmith/approve-event.api.mdx
@@ -0,0 +1,71 @@
+---
+id: approve-event
+title: "approveEvent"
+description: "Approve a single event within an event collection."
+sidebar_label: "approveEvent"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNV1tv2zYU/ivEedoA2S6y7kVvaZEO2aUrEgfDYPiBFo8l1hSp8uLUE/Tfh0PStmI7Kdo9dE+xJPJcvu87l/RgOrTcS6NvBZTAu86aLd5sUXsowGEVrPQ7KBc9PDi0UC6Ww7IAga6ysqN7UMJ1usU4c1LXChnSffYofSM14zo/V0YprOjOFArouOUterQuWte8RSjBqVBDAZLMdtw3UIDFT0FaFFB6G7AAVzXYcih78Lsu3vFW6hqG07DuVaiZWTPf4IUIKA0yjc6/MWJH9k49VUZ7AqLsCRglqwjU7KMj8/15IGb1ESv/JOQFRM8UCiwL6Czh7SU6unb8dJbMl3PxhmW2pjAMBXjpFR7JiBTGxIaBPlt0ndEuOb569Yr+nLgIVYXOrYNSu71pcXRInH0zIE/zlmJ0RmqPNVqi7wU8BnK+J+/ZI9Ll7McOVsYo5DqasMg9imt/CfC1sS33UILgHidetkhXQie+7sqIisjB20PY186ZSkbIMimvL/Fwq7dcScGk7oJnFiuUWxRT9oYLlgX7n7jQQSm+ogDXXDk8JadF53iNlyW55kFRvndZTWxlxI4lX0w6JlPs03M3RK+1xl6yezxKdTdG8BfUaGWVISE530Qje/h+OoeP2hSFoo1nPPjGWPkP6diwDi0RxnwjHeOHRvRdgfzbBMYtnkZrbHxC7SmcF8M/xXmE3nvjr8dWDrC9Podt3iCTHlu2yxG1fCN1vVccWxvLhMGEK36W/wMRWnQm2CqBtzZBi5fhyGJ6b/y7eDih8fOlGnzQZINQp3a4luqAgwjxNXUtq7liDu0WLYva/u6IzBu0yB65i0OXQmJS71MgNqmbj3rIl8G6j+kdi24ooEXfGFoWOuNib6cxXcJsezWLDXxybNSznub5kN67WR4qcbEgs2nyB6ughMb7zpWzmTLVxrXSN9Og6feks8abyqhpZdqzsfjBGhGiK5YihaE4teg8r6WuJ19n+T7dOphdHrehe+IwsZJ2ogMl5BLyhhJHD3KLFor8491+XPz615xmy/VRICMjvJO/4Y7YSSsR7+RkE1/ErehTQLuLY4Y0dXfcYG4+87ZTeLJYjKejXpvoJ1P8EGFgv+9xgQKIlJT/1Rkih3OMWJQCHVvxaoNasHXQkQSupN/FVoFUQFFxstqgl7ouWIueC+45c95YXmPBuBZUvHKdUWCNMRtHylSyQu1iMhmGP27nMWtSXcv16EuWFdtvrU/C7o8V+W17ambF42c/6xSXcZGICuuz9BewJbROxQ8FlHmdTfqHYh8qrYINVU+5gL5fcYcPVg0DvU70lotlAVtuZarORQ9COvotDu3h2Sx/uMvb54/s5Q34mdz2MtQkuS1XgZ6gANJgXtCH5VBAg1zE/wj6/OltCmEyJwPHq2dtkEo03biuKuz8i2eXo4bz4c/7ORVTXtdbI+iO5Y+0cvPHFKaJkMTqjO96UFzXIfZOSDZJRjRex0vi00qNWV0Eou/TibnZoB6GAy6engmYYfgXN/esjA==
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Approve a single event within an event collection.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/approve-refunds.api.mdx b/docs/docs/api/locksmith/approve-refunds.api.mdx
new file mode 100644
index 00000000000..8af33967358
--- /dev/null
+++ b/docs/docs/api/locksmith/approve-refunds.api.mdx
@@ -0,0 +1,71 @@
+---
+id: approve-refunds
+title: "approveRefunds"
+description: "Approves refunds for an event."
+sidebar_label: "approveRefunds"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVk2P20YM/SsDnlpAu3a37UW3bZAWaZs22PWiKAwfaIm2JpZmFA7HG1fQfy84kj9ib3YbtEB9sTTivCEfycfpwLfEKNa7NyXkgG3Lfkt3tIquDJBBoCKylR3k8w4eAjHkc6h9sXmLDtfEsOgXGZQUCratwkAOtwNIMDzAmJVng87QlpxcQwYtMjYkxCHBWt3UolSQgcOGIIdQxzVkwPQhWqYScuFI5+fcD0ahqKhByDuQXZs2C1u3hl49UwQK8oMvd2pxDlh4J+REP2Hb1rZIVEzeBz2gu4T2y/dUyCeezQEbH50uOpJHzxtYZNCyEiuWQsIeLI44LjZLYt0S6xqXNUG+wjpQn0ERmckVu8uATq3V/f544j9ATj91PLTehcGvm+k3+veF6ftPSFt5blAXhYkggy3WkcIldaPds2TsqRsxjrbIjDvIwAo14dIj5SMd//KOQ02NNH43/faSOe0PY4NxXgxGqTzbv6g04k1LrIEYqWwwWKj9v2LyLPZz0hoKAdf0FGslrTDWAjn86aNBpnNvNdlRKnKi7jzr/kWJZSBW9B1+83J7igIDbd9Pp0/Q5hREz1nFul7Z2oxda8qYlq0TYoe1CcRbYkPMnv93/mYVMZlHDKk51CVj3T4E69ZGKtpH8gJbP5EjtsV9Cu+1QsFYZw1J5VWZWx8kSadUkMNkezNJ/RgmnWplPxmV+4pPpFvRBomNXEMOlUgb8slE9Ts0Vqrr6PT5qmUvvvD1deEbOJfZd+zLmHJuBgehz84Rg+DauvXVlyHfD7sOsIvjvLnX1A3JGKbOIRN65F719X1JyEnwhocfR72An/+YQZ+pmu3r4rTNW/sL7Y7zBlt7tUkLaRh9iMS7JA9aSnfHGfL6IzZtTaeaPj2V7BN12ivztFfQlU+nj/l+SOSYX/dsqf4Rh4GVmwueDnZGc2xLCmaJxYZcaVbRpdRgbWWXlJq0m1L52WJDYt06Mw0JlihognjGNWUGXamNb1cjN6byfhO0TGtbkAspxJGct29miQstwQbdyZex6MzxvvCJ492xQV+eKmNmhD7KpK3ROs1eqrJurPo5bJWboe4hg3y8JZyX/iKDSrsln0PXLTHQA9d9r8tDXvP5QmcF26Eb5x2UNuhzeZCDz4bx1d04w7424/XjSb/3ZeZ2+9EGOUAGWmPj7aZf9BlUhGW6U3Xjp1fDSVczBThuvVA3bcFhx21RUCvP2i5OdOTd7/czbZbxQtT4UvcwPup8xsfBTZ8iT92X1jqo0a1jkkQYMLUgdE6cNNVZJ6aoniSi6waLmd+Q6/sDL6LvSkzf/w1UIrKU
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Approves refunds for an event.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/approve-rsvp.api.mdx b/docs/docs/api/locksmith/approve-rsvp.api.mdx
new file mode 100644
index 00000000000..b87c2c3dc78
--- /dev/null
+++ b/docs/docs/api/locksmith/approve-rsvp.api.mdx
@@ -0,0 +1,75 @@
+---
+id: approve-rsvp
+title: "approveRsvp"
+description: "Approves a user to attend an event. (does not airdrop!)"
+sidebar_label: "approveRsvp"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNVkuP2zYQ/ivsnBJAaweL9KLbBmiCbdM0yO4iB8OHMTm2GEukMqSUGIL+ezGUbMtrB0k3KNqTKD7m8c03jw4M1UwaIxnIIzeUga+JMVrvbg3kgHXNvqUPoa0hgxoZK4rEAfJFB9ZBDjXGAjJwWBHk4Ch+8byFDJg+N5aPcg0FzbYWyZDDu+GesmYGGQRdUIWQdxB3tYixLtKGGPo+u6im9Hp7YwxTCN9V9dbrrcLh8kVlIbJ1m2/qagLxj+p6CMQ/pmv5+OnNgHRQqESjil5hjOSMQqeoJRdn6pnxFJTzUaFlw77+5XkyKdTeBQqi5/rFC/mcyr5rtKYQ1k1Z7hTuFcWCHquSraQLMtDeRVnlnbCgtDqxYv4piMju3DW/+kRaHrqmLHFVEuRrLANlULOQKtrBwmnszoHJTvC+dD7Yj+XFwz3/jmeuqVYDkyDaKFZBYnPfy9bLS3DduhZLa5R1dRMVkybbkpmpV2iUxJ9CnP2LAFUUAm7o3D+hzBqbMooPY9DVypudGnQpG5QdbJ+dq+kzIGbPl+Qerwqrp1i9IUds9QjJK292vyUhe/hensN3X5CykSq1841CJlXh1rrNHjq19qwORKav9n+AJlPwDWtKJq1948wF/M5Reefj63R5QOPXS2R6cCJDckzSb23LAw6mSdtS69hhqQJxS6xSkP5zRO4LYlJfMKTyIyYp6/YuSDSlVEyS4ftg3SX3juzpM6goFl7aTO1DTP0lFpDDvL2ec2jreTemcz/vJlWjn48lbN5NakUv5TapGJpTwyXkUMRYh3w+l+ehsrGYNU7WVzX76LUvZ9pX8LgWv2dvGi0/arAapDecSgwRN9Ztrv6Z5Lvh1UHsUozWDdu4u5N4DhGSNjIJj6jcNxP5XxEyMWTj4rXnCiVmv3+8lxp4cyTLRAjW9g/aHdsa1vZqmzZSz/vcEO9SlbRu7dO7MXwPyS31du8nZCAgD/5cn3l4uKckRtZQUCvUW+ku68YlULG0cZfKAElyJDZZvaVo3SZTFUU0GFGF6Bk3lCl0RhLTrkevVOH9NvXX0mpyIVF5dOvP2/vkhTCqQjc5GUmjxlnmxOrumGw/0YhHpCN9jfO6ROtSO+PUqQZqL6AVxHgwIT9OS/npRDPaKgfTdrjMoJBMyRfQdSsM9MBl38v2EL58scygRbZDJi46MDbI2hxKwTfdfvZhnGyeq9Ph7KJXe1I5IVCLZSN/kIEw6jgFStY8yYLHM9sTbJgC+mQ7Hs9zT7BjGr9+2WdQEBpJ70U33rjRmuo4eXtW7aVMHGrl+7/uhOJ/A5sXFiA=
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+:::caution deprecated
+
+This endpoint has been deprecated and may be replaced or removed in future versions of the API.
+
+:::
+
+Approves a user to attend an event. (does not airdrop!)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/approved-refunds.api.mdx b/docs/docs/api/locksmith/approved-refunds.api.mdx
new file mode 100644
index 00000000000..41a87ac6e33
--- /dev/null
+++ b/docs/docs/api/locksmith/approved-refunds.api.mdx
@@ -0,0 +1,71 @@
+---
+id: approved-refunds
+title: "approvedRefunds"
+description: "Returns the merkle proof of an approved refund."
+sidebar_label: "approvedRefunds"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVk2P2zYQ/SvEnFpAXm8WyUW3HDbBtmlR7Ad6MHygxZHFmCKV4dBdQ9B/D4aSvV7baZP20L2sPjhP82bevHEPoUPSbIO/M1CC7joKWzT3WCdvIhRgMFZkOzkBJdwjJ/JRcYOqRdo4VB2FUKtQK+3VPlxRjr+CAjpNukVGilAuerCC0mluoACvW4QSoktrKIDwS7KEBkqmhKcffhgPxarBVkPZA++6HMxk/RqGYSkIsQs+YpT3N9fX8u81yuN3p10Fz+hZIHTXOVvlGs0/R8Hpz/MIq89Y8SsaC6gDtVoeMiFCAVvtEkZYFtCR1J3tmOt07oxVAehTK0iRtTeazGz7RsJ9ck6vHEJZaxdxKMChrm99FYzEvQBpIr2DAixjGy+U7RLUlOU/gxw4v2aT4/8m/OJHpUJ33uDzUaBP7QoJhmGYDvwAsfGvgLfXby/LQALVLiSlCVWrN9avlfQOI6s6kDIBo/KBFT7byP9JEidsT+vVYox6jZfab7DWyTGUou2QqMKcUh2SN+fAuUyW5R4+okey1e+BP+TDYzXeXRqKJy8YioOqk3O1dYc6mJQfW89IXjsVkbZICokC/e8VeWyQUP2lo0xwTklZv6cg3RSPmphcfVexHjK9W4GCST4tchPEGNeYhS7GVcJ8ezPHLXqO8711zEbriPNe7GwQq8poo+slclBCw9zFcj53odrE1nJzlbxczzoKHKrgrqrQnlnuHxRMquRGjQnCUJwiRtZr69ezH0N+GKMOsEtJukpkefcgrRub8RSRjjohn9wbsdyvUBMSFNPFh8nK4Jc/H8Ve3r/o4nh6O/sr7l5WgO7sbJMf5P3wJSHtQOpvfR1y3NSpp0xLfdrzFFNFiiOfmzOGh3Ni91trMKqVrjbojaqTz0XVzvIuTzzKHGTh2GqDbP26UC2yNpq1ihxIr7FQ2huZQVtPrFQTwiaKwJyt0Mes2onWb3ePmUUXIrfaH705bJxvLNr+Zbb+xc6dqsz4zPPOaeulE1kx/SThBWylWqOIoYBTGUMBZd7LywKaEFki+n6lIz6RGwZ5PDapXCxlY5AdR2vRg7FRrs1htr9J7Kf7aVf+rKb1fjHxvWb8br9CoQQoQAQz/XoYlkMBDWojUl3006v3VYUdHwWdmZRI/jDiH2+lW18BGvgpWg==
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Returns the merkle proof of an approved refund.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/balance.api.mdx b/docs/docs/api/locksmith/balance.api.mdx
new file mode 100644
index 00000000000..7a0fe7b9a87
--- /dev/null
+++ b/docs/docs/api/locksmith/balance.api.mdx
@@ -0,0 +1,63 @@
+---
+id: balance
+title: "balance"
+description: "balance"
+sidebar_label: "balance"
+hide_title: true
+hide_table_of_contents: true
+api: eJyVlE1v2zAMhv+KwLOaFAV28a0DuqH7AAq0wQ5BDozMxGpkyaXodIGR/z7QdpIm7Q7NJfqgKD4vX7mD1BCj+BTvSyhgiQGjI7DAlJsUM2UoOri5vta/krJj32g0FPB1iM1mldg0LbsKM7HBsmTKmbJJ0RC6ykSS18SbCVhwKQpF0WTYNMG7/urpc9aMHWRXUY06im0IuAwExQpDJguyawgKSMtncgIWsCy9nsXwwMogfij1Mu6USLglC81Z9Fjsm4NZ2Mc17C1ErOnDjYNI7/eGn4UvH+k1i1qHkWRWbQgrHwzTS0tZTNn2yz4KccRgMvGW2BBz4k+p9n/4UcVz+ppyxvUHIBZKWmEbBAp4qojJvGI2GIeSjI8HBB/XRio6kEze36lyiBedw3eKxN499nh3mgpGwc6VOrmwJqmSGnNNytOgVFDA9OA2sDBolaGYd9BygAIqkSYX02lIbpNrL9WkjTq+ajhJcilMXKrh8s4HTmXrdGKG+mBvLzNmwbWP66vPZX4cTh3TLrRo17KX3aN2bujFLBO/aYReqXR9gEpCyMRgx8G3xDVqd378eVJL3p5s8SYJNv4n7eBgZZ1fbfoFr4W9tMQ7UPl9XKX+3NioWY9lfh04wYKKPPDcvCM8xpmG09aXlM0S3YZiaVZtdMMz9bLrvxSkz6D3jXcbEh/X1tQkWKKgyZIY12QNxtLEJH41UpkqpU1WfwXvKObetCPW7/unnqJJWWqMb3ZORjor+CiQ0F+ZNgF9VBH7ZnejyeZwNNnCQpWy6FrXLTHTjMN+r8uDgsV8YWGL7Afbzxd7CxVhqQ2dd6CKF3DrHDXq4S2GdmjGxUtWYxz9/v1Omf4BOXD4DA==
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+balance
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/bulk-approve-events.api.mdx b/docs/docs/api/locksmith/bulk-approve-events.api.mdx
new file mode 100644
index 00000000000..b189dcf0019
--- /dev/null
+++ b/docs/docs/api/locksmith/bulk-approve-events.api.mdx
@@ -0,0 +1,71 @@
+---
+id: bulk-approve-events
+title: "bulkApproveEvents"
+description: "Bulk approve multiple events within an event collection."
+sidebar_label: "bulkApproveEvents"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNV0tv4zYQ/ivEnFpAjhfp9qKbs8gW6WO7SBwUheEDLY4trilSSw6duIL+ezGULD+TIu1he7JEcV7ffPNwA65GL0k7e6cgh0U060lde7fB2w1aCpBBwCJ6TVvIZw08BvSQz+btPAOFofC6ZmHI4SaatZCdrKiiIV0bFJi0iCdNpbZC2u5AFM4YLFjyCjKopZcVEvqQbFhZIeQQTFxBBpqV15JKyMDj16g9KsjJR8wgFCVWEvIGaFsnGfLarqA9de7BxJVwS0ElXvCAg2HVGOjGqS3rO7VUOEtoiT/Juja6SJiNvwRW35w74hZfsKAjl2eQLLMrAeYZ1J6xJ42B5Q6+7bVI7+UWToOZ8ClH00XCOAVBbgc+I6oJq3ABl7bNgDQZ7BN2lOsUe5vueAy1s6Fz7frdO/45QTQWBYawjMZsd5ZVwjcgA4uqzz2781b0dnGfhjGgeoydVgd3tCVcoWcODJheZMieAS9e0aEH6NDAwjmD0iYVHiWhmtC5dAZL5ytJkIOShCPSFbJIrNXbRA4yltL0YXB7EoIrdIIypa3N4P2lVN3ZjTRaCW3rSMJjgXqD6krcSCV62v+bJA3JsNEYuWAPl9IEPM1OhSHIFV6KV+FSRsMB3/eEEwuntqKzJXQQuvP96twM59d75y/p3V/l6j2E8Ce06HXRQ8KMv01KdvD9cA4ftzx2xToSMlLpvP6Lqe5EjZ4zJqjUQcihnX1TIP90UUiPp946n97QErvzqvunOB+g98nR5FDLANv7c9imJQquX7HtParkWtvVjnFi6bxQDjtc8Vn/D0joMbjoiw68pYtWvQ5HT6ZPjj6myx0aP16qwUfLOhh17phLbQYcVEzH3La8lUYE9Bv0InH7myMyLdGjeJIhjW52SWi7C4GzyQ3/oIf8M1gPKbx90bUZVEil4+2jdiE1dx72OYw31+PUwUf7Tj1ueNq13XkY87oy6odP2lRYd7dERG8gh5KoDvl4bFyxDpWm8ipafh7V3pErnLkqXHU2YD97p2KyJzp3oc1ONQaSK21Xo7dpfuikBrXz/Xr1wInsUtMtWUNe2CT0y04aQCg9esj6h4+7ofHzH1OeMJM9Sw5Haq1/QZ6p/XYlaz1ap4O0YH2N6Ldp2DCx7vfL0O2zrGqDpyvKbMeWOY9Ju3TJVJ/qx4SE+HUHDWTAeekguD4DZbgnOJFaYRALWazRKrGMNuVBGk3b1DKQCykxTxdrJG1XmaiQpJIkRSDn5QozIa3iItbLHghROrdOq4jRBdqQ4umR+O1umgJn9lXSHnxheol+AxDDPnzkfLOvz/+yAfdJInymcW2kTttFIlzTl8MMNozcaUFABnm/KOPOwaOqmGdQclnlM2iahQz46E3b8nGX8nw2z2Ajve7KdtaA0oGf1dA3Xgz4u/t+uf1evL5gvxDgjpqWabiRJvIbZMC87Pf/lvlVolTpb0fTf/rQuTCasoK96Fl/5LLtJCZFgTW9end+0Ik+//4wZST7fwOVUyzj5RNv9PKpc9MlSFLFprMGjLSrmJoqdDqZVzx3D9fH4+pNUV0Eomm6G1O3Rtu2Ay7E7wxM2/4NCivTxQ==
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Bulk approve multiple events within an event collection.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/bulk-remove-events.api.mdx b/docs/docs/api/locksmith/bulk-remove-events.api.mdx
new file mode 100644
index 00000000000..320ed6705b6
--- /dev/null
+++ b/docs/docs/api/locksmith/bulk-remove-events.api.mdx
@@ -0,0 +1,71 @@
+---
+id: bulk-remove-events
+title: "bulkRemoveEvents"
+description: "Bulk remove multiple events from an event collection."
+sidebar_label: "bulkRemoveEvents"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNV9uO2zYQ/RVinlpAXgdp+qK3Tboptk2DYC8oCsMoaHFsMaZIhRw6cQ39ezGkbGtt7aZJCrRPtngZzpyZwzncgWvRS9LOXisoYRHN+gYbt8GrDVoKUEDAKnpNWyhnO7gP6KGczbt5AQpD5XXLe6GEl9GshU9bRRMN6dagwGRELL1rhLT5U1TOGKx42wUU0EovGyT0IR1gZYNQQjBxBQVottxKqqEAjx+i9qigJB+xgFDV2Egod0DbNu0hr+0KulPPbk1cCbcUVOOIBxwJm8ZAL53asr3TkypnCS3xlGxbo6uE1/R9YPO7c0fc4j1W9MDlGaST2ZUA8wJaz7iTxsD7BnNHK9J7uYXTYC55lKPJkTBOQZDrkWdANWETRmDpugJIk8E+WcM0p8i7tMRjaJ0N2bHnz57xzwmesaowhGU0ZtufqxK4ARlVVA/SzhMPM/7VcD4ELZXIWPb7ID9XFyPzldugv27kanz7QlrL5T8yZbRdhzGfpVKaz5Pm3QPvT5NTQCOtXKG/VMpjCDhWCo+mtoDKoyRUl3Q+XcDS+UYSlKAk4YR0g+xzbNWXbsmJ/QeejVIgcbs4cDvh/DApBUgirxeRcIQm+W4YQf/RUtCP5vJzpTDw4yujJS81/ZlWFLCRJuJ5RIM1Y07kXWNUHpI5URjOh14dWNdT+8UYm6/tRhqthLZtJOGxQr1BdSFeSiX6e/GbSGujMXLBXi2lCXiKQIMhjOaIU7SU0XAN3vR3klg4tRX5LKGD0Nn3i/NjuFa9dyNkHS7l630I289o0euqh4QvxatkZA/fD+fwcUNkV6wjISPVzuu/+Dp0okXPJBJU6yDkt99+/waQf7gopMdTb51PX2iJ3XnS/VOcB+i9dXQ5tHKA7cU5bHc1CmaR2PYeNXKt7WpfcWLpvFAOM674Sf8PitBjcNFXGbyli1Y9DUdfTG8dvU6LMxo/jnHw3rINRp2b6lKbAw4qpmFtCb2VRgT0G/Qi1fZ/jshdjR7FRxmStmOXhLb7EDib3PsHd8jnwbpN4R1Jx20RqXYsTRUaJEyKkWooYbp5Pk39aHKUF9Mdt4Iuj4cpq9lJVihJyLLxLDOjN1BCTdSGcjo1rlqHRlN9ES3/n7TekaucuahccybB3nmnYjpOZH+hK04tBpIrbVeTL7N8m3cdzM6P6vuWM5lzkzX4ITF8JPRymL8XKD16KPo/r/eN/Jff77inXB7LZNjZWv0rcmvr9bds9WSdBpIE/xDRb5PO4Mq6Ocrlq0+yabPaGorY2b5c5tyE7dKlo/pc3yckxJs9NNwe0YcMwfMzUA7rROvdRisMYiGrNVolltFWWVxp2qY7A5lJqfR0tUbSdlWIBkkqSVIEcl6usBDSKmaxXvZAiNq5deASNbpCG/CoNuC367sUeOsCNdIOZri6RFbR4vBaOtEVB35+9fuoTxDhJ5q2RmqbpBsX265nwgw2jNopF6CAspdauPduSIh5AbULxPt3u4UMeO9N1/FwznY5m7MC8TpTdrYDpQP/V4c749Fgv7vphdD34unX1yPx7avSbg/aqQQogEuyfxx2XFo1SpUepLt+6lV2YXI3lF3l+d3IjM07LqsKW3py7XxwC/109ebq7oqh7B+LjVO8y8uPrP/kx+yoS6AkuqaxHRhpVzFdqZCtclFx1x2w8IS6Ka5RKHa7vOLOrdF23QEZ4m+Gpuv+BrgWjSU=
+sidebar_class_name: "delete api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Bulk remove multiple events from an event collection.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/cancel-subscription.api.mdx b/docs/docs/api/locksmith/cancel-subscription.api.mdx
new file mode 100644
index 00000000000..b16c6e0beaf
--- /dev/null
+++ b/docs/docs/api/locksmith/cancel-subscription.api.mdx
@@ -0,0 +1,71 @@
+---
+id: cancel-subscription
+title: "cancelSubscription"
+description: "Cancel a fiat subscription."
+sidebar_label: "cancelSubscription"
+hide_title: true
+hide_table_of_contents: true
+api: eJydVUtv4zYQ/ivEnFqAibfBnnQL2rTIbloUtYMeDB/G1NjiSiK15MhbQ9B/L4ZU/Ii9DRpfLD7m8c1883EA31FAtt49llCAQWeomffraILtZBs0lHRcFfBzuqJQbSyyiidXb0FDJNMHy3solgM8RwpQLFfjSkOHAVtiCjEdWXHVIVegwWFLUIAj/uZDDRoCfe1toBIKDj29TuCPfE/ZMgU0FbUIxQC878SNdUxbCjCO+mqYxpv6viwDxfhmqCdvaoX58tVgkYN12+/Gqmn/WL4Z5TPt1eN1MAf/K3ESO+8iRTm/+/BR/s4dzXtjKMZN3zR7VVJDTKXiil51adTw8cNPl+bSLmWjcp4V9lyRY2uQKaVmvGNyLFbYdY0cJKvhMmm//kKGpQp90+C6ISg22ETS0AWhG9uMoaUYcUuXcKVAG+wbhgIWFQVS3zAqdIpC8EFZpwTixjbWbRM+qS9Fvr2MOY4a2LKs4TdyFKyZU9hReBBXMMpPQ0tceeF/Lhro3McCZru72Wnx4myYaDrOhEhxNpzwaZzVtI+zIbV9TNMgoTLj+9BAARVzF4tZNm4tV7e9k++bLnj2xje3xrcXM/dn8GVvZKFy9iCEO/cYGbfWbW/+n+d5tjq4XR1HeC59zZ3Kg3xok4R8Yaus14SBAujp41cfWpTeffp7IWS7P+fL5AQ7+5n2x1nBzt7UaSMN0teewl4GC6zb+GQ3tfE5wVJPLzhBgxQ547m7QHi4p7rgd7akqNZoanKl2vQuFRUby3u18UGRw3VmlTU1sXVbrVpiLJFRRfYBt6QVulKGxG4mVKryvk4C0VhDLiZKT7B+f1wkFJ2P3KI7Oclaq/5LbIfj2L2hu1NRmf7hWdegdVL4RJBh4vISdlKcMzaDhuIou4k5snUukcJp2c1ittJQ+cjibxjWGOk5NOMo27ljxXKlYYfB5iFcDlDaKN/lQQW+C/GHvyad/FGdi/xVdC88csKZHTa9rHK+J6+JDMq7Mnit/e/I4bSO787j+Dq8I4Pcs3E1aqgIy/QcD9PZvTHU8YnVqa6LEBxU8ZeHp4fFA2iQV+FkhF/NffJ9NZ9hyDcWviY3jof0WNaS3jj+C/iI8oQ=
+sidebar_class_name: "delete api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Cancel a fiat subscription.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/capture-purchase.api.mdx b/docs/docs/api/locksmith/capture-purchase.api.mdx
new file mode 100644
index 00000000000..7d5b101d224
--- /dev/null
+++ b/docs/docs/api/locksmith/capture-purchase.api.mdx
@@ -0,0 +1,71 @@
+---
+id: capture-purchase
+title: "capturePurchase"
+description: "Capture a purchase"
+sidebar_label: "capturePurchase"
+hide_title: true
+hide_table_of_contents: true
+api: eJydVcFu4zgM/RWBZ7cp5uhbZ7CD6e4MttikmIPhgyIzsSa2pKHotobhf19QdhInLRbo5hJZIimS7z1qAB+QNFvvHirIwejAHeFjR6bWESGDiKYjyz3kxQBPEQnyohzLDCqMhmwQV8jhy+SotApnX8LfHUb+7Kse8gGMd4yOZalDaKxJ965+RYkwQDQ1tlpW3AeEHPz2Fxqe41jCCvICHPKLpwNk0Hgjf11Euq8qwhghg6D7Fh0/TDeVGQSSCtlilMiExgaLjuPiHk2ke8jAMrbL/chk3R7GMTvdej50XbtFgnHO463XZWbvnV/m+p5FpVl/LFHCHRIhfbC+I2ibdHJtcQ32S41cIyn2Cl8ZXaU8nXBXLUpnYm2D2nlSXKM6tf0WMkDXtYLk5Arny6Ec00+qiMG7OGH26e5O/i5TWHfGYIy7rml6NbO2WnLvf5PtkjBM2kVtxPebjvV73ZtzbpFrLxoKPqY4mmvIYXXMaTVnmTRFzwmiYoCOGsihZg4xX62ES7G1XN92TtY3gTx745tb49s3ODySr7qUm1qnkDBm1xEj6711+5uPRV5PXqew5XkQrKVzU3OmcXDqiFwp1SUDyGGLmpAgmxdfPbWaIYc/f26E3PdnWJZkDfYvFLY63c7fN4e0YSWx3x1SnygrSP5zHjB/vOo2NHgt8uKIU7kQ8d1RtGeCX2j1vH0l0YUgkjKX0RfKW25fKutI+lHK2flUt2VJG54SLOr7ESfIQEgy4fHpDUInOxXIP9sKo9pqcxAx7jqXSKEby33SIDq9bQRPtuaAbN0+Uy2ylipUZE96j5nSrlLOs93NqKja+0MUyTbWoIupuTMsPx420+DwkVvtFiczzdXiDbnIfPEOvP9qzERgfOVVaLR1aZYKqYdZVAUshT7LqsygFuXlBQzDVkd8omYcZXviTF6UGTxrsnor/S7KMYMadZVetAGEYzl8mVK7SWiJedNNJLyaIKKzyePeGAz8n7blYjg8/r3eiCLmJ7H1lfiQfpFnTr9ADpCBT62aHizZG6DRbt/pvdhOMaX3uuPlQLqSW6rqKCrXLzIchsli4w/oxhGyuRSWbxhlCv8LjPPUVQ==
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Capture a purchase
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/check-claim.api.mdx b/docs/docs/api/locksmith/check-claim.api.mdx
new file mode 100644
index 00000000000..35cbf24cc26
--- /dev/null
+++ b/docs/docs/api/locksmith/check-claim.api.mdx
@@ -0,0 +1,71 @@
+---
+id: check-claim
+title: "checkClaim"
+description: "Check if claim is possible for a given purchase"
+sidebar_label: "checkClaim"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVsGO2zYQ/RViTi2gtYOgvei2WaTFtmkbrL3IwfBhTI4txhTJkJQ3hqB/L4aU117bbZFtgepiiR7ODN+8ecMeFEUZtE/aWajhriG5FXotpEHdCh2FdzHqlSGxdkGg2OgdWeG7IBuMBBU4TwF5972CGiTvv+O9UIHHgC0lChHqRQ+aA3hMDVRgsSWowVJ6cmELFQT60ulACuoUOqrO0vq92AmtJlBBlA21CHUPae/ZjbaJNhRgGKqrYYyT21ulAsX4j6E+OLkVWIyvBospaLuBYVgWVxTTO6f2bCGdTWQTv6L3RssMzPRzZM/9pSu3+kwyMVKBYUyaIv8bSGqvyaZ4Yosh4B4q0InaeC2dChQm/JYd+eFDRO9sLLHfvnnDPy8xmZFVgsFiZhxqLyRasaLCFFJQ/VfHl2gLg46WK+cMoYVDyj9cy/Le7tBoJbT1XRKBJOkdqYl4h0qMhZr8myxtZwyuDEG9RhPpPO2WYsQNXQLNDFtjZxLU8DBiLVZO7UWJxV2mS+6TyzBDBRSCC9f8Hk25OAxM0ok/4WeyFLQcIWF+vs9OCnw/XoPv0bIrkZxYd8astTmAJlSXl7nLgkUjIoUdBZHT+t8RnTcUSDxhFGhLSkLbwxG03YjU0Gn5z+G9BG2Wj3fEa6igpdQ41jfvYiYsy0sN08z9aT/K2DBloYnT/kRvBpaQ7LCIYBcM1NCk5GM9LfatTs2ks/x+44NLTjozka6Fc2n6GJzqJH+IkiOw3r30GBNutN3cfJvnWdn17HbJScsu6LSfcfVKPR4jndKQQx4EMjcpYaAA1fjykwstcoV++TSHoYLbIzVORcrrX2l/lGr0+mabF7KOf+ko7LO4MZsejnL7/iu23tC5XC4OFFke5PC4MrDPtcvBx4o/ZmzEhwNYUAFXqoDy9gKmZzvhg9tpRVGsUG5ZHdedzZVBo9M+z0rifsoE1HJLSdtNJVpKyGmJmFzADVUCrRLWJb0eoRGNc9s8eIyWZGM+4YjNb/fzDAWTsEV78k8eu+Iwd18kfTKVXjHdxyol+pqm3qC2XMnMuH5sggXIMWx9nOaZfbx0OnmXFTTcPvUC+n6FkR6DGQZeLlWuF8sKdhh0ac9FD0pHflfP+vCXJ/vuYRzq34uXd4WrBzhwzzLPdmg6/oIKmHjHSwk316syOL9CvCKHU9wGZm5DqLj7Fv1ocVci38zZz9HDhQDzKcqOWynJp7+1XZ5I3cc/ZnNu5vFu0zrFewI+8RUKn0q2LiNRbi281oNBu+myakPxyc+fj+WeQA==
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Check if claim is possible for a given purchase
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/check-event-ticket.api.mdx b/docs/docs/api/locksmith/check-event-ticket.api.mdx
new file mode 100644
index 00000000000..0d2549ce12f
--- /dev/null
+++ b/docs/docs/api/locksmith/check-event-ticket.api.mdx
@@ -0,0 +1,71 @@
+---
+id: check-event-ticket
+title: "checkEventTicket"
+description: "Mark an event ticket as checked in."
+sidebar_label: "checkEventTicket"
+hide_title: true
+hide_table_of_contents: true
+api: eJzlV02P2zYQ/SvEnFpAay226aG67SEptkkWQdfbolj4wKVGFiOKVMiRE1fQfw+GlD/WdrKJLynQk0WJfDPz5nFmPIDr0EvSzt6UUICqUTUvV2hprlWDBBkEVL3XtIbiYYD7gB6KB/gLva40eliMiwxKDMrrjlGggLfSN0JagQwjKOIIGUTExlJoO4MMOulli4Q+RGDNJztJNWRgZYtQQDD9EjLw+KHXHksoyPd4aOwubQqqxlZCMQCtu3iYvLZLGMfsJLZF+uh88yz8bdondDk7ZUVbwiX6L5oxTjXXZekxhGdNvXGqETJtPmnsmZAaXN+Uz1p5jWtxczqYLf6CQULnbMDA368ur/jnKVDSh9CHeVXOElriA7LrjFZRXPn7wKeGY6vu8T0q1pntjZGPBqGopAmYQedZm6STEy2GIJd47C9HWMneEKuhVwpDqHpj1qLqTaWNwVJQjYJpwUCzY0vjmAFp4jX8jha9VhMOjCN/fHH5y3H8fBM4eutIyJ5q5/W/bMqJDn3lfCuo1kFIxft/ODH/uF5Ij4feOh9XaInd+ar7XyHt1tH1PsqWthcnZFOj0IStWE8etbLRdrlJj6icF6XDxCt+0iljP5Q7j8H1XiXyKtfb8ps0dOvoVdy8YeO3k2x4ZBVJoZytjFY0E/Oo1smmNB5luf6PUJH8/ShDrO/eOy+05YvGN43T+P03Df0K/UuGmoj69fLyxG2zDMPynIxtBVP28TVXYm+lESECJuf+B3yNGbRItePm3fUUGyvVUEC+usplp/PUf/OBu+mYD1PjG3NuTfmw16DGvMF1PsQ2MuaxqMfuz/ZSj+69gQJqoi4UeQQIraZ61lt+vui8I6ecmSnXwmHfeedd2cdiIlIIwG3sKWIgudR2efF9yHfp1BZ2sRtZ7ji5KV1pcNnmik1ueiCvH1F69JBND6+cbyUn8I+/5zBmcL1Tzh6I7PRrXO86sOz0RRNfxPb8oUe/5nYN2lYunptyeR/DEm82cUIGTHKK5+oowu0+0Xm30iUG8ShVg7YUVW8jqdJoWsfiiXxTorRi4rVdZqJFkqUkKQI5L5eYCWlLLme6mqIStXNNHDuMVmhD1PUU1tubeYyic4Faafe+RJGIOC6K7bz4xPdhd/++cS6cuCX8RHlnpLbMf9TJMEn7AVbMkew0b9+YLaZxsdiNdkwyv3k6haUMFZtxKQl9kUHtAjH4MDzKgPfejCO/TlksHhYZrKTX6XY+DFDqwM/ltjx8Me6f/pwmsp/FNK2ejHEjKsvuraTpeTX5Ow3DfGXOsvt0jD3D/IbUsz04nG7P8GE/jWf7sZt/z/AgaWZcjBnUKMv4V2iYvl0rhR3tnTrqNlyZtrX63f2cNdyzoLcF5aAKRfSTHg1D2jF3Ddpx3DpIvGYHx/EzHQDLYg==
+sidebar_class_name: "put api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Mark an event ticket as checked in.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/check-privy-user.api.mdx b/docs/docs/api/locksmith/check-privy-user.api.mdx
new file mode 100644
index 00000000000..e8af3858ff5
--- /dev/null
+++ b/docs/docs/api/locksmith/check-privy-user.api.mdx
@@ -0,0 +1,71 @@
+---
+id: check-privy-user
+title: "checkPrivyUser"
+description: "Check if a user exists in Privy by email or wallet address"
+sidebar_label: "checkPrivyUser"
+hide_title: true
+hide_table_of_contents: true
+api: eJzVVk1v2zgQ/SvEnOm4CHYvOm22SIt2N2jQJNuD4QNNjizWFKmSIyeGof++GEp2/KEGaLPAornEIofDmfdm3nALocGoyAb/wUABukK9uo12vXlIGEGCwaSjbdgACnjL28KWQok2YRT4ZBMlYb3IZ8RiI7BW1okQxaNyDkkoYyKmBBIifmsx0Z/BbKDY5k8b0UBBsUUJOnhCT7ylmsZZnaOafk188xaSrrBW/Is2DUIBYfEVNYGEJnIOZDHxbr7/wCxRtH4JEsoQa0VQDBanqV3nuIdoBQWRoYBOwi6DEZ8nLqjCiG19kvqBs05C8PiphGJ2CMBsiGneyePl3dXzbi6BLDm+fU9PZiPD2XXsOmJqgk89Dpdv3vC/4wjvWq0xpbJ1btPHhOaASfQa92TCKyg5Si3XCEjge2B+xle//exkEYJD5c/Q/VIh4yuowtHiY6ryFSPx+NY5tWD0+lo7DsGac247CTqiIjRX9GI1GUU4IVsjH7HpPZf4SDbsr00U6hskZRSNwNZJcNav0FxpHVp/BIqKUTEjlrBOI0c7eVb43+mPF6r5pEM6CWuMtrQ/hkFpY6J/fuKgU4Q/c5KT7zvuFdkzP5Wy/j6vjuz+IlBkNM6U4vOgDINQ/DamDTc2JeuXYte7orToTPrPZCDGMNb+eXkkPXxSdZOzuLa5778zWETdJhILFE0Ma2vQ7FH4fVQBMa7ZWb72f0/tnbIOzX5ADFM0q1i3S6NGqgLP5iakXNCKKihgur6cNmw+7WeLhJRTS3m2tNFBARVRk4rp1AW9SrWl6qL1/HvSxEBBB3ehQ30mtLcxmFbzh+jRAh5Lxx4TqaX1y8mPeb7rT+3dzjlo3UZLmztGusft4VjE+UrOLhuwoqKK+WnS/3i3a4OPX+65da6eaTzUz8b+hSygXtXD92SVFywH9q3FuMkqysx/fn6oXO+o2j8s8oz5Y6BwyHKvKgd6YX0ZcgBDLz5kfMTfO8AgS0rqgbk8g2pvt6vrJBZKr9AbUbY+s6OcpY0oQxTo1cIxsGT1Csn6pRT1MGdEohDVEqVQ3ggfyJYDPKIKYZUugMeORlaHYrvD5+bDfYaDa65W/mDnsFDH3ojb55563XNxYI7wiaaNUzbP0FyF26EHZrC+zAo/vFZyH8wlVNwoxQy224VK+BBd1/FyT3Ixm0tYq2j798Bs3kmoUBmuudkWuCgKeNunMMnTgM1d21fNiURwY/QnrrTGhl60nR/08u2nu3su4eEtXAfDZ6J6ZGlRj1AASAgZ0twTeW0LTvllq5Zs2/vkv38BJC4aOQ==
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Check if a user exists in Privy by email or wallet address
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/check-ticket.api.mdx b/docs/docs/api/locksmith/check-ticket.api.mdx
new file mode 100644
index 00000000000..9819983623b
--- /dev/null
+++ b/docs/docs/api/locksmith/check-ticket.api.mdx
@@ -0,0 +1,75 @@
+---
+id: check-ticket
+title: "checkTicket"
+description: "Mark a lock ticket as checked in."
+sidebar_label: "checkTicket"
+hide_title: true
+hide_table_of_contents: true
+api: eJzlV01v3DYQ/SvEnFpAtgw3PVQ3H5rCTWIE9bpFYexhTI1WjChSGVKbbAX992Io7Ye9my9fUqCnFSXyzZuZN5zZAXxHjNF4d11CAbom3SyMbihCBiV1TBojlVBE7imDQLpnEzdQ3A9wF4ihuIc/iU1liGE5LuVQ0Gw6gYQC3iA3CpX1ulEx4SoMKpmhUhl3Dhl0yNhSJA4J1si5DmMNGThsCQpwFD94biADpve94T2hx9Zupn3KlIIbdE0tQjFA3HQCY1ykFTGMY3bSjLC8KkumEL5o6rV4hNPmk8ZCZONWn7TV0Oa6/KKVV7RR16ed2eEvBSR03gUK8v3y4lJ+HgNNOVXmaey1d5FclAPYddbopIX8XZBTw7FV//COtGjD9dbigyUoKrSBMuhYpBTNRKKlEHBFx3zFwwp7G6GA215rCqHqrd2oqreVsZZKFWtSEhYK8fzY0jhmEE2UNfxGjtjoGQfGUT6+uPjp2H/RqnjvfFTYx9qz+UdMedURV55bFWsTFGrZ/90D87fvFTI9Zes5rchFk6ryM/Q/E7QbH68OUXZhe3FCNjUpE6lVm5lRi41xq216VOVZlZ6muNJHM2Xsu8aOKfie9RS8yveu/CoN3fj4Mm3eRuOXk9FgEhWh0t5V1uh4rhZJrbNNtExYbv4joZj4fsCg0Cli9qyMk0KTSpM0fnulEa+JfxWoOVA/X1ycqDYnMCLP2dhOMGWfXstNzA6tCglwIvc/iNeYQUux9tJruz6m5hdrKCBfX+bYmXzqkfkwd7wxl56UDwedacwb2uRD6h9jnm5zaQ/J0NRAe7ZQQB1jF4o8AYTWxPq8d/J81rGPXnt7rn0LTxvOW/Zln24RNXEH6V+PEUPElXGrs29Dvp1O7WCX+2niVrI65WmaKXZJEpPb5ifrB0Imhmx+eOm5Rcnc738tYMzgai+ZAxDszCva7FsvduasSS9SX37fE2+kT4NxlU/n5iTeJbfU662fkIEEefLn8sjD3T7VsV+bkoJ6QN2QK1XVuxRUtCZu0q1JUiJJUynjxq0y1VLEEiOqED3jijKFrpR7zFSzV6r2vknzhjWaXEiCnt16c71IXnQ+xBbdwZckEnUw1h2wHvYl91XD2hzTSB9j3lk0TuKe9DHMWr6HtcQGOyPbt0aL/Qwn+PLm8bg1ZaTYzkWTsJcZ1D5EAR2GBwx0x3Yc5fWUteJ+mcEa2UxleD9AaYI8l7t74JPe/vDHPHr9qB7PjSdd3GrJCcs12l5WM+39gCrF8iwGT8fJZ3A4DOezeewHzmcwmHI3LscMasIy/TsY5m9XWlMXD04dXe9yI+wux7d3C9FQL4LaFfKT6k/oJxkNw7Rj4Rty47gjGGUtBMfxX9Gzf+g=
+sidebar_class_name: "put api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+:::caution deprecated
+
+This endpoint has been deprecated and may be replaced or removed in future versions of the API.
+
+:::
+
+Mark a lock ticket as checked in.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/claim.api.mdx b/docs/docs/api/locksmith/claim.api.mdx
new file mode 100644
index 00000000000..4bdb3d83bce
--- /dev/null
+++ b/docs/docs/api/locksmith/claim.api.mdx
@@ -0,0 +1,71 @@
+---
+id: claim
+title: "claim"
+description: "Claim a membership key for a lock. If not authenticated, requires an email in the body."
+sidebar_label: "claim"
+hide_title: true
+hide_table_of_contents: true
+api: eJy1Vk1v4zYQ/SvEnFpAsdOgJ93SRdqm3baLxEEPhg9jamxxLZFakrLXEPTfiyFlS7YVpxu0PskUNR9v3ryZBhzJ2iq/h3TewIsjC+l80S4SMBVZ9MroxwxSkAWqEhLIyEmrKj6HFD7wqUBRUrkk63JViQ3txcpYgaIwcjMRjyuhjRdY+5y0VxI9ZYmw9KVWlpxALahEVQilhc9JLE22n0ACFVosyZN1ITDF3ir0OSSgsSRIQZPfGbuBBDpjGaTe1nQe45/xnlAZ23UypxIhbcDvKzajtKc1WWjbZNQNZ3GfZZace9PVRyM3AuPlUWfOW6XX0VdnX2LlZY6QROc5YUb2TU9P1H0ntljUJLwRFf57p5akqhRpf8XtCgs35jd+eEgz1HpD+6uOF9EuOf+TyfZ84zw7abTncNIGsKoKpokyevrZsdfm0rRZfibJ0VeWeeoVOX6boR8LIIHAscs35+k9BCoeUjOrQMkerDYZIPemsdexCnZWZC1329tm4s2jldpRxgUvlfYTMcuVEyXuxZq8MFuyO6u8Jz2BNvzYlauMdhGhu9vbANSJi+daSnJuVRfFXoROZw85cbBMqf+oOt6idij521/R5aOFMjs9Bsohlx9vf7gMn1VLKHepM6/Hfj1sXRcFLgs6NsFpHiU5h2saL90K68JDCrOcLIkdRomz1liWOIZ4pQql1x21QldMLn1ysl55/g+/kCar5DPZLdkHNgUdHCX53LA8V8YFvFm6Uphu76ahjNOmU8l2yjrmps1Azlru2WAzamxtC1YC7yuXTuP9Uvl8Umt+vqms8UaaYiLN5SD4ZE1Wh8qKGCaw2pxadB7XSq9vvs3yc/zqaHaRHEfWMxcwliQOrmM92OVBkfj/ktAGeYsPPxtbIhfpt79nTLr7U2J0RrBSvwdh60QTK3UTlS5I5pea7J5VFbgPnnp9e/iKZVVQr0c9PToZ6g8GcjI8PGjDoDGUXpkQXEeKl4Cd+HgAExLgSkbQ7i5gPN4TlTVblZETS5Qb0plY1TpUDgvl4+wmjcvIUSU35JVeJ6Ikj5yOcN5YXFMiUGfccmrVQSdyYzZhBBVKknYBgQ67Px5nASrmaYl68GZ0sWj6tv0fd4yuzp6++mlVoNKMc+Bs03XSHLYM5SHGtN85Aon5aLgfLBLIuRHTOTTNEh292KJt+TiSJZ0vEtiiVbHR5w1kyvHzK+N2CMN3T93I/F6cbjSjWRworJmuYUWAFCAB5m+/OnGPviuC80XnHTEMcWsXbXJYQd6NypWVaDS8GEa/fh0j/DZUrm1EV/wON7ATz/H1h2j/ZsYW+hsX07f/4l5KqvzVu4vBwPj01/OM9bDbx0qThb0Qd6w/uIuVMiHfILDhrIEC9boOsw+iTW5q7ruBbp6JbajoKBeaJt6YmQ3ptj1Sw/N/JkXb/gPjN2AT
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Claim a membership key for a lock. If not authenticated, requires an email in the body.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/connect-stripe-account.api.mdx b/docs/docs/api/locksmith/connect-stripe-account.api.mdx
new file mode 100644
index 00000000000..30f22ceef2d
--- /dev/null
+++ b/docs/docs/api/locksmith/connect-stripe-account.api.mdx
@@ -0,0 +1,71 @@
+---
+id: connect-stripe-account
+title: "connectStripeAccount"
+description: "Connect a stripe account to a lock"
+sidebar_label: "connectStripeAccount"
+hide_title: true
+hide_table_of_contents: true
+api: eJytVkuP2zYQ/ivEnFJAu04XPenmBEmxbdoGsRc5GD6MqbHFmCIZkvKuIei/F0PKb+9mG9QX6zGcx/fNfKMOrCOPUVlzX0EJ0hpDMk6iV47GUtrWRCggkGy9ilsoZx08BPJQzub9vICKgvTK8Xko4X0+LVCE5EBg9iCiFSi0lWsowKHHhiL5kLwpPugw1lCAwYagBEPx0Xq29fS9VZ4qKKNv6Tzc39lOqOqWc5Q1NQhlB3Hr2I0ykVbkoe+Lq2E4n3FVeQrhh6E+WbkWmI2vBuOCzQp6BoVdUYjvbLVlC2lNJBP5Ep3TSia4R98Ce+6OXB1SmMECAz14DfNiF8EuvpFkMpxnzqKiwId2hpepFBBOaLySLP843+CsCdnf3du3/Hda/qSVkkJYtlpvxdAjVJ2xDMXrS325pvaZeqQnjIzP/p1pmwVTXAA9OeUpjOPVt0OgZyH47VrV92aDWlVi4PP/q6+hEHBFL6Xz62U6PHdCBWFsFNjGmkzkBCh1//XMXk7KtFrjQhOUS9SBXp0lD8cSWx2hhGlNnsQjBoFGkPfWC2UEN8pSaWVWIta0A/D2MiYXG1Xke/idDHklJ+Q35D+wKxjgaCjWluXJ2URDmuMSRpu7UW7B0dCTo27Qjn7E0x1G3dGQ90nI2HlWntRlUMfoQjnK9o2K9W1r+PrGeRuttPpW2gbO9eCzt1Ur+UbkfIFF5tRjiLhSZnXz3zxP8qm92/lBfSfMZOYma/CeGA65UyW+XxB68lAMFx+tb5DZ+uPrlKdhfNohgxN06k/aHvQRnbpZpwdJPL+35LcspsDt/uWgcR+esHGaTsTo0CpnGnQ0zcosbQo/8P+Q0BGfdnBBAcxVhuXuAqi9nXDeblRFQSxQrslUYtmaxA1qFbdiab0gg4vcjkquKSqzKkRDESuMvKysxxUVAk3F06WWAziitnad9F4rSSakGgd0/rqfJjC4JRs0R2+GXhR5iYrDFj3J/2gvvG5vDixFeoojp1EZxnBQyjwQM9jc7RHPmmDypJeHlZq6kR8dr795ATWPVjmDrhtI7Ht+nFkvZ/MCNuhVHt1ZB5UKfF3ttePZ4t58GdbaL+J0YV8taNeLhvtug7rlOyiAG/HwZcDD9lMZnO/xn8jhGLd+3hdQE1bpi6gbLN7nyDfTbaJh5+FiY3AV+cRYSnLxRdv5kQx+/mcy5eEePjAaW/EZj4/8HYOPOVubkEhqkZ51oNGs2qTokH1y//ImORKBM+VIVV3Fo+uyxdSuyfT9Hp7I9wxM3/8LVtOa5g==
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Connect a stripe account to a lock
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/create-application.api.mdx b/docs/docs/api/locksmith/create-application.api.mdx
new file mode 100644
index 00000000000..6f7fa1ff757
--- /dev/null
+++ b/docs/docs/api/locksmith/create-application.api.mdx
@@ -0,0 +1,71 @@
+---
+id: create-application
+title: "createApplication"
+description: "Create application associated with user wallet."
+sidebar_label: "createApplication"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNVktv4zYQ/ivEnJU4TduLbtnFtkifi42DojB8GItji2uK1JIjZ11B/70YUo4VxwjSAkF7kviY4cw33zx68C0FZOPdrYYSqkDIdNO21lRpFwqIVHXB8B7KRQ/3kQKUi+WwLEBTrIJp07US3idRhUdZhTH6yiCTVg+Ga9VFCuoBrSW+hAICfeko8juv91D2aWkCaSg5dFRA5R2TYzmaKJ19jvJcD7GqqUH5431LUIJffaaKoQDXWYsrS1Cu0UYqoA3iJRuKct1hQxOxyMG4zXOxoYAt7V++KIYOBWSXbrQOFONrVA8FsGFZwwTrBMQwyGmg2HoXs8HXV9/I5xzceoq3YPpWoBk9EXJds6JwFrL/LbgjsN9dXT3H8tbt0BqtjGs7VoEqMjvSl+odajWS9C2xbShG3JyFTdMaO8tQwqeREWrl9V7lt5SJymTbL89iTCH48AqUJ5D9SI6CqUZIhJIfkpIDfN8+h09qgpjiPCvsuPbB/EVasVcthbUPjeLaRIXVW5P0VUD+6TuFgU6t9SGtyLGY86L5LxDuN883Uy0jbN+fY929EyXyzrqzdm3sgWtKd2nbOKbg0KpIYUdBpWj+5/jNawqkHjAqdNkkZdzBBeM2imuaZs0LaI1cu0vuHWk2FNAQ114aUuujGN4i11DCbHc9m3gcU3cS4ZiaUxcslFAzt7GczayvtrExXF92Tv4v2uDZV95eVr6B0/b1MXjdpRCrbA8MxanGyLgxbnPxzzTfZalHtctjS72TSGXsc2N9BF6eFO/SBShhRRhSyc0/P/jQoETjpz/mMBRPCt1RCbbmZ9rDoSrL+mKbNowY9qWjIA2nAGHOp2M3/vAVm9bSsVkeeZCq9nF5UpwPB4O8sPbJlDHW9wkp9csBOihA4pYhun4G2uM91Qa/M5qiWmG1JafVunMpTmgN79XaB0WSSYl6ptoSG7cpVEOMGhlVZB9wQ4VCpyXpzfowntTeb6NQ1JqKXJz6++vtPAEj9GvQTU7yhKSejkhPbO+P+fkvhqIxdExfedZaNE7ATDTsxyxYwE7wepIHywJqyZRyAX2/wkj3wQ6DbOcgl4tlATsMJmfiYjkUUBPqNMz1Y1TfZ7Mv5mKCXLddZs1JiZHEyBI3VUUtv3h3OUnmj7/fzYXC48DXeC0yAR9kGMQHKAEK8G12SSZC2evBott0qS5B1imRkWI9ofpJfiSvDlng9hML+z7fmPstuWF4pDTLGoblMAx/A4L242o=
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Create application associated with user wallet.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/create-download-receipts-request.api.mdx b/docs/docs/api/locksmith/create-download-receipts-request.api.mdx
new file mode 100644
index 00000000000..2d85755e83d
--- /dev/null
+++ b/docs/docs/api/locksmith/create-download-receipts-request.api.mdx
@@ -0,0 +1,71 @@
+---
+id: create-download-receipts-request
+title: "createDownloadReceiptsRequest"
+description: "Request the creation of a ZIP file containing all receipts for a lock."
+sidebar_label: "createDownloadReceiptsRequest"
+hide_title: true
+hide_table_of_contents: true
+api: eJytVduO2zYQ/RVinlqAuw4WfdLbFkWATdJ2sRcUqOGHsTiWGVMklxw5NQT9ezGUfFnbQNEgfjElzpy5nTPqIURKyDb4BwMV1ImQ6bfwzbuA5olqspHzE711lBk0ZKq7ZHkH1byH10wJqvliWGgwlOtkowBBBZOD4jWpAmmDV2GlUP398KhW1pGqg2e03vpGoXMqTaHUKiSFyoV6cwsaIiZsiSnlEtEKeERegwaPLUEFnvhbSBvQkOits4kMVJw6Ok/pj9FOWSO4uV5Ti1D1wLsoMNYzNZRgGPTVMJLQvTGJcv7PUF9CvVE4Gl8NljlZ38AgjUuUY/CZstzfffggf+fNLK1RDflpVMp6yxaZjJJuuURodiqSN9Y3ElGaS54FC2N0ti5us69ZAPvLhMLyK9X8rrA5ZEbuMiw0xCQsYTsmOb2/KEcD+a4VzykTWAzlp+GXa3X9ikalkSg/LOeWcsaGLpPeX1wZwpRjS7wOooEYCtXL/CuYbe9me3LO0LlZPzFumPUnpBiKONJ2z9QuOahgzRxzNZuJYW4tr287L+ebmAKHOrjbOrRwzp/HFExXl0E/F0gQUr5HzIyN9c3N/0N+Hr0OsIujop+lv2OvRl0fGiUh9yyW5yVhogR6OnwMqUWGCj799QKDhvvj8E5AMNrPtDvqCaO92ZQXRWxvHaWdiA+sX4XiZ9mJ4WspS33Z1wkapMljPXcXFR7sVExhaw1ltcR6Q96oVedLU9FZ3pU9Qx6XTvrBtt4QW99o1RKjQUaVOSRsSCv0RvnAdjVVpdYhbIqwna3J50KqqazfH15KFcKhFv3JzbhZ1X61qv1uVcfl+q6S/iiIH7dOp2Ew/cOz6NB6GVghVj/xfQ7bu6Kp0R80oHOgoTru2ep0Fy40rEUv1Rz6fomZXpMbBnk9jrSaLzRsMVlcyjjnPRib5WygWqHL58vztOyfniZl/6zeb++rZeyJ5oVUW3SdPIEGYdnxMyFK+q4Mzpf6d+Rw2rdhMWhYE5ryCe0ni/u6psgnvhebUCR72FSPfz6/yIQ6mdxBamf6LPBXE+v70eIlbMgPwyFPlmfJcBj+BVT00bY=
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Request the creation of a ZIP file containing all receipts for a lock.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/create-event-collection.api.mdx b/docs/docs/api/locksmith/create-event-collection.api.mdx
new file mode 100644
index 00000000000..741a566c47d
--- /dev/null
+++ b/docs/docs/api/locksmith/create-event-collection.api.mdx
@@ -0,0 +1,71 @@
+---
+id: create-event-collection
+title: "createEventCollection"
+description: "Create a new event collection"
+sidebar_label: "createEventCollection"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNV01vGzcQ/SvEnFeSa7SXvTmGWzhpUSOW0YMgBCNyJDHikhuSK0cQ9r8XQ66ktbSJ4eTQnrTLj9mZN+/NjPbgavIYtbP3CkqQnjDS3ZZsvHXGkOQdKCCQbLyOOyhne3gK5KGczdt5AYqC9LpOx0q4TdcFCkvPgtiKkH0znr40FOI7p3ZQ7tOr9qSgjL6hAqSzkWzkLaxro2VybPI5sPE9BLmmCvkp7mqCEtziM8nY2c2GZhB1NAQvPSugQosr8jdKeQqBAswLqD0HHzWFZDPdOxkP0Wu7gvYsxoF96bbk7ytcDV9foLUM2MCW0XYTejvoPe6gAB2pCkOBnrmcdgfsNt4MrLdtOwDE618/3S8OKMEZRVJG8wc8hdrZzvL11S/885Ilj42UFMKyMWYnMuPUEFt+mA4vUQqmWQ2i9H/I+NFnVErz99A8DOT4lIOfy2DRKVzdxMvtApbOVxihBIWRRlFXlNhUq7deSdl8E7P7ErZYsYJT4grQCedzQWOMXi+aOCTldH8I/W9SQX8zl69RoefHD0YbPer4KZ0oYIumoYHidDoz5ES+Naj4c81+V8adhH+9urpU7b3dotFKaFs3UXiSpLekxuIdKtHV9fHPiNY2xuCCvVqiCXSOQEUhDOaIU7TExjAHP3a1Ryyc2on8LaGD0Nn38eVnmKveuwGx9o9ye+rD9gdZ8lp2kHDxu0tGMny/DcH3ZNmUiE5w3VtqcwBNqCYtaxvJWzQikN+SF8mt/xzR6Zo8iWcMAm12SWh7CEHblYhr6qf/HN5L0B5TeCe8uKJRXDseP2oXUv3GuIYSJtvrSSokI/lyFmEDIY0iqdHBOsY6lJOJcXITKh3X48by86j2LjrpzFi6Cs6HlQfvVJOMiuwTtMW5xRBxpe1q9DbLj/nW0ez8NEA9crYy/nmMOoLPn+To0gEoYUHoyUPRPfx+qLPv/5my5G9OVOgXnlp/IK48uQTy+2iTFjQ79qUhv0ttgNnz8TSN3X3Fqu6aYZeuHhn6sR2X+z3wtHpofaeVruPNLlmWoT7UqvlQZ5sdtudcpO3S9T18SqkQfx5yw+WTfMh+Xl94fjwnau+2WlEQC5QbskosGytz89VxJ5bOC2K5Jn5ruaGo7aoQFUVUGFGE6DyuqBBolbAu6mWXCbF2bhPGKWpJNtCpG8Ff99OEPHO8QtvbyS1ZpFosXozdZ83nWAleHbQ7qCN9jZPaoLa9qTCrawZbhuhCX/MC1qzCcgb7/QIDPXnTtrycyVPO5txvvM4qn3Fi1oQq/SXYA5OthNvs6Gjab2rlZfliweUbN1JSHb97dt4rFA9/P06Zbd0ficopvuPxmXsrPkMJUIBLwCWtpbU9GLSrJjM22+SEYMN4HOl5prs+c9Hueh7u9/nE1G3Iti0UXSiR36Gdt237L8dsqwk=
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Create a new event collection
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/create-lock-contract.api.mdx b/docs/docs/api/locksmith/create-lock-contract.api.mdx
new file mode 100644
index 00000000000..3847e0a118e
--- /dev/null
+++ b/docs/docs/api/locksmith/create-lock-contract.api.mdx
@@ -0,0 +1,71 @@
+---
+id: create-lock-contract
+title: "createLockContract"
+description: "createLockContract"
+sidebar_label: "createLockContract"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVk1z2zYQ/SuYPbUztOV60gtvaZq0aVLbY8vtwaPDClyJiEiAWYCyNRz+98wClChZauKmh55IAIvFfrx9ux24hhiDcfZ9ATloJgz00enVG2cDow6QgSfdsgkbyB86uPfEkD/M+qyD101TGR1vx61ZBg0y1hSIfZQ2FnJoMJSQgcWaIAdL4dHxCjJg+twapgLywC1lUJDXbJqkDq6SnDLFudigS6oR8g7CphE1xgZaEkMvhgyqNTZBlwhZerckLIi/+dAtDffUGquWVHCqQe9PvuoDG7uEXlwVreTDL67YiMTzR7SzgWyQIxzjNPnk5dHuWLWbf6IYbttWFc4rgnyBlacMGpYkBUNexJOvRxZlQE+NSan8teUhKc/F9rWLmX0GNT5dtfWc+HrxgTb+RXdWtLlho0/bETHk+EWKdMtMVm+2aHtdFEz+ZUY07bwyWrD6F7E/dNdGj45v9RkEE2QJ+yC/jljw0PciweQbZ30K9+XFT/I5hMyU0XrUslIl+lK5hQolqcrplYr+y0kYpQRM3w2Iw/zvaf0dfXkKnMmNVxevTlhekjKBarVxrUImVePK2KUawKwWjlXhyCvrgqIn48N/Mv0bWK7Je1yegJHU6ALbKkAu6XAta4omLVxri2PF+4n9jSyx0VcuvIvCKRo/X1wcR+Peig6p+EVbVQtT7eJQJCIQlmGLlfLEa2JFzI7/94hMS2JSj+gV2mSSMnbrgmRTsDh4cv6iYN1F996KKhjgcxipk42hplA6aRuN8xGoQvQ5TNaXE2zMRA+SftINpN9PpEJiS5H3Uo9ouRKyDqHx+SQK+NqE8ry18n/WsAtOu+pcuxqem3XDrmhTHSYXQNrBoUYfcGns8uzfab5Lt3ZqZ2MfvJPkpnSlbrjLlTy5bRuynhNypKH0885xjZLAP/6eClMe9M+dEmzMB9qMDRMbc7aKG7GrfW6JN9L2QMB2Ozaht09YNxWNPWKEzqnWMJ4edYDxaCT6cW/H73tb/0Tjo8gJtr7oxaWFi74PeLyPqVEft7mCDNZbebg8ytJOTjXs1qYgr+aoV2QLtWhtBAZWJmwir5FUeywPo1cUjF1mqqaABQZUPjjGJWUKbSFMYxZDZlTp3CpOA5XRZP1+gP98P42ZEPzXaPdOUr1EP9RexRxYv8t4oKcwaSo0VlAR0dsNxfQAa/EaGzOQTiwoyCAf56hYU7MMSqnC/AG6bo6e7rnqe9lOgMkfZhmskU0igocOCuPlv9gx0TPjdhQHP9wOs82P6nAqO2n/FsZWIBtHKsghYWlv/Otnfbad0L7bmq+MbidNSyaMY+LOOmGNdPgmvXM2lfujxBHJjzdea01N+KrsbI8rb67vpsIIw9hYu0LuMD7KoIqPKVZuGEhkrpS9Diq0yzZ2Bkg6BXfYhv0B4BndxLiezEbXJYmpW5Ht+11ygqwlNX3/BQ+/O/E=
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+createLockContract
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/create-transfer-code.api.mdx b/docs/docs/api/locksmith/create-transfer-code.api.mdx
new file mode 100644
index 00000000000..2a2d605e43a
--- /dev/null
+++ b/docs/docs/api/locksmith/create-transfer-code.api.mdx
@@ -0,0 +1,71 @@
+---
+id: create-transfer-code
+title: "createTransferCode"
+description: "Create a transfer code to transfer an airdropped key to an email address."
+sidebar_label: "createTransferCode"
+hide_title: true
+hide_table_of_contents: true
+api: eJytVk2P2zYQ/SvEnBpAu94uctJtEaTFNmkbdL3owfCBJkcWI4nUkiNvDUH/vRhS/pSdIIv4YonUfL15fMMeXIteknH2UUMOyqMknHtpQ4H+g9MIGQRUnTe0hXzRw3NAD/liOSwz0BiUNy1bQw4foq2QgkZzoZxGQe6wIK2Qxmvv2ha1qHDLu9IKbKSphdTaYwi3kEErvWyQ0IcY1LD/VlIJGVjZIORgkV6dryADjy+d8aghJ9/heVZ/pe+E0ew3qBIbCXkPtG3ZjbGEa/QwDNnFMLVT1UPK67uhPjtVHRcxCRbIG7u+GqvC7aP+bpRPuBWPl4vZ+1+yk9A6GzDw/v3dHf+dOnrqlMIQiq6utyI1Xp/1TlotAlo69Ii7WaLwqExr0BLnoZwltMQRZNvWRkU+zb4GDtNP03Srr6jopNAFuFeLHrIIOGRArkILXLvUtbFMQzpm5TKD1jN3yaQSk/0Ui9HjpY0U49LOPuph03bNinlylsfE+rxdX6Qn4YqI2tnBKCUJE8QOBcZ2haILqMWroTKatGweWzBFfoi/DN7f/TrtLp9T9m4dCdlRiZa4Maivd+zbzbJdXctVjZAXsg54jn+DIcj1FUAK2dUEOcxL9CheZYiE8t55YaxgBhamNnY9VvjSYYjMOovJxZIhfoff0aI36gn9Bv1HdgU7NN5P0eBDw0gUrrPfQOAHObureULGq2AMu541SKVjxW1doCh4VEIOs839bMeSWT9q3DBjCodZfyRGw6zCbZj1UTOGKNIMRJLLzteQQ0nUhnyWjBtD5W1n+fmm9Y6ccvWtcs2Ur97pTvGLSNgCq9Wpx0Bybez65sc8PyWrvdvlYbI8MdwJujRf9rhxyJ3U8fsKpY86kR5+c76RzKw//p3z2Xw4ZfPoRLbmE24PQitbc1PFhajCLx36LasyGFu4aDeS7DmWJT7v6oQMGORUz/2kwv13ovVuYzQGsZKqQqtF0dkIqqwNbUXhvEArV4nzRlVIxq4z0SBJLUmKQM7LNWZRga0jU4xVidK5Kk6X2ii0IXJsLOvPx3msginVSHu0k9Rd7Oa6GAf7Sfb94Uz81FE+9oDwP5q1tTSW+xT51I+sX8Dm/kjfIYP8MN0jx3jpdBIz+3k1zcxlBiWfo3wBfb+SAZ99PQy8nHqbL5YZbKQ3SUwWPWgT+Fnv1ewqFr/8M574d+L0LnGxsB3jLLNrI+uO31K+R5cWPlJvyuD8ivGGHI5xfHMeh0vIGzJIPRuWQwYlSh3vk/2496AUtnRkNVFn1o29en75+2kOGfCAOzrvZyIR3V9Mqe/TF3O+CQzDPsN0MxiWwzD8DwPQ2jU=
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Create a transfer code to transfer an airdropped key to an email address.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/create-verifier.api.mdx b/docs/docs/api/locksmith/create-verifier.api.mdx
new file mode 100644
index 00000000000..0629b235f84
--- /dev/null
+++ b/docs/docs/api/locksmith/create-verifier.api.mdx
@@ -0,0 +1,75 @@
+---
+id: create-verifier
+title: "createVerifier"
+description: "Create verifier. (deprecated in favor of addEventVerifier)"
+sidebar_label: "createVerifier"
+hide_title: true
+hide_table_of_contents: true
+api: eJzlV01v3DYQ/SvEnBJA9rpue6hu28At0iZGEK9bFIs9jMXRilmJVEhq7Y2g/14MKa32y7HrFOihvliUyDczb4Yzb1uQVFvK0JOE1NuGEjA1WfTK6LcSUsgsoac/yKpckYUEHGWNVX4D6byFW0cW0jmUJlu9R41LsrDoFglIcplVNcNACm8CiFj3KOfi1WhWKC1yXBsrTC5Qyqs1aT/Yew0J1GixIk/WBZOKAWv0BSSgsSJIQZO/N3YFCVj63Cg7xrLvxnXcJ5Q850CygiqEtAW/qRlGaU8cQNclJ81wkFMpLTn3pKl3JltxNLz5pDHnrdLLR20NVD3XHidisCe8EY0jgW7L+Fc9WERwcv5nIze8Y7SVY+kogcxoT9rzN6zrUmWhQCafHBtvj7HN3SfKPCfPcjl5RY6/Du5chyAPPTmMyYQHLLdRiEBOF/7YZ1cb7SLy5cV3/G8fYColybHq4Bvi0E1Z4l1JW0ZGiubQ8w6Lw3iHDydCPQDskr3yevaB4dI968BwT45L/uTuR5I07uRC5Ex45XkJ2y4RE/TDxffHOQmFqpzQxgtsfGGs+kKSS7YmmxtbCV8oJzDj/f9uyvZzU5FzuHykDHNsSg8p/GUagZYOvTU2rEh7FXvY4+4f8rpD17Xx012ULW0/HdM2K8gS84YiMzovVebPxawgYcmZxmYksLSEciPoQTn/nxMX/b1HJ1ALstbY0OebssxVqfRS+OB76DpP0PQrabIquyG7JnvFUD1RP15cnKgvzTCckN7YYEXIJrzmkrfcVVwAjM79D/jqEqjIF4aHet2E3swTJ4XJ+nKCtZoMfXLS9n2im7Q7PambtAdDqQtqgK3EydzYElIovK9dOpnwUVcpX5w3mp/Pamu8yUx5npnqqNd/sEY24dKI6DjwYNxHdB6XSi/P/hnyTTy1hV2MEuaGUxqTFIXMNkNscpiZvL4jtKFNxodfjK2Q0/bbnzPoEpiO9bIDgrX6nTbjTMdana3CizDwPzdkNywAgEvs4ziBrx6wqks6Hpjbkc0IuQmm+qTfBibEu4EaSPisixRcHpGy3Sdqa9ZKkhN3mK1IS5E3OotzV/mNyI0VxFcq1KDKVuSVXiaiIo8SPQrnjcUlJQK15Dap8p4IURizCtqnVBlpF+LpmXj/dhYCr43zFeqdL1Fuih29ued4O97SbxOVfYo8PfhJXaLSTGoot7a/F3NYM29Yq8jl4E86qs10XxGmh6JtkUBhnGestr1DR7e27Dp+HXOfzhcJrNGqeJPnLUjl+HkUXo9G/+pjL0Bei31ZezKyoSI1V98ay4ZXkACX46if+cq9yINDtfsCH3apfLEfT6vgF3h2mNVu0SVQEMrw06ftd72J/pzNGGtEOZokHFs8Mc0yqv1X9y52evaH2xn3n16hV0byEYv3/NMA76PDUTGHhhbetVCiXjZh+kCE5GvH2mWnTx00txDUSUraNu6YmRXprtsy5HnNvHTd3xZVABo=
+sidebar_class_name: "put api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+:::caution deprecated
+
+This endpoint has been deprecated and may be replaced or removed in future versions of the API.
+
+:::
+
+Create verifier. (deprecated in favor of addEventVerifier)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/delete-application.api.mdx b/docs/docs/api/locksmith/delete-application.api.mdx
new file mode 100644
index 00000000000..b437509b8e5
--- /dev/null
+++ b/docs/docs/api/locksmith/delete-application.api.mdx
@@ -0,0 +1,71 @@
+---
+id: delete-application
+title: "deleteApplication"
+description: "Delete application by id."
+sidebar_label: "deleteApplication"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNVU2PGzcM/SsEz7N2sE0vc0vQpth+BEV3F0UR7EGWOB7GGmlCUW6nC//3Qhp/YW0EzSk5eUZDkY+Pj37PGEcSoxzDncMWHXlSejOOnm09xQYT2SysE7YfnvExkWD74Wn31KCjZIXHGtbiD/UqmNNdWE3AboENjkbMQEqSahIu8aPRHhsU+pRZyGGrkqnBZHsaDLbPqNNI2GJS4bDGXYPBDOWAHb6sfQa4VizohNIYQ6JUct2+elV+riF255ALWBuDUtASf/Zl+TGVS8+XAOPqI1nFBkP23qw8YdsZn6jBUQq7yjOGgVIya7psrXTTmewVW7zP1lJKXfZ+gi77jr0nB9oTFKYo6eKy0m7XoLKWd/yJAgnbfR7c7crH19favwtb49kBhzErCFniLbkFvDXuvNZXpeOP/RBhFd0Ecy3gBDxjv8ZFgyQS5VreU2jR2hXW9pS8jW76sSY50PfdJX1lEwqUEBVM1j4K/1smFWEk6aIMoD0nMPab0NVfMYMReok2Sn2joAXOZ+F/RnPvo745z3Kk7fUlbQ89ASsNMO0RDWbDYX1QHHRRwEWaeaV/+BsQoVCKWexMXhdzcP9rBd9HfVeDZza+v7aDj6HkKKyXje/YH3lwuR5zUJJgPCSSLQlUbX91Rh56EoK/TQITZkjA4dBCmeaX/1/V9k5Lt2twIO3jyZSqjWiPLS63t8uzntOyrZYwMzQ7TBaPLfaqY2qXSx/tJg2s/SKH8nwzStRoo1/YOFyYye8SXa6yhxkV7pqXGZOaNYf1zZdlvp9vHdM+ncz1vsxrnsBssUf6S0nc+2J5X5EREmz2D++iDKbM5Oc/H4pJnnv3KYkZ+Rea8OihZuSbTT2oXvwpk0xYSOfQxXpvP57H2hb8eugTGywkz/3cXnR4jINR4pYdJVgZu6HgoMuhkmo861TXnIr4q1rYbkg5rBsYSI0zaiBpFLOmBkxwZfG4Oxh8H+MmFVV5thRSleq+rd/uHop6/gNwYhzB
+sidebar_class_name: "delete api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Delete application by id.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/delete-checkout-config.api.mdx b/docs/docs/api/locksmith/delete-checkout-config.api.mdx
new file mode 100644
index 00000000000..89920828c44
--- /dev/null
+++ b/docs/docs/api/locksmith/delete-checkout-config.api.mdx
@@ -0,0 +1,71 @@
+---
+id: delete-checkout-config
+title: "deleteCheckoutConfig"
+description: "Delete a checkout config"
+sidebar_label: "deleteCheckoutConfig"
+hide_title: true
+hide_table_of_contents: true
+api: eJyVVE2P2zgM/SsCTy2gmUwHPflWTGeLdrtAsZNBD0EOjETHamTJlejsBob/+4Kyk/lIZ9DNJZblRz4+PnKA2FFCdjF8tlCBJU9MNw2ZXez5JobabUFDJtMnxweoVgPcZ0pQrdbjWoOlbJLrBA8VfCxohcrMAZQ5RugwYUtMKZcYAVuCCpwFDU6gHXIDGhL97F0iCxWnnjRk01CLUA3Ah04QmZMLWxifp142pJxVsVbc0Fl+oZoodzFkyhLt+upK/p7GuHmKUpMYQtHEwBRYINh13pmi2OJHFtxwzjJufpBhKTuJvuymrC3ljFv6RTnlp+H91btzWqK3clmFyAp7biiwECB7+SKz10mF3nvceIKqRp/pt1mK5jX2nie9E6l/MCsMilKKSbmg6t772nkXtqUN0k3KfHmeU4plx3KGTxQoOXNHaU/pVkLBLEdL3MQHWxYbcQMVLPbXi2OPF4OzY/Go4Cd79clDBQ1zl6vFwkezy63j5rIP8nzRpcjRRH9pYgvPnfQtRdsbOaiJEoz6ecTMuHVhe/H/It9NqFPY9cNg3UmzJvmn8TppLylhHgQ5bwgTJdDzwx8xtSgN+fJ9KVPx4akJ5iDYuT/pIG2Y5g47d7ErL8rw/ewpHUAUd6GOBTf35r6Upb4e6wQNIvJUz/VZhafvVJfi3lnKaoNmR8Gqug9FVPSOD6qOSVHAzWQVZ3bELmy1aonRIqPKHBNuSSsMVpzv6rkq1cS4y2Ip7wyFXHw6l/XX52WpoouZWwyPbiYDqdOEnzbbE/7Dwzi9tstmUZn+5UXn0QURvhhkmA26gr2Ic4SChspZWGtoYma5HoYNZrpPfhzl9dSAarXWsMfkpkFZDWBdlmd7mtQX6b75e96cb9Xrq/AF+kejBDHFHn0vJ9AgLil7elyPGhpCW5b/MF98MIY6fgQ5W4/i8tMcf7z9eru8BQ2yxx7585mpS4JfMhqG6Ytl3FEYxxNBlrNwHMf/ALy1XUA=
+sidebar_class_name: "delete api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Delete a checkout config
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/delete-event-verifier.api.mdx b/docs/docs/api/locksmith/delete-event-verifier.api.mdx
new file mode 100644
index 00000000000..33b4531da3a
--- /dev/null
+++ b/docs/docs/api/locksmith/delete-event-verifier.api.mdx
@@ -0,0 +1,71 @@
+---
+id: delete-event-verifier
+title: "deleteEventVerifier"
+description: "Removes a verifier for an event."
+sidebar_label: "deleteEventVerifier"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVlFv20YM/isHPm2AEgdZ96K3AEuHbmkxNM6GwfADI1HW1dKdyqPceoL++8CTLDu2l7TdQ/MSSyJ55MeP97ED3xCjWO/e5JBCThUJ3W7IyZ/EtrDEkECgrGUrW0gXHTwEYkgXy36ZQE4hY9uoO6Twnmq/oWDQbEZfU3g26AxpwEtIoEHGmoQ4xFhW3RqUEhJwWBOkEKp2BQkwfWwtUw6pcEvHJ90PRiErqUZIO5BtE52FrVtB3ydnY+/SuslzphBePEZLNTgYG/GmDWQwTNU9m8FSg4fGu0BBv19fXem/pwfc2SDGF4apRuusW02xg6KVeSfkRP2waSqbxUbNPgR17k4P948fKBOFmbWtYoejmUJbSTgwRGbcQgJWqA7nAri2qvCxIkgLrAIdArWAERFYHh+0+3ACx0nAPoHKZ+ubr3V4iw5Xyr8vcXAknzyvD4ytE1rFxp2xjhx5Lq5SpO8TECv6CNOE9MNfAq+ufjptcmSRDcZ5MdhK6dn+Q7nyqSEuPNdGShsMZmr/v9p+0rWn7akpBFydLTKnAttKIIW/fWuQ6ThbneNWSnKi6Tyb/jG0B4i983JzGAV2sL06hW1eklF+mu2YUY1rnRBlIgWJV0vuacCVPtsg3x07puBbzgbwCt+6/Hk4fiVHbLN3Xl5H4wGNn8/dFA9OYyjqRVtVha0mHPI2vlZqs8PKBOINsSFmz98dkXlJTOYThqgCmpKxbleCdlNK2lXyAndGsO5jebcaCsapq0lKv1evKDNSQgqzzfUsSk+Ydaor/Wy6XmfdkRj0Uec09iBNLVeQQinShHQ207sn1FbKy9bp74uGvfjMV5eZr+FYN/5gn7dxHsyQLqggPY0YBFfWrS6+LvL94DWFXe7F+V4bObRmkOipL3rkTqv0+ZGQ4yU4/HjtuUZt1m9/zaFP4GbPkkPJaOzvtN1rKTb2Yh1fRKH92BJvVXjBusJHv7FvD7Esc7erExLV4TDUc31S4WRnGvYbm1Mwj5ityeWmaF0EFSsr2zj/pFMRaWSzNYl1q8TUJJijoAniGVeUGHS5TqQtxqpM6f06CmxlM3Ihcngs6+2beayi8UFqdAdfBnKZuBuZg+XoSfrdfty+ZB0asRX6LLOmQusU/8iTbuTwAjaK0cBiSCAd96OJyPrueK9ZJlD6IOrddY8Y6IGrvtfXQ5vSxTKBDbIdRm3RQW6D/s6nWf/Pqn54P24CP5pxCztbxI41ThmywarVJ0hAKTMueToT33Tuy2vZN6R0jGG/7BMoCfO47Xaj1U2WUSMH/idXqo7kdCH9cnt3O7+FBFQ7D4bpaALjAWfT67rBYu7X5Pp+ylb0WXPs+38BWDkbbw==
+sidebar_class_name: "delete api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Removes a verifier for an event.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/delete-verifier.api.mdx b/docs/docs/api/locksmith/delete-verifier.api.mdx
new file mode 100644
index 00000000000..f12266169e4
--- /dev/null
+++ b/docs/docs/api/locksmith/delete-verifier.api.mdx
@@ -0,0 +1,75 @@
+---
+id: delete-verifier
+title: "deleteVerifier"
+description: "Remove verifier. (deprecated in favor of deleteEventVerifier)"
+sidebar_label: "deleteVerifier"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFV0tv3DYQ/ivEnBJA9hpuetHNQJ0irWMU8bpFsdgDLY1WzEqkMhxtshX034MhpX37UecQXyxKnNc33zy2gxwbwkwz5pAytZiAa5A0G2c/5JBCjhUy/o1kCoMECXjMWjK8hnTWwb1HgnQ27+cJ5OgzMo1IQgqfsHYrVKtB8Fy92VpSxqpCrxwpV6ho4HqFlkcrbyGBRpOukZF8MGREZ6O5hASsrhFSsMhfHS0hAcIvraFtBPue3MZ7yuTn4n5WYq0h7YDXjagxlnGBBH2fnDRTuWx5leeE3j9r6sZlS6Xj5ZPGPJOxi0dtjWi91J7AP9pT7FTrUWm/Af1JD+ai3DfOevTy/fLiQv4dBGQ8S5IIa22ssYuN7hBf5iyjZZHTTVOZLPBm8tmLcHds3D18xowluyQsYxNNE/q2Yr9zURPpNSRgGGt/SoFtq0o/VAhpoSuPu0DNYEAE5oeGxg9HcBwp7JO9xL9Y4KO2Wtj0IoGRwcdkPHk7cOQpvUKRvk+ADcsRNlXbx78E3l38cpzkwCLjlXWsdMulI/Mf5sKnBqlwVCsujVc6k/s/lPajrO2np0bv9eJkkDkWuq0YUvjXtUoTHnrrKJzQsok95nH3D6HdQezW8dWuFhhhe3cM27REJfxU68GjWi+lQoSJ6FkVjlTuMOKK34znn44doXctZRG8wrU2fxqO39EimezW8ftwOaLx66lOcW9Fh6BetFVVmGqDQ96G10JtsrpSHmmFpJDI0U9HZFoiofqqvdI2uhSGUwxBsskljpE8w50BrLsQ3rWogqHqauTSbYdpmG5cQgqT1eVEN2YyNtVJN7SEftLttJ9+0h1Mhj4MYjEUx2NLFaRQMjc+nUxE1NeGy/PWyvNZQ45d5qrzzNVwOET+Ipe3oThU9B1kOu1r9KwXxi7O/p/muyi1UTvfbg93ktWYp7hDbJIkJsfBJecH1BQ6Ynx476jWkrk//plCn8DVljK786Mxf+J6O1h1Y86W4UWYul9apLVMYTC2cEFuSOJ9CEvdjHFCIkPZx3gujyLc3FMNuZXJ0asHnS3R5qpobQBVV4bXoRmglEjglMmWyMYuElUj61yzVp4d6QUmSttcytMUQ1SqdG4Zpm1lMrQ+EHoI6+OHaYiicZ5rbXe+RKapnb1tz/FuW3U/vKkNkDN+40lTaWMlLYE+3cDzGawEOt2YCOfoUrpd4dL9NSs93ITmCZTOs+jqugft8Z6qvpfXMZfpbJ7ASpOJxTnrIDdenvNNd3gUgDefht3hrdrfFU9GNjLMCptWumrlBAkIvbZLqZTQqzw4XCFf4cMulK/24/nV8hWeHWa1n/cJlKjz8CuiG25dZRk2vCN/NBakk2ya6m/XN9fTa+FXK2Tb9ICDxhEMnHSv6+KNqVui7fuNtyxn8bHvvwNyg5eK
+sidebar_class_name: "delete api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+:::caution deprecated
+
+This endpoint has been deprecated and may be replaced or removed in future versions of the API.
+
+:::
+
+Remove verifier. (deprecated in favor of deleteEventVerifier)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/deny-attendees-rsvp.api.mdx b/docs/docs/api/locksmith/deny-attendees-rsvp.api.mdx
new file mode 100644
index 00000000000..638ad53491a
--- /dev/null
+++ b/docs/docs/api/locksmith/deny-attendees-rsvp.api.mdx
@@ -0,0 +1,71 @@
+---
+id: deny-attendees-rsvp
+title: "denyAttendeesRsvp"
+description: "Denies users to attend an event."
+sidebar_label: "denyAttendeesRsvp"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNVk2P2zYQ/SvEnFpAaweL9KLbpk2KbdM0yHqRg+HDmBxbjClSISntCoL+ezGkvPbabtKmKFpfLJGjNzNvPgdwDXmM2tlbBSUosv1NjGQVUfgQugYKaNBjTZF8gHI5gLZQQoOxggIs1gQlWIoPzu+gAE+fW+1JQRl9SwUoCtLrhvGhhHdZTmg1gwKCrKhGKAeIfcMw2kbakodxLC6qMU7ubpTyFMJXVb11cicwC19UFqLXdgvjuMpQFOIrp3qWOEWWzkayka+waYyWia/5p8CahnNot/5EMjJzntmNmkKGlbrRZGM4kkXvsYcCdKQ6XDIv/U69+4mspiDaQD6I6ASmkAm0gjqycZboCY2zIau+fvGC/56D3LVSUgib1pheKEZUZ4ixogwJ/4AG2xqDa0NQbtAEOuXlOKznBBTANn3pHpvGuw7Nxct9ah7ubFuvc5JB1JGtgpTomeeXl5i6tR0arYS2TRuFJ0m6IzUTr1CJKXdm/yJBNYWAWzr3j9Nig62J7MMUb7F2qhdZl9BB6Gz77FzNWAB57/wl3IMol8AxVz+TJa/lRAmXzOsEsqfv5Tl9i4oE57foXSvQk6hxp+12T53YOC+UoyCsi4Ie9f+ATU/BtV5SMmnjWqsu8HfOyjsX3yThzMYPl5Lp3jIG1xhX3kabJx5Um465DXqLRgTyHXmRgvSfM7KoyJN4wJC6DJsktN27wNHkVnFUDF8n6y65d8iesYCaYuV4DjUupAbK/b+EeXc996Fr5sNUzuN8OOoa45zHFjf5hJjHVOsNlFDF2IRyPmfpUOtYzVrLz1eNd9FJZ2bS1XDaXt97p1rJLyIbCTyRniOGiFttt1d/D/kuf/UEu2KjZet17O84fDkg94GOq5JV7kcYv68JPXkopoc3ztfIIfrl44Jb3s0hN44HTaN/pf4wTLHRV7t0kCbt55Z8n5oip9OHw0B8/Yh1Y+h0gC33ObIaGWHjkqopwPeJCfF2Tw0UwHHJFFyfkfIkJ7iRa0VBrFHueP5sWpvigEbHPjUK4vJJ+abljqK220LUFFFhRBGi87ilQqBVXLp6MxEhKud2aREwWpINyZ+Jid9uF8lxzrka7dENp5V4WofEtA89M344VOVfmcpTMCI9xnljUNs04HyaXTnZl9AxQz7rKg+rVfl8/Ukpvyqg4koplzAMawx078048nGOZ7lcFdCh17kSlwMoHfhZPbWCP/Xmuw/TGvS9eL63XfRhn2WpDjs0Lb9BAZxihwWRy+ibLDhd577BhmP6Rs7ailBxnS2HSeLHrPlqwTgHhLNey17kL26kpCZ+UXZ11NXe/3634LKd9szaKf7G4wMHHB+ytS4xkTdGPhvAoN22qUFDxuTfH0/TF8Y=
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Denies users to attend an event.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/deny-rsvp.api.mdx b/docs/docs/api/locksmith/deny-rsvp.api.mdx
new file mode 100644
index 00000000000..077a879046f
--- /dev/null
+++ b/docs/docs/api/locksmith/deny-rsvp.api.mdx
@@ -0,0 +1,75 @@
+---
+id: deny-rsvp
+title: "denyRsvp"
+description: "Denies a user to attend an event. (does not airdrop!)"
+sidebar_label: "denyRsvp"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNVkuP2zYQ/ivsnBJAsYNFetFtgzbFtmkaZHeRg7GHMTm2GEskM6ScGIL+ezGUbMtrB0kXKNqTKD7m8c03jw4MBSaNiQyUiVsqwAdiTNa7GwMlGHK7D3EboICAjA0l4gjlogProISAqYICHDYEJThKXzxvoACmz63lo1BDUbMNIhZKeDfcU9bMoICoK2oQyg7SLogY6xKtiaHvi4tqaq8318YwxfhdVW+93igcLl9UFhNbt/6mrjYS/6iu+0j8Y7oeHj/9hZylqFCJPpW8wpTIGYVO0ZZcmqlnxlNUzieFlg378NPzbFAM3kWKouXq5Uv5nEq+bbWmGFdtXe+UETVGpYoeK5KtrAkK0N4lWZUdYAi11ZkO809RBHbnbvnlJ9Ly0LV1jcuaoFxhHamAwMKmZAf7pnE7B6U4wfrSOYbAfov1xcM9945nrm2WA4sg2SRWQWZy38vWq0tg3bgt1tYo60KbFJMmuyUzU6/RKIk9xTT7FwFqKEZc07l/QpcVtnUSH8aQq6U3OzXoUjYqO9g+O1fTF0DMni/JPV4VRk+x+o0csdUjJK+92f2ahezhe3UO311FyiZq1M63CplUgxvr1nvo1MqzOtCYvtr/AZpM0besKZu08q0zF/A7R+WdT2/y5QGNny+R6d6JDMkxSb6VrQ84mDZvS51jh7WKxFtilYP0nyNyVxGT+oIxFx8xSVm3d0GiKaVikgzfB+s2u3dkT19AQ6ny0l+Cjyn3llRBCfPt1ZzjNsy7MZ37eTepGv1c2tG8mxSKXupslj90pZZrKKFKKcRyPpe3sbGpmrVO1i8C++S1r2faN/C4CL9nb1otP2owGaQpnEqMCdfWrV/8M8m3w6uD2AcxWrds0+5WgjmER/rHJDaict9F5H9JyMRQjIs3nhuUgP3+8U4K4PWRKRMhGOwftDv2Mwz2xSZv5Gb3uSXe5RJp3crnd2Ps7rNb6u3eTyhAQB78uTrz8HBPSY22hqJaot5Ia1m1LoOKtU27XANIMiNTyeoNJevWhWooocGEKibPuKZCoTOSlXY1eqUq7ze5sdZWk4uZx6Nbf97cZS+ETg26yYkwRo0TzInJ3THNntx+R5ATfU3zUKN1uY1x7lADpRewFbB4MKA8Tkjl6RQjZsrutAc+FFBJepQL6LolRrrnuu9lewhbuXgoYItsh/RbdGBslLU55P83PX72YRxlnqvTaeyiS3syZRu3WLfyBwUIk45jn2TLkyx4PKQ9wYYpmk+24/EA9wQ7pvHrH/oCKkIjab3oxhvXWlNIk7dnJV7Kw6FAvv/rVqj9N9UHDfU=
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+:::caution deprecated
+
+This endpoint has been deprecated and may be replaced or removed in future versions of the API.
+
+:::
+
+Denies a user to attend an event. (does not airdrop!)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/disconnect-stripe.api.mdx b/docs/docs/api/locksmith/disconnect-stripe.api.mdx
new file mode 100644
index 00000000000..aa780a621a0
--- /dev/null
+++ b/docs/docs/api/locksmith/disconnect-stripe.api.mdx
@@ -0,0 +1,71 @@
+---
+id: disconnect-stripe
+title: "disconnectStripe"
+description: "Disconnect stripe account."
+sidebar_label: "disconnectStripe"
+hide_title: true
+hide_table_of_contents: true
+api: eJydVU2P2zYQ/SvEnBKAu94GPem2QLZF0m0R1F7kYPgwpsYWY4pUyNGmhsD/Xgyl9ec2ReKLRZEznPfmvdEAoaOIbIP/UEMFtU0meE+G5xxtR6Ahkemj5T1UywGeEkWolqu80lBTMtF2EgsVvD9EqlRCFRoTes+3oKHDiC0xxVSyWAnokBvQ4LElqMATfwtxBxoife1tpBoqjj1dXvPXeE7ZWvIm01CLUA3A+07SWM+0pQg561evccHs7us6Ukr/e9VjMDuF4+FXLxOcfgtZyIiUuuATJdl/d3cnf+fp5r0xlNKmd26vjjxTfcVX1vDr3S/XGYR8ZZPygRX23JBna5CpUGGCZ/IsUdh1TjZK1HBdd1h/IcNCSu8crh1BtUGXSEMXRQ5sRxgtpYRbukYsTG2wdwwVLBqKpL5hUugVxRiisl4Jyo111m8VN6SEaEpFChd35qyBLcsafidP0Zo5xWeKD5IKsvw0tMRNKPokR0xFUdxABbNhEk6eSWtnw0mD8ywdNSwpR/H10UEFDXOXqlmJSq3l5rb38nzTxcDBBHdrQguXkvgUQ90bWaixShCdnWdMjFvrtzc/lnk+Rh3Sro7Gm0v/xo6M9ju0Q658Eaas14SRIujp4bcQW5Qeffy8EFHdn+tiSoKd/YP2R4tgZ2925UXxz9ee4l78BNZvQomb2vVUYKnHF5ygQUge8by7Qng4p7oYnm1NSa3R7MjXatP7Qio6y3u1CVGRx/WoHmt2xNZvtWqJsUZGlThE3JJW6Gsxg91MqFQTwq541VlDPhXpTrD+/LAoKLqQuEV/snP0ojoMvbPSh6O5vj/mJkaZ/uFZ59B6Yb2oY5gEu4TqOOmEPtBQnQ+lSbQrDU1ILCHDsMZET9HlLK/HjlTLlYZnjHY003IQHPJcH9z8nyDe/D0NvrfqfJ6+CuBFJ1408YyulxVoEJEcB7cY4acquByzP1HDKYF5lTU0hHX5UA3TiXtjqOOT2NMZKWY7TJj3D48PiwfQIBP2xCYX3iq5X61qGMYTi7Ajn/OhSJa1lJfzv2QulzM=
+sidebar_class_name: "delete api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Disconnect stripe account.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/download-receipts.api.mdx b/docs/docs/api/locksmith/download-receipts.api.mdx
new file mode 100644
index 00000000000..1c033445f6d
--- /dev/null
+++ b/docs/docs/api/locksmith/download-receipts.api.mdx
@@ -0,0 +1,71 @@
+---
+id: download-receipts
+title: "downloadReceipts"
+description: "Download the ZIP file containing all receipts for a lock."
+sidebar_label: "downloadReceipts"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVU2P3DYM/SsCTy2gXQeLnHzboh/YNgmC7C4KdDAHjcSxlbElRaInnRr67wU19nxlmqDJISdbEkU+ku9RI/iAUZH17sFADcZ/dJ1X5h1qtIESSEioh2hpB/VihOeEEerFMi8lGEw62sB3oYafp5uCWhR/PbwVa9uh0N6Rss66RqiuE3FyK9Y+CiU6rze3ICGoqHokjKkEsewvKGpBglM9Qg0O6aOPG5AQ8cNgIxqoKQ54ieLN3k5Yw36TbrFXUI9Au8BurCNsMELO8moYBnRvTMSUvhjqldcbofbGV4MlitY1kLlWEVPwLmHi87sXL/hz7u5x0BpTWg9dtxNzG/C8nByGK4qO2IEKobO6NK/6xwbe+i8QEtY+9oqghpV1Ku4g55wlvLwG5SdlBOeOiT4T8X1i4ysh/eo9ajqr3wJ6TEk1CEsJITLnyO6LMR9cqdsM8eWnEA8Ec57E2g/OCB/LokHHhEbz3aFnCT1S61lXDVLhObVQQ7W9q2YlVHOrq3HieK7GExrmosC4nbUxxA5qaIlCqquKDVNvqb0dHP/fhOjJa9/dat/DJWPfRm8GzQvxWFwCy+DcYyLVWNfc/D/Pj/tbB7fL49h45Brv67UfHodicchZN7xeoYoYQU4/v86E/f3PJ8gS7o8NPHGigv0Dd0cFq2BvNmWjyPvDgIXrvFz7cs9Sx4bPJS3xas4TJHCR9/ncfZLhwU6E6LfWYBIrpTfojFgPrhRVdZZ2ZbKhU6uO60FWb5Csa6TokZRRpEQiH1WDUihnmLF2PWUlWu83ZZR0VqNLhVhTWq8fnkoWwSfqlTs5mfkjTkb2GfTxqIJvGtJTwQn/pip0yjpuSiHPOBF7Adu7op0jkCkeSKiPI7w+HbNLCa1PxLfHcaUSPscuZ97e965eLCVsVbRqxX1bjGBs4n8D9Vp16XIun6b7w7tJxj+K84fhai4zoxyzZ6u6gVcggel0fIFYMl+F4PK9+AoMp3XLyyyhRWXKgzxOFvdaY6CTu5dvBEvzMJV+++UJJKiBm3dQ1IUMi/OrsMZxb/HkN+hyPqAkXjO+nP8F2qXmBg==
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Download the ZIP file containing all receipts for a lock.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/eject-user.api.mdx b/docs/docs/api/locksmith/eject-user.api.mdx
new file mode 100644
index 00000000000..8f584f109d2
--- /dev/null
+++ b/docs/docs/api/locksmith/eject-user.api.mdx
@@ -0,0 +1,71 @@
+---
+id: eject-user
+title: "ejectUser"
+description: "Ejects a user given their public key. In the case of failure, a rejected promise is returned to the caller."
+sidebar_label: "ejectUser"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVk2P4zYM/SsCTy3gSbaL9uLbbDEtpp+D+UBRBDkwNh1rI0teSspsavi/F5Q8STbJDlBs0d4smaIeHx9JDeB6Ygza2dsaSqD3VIUnTwwFeKoi67CDcjFA2isXy3FZQE2+Yt3LISjhRo54hSp6YrXWW7IqtKRZ9XFldKU2tJup27SpKvSkXKMa1CYyFQoVpzupVj27TntS2iumENlSrYKbjhlDPIMCemTsKBD7BMtiR1BCvuln2kEBWkD1GFoogOlD1Ew1lIEjFeCrljqEcoCw6+WgD6ztGkYJS4zJh3eu3onFp1E+BI5ViEy1qjGkYBO6NVnhjxJMr9cWxejC1ZWzgWwQz9j3RleJ9Pl7L+6Hc2RuJbRAAVjXWkzR3LEkK2jy2ek4jqNc5HtnvWwO8PbNmwvYY1WR9000ap9t+AJE/RGO4Yj7C7RmiN9eQvUOa3WfKZ/9e2iI2fE5kgLoI3a9oeniKdeqjiRZ1HaLRtdK2z6G2RHub85xSyWIRq0LCmNoHeu/shZ64sZxp0KrvcJK7L8oMhuNwZVgbtB4Og21I+9xTZeCranBaAKU8KeLCplO0TpOK7JB4LwK/wSF8BJ0SEz+5sL1sRfItH13Kd1PVpzIPU00ptHmPAeB2KJRnnhLrFIm/3f+HltiUs/oFdoMSWn7EoK261T3fJDxK2z9KK1CVw8pvJuk00lnHYXWSfvtnU+Slu5Vwlw6qp8P+wob5zSFljnKPTCygRLaEHpfzufGVRvf6dDOopXvq55dcJUzs8p1cNq879jVMaVaZVwwFqcefcC1tuurf+b5IZ/au10eBsqDZCznII+VfQLkSpjatKxXhJxmUf74wXGHkpWf/niEsYDrgxyOnGCv8ySYhgP2+mpzGA0fIvEOhHZR0P2h6d+8dIhhFNPGJZ9T8p5SyOqXFw6gAElAjvXtWfR7O5lqW12TVyusNmRr1URb5X6uw041jhVJaSQt6WpDQdt1oToKmAaND45xLZPS1lLFupkiVq1zGy+aM7oi65OQp5B/vX1MEYqeOrRHf5KA1DThP8E8HArtP57pU94CfQzz3qC2ktukwWEqhQWkUoACyuNRn6thWUArdVMuYBhW6OmJzTjKdk51uVgWsEXWuS4XA9Tay3e9bwyfJeKr+2mMf60+B/RFdVYQbdFEWUEBIrnjl8m4HAtoCev0kBqm/9/nq64excvh/Fmjk7LMJ66rivrwqu3yqKXc/f7wKAU0vWo6V8sZxmd5o+BzxupS6Kki094ABu06pu4I2afISUbGUaGdVGeK6iIbw5AtHt2G7DjuyQmyFmLG8W8korBv
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Ejects a user given their public key. In the case of failure, a rejected promise is returned to the caller.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/email-ticket.api.mdx b/docs/docs/api/locksmith/email-ticket.api.mdx
new file mode 100644
index 00000000000..961aefbd981
--- /dev/null
+++ b/docs/docs/api/locksmith/email-ticket.api.mdx
@@ -0,0 +1,71 @@
+---
+id: email-ticket
+title: "emailTicket"
+description: "Send QR code by email."
+sidebar_label: "emailTicket"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVktv20YQ/iuLObUAbRpueuHNh6Rwk7hpJKMoBB1G5EjckNzd7A6VqAT/ezBL6i3HqFOguohLzs7M982zA+vII2tr7gvIgBrU9VTnFTEkEChvveYNZLMOHgN5yGbwzubVezS4Ig/zfp5AQSH32okOyGBCplB/flS5LUgtNipqvIYEHHpsiMmHqE6LsEMuIQGDDUEGhviL9RUk4Olzqz0VkLFv6dTEwyCndCF6Q15Sg5B1wBsnarRhEuf6PrloprZ5dVcUnkJ41pSAVTgIXzQW2GuzetJWRZv74lkrb2mj7i+D2emfi5LgrAkU5PvtzY38HSt6LWSrQIZFWW4Nk2ERQ+dqncc4p5+CyHbntuziE+USd+clK1gPlsKoY5RaWFsTGhAQS2xr3mIybV3joibIllgH6uMvgVc3v5w7KsmkdFDGssKWS+v1P1QotsqRX1rfKC51UJiL/A9hOfHqFFxDIeCKzhk/gAd/21ahp1NvrY8nMizufNf9M24SYM1yhgfLd4daYEvbq3PapiUpzdSozehRg5U2KyXpRYHV0npVWBp4pa86/Fge/BfceQq29flA3tK2pvg+Hb+RIa/zB8tvovDAxq+Xsv3RiA5hfdnW9VLXOx6KNr6WTuANSkX4NXlF3lv/vzMyLcmT+oJBoRlcUtpsIUg0uaQtkmdyZyRrEuG9FlUwVl1DXFrp6M6GWNLSljJI17cpOp1ybPFpN7bcPu0OumKfdrFv9Wls3nEQiIGhcbe+hgxKZheyNJVrodFcXrdGnq+ct2xzW1/ntoHTRvfB26KNRaEGn0H65rHGwLjSZnX17zRPhls7tfP99JpINIf4DDNsFxwxuW26sbURevKQjA9vrG9QIvb7X1PoE7jbp8qBEnT6LW32LR+dvqriizgPPrfkNzIfQJuljffG4D1GWOrdFickICQPeG7PEO7klPN2rQsKaoF5JeN22ZpIKtaaN7EJkJRGzKUYaG1WiWqIsUBGFdh6XFGi0BRSlno5olKltVWcc7XOyYSYyCOs9/fTiELyqUFz8CUmidotDUded/tSe3ozGIlk+sqpq1EbITsmRTfm7QzWQgg6LeJbS9l+YciOh3q2nbtDAs8TKKUMshl03QIDPfq67+X1EJ1sNk9gjV4PZTbroNBBnotdnT+J6qeP42j/WR3vJRdRbXPGSH6ssW7lBInsCQcLkBTFizw4XVde4MMhkS/2Y7/QvMCDIXb9vE+gJCzi1tmN3+7ynBwf3Dpr31L5u+b34Y/JVPKmlSTabzDHZR7VX3Sp6waJqa3I9P3OQ5azeNj33wBTZeQt
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Send QR code by email.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/event-verifiers.api.mdx b/docs/docs/api/locksmith/event-verifiers.api.mdx
new file mode 100644
index 00000000000..529a5f4fa69
--- /dev/null
+++ b/docs/docs/api/locksmith/event-verifiers.api.mdx
@@ -0,0 +1,71 @@
+---
+id: event-verifiers
+title: "eventVerifiers"
+description: "List of verifiers for an event."
+sidebar_label: "eventVerifiers"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVkuP2zYQ/ivEnFqAay+26UW3PaRB2iQost4WheEDLY0kxhSpHY68dQX992Io+bG2u03QQ32xKM7zm29m1ENokQzb4N8XkAFu0fNvSLa0SBE0RMw7sryDbNnDY0SCbAku5JuPxpsKCVbDSkOBMSfbihnI4IONrEKptns7qgykjFfJ+gw0tIZMgywuxK4VrdZwDRq8aRAyiK6rQAPhU2cJC8iYOjx39DAKxbzGxkDWA+/apMxkfQWDhEYY2+AjRrm/u72Vv9fDVaYoCKOoaMiDZ/QsWqZtnc0TVvMvUVT7S9dh/QVzlhRJkGU7OiaMneN4ImiIzA40WMYmXjPgO+fM2iFkpXERT7FYwhQirM4d7S8uwLgwOOhUx/tvVdgX/qsUPPJzoM2JsPWMon5VOtX+NbvCgmHQwJblCHuqwjD+NNzdvrks8aeg9jyYqc/41GFkZfKND88OiwqLGQwa3tz+cKkqnFc2Kh9YmY7rQPYvLBQH1SKVgRrFtY3K5CI/+y+MuSj4y8o2GKOpruJTYGk6x5DBH6FThvA8Wmm/jmv0LOG8Gv55VU7A/hT4/tQKjIj/eK2pHr0YET9l51xpnaIJ9qJLr4UH5I1TEWmLpJAo0P+O36JGQvVsYhpXEpKyfp+C9ZXiGveZ/Ata79Aj2fwhpfdWTMFE0Qa5DjJtK0yTQgZfBvPt3TwNyDjvZfoN8+2LOSxmxnHZkYMMauY2ZvO59GRsLNezzsvzTUuBQx7cLA8NnI/MXykUXSq2GiODQZ9bjGwq66ubb7P8MGodzK6Oy+NBajZWYVwhhxKIy/0El/MaDaXhMD78FKgxUpeff19Ih94fCXE6Slv7C+6Ou8O09maTXqTF8tQh7UCAt74MSW8q0WNKS33Y5wkaBOQxn7uLDA9yqqWwtQVGtTb5Bn2hys4nUI2zvEvrDqUBEmNsvkG2vtKqQTaFYaMiBzIVamV8Ib1qyykrVYewicIsZ3P0MdF1Suvj+0XKog2RG+NPbhJt1OnafhF4f+ypr9jNE6iMf/K8dcZ6AT4RpJ+ouoStgDOSFTRk07I+8nWloQ6RRbTv1ybiI7lhkNdjMbLlSsPWkB17Z9lDYaM8F4fm/ccMvvs87cHv1bT/r0a854YXHmyN6+QEGoQY0+fFsBo01GiK9FXTT1f3eY4tnyhdTCGh9qGH371dgAaZrieMPKNxsn41oL4fJRZhg34YDvGxnCXAYfgbQldcqQ==
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+List of verifiers for an event.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/export-keys.api.mdx b/docs/docs/api/locksmith/export-keys.api.mdx
new file mode 100644
index 00000000000..9500dc4eca1
--- /dev/null
+++ b/docs/docs/api/locksmith/export-keys.api.mdx
@@ -0,0 +1,71 @@
+---
+id: export-keys
+title: "exportKeys"
+description: "Starts Job process to get all the keys for the given lock"
+sidebar_label: "exportKeys"
+hide_title: true
+hide_table_of_contents: true
+api: eJytVkuP2zYQ/ivEnBJAu94uctJtD0mRR4O260UPCx9oamxxTZEMOXLWFfTfi6FkW5YfQZz6YlOexzfD75tRA85jkKSd/VhADvjqXaDPuImQQURVB00byJ8beIoYIH+etVkDD94brZJXejTLoMCogvbdI3gkGSiKT24ufHAKYxTkxBJJSGMElShWuIli4UI6LPUarTBOrSADL4OskDDElFdzPC+phAysrBBysEjfXWDbgN9qHbCAnEKNYxRfOzuhi1uuRpVYScgboI3nMNoSLjFAyyWdSMN4HooiYIw/TPXFqZWQnfHJZJGCtstBrm81hs0+2fY4TnM20BjBXxxAbFwtvktL3O6IMqiSm3wL59IutCEMn/GXUk+7+zyV3NnzufHV6456lxo2TvZ+5yVIV3g2uvQ+uLU0PxP7ofcRkSTVUbwJaHDNFTFT3WKhSqmt2IaOwlmBa7TUURlfZeUNvgUWRMDonY0YOe/93R1/jURSK1bGojZmwxkDYSFYeqwbyEA5S2iJHeVecJOXyN7NcVVu/oKKWEGBRU26y/3i5iztYybyJ4N3d78dQ3uysqbSBf0vFpCM3h0bfXUkPrjaFsxqqJBKxyNkiQkDSymHyfp+Ir2eNL1m2wmrKk6agbjaSTd1blbbsRPWW/XXwUAOJZGP+aTzrTSVt7Xl3zc+OHLKmVvlKhjf5p/BFbVKTHlMIRNXDiNGkkttlzc/F/mx89qFne1n5SPfStf4bmLu+s4pt2Tk8xxlwABZ/+ODC5UkyOHTP1Nu+cGM3QWRXndi3bFcc9sgG2qAr0PbhUt+mgymG+WyxJdtnZABN7mr5/6owp0dz++1LjCKuVQrtIVY1DY1VRpNm473Vs4N94O0WiFpu8xEhSQLSVJEckEuMRPSFsI60ou+KlE6t0rD0miFNiLD7cv64+M0VeFdpErawT8dVUS/oQ5AN3vF/NIC6ltN+EoTb6S2fB2JNk1P62dYc8uk15BBvl9HiUX86HB1DOk9y6B0kThG08xlxKdg2pYfd3fHpC90lHPDg3ghTRzvmmGZb/7uZ/ZbcXn+n6mKqbOfnGtparZJOrkKxA82wUUUw1V0JZLxbriY72D9XJnw/1oYF4EONtke5owPQTPO6zlz+IJ0EsJ27tiDa9lC21L/asKM35uuwDDUWjtrMyhRFuldtektHpRCTwPfo3XK7dwtsN/fT1ncNSt9N3hH0zpFP4mraTqLqVuhbdsdTOIzA2zb/wAfSfX+
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Starts Job process to get all the keys for the given lock
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/generate-apple-wallet-pass.api.mdx b/docs/docs/api/locksmith/generate-apple-wallet-pass.api.mdx
new file mode 100644
index 00000000000..eb4f168410f
--- /dev/null
+++ b/docs/docs/api/locksmith/generate-apple-wallet-pass.api.mdx
@@ -0,0 +1,71 @@
+---
+id: generate-apple-wallet-pass
+title: "generateAppleWalletPass"
+description: "Generate and return an Apple Wallet pass for a specified key associated with a lock."
+sidebar_label: "generateAppleWalletPass"
+hide_title: true
+hide_table_of_contents: true
+api: eJy1Vk2P2zYQ/SvEnFpAawcL9KLbHtJgm7QNsl7kYPgwFscWI4pkyJG3hqD/Xgwlf228W2SBnqyRyDdvPt6Me/CBIrLx7l5DCVtyYtJdCJa+orXEnzElKCBR1UXDeyiXPTwmilAuoaH930+OIqyGVQGaUhVNEDAo4cMEpdBpFYm76BQ6lZHVCK0CpqQ2PipUKVBlNoa0amivMCVfGWTS6slwrVBZXzUzKCBgxJaYYspMjLgKyDUU4LAlKMERP/nYQAGRvncmkoaSY0fPCf41nlNGC26qamoRyh54HwTGOKYtRRiG4qobIXSndaScntddffJVo3A8fNVZ4mjc9kVfDe3v9X96+Uh7dX89mCP+SkBS8C5Rku+3797JzyXQl1ytpLgmlTgStri2pA7Noa8V0VgSz5V3TI4FE0Owpsq9Nd85PRObZqGR8/L9JZIFbHxskaGEtXEY9zAMw1DAb9eoPrpMjb3adNZujFWSI0qsdJdfSxmjQ6sSxR1FRTH6+ArTb0lwr7Dz629UsdSks1acQrlBm6iAEEVEbMaMtpQSbulaXJo22FkJbFFTJPWESSSRKSnjDiEYt82pnyKZ/ehT0sGGxR51ZqqHHN57gcr5GgpoiWs/qpqzcriGEua727mUYN5PQhnm/VkvD/M+d9swN37UveCOYuuihRJq5pDK+VwupdZwPeucPN+E6NlX3s4q38Lz5vwcve4qMdRIFaTXLxET49a47c3PIT+Mt46wq9OwepAijmUZR9axJuLyIBSx14SRIhTTw++HDvzj6wKGAu5OHXIGgsF8pP1JphjMTZNfZA1/7yg3r5gbn+9NNXvMYalPhzihAEnyGM/tDxEez6kQ/c5oSmqNVUNOq03nclLRGt7nUUqiiNxCpmqIjdsWqiVGjYwqsY+4pSIPZefZbKaoVO19k2eTNRW5lPt3CuvP+0WOIvjELbqzL4eJcDkQpo1xEUN/0tv/tRmmojD9w/Ng0TgpXG6wfur9JexusxAyv/K0KMrLYV4e5q1IYFVA7RPL7b5fY6LHaIdBXo/1LZerAnYYzajPZQ/aJHnWxwHxYiZ++TIN9F/V5Ta6Gsuh65x02A5tJxYUsh3O1p7I6k0Mni+pN3A4T+ObeZzW2BsYjJUbVkMBNaHOf1P66dtdVVHgs1uvbiiZI8cJ+uH9AgrATrroKP9nMyN7usqu78cTC9+QG4YjWRZbyA7Dv0WdTH4=
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Generate and return an Apple Wallet pass for a specified key associated with a lock.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/generate-certificate.api.mdx b/docs/docs/api/locksmith/generate-certificate.api.mdx
new file mode 100644
index 00000000000..7db7e764b0c
--- /dev/null
+++ b/docs/docs/api/locksmith/generate-certificate.api.mdx
@@ -0,0 +1,71 @@
+---
+id: generate-certificate
+title: "generateCertificate"
+description: "Generate certificate for specific key"
+sidebar_label: "generateCertificate"
+hide_title: true
+hide_table_of_contents: true
+api: eJy9Vk1v20YQ/SuLObUAbTpue+HNKNJA+UJR2ygKQYfRckRuRO4yu0OlKsH/XsySkihLthMHiC7iirPz8ebNG3XgGvLIxtlZDhkUZOVIv5NnszIamSCBnIL2phEryODNaKP0wUitnFehIS1ntaYtJNCgx5qYfIBs3oGRuw1yCQlYrAkysMRfnF9DAp4+t8ZTDhn7lh5G/DjYKZNfQgJBl1QjZB3wthE3xjIV5KHvk7NhKqfXN3nuKYRnQ713eq1wMD4bLLA3tng01pq2s/zZKO9oq2bni9n7X4iT0DgbKMj766sr+Tp2dNtqTSGs2qraqoJ40hPjbOwKxnb0Cfx69erUwX0gr0xQ1rHClkuyHBsak9POMlmWW9g01ehVjidpu+Un0iw4tFWFy4ogW2EVKIHGC8XYDFXUFAIWdFqwQLTCtmLI4K4kT+oLBoVWkffOK2OVFLkylbGF4pKUIEyBL09j9n0CbFjOA1mNviW/If9aXEHf9xGNX55Hw3nzH+WKnWrIr5yvFZcmKNRi/zhC6afwI2D6x7UKPT3MVno+7eQT6T8B3EfHN1MvI2y/nWPhzG6wMvmuJd+Dy1fC0A+fBGri0g3KFa/LMGaQbq7TiTql3ag0fSpakHYTRejTNW3TLs5tn+70TyYzUmbQrtZXkEHJ3IQsjT5Cbbi8bK08XzTesdOuutSuPpHLP73L24i4GlgIIh3HHgNjYWxx8W2eb4dbe7cLSVq33vD2VgAeMBROTwCUkDvdkfOS0JOHZHz4w/kahVxv/74T0bg5nvvRCTbmXdT4UfWwMReD6EdJ/NyS34pEgrErF++NrLqPZan3uzohAQF5qOf6pMK9nWq825icglqiXpPN1aq1EVSsDG+j0JHF5aAORq+JjS0SVRNjjowqsPNYUKLQ5jIwB40snVtHqa+MJhsi2cayPszuYhWNC1yjnbzZ8UQ9sSi7wxR89c4c8WX6l9OmQmOlB5Er3cjtOWwEJ30UNztsUsFXfjleeoP3bLed9jRfJFC6wOK265YY6N5XfS8/Dz3M5osENujNoBLzDnIT5DnfC9ejNf/017gDf1bHC/xskTtmWUl0g1UrpzHzwz8FGZ0XZfBwr78ghymiL87jsPlfkMHQvn7RJ1AS5jLX8258d6M1NTy5Nd3YIg17pXzzWlj9P8s7dok=
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Generate certificate for specific key
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/generate-google-wallet-pass.api.mdx b/docs/docs/api/locksmith/generate-google-wallet-pass.api.mdx
new file mode 100644
index 00000000000..53e6729b874
--- /dev/null
+++ b/docs/docs/api/locksmith/generate-google-wallet-pass.api.mdx
@@ -0,0 +1,71 @@
+---
+id: generate-google-wallet-pass
+title: "generateGoogleWalletPass"
+description: "Generate and return a Google Wallet pass for a specified key associated with a lock."
+sidebar_label: "generateGoogleWalletPass"
+hide_title: true
+hide_table_of_contents: true
+api: eJy1Vk1v4zYQ/SvEnFpAiRcBetEth22QbtpdJDb2YPgwFscWVzSpJUdODUH/vRhS/oy3RVM0l5Ai+TiPb96Me/AtBWTj3aOGEtbkZEoP3q8tfUVrib9gjFBApKoLhndQznuYRQpQzqGh3edXRwEWw6IATbEKphU0KOFhxFLotArEXXAKVUZWGVq1GKNa+aBQxZYqszKkVUM7hTH6yiCTVq+Ga4XK+qq5hQJaDLghphBTJEauapFrKMDhhqAER/zqQwMFBPremUAaSg4dXQb4R96njBbcWNW0QSh74F0rMMYxrSnAMBRXr5GA7rUOlJ7n76968lWjMG++elnkYNz6h3c1tHvU/3jLJ9qpx+tkDvgLAYmtd5GirN99+CD/zoGek1pRcU1q9vyk2KdhFSgrciKeX36jiuXOyjsmx4KGbWtNldJq8i0KZP82pHxSFA2ShGxyQIL6OS3Ngn3LoADXWYtLS1Cu0EYa0l8Bv1wjMnOyU+JfddaujFXyghRZ6S59FpGDQ6sihS0FRSH48J/YXIR3SW9DMeKarhHTtMLOMpQwrSmQesWo0OWQlHF7Csatkxojk9trT1IAG5Z5dqGpXhK9jwIF44NtiGufTZ9UkIQrYbK9m4gEk3600TDpTzJ9mPQpF4cJOh280akyCHa2YyeaQc3cxnIykYNxY7i+7ZyMb9rg2Vfe3lZ+A5fp+yV43VUyUTlcEDecI0bGtXHrm3+H/JJPHWAXx3L2IkJmaXJRO+giV+6tJPMlYaAAxTj41YcNili/fZ3CUMD9MUtOQLA1n2h3NDK25qZJH5LLv3cUduJ6MG7l07lRt1mipZ72PKEAeeTM5+4Nw8M+1Qa/NZqiWmLVkNNq1bn0qGgN71KxJXFFSiNTNcTGrQu1IUaNjCqyD7imIpVt59msRlaq9r5J1cuailxMOTzS+v1xmli0PvIG3cnKvqNcFP6xqZyR6I+m+7+ax6gK0588aS0aJ8p1uc5kA8xhe5fckOIrj72kPK/35b4k732wKKD2kQWh75cYaRbsMMjnLHI5XxSwxWCyUec9aBNlrA+V4oev8dPzWPd/VudN6yqffeo5SbMt2k5mUEgTOemO4q13RXDZy94Rw+lTvjuOY7d7RwRZvWExFFAT6vRrph/X7quKWj459aYBSAE5lM+Hj1NJg06y5+D7i2KR0K9G1Pd5x9Q35IbhECDLXAIchr8AIJ1WTA==
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Generate and return a Google Wallet pass for a specified key associated with a lock.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/generate-ticket.api.mdx b/docs/docs/api/locksmith/generate-ticket.api.mdx
new file mode 100644
index 00000000000..54badfeba82
--- /dev/null
+++ b/docs/docs/api/locksmith/generate-ticket.api.mdx
@@ -0,0 +1,71 @@
+---
+id: generate-ticket
+title: "generateTicket"
+description: "Generate a ticket for a key."
+sidebar_label: "generateTicket"
+hide_title: true
+hide_table_of_contents: true
+api: eJydVU2P2zYQ/SvEnBpAa20XPem2hyTYJi2Krhc9GD6MqbHESCIVcuRUEPTfi6Fk2V47WHR9sfgxb77ePA7gWvLIxtmnHDIoyMqS1kZXxJBAIN15wz1kmwFeAnnINttxm0BOQXvTiiVk8Hm2U6g4mqq98wpVRf0KEmjRY0NMPkQcIyYtcgkJWGwIMrDEP5yvIAFP3zvjKYeMfUevHf053VMmF9ygS2oQsgG4bwXGWKaCPIxjctNN7XT1mOeeQnjT1VenK4XT5ZvOAntji5/6qqh/yt/08oV69XQ7mQV/KyChdTZQkPOH+3v5uwR67rSmEPZdXffq2MdccUlzS1YwJvDb/a/XptJXZYKyjhV2XJJlo8VawtLOMlkWK2zbWg6i1XAdsNt9Iy2ssV1d464myPZYB0qg9cIzNlP8DYWABV2nKsXZY1czZLAuyZP6gUGhVeS988pYJentTW1sETOT2lLg1bXPcUyADct6YqfRz+QP5D8KFIzyS6AhLt1EfI485RIySA8PKbYmneqWDjM5x1Tokw5nJBrTivp0iK0e02PV49yIr4nuna8hg5K5DVkaMUJjuFx1Vr7vWu/YaVevtGvgNT3+8i7vtCzUFD4I2y4RA2NhbHH3/5CfJ6sFdnsa9mdp7NSqaeSXPonLI1VlvSP05CGZPz4536A07/d/1sK2x0vCzCDYmi/UnwYFW3NXxY04Rd878r1MFRi7d9Fu7uNLTEt9PeYJCUiRp3werjJc7qnWu4PJKagd6opsrvadjUXF2nAftYos7iZaxaYbWySqIcYcGVVg57GgRKHNZUrMfs5Klc5VUR1qo8mGyOk5rT+e1jGL1gVu0J6dHHmiFpm9CHw4zdxbwjpXlOlfTtsajZWqR3YMM5k3cJDKYGvk+tFfdtJbKansXErj1I/sqGELs7cJlC6w4A7DDgO9+HocZXtqW7bZJnBAb6ZR3AyQmyDf+aIFP831l79npfygLmX+ZpZHMlkJ9IB1J6s58tN7ItPyrgheq/87Yjiv6LvjOL0P74hgat+4HRMoCfP4eg/z2aPW1PKZ1bm6ixos2vj541oY1AmdliF+NfkR+GYwwzDdWLuK7DgusbGsJbZx/A/hh+0v
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Generate a ticket for a key.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-charges-for-lock.api.mdx b/docs/docs/api/locksmith/get-charges-for-lock.api.mdx
new file mode 100644
index 00000000000..f05e79bd02b
--- /dev/null
+++ b/docs/docs/api/locksmith/get-charges-for-lock.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-charges-for-lock
+title: "getChargesForLock"
+description: "Get the price breakdown for recipients & total charges with fees for a specific lock"
+sidebar_label: "getChargesForLock"
+hide_title: true
+hide_table_of_contents: true
+api: eJy9VsFu4zYQ/RViDkULKPEiR9+CtFlsuy0WTYIeDB/G1FjiWiK5w5FTw/C/F0PJthJr226A1hfb4nD43uPMG+2hpGTZRXHBwxzekxipyUR2lsyKCTdlePZmHdgwWRcdeUnmOyNBsDG2Rq4omWcntVkTpRyIJkWybu2saYLdQAEhEqMe8aGEOVQkd/3G+8Af+4iIjC0JcYL5Yg9OwUSUGgrw2BLMwZM8B9ZYpi+dYyphLtxR8YrCb32cceU1FJBsTS3CfA+yi5rGeaGKGA6HYvIYRXxblkwp/eNRit1gHzx5WBJ2vurPGvLHjm2NiX5EwcUSXqd8VPGHEFOioImYEpVGQn8xx7V1523eU/QsvnTEuwnEF5iQGTXQCbVpCusI7PnKvwJ1VBP/P86lZkkx+EQ54ObdO/16ifKhs5ZSWndNszNVEGORy1zfzle5XDvvtsRJyxm51Fu3wQt50WQYY+Nsrt3Z56QZ95dQw+ozWXlBagG5Q6CAzmtJPRBvnaV7IiigwnQXksCygMjaG+J6Bv2ec2LftSut1QLSrl2FZkKGAixT6eQOufzEQbk6X+k5U2kuwEwFHeFNrWVjSP/imiY16RLxubmwDZ3XkIHchRzj8CnmQ4Kppa/qdfoU0JLUYTCkbEFSwxxm25sZRjcbvG22H4znMFPp0mw/coiDgifeHm2r4wbmUIvENJ/18a2T+rqX/SpykGBDc21De9FOnziUXW4V85BTgjbiy4xJsHK+uvq2zA/9rlPapYK2HTvZPWgp92I/JeKRXnrk0dL0/4qQiaEYftwHblFgDj//8ah63577ZFwc0f1Cu7O5YnRXm/xg5AV6Fc6vQ97npNHAp0zLfDzyhAJU5J7PzQXDU5yJHLaupGRWaDfky5P/YONkl/udPK4a1UOc3ZA4XxWmJcHstkkCY0WFQV8aH0SnWGZl6hA22eUbZ8mn3DoDrV8/PGYWMSRp0Y9WKhIzzDpzH9gM0+4F+v3Zb/6r+Ttch9CfMosNOp+9gHN/9GW/gK3KitGp//VpoYD5eermmtNH4wm5LKDOVrGA/X6FiZ64ORz0cX+32hSlS7hq1ADW2KTXQ3TM/vvfB6/4wbxlDk6y1HKbmLpbbDoNzk32ZoTfNP7+Bt6rOXsGt9Q/7BTd27V8+UY0CePYr343Pv4I71gEb9bq9YvSGzCMq+6wPBRQE5bqWIv9EHFrLUUZ7b2Y3SrnyfTf/6RN+xcw0NPb
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Get the price breakdown for recipients & total charges with fees for a specific lock
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-checkout-config.api.mdx b/docs/docs/api/locksmith/get-checkout-config.api.mdx
new file mode 100644
index 00000000000..2c663cb065a
--- /dev/null
+++ b/docs/docs/api/locksmith/get-checkout-config.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-checkout-config
+title: "getCheckoutConfig"
+description: "getCheckoutConfig"
+sidebar_label: "getCheckoutConfig"
+hide_title: true
+hide_table_of_contents: true
+api: eJyVVU2P4zYM/SsCTy2gmUwHPfk2GGwXu9sCi04GPQRzUCTa5saWvBKdNjD83wvKjpuvLjCnWFJIPT6+Rw0QOoyGKfhPDgqokJ9rtLvQ83PwJVWgIaHtI/EBis0ArwkjFJu38U1DZ6JpkTGmfORNi1AAOdBAHgroDNegIeL3niI6KDj2qCHZGlsDxQB86CQicSRfwajBYbKROoEDBaxrVORUKBXXqOyMS9kJmCCImLrgEybJ9vjwID/nOZ7Po1QZYs5W0R69ylht8IyeJdZ0XUM207H6liTBcA03bL+h5bPCNmCPbGUWhJwozDJN2MjdrHei7MbB9nBze77lBhbjHAls03w9uXgi/BRnE+wuXeObtt+VdxwFUETD6J74Gq6GMsTWMBTgDOMdU4tSQ9+594WMGpi4wZNuztocM4ZfH3657rvoVFFSPrAyPdfoWRqL7v5/O/7jZvu+acxWUJSmSXhJYIspmepGM0XUpekbngQdUf1tkjJeYYwhKvKq7JumpIZ8lZUp3cLE99d3njLxET1Gsi8Y9xg/SKrMxpWHbhm6Ra7D7HbQk00LWO0fV0ePrQZyY7a+pJ/s3ccGCqiZu1SsVlkwLXF933v5vuti4GBDc29DC5covsbgeisLNSGGUV9mTGwq8tXd+zK/TFFL2rf/5tWL9HLqzjS1ltbIlTAPIllv0USMoOeP344i/PzXWhT7dK6ROYnp6Asejo7P67td3sjD73uP8ZDFS74MOW5u3WsuS/1+rBM0CMlTPY9XFS7/U10Me3KY1NbYHXqnyt7byZzEhzza0JvtpCSyO2TylVYtsnGGjUocoqlQK+OdGIPKuSpVh7BLoriGLPqUZTyX9cenda6iC4lb409OKmS1jNdFXGfgF7IY/+FV1xjyeQRI44dZeBvYS9FH6YGGgpxMqDokluNh2JqEr7EZR9meiC02bxr2JtLkj80AjpJ8u8WgF0gW08NPf84D8Wf14ydG34Z/FICXZu9N08sKNEj38/s3vo0aajQuv5XDfPBkLXZ8EnL12oh6F3N+/LCW+dsLRwuPF0rN2W/CGYbpH+uwQz+OCzqWtQAcx38BuZjDjQ==
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+getCheckoutConfig
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-custom-email-content.api.mdx b/docs/docs/api/locksmith/get-custom-email-content.api.mdx
new file mode 100644
index 00000000000..104ea872a13
--- /dev/null
+++ b/docs/docs/api/locksmith/get-custom-email-content.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-custom-email-content
+title: "getCustomEmailContent"
+description: "Get custom email content for a specific template and lock details"
+sidebar_label: "getCustomEmailContent"
+hide_title: true
+hide_table_of_contents: true
+api: eJytVk2P2zYQ/SvEnFpAu9os0otui8V2kTQtiq4XPRg+0NRYYkyRCjlyagj678VQX/5M0kV9sSiJw3lv3rxRC65GL0k7+yGHDAqkxyaQq54qqc2js4SWIIGAqvGa9pAtW3gN6CFbrrpVAjkG5XXNASCDZySh4n6BHECoPoLYOC+kCDUqvdFKEFa1kYRC2lwYp7YiR5LaBEigll5WSOhDPExz3FpSCQlYWSFkYJG+Or+FBDx+abTHHDLyDZ5m80f/ntD5LUNQJVYSshZoX3MYbQkL9NB1ycVjOK+HPPcYwneP+sQYZP/yxcMCeW2Lq2eNhHz3oMXInM4jqZHmbx644pChdjZg4Of3d3f8dxz2pVEKQ9g0xuxFMVdxKpSapDBeZS3IujZaRfWknwMHas8TcevPqHhj7VlrpPs0Dtk9zzqZijw/s0215nIlM1uXNh7kd0oF/xJ4f/funADWtNBBWEdCNlSiJUaGUTqXIX8brW2MkWuDkG2kCXgKv8IQZHEBARd8IxtDXOwSPYqvMghpBXrvvNBWcJE22mhbCCpRsF4w0O35mQyWNPEantGi1+oF/Q79E4eCkY3352w8XuphpmbjGtsLj0odJnncMvG/XBLWo2tMHrcWV7zhOsE/oKm5WZYTpasf5robJVEhlW7wv2hBVEIG6e4+jamm7aDGLmXZhrQ9UG+X9qjSdmSji4bJRPcW1ngDGZREdcjSPkKlqbxtLF/f1N6RU87cKlfBab//6V3eKF6IvnbADnIcMZAstC1u/lvkl37XFHY1u/wL891z13v9RBwfOboNr9coPXpIhotfna8kK/fj3wuWxMNxtwxBZK1/w/1sfrLWN9t4Izrjlwb9np0StN24uG8Q8WuEJT6NOCEBJrnHc3+GcHpP1N7tdI5BrKXaIiu4sZFUaTTteyO1ct33lFZbJG2LRFRIMpckRSDnZYFJnFfWEQ+xiEqUzm2j4xut0IYosgHW7x8WEUXtAlXSHjzhVhhaLM5ZMQ/aIwTt3Bj/y2gd+Cf8h9LaSG25RlFL7aD5JeyYx3GqZPOojeLiW8djsU+J70+mvEqgdIE4WNuuZcBXb7qOb/eVzZarBHbS696qli3kOvB1PnnlVRZ++mto+J/F8XS/CG3Um2Vt7aRpeAUJsNjmzwhuqDdlcDr035DDIZlvzuPaN8Eb8pmK2K26BEqUefzUa4fHD0phTQcbz9yabWRy0+enBSTA4/Sg+08sI0a/mFTb9m8s3BZt18058poT7Lp/Afp0vGg=
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Get custom email content for a specific template and lock details
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-data-for-recipients-and-captcha.api.mdx b/docs/docs/api/locksmith/get-data-for-recipients-and-captcha.api.mdx
new file mode 100644
index 00000000000..2ee21562bef
--- /dev/null
+++ b/docs/docs/api/locksmith/get-data-for-recipients-and-captcha.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-data-for-recipients-and-captcha
+title: "getDataForRecipientsAndCaptcha"
+description: "Retrieves data for recipients and captcha."
+sidebar_label: "getDataForRecipientsAndCaptcha"
+hide_title: true
+hide_table_of_contents: true
+api: eJy1Vk2P2zYQ/SvEnBpAawdBe9HNbbNB0hYodr3twfCBpsYSY4rUDkdODEH/vRhKlr3r3YPRrC+2RM6befPxxh2EBkmzDf5zATmUyL9r1reB7tDYxqLnuPDFb7phU2nIIKJpyfIB8lUHDxEJ8tW6X2dQYDRkG0GCHO6QyeIeoyo0a7UNpGgCVNoXygyQM8ig0aRrZKSYUL2uEXI43V+tIQMrsI8t0gEyIHxsLWEBOVOLGURTYa0h74APjRhrIi0XLWMdz95HJutL6Ps+mxyNkfyjXYtXO5oAT3gumN2iKAhj/BFwHvlboN3VUNYzlkjQS3UIYxN8xJSLD+/fy9fTit23xmCM29apqSUgAxM8o2e5r5vGWZMO5l+jGHWXXsPmKxqWopLAsB1c1hijLjFeU6IMoi29dNjF2XCkuaXrINMng59fSsCvulB3+Nhi5NmPI45E4QUGGeB3XTcOR8c0OFZFi4qDsn6vnS2U9U3LMzjG/ctLcT94vXHJats6t7XuEoyRvHYqIu2RVArpf1H0rXPiFPKtdhFfKfZLrAvc6tYx5LCskFB906IGQ0jK+iMF60vFFR6ZzC59SjrYckrgJ/RI1twneh9TwseE1chVGHUtCQ1XkMNcN3ZuziRN7AbtaclBDhVzE/P5XCY51parWevl901DgYMJbmZCDc81728KRWvkQQ2hgEzxU8TIurS+vLkO+X6wmmDXJx2+lyINaR/UeMq5uIRRF+R5g5qQIBt/3AaqtRTiy79LGajFqQPOJ6qxf6CM1ChGurE3u/TiTIwk09ZvQ7Iba/KQaKk/jzwhA0nywOfDBcPpnmoo7G2BUW202aEv1Lb1KanaWT6kTYLS8alFrNkhW19mqkbWadVEDqRLzNKS8YHtdmSlqhB2UVrJWYM+pv4caf31eZlYNCFyrf3ZSYmsZCOq20DqtBPVwhfqtBWfkOlOg3XdHhxzzvid543T1ktdUv90Y+uupAAyuaPndQZViCwHXbfRER/I9b28HiojLV3YKHNTTMP6arA/3Y075Z16LRqp/cVq3qfNmUPq9zdw92xBv7W7p/v7rb2d1vvJ01oeyA5yt1r3GVSoi/RfqxvNFsZgw2dWFwouKJP+ffq4hAx0K000DfczRUjox7n3hzPsrhtuLMMOfd/DMXaWZ+jXfd//B4HIj8w=
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Retrieves data for recipients and captcha.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-data-for-recipients-and-gitcoin-passport.api.mdx b/docs/docs/api/locksmith/get-data-for-recipients-and-gitcoin-passport.api.mdx
new file mode 100644
index 00000000000..803daa92359
--- /dev/null
+++ b/docs/docs/api/locksmith/get-data-for-recipients-and-gitcoin-passport.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-data-for-recipients-and-gitcoin-passport
+title: "getDataForRecipientsAndGitcoinPassport"
+description: "Get the data for recipients and gitcoin passport. This is to be used in conjunction with the Gitcoin passport scorer."
+sidebar_label: "getDataForRecipientsAndGitcoinPassport"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVU1v2zAM/SsCTxvgNkOPvgXYWnQfQLG22KHIQZGZWI0tqSSdrTDy3wcqbuI2abFhh+USf4h8j+Tjcw8xIVnxMVxWUMIS5aMVex7pOzqfPAbhaaguvLjow5VlTpEECqiQHfmkgVDCBYqRGk1lxZpFJEO7aGNDZZbbeJOGBKfmpvZsPBuJZo6mY6yMD8bFcN8Fp1nNTy91TnrxItiwi4R0CgUkS7ZFQWIo73rwyuWhQ3qEAoJtEUoIKD8jraAAwofOE1ZQCnX4soSbGs1wNqM20a2UYAxQALsaWwtlD/KYctaunSPBZlMcR9XoaVURMh80S5Hs9p2Jix3YMRgW8mH5Osy+zUdRGs+iEKNp6HAUMXXkast4DNUSWQXxgi0fY7OZaTc5xcCYD5x9+KB/zxnIiEEWhg+pkzzyjnHHRMgGtnnmUICLQTCIZrMpNd5lbU7uWVP2h1zj/B6dCjKRKln8lhAhd438VU35V0CLUsdhFbLCpIYSJuuzSR3jiieDlLVvSOsn5XXUQAm1SOJyMtFxcuulPu2CXp8kihJdbE5dbA8mdUWx6raav84pQcf9PCOLXfqwPPm7zNfbqF3amZJ2HXl5vNZGbnt1y0ijjijkkyr0fo6WkKAYLs4jtVaghM8/bmBTwHQ/pXG7k/+CI6Ha5E9W+cFIxtpuHxYxx3lp9OBtLst8faoTCtAmb+s5O6hwd84kimtfIZu5dSsMlVkMRmIbL49ZbRjsvNF+iHcrFB+WhWlRbBYnSyS7xCL7VYjiF0NVJs9d3abxDgOj0h3K+nZ5k6tIkaW1YfRmiWLUSc15JLP3UjMN1c7QXrPTfr8F/81ZhzkK/pJJaqwPOuusyX7YiTtY6zxyd6CAp72Y6SMWfd/3c8t4S81mo4+3Q9dtqTzbeaNOvLANv7Ticfnvvg+m/d68adBH6argxh+AtW06PZX36885vO7Xb6A+/wD8A/KfefgbTJ59I/ZEZnpDXplAeTfbFFCjrdQJ7vohcuocJhlFHTiyZtkZ5sUnXYbfZcfnHw==
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Get the data for recipients and gitcoin passport. This is to be used in conjunction with the Gitcoin passport scorer.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-data-for-recipients-and-guild.api.mdx b/docs/docs/api/locksmith/get-data-for-recipients-and-guild.api.mdx
new file mode 100644
index 00000000000..a00ffbd1548
--- /dev/null
+++ b/docs/docs/api/locksmith/get-data-for-recipients-and-guild.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-data-for-recipients-and-guild
+title: "getDataForRecipientsAndGuild"
+description: "Get the data for recipients and guild. This is to be used in conjunction with the Guild"
+sidebar_label: "getDataForRecipientsAndGuild"
+hide_title: true
+hide_table_of_contents: true
+api: eJy1VMtu20AM/JUFTy2gxEWOuhloE/QFFE2CHgIf1ita2lja3ZKU20DwvxdcK7YSu0GLor5YjyVnOBzNADEhWfExvK+ghBrlrRV7GekrOp88BuF5qK5631ZQQIXsyCc9DiVcoRhp0FRWrFlFMrSvMTZUptaqc3PTeDaejUSzRNMzVsYH42K474PTVuaHlyZ3esRJlmyHgsRQ3g3gFe17j/QABQTbIZQQUH5EWkMBhN97T1hBKdTjc5I3DZrxbIZoo1srmxigAHYNdhbKAeQh5a59t0SC7bY4jarV86oiZD6SQ5Hs7p2Jqz3YKRgW8qH+PcxByJMorWdRiIneKr8ipp5cYxlPoVoiqyBesONTbLYLVZNTDIz5wMWbN/r3lIFMGOTV+5B6yfvtGfdMhGxgmxcMBbgYBINoN5tS61323OyeteVwzDUu79GJWoHUoeJ3hAi5b+WvZsq/AjqUJo4Wzw6TBkqYbS5mTYxrntWj9Rhp8+i7nloooRFJXM5mukzuvDTnfdDrs0RRoovtuYvd0Z6+UKz6nb2vc0vQZT/tyGJrH+qzv+t8vavat10oadeTl4drlXGn1C0jTfRQyEdP6P0SLSFBMV5cRuqsQAkfvt3AtoD5YUdTsZP/iBOb2uTP1vnBxMQqtg+rmOu8tHrwNo9lPj3OCQWoyLt5Lo4m3J8zieLGV8hmad0aQ2VWY2bY1stD9hoGu2xVD/FujeJDXZgOxWZrskSyNRY5j0IUvxqnMnnr51BA6x0GRqU7jvX5/U2eIkWWzobJmxrFaD6ay0jmkJBmHipzMiOHg/H/Y1yO6xH8KbPUWh90hdlqw2j0O9iozHloKGBn9oU+YNG3w7C0jLfUbrf6eLdJ/QQqz3bZariubMvP03U63quvYw6/Ni9m7kmy6qJppm9s2+up/NH8OYffR/ALqE8z/R+Q/yyWX2DyJPYPRBZ6Q16ZQHm32BbQoK30874bxsq5c5hkUnUUstpln4FX79ThvwC278Vf
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Get the data for recipients and guild. This is to be used in conjunction with the Guild
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-event-collection.api.mdx b/docs/docs/api/locksmith/get-event-collection.api.mdx
new file mode 100644
index 00000000000..170dc2d23cd
--- /dev/null
+++ b/docs/docs/api/locksmith/get-event-collection.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-event-collection
+title: "getEventCollection"
+description: "Get details of an event collection"
+sidebar_label: "getEventCollection"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVk1v4zYQ/SvEnFpAiYNge9EtKLJB+oVFk6AHwyhociRxTZHa4chdw/B/L4aSHX8oaLY99GSZH6P3Zt680RZih6TZxfBooYQa+X6NgX+M3qORZSig06RbZKQE5XwLQbcIJSTf11CAC1BCp7mBAgi/9I7QQsnUYwHJNNhqKLfAmy7fYXKhht1uUYDFZMh1+R0lPCAri6ydTypWSgeFgkOZYyCEqYshYZKQtzc38nMa5qk3BlOqeu83ipDJ4RrtVCwTA2NgCaG7zjuTkzD7nCTO9hJ6XH5Gw5INkpSxG1DkLFwSLIAde5zcOUE8sW/iGumx1fX09aUOAWlyy7uwSlOYtbVO3qf9pxP052UpoNVB10h31hKmdHJKE+mNVJyxfeO2IdSM9o4vtwuoIrWaoQSrGa/YtSiY+85+65VczfcgO/B/FeZ8kG9xkG/O82lRCtDM5JY9Y4LFecUH+U9k/00puDdr+U9SOMLxL9kyacd/5hMFrLXv8ZLR0ZkpEMOtiXrvdq86h2wbcLl05CTDhQ83Hy779rlBJXzUJvZKE6pWr1yolVDBxKqKpGzEpEJkhV9d4uv/0sOh914vBWSlfcLzhLSY0mTJpGKV7r1IkjDFngxmSFXsg70MfJyNBwxIzvwW+WM+PGTjhykXewkSQ3FUYmSV84c82D4vu8BIQXuVkNZICoki/e8ZeW6QUP2lU7ZvgaRc2FOQanKDeybX70rWU6Z3L6H2emuRmziOqjybuIESZuvbWbaFq1eTn22lI3fS6znMML168lBCw9ylcjbz0axS67i57oM8X3UUOZror01s4XxIfaJo+xxbDchgV5xHTKxrF+qrb4v8NNw6hF0IaNOT482T1Gyowks6MX55JYxTVv4vURMSFOPDx715/vTHs/Tx3asgjt2kcz+j2Mk41nXnrlZ5IU/2Lz3SJnu7C1XM98YSvWRa6pc9T/EXpDTwub1geDinOoprZzGppTYrDFZVfTDDdHK8ya2O0gBZMc6skF2oC9Uia6tZq8SRdI2F0sFK87lqZKWaGFdJlOWdwZDw1a7h18fnzKKLiVsdjnZqZJWdSp189JxZ86Gx3velMiaX8SvPOq9dyKNOhLIdJTuHtSTpXLRQQJkHyaKAJiaWg9vtUid8Ib/byfJQknK+EGsmN3TQfAvWJXm2hxZ+k8J3v48T4nv1Fta9OsLmMDdKgAJEGuO3326xK6BBbUWU8+24dWcMdnx06cKHRNyHLn64l7r8DU2Xq2U=
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Get details of an event collection
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-event-details.api.mdx b/docs/docs/api/locksmith/get-event-details.api.mdx
new file mode 100644
index 00000000000..85c6e3e9296
--- /dev/null
+++ b/docs/docs/api/locksmith/get-event-details.api.mdx
@@ -0,0 +1,75 @@
+---
+id: get-event-details
+title: "getEventDetails"
+description: "Get the event details from lock"
+sidebar_label: "getEventDetails"
+hide_title: true
+hide_table_of_contents: true
+api: eJydVU2P2zgM/SsCT11AMxnM0bcB+oHutkWxM4M9BDkwEhNrIkuqRGcbGP7vC9rOJGky0259sWRRj+TjI92BpZTJIJOFinNLGmKijOxi+GihgjXxuy0FfkuMzhfQYKmY7JJYQAUfiBXXpEiMlB2t1CrHRvloNqAhYcaGmHKBat6Bk1sJuQYNARuCCgLxvzGLbaZvrcuHWE59fRntlLPXoKGYmhqEqgPeJYFxgWlNGfpeX3Qj8dxZm6mUn7r6FM1G4Wh80Vnh7MIa+n4hUCXFUKjI+e3NjbxO4e5bY6iUVev9Tq2Jf6BruduTZWJgCiwImJJ3ZqjE7KkITHceRlw+kWHJsfUel56gWqEvpCFlKSS7MarB35eBh7MU9Hj69jjiF42QX4F4cK852HN/yaAw5lfAg33d8WP2l2qjgR0LJ3Ci4V4eDQ1xHSeNDzrlGiqYbW9nA2aZdZMw+1l3pJ1e5EB5uxd0K76hZk6lms3EsDSO6+s2yPoq5cjRRH9tYnPWPV9ztK2RjbofIEG0e4pYGNcurK/+H/L9eOsZdiFBmzY73t2LiEZZPBbKR8SJy73YZb8kzJRBT4v3MTfIUMGf/zwI9XcHhR6BYHJ/0e7Qdpjc1Wb4MPTkt5bybqiNC6s43Jtq9DikpT7t8wQNQvKYz+1Zhs92KuW4dZaKWqLZULBq1YaBVPSOd2oVs6KASy98sDMbYhfWWjXEaJFRFY4Z16QVBqtCZLeaslJ1jJuh/70zFMqgwCmtzx8fhixSLNxgODqR/h70pl4Ymt2hzX9hfk60Mn3nWfLoglDfjoIfNTuHrdAzqhY0VIeBWh0PvYWGOhaWC123xEKP2fe9fB6LUs0XGraY3ThI5h1YV2Rtn6fKi3m8+Xuap3+o0zF9Mfy9VILIYou+lR1oEJ0c/gfSC78VwY/T+zdiOOatX/QaakIrzTLvJos7Yyjx0d2zgS1N9zxkPrwTvfwHbLSUkQ==
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+:::caution deprecated
+
+This endpoint has been deprecated and may be replaced or removed in future versions of the API.
+
+:::
+
+Get the event details from lock
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-event-ticket.api.mdx b/docs/docs/api/locksmith/get-event-ticket.api.mdx
new file mode 100644
index 00000000000..60226aa7e34
--- /dev/null
+++ b/docs/docs/api/locksmith/get-event-ticket.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-event-ticket
+title: "getEventTicket"
+description: "get a ticket for a key by event."
+sidebar_label: "getEventTicket"
+hide_title: true
+hide_table_of_contents: true
+api: eJydV0tv20YQ/iuLPbUAbbpGT7z54AZukiKo5eQgCMVoORI3JHeZ3aEcguB/L2aXkiiJhludRHLe3zzVS9ugA9LWPOUyk1ukxx0aWmhVIslEelSt09TJbNnLF49OZsvVsEpkjl453bBklBMgKEiJjXUCRImdWHcCWd2tTGQDDmokdD7o0izWABUykQZqlJn0VbuViXT4o9UOc5mRa/Hc0nNk8qrAGmTWS+qaIExOm60chmRWt0F6ta58V/1fkU/o/HbOijaEW3RvmqmsKh/y3KH375r6ZFUpIDLPGnsnpBK7p/xdKx+xE0/zwRz0r1iJb6zx6Jl+f3fHP2fAt0qh95u2qjrhkJzGHeaCChzzzjaUNYSGWBqaptIqlFb63bOKfuKCaasK1hXKbAOVx2kUyxhgcgbmPtwaDHAKEtm060orhvErOs9eJrL16D4jQQ4EMpHaf0WnNzrwA5HT65aQ1ekatmxkGmQi7asJrPiz0bEt5CrZ42XX31FxUzSOu4Z0RCs6dgnrPlEzhGhmjrKPbo42xWOOHkOao5xkcoauClQl5k/mgSZ009ZrrvUzVI8MB0AgzzUrh+rLBBoux+EEyznbk6wcyeAcdJwlwtrPWZyWyw6qFjlPp3khB5r+iYIzdqPULFraNxV0b4kOwzBXe7MZOZbfRT99K5AKdKGBGF/xWljBYaGnk74SCozYsZ7urNtGe2trKwQTPGPffr/77dIcz26hvTCWBLRUoCHuTszfbtvTjj3PwEUHn6Jfo/ez5cjVuIG2IpnJRYEOxSt4AUagc9YJbQSPmI2utNmGeEdMbi9tcrCkid/lBzTotHpGt0P3yKrkCEeNVNhxuYU9RIXMZLq7T6HRaUQz7Xn5DGk/7okh5WZL+0nLDWmJXdqHbh/CZmRLcZm1rpKZLIgan6VB1NeaitvW8PNN4yxZZatbZWt5PqC/OJu3il9EdF7yvD/V6Am22mxv/p/m5yh1ULs6rvNnTmtMVFzqhyyxyf2yCMWF4MJIjA9/WFcDp+7Pbwuu8IfTctm3b6M/YndcVdDomzJ8CHvsR4uu470mtdnYIDdm8SWEJT7t45SJ3O37S95fRHjgE42zO52jF2tQJZpcbFqj4kjS1IWTBA2sY1GFlGuzTUQ9DjXhyTrYYiLA5NwjejNGJQpry7CfK63Q+FDRY1ifnxYhisZ6qsFMKHwPhUNKHC6psxl8aLn/cjuNsBL+pLSpQJswlLlE+rGel3LH8ECjmX1vMxtPqux4/jC+/OViufLHuMpWiSysJ1ba92vw+OKqYeDPMXHZcsXj0+nYisueJyY/54dZ8Gawv/w9Du5fxXjJzca2ryPDbo2TWo5+jocid8lVdk9PvCvM78G82oPzy+8KH6bpu9qP4214hQexVobVkMgCIQ//DPqR9qAUNjSRujgGeRgdBvOHxwXXbsuFfJghZ4MnaJ/1qO8jx8KWaIbh4CDxOzs4DP8CUCty5A==
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+get a ticket for a key by event.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-event.api.mdx b/docs/docs/api/locksmith/get-event.api.mdx
new file mode 100644
index 00000000000..e38b5097b5c
--- /dev/null
+++ b/docs/docs/api/locksmith/get-event.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-event
+title: "getEvent"
+description: "Retrieves an event based on its slug"
+sidebar_label: "getEvent"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVk2P2zYQ/SvEnFpAaweL9qLbJtgG2w8giHfRg2EENDmWGEukQo6cCoL+ezGkbGttbZNFDj1ZJjnDN2/ezLAH16CXZJx90JBDgXR/QEuQQSO9rJHQB8jXPRgLOTSSSsjAyhohh1C1BWTg8UtrPGrIybeYgcagvGnYJ+SwSoeCKrGWkPdAXRONyRtbwDBsLi0+InmDBwxCWoGMRmxlQC2cFYaCOF0bGmcDBnZ6++YN/1xc3SqFIezaquqEP3mlEke3snK2EF8NldGxKlHtXUtCObszfIdylpiNvAfZNJVRkanl58D+++ug3PYzqkieZ17JJHRGT87Ytt6ihyEDLWnW+EzoOlGdHak2tSz47zTODCSRN9uWMMDm8uqUqivWR49zG+mOuZ1n7M7sT3Cct6X3smPohHX4VrTkpaFP8UQGB1m1eB3R5MwciGQ1o7NhGDIgQxWvJpEPGRxz/i6l/Bv4TsKItF5Be5bnM6QXc7DtZpfVi1ik1obpl9WHycWp7KY4K6f2M2JIy6/yG1lTHiWhvqNruBnsnK8lQc5yxhsyNXIMbaNfZzJJzrvnOXlZrGNSf5kr/gd7kJXRwtimJeFRoTmgXoi3UgumCgMtfqTCbVtVcst4d7IKeEl1jSHM1hGX0U62FcVOl1qY2DrdiXSXMEGYhH1xfc2QAXrv/Jzf89GUuDOh79GiN2qk5K3T3X10kuj7dY6+J8uuBDnB7XNnqiNpQrdx2VhCb2UlAvoDehFh/e+MPpboUXyVaXYwJGHsMQRji9j8J+m/pPeatFUM78zXkEGNVLpxWsZBSSXksDzcLuNYCcue9Tpw247GaYC2voIcSqIm5MtlLMXaULloLX/fNN6RU65aKFfD5Uj84J1uFf8RCQ8M2aXHQLIwtrh5nedVsjq53TBo1XpD3Yozlbh/CjiVHF95nOn8f4vSo4ds/PjtWN6///3I1Xt3lsF0MDTmD+zOrwnZmJt9XIhPjS8t+i62BWN3LtqNiXmKYYk/j3HyqEAfUjy3VxGezonGu4PRGMRWqj1aLXatVantGerEznmBLPuoE6P2SMYWmaiRJI9qEch5WWAmpNXCOjK7MSpROrcPrKfKKLQBz5MX/np4jFE0LlAt7WSnQBLHx9bFaD3V0Pc+hkZOCf+hZVNJY2MPZn30oz7XcGBukkIhgzxabjIoXSDe7nt2/OSrYeDlxH++3vBI9SYVyboHbQJ/61OVvgj9p4/jRPpZrP4D5VEOtjvN/BwgA9bC+MYcNkMGJUrNKlz349adUtjQxOiq3bCaT8X6/p4T8S8CcM6b
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Retrieves an event based on its slug
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-events-in-collection.api.mdx b/docs/docs/api/locksmith/get-events-in-collection.api.mdx
new file mode 100644
index 00000000000..ddfbf35ff0f
--- /dev/null
+++ b/docs/docs/api/locksmith/get-events-in-collection.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-events-in-collection
+title: "getEventsInCollection"
+description: "Get events in a collection"
+sidebar_label: "getEventsInCollection"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVk2P2zYQ/SvEnFpAu94G6UW3INgstl8IurvoYWEENDWWGFOkMhy5cQ3992JI2SvbStCmh54kkZzHmffmQ3sIHZJmG/x9BSXUyLdb9Bzv/dvgHBrZgQI6TbpFRopQPu/B6xahhOj6GgqwHkroNDdQAOGn3hJWUDL1WEA0DbYayj3wrks2TNbXMAzFEabTNR5gPvVIO5ixs56xRoICKlzr3jGUP5yDPNi/vg3oZhiW8h0N2S6FXMIdssLEhbJeaWWmfBDGLviIUYBf3dzI49T8oTcGY1z3zu0UIZPFLVYTxBM8EzyjZ4HRXeesSZIsPkbB2l8GEVYf0bAIQyIg2+xJRp+c00RaWLCMbZyzf9HrOTNZHFVtsyzTsArQzGRXPWOE5fntWYkLpUfEuY18x9zOCZkz+xM/vjFaJm35QzpRwFa7Hi8jmpyZcyJbzeT2MAwFsGUnq6mgIK0E1u5t6LPQZ/k4FGB6IvT8/pSUyYEEINtxbv/8ztMizk69vnl9mauPDSrhTO1CrzShavXG+loJXRhZrQOpKmBUPrDCzzby9X/JWd87p1fi51q7iOektxjjbFpMKlYKMPRkMLm0Dr2vLoGnhNyhR7Lmt8Dv0uHMxo9zlfvkBUNxUFK8a+uOPFR9WhbCyWunItIWSSFRoP+dkccGCdWfOirts0vSZcYQRE1u8BDJ9T8i6yGFdytQh5xukZswDoo0FriBEhbbV4vUeq5emtpiL1U/LMaWVEAmK8+PnhyU0DB3sVwsXDCb2Fpurnsv71cdBQ4muGsTWjjvy+8pVH26QmUHQabAKWJkXVtfX/075IdsdYRditOmJ8u7B5Eui/EUkSZKyJWHMSPfK9SUpkt+eReo1SLPT388SgW/ecmLaePq7M8onWscZrqzV5u0MJllwr/165DsRqWeUljql0Oc0sqQYo7n1UWEx3Oqo7C1FUa10maDvlLr3idStbO8SxWPUgcpcazZIFtfF6pF1pVmrSIH0jUWSvtKatCux6hUE8ImSoI5a9BHfJkM8Ov9Y4qiC5Fb7Sc7NbLKPUvde3Xy63E2CY419vUBPRLL+JkXndPWC/kpSfZj1j7DVgg6z1sooBwn4Ji6ywKaEFks9vuVjvhEbhhkOesiCV3ZKLVUHQtY1Dv+2YxzAlKmfuXo+P/ycnwpH2Rzmc5d80Vyvvt9HHXfqy+xccg9v5veefAncTAshwIa1JWk/PN+3HpjDHY8MbpoduL4sVXc3YrqfwNjwZ0y
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Get events in a collection
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-exported-keys.api.mdx b/docs/docs/api/locksmith/get-exported-keys.api.mdx
new file mode 100644
index 00000000000..82e0e1a4b8d
--- /dev/null
+++ b/docs/docs/api/locksmith/get-exported-keys.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-exported-keys
+title: "getExportedKeys"
+description: "Get job result by job id"
+sidebar_label: "getExportedKeys"
+hide_title: true
+hide_table_of_contents: true
+api: eJydVktv2zgQ/ivEnHYBJUqDnnTLoe2maYtik2APgQ+UOLYYSyRLjrzRCvzvi6Hkt522OVkk5z3ffOMBrEMvSVtzq6CABdKHF2c9obrDPkAGAavOa+qheBrgMaCH4mkWswFunGt0lVTT1SwDhaHy2o1X8AlJPNtSeAxdQ6Ls00kryMBJL1sk9CGZ1SzuJNWQgZEtQgEG6V/rl5CBxx+d9qigIN/hoZNvo5zQ6pKDrWpsJRQDUO/YjDaEC/QQOeITbhpbLW+U8hjCT119sdVSyFH4pLNAXpvFWV/PtrxVP/Vyq4SdC6pR4NQILtvr/mZsNDhrAgZ+v7664p99w/ddVWEI865peuGRvMbVaHzqEGRQWUNoiJXltr35c2ALw04EpmsaWTYIxVw2AbN1SLZ8xootOc/AIj0G1CLtBn5GiizJ5lTzGDALPP1S9t/PvMWYwZJB/Eq80nvZQwaasA2nIjxSPAx5iea4JUd6MUtQ+5aQ8KvSa2D+kgK+OO2naTyqxSmFJfZ/2Uah/w03MQPSxGe4w/4rklSSJJc6pnK/v3p3DLxHIzuqrdf/oYIk9P5Y6LMthbEk5rYzikeIMVPbiZMSZVANBeSr61w6nQ8TQcScKxXyYadgMR9H54K7nw9p7mKiMr9aU07nGyigJnKhyEcbrab6sjP8feG8JVvZ5rKyLRyO6HdvVVfxQdwnk8ATv28xkFxos7j4Pcv3o9bG7GzLv/c8eyPoRhbedItdrumBzyVKn3o+fny0vpXEJf7ngcu/x9sbI9LpO+y3ZCWd5vLxaHBgPzr0fWqLNnOb9CYcPKa0xJd1npABF3nM5/oow42ccN6utMIgSlkt0Sgx70wqqmw09WJuvUAjy4brQbpaImmzyEQ7gU4Esl4uMBPSKIaOnk9ZidraZWLoRldoQpq4Ka2vtw8pC2cDtdLsvCyQxHr1iWn37YU+bNnxtdU21ZPwhXLXSG245gkbw4ThJ1hxXaTTkEGxXXQJKny1v5R2sMyP4xaZZVDbQGxsGEoZ8NE3MfL12KniaZbBSno9Tu/TAEoH/lYbIjub3B9/TwvqT7G/XU+mtsaPYaysZNPxCRK97KxxHpA3RXC4dN8Qw2453xzH+bX8hojGHsZZzKBGqdJ/qmF6u6kqdLSjdbSImRU25PjpwwNjqWNgbYb5gAGS9ZMRDcMo8cBrLMZNgONai7MY4/8ooH2e
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Get job result by job id
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-lock-settings-by-slug.api.mdx b/docs/docs/api/locksmith/get-lock-settings-by-slug.api.mdx
new file mode 100644
index 00000000000..985e5a252e8
--- /dev/null
+++ b/docs/docs/api/locksmith/get-lock-settings-by-slug.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-lock-settings-by-slug
+title: "getLockSettingsBySlug"
+description: "Get lock setting by slug"
+sidebar_label: "getLockSettingsBySlug"
+hide_title: true
+hide_table_of_contents: true
+api: eJyVVUtv2zgQ/ivEnLaAEhc56pYabdBtFwjWCfZg+ECTY5k1RarDkbuCoP++GEpK3NhduD5YoubBeXzzTQ+xQdLsYvhsoYQK+Ws0hxUyu1ClD93KtxUUYDEZco3oQQkPyMpHc1Bp1FPbTqVRsdGka2SkBOW6ByfqjeY9FBB0jVDCpEj4vXWEFkqmFt/eMF2bzB5rDWUP3DXZmMmFCoZhIx5SE0PCJPK79+/l8cZLawymtGu971SFPMeb1C5SzgAKMDEwBhZr3TTemVyNxbckLvrzEOL2GxqWfFrv9dYjlDvtExbQkBST3RiRuL+3ljClCwkUEJB/RDqcyEJbb5FEljDYj7V2/kS6jdGjDlks1bnkk7Dx3VM8l51GK/UeCjCE1vFSk30kZ/A8jgs2KDGtMFik6+7YoznElpcx7FwlCLvCaB/j4aF13l6p3wYp9SfE5V5ThfYpPqef4jup3GvSy5YIg+kuXWFxp1vPUEKb7GgWU6pd4KV3GPjKwBqKdVxGi6cA0ES6gwIcY30JGGKnU/oRyf6m2TxRD45NdOFRp9RE4pWJdE13hwLYsRzhlAJgkF8BNfI+ThSR55z3UMLieLeQ6t/Mk7UQbC56+R9kgJGOMxe05KGEPXOTykW2SrXj/e3Yv5uGIkcT/a2J9RnjPFK0rZGDWmWXMBRvPSbWlQvVze95Xo1WL243ErRpyXG3ktEfm/cGUXLlTE8ZYagp13R8+RSp1gKfP/95Evjcv/LKaUsb9wW7V2LUjbs55A+ZNb+3SF1urAu7caSn9jzntNTXOU8oQIo85nN3luGLnmooHp3FpLbaHDBYtWtDLqr2jrtMihj01ks92JkDSksLVSNrq1mrxJF0hYXSwaoQ2e2mrJTMbLqFArwzGFLG25TWX5+fRlTHxLUOJxJhZAlOzVhTHzp1aeH0ryT9f7tnqivjv7xovHZ54jNG+gmvazhKfX5CLBTzSirzcyMMlFiU+36rEz6THwb5PHakXG8KOGpy4+yse7Auybt9WQS/DP6Pv6cZfTfneTHmGSBBwHDUvpUTFCDomBbosBGmRJ2ZeN1PontjsOETo7ONJvh+GeWHj9Ka/wCt08tA
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Get lock setting by slug
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-lock-settings.api.mdx b/docs/docs/api/locksmith/get-lock-settings.api.mdx
new file mode 100644
index 00000000000..be885b36824
--- /dev/null
+++ b/docs/docs/api/locksmith/get-lock-settings.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-lock-settings
+title: "getLockSettings"
+description: "Get saved lock settings"
+sidebar_label: "getLockSettings"
+hide_title: true
+hide_table_of_contents: true
+api: eJy9Vk1vIzcM/SsCTy0wiYNge5lbYOwGabdFUCfowfBBluix1hppVqK8NQbz3wtq/DGOZ7feLdCTPRJJkU+Pj2rBNxgkGe+eNJRQIX30ajNDIuOqCAVojCqYhi2ghEckEeUWtbBebUQ82TUyyBoJQ4Ry3oJh60bSGgpwskYowSF98WEDBQT8nExADSWFhG/P+KO3E0bfQgFRrbGWULZAu4bDGEdYYYCuK0aP4cQetA4Y478exbUK2RuPHhYpGFdB1y04VGy8ixh5//7ujn/Ow82SUhjjKlm7ExVDtcdHrHzIiEEByjtCR+wtm8YaldGffIocor1MwS8/oSKuL1krlxahXEkbsYAm8OWR6TMa1n1ZQHGE/7TnUr1kIAuI6PT7Who72F16b1G6vG1TNRozYGN3L/5yb5gtA98VoAJqQ1MZ9HMwCi/zGPFBzmmGTmO47ow1qo1PNPVuZSpm9BVOa+83j8lYfaV9cgz1B8TpWoYK9Yt/jWf5DZA7FT1NIaBTu7EjNK5ksgQlpKh7Nx9jbRxNrUFHVybWBF/7qdc4JIAMQe6gAENYjxGD/WSMX3zQ3+l2aK1HQ8ob9yxjbHygmfLhmtvtCiBD/AlnktN1vPXu7t1If/U2wnkSK5+c/i/tdN49NcYoKxyrtE/ol7GGf3JbaY0WDAVG+t/S6QqokdZ+L9lZfmkNJUy29xNm581BeSbtvu+7vB4n7UAnOpY8DNuDaKdgoYQ1URPLSW9fG1rf9oy/aYInr7y9Vb6+mAzPweuk+EPMckhgfT6PGElWxlU33xd51nsdwy44aZWCod2M4ewRe9ODfORB0HNPogyZhf2fDz7Ukhvu179euOEeTnc1bILG/Ia702iRjbnZ5IU8dz4nDLvcCsatehHcE/o1lyU+HuqEAhjkvp77iwqPdqIJfms0RrGUaoNOi1VyGVRpDe3yGEEnl5bxIKM2yJdciBpJaklSRPJBVlgI6TS3iVntqxKscnnGWaPQxUytfVm/P730OuAj1dINdniG5Rn5tQdBeyL8N94GezgJ/6ZJY6XJ0pip0e6JO4ctw3JGXSigPL0ZMmd4aTjnFqzekdi/bZcy4muwXcfL/d2U80UBWxlMrzvzFrSJ/F8fh+hXy/npz72+/SzOXySj1RwY45gdW2kTf0EBTJfT04db4ocyePtQ+YEchrh1C557KPNcnbd7iwelsKGB74WCce8dhefxPdPmH+Jjk6k=
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Get saved lock settings
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-lock-stripe-connection-details.api.mdx b/docs/docs/api/locksmith/get-lock-stripe-connection-details.api.mdx
new file mode 100644
index 00000000000..4c81f32b201
--- /dev/null
+++ b/docs/docs/api/locksmith/get-lock-stripe-connection-details.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-lock-stripe-connection-details
+title: "getLockStripeConnectionDetails"
+description: "Returns Stripe connection details"
+sidebar_label: "getLockStripeConnectionDetails"
+hide_title: true
+hide_table_of_contents: true
+api: eJylVU2P20YM/SsDnlpAuw5y1G3RNkHaFCjiLHpYLBb0iLYmlmYmHGoTQdB/LziSbTn2Ylv0ZEPix3vk49MAIRKjuOA/VFDCjuRjsPu1sIv0S/CerL77lQRdk6CAipJlF/UhlPCJpGOfzBRv7DHBVMeMiIwtCXGC8mEAp3kRpYYCPLYEJTTB7u+qiilpPNPXzjFVUAp39GNHRWdwCr6FApKtqUUoB5A+arEk7PwOxrGYe33tiPtTM1uj81faXBTyXbshhvEqAk/yLfAexketlGLwiZImv33zRn/OU9adtZTStmua3vA8M2X98uCUmw1eyIvWwxgbZ/OeVl+SFh0uEYfNF7KiI2fdqrgJkg2dF+7XkezrwamLMbBQ9RSxb8nLk+2Yydv5/ZyNzKhDdUJtujb9cSwAbW79elNXXSlR6Kp4R+mJPG4aWsZsQmgIvQZF7EMnrwTNy1Y+6XU4lUu51hMTzrO+pDfm/ejWzpoeVDPOMS1JHebLyscgNZSw0uWvhoXwx1XKUrg5FS0gET8f7qbjBkqoRWIqVzk/tU7q287r/5vIQYINza0N7cWZ/sWh6iZ5rXNJ0Os4r5gEd87vbv5b5fWUdSz7qKBtx076tcpzGuh9Il7MSFseTjcvipCJoZj/vAvcokAJv//9WZd3d9L+UoHR/UGLu8bobvb5weLqdQPOb0POc9Jo4H2mZT4eeEIBOuSJz9sLhsc4Ezk8u4qS2aDdk6/MtvN5qNg46c02sMki1HmIs3sS53eFaUmwQkGTJDDuqDDoK+ODuO3MytQh7PPFN86ST6RwZ1p/fvicWcSQpEW/eLMjySQOHnJya/OCXQ8nR/lXzj1PWui7rGKjtjkWk2qGWcgP2buhgPLcwy+0/FhAHZJoxjBsMNE9N+Ooj6dFqcIPZwflFpv0o/Mvwf/0aTbvn82ZG78AWWVxMv5nbDqNyWJ9Rnba9H8CWHyQriI4aNb3SwAHZMvZjY9jATVhpRfzMMwRd9ZSlEXuxfdAyRy95v1vKpp/ALD1wic=
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Returns Stripe connection details
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-receipt.api.mdx b/docs/docs/api/locksmith/get-receipt.api.mdx
new file mode 100644
index 00000000000..dbe38438b3d
--- /dev/null
+++ b/docs/docs/api/locksmith/get-receipt.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-receipt
+title: "getReceipt"
+description: "Get receipt details"
+sidebar_label: "getReceipt"
+hide_title: true
+hide_table_of_contents: true
+api: eJzVVktz2zYQ/iuYPbUztOV40gtvPiSuWzeTieXpQaMDBK5IRCSALJZKVQ7/e2dJ6k3ZqXuqLiKJfX67+HYb8AFJs/XuIYMUcuQvaNAGhgQimposbyCdNfAckSCdzdt5AhlGQzaIFqRwj6yoV1IZsrZlhASCJl0hI8VO3Ypk0FxAAk5XCCk45O+eVpAA4bfaEmaQMtV4av9TL6dsdi1BmQIrDWkDvAlixjrGHAnaNhl1U3qzussywhhfdfXozUrpXnjUWWSyLr/oq9CxeNXJr73QZdtzsRCDdxGjnN/e3MjfsZWn2hiMcVmX5eYUfgndeMfoWBR1CKU1XZEnX6NoN+fe/eIrGql6IGkJtr3vUJMpdFf710Sx0rYcyScBCbJHaORwUUfrMMZPlwSGejxah+9eE7gdFTBdE48cRNY87vRvG8ZN+doxjVlrxV4tUP8IWFvJi1mvNY+HjLS2Bj8jLT1V0mP/b8iG1n0dMTueKtsKI+vq0Lerq4UwgqDlsqNy7BWD3lw4ITQ22OHynJ0e8sloQH6F7iWBXMepZ12OBqwrQWtK2sUlEh3Vdys1/BJ4f/PunBiEqJWNynlWuuYCHcvlx+wyK7xMCK4uS70oEdKlLiOe1qXCGHU+0hLCe0tdlwwpTAskVN91VNopJPKkrFPCC0tbWpcrLlAJbWLk63OfbVdolne4R4dkzRPSGumDmIItGu/P0Xiogo/RLkpU7BUhk8U1nhNmm8AvYzT7UdsSs5d1/wPZ7ifFbAfk/IcR3jVChVz4YX53s5cLSGGyvp0MwcZJM4zbdtIcdHA7aWRmtdATy3Za11TKNGMOMZ1MRD5Wlovr2snzVSDP3vjy2vgKTsfbZ/JZbeRF9TUCGZbHFiPr3Lr86t9Zfuq1dmbn+xXlSRDu0Xo+Hlbicjtt5X2BmpAgGR4+eqqEaeG3P6fSBHfHt2IwooP9HTf7Oa+DvVp1H7ol4FuNtJGlAKxb+k5vaNbnLi31uM0TEhCQ+3xuzzLcyalAfm0zjGqhzQpdppa160DVpeWNWnpS6PSivzvWrJCtyxNVIetMs1aRPekcE6VdJlRgl0NWqvB+1TVtaQ262LXVkNYfD9Mui+AjV9odnOTIar8YHgXd7Lv/wio4gMj4F09Cqa0ToLuGaIZWncH6FnazQHTS/XaYHm9wabdkzRMofGRRbZqFjvhMZdvK574Y6WwuM5RszyKzBjIb5Tnb0djFLH76MtzKn9Xx7jmayLZFnLTDWpe1vEEC0h/7JVfuwJsiOF1J3xDDIX5vjmPYWt/gvqtXO28TKFB303jWDEd3xmDXUVulM/aUS75jt/sPU0hAhtrB3Ty50J310YCappeYyoBu21183cCWANv2H/Qlhbo=
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Get receipt details
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-receipts-base.api.mdx b/docs/docs/api/locksmith/get-receipts-base.api.mdx
new file mode 100644
index 00000000000..275c22ced56
--- /dev/null
+++ b/docs/docs/api/locksmith/get-receipts-base.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-receipts-base
+title: "getReceiptsBase"
+description: "Get supplier details"
+sidebar_label: "getReceiptsBase"
+hide_title: true
+hide_table_of_contents: true
+api: eJylVk1v4zYQ/SvEnFpAibNGetEtC+wG2aZBkA/0YPhAUyOLa4rUDkfeuoL+ezGS/K007a4vFsWZ4czjmzdqIFRImm3wdxmksER+QoO24vhRR4QEIpqaLG8gnTXwGpEgnc3beQIZRkO2EldI4RZZxbqqnEVSGbK2LkIClSZdIiPFzt+KaaW5gAS8LhFS8MjfA60gAcJvtSXMIGWq8fSAh95O2exSsjIFlhrSBnhTSRjrGZdI0LbJ6DEumNVNlhHG+O5R98GslO6NRw+LTNYvoRUYCGMVfMQo+9OrK/k7DvdcG4Mx5rVzG7UcwUnOMMEzehZvLbumu5PJ1yghmvMUwuIrGhaESW6QbZ/ANvRDV/VZwgmsNb/1/qOONj4G6zk+aT5093W5EGyFDbS2Bh+R8kClADgSa4Du3nr88J7BdNTAdIQb2Yh8nNl+529bjYcKtWcai9b9EpheXZ/f2UNQNPSBykPtMwl1ffXh3FJaQtmofGClay7Qs1weZm/f6r9fqK+d0wuHkObaRTy94RJj1MsRDITFua4dQwovBRKq7zoq7RUSBVLWK2Fgbp31S8UFKmkCjHx5fqbAwpZlDbfokax5RlojfZJQ0ON2PYbbXVmFGO3CoWKBkMniGkcY3ybw21izfNbWYfaO80+0y77zZzso5/8Z43ZLmhK5CINgdjLHBaQwWU8nW9pcLHTESTPIWztpDhSohb6TtrJYk4MUCuYqppOJGMbScnFZe3m+qChwMMFdmlDCqVg9UshqIwvV3xGIAh5HjKyX1i8v/l/k595rF3a+HwbPgm+PVT8SdkDJkVvJlPUCNSFBMjx8DlSKAsGXP1+EAzfHXTEE0ZX9HTd78daVvVh1Lzpl/1YjbUTpwfo8dH4DWV+7stT9tk5IQEDu65meVbizUxWFtc0wqoU2K/SZymvfgaqd5Y3KAyn0etH3jjUrZOuXiSqRdaZZq8iB9BITpX0mUmDzoSpVhLDqKOusQR87Ug1l/XH30lVRhcil9gc7MiW2c1gNg/go9WbfAW+N3gFLxr94UjltveDd8aIZ+DqD9bRriQPGQgLpfiSnh2NznkARIotf04jtK7m2ldf9haSzucwRsr2SzBrIbJTnbCdlb9bwy9PQl7+q40E/WsWWJl4osdaulhUkIBzZf1FIH/xQBqfz/wdyOMStnbcJFKiz7tupGSxujMGKD3zPdEwabqczt59eIAEZMAd9ctJcXfTRvJqmt3gJK/Rtu0uTZS0Jtu0/EXp87A==
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Get supplier details
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-receipts-status.api.mdx b/docs/docs/api/locksmith/get-receipts-status.api.mdx
new file mode 100644
index 00000000000..815e2b1a466
--- /dev/null
+++ b/docs/docs/api/locksmith/get-receipts-status.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-receipts-status
+title: "getReceiptsStatus"
+description: "Retrieve the status of receipt generation for a lock."
+sidebar_label: "getReceiptsStatus"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVk1v5DYM/SsCTy2gZBbBnnxLgW6x7XZRZBL0MJiDRqLH2pElRaKnHRj+7wVtj+fLRbBBgeYSWxbJx0fycVoIEZMiG/xnAwVskZ5Qo42Ul6SoySAho26SpQMUqxZeMiYoVutuLcFg1slGNoYCnpCSxT0KqlDk3liEUqTBndiiHwOJMiShhAt6dw8SokqqRsKU+wCWfUVFFUjwqkYowCP9FdIOJCR8bWxCAwWlBq8RfB3uCWvYb9YV1gqKFugQ2Y31hFtM0HVyNgwDejQmYc5vhvoS9E6o4fJssEzJ+i10zFPCHIPPmPn7w4cP/O/S3bLRGnMuG+cOIo1EmjnuBmI5pA6e0BM7UzE6q/sLi2+ZPba3iMLmG2q6yGzF0BrHhzqhIjSPBGsJMXFXkB0QW8I6nzlSKakDyJvzKcCVuZmhhct+cEGZt+2HjG99SEDf1JxERG+GkzzwCBJKZR0aWHcSdniYRTDm/nZiUy277pyoGURlSLUiKMAowjuyNXKgJprvMzn+Sfg41y0/KW6N1wYz/WeNUGPOaou31T9+mKVjgPjxFuLX8O/NK8rQePO/I+8k1EhVGGWvVyKqoIDF/mExgs8L5dyiHQWoW7RnGtH10pj2R+FqkoMCKqKYi8WCL+baUnXfeH6+iylQ0MHd61DDtZz8kYJpdM/RsncJrFGXHjOprfXbu+/zvBysJrfrk54vmd6BqkHVJ5445FHU+H2DKmECOT58Orbsr38+c38/nmp3Pk3R/oaHk7yqaO92/UGvva8NpgNrMVhfht7OkuOLL31a4ssxT5DAJA/5PNxkON0TMYW9NZjFRukdeiPKxvekKmfp0K8d9GrjmA+yeodk/VaKGkkZRUpkCkltUQrljfCBbDlmJaoQdr3oOqvR576nxrR+//zcZxFDplr5sy9bJHFcpmLaphfg29MIvHt/jnQT/k2L6JT1veRw67RjR69g/9APzYAFJCjnQEJxWqzF+fJbS6hCJjZs243K+JJc1/HxULRitZawV8mqDRds1YKxmZ8NFKVy+Xpbnmf5w9M4uj+Ky3U9m8axlTy3zV65ht9glPTpdwHPyrsQXG/xd2A4563jbVOhMv1PpHa88ag1RjqzvZE6HspJin75+ZkL1HDhplm6GsDe+yyuth1uPIcd+q6bYBK/M8Cu+weGyXMq
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Retrieve the status of receipt generation for a lock.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-receipts.api.mdx b/docs/docs/api/locksmith/get-receipts.api.mdx
new file mode 100644
index 00000000000..ba177d69894
--- /dev/null
+++ b/docs/docs/api/locksmith/get-receipts.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-receipts
+title: "getReceipts"
+description: "Get all receipts for a lock"
+sidebar_label: "getReceipts"
+hide_title: true
+hide_table_of_contents: true
+api: eJylVk2P20YM/SsDnlpAu94u0otue0gW26ZBkfWiB8MHWqKtiUczCodyagj67wUlWbbX8qZNfbFGw8/HR1INhIoYxQb/lEMKG5LPlJGtJEICkbKarewhXTTwEokhXSzbZQI5xYxtpWqQwiOJQecMD5pmHdigcSHbQgIVMpYkxLEzY1WjQikgAY8lQQqe5FtglWX6WlumHFLhml77+dTLGZvfanBZQSVC2oDsKzVjvdCGGNo2mXSj8TzkOVOM33X1MWRbg73wpLMobP0GWkWDKVbBR4p6f393p3/n5p7rLKMY17Vze8MkbGlH+QiYesiCF/KiulhVzmZdUWZfohpoLgMIqy+UieLLWkKxvXsrVMYTMWTGPSQX76+p5xM5aoZdoJ/qcqUkmJAQW1IULKvJ20g+v6JY4f7KDVNmKztgcnF7Ws3JgMKW/FsCG4zzIOgmL7EMtZc5o49r4o4mE1IH4h7vfI+QplxrFYmvh3D4JfDu7pdLzmi/GRuND2KwloK8KCkov86Wt4nia+dw5QjSNbpIr0tfUoy4octAtTfWWDuBFOYFMZlvGA16Q8yBjfVGeb22zvqNkYKMthZFub302XZMET3DI3limz0T74jfqyk4oPHuEo2nsgox2pUjI2FsoUMHmZwErYu3ivyvUx34Aa2j/G3d/9GEx2myGIFc/muERyKUJEUY5nA3OqWAFGa7+9lhVMyagXTtrDlpgXaGznUTW9HsJ23NDlIoRKqYzmYqHEsrxW3t9fmm4iAhC+42CyW8nn9/csjrTA+mLxDoUD23GAU31m9u/pvl515rNLs8rplnhbeHql82I07q8jCF9bwiZGJIhocPgUtUev7211wZ8HDeEodRWNnfaX/cB1jZm233olsWX2vivS4PsH4dOr2BqS9dWubjIU9IQEHu87m/yHCUMxWHnc0pmhVmW/K5Wde+AxWdlX23Jsnjqm8cm21JrN8kpiTBHAVNlMC4ocSgz3UO2PWQlSlC2HaMdTYjHztODWn98TTvsqhClBL9yc2GxJxs97OomyP3v7PPBzSF/pZZ5dB6RbxjRjMQdgG7exiXhrpKjys+PV/DSttlAkWIoopNs8JIL+zaVl/3NUkXywR2yLafJIsGchv1OR9H2dVcfvo8dObP5vzzYTKNA1O8smKHrtYTJKA0OX6naCv8UASvvyp+IIZT9Nplm0BB2K3WRTNIPGQZVXKiezHJtOfGSfP4fq5lqLVwY6u86q/O+mRcTdNLzHXbtu0YZrd9NcC2/QcZH5uO
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Get all receipts for a lock
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-stripe-connections.api.mdx b/docs/docs/api/locksmith/get-stripe-connections.api.mdx
new file mode 100644
index 00000000000..175010e5b49
--- /dev/null
+++ b/docs/docs/api/locksmith/get-stripe-connections.api.mdx
@@ -0,0 +1,63 @@
+---
+id: get-stripe-connections
+title: "getStripeConnections"
+description: "Lists the locks connected to Stripe for a user"
+sidebar_label: "getStripeConnections"
+hide_title: true
+hide_table_of_contents: true
+api: eJytVU1v2zAM/SsCz2rTFTv5Ngxd0X0AA5pihyAHRaZtLbLkiXS2wPB/Hyi7aZp0wwosl0gy9fxIvkcPEDtMhl0MdyUUUCPfc3Idvo8hoJVzAg2Etk+O91CsBnggTFCs1uNaQ4lkk+skDgr47IhJcYPKR7slZScQLBVHNeGqKiZlVC8YGhJSFwMhQTHA9dWV/J1DqljNgF3CnYs9+f1L2KDBxsAYWHBM13lnc2qL7yRgA5BtsDWy4n2HUEDcfEfLoKFLUgh2E5WE1Hs+ijMpmT1ocIwtnd8fRw2YUkxHj4iTCzVoCL33ZuMRCk49jvmn4e1L2d6FnfGuVAl/9Ej8/xJqkcjUeE7vic6bczrSaeVIhcjK9NxgYCGA5eUfmf2d1FMpKuMJ/5mlCK0yuSWwbDCh+mlImaBy0ZULquq9r5x3oc76mwt4ef5OSZYdyx5uMWBy9h7TDtNN7t9cjha5ibMhpJiGGyhgsbteUJbawp74QxAo26NPHgpomDsqFous29Zxc9kHWV90KXK00V/a2MKpgb6mWPYZVU2kYNSniMSmdqG+eB3y/XTrALt+MvW9tGtqwGTtQ/XllZJdDoACNmhS9u20+BBTa6QlH78tYdTw7rkMHq3TuU8o3gmmnfcX23zghNiPHtM+G8iFKuZ7c3ceclrq82OeoEGKPOVzfZbhIU51Ke5ciaQ2xm4xlKrqQy6q8Y73eQJhMJtJLM5ukV2otWqRTWnYKOKYTI1amVCK9l01Z6WaGLckovLOYqCs1DmtL3fLnEUXiVsTjp7UyI/D7/lUfcZ/eDLU6+foXGrGX7zovHFB2pFlM8zaXcFOSkZHg/LAZK2hicQSNAwbQ/iQ/DjK8dScYrXWsDPJTTZarUcNDZoyfwYGkGYW8M5a7MQrO+P7qc8n40o0d/DV7c0SNMhQOZLKib4y+qOKwv4IeximiGXcYhhH0DMJlj2M63EcfwOveGXh
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Lists the locks connected to Stripe for a user
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-subscription.api.mdx b/docs/docs/api/locksmith/get-subscription.api.mdx
new file mode 100644
index 00000000000..e389373181d
--- /dev/null
+++ b/docs/docs/api/locksmith/get-subscription.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-subscription
+title: "getSubscription"
+description: "Get an active subscription associated with the key. It can be fiat or crypto."
+sidebar_label: "getSubscription"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVktv4zYQ/ivEnFpAsdOgJ91y2Abpbotik6AHw4cRNba4lkgtOXJWEPTfiyEVv7PZBgXqi8XXfPP8ZgZwLXlk4+x9CTmsiR+6ImhvWtmDDErar3K4I1ZoFWo2W1Lh4KrCEJw2yFSqZ8OV4orUhvqZumel0aqC1MogK+eV9n3LbgYZBNKdN9xDvhjgKZCHfLEclxm06LEhJh/ikRHwFrmCDCw2BDlY4mfnN5CBp6+d8VRCzr6jU5X/TPeUKSOgrqhByAfgvhUxxjKtycM4Zhdhaqc3t2XpKYQ3oT45vVGYLl8EC+yNXb+KtaH+vnwT5SP16v6yMTv5SxESWmcDBTm/ub6Wv2NBt7a/FEmRrJ1lsixvsG1ro2OKzL8EeTicA7viC2mGDFovCcUmwR6KDQfX0XvsIQPD1IS3xVj6xge3bNcU5MVtXV1jUVPy05hBgTVaTT+gWN8Urr7guQywcZ3li0cladNgHc51GcdRIMz/ho1t692Wys9k6fn42iTjNI1upxcqiVFupfz0WBW96gL5mQC3LgRT1PTjkv+aXlyUjIFK5WykB8FQqLUYrabYRcwkfwCyXQP5AhJhQAbCILA8BXysSMkTQWqxb8iyaogrVwpEqVbOR7zjLB9ffhn8ev3LeXkIHSkTlHWssOOKLEsdUPl6gXy/NvbpusI60GleNBQCrumyf1fY1ZxM9aSeMQgNk/fOK2PVqqvrlamNXUc7hT8o8OwcU4xlw7KGO7LkjX4gvyX/QUTB5I7ku9QOJH2FpHKYb2/mRwU9HyYOHufCkmE+HJDlON9QH+ZD5LQxUr3gJDrvfA05VMxtyOfpcWO4mnVWvq9a79hpV8+0a86zy7uy07HlJNVB2PRYYmBcG7u++neSH9Krndjlvj89SFBTmFKX2sVIIF+oWNYFoY/klD5+c75BCdzvfz9KZt8eJ8sLH7bmI/X7RoCtudrEjdglvnbke+kaYOzKxXdTDJ+iWerTi52QgTg52XNzZuHunpLaNyVJQeoN2VKtOhudirXhPlYMWSxSShm9ITZ2nUlVYYmMKrDzuKZMoS2lQsxqskpVzm1i96uNJhtiPk9m/XH/GK1oXeAG7cHJmlh9b/AY9gX3n88gUwyYvvG8rdFYiVPMp2FK/QVsxZfH3SyDfD+CxESTreNxQUpAdlNjX2ZQucAibxiECJ98PY6ynQKcL5YZbNGbVLCLAUoT5LvcMcarTvnp8zQz/KyOB56L1r2knZUU22LdySrpezBZSV29S4PTOegdOhz68d167Celd2iQYjYuxwwqwjKOpsN0dqs1tXzw6mxIEvLY0ejdh0fIQHrIQc2fEEWUflGjYUg3Ht2G7DjuFGRZi4Lj+A97Bhd+
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Get an active subscription associated with the key. It can be fiat or crypto.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-ticket.api.mdx b/docs/docs/api/locksmith/get-ticket.api.mdx
new file mode 100644
index 00000000000..a16437e015f
--- /dev/null
+++ b/docs/docs/api/locksmith/get-ticket.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-ticket
+title: "getTicket"
+description: "get a ticket for a key by lock."
+sidebar_label: "getTicket"
+hide_title: true
+hide_table_of_contents: true
+api: eJydVkuP2zYQ/isETy2gXW0XPem2hzTYJimCrjc5GEYxpsYWI4lUyJE3gqD/Xgwpy7KtRdo96UHO+/tmppe2QQekrXnMZSb3SCutSiSZSI+qdZo6ma17+ezRyWy9GTaJzNErpxsWiiICBAUpsbNOgCixE9tOVFaVtzKRDTiokdD5oEqzVANUyEQaqFFm0iC9WFfKRDr83mqHuczItXhp6694T+ic9XpVYA0y6yV1DavRhnCPTg5DsmiGHXrIc4fe/9TUR6tKAfHyojFPTpv9q7ZK7B7zn1r5gJ14XA5m0r9hJb6xxqPn8/u7O36cK3pqlULvd21VdcIhOY0HzAUVOJaGbShrCA2xNDRNpVUofPrNs4p+5oJpqwq2FcpsB5XHeRTrGGBykcxjuDUY4BIksmm3lVacxi/oPHuZyNaj+4QEORDIRGr/BZ3e6XAfiJzetoSsTtewZyPzIBNpX0y4ij8aHUErN8kxX3b7DRXjtnGMadIxW9Gx67QeC7VwEM0snRyjWzqb52PpPIa0dHJWyYVzVaAqMX80DzQ7N229ZaxfZPV0YUoI5Llm5VB9nqWG4Tic5XLJ9qwqp2NwDjquEmHtlyzO4XKAqkWu03ldyIGmf6Lggt0otZgt7ZsKutdEh2FYwt5iRU7wu+LT1wKpQBcIxPkVL4UVHBZ6OuOVUGDEgfV0F2wb7W2trRBM8Ix9+/3ut2tz3F6F9sJYEtBSgYaYnZi/Tttzxl5W4IrB59mv0ftFODIad9BWJDO5KtCheAEvwAh0zjqhjeAWs9OVNvsQ75iT22ubHCxp4m/5Hg06rZ7QHdC9Y1VyTEeNVNhx9IRZQYXMZHq4T6HRacxm2o8DYkiZZWk/49qQltilfaD5EKYWm4iTpnWVzGRB1PgsDaK+1lTctobfbxpnySpb3Spby8vO/NnZvFX8IaLXkhv9uUZPsNdmf/P/ND9FqUnt5jRqn7iesUJx4E7lYZPHKRFQheBCL4wvf1hXA9fsz68rhvbDOU6OvG30B+xOMwoafVOGH2GAfW/RdTzQpDY7G+TG8j2HsMTHY5wykYcjseT9VYTTPdE4e9A5erEFVaLJxa41KvYiTV1YF9DANqIp1FqbfSLqsZsJT9bBHhMBJmdy6N0YlSisLcNgrrRC4wOUx7A+Pa5CFI31VIOZnfCuMu03F213Ytl/2GjGfBL+oLSpQJvQhhkb/YjgtTxwXqDRfP1oMjstOqyK/1yNUf4Zh9YmkYX1xMr6fgsen101DPw7Vipbb7hROh1Jt+65N/J7PrH+1Rh/+Xts0b+K86VqMbQjfgx7N7ZmObp72t6YIG/y4HLXeoMP8zS+2Y/TNvYGD2LNhs2QyAIhD+tyP549KIUNzaSu1i/uAlMrfP9uxdhpGUgTeS8YH7QvetT38cbKlmiGYXKQ+JsdHIZ/AVIpIcs=
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+get a ticket for a key by lock.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-unapproved-events-for-collection.api.mdx b/docs/docs/api/locksmith/get-unapproved-events-for-collection.api.mdx
new file mode 100644
index 00000000000..aae29fae7ee
--- /dev/null
+++ b/docs/docs/api/locksmith/get-unapproved-events-for-collection.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-unapproved-events-for-collection
+title: "getUnapprovedEventsForCollection"
+description: "Get unapproved events for a collection"
+sidebar_label: "getUnapprovedEventsForCollection"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNV9uO2zYQ/RVinhpAu0636YveNsHuYnsJiqwXRWEYBS2NLcYSqQyHblxB/14MqZWvm6QogvTJkkgOz5wzQx534FokzcbZ+xJyWCE/Wt225DZY3mzQsr919MbVNRYyCTLwWAQyvIV81sGjR4J8Nu/nGbSadIOM5OOQ1Q1CDr4OK8jAWMih1VxBBoQfgiEsIWcKmIEvKmw05B3wto1rmIxdQS9RS/QFmTZunsMdsgojQIURoVo6UloV+ygJfeusRy9hr16+lJ/DUA+hKND7ZajrrSJkMighT6JDBoWzjJYlhm7b2hSRsMl7L4G6U/xu8R4LPsh0lvjIRj4avZLXfUwZaGYyi8DoQQglEYdNSiLxecLREPHcQNrj3MgBE2fG93DshjWR3gp0xsZ/LlsmbfjPOCODja4Dnma0N+cciLTqTFX0fZ8BG67layxSSN9endP53m50bUplbBtYERZoNlheqte6VIIYPV/+F41tqGu9ECxLXXs8TrJB78/KICosdagZcng3VKtauHKr0l7KeGUS9svTbfoMkMjRubi7qdJf+2TdoUUyxUDJa1dub2KQJ/q+P6VPOlygWMdKB67QsnCD5fOkfX2+phUSqr+0V9qqyIMyVkkrL01t7EpxhfviHpN3SskD0gbpkI0fPs+GI/M3loqdapGWjhrFlfFKx2Pom5fVHy4oTXiMVk7LfSU/Af8TxL11fL0fZaTt1Slt0wqVHBtqOyBq9FpkGiSKB3jpMPGKH83/oCUJvQtUJPKWLtjyi+rorePbODmx8eO5E+nRSgxhfajYkYcyxM/GMpLVtfKxKlOFf3NGvn7T9Rk0yJUbnAhkyTHkMNlcTeJtfLG75CedXHz9ZHdhX4wXduIt+ZBANeRQMbc+n0xqV6x9Y7i6DFaeL1py7ApXXxaugWO78Ru5MsTdVMIKfXYc0bNeGbu6+HeRH9KqMex8Z6weRMWkS7JXoyiyJQx+Sd4XqAkJsuHh1lGjRamffp/KBXp9eCQ/XeOt+RnlHh8Mmm7NxTp+iB7tQ0Dagkhh7NLFdYNojzEt9ctTnnKxI/mUz9VJhuM8JeqYEr1a6GKNtlTLYCOpuja8jc2P0hKxhkyxRjZ2lakGWZeatfLsSK8wU9qW0o5mOWSlKufWXmqtNgVajzufBL/eT2MWrfPcaLs3skJWO5OrkstVt47Ugc898khj6325Bx0IZ/zIk7bWxooosXi6obBnsBHijksbMsgHn3ha3fMMKudZFnfdQnt8pLrv5XOSLp/NxTuRSb0366A0Xp7LsfmfTe27d4OFe6Gew/9URXY7GrscIAMpocHt9/M+gwp1Gf8bdMPQdVFgy3uLTk4waYKx/+9upmKIg9A01u5RwcfoZwF1XZoxdWu0fT/iY3kXgH3/D+uDji0=
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Get unapproved events for a collection
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-user-account-type.api.mdx b/docs/docs/api/locksmith/get-user-account-type.api.mdx
new file mode 100644
index 00000000000..da550dbf670
--- /dev/null
+++ b/docs/docs/api/locksmith/get-user-account-type.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-user-account-type
+title: "getUserAccountType"
+description: "Gets User account type by email."
+sidebar_label: "getUserAccountType"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVVFvIjcQ/ivWPLXSBk7R9WXfaMqhNLlwOkBVhdDJeAfWh9d27DENWvHfq/FuCBdy0lWtVF5Y2+PxfDPffNOC8xgkaWdvKyhhi7SIGEZKuWRpfvAIBVQYVdCejaCECVIUbCRkZyXo4FGsDwIbqc0ACvAyyAYJQ4Ry2YKVDUIJ+XhUVQFjhAI0O/OSaigg4GPSASsoKSQsIKoaGwllC+wbSogUtN3C8bhi4+idjRj5/PrdO/77NsRZUgpj3CQjTvCgAOUsoSW2l94brfLB8GvkS+3lo279FRUxnsBuSHdPplcJerkgQ5AHhkbYxMvoC0CbGiiXsHi4n97cfRnd3EwXD3MoYDKdTu7HZxufRrPZ3fjPs53xx9Ht/Zeb6W9jWB27XwHv34L/q6zEZ3xMGGnw38HGEFx4E9STbLzB/uHQPSyqhIKc0HYvja6Etj7RAF7ifn8Z97xGwakTB5eEDCgaudN2e3K5cUFUDqOwjgQ+6X8JzyZj5JoD30gT8TXeBmOUW3wLcYUbmQxByVx0KSjMIW1cstWlY8ZLmnKGJmgxaPXg6EM27rLxy1tVXFj2wTncJGM22lymljBYaUTEsMcgcoH+94zMawwo/pJRSNuFJLR9hsDVpBqfkQx+KFmzDG+c6dfTp0GqXa9XWW+ohhKG++uh9HrIDRqH7bneHIeZLw/4RKOUJadLWidQKRgooSbysRwOjVO72GiqB8ny95UPjpxyZqBccyGHn4KrkuKF6AKFY/HaYyS51XZ79c88z7pbJ7crDlqloOkw4xJ2RWElPqsIPwm9gPJ6jTJggKL/+OBCI7lMv/8xh2MBoxd+nOuY13fIQtYrt/T6apc3smg/JgwH4Dpou3H5Xl+xRYYl7p9xQgGc5A7P9QXCk53wwe11hVGspdqhrcQm2ZxUaTQdcucj90MmkFY7JG23hWiQZCVJikguyC0WQtqKe1FvelSidm4XmWhGK7Qxs7eH9fF2nlF4F6mR9uxki9SNuF7nxVuTsH1ptB8Zin1uCZ9o6I3UlvOfedL2BF7CnnMkvYYiTxkek+Wrsfktj1cF1C4S323btYy4COZ45O2uSOVyVcBeBt212LKFSkf+rk49/l1MP33up/LP4nvhP/PFMjf20iReQQFMllcD/7g6FlCjrJiuy7Y3GSmFns4uXwgW0/7U7pMxV+xveS0FAw==
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Gets User account type by email.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-user-metadata.api.mdx b/docs/docs/api/locksmith/get-user-metadata.api.mdx
new file mode 100644
index 00000000000..fbe9d988d5b
--- /dev/null
+++ b/docs/docs/api/locksmith/get-user-metadata.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-user-metadata
+title: "getUserMetadata"
+description: "get user metadata for a lock."
+sidebar_label: "getUserMetadata"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVktv2zgQ/ivEnHYBJcoG3YtuObRFdttF0TjYg+EDLY0s1hKpkkO3hqD/vhhSliXb6aZBi570IOebmW+eHZgWrSRl9H0BGWyQHh3a90iykCQhAYe5t4r2kC074DPIluD5uepXCRTocqtaBojigs9EMwCI0lghRW3y7TUk0EorGyS0LsAplmklVZCAlg1CBnzzrigsOgcJWPzslcUCMrIeT7W9M/lWyHiZ0V1eYSMh64D2LYM5skpvoO+Ti7rY0ufqYs+fp2vFUK412qHj89ubG37M4T4ieavdCVmqFNJThZpULgmLE/Zyowk1MZps25rvKKPTT44hu3OTzPoT5sT++rqW6xohK2XtcOrr8oTxOSfNMQ800hdjt7BKoLWcNKSif4eDo16lCTdozxX3yUzbGXmXBKYGPUtgtPk5RMxdaf26Vvm3BQ/JUUpfcyj6BGRRKI6ErD9M4PhiHzQQ5sRc/zjYPgFSxHIwLdd73XqCp06h7/no1c0f5/kY0ls5oQ3NU/DpvPvOlJsz3aBzcoOXIjpyAIsKLYov0gmpBVprrFBalL6uS1UrvRFUoeBURkfXF3JhwsNb1GhV/oB2h/Y1Q41svDpnY1GhUISN2BsvpEXRyC3rG3SFsiwMRrrwq4rqf1x5voAri854m2MwqTReF88i5B9Db8LlyMafl3rVo2YMQeZA/chD4cNvrnerZS1coDeG6pcz8vOzJzabygyDM8w3qiCDdHebylalh1aUdkOT7FPufy7tJm2wT7nFubSbdLo+DF7WFgeltzVkUBG1LksjRqOouvaa36+4x5jc1Ne5aeB0cn2wpvA5f4joAPA4nCM6khulN1ffh/wQpUbY1XFbeODQxmDFnWGMFKs8zE/+XqO0YVbElzfGNpLD99e/C+gTuJs3nAFEtupv3B8nuWzV1Tb8CGP+s0e7D31Q6dIEuUM/DG6Jdwc/IQEmOfpze+bheE+01uxUgU6sZb5FXYjS6zx2Z0X70BGQ6yQklsq3SEpvkuNod2Ss3GAipC64RlU5eCUqY7ZhpahVjtqFrB7cen+/CF60xlEj9eSEF63Qsyeb2sz07lh8/7uVDaQSfqW0raXSTHxIkG7I6CXsmBzZqvlSkB2GfxzsvDJk5/tE+D2d46sEKuOIcbtuLR0+2rrv+XeMXLZcJbCTVsV6XHZQKMfvxdgQnnT2t4/DbvO7ON0PL/p5yCjN2bOTtecvSIDTab6Octm8yI7T3fEFdkzZ61d9AhXKIuzi3XDjLs+xpYnsWcfl+hz71dvXCw6o5+iOZXVSiwH9ol1dF28szBZ1349mEn+zgX3/H6uPT58=
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+get user metadata for a lock.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-user-private-key.api.mdx b/docs/docs/api/locksmith/get-user-private-key.api.mdx
new file mode 100644
index 00000000000..6c8d9805a44
--- /dev/null
+++ b/docs/docs/api/locksmith/get-user-private-key.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-user-private-key
+title: "getUserPrivateKey"
+description: "Given a user's email address, retrieves their private key. In the case of failure a rejected promise is returned to the caller."
+sidebar_label: "getUserPrivateKey"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNVU1v5DYM/SsCL20BZWaxaC++ZYE0SD+AxSZBD8EcGJsea0eWFIqe3YHh/15Qdiazk+yhaA+dy0iWSL5H8lEjxESM4mK4aaCCLcl9Jv7Ibo9Cv9MBLGSqB3ZygOphBD2F6mEzbSw0lGt2SY2hgmu3p2DQDJn4h2yoR+cNNg1TztYwCTvaUzbSkWOT5ghmR4eVuQn61dSYycTWtOj8wGTQMH2mWqgxiWPvMhmX1dPAgRojcbHynngFFhIy9iTEuUAN2BNUUIBczjjAglOsCaUDC0xPg2NqoBIeyEKuO+oRqhHkkNQ2C7uwhUnZMuUUQ6as5+/fvdO/bzNwO9Q15dwO3hyzChbqGISC6H1Mybu6HKw/ZzUaXweNj0pa+bC6ETeHTJjzl8jNVaj5kISakyK9gVh/Fn5+C+cHbMwnehooy+q/w0fMkV8jsUBfsU+elsA8BzbNQFpBF/boXWNcSIOsjrh/eQv3fcBHX6zawfvW+dfOhDigN5l4T2wKpH9FMQzea1CoWvSZzjn3lDNu6S3WDbU4eIEK7jpiMl8wGwwzJOPCMwUXtqWL+aUeZzE1HeKkJPCaArGrbwu9q5LwJWE9SRcXBRcpSAcVrFWMeT2eamBaL9rbLepWX7NiBvZQQSeScrVe+1jvcu+kWw1B1xeJo8Q6+lUdeziX/0eOzVDrxszwYLLnHrPg1oXtxT/zfDtbHd1uXkbSrRZuLsU8mI510JCwKFr3j4RMDHZZ/Bq5Ry3Ob3/dwWTh8qUrTpxgcvMIXEYJJncxZ61MkaeB+ACafRfaWOyWOt0XWuaPZ55gQZM883n/iuHxns65vWsom0esdxQa0w6hJBW9k4NpIxtSFZS2cfWOxIWtNT0JNihoskTGLVmDoTEhimsXVqaLcZe1vbyrKeTSswutP2/uCosUs/QYTk62JEYTa5ZZY+Z0fIN+fFHX/+ANWCon9FXWyaMLWt3SheMiigcoogAL1dnTcKKLjYUuZtHb4/iIme7ZT5N+notePWws7JHdLNSHERqXdd0cJ8V3k/Tjp+XZ+cl8D/Bz/wXN9h79oDuwoNDOXrRpM1noCJvyLo/Llcu6piQnxq/GnsroODSur+7AAg6an2P3n0mmeH8T2DjON+7ijsI0HXGK7hXgNP0NQFbxzA==
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Given a user's email address, retrieves their private key. In the case of failure a rejected promise is returned to the caller.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-user-recovery-phrase.api.mdx b/docs/docs/api/locksmith/get-user-recovery-phrase.api.mdx
new file mode 100644
index 00000000000..1396b70d5d6
--- /dev/null
+++ b/docs/docs/api/locksmith/get-user-recovery-phrase.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-user-recovery-phrase
+title: "getUserRecoveryPhrase"
+description: "Given a user's email address, retrieves their recovery phrase. In the case of failure a rejected promise is returned to the caller."
+sidebar_label: "getUserRecoveryPhrase"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNVU1v5DYM/SsEL20BZWaxaC++pcA2SD+ART7QQzAHxqbH2pElh5KmOzD83wvKziSZyR6K9tC5jGSJ5HskHzViGFgo2eCvG6xwy+k+stxwHfYsh8+dUGQ0GLnOYtMBq4cR9QZWD5tpY7DhWIsd1AFWeGX37IEgR5bvInBP1gE1jXCMBoSTWN5zhNSxFZAlCgwlzAquvZ5ATZEhtNCSdVkYCIS/cJ24gUFCbyODjeoti+cGUlisnGNZocGBhHpOLLHA9dQzVljAXM5Y0KBVvAOlDg0KP2Ur3GCVJLPBWHfcE1YjpsOgtjGJ9VuclLFwHIKPHPX844cP+vc2C7e5rjnGNjs4ZhcN1sEn9knv0zA4W5eD9ZeoRuN50PCopJWPqJtk55BveJxDVIBvivcOC/0Z/PE97D9TAzf8lDmm1X+IWSTIORKD/JX6wfESWObA0GTWqlq/J2cbsH7IaXXE/dN7uO89Pbpi1WbnWuvOnSUWTw4iy54FCqR/RdFn5zQoVi25yKece46Rtu/kX0XTUnYJK7zrWBj+ogjkZ0hg/TMF67els+WlHicxNR3JppLAK/Ystr4t9D6VhC8J6zl1YVF3kUfqsMK1ijSux9f9NK2fm2d4Ub76m5WUxWGFXUpDrNZrF+pd7G3qVtnr+mKQkEId3KoOPZ6Ohs8SmlzrBmaIOJlTjzHR1vrtxT/zfDtbHd1uXsbVrRZvLsc8tI610JC4KF33j0zCgmZZ/BKkJy3Qr3/eqaYuXzrjlRMa7G980LLMI4YGe7ErH8p0ecosB9QKWN+GYrfU6r7Qgt+feaJBTfLM5+MZw+M9nX9723CER6p37Btosy9JJWfTAdogwKqE0jq23nGyfmug50QNJYKYgtCWDZBvwIdk24UVdCHsoraYszX7eW4stP64visshhBTT/7VyZYTaGLh+cGA44vxhsH4orL/yRuxVDDx17QeHFmvVS7dOC4CecAiEDRYnTwdJxrZGOxCTGoxjo8U+V7cNOnnuQGqh43BPYmdhfswYmOjrpvj5Phmsr6/WZ6mH+BboJ970Wvf7cll3aFBbcSTV2/aTAY7pqa83+Ny5bKueUivjM/GoErqOESuPt2hQcqao6MSTuRTvL8LbBznG3dhx36ajjiT7hXgNP0Np5sCJw==
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Given a user's email address, retrieves their recovery phrase. In the case of failure a rejected promise is returned to the caller.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/get-waas-token.api.mdx b/docs/docs/api/locksmith/get-waas-token.api.mdx
new file mode 100644
index 00000000000..2a8c1d5090b
--- /dev/null
+++ b/docs/docs/api/locksmith/get-waas-token.api.mdx
@@ -0,0 +1,71 @@
+---
+id: get-waas-token
+title: "getWaasToken"
+description: "Gets Coinbase WAAS token for user by email and selected provider."
+sidebar_label: "getWaasToken"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVktv2zgQ/ivEnHYBxe4G3YtuadEW7e62Qewgh8CHsTi2WFOkSo6cGIL/+2JI2XnYCbrdbNcXS+Jw5ptvnj34lgKy8e6jhhKWxFeIcepX5KAATbEKppVjKOEDcVRvvXFzjKSuzs4mikVQLXxQXaSg5htFDRqr0GkVyVLFpFUb/NpoCiMooMWADTGFCOV1Dw4bghIqbLmqEQowYqgm1BSggEDfOhNIQ8mho8d4Lmi4p9ZoO1LsVYsxiplY1dQglD3wphULkYNxS9hui73RhPRM60Ax7iy3yPURu9+jbufu+eDtD6ucZWGK/MbrjUg8T8OnyZfPys+/UsWq8o7ROOOWKpqlU8blEEEBckSORR+2rTVVivr4axQl/SGerFFCFiRH2FBMp0ndEdjyE+Sx9S5m2dNXr+TvIdxJV1UU46Kzap97Pw3e62OI3qBWF5nx0cshoRB8OERSAN1i01oaDA+hVjonsHFrtEYr49qOR/dw/3aI+1JKzkTlPCvsuCbHApb0014874DrrMW5QFugjfTYo4ZixCUd80nTAjvLUMK0pkDqBqNCpxIHkoSLztqFsZKXXNPO6dGhTXGWDSd6PpCjYKoJhTWFd4nOHRuvD9mY1qQMU6M2vlMYSDW4Ens7gqVJaU+ZLro1/zLYL8FVoOi7UFGCtPCd099FyGfP75NwZuP3Yzl96USHZNRA/WGiMQWHVsVEbw7V/87If5892wIa4trLtGt9THUrHbqE8fp0jK0ZyySL4/7+eNiO+8ftfTu+QZS5kfnL46wLVsYXcxvL8dj6ahUbw/Woc/J80gbPvvJ2VPnmYLqeB6+7Sl5UxgwyXB5qjIxL45Yn/0zzJN/aq50J6KoLhjcTiWaOj3STe8ERk7tBKu9zwpCGWn5470ODErFPV1PYFnD2sMcMSrA1f9BG4pRnJLbmZJU+pNH4raOwkSEKkl0Xd0Pv3a5F7hv6vpHL1YVPJ0OgLxMF6s8dJ1CABCT7fnrAxl5ut5dENcdqRU6rRedSANAa3qSGQVJGKe9MtSI2blmohhg1MqrIPuCSirTtOM9mMTCgau9XaQ+xpiIXkyMDBX99nCaPJfcadPdOlsRKli91dPvq7wrzRRaxIUJMtzxuLRon1KZs64eCuIa1sIetgQJSUUAB5aOtqTyy9qTCmBVQS3mV19D3gvMy2O1WPueol9ezAtYYTC7f6x60ifKs9/3jSf9/uRgWol/VU57sEtBJsqX1EEqAAiT7Hq1+UmY/0fYBYdvZttitvD/MwzO78FGMGcvd3r2HKWzkw7fZzslU7t9JHAyFuxtnVUUtPys7u9d+z79MptJQhi238VruBLyRdRlvMmk++Z06VPrWg0W37NIkgaxTfn8Decx0Lw==
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Gets Coinbase WAAS token for user by email and selected provider.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/is-card-payment-enabled-for-lock.api.mdx b/docs/docs/api/locksmith/is-card-payment-enabled-for-lock.api.mdx
new file mode 100644
index 00000000000..05341c451bc
--- /dev/null
+++ b/docs/docs/api/locksmith/is-card-payment-enabled-for-lock.api.mdx
@@ -0,0 +1,71 @@
+---
+id: is-card-payment-enabled-for-lock
+title: "isCardPaymentEnabledForLock"
+description: "Returns if credit card payment are enable for a lock"
+sidebar_label: "isCardPaymentEnabledForLock"
+hide_title: true
+hide_table_of_contents: true
+api: eJydVMFu20gM/ZUBT7uAHBU56hYsmkW73UXRNNhD4AM9Q9tTSzNTDuXWEPTvC46UWIkDLBpfLI3IN+Tj4xsgJmIUH8MHBw34/Aey+4ynjoK8D7hpyd1G/hTtASpwlC37pNHQwBeSnkM2fmssk/NiLLIzaUo2yGSoIJhtZIOmnUASMnYkxBmahwG8QiWUPVQQsCNoIJD8iKyxTN97z+SgEe7pZQH/THHGuyuoINs9dQjNAHJKCuOD0I4YxrF69Rqt58Y5ppz/9yolwOAU/OplWdiHHYzjWqFyiiFT1u/X797p33O4u95aynnbt+3J8MzjksSJOGeyoPRano1BKIhCYUqtt2Vm9beseMNlPXHzjawo3awTFj9VM92hM56Hu0jZxNgSBhinXwUdyT6qKnZUkJS9BurjdY3J1xPUSstdORL0ba6HeXRjreTmelhwPCptxMfHwffcQgN7kZSbeorvvOyv+qDPq8RRoo3tlY3dhfQ+c3S91RdzVyBBZ/wcMQvufNitfg35bsp6gl1r0bZnL6c75Xii8T4TL5jTKx9FUZgkZGKo5ofbyB0KNPDx368wVnBzHuACBJP/i05neWLyq0M5KNr93hOfVMvgwzaWPC+tBt6Xtsynxz6hAiV56uf6osOnOJM4Hr2jbDZoDxSc2fahkIqtl1PZ2qJD5UO8PZD4sKtMR4IOBU2WyLijymBwJkTx27krs4/xUPak9ZZCJi13buvvD19LFylm6TAsvvhsVJhmdh8zK9TcRjavGdBwXoq3etFMvdBPqVOLPuh4ioyGWe4PcFQKMXldwkvJQwXN2a+K1vRo6S3rCvYxi2INwwYz3XM7jno8zbR5WFdwRPZaX1kN5/O8nFts80szWvb925fZtn43z93w1c4elRZUVUdse32DClRmZ9vVVXpTBS9N8g01LHkb12MFe0Knu/YwzBE31lKSRe6FHerOPlnXn+9Vbv8BjoBlYQ==
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Returns if credit card payment are enable for a lock
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/key-metadata.api.mdx b/docs/docs/api/locksmith/key-metadata.api.mdx
new file mode 100644
index 00000000000..748e4111fa8
--- /dev/null
+++ b/docs/docs/api/locksmith/key-metadata.api.mdx
@@ -0,0 +1,71 @@
+---
+id: key-metadata
+title: "keyMetadata"
+description: "Get key and user metadata."
+sidebar_label: "keyMetadata"
+hide_title: true
+hide_table_of_contents: true
+api: eJydVUuP4zYM/isCTy2gGS/m6Nsc2sV0H110ZtBDkINiMbHWtqSV6LSGof9eUE4c57HddnKJZfPxkfw+agTnMSgyzj5pKKHB4ROS0ooUSIhY9cHQAOVqhNeIAcrVOskxrSV4FVSHhCHmr8ZCCV5RDRKs6hBKsEh/udCAhIDfehNQQ0mhRwkaYxWM56xQwufJThh9zzmrGjsF5Qg0eA5jLOEOA6Qkb6ZpXdU8ah0wxh+m+uiqRqjJ+GaySMHY3XdzNTg86R9m+YCDeLpdzBx/fen0Hkk0OAhltegjBtEd5nCf80XvbMTIoR7eveO/c/ffnn//PLuIyllSxhq7E4xcioWxFFUfyXXCB549GYzXSYXZCtVTjZZMpQi12LogFCNkPBwfLTEM5X3LJsbZ4mtkLOOibNu3rdq0COVWtRHlsQ9u8xUrAgknEGw+9feqXfIyTpJnY/9PDkc6XjPr2jpJUFobLkq1XxYQedyJfxI6pNqxZnaYC2GilFDsHwrlTXFsZDEe8qaCEcdiXABPRYNDLMZcdsqCC/ujovrQQgk1kY9lMTl3hur73vLznQ+OXOXa+8p1cEmmL8HpvuKDeM4hgQl9HjGS2hm7u/t/kZ8nrzns+rQlnnnq0xynXTE3mlMe1cDnDaqQ+z49/OpCp4hJ/OcLJAmPJ0otgihvPuBw0qLy5q7JL7JQv/UYBhYuGLt12c8QTxRec1ni47FOkMBNnup5uKpwtmOB7I3GKDaqatBqse1tNXHC0JAVgVZtWu4HmapBMnYnTxqK5ILaoczyso7M9lCVqJ1r8gJqTYU2YpbKVNanp5dchXeROmUXX3g7LJbzGerxJMl/3ySHZhL+TYVvlbHc8EyM8UDhFey5KcobyCQ/5itP+zxThl+d714mM7+dVLyWULtIHHAcNyria2hT4tfTqMrVWsJeBTMJbzWCNpGf9bwsvlviT38cFvDP4vz2uFnekUCWybJXbc+nCe/immKFvAnB5aXyBgzLPr4Zx+naeQOCaWZpnSTUqHS+6sfDt8eqQk8Lr6udz2tg3ofvf3lh/vRMplm9F5LP0W8iGsfJ4sU1aFOaARKfGWBK/wBlpQAZ
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Get key and user metadata.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/keys-by-page.api.mdx b/docs/docs/api/locksmith/keys-by-page.api.mdx
new file mode 100644
index 00000000000..d266e2a4723
--- /dev/null
+++ b/docs/docs/api/locksmith/keys-by-page.api.mdx
@@ -0,0 +1,71 @@
+---
+id: keys-by-page
+title: "keysByPage"
+description: "List of lock keys by network with additional metadata if the caller is the lockManager"
+sidebar_label: "keysByPage"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFWE1v4zgM/SuCTjOA2xTF7CW3DtCZnZ222N1psYciB8amY01kySPRaQPD/31Byc6nk2myu9hTY0ckHyny8aWNtBU6IGXNl0yO5RyX/uPyd5ihTKTHtHaKlnL83Mgnj06Onydt0sibqtIqDVbh1SSRGfrUqSq+knfKk7C50DadC/YppkthkF6sm4sXRYWALFN8GLQokSADAqFyQQWKFLRGJ5QPT+ziHgzM0MlEVuCgRELnAyjFwSqgQibSQIlyLLsoMpEOf9TKYSbH5GrchfjQoVHZJaeaFliCHDeSlhW7UYaQQ7ac70AYhnWTZQ69/2moO64CxMODwTw5ZWYbsX7U6JbrYP3jbpiDjnYR/MEOxNLW4gUMCbLCI7i0ELl1l/JQ2FxpQvcV/1HoxwK5A4aCW3M4Nr5WKvblsYLtBrtdWQlSJR70DlXl7AL0Kb5vOhvhCaj24p1DjQvOKLdO2DxPC1BG9K69sEbgAg35cABfoaw0vj+IqeqG7mAn7gLiKRWmLqfoxEuBRlQwUwYooh8OUsLrSTHu4VWVddmHsblQhKXnS5wh8VQH2MwADn1ljUfPfq+vrvjPMCsEQiiB0kKZWRjyHmVqDaEhNoU1x4y+e7ZvNnCbWmuYapTjHLTHpE/ETr9jSkwUjomNVITDFLOR7oFTZAn0cFVCloPfTCNbDjFHmwQ+PYYXnANOPFR1COGe4S7kOZr95t2za5PAWA+hC956uue3NxlsDOx+LYYM5rj81eoM3Qlh2kSSIn6WX3F53y0OLnUbyv3h6sN+2zEDcX0DBYFDUcKcG48pDX0c38yiF8aSwFfl6fKUVjzxxkr0frthVtlmmEOtSY55lmztUgyQclub7HgxPqNBp9IHS5/C4ViNX4aG8MmwDx7gvNY6V3pVh6wOr/nOHO9lj26BTqBzvCT+54o8FuhQvIAXYCIkoUyfQk8jXSaXbyrWt5DeLbuSXfuUSIVlGTTDwA688cdytLgeQaVGTSct2hEPhx81GzPSjnjSL6bLi57Gg/eoUmqn5VgWRJUfj6Jxqai4rA1/vqicJZtafZnaUu6RvLNZnYaNFgEHat/26ImJf3Zxmudv0WrldrIWfN/4KuPlRNm3uhkO2S8Qfp4iuDDf8cMn60rg6/rtr0cmxy2huHIClYqiYrWN1cU8vNhYWXwfyuQ22HU39xTSEnd9njKRXOSYz/VehqtzgleyytCLKaRzNJnIa5NG+aloGfczz0VoJJXOkZdoslamnqyDGSYCTMYzqfIuK1FYOw+iTqsUjQ9d3KV1/+UxZFFZTyWYjW/CAvy4FJ3O3kLdrOfsv5PR3UUQvtKo0qAMX1Zoqqbr+me54IJCpWQix2tRHXqMX20L4K3unySysJ7YSdNMweOT023Lr+PV8kxkyvN4ZitOOFiEd3920vO9OC5jD6TFnbXWQQvQNZ8JY3QWiJ8I2qMoNhX1mUh2Je7ReFsq+syA/5buPQp0Q5CfCfOYGj4auiPsM8O+USAfRRBF+RrAhB+ciuvr3FnZ/n07GL2nY7PVjj2qfubPHpTdn71nYNgkmXbSJrJAyML/IZruxE2aYkUbtnvShMu5Wuyfbx+Z1WqmuNU+2lliwfsgrqaJJx5ZdbftCmZU4e2kbdu/AXKaAXk=
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+List of lock keys by network with additional metadata if the caller is the lockManager
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/keys.api.mdx b/docs/docs/api/locksmith/keys.api.mdx
new file mode 100644
index 00000000000..179e5878779
--- /dev/null
+++ b/docs/docs/api/locksmith/keys.api.mdx
@@ -0,0 +1,75 @@
+---
+id: keys
+title: "keys"
+description: "List of lock keys by network with additional metadata if the caller is the lockManager (deprecated, use keys-by-page)"
+sidebar_label: "keys"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFV0tv4zYQ/isETwmg2EGwvfiWQ3a73SRoGwc9BD6MpZHFtURqyZFjQ9B/L4aU5Lc3dgusL7Zozsw370+1TLC0GANhIkdkK4ykKdECKaO/JnIk57hyMpIO48oqWsnRWy1fHVo5eps0US3vyzJXsb/vjyaRTNDFVpXhSD4qR8KkIjfxXLA2MV0JjfRu7Fy8K8oEJIniy5CLAgkSIBAqFZShiCHP0Qrl/BOreAINM7Tiag08EpVDr/pmuropYYbXMpIlWCiQ0DqPWTGWEiiTkdRQoBzJFoSMpMUflbLrEGx78NyCVcmAIxFnWIAc1ZJWJatRmnCGVjYcjgNmGPV9klh07qemHjlIEC4fNObIKj3bsPWjQrtaG+sed80cVbSL4C9WIFamEu+gSZARDsHGmUiNHchjZlOVE9pv+J9MjzOfxUPGjT5uG5elCgV7KmC7xh56KUGqwKPaoSytWUB+ju77VkY4AqqcuLKY44I9So0VJk3jDJQWnWonjBa4QE3OX8AlFGWO10cxcYmfrMRdQH/CDIWuiila8Z6hFiXMlAYK6A8bKWB5lo0nWKqiKjozJhWKsHCcxBkSN72HzQPCoiuNduhY793tLX8dHhp+XhRAcab0zM+ADmVsNKEmFoX1CBp+dyxfb+DWVZ7DNEc5SiF3GHWOgLXAijzKDQfN9DvGxHHYFSwtj0ZSATeZOer9YtiTayI/AZ59VD96u5sXHxLYaID9PB0SmOPqd5MnaM8w00SSFPGz/Iarp3ZOy4Y/kfx0+2k/idzPHF3f0GBRFDDnNPKAQBeaITHohDYkcKkcDc5J7Jn5KtA5LsADviaYQpWTHHFlmsrG6CGlptLJ6VB8QY1Wxc+GPvvLIRq/HSrpV806uB3SKs9TlfdxSCp/zBmzvAQd2gVagdbyyP3FERlnaFG8gxOgAyShdOdC15StJ4MPBevFu/fAqrryKZAyw2xjhuRXN2VyJIeLuyGUali3i7oZcmu4Yb3RIc2wJyisNez6yuZyJDOi0o2GQahQlA0qzb9vSmvIxCYfxKaQe6PSmqSK/V4IQP2A3NboiMfn7OY8zS9Bqlc7WbOqF05hSErgVn1G2GQ3hvl5imB9V4cfn40tgNP0xz9jHslbbKxXAqUKq7nfaepm7g82Bj/nQenUeLk2Y6/eLfHY+SkjyUEO/tztedjfE7zYVIJOTCGeo05EWuk4cDxFq7DluB98Aal4jryKojX9c2QszDASoBPuRZW2XonMmLmnRrmKUTtfva1bT1/H3ovSOCpAb/zT1sgW2nrdV7+Mo7b5IVzSsMxBac6hr7W6bYI3ueA4Q6lkJEdrxupLj4+22aV3dBLJzDhi4bqegsNXmzcNH4dMc4skynGXJv1oOBqbq79bPnctTnPDI+5woa3JxQLyiu/4rroIxE9Y4kkUmzT1QiS7vPGkvS1qeqHB/4tMngS6wXIvhHmKYp403ZLZC81+kHWeRBCY7hrAhB+sClvs0l7Zfmk8aL2bznqrHDtUXa9f3Ci775IXYNgcLs2kiWSGkPh3/7q9cR/HWNKG7B5D4XD2+/3Lw5inWcWjrV9POzvNaz+Iq67DjTFT76bpYQYq3kyapvkXxZ/Vpw==
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+:::caution deprecated
+
+This endpoint has been deprecated and may be replaced or removed in future versions of the API.
+
+:::
+
+List of lock keys by network with additional metadata if the caller is the lockManager (deprecated, use keys-by-page)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/list-checkout-configs.api.mdx b/docs/docs/api/locksmith/list-checkout-configs.api.mdx
new file mode 100644
index 00000000000..121705d1ece
--- /dev/null
+++ b/docs/docs/api/locksmith/list-checkout-configs.api.mdx
@@ -0,0 +1,63 @@
+---
+id: list-checkout-configs
+title: "listCheckoutConfigs"
+description: "A list of all checkout configs created by the user"
+sidebar_label: "listCheckoutConfigs"
+hide_title: true
+hide_table_of_contents: true
+api: eJydVU1v2zgQ/SvEnJk4DXrSLQi6RfcDKBAHezB8oKmRxJoiVXLoriDovy+GlB1/BIttfTFFcR7fm3kzmsAPGBQZ777UUIE1kZ471Huf6Nm7xrQRJETUKRgaodpM8BoxQLXZzlsJNUYdzMDhUMGT4HDhG6GsFXqBEbrgCB1QEdZiNwrqUCTGkRAwDt5FjFBN8PjwwH+XsM+XQKLxoQAMdcYz9T1I0N4ROuJwNQzW6Cxq9S0yxgRRd9grXg2BJZMpNwaMyVJe0jggVKBCUCNIMIT9+b7ffUNNmfH3ZALWUG2gUAIJTvUIW3mFbuozgEjBuBbm5fB7L3bju9vLLe9wUXVtWKeyX88uppDwkqf1eh9v+ZXtn8KdZyZUSvlEt3QlND70iqACLs8dmR5Zw1Kt/x8ySyBDFs8cUBwJc/lJ+Pjw4dYu7E9honCehErUoSM2A/6HSy4Ncp0Ll6xVOybSKBvxOoc9xqjad+rJ7dGoZFnXusOA4oeKQjmBIfggjBNNsrYx1rg2G5oLhpHub+88T8ZndBiMfsFwwPCJoWBJR4/Uee7iFpn3oKiDClaHx9WxF1fcoLmhOTjmfk7BQgUd0RCr1So7ojfU3SfH67shePLa23vte7ju+K/B10nzgyh8YJbXiJFUa1x793PILyXqBLt9m0IvXKmS+zKLTonnK1ldPgAV7FCFPGTK4rejy37/e82WfLp0wLH/B/MHjseWzs93+7xhmNj3hGHM7jSu8TluKcxrliX+POoECZzkoufxRuHpnBiCP5gao9gpvUdXiyY5XbrP0JjnHTq1Kz4xeo9kXCtFj6RqRUpE8kG1KIVyNdveNIsq0Xm/j+wnazS6mE26yPrryzqrGHykXrmzN3mIn4bu21fggv701kq/NveXbBP+Q6vBKuPykGDnTItzN3DgrB3xsopIPMQ6H4nfT9NORXwNdp55u5Sm2mwlHFQwpX8221lCh6rOX60JuJQVPGmNA0MelE2lylffDHbcqaE+f1rzUExM62SUK3dl9KOH3HiGPU3lxNrv0c0zyIUE8TPM23me/wWnH59U
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+A list of all checkout configs created by the user
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/list-payment-methods.api.mdx b/docs/docs/api/locksmith/list-payment-methods.api.mdx
new file mode 100644
index 00000000000..682dca10f41
--- /dev/null
+++ b/docs/docs/api/locksmith/list-payment-methods.api.mdx
@@ -0,0 +1,63 @@
+---
+id: list-payment-methods
+title: "listPaymentMethods"
+description: "List payment methods for user."
+sidebar_label: "listPaymentMethods"
+hide_title: true
+hide_table_of_contents: true
+api: eJyVVstu2zoQ/RVi1kqcBl1p10Vv0d4WCJAEdxEYxpgaWawpUh2OnBqG/v1iJNuxHSV2VqbMmcN5nHlsIDbEKC6G7wXk4F2SO1zXFOQXSRWLBBkksi07WUP+tIHHRAz507SbZlBQsuwa1YYcfrokphmUTT1omzKyaRPxNWTAlJoYEiXIN3B7c6M/xxD3wq6hd0FsDEJBVBebxjvbGz/5nRRgA8lWVKOeZN0Q5BDnv8kKZNCwuipueH4LfSCIzLiGDJxQnc4DuOJAJgm7sIAu20mPXc2d9y4sZgUJOn/BE1gUTOkCQdsn5/TJDMrINQrkEFrvce5JzbCxDcIj8l0G3gX6dDGSSt9eLN3EJOhnNhZ0sU4SlEuluy4DqtH5i9ED1iPgamoVw0eetcjF+SzNGcM4aWxFdnk5IWZ9mma91sXO7nQP0vBBBLuyb2kMUXiHWPS3mdUxSHVwG9p6Try7XRPy6GXpwoK4YRfGy6psQ6HHsbsFBe1uVMxKjvXlxMYkn0cBA8lz5ItytUI3AJ5vMfsoKgiVxEwjRHmTflIx0ayY9X2aZm3CBZ03MLVNE1mOXprH6AnDAPuM3tNIzN8uAyY8xnvJom2TxJp4NKrerag+7gt7SzJt1VigjDZ1LAqn/R/93YFzwi1pXHrhsSiLE00MHI06daLrHfl88+n1bNLBZ1wyIYrBVioKosOHiren0vsDaR+8vESf6PWESieJ3Me/oBJbrwl4qIjJPGMyGAwxRzYumLL1vnQ6bIxUZJj+tJTk+vWbh7H4prXi7D3xivirQsE2HMOshBwW1NMItYxhsrqdNC3bChNNdG/oNwVVTv2i0LKHHCqRJuWTiY92mWon1XUb9HzVcJRoo7+2sYbTVeKOY9Fa/TCDPdBlp4hJcOHC4upjyPeD1h52+rLe3GumhtgPS84+8PqketcLKDkJmRiy7eGfXTn8+O9BCfvlmAG74m/cv6TVP4wd/b5a9n84NexPS7zuyelCGXu9bWIee7fMz52fkIEGefDn9pWHeznTcFy5gpKZo11SKEzZBjtUi5N1v1VRwPnAE2eXJC4sMrOrN5MkMi4oMxgKpb0rt16ZKsZlUj55ZymknqRbt359fxgaWUxSYzi4UY6YbcWZl+3yyPrNSyWd3ye3gRX6K5PGo+u7RU+SzZakT7DSAO1o2hucBKYZVDGJ3m82c0z0yL7r9O8hC/nTNIMVshtK5WnaZVARFv3muwHNWg5frKVGSb9C3w4JPVlHlVz72vn29UH7VXs0Ak+I1KPv6BLWB9ibzSDxEJcUug6yrRGi39BNu677HzWnG60=
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+List payment methods for user.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/lock-metadata.api.mdx b/docs/docs/api/locksmith/lock-metadata.api.mdx
new file mode 100644
index 00000000000..6da94df6e96
--- /dev/null
+++ b/docs/docs/api/locksmith/lock-metadata.api.mdx
@@ -0,0 +1,71 @@
+---
+id: lock-metadata
+title: "lockMetadata"
+description: "Get metadata for lock address."
+sidebar_label: "lockMetadata"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVUtv2zgQ/ivEnLYAEwdB96JbDm3QV7bYJNiD4cNYHFmsJZIlR24NQf99MZRsK3GKbnvZk8TXzPfN45sefKCIbL17Z6CAxpfbT8RokBE0GEpltEGOoYBbYtVOh6ryUclthcZESukSNASM2BJTTFAse7DyKCDXoMFhS1CAI/7m4xY0RPra2UgGCo4dPXd1N95T1ojdVNbUIhQ98D6IGeuYNhRhGPSLbgTYzYjrp64+PiNx5ixxtG4Dw7ASUyl4lyjJ+fXVlXyemnt//9fdKUqld4zWWbdRAk2r2WWt0BlVdol9q0KURLCldIysgJH35FjcYAiNLXOqFl+S+OpnWF3XNLhuCIoKm0T6AN6vv1DJoAGNsfIWm89HV2NAhmEYNLy+en1O5qEmZZlatfedwkiqxa1wkYhS4gzVeErKeVb03Sb+JdDPMZ6RCDOoPbSUEm7oPDWS0gq7hqGQDPkulpQhVb5z5tyw8GXLsoZbchRteef5bb48RuPPl1L76MSGYq+qrmkq2xzjYLq8LWUZHTYqUdxRVBSjj/97RB5qiqS+YVLoRkjKugMFySbXdGBy+Z+CdZ/pvRFTOV6Dhpa49qIgG+KsBFxDAYvd9QKDXRz6YdFPAjAspMLTop916iDNly2P8tHFBgqomUMqFuP91nJ92Tn5vwjRsy99c1n69kyqPkdvulIWagQLohRPLSbGjXWbi1+zfD++OppdCeiyi5b395LGMTGPieIsK+LyIC2yXhNGiqCnn7c+tiipev/PAwwabk41MjOCwX6g/UnkMNiLbd7ICvi1o7gXRQTrKp/fTVl7zLTUxwNP0CBBHvlcnzE83hNR2llDSa2x3JIzqupcOYqI5X3ufpKeyEVkyy2xdRt9Ur/EPuKGRqFznm01sVK199usto0tyaVcwROtT+8eMovgE7foZieZxY+mU39qsp8PqimiTN95ERq0TqKeq6OfSncJO4kMBgu5uA8+i9MEy3UjW/Nps9JQ+8RioO/XmOgxNsMg22N+iuVKww6jHTts2YOxSf7NscV/SOuPv6dB9ko9nY8v0jlUjZMK2WHTyQo0SMmcBrG0xW8heD42fwPDPG7DatBQExrpm2U/3bgpSwo8e3umntJ/R+25fSOl8y+b7RK+
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Get metadata for lock address.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/login-with-privy.api.mdx b/docs/docs/api/locksmith/login-with-privy.api.mdx
new file mode 100644
index 00000000000..e1d11a9d049
--- /dev/null
+++ b/docs/docs/api/locksmith/login-with-privy.api.mdx
@@ -0,0 +1,71 @@
+---
+id: login-with-privy
+title: "loginWithPrivy"
+description: "Verify an access token using Privy's library and authenticate the user"
+sidebar_label: "loginWithPrivy"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNls1uGzcQgF+FmEsvaysw0svenCIJ3LSNYcvNQdCBIme1jLjkhhzKFoR992LItSVLQmwDBVpdtNwdDme++eMWfI9BkvHuSkMN1i+N+2aovQ5mvYEKNEYVTM8CUMPfGEyzEdIJqRTGKMiv0IkUjVuKvOWXKKxZBBlYSguZqEVHRklCQS2KFDFABQF/JIz0wesN1Nu8NAE11BQSVqC8I3TEn2TfW95uvJt8j2zFFqJqsZP8RJseoQa/+I6KoII+sD9kMOa92cgp27gnHCkYtzzybdpiceG5b+TFOnsNQwX30lqkS60Dxvg6lWWLkGWPaILvdiCGodrzffbM4MPT5sNQxGPvXSwOXrx7x3/PT/36Bd5A8NXHVy/AfpGNS9bKhcUS5KF6KTw7+UbaiOw8GeI1XCZqbzAmS1CovD8F4sqtpTVaGNcnEgEVmjXqc/FBajEm4PlbUB36f2DgIZAOY5RLPJ0mjWTja7gZwykWXm9EOUuYKEyx/fwEhwowBB9egXiP2Gd0GIwakXDdfcxKHvG9P8bH2WsIO7HxSciAopMrrvMRnWh8ENpjFM6TwAfzP6AZMPoUFGaTGp+c/nkejVT+8vQpCxcav55KpjvHOrgdNMnaxtgnDjrl18YRBietiBjWGEQO0n9OZNpi4CYUuWlnk4Rxjy5wNLkX7RXDy7Bus3u77Bkq6JBaz+Oj9zE3Bkkt1DBZX0x4AEz6cZgUMhHq2RZSsFBDS9THejKxXq1iZ6g9T46fz/rgyStvz5XvjvrqdfA6KV6IYg0M1aHGSHJp3PLsbZpvy64ntXM2WqVgaHPLcSrk77h377DzkexdFoAaFihDnnLl4ZMPneRY/P5tykPkcpcEe0pkb74gQ3KyG9dnq/zCsGE/EoZNnhecNze78fnxQXa9xaNxt0uGg8b8+GFgzY3PJowRvsuExB+PyKACjldBc3EE60lO9MGvjcYoFlKt0GnRJJfjI62hTe4UyPWTE86oFZJxy0p0SFJLkiKSD3KJVb4zOE+mGQGJ1vtV5MS0RqGL2c+R0J9X0wyEk66Tbu9LvsUIvsaIk/eY7a4m/70rzRhHwgea9FYax4RzTm7HgpjBmiGygjw92bJ5BS0XTT2D7XYhI94FOwz8ukS8ns0rWMtgSlHO5kMFLUrNCTjbAmdIDb8Vb86mbAKL21RS6KDbcJWUHZdKYU8/lZ3v1fX119sp5/N4Xeu85j1B3vNVTt5DDVCBz3RzgeR3W7DSLVNuUVB08u8f4CKsgQ==
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Verify an access token using Privy's library and authenticate the user
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/login.api.mdx b/docs/docs/api/locksmith/login.api.mdx
new file mode 100644
index 00000000000..aef8ca7819c
--- /dev/null
+++ b/docs/docs/api/locksmith/login.api.mdx
@@ -0,0 +1,71 @@
+---
+id: login
+title: "login"
+description: "Login as a user using Sign in with Ethereum message signed by the wallet address."
+sidebar_label: "login"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNlsFu2zgQhl9lMGfFLoLuRbd0kRZpu9sicbAHwwdaHEusKVIlh04Mw+++GFKpncRIm8Ni64tFiqL++eafoXboBwqKjXdXGmu0vjUOK9QUm2AGmccaP8ssqAgKUqQAKRrXwo1pHRgHd4Y7uOSOAqUeeopRtQTRtI40LLfAHcGdspYYlNaBYpxghYG+J4r8zust1rs8NIE01hwSVdh4x+RYbqlhsKbJGqffogjaYWw66pVc8XYgrNEvv1HDWOEQJCI2FOXuqOZoYeRgXIv7CkWh4hRO3c0/ERkH72LZ6/zNG/l7jObLJ3yF2EOUc1RNQzHO/JoEeAF0UfjgovpJXI+XP9NfoUvWqqWlwnNfPXrdi+tXykaS4NmwjPEicXdNMVnGQuXtKRBXbqOs0WDckBgCNWQ2pCfwTmkYcz15Daqn8T8R+MuJFi+vlIiv8XpMJyy93kJ5F5gIpmifnOBQIYXgwy8gPiL2gRwF04xIxOKXeZMHfG+f45t1BIaph61PoAJBr9ZSZCM6WPkA2lME5xno3vwGNANFn0JDWdLKJ6df9tFI5W/P7/PiQuOPU2a6dbIHsIdVsnZl7A8OOuVp45iCUxYihQ0FyEn634nMpAfCnTRKVyRJfxxDkGxKKzwqhp/DusnhHdyzr7An7rz06sHH3BgUd1jjdHM+VYm76UMLL2Qi1vMdpmCxxo55iPV0an2zjr3hbpKcXJ8NwbNvvJ00vn/W/L8Gr1MjAyhqcF893TGyao1rz16380156se2CxHdpGB4eyN5KuRvIx2Xn7xSossLsMYlqUABq/HivQ+9klx8/GcmTf7iYIKjTdRgPtFWMqD6cXy2zhNGhH1PFLYosMU314eT6vJe9YOlR4Y4GOHoQDk6Zoxb+fzqMbO3mQx8fkCFFUqeCpLzE2fvuA6G4DdGU4SlatbkNKySy3lR1vA2dwiSuslGM82a2Li2gp5YacUKIvugWqpAOS01a1YjGOi8X+dD2ZqGXMzxjWT+upplEGK2XrmjOyc/FXaHAvxPvhrG/DHd83SwyjghnL24GwthjhuBKKUgAWWRiwo7KZZ6jrvdUkW6DXa/l+mS6Xq+qHCjginFOF/sK+xIaTHefIfijBr/LIGdzUSCLLepWOdJl5HqKE9cNA0N/OLaxVE9f/1yMxMfj19EvdfyTFB38rWk7rBGrNBn0Lkw8twOrXJtKk4se8rvXxQ5csI=
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Login as a user using Sign in with Ethereum message signed by the wallet address.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/logout.api.mdx b/docs/docs/api/locksmith/logout.api.mdx
new file mode 100644
index 00000000000..c7956266464
--- /dev/null
+++ b/docs/docs/api/locksmith/logout.api.mdx
@@ -0,0 +1,63 @@
+---
+id: logout
+title: "logout"
+description: "Logout from locksmith. This will invalidate all your session tokens."
+sidebar_label: "logout"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVE1v2zAM/SsCz24zFNjFtx62YV/YgKbYIciBkelYiyx5EpUuMPTfB8rOR9NdNgzYyZIsku89PmoEP1BANt69b6AG67c+MVQQSadg+AD1aoTHSAHq1TqvK2go6mAGiYAaPpX7qg2+V9brXewNd7dq2Zmonoy1yrg9WtMgk0Jr1cGnoCLFaLxT7Hfk4i1UECgO3kWKUI9w9+qVfJ4XekhaU4xtsvagtO8HS0yN4o5UoB+JIkse7R2TYwnHYbBGF2aL71FyjBB1Rz3Kig8DQQ1+85200HXJWtxYgrpFG6mCIYgwbCZIPcWIW7qIjByM24Lo0WKyfA2xTbY11r6EeFUp5wrYsOzhHTkKRs95IGf5+fp3ajw6SaHYSx0pdKygmlSOjWMKDq2KFPYUFIXgw39XaNlRIPWEUaGbICnjjhSM2/6FVoXeG0lV9MoV9MSdFy8PPgrwAbmDGhb7uwUm7hYXFpfYWByegoUaOuYh1ovF2cnJyfpmCJ699vZW+x6uZ+Br8E3SslETHMjVdcbIuDVue/NnmR+mqFPa9XkuH6RRk/TTdJ50l5LCrlyAGjaEgQJU8+KtDz1KMz58W0Ku4P7sgoskOJiPdJAWYD/vb3blwAiwH4nCAURt41pf4ua+PBZa6tORJ1QgIk987l4wPN1TQ/B701BUG9Q7co1qkyuiojV8UK0PisT1xSZG74iN21aqJ8YGGVVkH3BLlULXKOfZtDMr1Xm/K6+MNZpcLB6daX1+vywsxCo9uos/J5c8wzue5+dfPX2z4Ew/eTFYNE6aUswzztZdwV6EE/MKiQnYuoJO/F2vYBw3GOkx2JzleOpNvVpXsMdgpvlZrXMFHWFTHvIRpJc13GtNg5Dco01Tm6+eBLHcaaC+fnlYHoGcrXLlr5L+6CJ3uEg+jtONpXDPGaoZRdEC8jrn/Asepk18
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Logout from locksmith. This will invalidate all your session tokens.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/nonce.api.mdx b/docs/docs/api/locksmith/nonce.api.mdx
new file mode 100644
index 00000000000..e1da523b4ce
--- /dev/null
+++ b/docs/docs/api/locksmith/nonce.api.mdx
@@ -0,0 +1,71 @@
+---
+id: nonce
+title: "nonce"
+description: "Provide a unique nonce for using in sign in with ethereum"
+sidebar_label: "nonce"
+hide_title: true
+hide_table_of_contents: true
+api: eJylVEtv2zAM/isCz248FNjFtx66onsAA9pghyAHRqZtNbLkSlS6wPB/Hyg7bdbmMuxkPWiK34McwQ8UkI139zVU4LzTBAXUFHUwg5xDBT+DP5iaFKrkzHMilcNU44NK0bhWGaeiaZ18Xwx3irijQKmHAgYM2BNTiFBttgUEioN3kSJUI1x/+iSfv19bn72xggK0d0yOJbDj3pZMv/Mm6o56lBUfB4IKIgfjWijAJWtxZwmqBm2kaZqmAj5ffkviFHvVJGsbY1Wg50SRVZ3ysXFMwaFVkcKBgqIQfHhXFQ6DNTqTWD5FyXuhOL97Is0fiytgCKIBm5mSnmLEli7BqqnBZBkqeBR61QtGhW4uSahfIIgg3NEJyeoSIQWwYdnDHTkKRj9keLeSCqaZsJ6482KKljgLyR1UUB6uS0zclSerzMSIuiOkYKGCjnmIVVlar/exN9ytkpP11RA8e+3tSvv+ksnqpGWj5mJgKt5njIytce3Vv2V+mP96TbuVonUKho8PItNM/DpSOGNdnhR0OQAq2BEGClAsiy8+9ChSfP31CFMBN28eOEuCg/lGRxEA+2V/tc8HRgp7ThSOIFwb1/j836LKOsNS3084oQAhecZz/QHha5wa5laNaod6T65WTXKZVLSGj7llSTyfTWL0nti4tlA9MdbIqCL7gC0VCl2tnGfTLKhU5/0+ipms0eRidugC68f9Y0Yx+Mg9urObi/NkfGue/xotC8kyD8rBonEiRDbMuLh1AwchS/wqIuRitgV0PrJcjuMOI62DnSY5nuXIU+qAwcwNs9lOBXSEtbhjM4LIV8GN1jRIVxzQptkup8kk9nptnbtbYeYP0dzh8w==
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Provide a unique nonce for using in sign in with ethereum
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/price.api.mdx b/docs/docs/api/locksmith/price.api.mdx
new file mode 100644
index 00000000000..2ebcec4690b
--- /dev/null
+++ b/docs/docs/api/locksmith/price.api.mdx
@@ -0,0 +1,71 @@
+---
+id: price
+title: "price"
+description: "price"
+sidebar_label: "price"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVk2P2zgM/SsCT7uAJxkM0ItvA2x3kP0ois4EexjkwNi0rUaWNBKdaWD4vy8oO1+bdNruHjaXWBJNvkc+Uu7BeQrI2tlFCTn4oAuCDDwGbIkpRMife9BWzpAbyMBiS5CDJX51YQMZBHrpdKAScg4dZVBSLIL24hNy+DDaKV3OIINYNNQi5D3wzosbbZlqCjAM2RTmpaOwO8bB1nWWz8JUaOJFnPtkp1yl2G3IRrVznXpFy4qdqokVN6QSPVW5oLRVy8dfrkKyXbt+E1FZBorx25CeGlIUirtbNb3yNqaZWlTKOm60rZWOymOMVGbJ6P7jQr1qY1Qg7oJNexZZb2mkO3q5Sidy0LaGYVgJ4OidjRTl/O72Vv7OMT8Qn2TpIowLCu1uYuUmHGOFJXjhLJNlcYveG10kZc0/R/HdX2Jz689USHF9EB2yHpEFip3hb9uVVOgWTbwsXga2MwbXhkZVDtkk7csyZ8C6pcjY+quncdeunbmS0ES30iXZr/hNERd2VOZ3YJx+Gby7VpmlFVNRTtUZU2nRwktHkVXZpW1ppWDRqEhhS0FRCC78p6oc8U36Pk9/SzFiTZepkUaoMJVQmiCQesWo0I6QpPcmCqJ0kdDEZHYZc0j1YVnDA1kKunhM9N6LK5gSdp6p/RBriRsnU62mpB2ZXznMt3dz9HreT7od5nv7MW/jxOuCgRwaZh/z+dy4YhNbzc2ss/J844NjVzgzK1wL/4z/MbiyK2ShRqwgo+TcY2Ssta1vfszz4/jWwe1KQBdd0Lx7lCqOdVlGCidFkZD7wSDrNWFI8hsffnWhRanUb389iWrvjxI5cYJe/06nQ9Drm03aOBmRUgptK5fem4q2TLTUH3uekIEkeeRzd8HwYKd8cFtdUlRrLDZkS1V1NiUVjeZdGk8kLZE0pIsNsbZ1plpiLJFRRXYBa8oU2lLGqq4mVqpxbhNFa0YXZGMS8ETrz8VTYuFd5BbtycleJGdwD+lh+sJzb1BbSWEqdT8J7hm2QhO9hgzy47U5Olxl0LjIYtb3a4y0DGYYZHtMqWix1FE64ivXTH/s739/CV6lIfU9uYC3aDoxSmr+fkz/yy34Fp/D9X0ktJJF0OPc+aGM//Rp+gb4WZ1/6VxFsG8muzsNv0e218awGjJoCEtp4+d+Or0vCvKndbiY5ULjMPMe3ouS/wadiWuO
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+price
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/purchase.api.mdx b/docs/docs/api/locksmith/purchase.api.mdx
new file mode 100644
index 00000000000..69c108429e8
--- /dev/null
+++ b/docs/docs/api/locksmith/purchase.api.mdx
@@ -0,0 +1,71 @@
+---
+id: purchase
+title: "purchase"
+description: "Create purchase intent for stripe."
+sidebar_label: "purchase"
+hide_title: true
+hide_table_of_contents: true
+api: eJylVsFy2zYQ/RXMntoZ2nI9PfHmuEnHbdp6Ynty0OgAASsJEQkgC1COhsN/7yxAibTMJkrqi0US2F289/B2W3AeSUbj7J2GEnxDaiMDQgEBVUMm7qGct/AUkKCcL7pFARqDIuN5D5RwSygjisNGYWxEG8XKkQiRjMdLKMBLkjVGpJCiGd7oZdxAAVbWCCVYjM+OtlAA4efGEGooIzV4mu7vvE4YzXGD2mAtoWwh7j2H4exrJOi6YjJN5dT2RmvCEL6Z6r1TWyHz4slkfD67ho5B4VAY4hun97ziNLJyCRb+JL2vjEqQzz4FztSOQg8b50CojDdoI9eawXx0W2SmCvBkFGdfFIdy3PITqpg+ManRYMgRj1GG0iWR3EMBJmIdJo5UQG3sXf74S3eafWr9oZ7hm23qJVPB4KiGaPJrAbapKrmsMEPVFaBllN9Raoq/QqKkrvO3pT/eG7yzIWN1fXXF/6YUroWX+5ql3StcVQyqCKgIYyGkUq6x/MNq4eIGSWiM0lRJO2fz/3Uuc86HlHKShczTTa5lckV0UVb3ZBTe2d9OVDEwNmLzJT/fUtsW9yn4WUw3lu/jA9LOKHyH521ShNrEW0n6npzCEM7T1ZHwX6c4vrM7WRktjPVNFIQKzQ71pXgjteiv9v+icShmJauAp6jVGIJc42vC2JNWsqkilPChV6pYOr0XOZcwQZhc++XrNF0BSORoKu4pPAVEE/kRfkeLZFQPCTva2xSkx6/GuHGpV7iQ+GeDLWG2u54dmsAsX5FZ27t6N2Oew6wd2W+XWgztDj2hoQpK2MToQznL62sTN5dZIxeeXHTKVZfK1XDq1PfkdKP4QTykkMD2/zJiiHJt7Pri+yI/5F3HsIuhLz4wAZm+3B2PGHPKQ7/g5yVKSpLMP945qiUT+sfHR75rN4OSxv7lzZ+4HzqX9OZim16ktva5Qdon82PxfRi6z9svsvYVnjr//MD84pWZD5o43vqrF559dfDkcZCR5w6vO65u5dIxejU9JZTF+wPsUABznuG9fgX4cZ3w5HZGYxBLqbZotVg1NnEsKxP3acBAK5cV0xON2mI0dl2IGqPkakWIjuQasyFbF82qB1lsnNsmV66MQhsSVj3Kf909JlBZ27W0oy+jyehFxe1gCufNQj2/Eb/Ema+ksayBpNW2v0tz2DEwo4w5EBRQDnNSEjK/Gs80iwI2fC3LObTtUgZ8oqrr+HUWTDlfFLCTZPLVn7egTeDf+uhM/3m6nz70s8nP4uUUNnmig4wtS3Ynq4afoOAGMRr3+J7+UAWnw9kP1DDGrWPpblDqNOa2/YrbnPnikeMMEV5ZP58i77hRCn386trFyELv/3l4ZF/op8baad5D8pmHU/mcq3UJiTzL8bsWKmnXTeoXkGOyZGXD2jn6x4nppFNN4tG2eUXyg647whP5mYHpun8B2G462A==
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Create purchase intent for stripe.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/re-subscribe-email.api.mdx b/docs/docs/api/locksmith/re-subscribe-email.api.mdx
new file mode 100644
index 00000000000..4cd93556804
--- /dev/null
+++ b/docs/docs/api/locksmith/re-subscribe-email.api.mdx
@@ -0,0 +1,71 @@
+---
+id: re-subscribe-email
+title: "reSubscribeEmail"
+description: "resubscribe emails from lock"
+sidebar_label: "reSubscribeEmail"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVkuP2zYQ/ivEnFqAaweL9qLbBkiDbdM2iL3owfCBJscWY4pUhpRTQ9B/L4aU3y6CJIf4YpGaxzffvNRDaJFUssE/G6iAcNatoia7wjeNsg4kRNQd2bSHatHDS0SCarEclhIMsmDLulkzHjQFsmoUawqNcEFvQUKrSDWYkGK2Y1mlVakGCV41CBV4TJ8DsSzhp84SGqgSdXjt6K8iJ6yZMDpdY6Og6iHtWzZjfcINEgyDvOuG8TwZQxjjF129C3orVBG+6ywmsn4DA9NBGNvgI0Z+//jqFf9dmpt1WmOM6865vTiyZQpdF2zp4BP6xCZU2zqrc4amHyPb6W9xhNVH1IlpJs5nsgVFLA7PBFchOFQehvyT8Ms9nM9+p5w1wvq2S4JQo92hmYjXyggmDGOafA9I3zmnVg6hWisX8Rp1gzGqDd7SzOlZq84lqODDyLZYBbMXxZewUdiCfXLrZpCARIHu2T2JchkwMckmPsJb9EhWj5S8Dmb/Jhsp9P16j74Xz6ZECoIzvbbuQJowXb7mEiWvnIhIOySRYf1wRuc1EorPKgrlCyRh/SEE6zci1Xie/mt6b0mb5fBOfA0SGkx14EHThpjrlXuzgunucZq74GFsi8xlnB6bZNqP42GYcovEaX/Wx0OeUuyrDJeOHFRQp9TGalrkG5vqSef5+aGlkIIObqJDA9ct/56C6TQfRIEPPEcuLcakNtZvHr7O8qxoHc0uT6N1xoktqSoD9pgndnkYPLl/URESyPHht0CN4uT9/s8cBglPp6o5M6Ja+wfuTyNQtfZhmy/yfPzUIe15XoL165D1xjy+5LDEu0OcIIFJLvE83kR4lBMthZ01GMVK6S16I9adz6QqZ9NerAMJ5C7JZWX1FpP1GykaTMqopERMgdQGpVDeCB+SXY9RiTqEbZ7Fzmr0Mdf0GNafz/McBZdWo/zZG0JxXGvisNcusPen3vvSJhtJTfhvmrZOWc/E5wLpx3JewI7JuVPQnMqDbZBQnXZeriW+Ot9PSwk190m1gL5fqYgv5IaBr0vOqsVSwk6RLX246MHYyM/mOAj+N8qfPoyr72dxuVHvxneoJM9Vs1Ou4xNI4DI6rW5ulW9CcL1ovwHDOW/DcpBQozL5Y6UfJZ60xjad6d7MWO7J44R6//dsDhJUxyk9LdDLBszm7wLr+yIxD1v0w3DEmfjMCIfhP0SvT+Y=
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+resubscribe emails from lock
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/remove-event-from-collection.api.mdx b/docs/docs/api/locksmith/remove-event-from-collection.api.mdx
new file mode 100644
index 00000000000..6c21e285b23
--- /dev/null
+++ b/docs/docs/api/locksmith/remove-event-from-collection.api.mdx
@@ -0,0 +1,71 @@
+---
+id: remove-event-from-collection
+title: "removeEventFromCollection"
+description: "Remove a single event from an event collection."
+sidebar_label: "removeEventFromCollection"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNV1tv2zYU/ivEedoAJS6y7kVvaZcM2bqiSBwMQ2AMtHhssaZIlTxy4gn678MhFVu2lWRNB2xPtng5l+/cPrbgavSStLNXCnLwWLk1XqzR0qV31XtnDBa8CxkELBqvaQP5XQu3AT3kd7NuloHCUHhdx2M5XEcRQoqg7dKgQBYmFt5VQtr+q9jKPYUMaullhYQ+RNFWVgg5BNMsIQPNMmtJJWTg8UujPSrIyTeYQShKrCTkLdCmjnfIa7uE7tCmG9MshVsIKnHEAvaBRWOgd05tWN6hpsJZQku8Jeva6CJCNvkcWHx7bIibf8aC9ky+g6iZTYFZBrVn5Elj4Gu7rSNnXvaFnEhxO4Wuy4A0GdwGIsYyutV1vOsx1M6GpPbszRv+OVDQFAWGsGiM2fSC1UBbjCR/7gfx1QjtAxFGMdh59VKoR/YLt0Z/Vcnl+PW5tJZzeWTLaLsKYzZLpTTrk+bTnvUHEroMKmnlEv25Uh5D2DslvZcbznDC6onbhUdJqM5pLC0WzleSIAclCU9IV8g2N7X62isxrv/EstGsjuWabcs14rwflAwkkdfzhjAcp34q9xH0n0wF/WQsX0qFgR2v9Ja81PRnPJHBWpoGjz0anBkzIt0aiXc3rN5Yt3C8NGjJ6cLbsRq+smtptBLa1g0JjwXqNapT8U4q0be6bypa2xgj52zVQpqAhwhUGMJojDhEC9kYiv0pdSIxd2ojki6hg9DJ9tNjNZyr3ruRYh0e5Y49hO1ntOh10UPCrfAiCnmE74dj+Hi6sSnWkZANlc7rv7gJOlGj5yISVOog5Ld3v38DyD9cI6THQ2udj19oic151vxDnAfofXR0PpSyhe3tMWzTEgVXkdj0FlVype3yMePEwnmhHCZc8UH/D5LQY3CNLxJ4C9dY9TwcfTJ9dHQZDyc0fhyrwVvLMhh1HqULbbY4qCYua0vorTQioF+jFzG3/3NEpiV6FPcyRLrGJgltH13gaPLsH/SQl8G6ie7tio7HIlLpmHAqNEgYSSCVkMNkfTaJ8+hkRy8mLY+CbtLPKWaiLDCxxcYbyKEkqkM+mRhXrEKlqTxtLP8/qb0jVzhzWrjqiEp98k41UYVINkKXHUoMJJfaLk++TvJNurUVO9vR5xuOXopHItHbYLBK6Fktf89RevSQ9X8uH4f3L79PeY6c71JjOM1q/SvyOOtptKz1ySouRCb9pUG/idyCs+l6x3ovHmRVJ4Y1IKPDqWsXLurpg3sbYRAfHnHheYg+JP/PjhDZnhO1d2utMIi5LFZolVg0tkhsStMmNgnk0om5posVkrbLTFRIUkmSIpDzcomZkFZx2epFj4IonVsFzkmjC7QBd/QCfruaRq9rF6iSdrCTGK6Iw1Xwo0fsvXoOKMW2NF/xzukjRPhAk9pIbSNf42xr+/S/gzUjd1gAkEHe86u+BmYZlC4Q32jbuQx4603X8XIKcH43Y6LhdarMuxaUDvxfbVvDk459d93zne/F8++mJzx6TES72VKkHCADzsL+WdfNugxKlCo+Itt+630y4WQ6ZFf5cQvkIk03zosCa3r27GzQbH66+HAxveCC6p95lVMxBeQ90zx5nwx1EZRYoXGtBSPtsomdE5JUTiUeroPCO6jW6NcoFG2bTkzdCm3XbZEh/mZouu5vy+t0GA==
+sidebar_class_name: "delete api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Remove a single event from an event collection.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/remove-manager-from-event-collection.api.mdx b/docs/docs/api/locksmith/remove-manager-from-event-collection.api.mdx
new file mode 100644
index 00000000000..cf18952ecc2
--- /dev/null
+++ b/docs/docs/api/locksmith/remove-manager-from-event-collection.api.mdx
@@ -0,0 +1,71 @@
+---
+id: remove-manager-from-event-collection
+title: "removeManagerFromEventCollection"
+description: "Remove a manager address from an event collection"
+sidebar_label: "removeManagerFromEventCollection"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNV9uO2zYQ/RVinlpAu07T9EVvm3RTbJsEQdaLolgYxVgc24wlUiFHThxD/14MqdXKtry5IUifLPM2Z85ceLgDV5NHNs5eacjBU+U29BItLsk/96663JDlZ64sqZBFkEGgovGGt5Df7uAmkIf8dtbOMqjRY0VMPsQpixVBDqFslpCBsZBDjbyCDDy9a4wnDTn7hjIIxYoqhHwHvK3jHvbGLqGVUzWFwps6Gs/hTcSnUFUJokKtPYWgFt5VCq0iwauKIWAxR4GfOr0VG4fWC2eZLMsU1nVpisjG5G0Qg7tjcG7+lgrec+MWOjgXCc3UJZwgrHhhmA0FOePEuhHXM2DDJfU+dzGJXrStzHsKtbMhHfz40SP52WfruikKCmHRlOVWpdDqQ+bgGxjY9y1G+tiT3pGRmT24I/OF25C/qnA5vn2O1kr+jUyVxq7DGGbU2og9LF/voT/mfz9We6vQe9xKVjNVJ3YXnpBJX/DxdAYL5ytkyEEj0xmbigRzU+sv3RLT/XOQjWZtLNGsL9HI835QMkBmb+YNUzjO5lTiI+yfTAVzMpafSoUBjq/0lj0a/jeuyGCDZTNSn4M1YyDSrpF4t8OCjT0TjocGbTRteDJWtFd2g6XRyti6YeWpILMhfa6eolZdKzv/lqK1TVniXFAtsAx01KEohNEYSYgW2JQcW1JqPWru9FYlW8oEZRL282Mzkqveu5FiHS6Vjjyk7Q+y5E3RUSK97zIeckffL8f0yY0kUKxjhQ2vyLJwQ/o0ad+fr+mKPKn3GOIVJS4oY5X05YUpjV0qXtEwuIfkHVNyTX5Dfp+NXz/NhvPmI2nFTtXkpaUoXpmgMGblD0+rf1yj0NMhWuf3I/kA/AeIe+X4YnhKT9uTY9qmK1LSU9S2Q1ThWsLUhUgtnFfaUeKVPpj/QUl6Cq7xRSJv4RqrPyuPXjl+HhcnNn4b60g3Vs4Q1ruM7XnQTRw2lslbLFWIWZky/Icz8v2LTkQC8cqJctZUEsvNEkVuDpPN40m8nc/uxehkJxdjO+mURYhqWo5MirnxJeSwYq5DPpmUrliHyvDqvLHyfVZ7x65w5XnhKjgUxq+90000ohJKaLPDEwPj0tjl2ZedfJ129cfO7p8A1xK/FJH0EOjDISahU/byf07oyUPWfTy/EzN//j2Ve/Vivxnf3e61+Yvkeu+eElibs3UciK+Jdw35bdRakk9v7lX+5Qes6qQ4T+ntoSSxCxeNdrG+iZyoF3ckiVggHxIZj4/o6dep2ruN0RTUHIs1Wa0WjS2S1DS8jT2DpJJi6pliTWzsMlMVMWpkVIGdxyVlCq2WKjaLjhK1cm4dJEVLU5ANdK+94OXVNFJQu8AV2sFM0vuqezcoecypKEPU3nPuQHf1FftVT60ucEwfeFKXaGyUtZKEu64ubmEjHB5WBmSQdzK0L45ZBisXWPbsdnMMdOPLtpXhFPn8diaKzJtUtLc70CbIt+67xknnfnrTCcOf1SnYd0lot71czAEykAzsnrXtrM1gRajjI3jXTT1LVs6mQ6WZHzdAKdC046IoqOYH184Greb3yxeX00sppu5JWzkdI47vRfLi+wTURb9jdcaxHZRol03sm5BOlcyRq3VQdAeVGv0apWK3Syumbk22bXtmWP4LNW37H6hYvB0=
+sidebar_class_name: "delete api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Remove a manager address from an event collection
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/remove-payment-methods.api.mdx b/docs/docs/api/locksmith/remove-payment-methods.api.mdx
new file mode 100644
index 00000000000..03615b1d3e2
--- /dev/null
+++ b/docs/docs/api/locksmith/remove-payment-methods.api.mdx
@@ -0,0 +1,63 @@
+---
+id: remove-payment-methods
+title: "removePaymentMethods"
+description: "Remove all payment methods for a user"
+sidebar_label: "removePaymentMethods"
+hide_title: true
+hide_table_of_contents: true
+api: eJyVVMFu2zAM/RWBZyfpip18G7Bs6NYCxZJihyAHRmZiNbLkSnS2wPC/D5TcNkm3YfPFki0+PfI9sgffUkA23t1UUEKgxh/oHo8NOb4jrn0VoYBIuguGj1CueniIFKBcrYd1ARVFHUwr8VDCtxSt0FrVZgjVZAy19UGh6iS0gECx9S5ShLKH66sreZ0jLTqtKcZtZ+1RZVLV73ChAO0dk2PBwLa1RqdsZo9RgHqIuqYGZcXHlqAEv3kkzVBAGyR3NplGzDeeHNx4bwkdDOkp4P3Vu7dEpRjKROU8K+y4JsfCgKrpH6n9nZXrrMWNJSi3aCNd0mwoRtzRSWTkYNwORIstdpahhGVNgdQPjAqdohB8UMYpKebWWON2imtSgZ46ijx9e6cky4ZlD5/JUTB6QeFAYS5QMJYjKwAlVGSJSQqKXEMJs8P1rO2CrjHSbNRr0px4SaBislIXLJRQM7exnM2s1/vYGK6nnZP1pA2evfZ2qn0Dl2a7D77qtGxUZgdDcYkYGXfG7Sb/h7zIUS+w69cGWIhuWYncBi8yyJWSXTog7iEMyex58cmHBkWbL9+XMBTw4dwPIwi25isdRRFsxv1knz4YIfbUUTiCFN+4rU9xo0wPKS11+5wnFCBFzvlcv8nw5Zxqgz+YiqLaoN6Tq9S2c6moaA0fU9uSw012jdF7YuN2hbQfVsioIvuAOyoUukqawGzHrFTt/T6Ku6zR5GKy7JjW3c0yZdH6yA26kz+51dU4gNTrBDrj37921j/PnLHCTD951lo0TlRIbulH467gIJV6tm4y9Ll51wXUPrIc7fsNRnoIdhjkc1amXK0LOGAwuZlW66GAmrBK87IHUbKED1pTK51+QNtlkS+mlhjupbs+zm/nyzkUINPldDqd+ytd8OwidzyB7/t8Yun35IYBipEHyx6G9TAMvwBisRxy
+sidebar_class_name: "delete api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Remove all payment methods for a user
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/revoke.api.mdx b/docs/docs/api/locksmith/revoke.api.mdx
new file mode 100644
index 00000000000..09fc0c58c0f
--- /dev/null
+++ b/docs/docs/api/locksmith/revoke.api.mdx
@@ -0,0 +1,63 @@
+---
+id: revoke
+title: "revoke"
+description: "Invalidate a session."
+sidebar_label: "revoke"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVD2P2zAM/SsCZ93lcEAXbze0xfUDLZAcOgQZGJmO1ciSK9FpA0P/vaDs5HJpO7RLJ0uy+Mj3+KgRQk8R2Qb/WEMFkQ5hT6AhkRmi5SNU6xGeEkWo1pu80VBTMtH2EgEVPPoDOlsjk0KVKCUb/C1oiJT64BMlqEa4v7uTz8vI5WAMpdQMzh2VCV3viKlW3JKK9G2gxIJjgmfyLOHY986aUuriaxKMEZJpqUNZ8bEnqCBsv5Jh0OAH53DrCKoGXSINfRSmbKeSOkoJd3QRmThavwMh2ODg+LrEZnCNde7XEq8y5ayBLcse3pKnaM2MAznLz1e/U+PJC4TiIHkk0SmDqodybD1T9OhUonigqCjGEP+7QquWIqnvmBT6qSRl/YmC9bt/0KrQey1QRa+soSNug5izD0kK75FbqGBxuF/gwO3iwrMSm4plh+iggpa5T9Vi4YLZp85yezt4Wd/0MXAwwd2a0MG1qT/HUA9GNmoqB7K+RkyMO+t3N3+HvJyizrCb50FbSqMm6adxO+suKYVduQAVbAkjRdDz4k2IHUoz3n1ZQdbw8OyCCxDs7Xs6Sguwm/c3+3JgpbBvA8UjiNrWN6HEzX15KrTUhxNP0CAiT3zuf2F4vqf6GA62pqS2aPbka9UMvoiKzvJRNSEqEtcXm1izJ7Z+p1VHjDUyqsQh4o60Ql8rH9g2MyvVhrBPYidnDflUPDrT+vi4KizEKh36iz9nl7yod3yenz++ZbOCTD940Tu0XlQubhhnL67hIEqIG8vbVzJtNLRi2GoN47jFRE/R5SzHk9jVeqPhgNFOA7HeZA0tYV2e2hGkORU8GEO9mP6Abpj6djXj4qHzhHz+tFydCnnu/ZVhCvzJFv54AT6O041V2JPPGfRcBcse8ibn/BOwIina
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Invalidate a session.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/rsvp.api.mdx b/docs/docs/api/locksmith/rsvp.api.mdx
new file mode 100644
index 00000000000..90a07943c4e
--- /dev/null
+++ b/docs/docs/api/locksmith/rsvp.api.mdx
@@ -0,0 +1,71 @@
+---
+id: rsvp
+title: "rsvp"
+description: "User applies to attend an event."
+sidebar_label: "rsvp"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVk1v4zYQ/SvEnFpAsRdBe9EtW+wWabdtkA/swfBhTI5trimSS1LOGob/ezGkHCm2mmwDFPXFkkjODN+8eTN7cJ4CJu3stYIaQtx6qMBjwIYShQj1bA/aQg0e0xoqsNgQ1GApPbqwgQoCfW11IAV1Ci1VoCjKoD2bhBr+LPuEVhOoIMo1NQj1HtLOsxltE60owOFQjboxTm6ulAoU46uuPjm5EVg2jzqLKWi7Kr46+xJ9kmuEqjhfEyoKr3q6pe6c2KJpSSQnPL7mdH5q5SFSEOi90RTZBKZEVgm0grZk06QLg2J679SOTUpnE9nEj/mczImbfolsb3/u2y2+kEycz8BpTpoirwaS2uvO0EmYFVCD2oyuKEyj1lEpzYGguRn4YeAO+cf3iN7ZWNxfvnvHf8/BuGulpBiXrTG7DhTFoGQooHr71W1rDC4MQb1EE+kUiyHBxu7cRgovraP3wW1xHLBjkfRrtm0Whe6QdOKo4JZLrsD00xgy13aLRiuhrW+TCCRJb0lNxHtUouPH5D8EqKEYcUXn92M6L7E1KRdEya9YOLUTxZfQUegS++TcDRMtBBfG7PZbC4d6rH4lS0HLDhIuiw/ZSIHv5zH4HiybYioxt5baHEETqlQuS1CwaESksKUgclj/O6L3awokHjFmPeCQhLbHK2i7EmlNw/SfwnsO2l2+Xo/XoYKG0tqx7HsXs0yw9tYw3V5OuRFM9x2BD9P9oE4OLHPZWOkObTAsnSn5WE+nvDE2Oq0nreXnCx9cctKZiXQNnGrgTXCqlfwiSnzA4vzcYky40nZ18e8s35VTT2bnHLRsg067O85cyQVr8CAR7PIo4vy+IAy5H5SHjy40yNn57fM91/dVT4uBEfT6d9r1PQy9vtjkD7nHfG0p7LICMJNue4X/8A0bb+hEoXtydMI8YEvRYzal7dLlELqcP2SExKcjZFAB56tAc3kG1tM+wWqmFUWxQLnhdrRsrSzirtNOLF0QxBWVKajlhpK2q0o0lJDDETG5gCuqBFolrEt62QEk1s5tcos0WpKN+Z4dQn9c32dAmIYN2sFKN488i3bQB7+nh3ZZSfQtTb1BbbOsh6zYhfAz2DIkna+6H23qYXeYV7DmMqlnsN8vMNJDMIcDfy4ZrWfzCrYYdCnD2R6UjvysnnTgH6/xw203b/wong9Mo8EfeWaZU3kCgRqgAiZZP5lxIb0pgtM56g0xDHE7zA/VcbB6MyovTFyj4ZUw+unuKUJGpSz+Uvxc3PP5fseZ1PcnrqQkn17cOx+I6s1fd/csHd3w1jiVGY2PzDV8LHi5fO8ylvG3PRi0qzb3Byg2+fc3/ToNEw==
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+User applies to attend an event.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/save-custom-email-content.api.mdx b/docs/docs/api/locksmith/save-custom-email-content.api.mdx
new file mode 100644
index 00000000000..30780fa60cf
--- /dev/null
+++ b/docs/docs/api/locksmith/save-custom-email-content.api.mdx
@@ -0,0 +1,71 @@
+---
+id: save-custom-email-content
+title: "saveCustomEmailContent"
+description: "Save custom email content for a specif lock."
+sidebar_label: "saveCustomEmailContent"
+hide_title: true
+hide_table_of_contents: true
+api: eJylVk1v4zYQ/SvEnFpAidKgvegWBNti2227qBP0YPgwpsYW1xTJJSlvDUH/vRhStvyVbDfNJaJIvZl5fPPGPVhHHqOy5n0NFQTc0mMXom3ftaj0ozWRTIQCAsnOq7iDat7DcyAP1XwxLAqoKUivHCNABTPckpAJQBAjCJkhxMp6gSI4kmoltJWbWyjAoceWIvmQcBVDOIwNFGCwJajAUPxi/QYK8PS5U55qqKLv6DzwH/mcUDXjBtlQi1D1EHeOYZSJtCYPw1BcDcMJPdS1pxC+GuqDlRuB+fDVYCF6ZdYvxorUOo2RvhroaTwoVJ3oS4S+GnDBkMFZEyjw/v3dHf87hX28dj2hk5JCWHVa7wSrIPE47jIGOqeVTEopPwUG6i8TsctPJFkuzrOuosppHLN7mXVxuORpz3Ttkq+rmNi69uFRfudU8F8BP979cEkAy1eoIIyNArvYkIlc2Wslv16t6bTGpSaoVqgDnZffUgi4vlIBX/gKOx35shvyJL5gEGgEeW+9UEbwfayUVmYtYkOC9UIh3l7G5GKjiryGX8iQV3JGfkv+HUNBZuOnq3Kwna4TF+Gl5v1fUpg0Pj8wsfjPFA37m2wpNpYtytmQFMY9VUG5vS9TrmU/qmgoWW6h7I9UN5S5rLLfy2lInsYEZevpvIYKmhhdqMqM0KrY3HaGn2+ct9FKq2+lbeG8Tz96W3eSFyJzDtz5p4gh4lqZ9c23Ic/yVwfYxWTEMyY8k5ft+MAch9y7BK+XhJ48FOPDz9a3yIr79e8n7qGHU5WPIOjUb7SbTAudutmkF8nRPnfkd+xwoMzKpu9G8T2nssSHfZ1QAJOc67m/qPBwTjhvt6qmIJYoN2RqsepMIhW1irtsgAaXuReU3FBUZl2IliLWGFGEaD2uqRBokpzVaqxKNNZuklNrJcmEpLKxrN/fP6UqWFQtmqOd1AyjVaZZKKZheFJCP7XGt46/ketI/8TSaVSG7yPpph/1PYctc7Z3/moah0lI/Op0dOXg/P5gnIsCGu6Zag59v8RAz14PA7/Ot1jNFwVs0atsJ/MeahX4uT742YsFf/fX2N3fi9MJfLW0vbYM62iLuuMVFMDCmkY9N8+bMjgfzG/I4ZjMN+fx0tx+Qz6HSxwWQwENYZ1+efXj9oOU5OLRhxfWzJZxsM6Pf86eoACeeUetfuYPCf5qVn2fTzzZDZlhmJLkNWc4DP8CahiUUg==
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Save custom email content for a specif lock.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/save-event-data.api.mdx b/docs/docs/api/locksmith/save-event-data.api.mdx
new file mode 100644
index 00000000000..38501024bda
--- /dev/null
+++ b/docs/docs/api/locksmith/save-event-data.api.mdx
@@ -0,0 +1,71 @@
+---
+id: save-event-data
+title: "saveEventData"
+description: "Save event data"
+sidebar_label: "saveEventData"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVttu4zYQ/RVinuVLjA221Vs2TYv0ggYbBwVq+IEmxxbXFKklKWcFQf9eDCnflQWCoqhfLFEzw+GZc2bYgq3Q8aCseZSQg+c7fNihCT/xwCEDj6J2KjSQL1p48eggXyy7ZQYSvXCqIkfI4ZnvkCH5MZkcHX6t0YdPVjaQtyCsCWgCPfKq0krELSdfPLm34EWBJaen0FQIOdjVFxQBMqgcJRgUevqq5ImNqcsVOugyiHteOXcZiALF1tbh3pq12gzFpzyVQwn5gpIkqwwMLxGW393cB6fMhvaIxkMfVs3gsngzFy6lIli4fjrZOLgaz/PUVmz9dX5p+V1xu44ScsgDyrtwnW4Ga+tKHiAnjHEUVIl0hrqS73PpMggqaLK7P69JF390QF9Z49NRZtMp/V2QrBYCvV/XWjeMiCrPKfffcuzNMr9JPq/rzaDHZaG4c7yBDFTA0g947CH6MITKo9lxrSRTpqoDcyhQ7VCO2ScuWS/C8b8Bx9Ra8xVVbs21x0u0SvSebwaQoRax5rUmInzua8tWVjYs7cWUZyrlPr7epssAnbNuKO7RNFH4SK1f0KBTooeEes9DDJLgux2C78VQKBYsI16tld6DxmQdl5UJ6AzXzKPboWMxrf8d0XmBDtkr94yblBJTZn8EZTYsFHha/kt4r0F7jsc74tVlUGIoLE2FyvqoEx4KyGGym02i8PyEVBinBPn6OCRqpyGHIoTK55NJpHqpQjGuDT2PKmeDFVaPhS3hcow8OStrQS8spQNddhnRB75RZjN6X+Tn5HUIuzyOtmcqVII+DbgD7rQlnS4aQA4r5A4dZP3Dz/s+9+tfc5L13ZEFp+Ku1G/Y7IdKfB9t44KixL7W6JrYH4k4n49T8+EbLyuN+440PTSawbGm5JlC0laHd5pEx7fjANo3oospALPp7MNo+nE0+3F+c5vf3uSzH8bTjzd/w1nnf9uM4imzthGGnmYvsUrs933ZIAPiTCrP7KpgBztWObtTEj1bcbFFI9m6NiKNMxUatraOIYk4sl6JLQZlNhkrMXBCjPlgHd9gxriRzNig1n2RWGHt1pM6tBJofMS6h+6Px3k8BTG/5ObkC1GexSsS6+9IZ4mfXHUGbkU9JwJ+C5NKc2XiMCV+t726FrAjMJK+iHyksGUGBUkwX0DbrrjHF6e7jpYTffLFMoMddypJfLHsMiiQy3hda4HolsN9yms0pxzIXNeJjxe9iySXPO6EwCp813Z50iWe/nyeE9n6K19pJfk4/krXLP4KOUAGNuIU1RbXWtDcbOrY8CDFJNx5TWAcRHShvHiqvb5Mc5Jh2yaLud2i6TrI+qMEeodu2XXdP90TxN0=
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Save event data
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/save-lock-setting.api.mdx b/docs/docs/api/locksmith/save-lock-setting.api.mdx
new file mode 100644
index 00000000000..1935db7fead
--- /dev/null
+++ b/docs/docs/api/locksmith/save-lock-setting.api.mdx
@@ -0,0 +1,71 @@
+---
+id: save-lock-setting
+title: "saveLockSetting"
+description: "Save lock settings"
+sidebar_label: "saveLockSetting"
+hide_title: true
+hide_table_of_contents: true
+api: eJytVsGO2zYQ/RViTi2gXW+D9qJbaiRB2rRdxF70YPgwJsc2Y4pUSMobQ9C/F0PalrxWtpu0J1vkzHA4fPPetOBq8hi1s+8VlBBwTx+c3M0oRm03UEAg2XgdD1AuWngI5KFcLLtlAYqC9LpmVyhhhnsSxsmdCNk1QAE1eqwokg/JW7NhjXELBVisCEqwFB+d30EBnj432pOCMvqGnob/M9sJrW45J7mlCqFsIR5qDqNtpA156Lpi9BhO7LVSnkL416P4+gKz8ehhIXouTcdF4FAU4q9OHdhCOhvJRv6LdW20TJWdfAocub0O5VafSEbOszEGV4agXKMJVEDt+WGipsDmw/yvEynOZez3bFOtuCD8gFa9qVCbwe7KOUNo07ZpNqMxPdXmMHfXe8NsuYBdAdKT0nGKXt17Lek6jxEf4pxmZBVD6iVnbEnuXBOnzq71htH6Aqetc7t3jTbqhfaN5VK/JZpu0W9IzV2G/Fjl+ktPG+/JysPYEYrW2JgIJTRBZTcXQqVtnBpNNr4wsdq7yk2doiEA0Hs8QAE6UjUGDPbDEB6dV9/odmqRdzpKp+09hlA7H2fS+Ze8bldA1JE/YcAmAbouBw+1syFf5dXdHf88YZNGSgph3RhzEMxJ6kwrYu18Ihoovr/dLrvr2Q7pcs4/3/10nSZjQ+ggrIsCm7glGzkHSiQ1ntx/ooGKQsANPQ+z+ZY8iUcMAq0g750X2gou5VobbTcibkkceev2+szh270jS17LGfk9+Tcc6viCv4w92nu7R6PVKfb/9z5fvXZ3ep2K4taxftUuHZzYv4TJ/tWEoXJzAs+kPTJll9bDpB0wa5fUjq+a5arxBkrYxliHcpLtKx23t5kjbmrvopPO3EpXwVMRufdONZI/RK4esDJdRgwRN9pubr4t8ix7ncMue4mecT1zyZ6wFh95krKEbkKf+jb/eet8hYyd3/6eM0W9vsTriTZq/TsdelHFWt/s0kJS3M8N+UMiD37fj70wvvmCVW3oSscGbHeSr7sLucrqnAWqNz7rUr90JT93T+RlYHqlIv3ehVj0y1/ThJzemAokqh9l+j7qkNAXp+XlBWEPl58n5LuOH2GdxfrYvA8pbfHhhC4ogKGdUfTqCldnO1F7t9eKglih3JFVYt3YBGU0Oh4S/5LFVeYSLXfErVWIiiIqjChCdB43VAi0iqlRr49YElzgNFMZLcmGBIkjmP54P8965UKs0A52mP7TLUQ/lF6kPhi7xsfQI34jfYmT2qBO6p16sT0yxQL2XJELroACyn48TU3KS0MILxkzIbJ/264w0IM3XcfLuRnKxbKAPXqd+XXRgtKB/6szwX/1Jj98PL74j+Jy+B29zalFLbfjHk3DX1AA92c/ZTMHfVcGT2fi78hhWLduyaMZYerNRXu0mOaTb+Ycp49wpRx8i+zxWkqq47O2y4E43P81mzPnHYf1yin28fjIrIKPOVuXKpFINK21YNBumqQ/kGMyTlnuh+PCJaGmW43Wo22zxdztyHbduTyRv7kwXfcP96C9Gg==
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Save lock settings
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/save-receipt.api.mdx b/docs/docs/api/locksmith/save-receipt.api.mdx
new file mode 100644
index 00000000000..24bb985f1e6
--- /dev/null
+++ b/docs/docs/api/locksmith/save-receipt.api.mdx
@@ -0,0 +1,71 @@
+---
+id: save-receipt
+title: "saveReceipt"
+description: "Create purchaser details"
+sidebar_label: "saveReceipt"
+hide_title: true
+hide_table_of_contents: true
+api: eJytVk2P2zYQ/SvEnFpAu94Y7UW3RdG0abdpEO+iB8OHMTW2GEskQ46cuoL+ezCUbK9tOdsu6otFcTgfj2/eqAXnKSAbZ98VkEPELX0kTcYzZBBJN8HwDvJ5C0+RAuTzRbfIoKCog/FyDHL4KRAyKd8EXWKkoApiNFWEDDwGrIkpxOTDiLlHLiEDizVBDpb4iwsbyCDQ58YEKiDn0NB5kPe9nTLFrWSmS6oR8hZ458WNsUxrCtB12WiYyunNfVEEivHFUA9ObxT2xqPBIgdj11djlRjLF4P82htd970QD9E7GynK/vTuTv5OvcwarSnGVVNVO6XTPcTLi5AitLNMlsUFel8ZnS598imKn/YyD7f8RFpI4INQhE2fhUTqy7zIOINlE42lGN9fMxhAfTCW3rxkMB010ImOIxuRkceD/mP8uCvXWA5j3tIvgx/u3lwiLm2gTFTWscKGS7IsWFJxHeRv42ubqsJlRZCvsIp0DnhNMeJ6pDIh1AqbiiGHx5ICqS8YFVpFIbigjFVyVytTGbtWXJISPlLk28uYUiwbljX8QpaC0TMKWwo/iyvo0fhxjH9v0VRUKHaq8YWIgAsDDf9nFh6baX6AZPGvser2V1oTl06EzruYyC2Nm8NkO52EXvbipB0kqZu0z1Sjm7TS112SRcGmV7QmVNLxzD7mk4nYx9pwedtYeb7xwbHTrrrVroZzCfgQXNFoWagebhBBOfUYGdfGrm/+m+dZf+rgdnHU8plA3MPVK/oBKwm5VyRZLwkDBciGh7cu1Chk++2vR2mf+1OCD07Qm99pd9RC9OZmk14kofzcUNiJcIKxK5fODbx7SmWph32dkIGA3NczvajwYKd8cFtTUFRL1BuyhVo1NoGKleGdWrmgyOKybwOjN8TGrjNVE2OBjCqyC7imTKEtpKvNaqhKlc5tEmsro8nGxKuhrD/ePaYqhEY12mc7MkHVcYSeZN0e+f+toTlAyfQ3T3yFxgrciRbtQNg5bKepKXrKQgb5cY7mp7MuT+NokUEplM/n0LZLjPQUqq6T1/2V5PNFBlsMppeFeQuFifJcHHTpainffRya83t1OqVHC9kTxQoptlg1soIMhCXHzwHphFdlcD68X5HDc/xenccw318RPt1Xt+gyKAmL9NHVDlv3WlOi1f7QhYhKqx9E7sOfs0fIQMbUsxY96+vkfjSjtu0tHt2GbNcdEmRZS4Zd9xX484xk
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Create purchaser details
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/save-receipts-base.api.mdx b/docs/docs/api/locksmith/save-receipts-base.api.mdx
new file mode 100644
index 00000000000..fc66028bd7d
--- /dev/null
+++ b/docs/docs/api/locksmith/save-receipts-base.api.mdx
@@ -0,0 +1,71 @@
+---
+id: save-receipts-base
+title: "saveReceiptsBase"
+description: "Create supplier details."
+sidebar_label: "saveReceiptsBase"
+hide_title: true
+hide_table_of_contents: true
+api: eJytVk2P20YM/SsDnlpAu94Y7UW3TdEUabfpYr2LHgwf6BFtTSzNKBzKqSvovxeU5G9t0gb1xRoNh0M+Pj6qgVARo7jg32eQQsQtPZElV0l8i5EggUi2Zic7SOcNvERiSOeLdpFARtGyq/QspPATEwqZWFdV4YhNRoKuiLeQQIWMJQlx7Hw4Na9QckjAY0mQgif5HHgDCTB9qh1TBqlwTZeXfOjtjMvUb7Q5lQhpA7Kr1I3zQmtiaNtk9Joi2M19ljHF+NWrHoLdGOyNRy+Lws6voVUomGIVfKSo+9O7O/07dzerraUYV3VR7IztsIqjYNnghbyoB9Rd2xVn8jGqm+Y6jLD8SFYUZdZSiuuD2Lv+0GV+FXQCW5TX3r/F6OJjcF7iE8rpcV+XS8VXWcFbZ+mReBW4VBBHfA3wPThPb75mMB01sB3xRjainEd23PnbVeOuQu2Fx7x1vwR+uHtzXTclvHHR+CAGa8nJi5aEstdr9eUy+boocFkQpCssIl3WraQYcT2SmfJzhXUhkMJzTkzmM0aD3hBzYOO8UW6tXOH82khORulNUW6v79RkxYmu4RfyxM7OiLfEP6sr6NH4cYzF79AVlBkJpq4ybffAA5n/Xy4fW3N+QGTxr6Fq9xUtSfKgslaF2LWIqkEKk+10woPI3Swx0qQZBKidNCca0ULP871w1VxACrlIFdPJRA1j6SS/rb0+31QcJNhQ3NpQwqWcPHLIaqsL02MNqlHnHqPg2vn1zX/zPOtPHdwujpI9U4B7sHrhPiClV+5FTddLQiaGZHh4F7hUfYBf/3zW3rk/Z/fgBCv3G+2O8oqVu9l0Lzrt/VQT71SLwflV6M4NpHvp0jIP+zwhAQW5z2d6leHBzlQcti6jaJZoN+Qzs6p9ByoWTnZmFdiQx2XfA85uSJxfJ6YkwQwFTZTAuKbEoM+0pd1qyMrkIWw6zhbOko8dq4a0fn//3GWhJCrRn+zotDT7cWmGeXkWe3PsgS9NyAFQob9kUhXovILekaMZSDuH7bRrjBPaQgLpcXKmp9NtkUCunE/n0DRq+8JF2+rrvirpfKFSz66XhXkDmYv6nB106dU8vnsauvN7cz6PR7PYc8UrL7ZY1LqCBJQox8GvzfBNEVyO6W+I4RS3dtEmkBNm3WdOM1jcW0uVnJy9UjPtuoPaPP4xe4YEdFycdMtFi3XuRwNrmt7iOWzIt+0hTtG1Rti2/wA++mC1
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Create supplier details.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/send-custom-email.api.mdx b/docs/docs/api/locksmith/send-custom-email.api.mdx
new file mode 100644
index 00000000000..ae9e44f6729
--- /dev/null
+++ b/docs/docs/api/locksmith/send-custom-email.api.mdx
@@ -0,0 +1,71 @@
+---
+id: send-custom-email
+title: "sendCustomEmail"
+description: "Send custom email to recipients"
+sidebar_label: "sendCustomEmail"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVk2P4zYM/SsCTy3giReD9uLb7GJaTLttF5MM9hDkwEhMoo0seSU5s4Hh/15QcuJ89WtboHOJpaFI6vHxUR24hjxG7eyTggoCWfWuDdHVjzVqAwUEkq3XcQ/VvIOXQB6q+aJfFKAoSK8bPgoVTMkqIdNJQXxURCc8Sd1osjFAAQ16rCmSD8mV5lMNxg0UYLEmqMBSfHV+CwV4+txqTwqq6Fu6jPVrthNaTThBuaEaoeog7ht2o22kNXno++JmGOPk9kEpTyH8Zaj3Tm4FZuObwUL02q6hZ0TYFYX41qk9W0hnI9nIn9g0RssEc/kpsOfu2pVbfiIZGSnPRYmaQrJr8/51zOI0xGU+/McphcbZkD3dv3nDPxeFa6WkEFatMXsRyMazKkLxn13jPM+lc4bQHhP97lZuT3aHRiuhbdNGZhPpHamJeItKDGBP/k2GtjUGl4agWqEJdJlyTSHgmq7RZZassDURKngeEBZLp/YixxI6CJ1zn1yH6Qsg752/5Xc0ZTYyMFFHXsKPZMlrOUDCHHtMTjJ839+C78WyK25Eru5KmwNoQrVpmzvFWzQikN+RFymt/x3R2YY8iVcMAm1OSWh7uIK2axE3dFr+S3ivQZum64149QXUFDeOFa9xIZGVJaKCcndfJuKX3aBGfcl6EcruRDb6MvdIyXKZNJL9Z11rvYEKNjE2oSrz2VrHzaS1/H3XeBeddGYiXQ2XavPBO9VKXoicMrCEnXsMEdfaru/+medpPnV0uxiFfcrFzOXJ8n6sDYc8aF7qWUJPHorh4wfna+SC/fRxxmL0MDLlxAk2+mfaj+qLjb7bpo0kzZ9b8nuWamByPY8K+vgF68bQmQKObDkS9EQMtV25FHgo/kvCRbw/AAUFcJUyIPdXEB3tROPdTisKYolyy3Nt1dpUFTQ67sXKeUHcWomLWm4parsuRE0RFUYUITqPayoEWiWsi3o1wCI2zm3THDFakg3pdgMuvzzNEgzMxxrtyX+YZCIPZXGYymepn4yavzGHh7pE+hLLxqC2jF3iWDd0wRx2DM9hAFTjXE6k463zGZrjpUawChYFbLipqjl03RIDvXjT97ydi13NFwXs0OvctPMOlA78rY6q8YfX++Z5GNffivNXwM1bHShomW47NC2voADm3/jc4B77qgwuHwdfkcMpjv2iL2BDqNIbqxss3uXIdzP2M3q4kmW+RT7xICU18U9tFycC+OG36Yx7eni11E7xGY+v/DjC15ytS0gkkUh7HRi06zZpOWSfTF5smT/jkD8XjHSrm3h0XbaYuS3Zvj/CE3nNwPT970uNto0=
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Send custom email to recipients
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/send-event-invites.api.mdx b/docs/docs/api/locksmith/send-event-invites.api.mdx
new file mode 100644
index 00000000000..2eaaafe3021
--- /dev/null
+++ b/docs/docs/api/locksmith/send-event-invites.api.mdx
@@ -0,0 +1,71 @@
+---
+id: send-event-invites
+title: "sendEventInvites"
+description: "Send event invites to a list of recipients"
+sidebar_label: "sendEventInvites"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVk1v4zYQ/SvsnFpAsdOgvei2W6SF+4EuEgd7MHwYS2OLa4rUkiMlhqD/XgwpW17bLbBogeYSUSIfZ968eeMeXEMeWTu7KCGHQLZ87MjywnaaKUAGgYrWaz5AvurhJZCHfLUe1hmUFAqvGzkLOTyTLRXJUaXTWcVOoTI6sHJb5anQjSbLgtmgx5qYfIioWgAa5AoysFiTBGLaHWTg6XOrPZWQs2/p6s60KRQV1Qh5D3xo4mH22u5gkCgFgQK/d+VBdhTOMlmWR2wao4uY+/xTEMD+GsptPlHBErIXplhTkK9n2Ux70Xs8QAaaqQ43wsmg1naRPn6fQY1vx8X9EP8k2tA4G9IlD/f38u8i57YoKIRta8xBhTO6v4Hsv8oujBjjro1zhtDCMcgfbsW1sB0aXSptm5al2qQ7KmfqPZZqrMHs30RoW2NwYwjyLZpAlyHXFALu6Jp10cwWW8OQw9PIrtq48qDSXUoHYVBin11fM2RA3jt/C3faKtoUYlizLOEXsuR1MVIi0nuMIIm+H2/R92IFSlpGKrvV5kiaKtv4Wlsmb9GoQL4jr2JY/zujy4o8qVcMCm0KSWl7TEHbneKKzst/Se81ac8xvYkv6Rriyok7NS5EsYpT5DDvHuZUozbzXtximKdGiJYlGMlbWm8gh4q5Cfl8blyxD7XmatZaeb5rvGNXODMrXA2X/vLBu7ItZKFSWDBkl4iBcaft7u7rkJ/TqRPsevLZZylYKkFy2xP/cuXR7mJfEnrykI0PPztfoxTl149LMZt3kxrOTarRv9FhMlps9N0+vogu/LklfwBhXQT0NJnn4xvWjaFL81sdVbEeBGHr4lVjSV8iE+r3IzWQgdQlUfBwRcppn2q863RJQW2w2Mtg2bY21gGN5oPaOq9IGiYqTBd7Ym13maqJsURGFdh53FGm0JbKOtbbkQhVObcPokSjC7Ih5jMy8cdiGRMXldVoz77IVFRxLKppLn4R+9lg+bpJOFaF6Y3njUFtpXJRYf2o8xV0QlVUOmSQj5NxFPs6g0q6Il9B328w0Is3wyCvUyXz1TqDDr1OXbfqodRBnstT2/9tIt8+jdP3OzVO2pvRHoVlRUQdmlZWkIGoahzkg6ijIizjr4d+/PRTuuluKQDT0SsXk6ZLJ94VBTX8j3vXZ37x4c/npbTHOPtrV8oZj6/yywJfU5guZp6murzrwaDdtdH6IGGKKrCVYkwz8cvei1ndJKLv046l25MdhhMvLGshZhj+AjOPURw=
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Send event invites to a list of recipients
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/send-verification-code.api.mdx b/docs/docs/api/locksmith/send-verification-code.api.mdx
new file mode 100644
index 00000000000..61a4df432c1
--- /dev/null
+++ b/docs/docs/api/locksmith/send-verification-code.api.mdx
@@ -0,0 +1,71 @@
+---
+id: send-verification-code
+title: "sendVerificationCode"
+description: "Sends a verification code to the user's email if the current code is expired or does not exist."
+sidebar_label: "sendVerificationCode"
+hide_title: true
+hide_table_of_contents: true
+api: eJy9VcluIzcQ/RWiLkmAljUwkkvfnMAZTBYg8JIcDB1KZEnNEZukWWzFQkP/HhSpbSw5yEyC+OIWt3r1qt6rEUKkhNkG/8FAC0ze/E7JLqwuiz8EQ9CAIdbJRlmBFu7JG1ao1icHlQ6GVA4qd6QGpvQVK+rROmUXZU0PKZHP9ZxlRS/RJjIqJGUCsfIhK3qxnK+ggYgJe8qUGNqnETz2BC1ojFl3CA1YgdERGkrQQKLnQd6CNqeBXqO9o909tUY3FIwRmSUM6456hHaEvIkSgXOyfgnbbXMIWpK4MSYR8z5yxNxdiPv2czM5zDF4Jpb963fv5N+nQG8LXYUfFqZ40JqYF4NzG0Grg8/ks1zEGN2O+OlHltvjefQw/0g6C5tJipxtjd0TMy7pEkz5a+DbS+C+R6Pu6HmgWqD/CAulFNI5kgboBfvoaBc41cDK1PJZv0ZnjbI+DvnqgPu7S7gfPc5duSU8Lqw7fyxT8ugUU1pTUgXSv0rRD85JUGgX6Jj+Mf/SuAscXIYWHjpKpP5EVugrJGX9PgXrl0VS6ViPVzGFjmxzIfA9eUpW35f0bgvhO8J6yl0Q1S+plEa6uoXp+nqK0U5FxDwdT/t/OxV/mJzqfqKrQ1T2qlyH5ESeOUdup1MX9Ip7m7urwcv3JKaQgw7uSof+zFt+S8EMujhKRQyixU9f5IxL65eTz3v5vt46PDsT0HpINm/upZa1Oo9Mpw0pIfdGIb/nhKl4Tv34MaQepV4//fEA2wZujo1y8ghG+zNtpErVUjDayaosFDd5HihtxHPA+kUo93aleyxpqV/2eUIDQnLN5/osw8M5FVNYW0Os5qhX5I1aDL6Qis7mjVqEpEiEUTrJ6hVl65eN6imjwYyKc0i4pEahN+LMR5vvQlgV73RWk+fSxru0fv3wULKIgXOP/mRHukadjhV1aa6MR8n9DyNmV5tML3kaHVov9St9Nu6U8ARr4RijhQaKGqCB9tU8eEMQswa6wFkeGcc5Mj0mt93Kcq12+zRrYI3JVtE+jWAsy7c5uMab3Hx9t5s736i38tg3npcmK2MPWoAGpOtejbTtbNvsR+kX4/ibGXsRX8VxnOcHiCL2unmjNcV8sndmwqLgg4W9v5Xm+wuK4RIw
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Sends a verification code to the user's email if the current code is expired or does not exist.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/setup-payment.api.mdx b/docs/docs/api/locksmith/setup-payment.api.mdx
new file mode 100644
index 00000000000..3341fb1e773
--- /dev/null
+++ b/docs/docs/api/locksmith/setup-payment.api.mdx
@@ -0,0 +1,63 @@
+---
+id: setup-payment
+title: "setupPayment"
+description: "Setup a payment method for user."
+sidebar_label: "setupPayment"
+hide_title: true
+hide_table_of_contents: true
+api: eJyVVMtu2zAQ/BViz0qcBj3xFhRt0RcawA56MHxYUyuLMUUy5MqtIejfi6WUxHHQotVFosQdzczOcoAQKSHb4D/VoCET9/EWjx15hgoymT5ZPoJeD3CXKYFeb8ZNBTVlk2yUOtCwlCqFKk6FqiNuQ62akFSfKV1CBYlyDD5TBj3A9dWV3F6CvEuETLUqFJT1LEjGWbllMolYcEwoH6QcY3TWFO6L+ywYA2TTUofyxMdIoCFs78mIlJhEKduJwYS7LLAnuzMn63cwlquCt1dvXvMUG5TNygdW2HNLnoUF1X+m93dmvncOt45AN+gynVPtKGfc0WuW0oUGe8egYdVSIvUTs0KvKKWQlPWq6Z1rrLN+p7glleihp1xsPPuniGXLsoaP5ClZs6R0oPReoGC2Y2oraIghF0uRW9CwOFwvYp9Mi5kWpXslOVKeS3D65EBDyxyzXixcMPvcWW4vey/PFzEFDia4SxM6OI/WbQp1b2ShJkYwVueImXFn/e7i/5CXU9UT7OY57kvp1eT+FPon6+WXoq5sAA1bwkQJqvnhQ0gdSj8+/1jBWMHNywzMIBjtFzpKF7Cb1xf78sIKsYee0hHEcOubUOrm1twVWerro06oQEye9Fy/Uvi0T8UUDramrLZo9uRr1fS+mIrO8rEMKnncTkmxZk9s/a6SOcYaGVXmkHBHlUJfS/BtM6tSbQj7LIly1pDPJaazrG+fVkWFpKVDf/JlGvHnY+YF7eF5iP7lYJk9ZfrFi+jQevG95GOYA7qGg3jzGNESTgnppoJWgqzXMAxbzHSX3DjK66kDer2p4IDJToOy3owVtIR1OQUHkI5puDGGomg4oOunZp6dShKsp8m5/b5cQQVybpwE4ixFBf4xK/54Aj4M045V2JMfR6hmFixrGDfjOP4Gy+MIMw==
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Setup a payment method for user.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/sidebar.ts b/docs/docs/api/locksmith/sidebar.ts
new file mode 100644
index 00000000000..b61b13f8d55
--- /dev/null
+++ b/docs/docs/api/locksmith/sidebar.ts
@@ -0,0 +1,714 @@
+import type { SidebarsConfig } from '@docusaurus/plugin-content-docs'
+
+const sidebar: SidebarsConfig = {
+ apisidebar: [
+ {
+ type: 'doc',
+ id: 'api/locksmith/unlock-locksmith',
+ },
+ {
+ type: 'category',
+ label: 'UNTAGGED',
+ items: [
+ {
+ type: 'doc',
+ id: 'api/locksmith/nonce',
+ label: 'nonce',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/login',
+ label: 'login',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/login-with-privy',
+ label: 'loginWithPrivy',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/logout',
+ label: 'logout',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/revoke',
+ label: 'revoke',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/user',
+ label: 'user',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/applications',
+ label: 'applications',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/create-application',
+ label: 'createApplication',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/delete-application',
+ label: 'deleteApplication',
+ className: 'api-method delete',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/update-application',
+ label: 'updateApplication',
+ className: 'api-method put',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/verifiers',
+ label: 'verifiers',
+ className: 'menu__list-item--deprecated api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/create-verifier',
+ label: 'createVerifier',
+ className: 'menu__list-item--deprecated api-method put',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/delete-verifier',
+ label: 'deleteVerifier',
+ className: 'menu__list-item--deprecated api-method delete',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/verifier',
+ label: 'verifier',
+ className: 'menu__list-item--deprecated api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/event-verifiers',
+ label: 'eventVerifiers',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/add-event-verifier',
+ label: 'addEventVerifier',
+ className: 'api-method put',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/delete-event-verifier',
+ label: 'deleteEventVerifier',
+ className: 'api-method delete',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/approve-refunds',
+ label: 'approveRefunds',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/approved-refunds',
+ label: 'approvedRefunds',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/sign-ticket',
+ label: 'signTicket',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/check-ticket',
+ label: 'checkTicket',
+ className: 'menu__list-item--deprecated api-method put',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/check-event-ticket',
+ label: 'checkEventTicket',
+ className: 'api-method put',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-event-ticket',
+ label: 'getEventTicket',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/email-ticket',
+ label: 'emailTicket',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/ticket-qr-code',
+ label: 'ticketQRCode',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/ticket-verification-url',
+ label: 'ticketVerificationUrl',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/lock-metadata',
+ label: 'lockMetadata',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/update-lock-metadata',
+ label: 'updateLockMetadata',
+ className: 'api-method put',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/key-metadata',
+ label: 'keyMetadata',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/update-key-metadata',
+ label: 'updateKeyMetadata',
+ className: 'api-method put',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/update-user-metadata',
+ label: 'updateUserMetadata',
+ className: 'api-method put',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-user-metadata',
+ label: 'getUserMetadata',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/update-users-metadata',
+ label: 'updateUsersMetadata',
+ className: 'api-method put',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-waas-token',
+ label: 'getWaasToken',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-user-account-type',
+ label: 'getUserAccountType',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/send-verification-code',
+ label: 'sendVerificationCode',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/verify-email-code',
+ label: 'verifyEmailCode',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/update-user-encrypted-private-key',
+ label: 'updateUserEncryptedPrivateKey',
+ className: 'api-method put',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-user-private-key',
+ label: 'getUserPrivateKey',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-user-recovery-phrase',
+ label: 'getUserRecoveryPhrase',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/eject-user',
+ label: 'ejectUser',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-data-for-recipients-and-captcha',
+ label: 'getDataForRecipientsAndCaptcha',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/keys',
+ label: 'keys',
+ className: 'menu__list-item--deprecated api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/keys-by-page',
+ label: 'keysByPage',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/export-keys',
+ label: 'exportKeys',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-exported-keys',
+ label: 'getExportedKeys',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/balance',
+ label: 'balance',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/price',
+ label: 'price',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/create-lock-contract',
+ label: 'createLockContract',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/purchase',
+ label: 'purchase',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/cancel-subscription',
+ label: 'cancelSubscription',
+ className: 'api-method delete',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-subscription',
+ label: 'getSubscription',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/claim',
+ label: 'claim',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/setup-payment',
+ label: 'setupPayment',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/list-payment-methods',
+ label: 'listPaymentMethods',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/generate-ticket',
+ label: 'generateTicket',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-ticket',
+ label: 'getTicket',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/disconnect-stripe',
+ label: 'disconnectStripe',
+ className: 'api-method delete',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-lock-stripe-connection-details',
+ label: 'getLockStripeConnectionDetails',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/upload-images',
+ label: 'uploadImages',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/create-transfer-code',
+ label: 'createTransferCode',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/transfer-done',
+ label: 'transferDone',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-receipts-status',
+ label: 'getReceiptsStatus',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/create-download-receipts-request',
+ label: 'createDownloadReceiptsRequest',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/download-receipts',
+ label: 'downloadReceipts',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-receipts',
+ label: 'getReceipts',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-receipt',
+ label: 'getReceipt',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/save-receipt',
+ label: 'saveReceipt',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-receipts-base',
+ label: 'getReceiptsBase',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/save-receipts-base',
+ label: 'saveReceiptsBase',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-custom-email-content',
+ label: 'getCustomEmailContent',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/save-custom-email-content',
+ label: 'saveCustomEmailContent',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/delete-checkout-config',
+ label: 'deleteCheckoutConfig',
+ className: 'api-method delete',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-checkout-config',
+ label: 'getCheckoutConfig',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/update-checkout-config',
+ label: 'updateCheckoutConfig',
+ className: 'api-method put',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/list-checkout-configs',
+ label: 'listCheckoutConfigs',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/remove-payment-methods',
+ label: 'removePaymentMethods',
+ className: 'api-method delete',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/is-card-payment-enabled-for-lock',
+ label: 'isCardPaymentEnabledForLock',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/connect-stripe-account',
+ label: 'connectStripeAccount',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-stripe-connections',
+ label: 'getStripeConnections',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-event-details',
+ label: 'getEventDetails',
+ className: 'menu__list-item--deprecated api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-lock-settings-by-slug',
+ label: 'getLockSettingsBySlug',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-lock-settings',
+ label: 'getLockSettings',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/save-lock-setting',
+ label: 'saveLockSetting',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/generate-certificate',
+ label: 'generateCertificate',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-data-for-recipients-and-guild',
+ label: 'getDataForRecipientsAndGuild',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-data-for-recipients-and-gitcoin-passport',
+ label: 'getDataForRecipientsAndGitcoinPassport',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/capture-purchase',
+ label: 'capturePurchase',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-charges-for-lock',
+ label: 'getChargesForLock',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/check-claim',
+ label: 'checkClaim',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/unsubscribe-email',
+ label: 'unsubscribeEmail',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/re-subscribe-email',
+ label: 'reSubscribeEmail',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/send-custom-email',
+ label: 'sendCustomEmail',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/send-event-invites',
+ label: 'sendEventInvites',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/save-event-data',
+ label: 'saveEventData',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-event',
+ label: 'getEvent',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/rsvp',
+ label: 'rsvp',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/approve-rsvp',
+ label: 'approveRsvp',
+ className: 'menu__list-item--deprecated api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/deny-rsvp',
+ label: 'denyRsvp',
+ className: 'menu__list-item--deprecated api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/approve-attendees-rsvp',
+ label: 'approveAttendeesRsvp',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/deny-attendees-rsvp',
+ label: 'denyAttendeesRsvp',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/generate-apple-wallet-pass',
+ label: 'generateAppleWalletPass',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/generate-google-wallet-pass',
+ label: 'generateGoogleWalletPass',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/create-event-collection',
+ label: 'createEventCollection',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-event-collection',
+ label: 'getEventCollection',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/update-event-collection',
+ label: 'updateEventCollection',
+ className: 'api-method put',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/add-event-to-collection',
+ label: 'addEventToCollection',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-events-in-collection',
+ label: 'getEventsInCollection',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/remove-event-from-collection',
+ label: 'removeEventFromCollection',
+ className: 'api-method delete',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/add-manager-to-event-collection',
+ label: 'addManagerToEventCollection',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/remove-manager-from-event-collection',
+ label: 'removeManagerFromEventCollection',
+ className: 'api-method delete',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/get-unapproved-events-for-collection',
+ label: 'getUnapprovedEventsForCollection',
+ className: 'api-method get',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/approve-event',
+ label: 'approveEvent',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/bulk-approve-events',
+ label: 'bulkApproveEvents',
+ className: 'api-method post',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/bulk-remove-events',
+ label: 'bulkRemoveEvents',
+ className: 'api-method delete',
+ },
+ {
+ type: 'doc',
+ id: 'api/locksmith/check-privy-user',
+ label: 'checkPrivyUser',
+ className: 'api-method post',
+ },
+ ],
+ },
+ ],
+}
+
+export default sidebar.apisidebar
diff --git a/docs/docs/api/locksmith/sign-ticket.api.mdx b/docs/docs/api/locksmith/sign-ticket.api.mdx
new file mode 100644
index 00000000000..9c2e3d06924
--- /dev/null
+++ b/docs/docs/api/locksmith/sign-ticket.api.mdx
@@ -0,0 +1,71 @@
+---
+id: sign-ticket
+title: "signTicket"
+description: "Generate signature to prove validity of token."
+sidebar_label: "signTicket"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVk1v20YQ/SuLObUAbRpueuHNhyRwPtwillEUhg5j7lDckNxldodyVIL/vZglRcmSEjfuIb5YJHffvJl589GDa8kjG2evNWQQzMouTF4RQwKB8s4b3kB238NdIA/ZPVS0+ePRkoflsExAU8i9aeU+ZPCWrICREhjkzpNip1rv1qTWWBtteKNcodhVZM8hgRY9NsTkQ7RhBKRFLiEBiw1BBpb40fkKEvD0pTOeNGTsOzo0fTOeU0YLbshLahCyHnjTCoyxTCvyMAzJSTO1y6srrT2F8KypDy6vFI6HTxoL7I1dfdNWRZtr/ayV97RR16edmfGXAhJaZwMF+X55cSH/ngJ9Iu68DXs5QatVi5vaYcTPnWWyLDexbWuTRzmkn4Nc74/Nu4fPlIs+Wi/iYTManxCPeSZgu7rGh5ogK7AONCQwk/kvx+NfAq8ufjv2TmSpTFDWscKOS+fNP6Sj7MgXzjeKSxMU5nL+f3l7wOrQ/YZCwNVJfzQV2NUMGfztOoWeDtk6H5/IstD5Lv2j2CTAhuUZbhxf7aPANmyvjsO2KEkZpkZtJkYNVsaulGiSAqvCeaUdjXGlrybwT4+dp+A6n4/BK1xn9ffDEZuRyW8cv4mHx2j8fqpE7qxgSNSLrq4LU89x0F18Le3DW6xVIL8mr8h75396RBYleVKPGBTakZIyduuCZJNL2nryjHamYN1G914LFExV1xCXTkbDKs6E2MoySNeXKbYm5Tgr0n5q00Pa73XSIe1jrxtSKfc4UAR+7PWdryGDkrkNWZrKrdAYLs87K7/PWu/Y5a4+z10Dh73xT+90F0tCjYxBWu1TxMC4MnZ19mPIt+OtGXa5m4K3kssxO+MsnFMjJrd9Wp4fCD15SKYfb5xvUPL17q8FDAlc7YSyB4KteU+b3ZTA1pxV8UUcIV868hsZKWBs4eK9KXV30S31YesnJCBBHv25PPJwPhfnstEU1APmFVmtis7GoGItc1paAElhRCXFPBu7SlRDjBoZVWDncUVJnCfWsSkmr1TpXBVHY21ysiHKeHLr4/UietG6wA3avS+iETXvHk9I97s6+/EdY4ov01dO2xqNlRxErfSTmu9hLXHC1sjxLYNst3pkT9eDbDvBo6yXCZQusMD0/QMGuvP1MMjrMWfZ/TKBNXozlt59D9oE+a3n2v+ms798mnaEX9XTBeekU1slWVHNGutOniCRhWNvk5JSeRGDw73nBRz24/hiHrvN6AUMxtQNyyGBklDHnbafvl3lObW8d+uopUs/mBvi29cLUU0nEprL+KD2I/pJRn0/nliITodhJhh1KwSH4V83nAip
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Generate signature to prove validity of token.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/ticket-qr-code.api.mdx b/docs/docs/api/locksmith/ticket-qr-code.api.mdx
new file mode 100644
index 00000000000..c3dd09d5406
--- /dev/null
+++ b/docs/docs/api/locksmith/ticket-qr-code.api.mdx
@@ -0,0 +1,71 @@
+---
+id: ticket-qr-code
+title: "ticketQRCode"
+description: "Get QR code for the key."
+sidebar_label: "ticketQRCode"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVk1v3DYQ/SvEnFpAtgw3vehmFInhJjEae42iMPYwFkcSI4mUydEmW0H/vRhK++H1xkZ9yUkiRb158+aLA7iOPLJx9kpDBmzymvjLzR9OEyQQKO+94TVk9wPcBfKQ3UMvzwQal9ef0WJJHpbjMgFNIfemEyzI4JJYfblRudOkCucVV6RqWp9CAh16bInJh4hr5HiHXEECFluCDCzxN+drSMDTY288acjY93Ro5Ho6p4wW3JBX1CJkA/C6ExhjmYTeOCZHzYgLF1p7CuFVU59cXiucDh81FtgbW/7QVk3rK/2qlY+0VlfHndniLwUkdM4GCvL9/OxMHk+BNtKbFksSvNxZJstyMu6lpSlksbNj+6bBh4YmZuM4jgm8O/vtObYkgjJBWccKe66cN/+SVuxUR75wvlVcmaAwl/MHtrHrGpPHhEu/BoEbnrvqHr5SzqLdllKBTaAEOi/5ymbyvKUQsKTnIomsBfYNQwb/uF6hp0O2zscVWRY6L9I/YCG6sGFZw7Xji30U2Mj27rlsi4qUYWrVembUYm1sqSQjKHCsEu1o0pW+m8A/XTtPwfU+n8QrXG/1y3JckiVv8mvHH+LhSY3fjyXonRUMUb3om6YwzVYH3cdtKV5vsVGB/Iq8Iu+d/+mKLCrypL5hUGgnSsrYjQsSTelzsyev5M4s1m10771ARb3GBFriykk7Loljv+QKMkhX5yl2Jp16dDrMTXJMh70+NqZD7DRj+uhjAxfwqc/2voEMKuYuZGkq/4TWcHXaW3k/6bxjl7vmNHctHPalv7zTfSwINfEFaXNPEQNjaWx58v+Qb6e/trDL3dS5lUhOsZlmzzYwYnLTI2X9QOjjUJpePjjfokTrz78XMCZwsUuTPRDszEda7zo0duakjhuxfT/25NfSzsHYwsX/5sDdRbfUp42fkICIPPlz/szD7TnVebcymoJ6wLwmq1XR2ygqNobXsQGQlEXMoxhlY8tEtcSokVEFdh5LShRaLSVpitkrVTlXx7HUmJxsiEk8u/X5ahG96FzgFu3el8mETOl53D/hPewK7aVhPovJ9J3TrkFjRfCYGMOcuPewElGwM3I82oQEst2Mz57O4WwzKh89LBOoXGABGYYHDHTnm3GU7Sk82f0ygRV6M9XY/QDaBHnX2yL/oVO/3Myj+Ff19B5x1KVN0lhJkBU2vawgkbm+d2GRqngTg8PrxRs47Kv4Zh67C8gbGEyBG5djAhWhjtfFYf52kefU8d5fu1uI1Py25V2+X0iy9JI521I9qO8Ie5TKMEwnFq4mO45bZixrYTaO/wFz6MZr
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Get QR code for the key.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/ticket-verification-url.api.mdx b/docs/docs/api/locksmith/ticket-verification-url.api.mdx
new file mode 100644
index 00000000000..b8e36ba1a5b
--- /dev/null
+++ b/docs/docs/api/locksmith/ticket-verification-url.api.mdx
@@ -0,0 +1,71 @@
+---
+id: ticket-verification-url
+title: "ticketVerificationUrl"
+description: "Get the verification URL for the key."
+sidebar_label: "ticketVerificationUrl"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVktv20YQ/iuLObUAbRpueuHNh8Rw4rhFLKUoBB3G5EjckNxldodKVIL/PZhd6q3EjS/RRdzXN/PNuwfbkkPW1twVkAHrvCL+SE4vdB62p66GBDzlndO8hmzWw9STg2wGnfwnUNu8eo8Gl+RgPswTKMjnTrfyGjK4JVZcklrtgarph3u1sC4cVLS+hARadNgQk/NBiJa3LXIJCRhsCDIwxF+sqyABR5877aiAjF1HxxIf4j2lC8H1eUkNQtYDr1uB0YZJdB2G5KwY4XNTFI68f1bUvc0rhfHyWWGenTbL78qqaH1XPCvlHa3V3XkyW/y5gPjWGk9ezq+vruTvEOjt418Pyj59opxVbg2jNtosT93TBafLDTIsMNi29XiYfvKC1e/pYrq6xqeaIFtg7SnZKBcliW+dhBnrqNrqKLxO2CTHiEP4JfDq6o9TUhKOSntlLCvsuLRO/0eFYqtacgvrGsWl9gpzuX/5M7yOaZzwPOTVkPe4pHN8ClpgVzNk8K/tFDo61ta6sCLDos4P1T+xTQKsWdbwYPlmHwU2Znt1arZJSUozNWo9atRgJcEgoUieQ3oWlqJd6av2/Mtt58jbzuXReAvbmeLH5rglQ07nD5bfhMvRGn+ey4ypEQyx+qKr64Wut3YourAtVcMZrJUntyKnyDnrfrlFJiU5Ul/QKzRRJaXNhsImtUcmz8TOaKzHQO+1QMGYdQ1xaaU7LCkks1SwDNLVdYqtTmPLSPuxOg9pv1dAh7QPJW5I95M+NBQRE0u9VJsMSubWZ2kqr32jubzsjHxftM6yzW19mdsGjkvj384WXUgNFTUHqbSHiJ5xqc3y4ueQH+OrLex81wUfxafRS7EXbl0kIjdlWtZPhC40yfjxxroGxW9v/5nAkMDNLmD2QLDV72i9axLY6osqbIQO8rkjt5aOAtosbHg3unAaaKn7DU9IpNb6yOf6hOH2nmqdXemCvHrCvCJTqEVnglGx1rwOpYAkQUJEBX9rs0xUQ4wFMirP1uGSEoWmkOTcdZLS2ip0xlrnZHwI55HW+7tJYNFazw2avZMoQn08mBhCSzog0O9y739PGaOJmb5y2taojbihi00oBvYMVmIqbLVcD5pAAtlu+MgOB4Rs08MPInyeQGk9C1zfP6GnqauHQbaj+7LZPIEVOh2zcdZDob18F9ty8F2uv30Yp4Xf1eGoc5bcJqiMBNAK605WkMjosTdTSda8SIPjCegFOuzb88V67GakF2gQXTjMhwRKwiKMt/14dpPn1PLeq5MqL6VhWyNvX08kejoJpW1GH5WBgH5Wo76PNya2IjMMWwVZ1qLgMHwDuK4QlQ==
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Get the verification URL for the key.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/transfer-done.api.mdx b/docs/docs/api/locksmith/transfer-done.api.mdx
new file mode 100644
index 00000000000..5bce3468e41
--- /dev/null
+++ b/docs/docs/api/locksmith/transfer-done.api.mdx
@@ -0,0 +1,71 @@
+---
+id: transfer-done
+title: "transferDone"
+description: "Finalize the transfer of a key to a recipient. This is to copy over any locksmith related data to the recipient's account."
+sidebar_label: "transferDone"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNVk2P2zYQ/SvEXHrR2u42J93SNinStGhQe9GD4cOYGlmMKVIhKTuKoP9eDCnZ3tVm0QJFW18s8WP45s28R/VgG3IYlDXvCsghODS+JPejNQQZeJKtU6GDfNvDgycH+XY37DIoyEunGt4HObxVBrX6QiJUJKYQwpYCxZE6EaxA4UiqRpEJC7GplBfK87i0TSfsiZxA0wlt5dHXKlTCkcZAhSgwIK/jwJcI33iBUtrWhAVk4OhTSz58b4sO8h6kNYFM4EdsGq1kTG750TPSHrysqEZ+Cl1DkIPdfyQZxjjKUQH59kLDWh0MhtYxF/ZsyEEGDBIyCPZIBjIwFM7W8UhBWGhlCHYZNI55DYp8PGoW7nq+D06ZAzyldFOR8NNypvIRtdIWJDyZMONmAcMEdXbGMIJ/biKl89zMlOB1zrT1nhzPXVKeT8Yfs+oba3zi4X614r/Hma5bKcn7stW6u2ToqJha5ya17J+pbk3e4+GZOk0TcxrGbF6tvp0nwLrgdjY2CGxDRSYwLiq+DvhlrKbVGveaIC9Re/rLKLkeJbY6pP5xJM7oBRpBzlknlBFMcqm0Moexa6J0FvMzOdmgAr/DT2TIKbkmdyL3hkPBxMZ3czY2U49OdFinvlAh9jfy/j8U8tUc+nvqIurStuaF4v1LIIcMagqVZVturOewDYYKclie7peTUJbF5NRcHR+NunUacqhCaHy+XF5YX7SGn+8aZ4OVVi+krWe+88HZopX8IlLBYcieRvQBD8oc7v5e5HXadQm7u14vayYykZIumQsjfCRnFxdADntCF104Pby1rkZu95//2LAfvX4ssTEINuo9ddzkWI/vd8c4oBjYp5ZcB8w3F/b363Xy5jPWjaavOPhVdaPdXgeSy17fR3O9Dlw8dXXroauBEZU2HjiK7yEyK365kQ7XOVF6PyP5sk40zp5UQV7sUR7JFKJsTawrahU6UVonyOA+eYGSRwrKHDJRU8B46fpgHR4oE2gKVoUqR2JFZe3Rszy0kmR85Gdk9td3m0gk92uN5mbmcnWNXxaPYN/c2v/tt8TYMIE+h2WjURluqtj8/Si+LZyY9QkYZ2LTlV+xRvMt9P0ePT04PQw8nLor3+4yOKFTyWO3uyGDirCIX1Q9cDfm8EMi4W7DKHi5blO7PrEeVmTa8VpKasKLa3c3NvLht/WGtTN+KtW24D0Oz2xZeIYcuJtjUaIY41gPGs2hjU4FKSaXmK39RmNPhBmzmuRnuhuEfZ9WbFgTwwDZmErSyLAbhuFPIsyzvw==
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Finalize the transfer of a key to a recipient. This is to copy over any locksmith related data to the recipient's account.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/unlock-locksmith.info.mdx b/docs/docs/api/locksmith/unlock-locksmith.info.mdx
new file mode 100644
index 00000000000..f1f882792b3
--- /dev/null
+++ b/docs/docs/api/locksmith/unlock-locksmith.info.mdx
@@ -0,0 +1,117 @@
+---
+id: unlock-locksmith
+title: "Unlock Locksmith"
+description: "Locksmith provides backend functionality for enabling ticketing, metadata storage, and notification hooks."
+sidebar_label: Introduction
+sidebar_position: 0
+hide_title: true
+custom_edit_url: null
+---
+
+import ApiLogo from "@theme/ApiLogo";
+import Heading from "@theme/Heading";
+import SchemaTabs from "@theme/SchemaTabs";
+import TabItem from "@theme/TabItem";
+import Export from "@theme/ApiExplorer/Export";
+
+
+
+
+
+
+
+
+
+Locksmith provides backend functionality for enabling ticketing, metadata storage, and notification hooks.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Security Scheme Type:
+ |
+ http
+ |
+
+
+ HTTP Authorization Scheme:
+ |
+ bearer
+ |
+
+
+ Bearer format:
+ |
+ JWT
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Security Scheme Type:
+ |
+ apiKey
+ |
+
+
+ Header parameter name:
+ |
+ api-key
+ |
+
+
+
+
+
+
+
+
+ License
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/unsubscribe-email.api.mdx b/docs/docs/api/locksmith/unsubscribe-email.api.mdx
new file mode 100644
index 00000000000..e689fd527bc
--- /dev/null
+++ b/docs/docs/api/locksmith/unsubscribe-email.api.mdx
@@ -0,0 +1,71 @@
+---
+id: unsubscribe-email
+title: "unsubscribeEmail"
+description: "Unsubscribe email from lock"
+sidebar_label: "unsubscribeEmail"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVs+v2zYM/lcEnjZALyketotvr0A3vK3biibBDkEOjMTEamTJleR0geH/faDsxM6PoVh3WC6xHIr8+JEfmRZ8TQGT8e5VQwGNi802qmC29K5CY0FCJNUEk05QrFtYRQpQrDfdRoImNqz5LhSwGm8K4qtiF3wlrFcHkFBjwIoShZjdGL5RYypBgsOKoABH6YsPbBvoc2MCaShSaOg2zu+9nTB6xuBUSRVC0UI61ezGuER7CtB18mEYxvOidaAYvxrqvVcHgb3xw2AxBeP20DEbgWLtXaTIvz+/ecNf1+4WjVIU466x9iQmROsHfCnvErnETrCurVG5RPNPkT2190j89hOpxEQHLmgyPY7Yh5wYbr23hA66/JHwwyOkr+6I1mhhXN0kEUiROZKeibeoBVNGMc3+C0jXWItbS1Ds0Ea6RV1RjLine6K5QDtsbIICPg58i63XJ9HHEiYK02Of3YfpJFAIPjzyO5pyIzAxySQ+ws/kKBg1UPLW69O77KSn78dH9K0cuxLJC671ztgzaUI3+TU3aXBoRaRwpCAyrP+d0WVJgcQXjAJdD0kYd07BuL1IJU3Lf0vvPWmLnN7IVyeholR6njS1j7lfWZ0FzI/P86yCp0EWmcs4n8hk3g4jopuzSOK8nWi5y4OKo/UDpgkWCihTqmMx7+0rk8pZ4/j5qQ4+eeXtTPkKbmX/IXjdKD6IPgHgWXLtMSbcG7d/+neeF/2ti9vNOF0XXNq+WP2MvVSKQ56HT1YwYaAAcnj4yYcKuXy//LmETsLL2DcTJ1ibX+k0jkGszdMhv8gz8nND4cQzE4zb+XxvqOQqpyXen/MECUxyn8/zXYYXO1EHfzSaotiiOpDTYte4TCpak05i54Mg1kluLKMOlIzbS1FRQo0JRUw+4J6kQKeF88nshqxE6f0hz2NrFLmYu3pI67fXZc6Cm6tCN/ll0kjivNmuoLej+L6yywZKE/2V5rVF45j23B7t0M5rODI1Dxoa5BQJSCjGvZd7iV9Nd9RGQslKKdbQtluMtAq26/h1X7NivZFwxGB6Ja5b0Cbys76Mgn9M87uPw/r7Xlxv1YcZnjvJcdcc0TZ8AgncRuP6Zql8E4LbZfsNGKa8dZtOQkmo8/+VdrB4UYrqNLl7N2VZk5cZ9eGPxRIkYMNFHVfotQCz+4fA2ra3WPoDua674Ex8ZoRd9zeggFG5
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Unsubscribe email from lock
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/update-application.api.mdx b/docs/docs/api/locksmith/update-application.api.mdx
new file mode 100644
index 00000000000..24997d677a3
--- /dev/null
+++ b/docs/docs/api/locksmith/update-application.api.mdx
@@ -0,0 +1,71 @@
+---
+id: update-application
+title: "updateApplication"
+description: "Update application by id."
+sidebar_label: "updateApplication"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNlk1v3DYQhv8KMWd5N3DTi24OkBRO26CIbRRF4ANXHK0mS5HMcLiJaui/F6T2Q/UuXPdgJKclueTw5cNXnHmAoFn3KMgR6k8PQA5qCFo6qIDxSyJGA7Vwwgpi02GvoX4AGQJCDVGY3BrGCpzu8wAZqMBgbJiCkM+xrkKw1OjcU2QWMN5X4ANyGbk2UEMKRgvO5kEFEZvEJEPRdBeRof50n5f+O/hdWar0bI/VULaZ1GOUN94MWXLjnaCT3JxNX36OOdDD6dn86jM2AhW4ZK1eWYS61TZiBYGzfiGMefp08sdITpaNFWxweHpipjxW8FVbi3JlDGOMzwk9ViAkuT+nXQ4+jvlfxhi8i5Pgy1ev8s85kGZOMjN8KWhkZotc6lfIZ5H9sHB3YF+fY3ntttqSUeRCEsXYIG3RLNQbbdTOlC/JtscY9fosNoOtTlagho87R6iVN4Oa9lIUFU3aF2cZI7PnZ1CeIfsFHTI1OyTZkm9LkD2+n85YMSJnKc6L0kk6z/Q3GiVeBeTWc6+ko6h089ImfRbIv3xSmvGxWs+lh06ynCflP2G4D16u5lEO2F6fYrvtUJFgr4adol5vyK33jlOtZ2U8TlzxG/0AJmSMPnEzwWt9cuZpHDszffDyrkyeaPx89j1zOUam3iZrW7IHDiaVYXKC7LRVEXmLrIq3vzuR2w4Z1VcdlXaTJEVuf4R8m9Lh/A35b1g35XjHj26soEfpfE68IWXdJdnXsNxeLmcHjsu6JPMJz1QbJLZQQycSYr1cWt9sYk/SLZLL7YvAXnzj7aLx/UkZ8Ad7k4rn1SQJxupxxCh6TW598f8i30yrDmHvj9XDTb6sCf9UQxzY5y1hV9Hk/go1lxw0Nd557nW+kPd/3ubyZv7yH4PoQL/iAIfqRwe62JSBUkV9Scg5A1eQzfPxWI68/ab7YPFYPRytUNLYsfsoW80KLnKtL1J2131XSKnf9uiggnxvE6LLE2iHeSqw35LBqFa62aAzqk2u3JO2JEN5NjB/TMV91GxQyK0r1aNoo0WrKJ71GiulnckfMrX7SqzzfhOzSy016OL8vL9f32Y3/gMGl7Ed
+sidebar_class_name: "put api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Update application by id.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/update-checkout-config.api.mdx b/docs/docs/api/locksmith/update-checkout-config.api.mdx
new file mode 100644
index 00000000000..f78984b07f5
--- /dev/null
+++ b/docs/docs/api/locksmith/update-checkout-config.api.mdx
@@ -0,0 +1,71 @@
+---
+id: update-checkout-config
+title: "updateCheckoutConfig"
+description: "A new checkout config is created or updated if it already exists"
+sidebar_label: "updateCheckoutConfig"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVktv4zYQ/ivEXLoF5DgNetItTbdF+gCCjYMeDB9ocmRxTZFacmTHEPTfiyHlR+wk6AKLri8WSc3rm28+qgffYpBkvLvXUELXakl4V6Na+47uvKvMCgqIqLpgaAflvIeniAHK+WJYFKAxqmBatocSboXDrVCjtVDJXJgoVEBJqIUPIkfQwlTCkJA2oNQ7gc8mUoQCWhlkg4QhplhONgglGA0FGA7RSqqhgIBfOhNQQ0mhwwKiqrGRUPbgOmvl0uL+hHYte4gUjFvBcJ7yrDaRM/RpQ9orcV+Jne+E9u4HEq2MUUgn7n8thMzV5aK2xlqxxH1lB7NTA6rxrdeBweMiMNIvXu84c+UdoSN+lG1rjUptmX6OnGh/UuJYkl9+RkUvwJiD2rcsIbcooA3cYTIYEzoJz/4SldHuFe9Sa5OxeThxxeAO6cfxY+tdzBFurq/57yXKd2eUqHxI6BzIoK+g+F8AMPrV8t/EZbn7ZnC9zNN6tY6X+eXtr21DASOxbuky3QIqHxpJUAKjPSHTINcwgv/fTYYCyBCPFpwpRObBz9c/Xbae1YIHzHkSsqMaHXFj8Z2Ov9/s44BX0kY8B7DBGOXqlWby5Feys5SmHgOKrUyjiiH4IIwTVWdtZaxxq0TOcTyvLmOeIvE7OgxGPWLYYPjIrmAciwap9iyqbUdJ2aiGEqabm+leIae90UOSVzbOitcFCyXURG0sp9NEh8ZQfdU5fp60wZNX3l4p38C5mD0ErzvFC5HzgaE49xhJroxbTb7O82O2OrhdHO+ER+5Uxj7fDAfgOSSM2szrJcqAAYrx4bc9xf74Z8Z8vH3JgNGJbM2fuNvPc1pP1mkj3QdfOgy7RE2WiU9HRf34LJvW4lH0jjw4DC+bGVf5FG7s51NCQ/y1hwcK4N5kGG4ugDm8J9rgN0ZjFEup1ui0qDqn8sQa2iXJQyeXmV5GrZGMWxWiQZJakhSRfJArLIR0mqfFVCMYovZ+HZmG1ih08bSmv+9nqfjWR2qkOznJ0y0Oynu4y1/kf3LrfIvbe+wZ4TNNWyuNSzrD/OtH/s9hwyDuo0ABpdEsg7WPxMd9v5QRn4IdBt7O/S3niwI2Mpg8hPMetIn8rA8q8GZZHz6Nqvuj+F6X/RvA7BnumM0baTteQQFM7/TNMyyGAmqUOn1w9ePBXS5tMmPzo+HFlcmzny1ulcKW3n13caJXD08zHtLxs6Txmk2C3PJNK7c5xwxhmvq014OVbtUl5YXsknnJin8yzGcKkIp6FYW+z2/M/BrdMBxAIV4zLsPwLxDxtyo=
+sidebar_class_name: "put api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+A new checkout config is created or updated if it already exists
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/update-event-collection.api.mdx b/docs/docs/api/locksmith/update-event-collection.api.mdx
new file mode 100644
index 00000000000..5c9a4d9ab27
--- /dev/null
+++ b/docs/docs/api/locksmith/update-event-collection.api.mdx
@@ -0,0 +1,71 @@
+---
+id: update-event-collection
+title: "updateEventCollection"
+description: "Update an existing event collection"
+sidebar_label: "updateEventCollection"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNV01v20YQ/SuLObUAbRlueuHNDZzC/QiMWEZRCEKxIkfiRuQuMzuUowr878HsUhJN0XadHNKTqP2YnX3zZubtDlyNpNk4e5NDCk2da8brDVp+68oSM5mBBDxmDRneQjrbwb1HgnQ2b+cJ1Jp0hYzkw5TVFUIKvmxWkICxkEKtuYAECD81hjCHlKnBBHxWYKUh3QFv67CHydgVtGI1R5+RqcPhKdwHp5S2Cj8bz8auFIqHKuu7KAeg519cvhWrw/MyZxkty5Su69Jk4dKTj16O2J264xYfMeNHjs+ADZcIj/1LoNJWr5Cu8pzQe/QguJAAywZ9sBn2nd51cNOR+cxtkG4qvRrfvtDWSjBGpkpj1743o4n0VoLCWPmxiw5cDrMjdhsqx6LWtiNAvHz6cX+yRwkG9AsRjQcQ+trZzvLlxYX8PObKXZNl6P2yKcutimzOx9jy1XR4jFIg+hhK/4eIH3zWeW7kPF3ejsT4GINvi2ACGaHgfcWn0wksHVWaIQWJyRmbCgObYohesyVE81XM7qdwqFDJoUIFnIcJrZnJLBoeS+VY4UbQf5IK5slYvkSFnh9feVsmbfifsCKBjS4bHClOxzVjTsRdoxk/zNln07hL4TcXP51mrXQUZbyyjpVuuHBk/sVcsVM1krBAcWG80sHQ+bekr23KUi/Ev6UuPQ6xqND70WhJsJa6KYWNf7tGacKht47CP7Qs7jzr/sCLPmrvHV/1rRxge3MK27RAJTRQ286jSq+lO3atUC0dqdxhxDX0zu+OHaF3DWURvKVrbP48HL+iRTLZe8fvwuKIxs9jpf/eig1BXar/0pQHHPImDBvLSFaXyiNtkBQSOfruiEwLJFQP2geBIy4pY/dXkGhygfubvMCdDqy7cL1rMbVP0wq5cCLw6iY0MdFkKUw2l5NQTc+OvXGyk0LWBs0nZqKuC00fCubap5NJ6bK1rwwX542V77OaHLvMleeZq2Ao327J5U2wraJn0CZDi571ytjV2ess38VdB7Pzo1C9k5jFKES5egiBHAmd/pT/C9SEBEn38W7fc377ayrl7+pIiH4Rrs3vKFW4E7y6NmfrMBA076cGaRtaonDow1GZXn/WVd0Jgy5oPUr073YY7uuB4+heBhxHuu4/O+VahHpft+djXX62n55Lw7JL1/fwPoRC/bGPjbQSJB/9vDzx/LBO1eQ2JkevFjpbo83VsrFZFCKGt6E8oSRtYLnJ1ijaPlEVss41a+XZkV5horTNpWCYZRcJVTi39ufh1hlaj8fODH/eTAPytfNcadubiVpDhb6kHj1vBo34UA/+49OjA5zxM0/qUhvb08kx1WawEaCGyQYJpEE3zBMonGdZuNsttMd7KttWhiOV0tlcOjGZmPmzHeTGy3d+KD1P3uGHD50g+FE95eue1XZ7kAkpQAJC6e411wozCtR5ePvtuqm38ZSzaV9hpKdVVDI+7rjKMqz52bXzXr26vZ8K27tHXeVy2UL6QXSOfoheunDpkOthbAeltqsmZkw0KYSQ5txL4UHe9zPnMQ67XVwxdWu0bXuAheW/4NK2XwBMv1XN
+sidebar_class_name: "put api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Update an existing event collection
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/update-key-metadata.api.mdx b/docs/docs/api/locksmith/update-key-metadata.api.mdx
new file mode 100644
index 00000000000..bd584d66fa8
--- /dev/null
+++ b/docs/docs/api/locksmith/update-key-metadata.api.mdx
@@ -0,0 +1,71 @@
+---
+id: update-key-metadata
+title: "updateKeyMetadata"
+description: "Update or create metadata for key."
+sidebar_label: "updateKeyMetadata"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVlFv2zYQ/ivEPW2AEmdZ96K3bGiHNE0WNA6GIfDDRTxbrCVSJU9OPEH/vThSthUnTZq81E8iTX53393xvuvANeSRjbOnGnJoG41MZ7Q+J0aNjJBBoKL1hteQ33RwHchDfgOVK5bnaHFBHmb9LANNofCmESTI4TriKOdV4Um+6gFPzZ1XS1ofQgYNeqyJyYcIbeRig1xCBhZrghws8Z3zS8jA09fWeNKQs29p39xFOqeMFtxQlFQj5B3wuhEYY5nE0b7PnjQjZE609hTCi6Y+uWKpMB1+0lhgb+ziu7aWtD7VL1o5o7U6fZrMFn+WQCjwn06v5cQ+ZuEsk2X5C5umMkVM9ORLEBvdCPqh8Y9X/1zsEmZsMHqcQEOVVnemqtQtqYArin4O3rnbL1Sw0G2rCm8rgnyOVaAMGi+lxoaCWNzAjYhtr6LWRlzB6nJ0Ryj18Se8Q+NsSFDHR7+9xEECgcYau1CShkyNDmcKrVZFG9jVaufkuFB/OI6PSL+OWgbvjn5/zEXenDJBWccKWy6dN/+TVuxUQ37ufK24NEFhIedf5e+rkxYCLuhxMUr5zrGtGHL4z7UKPe1763xckWVx51n397yQuLBhWcOF45MxCmzC9u5x2KYlKcNUq/XgUY1LqYDh0cQEa0cprnRvAv/02HkKrvVFCt7ctVY/H46/yZI3xYXjD/FwisYfR0dPFJEVDIn6vK2quam2cdBt3JYm6S1WKpBfkVfkvfM/PSLTkjypOwwKbXJJGbuhINnkkjZMXqidIVhXkd57gYKhndTEpRP5a1qOusQl5DBZHU+wMZNNF5l0gxz1ExGMMOlGutFPlrQOky629z6qpphJytb6CnIomZuQT9Ll2nB52Fr5Pmi8Y1e46rBwNewrwaV3uo1PQyXPQYTlIWJgXBi7OHgd8lW6tYWd7aT+SnKaspQEf5siMblRJVnfEnrykA0fH5yvUfL28d8p9Bmc7ApmBIKNOaP1ThOxMQfLuBEF82tLfi0CClJjn3ca9/4e66aiPf2Qg8bOXTQw5Po68lefNgGBDCQbifjxo1Bsz4kArIymoG6xWJLVat7aInVsw+vYM0heUiw9UyyJjV1kO6UJ7DwuKImKdWzmA31VOreME0NlCrIhshj4n59OI93GBa7Rjv5J85iScWA0kT1wvts90B8bu4YkMN3zpKnQWElULKhuKP0bWEmMsDGQ7SKdQb6bx2KpydbD2UkegeymKWeWQekCC2DX3WKga1/1vWynFOc3swxW6E16sTcdaBPkW29bxnep/vJ5GHZ+VQ+nvyfpbQrPSpGtsGpllfwdjZnyst7kwf5Q+AYfxnF8sx+7sfENHqSc9bM+g5JQxzm/G/77K1k7mArC7u4jPRDP042ToqCGnz07G3Xey+upNJFhkK2dlise72RSxrvkpovkY1eKex1UaBdt1BBIkPKKZMwYNZu9DhVJPRmIrksnpm5Jtu+3cWFZS1z6/hs7+JaO
+sidebar_class_name: "put api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Update or create metadata for key.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/update-lock-metadata.api.mdx b/docs/docs/api/locksmith/update-lock-metadata.api.mdx
new file mode 100644
index 00000000000..6ae980c6402
--- /dev/null
+++ b/docs/docs/api/locksmith/update-lock-metadata.api.mdx
@@ -0,0 +1,71 @@
+---
+id: update-lock-metadata
+title: "updateLockMetadata"
+description: "Update or create metadata for lock address."
+sidebar_label: "updateLockMetadata"
+hide_title: true
+hide_table_of_contents: true
+api: eJzdVk1v20YQ/SuLObUAbblGeuHNLZIiqeMasYQcDB3G3JG40XKX2R3KFgj+92KWlEhLbhPnUqA6cVezb+bNdwu+poBsvHuvIYem1sh07YvNR2LUyAgZRCqaYHgH+X0Li0gB8nuwIoMO1xRg2S0z0BSLYGqBghwWCUj5oIpA8lUNeGrlg5LHCrUOFOM5ZFBjwIqYQkw6jCDUyCVk4LAiyMERP/qwgQwCfW1MIA05h4aO9d70cspowY1FSRVC3gLvaoExjkks7rrsRTVi2FVv1zdVXR+ROFEWORi3hk68I1AU+TevdyJxjFx4x+RY/sK6tqZIIZl9iaKpnUA/N+HD3V83o2eNi0ZPPW3IavVorFUPpCJuKTllsM4/fKGChXpjLT5YgnyFNlIGdZCkYENRNO7hJsQOT1FrI6agvZ28EUpd+gnvWHsXe6jLi1++xUEcgcYZt1YSkkxNhDOFTquiiewrNRr5YkZ9t0NP2L+OYwaXF2/+f6TevERqXpIyTJXa+UZhIFXhRjgNuZ1M1p6icp4VPZnIrzL61XkZI67ptN6kTlfYWIZc0s83oaBk0so3Tp8CC182LGf4gxwFU9x4fpeEe2/8enFx6o2FEwzFXq0aa1fGHvygm3QtvSY4tCpS2FJQFIIP/7lH5iUFUo8YFbreJGXcnoJEk0vaMzn/LmfdJXpvBQqGqq+ISy/zpG44tXcuIYfZ9nKGtZnt62LWDl29m0mmx1k7ab9dGjyC3M+EJljIoWSuYz7r5SvD5Xnj5PusDp594e154Ss47tS3weumkIPqjQVp/88RI+PauPXZ65Dv+lcH2OU4Le8kjH1g+pl5iIqo3M8LOT8QBgqQDR/vfKhQQvXh8xy6DK7GHJmAYG3+pN04ubA2Z5t0kcba14bCTsYcSFp9GqfP2yesaktHnV0EjVv5pGAI7yLxV9d7h0AGEo2e+OWJKw5y0sW2RlNUD1hsyGm1alzRdxvDu9QmSIonZZspNsTGrbOxXUb2AdfUd0bn2awG+qr0fpM6oTUFuZhYDPw/vp8nurWPXKGb/NPvNImHmmw1z6xvx6J85eoyhIPpiWe1ReMkZCm12iHv72Er3sLaQDb6PIN83GlS0snVdP9YZlD6yALQtg8YaRFs18l1H9z8fpnBFoPpy/O+BW2ifOtDf/hHjj99GhaQn9XzjelFOvuUc5JeW7SNnCADybdxNZOa+iELjhepH7Bh6rdu2WVQEuq0qLaDxO+95rO54IwIJw1YWPQvroqCav5X2eWk1d0u5lLCw4JXeS1PAj7KHomPvbE+OSL1hHTXgkW3blLThh5SchgbyZtDqR/1h0TqRXe0bS8x9xtyXXfwDstZ/NJ1fwP05i0g
+sidebar_class_name: "put api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Update or create metadata for lock address.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/update-user-encrypted-private-key.api.mdx b/docs/docs/api/locksmith/update-user-encrypted-private-key.api.mdx
new file mode 100644
index 00000000000..4067ca03f5f
--- /dev/null
+++ b/docs/docs/api/locksmith/update-user-encrypted-private-key.api.mdx
@@ -0,0 +1,71 @@
+---
+id: update-user-encrypted-private-key
+title: "updateUserEncryptedPrivateKey"
+description: "Updates a user's private key, using their email address as key. In the case of failure a rejected promise is returned to the caller."
+sidebar_label: "updateUserEncryptedPrivateKey"
+hide_title: true
+hide_table_of_contents: true
+api: eJzNVk1vGzcQ/SuDuTQF1lIQtJe9OYFTuB+AYUvowdBhvBxJjLgkww85wmL/ezHclWRLcoCiOVQX7Qdn+ObNm8ft0HkOlLSztwprzF5R4nnkcGObsPOJ1V3QW0r8B++wwshNDjrtsH7sUJZh/bjoFxUqjk3QXhJhjfOSJgJBjhx+iuCHJLDhXQU5aruCtGYdgFvSBkipwDECRVkxgVsrr6GhyOCWsCRtcmAgCPyFm8QKfHCtjgw6QuCUg2UFyY1RxnCYYIWeArWcOMSC11LLWGPZ8nrYESvUAthTWmOFgb9mHVhhnULmCmOz5paw7jDtvMTGFLRdYS8ly2KO6aNTO1lxGts4m9gmeUXeG90UlqdfojDUnad2T1KaoA7Sk6Q5yttcSD4DUGFyG7aXoMlP0EXvbBySfHj/Xv5eN+khNw3HuMwGDiLAH4b7FcuX8L9R2Aj/l0uIP5KC+4H1yQ9EGoK7gKRC/katNzxuPLYbVGZRmrZbMlqBtj6nyQH3r5dwzy09mRK1zMYstTlPljhYMhA5bDlAgfSfSrTZGNkU6yWZyKc1txwjrfhS1YqXlE3CGmdrDgzPFIHsAAm03ZcwjvC+ksn5nkJH0qkQ+BtbDrp5KOXdFMJHwlpOayfW43NpjQxijVNRR5x2L1XUTz3F+OyCesubJPkw6jkYrHGdko/1dGpcs4mtTutJtnJ95YNLrnFm0rgWT83rLjiVG7mBAS/21WnGmGil7erq32V+GKIOaRdHQ32QTg69mb8eDNkSRyuS+yemwAGr8eKzCy1Jt37/eyZjdX2UyYsk5PVA0uiB5PXVpjwo9vc1c9ihtEOUdX80tpv9COyN6KiT0X9eTLS2S1f2HJs+L5TAn3uOsEJp0MDFhzN2DuvE3LdacYQnajZsFSyzLQ0ho9MOli4Ay0gVDepmw0nbVQUtJ1KUCGJygVZcAVkF1iW9HBmBtXObKFo1umEbS2EjJX/dzgoD3sXUkn3xZjgUQfoCB+nBqD0YeH1VSnec2//LUTjqIPG3NPWGtC0WLJruxpl7LB2WE7E+OSG/N3aLCtcuJgnvuieKPA+m7+XxoKn6cVHhloIejOGxQ6WjXKuDM71J3bv78Uj9Gd6qYC9vKz3YkslyhxWKtk9O+n7RV7hmUuWjpRuXfBp2u5pJomOKM7MVCxgirpuGffru2sULW7ubz2RWx4+E1ikJCfQsXxv0PKB1pfgy/OVZh4bsKheDxiGlKJOy9Okw0ydGUIq6yEfXDStmMrF9f6BnmOB+0ff9P2CYhJA=
+sidebar_class_name: "put api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Updates a user's private key, using their email address as key. In the case of failure a rejected promise is returned to the caller.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/update-user-metadata.api.mdx b/docs/docs/api/locksmith/update-user-metadata.api.mdx
new file mode 100644
index 00000000000..d1a8023e021
--- /dev/null
+++ b/docs/docs/api/locksmith/update-user-metadata.api.mdx
@@ -0,0 +1,71 @@
+---
+id: update-user-metadata
+title: "updateUserMetadata"
+description: "Update or create user metadata for lock."
+sidebar_label: "updateUserMetadata"
+hide_title: true
+hide_table_of_contents: true
+api: eJzlV1Fv2zYQ/ivEPW2AEmdB9zC9tUM7ZGuKIHHQh8APZ/JssZZIlaScGIL++3CkbMuym7VBNxSYXyxR5HfH747H71qwNTkM2porBTk0tcJA957cNQVUGBAy8CQbp8MG8ocW+BvkD9DwfwallatrNLgkB7NuloEiL52uGRFyuI94wjohHfETLxNVjy0W1glGOIcManRYUSDnox3Ny2sMBWRgsCLIwVB4tG4FGTj63GhHCvLgGhob/ZDmCa0Y18uCKoS8hbCpGUabQOxu12UnzbBDr5Vy5P0/mnpv5UpgmnzSmA9Om+UXbTEdX2uLmf86W7MERT68sWrDM8bI0ppAJvAnrOtSy5gCk0+eLbXH0Hb+iWTgKDlOmKDJ89dtIE/NNE1Z4rwkyBdYehovrZt5qeXzC7csLLAp2dcuA1RKs6tY3gzgeGIXLQSSgbf5/WC7DIIOvA6G5+LK1E2ALv6Ybl9b49PWLi9e8d9h9G4pNM6M8t/jmmKSvjgeRyw/txP29NXFxbFzV2aNpVZC86aEI0maHRNvUIk+k76vl+M08h6XdJzKgyjBbU+xmFu1EcmW0F7o5Pv5sZkuA3LOulO4h9kwDPIfZMhp2VPCB+htBNnS98sxffFkai+MDQKbUJAJzM1zof33+ZoW5Eg8ohdoRORBaCMWTVkudKnNUoSChsEdk3dMyR25NblDNk5k+rQgoQNVYmMbgY5EhSu219uKRV9ZSnTRk/4BcsuRt42TFF1a2MaoryLkgw3v4uQtG7+dZMMRJwcKac2i1DKci2mkvreJpSNUmx+Eiv8ibX49VYPuDcOIYLfGdgmjmjjM97YzWAofAZNz/wO+uozv2cKyPuM7J0saIofJ+nKCtZ5sr5NJ2yukbsIaxk/agZTpJnz1+Ek7kBxdFHdsLWmuxpWQQxFC7fNJwqh0KM4bw89nfL1aactzaSsYq5MbZ1Uj+UWkDQBLnkNEH3CpzfLs25Dv0qod7GyvSO84tClYSZfuIsUmtxqJ3+eELgrW9PDOugo5fH9+nEKXwevDytyDYK3/os1erWGtz1ZxIEq5zw25DUs74FS73Suut09Y1SWNFdJO8oykSgyxNgsbTW+1RmRGvN9SBRlwnBIll0ck7eaJ2tm1VuTFHOWKjBKLxsikCHTYxOpLfNRibmq5oqDNMhtokmAdLikTaBTXQ73oiRGFtauoPEstyfi4v56Z66tpJKK2PlRoBl9SRyHiFTnoKQ68b/dH+Fs6hj5KgZ7CpC5RG45kzLi2PyIPsGaqsNaQ7UORQb5vJWIu8tCh7I+HhYeHCn2WQWF9YNy2naOne1d2HQ+nVMgfZhms0el0wB9aUNrzs9pVmC/u+6fbXqL/LA77l5O73Cao4WRcY9nwG2TA2blvlPgEvsiDcVvzAh+GdL7Yj3HL8wI/hvHrZl0GBaGKLWzbz/g9WT6bMs4e4egq4V2kFa+lpDo8O3c2KNo391MuPH0rVlnFSxw+cseHj8lZG4mIlSyOtVCiWTbx+oEEyeeL1eWgQI2qWtzUSTraNs2Y2hWZrtuxE/ideem6vwHw+JsD
+sidebar_class_name: "put api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Update or create user metadata for lock.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/update-users-metadata.api.mdx b/docs/docs/api/locksmith/update-users-metadata.api.mdx
new file mode 100644
index 00000000000..d549fad1ee6
--- /dev/null
+++ b/docs/docs/api/locksmith/update-users-metadata.api.mdx
@@ -0,0 +1,71 @@
+---
+id: update-users-metadata
+title: "updateUsersMetadata"
+description: "Update or create user metadata for lock."
+sidebar_label: "updateUsersMetadata"
+hide_title: true
+hide_table_of_contents: true
+api: eJztV01vGzcQ/SvEnGnLMdLL3pwiKdw2hRHL6EHQYbQcaRlxyQ3JlSIs9r8XQ660kuw4NtCgPUQXLT9mOHwzb2bYgWvIY9TO3ioooG0URnoI5MNHiqgwIkgIVLZexx0Usw54EYrZvJddP5egKJReN6wBCnhI8sJ5UXrirzaQF/WgSiydF8aV60uQ4OlLSyG+c2oHRZeG2pOCIvqWzvWymiDQe9yJ0tmI2mq7OtXOSnmNbGSF2DRGl+lqk8+BtXQQyopq5K+4awgKcIvPVEaQYFtjcGEIiiWaQBIaz8hETYG3p/OP5JIlIEFHqsOL9I33mwFDcKOUpxBAJt3jqB5htxS3zq9hfm7NfmE8V9tIK/KPD+7lyWmjRIhe29WTAscGvUjgYPPrgW3ahdHl84L7gFhia9i1vQRUSrNn0dwdqeONfTohUhkZ639PbS8h6shyiQF7dtzapo3wrVXo84/dHxpnQ7709dUb/jsN8Ztng1tsK11WYothYJa6FLdLEauBYmg8odqJCsNBRgodxVYbI6yLYkEis1sJtEo0ngLZKLRNSlJA/0gGeQoZ5p8U+kmh11FIAnnv/Espgxl3CqncZN6MNMKQ2LAnEcjvxePgtAOT315dPbbk1m7QaCU030V4KklvmKLvUImh0P1IctUUAq7oqVA7OAc+DSlILJzaiXyW0EHobPvlk3F5QP7bIXzu29/IktflAAnX9/dJyR6+t4/hm1YkGHexc61AT6LGNftzgC45UjnKrqOv+n+ApqfgWl9SMmnpWquewO8xKn+5+CFtzmj88lQwPVjWIaITy9aYpTYHHFSbpjlVeYtGBPIb8iI56T9HZFqRp0QwtNkkLi7DFdibXGeOyPB9sO7T9cboyXmyctypcs6Q0GCsoIDJ5nqCjZ7saT7J/Rp3rqwhpMa19QYKqGJsQjGZcEoPtY7VZWv5+4JTniuduSxdDef95513qi15ILJR0MtzjSHiStvVxes032epg9r52G7fs7uyA3LTfUCfj+TbpQ1QwILQp9KVPz44XyO75Pe/p9BLuBlj4bgAN/oP4oxnsR7GF+s0odmwLy35Xcq+HD6fxm79/VesG0NHbfHsqJ5enVXLMVJOauI4fVz5DqXsrAT1fT/v2a6lSxfY14mEr/hzDzhIYG9nYK8fQX3YJxrvNlpREAss12SVWLa2zFVLx11KN8QkTFGryzVFbVdyrCIhOo8rkqmTsi7q5QCvqJxbB45uo0uyIaE04PvxdprgbFyINdqjldyXifTsEkfvrhPzu5Hdr3lmDc6O9DVOGoPackCkwO0G9sxgw1hho097p+zcuYTKhcjbum6BgR686XuezgFSzOYSNuh1pjK/C6EiVOmR2AEHVAG/ZssvpmwMbzdtjrizHMWkyhI3ZUlNfHbv/Cgb3D1MOfqHt2TtFIt43PI7E7dQAEhwCcjcjPJcBwbtqk15DbJKdg+2DMqBJWfUSpfaE8jujgzsurxj6tZk+x7kcJPIY+jnfd//A2xybTg=
+sidebar_class_name: "put api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Update or create user metadata for lock.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/upload-images.api.mdx b/docs/docs/api/locksmith/upload-images.api.mdx
new file mode 100644
index 00000000000..e1fdfa28464
--- /dev/null
+++ b/docs/docs/api/locksmith/upload-images.api.mdx
@@ -0,0 +1,71 @@
+---
+id: upload-images
+title: "uploadImages"
+description: "Upload images to locksmith"
+sidebar_label: "uploadImages"
+hide_title: true
+hide_table_of_contents: true
+api: eJyVVU2P2zgM/SsCz86kO9iTb23RLqb7VSAJeghyUGTaViNLrkSldQP/94KSk3pmkkHriyVRpPiox6cTuB69JO3sQwUlxN44WT10ssEABQRU0WsaoNyeYBPQQ7ndjbsCKgzK6579oIRN8hI6uQlywjh1CJ2mFgrw+CVioDeuGqA8gXKW0BIPu2hI99LTsna+W1SSJC8H1WKXRjT0CCW4/WdUBAX0nrMljYGt+bjZPum9HKAATdjN1wN5bRsogI+RBCXstZV+gDF/nGPonQ052v2rP/j3GOIqKoUh1NGYQeQq4RnxHRRzWLLvjVappsvPgb1/HZPHEA39CqgbAaI3z5GPBfRxb7Ta3LA6rxttZfef7PDqhk53mBevGCfs61v2oL/PDTZ2e/RsOOBw/TQkeWbDy3Brjaa6mbXyKAmrN9dO4WtHq1zFs2vmMzf+vEYH7gWhg7COhIzUoiW+cqxuc+FlGthojNwbhLKWJuBTnB2GIJsrKLkVaxkNs3rdokfxVQYhrUDvnRfaCqZsrY22jaAWxdSOd8/PZLCkiefwF1r0Wq3QH9G/41AwlaNDah1LRe9Cug9JLZSwPN4vczcsc3ck9WDvkMQj8RJaoj6Uy+VFH+6i5fGi946ccuZOuQ6eystH76qoeCJyQjAWTyMGko22zeL3Iq+y1yXs7qfkrfiqcvGz8F0qz0cyurSBxQSlRw/FNHh/FpkPn9ZMwtePKXBu617/jdzXNpGX54tDWtCc2JeISZ94WrvkN93MJsES/8wUlouc8dw/Q3jZJ3rvjrrCIPZSHdBWoo42FVUaTYOonRdo5T4TRasDkrZNIc69KAI5LxsshLQV817XEyrROndIImi0QhsSSydY/z6sEwomSyftzJJZIi5PzaO0Z8/Ey4/LVE3Cb7TsjdSWKz5pYGbmFo5cFX0+Z2LnroCWCVxu4XTay4Abb8aRl3Ppy+2ugKP0OjfIdjcW0KKs0hN4ysoFb3OSi6R8vN1Ezubau8aMzU6vlcKeZtufvRdMw0ubffx/tWZuTc9n5yr24cApbvFzmJNkNZrx7Ak5U/JnCtphlsXplHes3QHtOMKkzkA8h3E3juMPsL/Zfw==
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Upload images to locksmith
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/user.api.mdx b/docs/docs/api/locksmith/user.api.mdx
new file mode 100644
index 00000000000..4fc5dca7ddb
--- /dev/null
+++ b/docs/docs/api/locksmith/user.api.mdx
@@ -0,0 +1,63 @@
+---
+id: user
+title: "user"
+description: "Get user details."
+sidebar_label: "user"
+hide_title: true
+hide_table_of_contents: true
+api: eJyVVE1v2zAM/SsCz2pSFNjFtxy6ovsAhjXBDoEPikzHamTJleh0gaH/PlB2kjYNBvRkkSJpvsdHDeA7DIqMd48VFNBHDCChwqiD6dgNBTwgCb4QFZIyNs5AQkTdB0MHKNYDrDirWJeplBAwdt5FjFAMcHd7y5/35X4j9cEJavBDVe0doSPOUV1njc6dzZ8jJw4QdYOt4lPAl94ErKBYw6uyFmlRVQFjhFICHTqEAvzmGTWBhC4wSDJjT+/Di+EYHikYtwUJrrdWbSxCUSsbMSUJZIhtWPTUQErs+nIN2spxoiAv6t7a2ljBjWIkUfXZbRxhcMqKiGGPQWAIPnwK+SW4i24v0bYYo9riNZwV1qq3BAUsGwwoXlUUyo0tCeOOEIzb5llNSGb/Z+gBHQajnzK8ey6V+UoSWqTGs8a2mIeiqIEC5vu7ueqpmU/KG3mJWVZ9sFBAQ9TFYj63Xu9ia6iZ9Y7PN13w5LW3M+3bD5r9FXzVazbE2AskeVkxktoat735XOWnMetUtjwvwxNPaeR9XIkT6fxLRpcDoIANqpDxjoevPrSKJ/HtzxKShMVZAm+KqM58xwPzr9rJvtllh+HGXnoMB2Cqjat9zpuGssqwxI8jTpDAJI947j4gPMWJLvi9qTCKjdI7dJWoe5dJVdbQQdQ+CGTJZ40YvUMybitFi6QqRUpE8kFtUQrlKuE8mXpCJRrvd3nlrdHoYhboBOvn4zKj6HykVrk3N9dep+G8Olcfqok7wr8076wyjvnNOhgmDa5hzxywCkGO/yglND4S3w3DRkVcBZsSu0eSi3UpYa+CGbdgXSYJDaoqP4MD8FAKWGiNHUt9r2w/zutisVk7p7V4uF8euziP/EInufpRDe7wpvYwjBFLv0OXEsipCWIbUplS+gc58g8j
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Get user details.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/verifier.api.mdx b/docs/docs/api/locksmith/verifier.api.mdx
new file mode 100644
index 00000000000..96b67f56504
--- /dev/null
+++ b/docs/docs/api/locksmith/verifier.api.mdx
@@ -0,0 +1,75 @@
+---
+id: verifier
+title: "verifier"
+description: "Check if an address is a verifier of the lock. (deprecated in favor of eventVerifier)"
+sidebar_label: "verifier"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVk1v3EYM/SsDnhJAtgw3vehmFEmQNjGKZt2iMPZAS9RqstKMwqE22Qr67wFH2u913boospfVx4jz3iPnkT0U1DLlKFRAJtxRAr4lRrHevSsggxWxLS0xJBAo79jKGrL7Hu4CMWT3UPt8+QEdLohhPswTKCjkbFsNABn8VFG+NLY06AwWBVMIxgaDZhPX+NJIRUbjXJoXOzjGOlPiyscVtCInv0+fvIQEWmRsSIhDRGN1rxalggQcNgQZOJIvnpeQANPnzvKO4CHC23GdscWlcswrahCyHmTdahjrhJTbMCRnt1HcNyOxJ7d67/PlRoWzmwVh6xaP7rXR7J/upznaqi7edIEMBrOf0kcRzDV4aL0LFPT99dWV/h1ucHM+o26b0X22uXdCTjQKtm1t81hk6aegofpTKP7hE+WiuWYtSbEjEHL4UCvj7cIH72tCB0q/xK6WUY0h/hJ4dfXDKfIojQ3GeTHYSeXZ/kWFitQSl54bI5WyynX9f0LvurpWxJCVWAc6ptNQCLig0xTssYE/fWeQ6Rit53hHTux4ZB6Hf4RCdREreg+3Xm72o8BGtlenss0qMlaoMesJUYNL6xZG65CCmNKzKTyNutJXG+S7a8cUfMf5KF7pO1f8vRxvyRHb/NbLm7h4VOPHc+V/F0tRVS+7ui5tvdWh6OJjNQ92WJtAvCI2xOz5uysyq4jJfMGgphwhRa8dKWg29fROTJ6onUmsj5Heaw0F06lrSCqvDWRB8QyrkWWQrq5TbG268Yq0n2x6SNUu0n7PTod0Mo+0PzK+ITYj3XJ0/45ryKASaUOWxkChsVJddk6vL1r24nNfX+a+gWOP/JV90cVjYkYWoOZ7GDEILqxbXPy7yB/Hr7Zh57sO+lHzO2Zs7KPbdOmWG1+O3kbI0anHizeeG9Qc/vzHDIYEbnbFsxcEW/sLrXd9A1t7sYwPYlP53BGvtcmAdaWP303pvIu0zPsNT0i054SRz/UJw+0607Jf2YKCecB8Sa4wZeeiqFhbWUdbiL4dq8vmSxLrFolpSLBAQRPEMy4oMegKPai2nFiZyvtlbB+1zcmFWNoTrQ/vZpFF64M06Pbe7HW4A8T97uD9b5PJlAOhr5K2NVqneYr11E+n4B5WqiW2dtR3AzXbjSy6pz45nC5we5UdjwLzBCofRIP3/QMGuuN6GPTxmO3sfp7ACtmOB/m+h8KGqZFOTvKoUi9+m6aMl+ZwWDpLdVODTutthXWnd5CAFuBuKtND9iwExzPUMzDsi/psHE/PVs9AdpzVYT4kUBEWcdbup1U3eU6t7H1/0kLUa7YG/Pb1TGun09LbzUyHvhKjn8XW9+OKmV+SG4YtVNF7BTgM3wC82kZj
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+:::caution deprecated
+
+This endpoint has been deprecated and may be replaced or removed in future versions of the API.
+
+:::
+
+Check if an address is a verifier of the lock. (deprecated in favor of eventVerifier)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/verifiers.api.mdx b/docs/docs/api/locksmith/verifiers.api.mdx
new file mode 100644
index 00000000000..9017472d37b
--- /dev/null
+++ b/docs/docs/api/locksmith/verifiers.api.mdx
@@ -0,0 +1,75 @@
+---
+id: verifiers
+title: "verifiers"
+description: "List of verifiers for the lock address. (deprecated in favor of eventVerifiers)"
+sidebar_label: "verifiers"
+hide_title: true
+hide_table_of_contents: true
+api: eJzFVktv20YQ/iuLOSUAbRlueuHNhzRI6xhFbLcIBB3G5FDciNylZ4dyVYL/vZglJVGPNGmKorqIS87zm29mtoOcGqYMhXJIhVtKwDfEKNa79zmksCa2hSUOkECgrGUrG0jnHTwGYkjnUPls9QEdLolh0S8SyClkbBu1ACnc2iDGF2ZnxxSejZRkVNFgnjOFcGle7QMx1pkC155Vj9bk5Let8mtIoEHGmkRD0jisemlQSkjAYU2QgiN58byCBJieW8v73A5juxvkjM0vNbuspBoh7UA2jZqxTkiz6vvkrBtN4GaI/6uubqfJnnMWhK1bQq8IMoXGu0BBv19fXenfobnqCNWp6cw7ISeqhE1T2SwWc/Y5qGZ36tk/faZMFFjW0osd/DKFtpIwEURm3EACVqgO5wy4tqrwqSJIC6wCTTGZwxghLI4dbT+cYHFisE8OMP9mhS09v0lhS55THpyVjlT4O7vKhr5PQKzoEbZchn74JXB99ea0wnfebGlwaT7Sc0tBDGYr518qypeUX0KfwJurH05VtTONDcZ5MdhK6dn+SbkRbxriwnNtpLTBYKby/4oxJwU/rGxNIeDyLD45FdhWAil88q1BpuNoPccTObHDUPhy+MdVmYB95+VmagUGxH8811OPTo2on6KtqsJWhkfY8za+Vh6ww8oE4jWxIWbP/zt+DyUxmRcMBt0QUpyfQwrWLeOsHTP5ClrvyBHb7D6m91ZNwUjRmqT0ug6WFCeFzsEUZuvrGTZ2tp1CMx1Ls27soH7WTbq1j/tDDQ9ju+UKUihFmpDOZioYaivlZev0+aJhLz7z1WXmazgepr+yz9tYfjPECjqhDy0GwaV1y4t/Zvl+0NqZXeyX3r1WcajLsPp2RVGX25Gu5ydCjuNiePjJc41aqZ9/f9CevdlTZDpcG/sLbfbLBRt7sYov4uZ5bok3uonAusJHvbFojzEtc7vNExLd2WHI5/okw52cadivbU7BPGG2IpebonURVKysbOKaJm2JyCGbrUisWyamJsEcBU0Qz7ikxKDLtXttMWZlSu9XcRVVNiMXIoHHtD68f4hZND5IjW7yZXrROAi52/fXf3CbGOEX+kNmTYXWaYkilbqR5nNYK4zY2AHaYXoncQdDAun+tpFOt9MigdIHUf2ue8JAj1z1vb4eapnOFwmske3QjPMOchv0Od9Ngy/C8OrjuFhfm8M7zNlstgxzyqY1Vq2eIAGl1/6ypC30XREcX22+I4Ypbv2iT6AkzOP1shslbrKMGpnongxa7dXdmHr39kFL1mr9di121JfR+tm4um6QePArcn2/C1P0rAH2/V9klOmn
+sidebar_class_name: "get api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+:::caution deprecated
+
+This endpoint has been deprecated and may be replaced or removed in future versions of the API.
+
+:::
+
+List of verifiers for the lock address. (deprecated in favor of eventVerifiers)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/api/locksmith/verify-email-code.api.mdx b/docs/docs/api/locksmith/verify-email-code.api.mdx
new file mode 100644
index 00000000000..56591e1bd4f
--- /dev/null
+++ b/docs/docs/api/locksmith/verify-email-code.api.mdx
@@ -0,0 +1,71 @@
+---
+id: verify-email-code
+title: "verifyEmailCode"
+description: "Verifies the email code sent to the users email address."
+sidebar_label: "verifyEmailCode"
+hide_title: true
+hide_table_of_contents: true
+api: eJy9Vk1v4zYQ/SvEnFpAjhbB9qJbukiLbbvoYuO0B8OHMTmyuKZILkkpMQT/92JIJTZipx/YYn2xRA6HM2/evNEEzlPApJ19r6CBkYJu97c9avPOKYIKFEUZtGcLaOAP3tcURepIEJsJ6RSJSDaJ5PLyECnEeROVChTjFVTgMWBPiUKEZjWBxZ6ggWx2U6ygAs2XeEwdVBDoy6ADKWhSGKiCKDvqEZoJ0t7z2ZiCtls4HNbFmGL60ak9W7w8K51NZBNvofdGy5xy/TlyVtO5a7f5TDJx1IEBSpoi73KulwLgH8cQvbOxmF6/ecN/l+Arl4s4SEkxtoNheP6nCHuKEbeXgqwguR3Z18N/eyniDzpGbbfiWD3hgtB2RKNVTY+eURbjaV4M0jfJ6Dnut/+AdKaodUm0brDqW8b2wyVM7y1uDHG7tIMxrTZiZq9QQ17WNlGwaESkMFIQFIILXxW2HYzhS6Fp0UT613lw/7c4mAQNLDsKJB4wCrQlJKHtUwrMEW7+OZOr8zsZjqQTv8PPZCloeZfTu2VXMAPWU+ocK5F3MePNWtBAPV7X6HWdtaWeTlXjUBfRWuTFhSyyVZArUjMEAw10KfnY1LVxchd7nbqrwfLzwgeXnHTmSrr+TPA+BqcGmVlUooVD9dJjTLjVdrv4b57vyqlnt2sOWg5Bp/0d17FU5j5SOCkLXwmzFPL7hjBQgGp++MmFHrlWv/y55I6/OZLkxAl6/SvtuUJFg9HrxS4vZPn9MlDYAxeDefXpKKy3j9h7Q0chPNEWbVuXr5grfJ8REL89QQIVz5ZYUr8+A+PZTvjgRq0oig3KHVkl2sFm/NHotBetC4K4fzLhtNxR0nZbiZ4SKkwoYnIBt1QJtIp7/qgCnXO7PImMlmRjzmNG4MP7ZU6YSdejPdkp3BJ5IopLI3E6NuXXTMe5NIkeU+0NasugZppNcw+sYGTc0GuoIHuBCpoX8/O8FdYVdNxKzQqmaYOR7oM5HHi51LlZrSsYMejSqqsJlI78rJ614tV8v/s0j9nvxWspPFHOMr1GNAO/QQXMtxfT/7A+VNARKmb8appN3pXbFkt2dHRxJn/cluXEjZTk09/ark+E5uPvd0tuoPnLoS/MDvjAnyD4UMJ1OfvckXltAoN2O2TNhOKTf38BSxpB8A==
+sidebar_class_name: "post api-method"
+info_path: api/locksmith/unlock-locksmith
+custom_edit_url: null
+---
+
+import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
+import ParamsDetails from "@theme/ParamsDetails";
+import RequestSchema from "@theme/RequestSchema";
+import StatusCodes from "@theme/StatusCodes";
+import OperationTabs from "@theme/OperationTabs";
+import TabItem from "@theme/TabItem";
+import Heading from "@theme/Heading";
+
+
+
+
+
+
+
+
+
+
+Verifies the email code sent to the users email address.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/core-protocol/public-lock/README.md b/docs/docs/core-protocol/public-lock/README.md
index 0b0a96741c2..68d5922a4ff 100644
--- a/docs/docs/core-protocol/public-lock/README.md
+++ b/docs/docs/core-protocol/public-lock/README.md
@@ -6,7 +6,7 @@ description: >-
# Public Lock
-A "Lock" (`PublicLock.sol`) is a customized smart contract for minting (creating) ERC-721 NFT's. They are the Unlock Protocol version of a "minting contract". They are created with the [Unlock](../../core-protocol/unlock/) smart contract, which is a "factory" contract. That factory contract uses the [Public Lock](../../core-protocol/public-lock/) template contact along with
+A "Lock" (`PublicLock.sol`) is a customized smart contract for minting (creating) ERC-721 NFT's. They are the Unlock Protocol version of a "minting contract". They are created with the [Unlock](../../core-protocol/unlock/) smart contract, which is a "factory" contract. That factory contract uses the [Public Lock](../../core-protocol/public-lock/) template contract along with
with the configuration options you choose to record a new customized
smart contract to the blockchain [network](../../core-protocol/unlock/networks) of your choice.
@@ -17,7 +17,7 @@ Each lock is a standalone contract with its own deployment, address, and storage
- A given user may own only 1 key (NFT) at a time as a default, but that can be changed using the `setMaxKeysPerAddress` function.
Additionally, the Lock smart contract has multiple capabilities:
-- _Administrative_: these are the functions that change rights (see[ access control](./access-control/)) associated to the lock or individual parameters for the lock a such as its name or of course its price. Finally, there is a method to withdraw funds from the lock contract itself.
+- _Administrative_: these are the functions that change rights (see[ access control](./access-control/)) associated to the lock or individual parameters for the lock such as its name or of course its price. Finally, there is a method to withdraw funds from the lock contract itself.
- _Transferring key ownership_: keys can be purchased from the lock smart contract itself or from another user who purchased one previously. Another element is that keys can be purchased on behalf of somebody else \(this is important because this lets somebody pay gas fees on behalf of somebody else\)
- _Changing key attributes_: the keys have an expiration date which can be changed \(for an earlier date by the lock owner\) as well as data attributes which can be changed to something else.
@@ -63,7 +63,7 @@ For advanced users and developers, the lower level changes below are noteworthy:
- Replace `UnlockUtils` dependencies by optimized Open Zeppelin implementation
- Remove dev reward/cut when purchasing a key
- Add unchecked scopes on math operations (gas optimisation)
-- New Solidity version 0.8.21 (creating issues on some chains that wont support new `PUSH0` evm opcode)
+- New Solidity version 0.8.21 (creating issues on some chains that won't support new `PUSH0` evm opcode)
- Fix potential overflow when merging keys
### Version 13
@@ -84,7 +84,7 @@ Easily check if a key is ready for renewal
**Released**: October 2022
-The following are the signifigant changes and a full list of commits including bug fixes can be found [here](https://github.com/unlock-protocol/unlock/issues?q=+label%3A%22publicLock+v12%22+).
+The following are the significant changes and a full list of commits including bug fixes can be found [here](https://github.com/unlock-protocol/unlock/issues?q=+label%3A%22publicLock+v12%22+).
#### `onGrantKeyHook` and `onKeyExtendHook`
@@ -100,7 +100,7 @@ The configuration for a key’s default duration and available quantity (both pe
#### `expirationTimestamp`
-This adds the expiration timestamp on ExpirationDuration event emitted by the time machine when time gets added or substracted to/from a key.
+This adds the expiration timestamp on ExpirationDuration event emitted by the time machine when time gets added or subtracted to/from a key.
#### Events and schema changes
diff --git a/docs/docs/core-protocol/public-lock/deploying-locks.md b/docs/docs/core-protocol/public-lock/deploying-locks.md
index 3cc62c5905b..4a1cf8994d8 100644
--- a/docs/docs/core-protocol/public-lock/deploying-locks.md
+++ b/docs/docs/core-protocol/public-lock/deploying-locks.md
@@ -41,14 +41,14 @@ await unlock.createUpgradeableLockAtVersion(calldata, version)
This is the method the Unlock labs team uses in the Unlock [Dashboard](../../tools/dashboard/) so that we have time after a new version is released to update the UI to support it. Locks deployed using this method can later be upgraded to newer versions. Your application should verify the version of a lock to avoid unexpected behaviors.
-You can also create Locks from another contract that would call the Unlock factory contract. This can be useful if your applicatiion requires a specific lock setup (special referrer fees, metadata... etc), but also if you want to deploy locks on behalf of users and provide a gasless experience for lock managers.
+You can also create Locks from another contract that would call the Unlock factory contract. This can be useful if your application requires a specific lock setup (special referrer fees, metadata... etc), but also if you want to deploy locks on behalf of users and provide a gasless experience for lock managers.
### `createLock`
This method provides the simplest interface as it takes arguments for the duration of each NFT membership (key), the currency contract address, the price, the maximum number of keys, the name... etc. It creates locks that are using the current version of the protocol.
:::note
-If a new version of the protocol is released using "createLock" might break your implementation of a deployment script as the signature for that function migth change, and the locks deployed after the upgrade might be of a newer version.
+If a new version of the protocol is released using "createLock" might break your implementation of a deployment script as the signature for that function might change, and the locks deployed after the upgrade might be of a newer version.
:::
## Upgrading Locks
diff --git a/docs/docs/core-protocol/public-lock/hooks.md b/docs/docs/core-protocol/public-lock/hooks.md
index 54c25a8e3f2..9e51d8e044d 100644
--- a/docs/docs/core-protocol/public-lock/hooks.md
+++ b/docs/docs/core-protocol/public-lock/hooks.md
@@ -17,7 +17,7 @@ We currently support 7 hooks (as of v12). If your lock uses a previous version,
- onKeyCancelHook: called when a key is canceled
- onTokenUriHook: called when the tokenURI is fetched
- onValidKeyHook: called when checking if a user has a valid key
-- onKeyTransferHook: called when a key is transfered from an address to another.
+- onKeyTransferHook: called when a key is transferred from an address to another.
## onGrantKey Hook
@@ -50,7 +50,7 @@ interface ILockKeyGrantHook
## onKeyExtend Hook
-The `onKeyExtendHook` allows you create custom logic when a key is extended or renewed. This could enable use cases where for instance key metadata is updated, maybe you want to update the image when renewals happen. It could enable rewards programs where you increment a reward point total everytime a membership is renewed.
+The `onKeyExtendHook` allows you create custom logic when a key is extended or renewed. This could enable use cases where for instance key metadata is updated, maybe you want to update the image when renewals happen. It could enable rewards programs where you increment a reward point total every time a membership is renewed.
A KeyExtendHook should implement the following interface.
@@ -82,7 +82,7 @@ It contains 2 main functions:
1. `keyPurchasePrice` which is used to determine the purchase price before issuing a transaction,
2. `onKeyPurchase` which is called every time a key is sold.
-If either of these fail, then the whole purchase will revert.
+If either of these fails, then the whole purchase will revert.
The `ILockKeyPurchaseHook` contract interface describes the parameters of each function (from, recipient, original price, price paid, etc), so the hook can be properly implemented.
@@ -136,7 +136,7 @@ interface ILockValidKeyHook
address lockAddress, // the address of the current lock
address keyOwner, // the potential owner of a key
uint256 expirationTimestamp, // the key expiration timestamp
- bool isValidKey // the validity in the lock contrat
+ bool isValidKey // the validity in the lock contract
)
external view
returns (bool);
@@ -145,7 +145,7 @@ interface ILockValidKeyHook
## onKeyTransferHook Hook
-Called when a key is transfered, it can be useful to use with `onKeyPurchaseHook` to track key ownership on a 3rd party contract.
+Called when a key is transferred, it can be useful to use with `onKeyPurchaseHook` to track key ownership on a 3rd party contract.
The `ILockKeyTransferHook` interface is quite straightforward:
diff --git a/docs/docs/core-protocol/smart-contracts-api/README.md b/docs/docs/core-protocol/smart-contracts-api/README.md
index f7b2965ae22..7f8d0a36cc7 100644
--- a/docs/docs/core-protocol/smart-contracts-api/README.md
+++ b/docs/docs/core-protocol/smart-contracts-api/README.md
@@ -18,7 +18,7 @@ interface references.
## Using Smart Contract Interfaces
A Solidity contract interface is a list of function definitions without
-implementation. This allows for a seperation between the interface and the
+implementation. This allows for a separation between the interface and the
implementation much like Abstract Base Classes in Python or C++.
You can use these interfaces in your own smart contracts to interact with
diff --git a/docs/docs/core-protocol/smart-contracts-api/Unlock.md b/docs/docs/core-protocol/smart-contracts-api/Unlock.md
index 1eb3dda3ba5..f472b72e23d 100644
--- a/docs/docs/core-protocol/smart-contracts-api/Unlock.md
+++ b/docs/docs/core-protocol/smart-contracts-api/Unlock.md
@@ -24,7 +24,7 @@ function addLockTemplate(address impl, uint16 version) external nonpayable
Add a PublicLock template to be used for future calls to `createLock`.
-_This is used to upgrade conytract per version number_
+_This is used to upgrade contract per version number_
#### Parameters
@@ -105,8 +105,8 @@ _internally call `createUpgradeableLock`_
| \_expirationDuration | uint256 | the duration of the lock (pass 0 for unlimited duration) |
| \_tokenAddress | address | set to the ERC20 token address, or 0 for ETH. |
| \_keyPrice | uint256 | the price of each key |
-| \_maxNumberOfKeys | uint256 | the maximum nimbers of keys to be edited |
-| \_lockName | string | the name of the lock param \_salt [deprec] -- kept only for backwards copatibility This may be implemented as a sequence ID or with RNG. It's used with `create2` to know the lock's address before the transaction is mined. |
+| \_maxNumberOfKeys | uint256 | the maximum numbers of keys to be edited |
+| \_lockName | string | the name of the lock param \_salt [deprec] -- kept only for backwards compatibility This may be implemented as a sequence ID or with RNG. It's used with `create2` to know the lock's address before the transaction is mined. |
| \_5 | bytes12 | undefined |
#### Returns
@@ -176,7 +176,7 @@ function estimatedGasForPurchase() external view returns (uint256)
function getAdmin() external view returns (address)
```
-Returns the ProxyAdmin contract address that manage upgrades for the current Unlock contract.
+Returns the ProxyAdmin contract address that manages upgrades for the current Unlock contract.
_this reads the address directly from storage, at the slot `_ADMIN_SLOT` defined by Open Zeppelin's EIP1967 Proxy implementation which corresponds to the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1_
@@ -340,7 +340,7 @@ _Returns the address of the current owner._
function postLockUpgrade() external nonpayable
```
-Call executed by a lock after its version upgrade triggred by `upgradeLock` - PublicLock v12 > v13 (mainnet): migrate an existing Lock to another instance of the Unlock contract
+Call executed by a lock after its version upgrade triggered by `upgradeLock` - PublicLock v12 > v13 (mainnet): migrate an existing Lock to another instance of the Unlock contract
_The `msg.sender` will be the upgraded lock_
@@ -410,7 +410,7 @@ Match lock templates addresses with version numbers
function publicLockLatestVersion() external view returns (uint16 _version)
```
-Retrive the latest existing lock template version
+Retrieve the latest existing lock template version
#### Returns
@@ -461,7 +461,7 @@ _[DEPRECATED] Kept for backwards compatibility This function will keep track of
function recordKeyPurchase(uint256 _value, address _referrer) external nonpayable
```
-This function keeps track of the added GDP, as well as grants of discount tokens to the referrer, if applicable. The number of discount tokens granted is based on the value of the referal, the current growth rate and the lock's discount token distribution rate This function is invoked by a previously deployed lock only.
+This function keeps track of the added GDP, as well as grants of discount tokens to the referrer, if applicable. The number of discount tokens granted is based on the value of the referral, the current growth rate and the lock's discount token distribution rate This function is invoked by a previously deployed lock only.
#### Parameters
@@ -574,7 +574,7 @@ Set the UDT Swap and Burn contract address
function swapAndBurn(address token, uint256 amount, uint24 poolFee) external nonpayable
```
-Send tokens held by this contract to the UDT SwapBurner contract. The tokens sent to the contract are then swapped for UDT and UDT itself will be sent to a burner address.This function can be called by anyone (not only the contract owner) as a way to ensure decentralization.
+Send tokens held by this contract to the UDT SwapBurner contract. The tokens sent to the contract are then swapped for UDT and UDT itself will be sent to a burner address. This function can be called by anyone (not only the contract owner) as a way to ensure decentralization.
#### Parameters
@@ -630,7 +630,7 @@ _Transfers ownership of the contract to a new account (`newOwner`). Can only be
function transferTokens(address token, address to, uint256 amount) external nonpayable
```
-Functions which transfers tokens held by the contract It handles both ERC20 and the base currency.
+Function which transfers tokens held by the contract It handles both ERC20 and the base currency.
_This function is onlyOwner_
diff --git a/docs/docs/governance/grants-bounties/udt-grantee-handbook.md b/docs/docs/governance/grants-bounties/udt-grantee-handbook.md
index a959581390e..34c7e1f3ec9 100644
--- a/docs/docs/governance/grants-bounties/udt-grantee-handbook.md
+++ b/docs/docs/governance/grants-bounties/udt-grantee-handbook.md
@@ -104,7 +104,7 @@ identify important dates.
The final milestone should include success metrics or ROI. Here are some
examples based on your application type.
-- For a membership implementation: the number of members joined your through
+- For a membership implementation: the number of members who joined you through
your platform.
- For an event: the number of tickets sold.
- For use with credentials: the number of credentials handed out.
diff --git a/docs/docs/governance/unlock-dao/cross-chain-governance.mdx b/docs/docs/governance/unlock-dao/cross-chain-governance.mdx
index 465db4ec309..e0ce42f1edc 100644
--- a/docs/docs/governance/unlock-dao/cross-chain-governance.mdx
+++ b/docs/docs/governance/unlock-dao/cross-chain-governance.mdx
@@ -2,7 +2,7 @@
sidebar_position: 2
title: Cross-Chain Governance
description: >-
- Workflow to propagate DAO proposals accross multiple chains
+ Workflow to propagate DAO proposals across multiple chains
---
import { networks } from '@unlock-protocol/networks'
@@ -11,7 +11,7 @@ To fully decentralize the maintenance and management of the protocol contracts,
## How it works
-To reach other chains, calls emitted from the mainnet DAO go though the [Connext bridge](https://www.connext.network/) and are executed on the other side of the bridge, after a period of cooldown.
+To reach other chains, calls emitted from the mainnet DAO go through the [Connext bridge](https://www.connext.network/) and are executed on the other side of the bridge, after a period of cooldown.
```
(mainnet) (destination chain) (cooldown period)
diff --git a/docs/docs/tools/locksmith/webhooks.md b/docs/docs/tools/locksmith/webhooks.md
index 394354f35de..1e1a163d0aa 100644
--- a/docs/docs/tools/locksmith/webhooks.md
+++ b/docs/docs/tools/locksmith/webhooks.md
@@ -7,7 +7,7 @@ description:
# Webhooks
-Locksmith implements [Websub](https://www.w3.org/TR/websub) which allows anyone to receive real time updates from the [Unlock subgraphs]. It is a _webhook_ system which many developers will be familiar with with built-in intent verification.
+Locksmith implements [Websub](https://www.w3.org/TR/websub) which allows anyone to receive real time updates from the [Unlock subgraphs]. It is a _webhook_ system which many developers will be familiar with built-in intent verification.
Currently, locksmith support sending updates on new locks and keys. To subscribe, an application will need to send a post request to the hubs located at `/api/hooks/[topic]`. The body needs to match the schema specified in the [Websub w3c spec](https://www.w3.org/TR/websub/#x5-1-subscriber-sends-subscription-request).
diff --git a/docs/docs/tools/rpc-provider.md b/docs/docs/tools/rpc-provider.md
index b151cd91e77..b59f880d1d8 100644
--- a/docs/docs/tools/rpc-provider.md
+++ b/docs/docs/tools/rpc-provider.md
@@ -1,7 +1,7 @@
---
sidebar_position: 8
description: >-
- Unlock Labs offers RPC providerd for development purposes.
+ Unlock Labs offers RPC providers for development purposes.
---
# RPC Providers
@@ -11,6 +11,6 @@ These RPC providers are all using the same syntax: `https://rpc.unlock-protocol.
You can check our [Networks](/core-protocol/unlock/networks) page to see the network that we currently support.
-Each of the library that we offer comes pre-configured with these RPC providers, but can also be configured to change these.
+Each of the libraries that we offer comes pre-configured with these RPC providers, but can also be configured to change these.
**In production, you should _always_ use your own RPC providers.**
diff --git a/docs/package.json b/docs/package.json
index cb8774269b4..865091887bf 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -4,10 +4,10 @@
"private": true,
"dependencies": {
"@babel/helper-get-function-arity": "7.16.7",
- "@docusaurus/core": "3.6.0",
- "@docusaurus/plugin-client-redirects": "3.6.0",
- "@docusaurus/plugin-content-docs": "3.6.0",
- "@docusaurus/theme-classic": "3.6.0",
+ "@docusaurus/core": "3.6.1",
+ "@docusaurus/plugin-client-redirects": "3.6.1",
+ "@docusaurus/plugin-content-docs": "3.6.1",
+ "@docusaurus/theme-classic": "3.6.1",
"@emotion/react": "11.13.3",
"@emotion/styled": "11.13.0",
"@flockler/react-flockler-embed": "1.0.4",
diff --git a/governance/README.md b/governance/README.md
index 4e295cd2406..37ad3dfc33c 100644
--- a/governance/README.md
+++ b/governance/README.md
@@ -1,6 +1,6 @@
# Unlock Protocol Governance
-This folders contains all the tools to manage the Unlock Protocol (contracts, DAO, etc).
+This folder contains all the tools to manage the Unlock Protocol (contracts, DAO, etc).
To get the list of all available tasks use `yarn hardhat --help`.
@@ -138,7 +138,7 @@ yarn hardhat deploy:template --network tenderly
### Make a DAO proposal
-1. First, create a file in the `proposals` folder that describe the proposal itself. The file should contain either a js async function or a literal object and should export as default an object containing: 1. the title of the proposal and 2. an array with the description of the calls to send - in following format:
+1. First, create a file in the `proposals` folder that describes the proposal itself. The file should contain either a js async function or a literal object and should export as default an object containing: 1. the title of the proposal and 2. an array with the description of the calls to send - in following format:
#### Exports a literal object
@@ -165,8 +165,8 @@ When using an async function to parse a proposal, you can pass params to the fun
**CLI call**
```sh
-RUN_FORK=1 yarn hardhat gov --gov-address 0x440d9D4E66d39bb28FB58729Cb4D3ead2A595591 \
- --proposal proposals/my-proposal.js
+RUN_FORK=8453 yarn hardhat gov --gov-address 0x65bA0624403Fc5Ca2b20479e9F626eD4D78E0aD9 \
+ --proposal proposals/up/my-proposal.js
0x000000 1000
```
@@ -200,19 +200,19 @@ module.exports = async function (params) {
check [`./proposals/002-set-protocol-fee.js`](./proposals/002-set-protocol-fee.js) for an example.
-2. Test you proposal locally on a mainnet fork
+2. Test your proposal locally on a base fork
```shell
-RUN_FORK=1 yarn hardhat gov --gov-address 0x440d9D4E66d39bb28FB58729Cb4D3ead2A595591 \
- --proposal proposals/.js
+RUN_FORK=8453 yarn hardhat gov --gov-address 0x65bA0624403Fc5Ca2b20479e9F626eD4D78E0aD9 \
+ --proposal proposals/up/.js
```
-Additionnaly, you can pass arguments to your proposal script via CLI positional args.
+Additionally, you can pass arguments to your proposal script via CLI positional args.
3. When things are ready, post it to the DAO!
```
-yarn hardhat gov:submit --proposal proposals/.js --network mainnet
+yarn hardhat gov:submit --proposal proposals/.js --network base
```
4. Head to [Tally](https://www.withtally.com/governance/unlock) to see your proposal. NB: this may take some time as it requires X block confirmations
@@ -237,7 +237,7 @@ yarn run scripts/uniswap/addLiquidity.js
## Cross-Chain DAO Proposals
-To maintain the integrity of the protocol accross various chains, we use a pattern of DAO proposals that allows execution on multiple chains. Messaging is sent accross the [Connext bridge](https://connext.network) to all supported chains.
+To maintain the integrity of the protocol across various chains, we use a pattern of DAO proposals that allows execution on multiple chains. Messaging is sent across the [Connext bridge](https://connext.network) to all supported chains.
### Prepare a cross-chain proposal
@@ -266,7 +266,7 @@ Once the proposal has been through the timelock embargo period and has been exec
To execute these commands, you will need the hash from the transaction that executed the proposal on the DAO. The transaction contains the IDs of the bridge calls that will be used by the scripts to fetch information.
-NB: On [Tally.xyz](://www.tally.xyz/gov/unlock), a etherscan link containing the hash can be found on the upper left button next to _Proposal Executed_.
+NB: On [Tally.xyz](://www.tally.xyz/gov/unlock), an etherscan link containing the hash can be found on the upper left button next to _Proposal Executed_.
```
export PROPOSAL_EXECUTION_TX=<0x....>
@@ -315,7 +315,7 @@ NB: The tmp file with all txs statuses is required, so you need to first run the
### Add a new network to the cross-chain governance
-As the Connext bridge supports more networks, they need to added to the cross chain gov process (see [supported networks](https://docs.connext.network/resources/deployments) on Connext docs).
+As the Connext bridge supports more networks, they need to be added to the cross chain gov process (see [supported networks](https://docs.connext.network/resources/deployments) on Connext docs).
The process is as follow:
diff --git a/governance/proposals/up/002-change-voting-duration.js b/governance/proposals/up/002-change-voting-duration.js
new file mode 100644
index 00000000000..c562ac7a754
--- /dev/null
+++ b/governance/proposals/up/002-change-voting-duration.js
@@ -0,0 +1,71 @@
+const { ethers } = require('hardhat')
+const { UPGovernor } = require('@unlock-protocol/contracts')
+const { base } = require('@unlock-protocol/networks')
+
+const VOTING_DELAY = 4 * 24 * 60 * 60 // 4 days in seconds
+const VOTING_PERIOD = 6 * 24 * 60 * 60 // 6 days in seconds
+const MIN_DELAY = 2 * 24 * 60 * 60 // 2 days in seconds
+const BASE_GOVERNOR_ADDRESS = base.dao.governor
+const BASE_TIMELOCK_ADDRESS = '0xB34567C4cA697b39F72e1a8478f285329A98ed1b'
+
+module.exports = async () => {
+ console.log(`Proposal to change voting duration and minDelay`)
+
+ // Governor interface for voting delay and voting period
+ const governorInterface = new ethers.Interface(UPGovernor.abi)
+
+ // TimelockController interface for minDelay
+ const timelockInterface = new ethers.Interface([
+ 'function updateDelay(uint256)',
+ ])
+
+ // Encode data for each function call
+ const votingDelayCalldata = governorInterface.encodeFunctionData(
+ 'setVotingDelay',
+ [VOTING_DELAY]
+ )
+ const votingPeriodCalldata = governorInterface.encodeFunctionData(
+ 'setVotingPeriod',
+ [VOTING_PERIOD]
+ )
+ const minDelayCalldata = timelockInterface.encodeFunctionData('updateDelay', [
+ MIN_DELAY,
+ ])
+
+ // Prepare function calls
+ const calls = [
+ {
+ contractAddress: BASE_GOVERNOR_ADDRESS,
+ calldata: votingDelayCalldata,
+ value: 0,
+ operation: 0,
+ },
+ {
+ contractAddress: BASE_GOVERNOR_ADDRESS,
+ calldata: votingPeriodCalldata,
+ value: 0,
+ operation: 0,
+ },
+ {
+ contractAddress: BASE_TIMELOCK_ADDRESS,
+ calldata: minDelayCalldata,
+ value: 0,
+ operation: 0,
+ },
+ ]
+
+ const proposalName = `Lower Voting Duration for Unlock DAO
+
+This proposal sets the voting delay, and voting period in the Governor contract,
+as well as the minimum delay for execution (minDelay) in the timelock contract.
+
+## About this proposal
+
+The proposal contains calls to update the voting delay, voting period, and
+minDelay.`
+
+ return {
+ proposalName,
+ calls,
+ }
+}
diff --git a/locksmith/README.md b/locksmith/README.md
index 8867b89d917..fbf298b52a5 100644
--- a/locksmith/README.md
+++ b/locksmith/README.md
@@ -48,7 +48,7 @@ Once the database has been configured (per above), make sure to migrate by calli
## Running Locksmith
-For running in production, use `yarn start` otherwise `yarn dev` which will restart the server on file changes. This requires using 1password locally and have access to the Unlock Labs vault.
+For running in production, use `yarn start` otherwise `yarn dev` which will restart the server on file changes. This requires using 1password locally and having access to the Unlock Labs vault.
You can start a worker with `yarn worker:start`.
diff --git a/locksmith/__tests__/controllers/hubPublisherController.test.ts b/locksmith/__tests__/controllers/hubPublisherController.test.ts
index 70fe67ffd4b..db97925028b 100644
--- a/locksmith/__tests__/controllers/hubPublisherController.test.ts
+++ b/locksmith/__tests__/controllers/hubPublisherController.test.ts
@@ -1,4 +1,5 @@
import request from 'supertest'
+import { expect } from 'vitest'
import app from '../../src/app'
describe('HubPublisherController', () => {
diff --git a/locksmith/package.json b/locksmith/package.json
index 6c5ea073bc3..d7867afa56e 100644
--- a/locksmith/package.json
+++ b/locksmith/package.json
@@ -35,17 +35,17 @@
"author": "Unlock Inc",
"license": "ISC",
"dependencies": {
- "@ambire/signature-validator": "1.3.1",
- "@aws-sdk/client-s3": "3.614.0",
+ "@ambire/signature-validator": "1.4.1",
+ "@aws-sdk/client-s3": "3.689.0",
"@coinbase/waas-server-auth": "3.1.2",
- "@logtail/node": "0.4.21",
- "@logtail/winston": "0.4.21",
+ "@logtail/node": "0.5.2",
+ "@logtail/winston": "0.5.2",
"@nuintun/qrcode": "4.1.6",
- "@openzeppelin/defender-sdk": "1.14.4",
+ "@openzeppelin/defender-sdk": "1.15.2",
"@openzeppelin/merkle-tree": "1.0.7",
- "@privy-io/server-auth": "1.14.2",
+ "@privy-io/server-auth": "1.16.1",
"@resvg/resvg-js": "2.6.2",
- "@sentry/node": "7.118.0",
+ "@sentry/node": "7.119.2",
"@sentry/tracing": "7.114.0",
"@types/archiver": "6.0.3",
"@types/connect-timeout": "0.0.39",
@@ -68,36 +68,32 @@
"express-winston": "4.2.0",
"fuse.js": "7.0.0",
"geoip-country": "5.0.202411012341",
- "google-auth-library": "9.11.0",
+ "google-auth-library": "9.14.2",
"graphile-worker": "0.16.6",
"graphql": "16.9.0",
- "graphql-tag": "2.12.6",
- "html-template-tag": "4.0.1",
- "ics": "3.7.6",
+ "ics": "3.8.1",
"isomorphic-fetch": "3.0.0",
"jsonwebtoken": "9.0.2",
- "lodash.isequal": "4.5.0",
"memory-cache-node": "1.4.0",
"multer": "1.4.5-lts.1",
"multer-s3": "3.0.1",
"p-retry": "6.2.0",
- "passkit-generator": "3.1.11",
+ "passkit-generator": "3.2.0",
"path-to-regexp": "8.2.0",
"pdfmake": "0.2.14",
- "pg": "8.12.0",
+ "pg": "8.13.1",
"rate-limiter-flexible": "5.0.4",
"react": "18.3.1",
"remark-html": "16.0.1",
"remark-parse": "11.0.0",
- "satori": "0.10.14",
+ "satori": "0.11.3",
"sequelize": "6.37.5",
"sequelize-cli": "6.6.2",
"siwe": "2.3.2",
- "stripe": "17.2.1",
+ "stripe": "17.3.1",
"unified": "11.0.5",
- "unlock-abi-1-1": "1.1.1",
- "vitest-fetch-mock": "0.3.0",
- "winston": "3.13.1",
+ "vitest-fetch-mock": "0.4.2",
+ "winston": "3.17.0",
"yargs": "17.7.2",
"zod": "3.23.8"
},
@@ -115,15 +111,15 @@
"@types/supertest": "6.0.2",
"@unlock-protocol/eslint-config": "workspace:^",
"@unlock-protocol/tsconfig": "workspace:./packages/tsconfig",
- "eslint": "9.9.1",
+ "eslint": "9.14.0",
"eslint-config-standard": "17.1.0",
"nock": "13.5.5",
- "node-mocks-http": "1.15.1",
+ "node-mocks-http": "1.16.1",
"parse-data-uri": "0.2.0",
"run-script-os": "1.1.6",
"supertest": "7.0.0",
- "tsx": "4.16.5",
- "typescript": "5.5.4",
+ "tsx": "4.19.2",
+ "typescript": "5.6.3",
"vitest": "2.1.4"
},
"files": [
diff --git a/locksmith/src/config/stripe.ts b/locksmith/src/config/stripe.ts
index 186ebf48b23..ec3b4ff2f18 100644
--- a/locksmith/src/config/stripe.ts
+++ b/locksmith/src/config/stripe.ts
@@ -3,7 +3,7 @@ import Stripe from 'stripe'
import config from '../config/config'
const stripe = new Stripe(config.stripeSecret!, {
- apiVersion: '2024-09-30.acacia',
+ apiVersion: '2024-10-28.acacia',
})
export default stripe
diff --git a/locksmith/src/controllers/hubPublisherController.ts b/locksmith/src/controllers/hubPublisherController.ts
index 61a61371f77..6ef125fe925 100644
--- a/locksmith/src/controllers/hubPublisherController.ts
+++ b/locksmith/src/controllers/hubPublisherController.ts
@@ -1,4 +1,3 @@
-import html from 'html-template-tag'
import { RequestHandler } from 'express'
import { networks } from '@unlock-protocol/networks'
@@ -17,9 +16,7 @@ export const template = ({ links }: HubPublisherTemplateOptions) => {
${links
- .map(
- (item) => html``
- )
+ .map((item) => ``)
.join('\n')}
diff --git a/locksmith/src/controllers/metadataController.ts b/locksmith/src/controllers/metadataController.ts
index 594b15336e8..e6b67c0d02f 100644
--- a/locksmith/src/controllers/metadataController.ts
+++ b/locksmith/src/controllers/metadataController.ts
@@ -1,4 +1,3 @@
-import { Web3Service } from '@unlock-protocol/unlock-js'
import networks from '@unlock-protocol/networks'
import { Response } from 'express'
import Normalizer from '../utils/normalizer'
@@ -8,13 +7,14 @@ import { addMetadata, getMetadata } from '../operations/userMetadataOperations'
import * as lockOperations from '../operations/lockOperations'
import * as metadataOperations from '../operations/metadataOperations'
import logger from '../logger'
+import { getWeb3Service } from '../initializers'
export const evaluateLockOwnership = async (
lockAddress: string,
lockManager: string,
network: number
) => {
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
logger.info('networks', networks)
logger.info('data', { lockAddress, lockManager, network })
logger.info('network', networks[network])
diff --git a/locksmith/src/controllers/purchaseController.ts b/locksmith/src/controllers/purchaseController.ts
index 626395dd6e5..d8729728f1c 100644
--- a/locksmith/src/controllers/purchaseController.ts
+++ b/locksmith/src/controllers/purchaseController.ts
@@ -12,8 +12,7 @@ import { KeySubscription } from '../models'
import { LOCKS_WITH_DISABLED_CLAIMS } from './v2/claimController'
import { z } from 'zod'
import { getTotalPurchasePriceInCrypto } from '../utils/claim'
-import { Web3Service } from '@unlock-protocol/unlock-js'
-import { networks } from '@unlock-protocol/networks'
+import { getWeb3Service } from '../initializers'
const PaymentCaptureBody = z.object({
lock: z.string().transform((item) => Normalizer.ethereumAddress(item)),
@@ -161,7 +160,7 @@ export class PurchaseController {
transactionHandler
)
} else if (purchaseType === 'extend') {
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const owner = paymentIntentRecipients?.[0]?.recipient || userAddress
const tokenId = await web3Service.tokenOfOwnerByIndex(
paymentIntent.metadata.lock,
diff --git a/locksmith/src/controllers/v2/claimController.ts b/locksmith/src/controllers/v2/claimController.ts
index 645c53c2d17..b5f7149d65d 100644
--- a/locksmith/src/controllers/v2/claimController.ts
+++ b/locksmith/src/controllers/v2/claimController.ts
@@ -1,4 +1,4 @@
-import { KeyManager, Web3Service } from '@unlock-protocol/unlock-js'
+import { KeyManager } from '@unlock-protocol/unlock-js'
import { RequestHandler, Response } from 'express'
import { z } from 'zod'
import Dispatcher from '../../fulfillment/dispatcher'
@@ -8,6 +8,7 @@ import networks from '@unlock-protocol/networks'
import { UserMetadata } from './metadataController'
import { upsertUserMetadata } from '../../operations/userMetadataOperations'
import { getTotalPurchasePriceInCrypto } from '../../utils/claim'
+import { getWeb3Service } from '../../initializers'
const ClaimBody = z.object({
data: z.string().optional(),
@@ -83,7 +84,7 @@ export const claim: RequestHandler = async (request, response: Response) => {
const pricer = new KeyPricer()
const fulfillmentDispatcher = new Dispatcher()
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
// Check that claim is not too costly and that the lock is free
const [canAffordGas, totalAmount, hasValidKey, totalKeysForUser] =
diff --git a/locksmith/src/controllers/v2/eventsController.ts b/locksmith/src/controllers/v2/eventsController.ts
index 2481a79c95e..ecbf5f300b2 100644
--- a/locksmith/src/controllers/v2/eventsController.ts
+++ b/locksmith/src/controllers/v2/eventsController.ts
@@ -1,6 +1,5 @@
import { StandardMerkleTree } from '@openzeppelin/merkle-tree'
import { ethers } from 'ethers'
-import networks from '@unlock-protocol/networks'
import { RequestHandler } from 'express'
import {
getCheckedInAttendees,
@@ -23,11 +22,12 @@ import { removeProtectedAttributesFromObject } from '../../utils/protectedAttrib
import { isVerifierOrManagerForLock } from '../../utils/middlewares/isVerifierMiddleware'
import { sendEmail } from '../../operations/wedlocksOperations'
import { getEventUrl } from '../../utils/eventHelpers'
-import { Web3Service, getErc20Decimals } from '@unlock-protocol/unlock-js'
+import { getErc20Decimals } from '@unlock-protocol/unlock-js'
import { uploadJsonToS3 } from '../../utils/s3'
import config from '../../config/config'
import { downloadJsonFromS3 } from '../../utils/downloadJsonFromS3'
import logger from '../../logger'
+import { getWeb3Service } from '../../initializers'
// DEPRECATED!
export const getEventDetailsByLock: RequestHandler = async (
@@ -226,7 +226,7 @@ export const approveRefunds: RequestHandler = async (request, response) => {
let decimals = 18
if (currency) {
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const provider = web3Service.providerForNetwork(network)
// Get the decimals
diff --git a/locksmith/src/controllers/v2/lockSettingController.ts b/locksmith/src/controllers/v2/lockSettingController.ts
index b2585200e14..86cfb07c712 100644
--- a/locksmith/src/controllers/v2/lockSettingController.ts
+++ b/locksmith/src/controllers/v2/lockSettingController.ts
@@ -3,8 +3,7 @@ import { Request, RequestHandler, Response } from 'express'
import Normalizer from '../../utils/normalizer'
import logger from '../../logger'
import * as lockSettingOperations from '../../operations/lockSettingOperations'
-import networks from '@unlock-protocol/networks'
-import { Web3Service } from '@unlock-protocol/unlock-js'
+import { getWeb3Service } from '../../initializers'
const LockSettingSchema = z.object({
sendEmail: z
@@ -125,7 +124,7 @@ export const getSettings: RequestHandler = async (
response: Response
) => {
try {
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const lockAddress = Normalizer.ethereumAddress(request.params.lockAddress)
const network = Number(request.params.network)
diff --git a/locksmith/src/controllers/v2/magicEdenController.ts b/locksmith/src/controllers/v2/magicEdenController.ts
index 2988b0bfd31..029297199e4 100644
--- a/locksmith/src/controllers/v2/magicEdenController.ts
+++ b/locksmith/src/controllers/v2/magicEdenController.ts
@@ -1,9 +1,9 @@
-import { Web3Service } from '@unlock-protocol/unlock-js'
import { z } from 'zod'
import normalizer from '../../utils/normalizer'
import networks from '@unlock-protocol/networks'
import { Request, Response } from 'express'
import { ethers } from 'ethers'
+import { getWeb3Service } from '../../initializers'
const PurchaseBody = z.object({
address: z.string(),
@@ -12,7 +12,7 @@ const PurchaseBody = z.object({
export const purchase = async (request: Request, response: Response) => {
const lockAddress = normalizer.ethereumAddress(request.params.lockAddress)
const network = Number(request.params.network)
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const { address } = await PurchaseBody.parseAsync(request.body)
const recipient = normalizer.ethereumAddress(address)
diff --git a/locksmith/src/controllers/v2/metadataController.ts b/locksmith/src/controllers/v2/metadataController.ts
index fa523a7cad5..e414f937a47 100644
--- a/locksmith/src/controllers/v2/metadataController.ts
+++ b/locksmith/src/controllers/v2/metadataController.ts
@@ -1,4 +1,3 @@
-import { Web3Service } from '@unlock-protocol/unlock-js'
import { Response, Request, RequestHandler } from 'express'
import * as z from 'zod'
import Normalizer from '../../utils/normalizer'
@@ -13,7 +12,7 @@ import {
UserMetadataInputs,
getMetadata,
} from '../../operations/userMetadataOperations'
-import { networks } from '@unlock-protocol/networks'
+import { getWeb3Service } from '../../initializers'
export const UserMetadata = z
.object({
@@ -202,7 +201,7 @@ export const updateUserMetadata: RequestHandler = async (request, response) => {
const userAddress = Normalizer.ethereumAddress(request.params.userAddress)
const network = Number(request.params.network)
const metadata = await UserMetadata.parseAsync(request.body.metadata)
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const loggedInUser = request.user!.walletAddress
const isLockManager = await web3Service.isLockManager(
lockAddress,
diff --git a/locksmith/src/controllers/v2/ticketsController.tsx b/locksmith/src/controllers/v2/ticketsController.tsx
index b59c2219e3f..d27fdbf427e 100644
--- a/locksmith/src/controllers/v2/ticketsController.tsx
+++ b/locksmith/src/controllers/v2/ticketsController.tsx
@@ -1,9 +1,8 @@
import { Request, RequestHandler, Response } from 'express'
-import networks from '@unlock-protocol/networks'
import Dispatcher from '../../fulfillment/dispatcher'
import { notifyNewKeyToWedlocks } from '../../operations/wedlocksOperations'
import Normalizer from '../../utils/normalizer'
-import { SubgraphService, Web3Service } from '@unlock-protocol/unlock-js'
+import { SubgraphService } from '@unlock-protocol/unlock-js'
import logger from '../../logger'
import { generateQrCode, generateQrCodeUrl } from '../../utils/qrcode'
import { KeyMetadata } from '../../models/keyMetadata'
@@ -17,6 +16,7 @@ import {
import { Verifier } from '../../models/verifier'
import { getEventForLock } from '../../operations/eventOperations'
import { notify } from '../../worker/helpers'
+import { getWeb3Service } from '../../initializers'
export class TicketsController {
/**
@@ -122,7 +122,7 @@ export class TicketsController {
true /** includeProtected */
)
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const tokenOwner = await web3Service.ownerOf(lockAddress, id, network)
if (event?.data.notifyCheckInUrls) {
diff --git a/locksmith/src/fulfillment/dispatcher.ts b/locksmith/src/fulfillment/dispatcher.ts
index 213366eeb3e..51d2f84db83 100644
--- a/locksmith/src/fulfillment/dispatcher.ts
+++ b/locksmith/src/fulfillment/dispatcher.ts
@@ -1,10 +1,6 @@
import { Defender } from '@openzeppelin/defender-sdk'
-import {
- KeyManager,
- WalletService,
- Web3Service,
-} from '@unlock-protocol/unlock-js'
+import { KeyManager, WalletService } from '@unlock-protocol/unlock-js'
import networks from '@unlock-protocol/networks'
import { ethers } from 'ethers'
import logger from '../logger'
@@ -13,6 +9,7 @@ import { getGasSettings } from '../utils/gasSettings'
import config from '../config/config'
import executeAndRetry from './retries'
import normalizer from '../utils/normalizer'
+import { getWeb3Service } from '../initializers'
interface KeyToGrant {
recipient: string
@@ -141,7 +138,7 @@ export const getSignerFromOnKeyPurchaserHookOnLock = async function ({
lockAddress: string
network: number
}) {
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const hookAddress = await web3Service.onKeyPurchaseHook({
lockAddress,
network,
@@ -191,7 +188,7 @@ export const getSignerWhoIsKeyGranterOnLock = async function ({
lockAddress: string
network: number
}) {
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const purchasers = await getAllPurchasers({ network })
const keyGranters = await Promise.all(
@@ -312,7 +309,7 @@ export default class Dispatcher {
account?: string
) {
if (!account) {
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
account = await web3Service.ownerOf(lockAddress, tokenId, network)
}
diff --git a/locksmith/src/initializers.ts b/locksmith/src/initializers.ts
new file mode 100644
index 00000000000..9d4a45ea2ba
--- /dev/null
+++ b/locksmith/src/initializers.ts
@@ -0,0 +1,13 @@
+import networks from '@unlock-protocol/networks'
+import { Web3Service } from '@unlock-protocol/unlock-js'
+
+const globalAny: any = global
+
+export const getWeb3Service = () => {
+ if (globalAny.web3Service && 'test' !== process.env?.NODE_ENV) {
+ return globalAny.web3Service
+ } else {
+ globalAny.web3Service = new Web3Service(networks)
+ return globalAny.web3Service
+ }
+}
diff --git a/locksmith/src/operations/checkoutConfigOperations.ts b/locksmith/src/operations/checkoutConfigOperations.ts
index 550743f23b9..53371352794 100644
--- a/locksmith/src/operations/checkoutConfigOperations.ts
+++ b/locksmith/src/operations/checkoutConfigOperations.ts
@@ -1,7 +1,6 @@
import { randomUUID } from 'crypto'
import { CheckoutConfig } from '../models'
-import { Web3Service } from '@unlock-protocol/unlock-js'
-import networks from '@unlock-protocol/networks'
+import { getWeb3Service } from '../initializers'
interface SaveCheckoutConfigArgs {
id?: string
@@ -38,7 +37,7 @@ const isLockManager = async (
userAddress: string,
network: number
): Promise => {
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
try {
return await web3Service.isLockManager(lockAddress, userAddress, network)
} catch (error) {
diff --git a/locksmith/src/operations/creditCardOperations.ts b/locksmith/src/operations/creditCardOperations.ts
index 8d3eb26d8bf..c78311239b3 100644
--- a/locksmith/src/operations/creditCardOperations.ts
+++ b/locksmith/src/operations/creditCardOperations.ts
@@ -2,10 +2,9 @@ import AuthorizedLockOperations from './authorizedLockOperations'
import { getStripeConnectForLock } from './stripeOperations'
import Dispatcher from '../fulfillment/dispatcher'
import { MIN_PAYMENT_STRIPE_CREDIT_CARD } from '../utils/constants'
-import { Web3Service } from '@unlock-protocol/unlock-js'
-import networks from '@unlock-protocol/networks'
import * as lockSettingOperations from './lockSettingOperations'
import * as pricingOperations from './pricingOperations'
+import { getWeb3Service } from '../initializers'
/**
* Check if credit card is enabled for a specific lock
@@ -83,7 +82,7 @@ const getTotalPriceToChargeInCentsForLock = async ({
network,
lockAddress,
}: CreditCardStateProps) => {
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
// First check if we have a custom price, and return it if we do!
const settingsPricing = await lockSettingOperations.getSettings({
diff --git a/locksmith/src/operations/eventCasterOperations.ts b/locksmith/src/operations/eventCasterOperations.ts
index 4e0cc601e93..ec4a12f1dbc 100644
--- a/locksmith/src/operations/eventCasterOperations.ts
+++ b/locksmith/src/operations/eventCasterOperations.ts
@@ -7,10 +7,11 @@ import {
getPurchaser,
} from '../fulfillment/dispatcher'
import networks from '@unlock-protocol/networks'
-import { WalletService, Web3Service } from '@unlock-protocol/unlock-js'
+import { WalletService } from '@unlock-protocol/unlock-js'
import { EVENT_CASTER_ADDRESS } from '../utils/constants'
import { LockMetadata } from '../models'
import logger from '../logger'
+import { getWeb3Service } from '../initializers'
const DEFAULT_NETWORK = isProduction ? 8453 : 84532 // Base or Base Sepolia
@@ -51,7 +52,7 @@ export const deployLockForEventCaster = async ({
}[]
eventId: string
imageUrl: string
- description: string
+ description?: string | null
}) => {
const [provider, wallet] = await Promise.all([
getProviderForNetwork(DEFAULT_NETWORK),
@@ -174,7 +175,7 @@ export const deployLockForEventCaster = async ({
chain: DEFAULT_NETWORK,
address: lockAddress,
data: {
- description,
+ description: description || 'Eventcaster event!',
image: imageUrl,
name: title,
},
@@ -227,7 +228,7 @@ export const mintNFTForRsvp = async ({
])
// Check first if the user has a key
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const existingKey = await web3Service.getKeyByLockForOwner(
contract.address,
ownerAddress,
@@ -272,7 +273,12 @@ export const saveContractOnEventCasterEvent = async ({
}
)
if (response.status !== 200) {
- logger.error('Failed to save contract on EventCaster')
+ const responseBody = await response.text()
+ logger.error(
+ 'Failed to save contract on EventCaster',
+ response.status,
+ responseBody
+ )
return
}
const responseBody = await response.json()
@@ -289,7 +295,7 @@ export const saveTokenOnEventCasterRSVP = async ({
tokenId,
}: {
eventId: string
- farcasterId: string
+ farcasterId: number
tokenId: number
}) => {
const response = await fetch(
@@ -304,7 +310,12 @@ export const saveTokenOnEventCasterRSVP = async ({
)
const responseBody = await response.json()
if (response.status !== 200) {
- logger.error('Failed to save RSVP on EventCaster')
+ const responseBody = await response.text()
+ logger.error(
+ 'Failed to save RSVP on EventCaster',
+ response.status,
+ responseBody
+ )
return
}
return responseBody
diff --git a/locksmith/src/operations/keysOperations.ts b/locksmith/src/operations/keysOperations.ts
index 0791955a1fa..5ec5bd63dc1 100644
--- a/locksmith/src/operations/keysOperations.ts
+++ b/locksmith/src/operations/keysOperations.ts
@@ -1,16 +1,12 @@
import { keysByQuery } from '../graphql/datasource'
-import {
- SubgraphKey,
- SubgraphLock,
- Web3Service,
-} from '@unlock-protocol/unlock-js'
-import networks from '@unlock-protocol/networks'
+import { SubgraphKey, SubgraphLock } from '@unlock-protocol/unlock-js'
import * as metadataOperations from './metadataOperations'
import Fuse from 'fuse.js'
import normalizer from '../utils/normalizer'
import { getUserAddressesMatchingData } from './userMetadataOperations'
import { Rsvp } from '../models'
import { PAGE_SIZE } from '@unlock-protocol/core'
+import { getWeb3Service } from '../initializers'
const KEY_FILTER_MAPPING: { [key: string]: string } = {
owner: 'keyholderAddress',
@@ -112,7 +108,7 @@ export async function getKeysWithMetadata({
filters: any
loggedInUserAddress: string
}) {
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const isLockOwner = await web3Service.isLockManager(
lockAddress,
loggedInUserAddress,
diff --git a/locksmith/src/operations/lockOperations.ts b/locksmith/src/operations/lockOperations.ts
index 0d647bbd8e8..068ca95cd63 100644
--- a/locksmith/src/operations/lockOperations.ts
+++ b/locksmith/src/operations/lockOperations.ts
@@ -1,11 +1,10 @@
-import networks from '@unlock-protocol/networks'
import * as Normalizer from '../utils/normalizer'
-import { Web3Service } from '@unlock-protocol/unlock-js'
import { Op } from 'sequelize'
import { UserTokenMetadata, LockMetadata, LockIcons } from '../models'
import parseDataUri from 'parse-data-uri'
import lockIconUtils from '../utils/lockIcon'
import { ticketForFilBangalore } from '../utils/ticket'
+import { getWeb3Service } from '../initializers'
interface IconType {
icon: string
@@ -38,7 +37,7 @@ export async function isSoldOut(
chain: number,
keysNeeded = 1
): Promise {
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const keysAvailable = await web3Service.keysAvailable(address, chain)
return keysAvailable < keysNeeded // true of keysAvailable smaller than keysNeeded
}
diff --git a/locksmith/src/operations/metadataOperations.ts b/locksmith/src/operations/metadataOperations.ts
index 96268026568..248ac07cbc4 100644
--- a/locksmith/src/operations/metadataOperations.ts
+++ b/locksmith/src/operations/metadataOperations.ts
@@ -2,8 +2,6 @@ import { KeyMetadata } from '../models/keyMetadata'
import { LockMetadata } from '../models/lockMetadata'
import KeyData from '../utils/keyData'
import { getMetadata } from './userMetadataOperations'
-import { Web3Service } from '@unlock-protocol/unlock-js'
-import networks from '@unlock-protocol/networks'
import { Verifier } from '../models/verifier'
import Normalizer from '../utils/normalizer'
import * as lockOperations from './lockOperations'
@@ -12,6 +10,7 @@ import metadata from '../config/metadata'
import { getDefaultLockData } from '../utils/metadata'
import { getEventUrl } from '../utils/eventHelpers'
import { getEventForLock } from './eventOperations'
+import { getWeb3Service } from '../initializers'
interface IsKeyOrLockOwnerOptions {
userAddress?: string
@@ -189,7 +188,7 @@ export const isKeyOwnerOrLockVerifier = async ({
if (!userAddress) {
return false
}
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const loggedUserAddress = Normalizer.ethereumAddress(userAddress)
const isVerifier = await Verifier.findOne({
diff --git a/locksmith/src/operations/pricingOperations.ts b/locksmith/src/operations/pricingOperations.ts
index 75200acea73..6c48ffd362a 100644
--- a/locksmith/src/operations/pricingOperations.ts
+++ b/locksmith/src/operations/pricingOperations.ts
@@ -1,10 +1,11 @@
import networks from '@unlock-protocol/networks'
import { ethers } from 'ethers'
-import { Web3Service, getErc20Decimals } from '@unlock-protocol/unlock-js'
+import { getErc20Decimals } from '@unlock-protocol/unlock-js'
import * as lockSettingOperations from './lockSettingOperations'
import { Currencies } from '@unlock-protocol/core'
import normalizer from '../utils/normalizer'
import { MemoryCache } from 'memory-cache-node'
+import { getWeb3Service } from '../initializers'
interface DefiLamaResponse {
price?: number
@@ -203,7 +204,7 @@ export async function getLockKeyPricingFromContract({
lockAddress: string
network: number
}) {
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const provider = web3Service.providerForNetwork(network)
const lockContract = await web3Service.getLockContract(lockAddress, provider)
const [keyPrice, currencyContractAddress] = await Promise.all([
@@ -275,7 +276,7 @@ export const getFiatPricingForRecipient = async ({
data,
referrer,
}: PricingForRecipientProps): Promise => {
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const [{ decimals, currencyContractAddress }, pricingFromSettings] =
await Promise.all([
diff --git a/locksmith/src/operations/subscriptionOperations.ts b/locksmith/src/operations/subscriptionOperations.ts
index a91b1406546..b1274176a08 100644
--- a/locksmith/src/operations/subscriptionOperations.ts
+++ b/locksmith/src/operations/subscriptionOperations.ts
@@ -1,7 +1,5 @@
-import networks from '@unlock-protocol/networks'
import {
SubgraphService,
- Web3Service,
getAllowance,
getErc20BalanceForAddress,
getErc20Decimals,
@@ -12,6 +10,7 @@ import { KeySubscription } from '../models'
import { Op } from 'sequelize'
import dayjs from '../config/dayjs'
+import { getWeb3Service } from '../initializers'
interface Amount {
amount: string
@@ -62,7 +61,7 @@ export const getSubscriptionsForLockByOwner = async ({
return []
}
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const provider = web3Service.providerForNetwork(network)
const [userBalance, decimals, userAllowance, symbol] = await Promise.all([
getErc20BalanceForAddress(key.lock.tokenAddress, key.owner, provider),
diff --git a/locksmith/src/utils/claim.ts b/locksmith/src/utils/claim.ts
index 021c1a4840c..45b59621125 100644
--- a/locksmith/src/utils/claim.ts
+++ b/locksmith/src/utils/claim.ts
@@ -1,6 +1,5 @@
-import { Web3Service } from '@unlock-protocol/unlock-js'
-import { networks } from '@unlock-protocol/networks'
import { ethers } from 'ethers'
+import { getWeb3Service } from '../initializers'
interface Options {
recipients: string[]
@@ -15,7 +14,7 @@ export const getTotalPurchasePriceInCrypto = async ({
data,
lockAddress,
}: Options) => {
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const prices = await Promise.all(
recipients.map((recipient, index) => {
return web3Service.purchasePriceFor({
diff --git a/locksmith/src/utils/eventOrganizers.ts b/locksmith/src/utils/eventOrganizers.ts
index 310a070ce76..12e2f02b691 100644
--- a/locksmith/src/utils/eventOrganizers.ts
+++ b/locksmith/src/utils/eventOrganizers.ts
@@ -2,8 +2,7 @@ import { PaywallLocksConfigType } from '@unlock-protocol/core'
import { getCheckoutConfigById } from '../operations/checkoutConfigOperations'
import { getEventBySlug } from '../operations/eventOperations'
import { isEmpty } from 'lodash'
-import networks from '@unlock-protocol/networks'
-import { Web3Service } from '@unlock-protocol/unlock-js'
+import { getWeb3Service } from '../initializers'
export enum IsEventOrganizerEnum {
NO_EVENT,
@@ -15,7 +14,7 @@ export const isEventOrganizer = async (
address: string,
slug: string
): Promise => {
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
let locks: PaywallLocksConfigType = {}
// If this is an existing event!
diff --git a/locksmith/src/utils/middlewares/isVerifierMiddleware.ts b/locksmith/src/utils/middlewares/isVerifierMiddleware.ts
index e7856755a60..ce2dc4bafdf 100644
--- a/locksmith/src/utils/middlewares/isVerifierMiddleware.ts
+++ b/locksmith/src/utils/middlewares/isVerifierMiddleware.ts
@@ -1,11 +1,10 @@
-import networks from '@unlock-protocol/networks'
-import { Web3Service } from '@unlock-protocol/unlock-js'
import { RequestHandler } from 'express'
import Normalizer from '../normalizer'
import { logger } from '@sentry/utils'
import { Verifier } from '../../models/verifier'
import { getEventVerifiers } from '../../operations/verifierOperations'
import { IsEventOrganizerEnum, isEventOrganizer } from '../eventOrganizers'
+import { getWeb3Service } from '../../initializers'
export const isVerifierOrManagerForLock = async (
lockAddress: string,
@@ -23,7 +22,7 @@ export const isVerifierOrManagerForLock = async (
})
if (!verifier) {
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
isLockManager = await web3Service.isLockManager(
lockAddress,
address,
diff --git a/locksmith/src/utils/middlewares/keyOwnerMiddleware.ts b/locksmith/src/utils/middlewares/keyOwnerMiddleware.ts
index 1f0e32bc747..a1c04b011e9 100644
--- a/locksmith/src/utils/middlewares/keyOwnerMiddleware.ts
+++ b/locksmith/src/utils/middlewares/keyOwnerMiddleware.ts
@@ -1,7 +1,6 @@
import { RequestHandler } from 'express'
-import networks from '@unlock-protocol/networks'
-import { Web3Service } from '@unlock-protocol/unlock-js'
import Normalizer from '../normalizer'
+import { getWeb3Service } from '../../initializers'
export const keyOwnerMiddleware: RequestHandler = async (req, res, next) => {
const network = Number(req.params.network)
@@ -30,7 +29,7 @@ export const keyOwnerMiddleware: RequestHandler = async (req, res, next) => {
return
}
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const tokenOwner = await web3Service.ownerOf(lockAddress, keyId, network)
if (tokenOwner !== userAddress) {
diff --git a/locksmith/src/utils/middlewares/lockManager.ts b/locksmith/src/utils/middlewares/lockManager.ts
index db59b534de0..f71bf99fc43 100644
--- a/locksmith/src/utils/middlewares/lockManager.ts
+++ b/locksmith/src/utils/middlewares/lockManager.ts
@@ -1,8 +1,7 @@
import { RequestHandler } from 'express'
-import networks from '@unlock-protocol/networks'
-import { Web3Service } from '@unlock-protocol/unlock-js'
import Normalizer from './../normalizer'
import logger from '../../logger'
+import { getWeb3Service } from '../../initializers'
export const lockManagerMiddleware: RequestHandler = async (req, res, next) => {
try {
@@ -24,7 +23,7 @@ export const lockManagerMiddleware: RequestHandler = async (req, res, next) => {
return
}
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const isLockManager = await web3Service.isLockManager(
lockAddress,
diff --git a/locksmith/src/utils/middlewares/lockManagerOrKeyGranter.ts b/locksmith/src/utils/middlewares/lockManagerOrKeyGranter.ts
index 41bb83b8779..f2ce9896dd0 100644
--- a/locksmith/src/utils/middlewares/lockManagerOrKeyGranter.ts
+++ b/locksmith/src/utils/middlewares/lockManagerOrKeyGranter.ts
@@ -1,7 +1,6 @@
import { RequestHandler } from 'express'
-import networks from '@unlock-protocol/networks'
-import { Web3Service } from '@unlock-protocol/unlock-js'
import Normalizer from '../normalizer'
+import { getWeb3Service } from '../../initializers'
export const lockManagerOrKeyGranterMiddleware: RequestHandler = async (
req,
@@ -26,7 +25,7 @@ export const lockManagerOrKeyGranterMiddleware: RequestHandler = async (
return
}
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const isLockManager = await web3Service.isLockManager(
lockAddress,
diff --git a/locksmith/src/utils/middlewares/lockManagerOrKeyOwner.ts b/locksmith/src/utils/middlewares/lockManagerOrKeyOwner.ts
index e4696539dd5..76981ec4a2f 100644
--- a/locksmith/src/utils/middlewares/lockManagerOrKeyOwner.ts
+++ b/locksmith/src/utils/middlewares/lockManagerOrKeyOwner.ts
@@ -1,7 +1,6 @@
import { RequestHandler } from 'express'
-import networks from '@unlock-protocol/networks'
-import { Web3Service } from '@unlock-protocol/unlock-js'
import Normalizer from '../normalizer'
+import { getWeb3Service } from '../../initializers'
export const lockManagerOrKeyOwnerMiddleware: RequestHandler = async (
req,
@@ -27,7 +26,7 @@ export const lockManagerOrKeyOwnerMiddleware: RequestHandler = async (
return
}
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const [isLockManager, keyOwner] = await Promise.all([
web3Service.isLockManager(lockAddress, userAddress, network),
diff --git a/locksmith/src/utils/middlewares/lockManagerOrPayer.ts b/locksmith/src/utils/middlewares/lockManagerOrPayer.ts
index faa3a3f1b8b..e500b9e3798 100644
--- a/locksmith/src/utils/middlewares/lockManagerOrPayer.ts
+++ b/locksmith/src/utils/middlewares/lockManagerOrPayer.ts
@@ -1,8 +1,7 @@
import { RequestHandler } from 'express'
-import networks from '@unlock-protocol/networks'
-import { Web3Service } from '@unlock-protocol/unlock-js'
import Normalizer from '../normalizer'
import { SubgraphService } from '@unlock-protocol/unlock-js'
+import { getWeb3Service } from '../../initializers'
// check if the endpoint caller is the lock manager or the payer of the transaction
export const lockManagerOrPayerMiddleware: RequestHandler = async (
@@ -29,7 +28,7 @@ export const lockManagerOrPayerMiddleware: RequestHandler = async (
return
}
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const isLockManager = await web3Service.isLockManager(
lockAddress,
diff --git a/locksmith/src/utils/pricing.ts b/locksmith/src/utils/pricing.ts
index aebdec9ccfb..46e2155c9f4 100644
--- a/locksmith/src/utils/pricing.ts
+++ b/locksmith/src/utils/pricing.ts
@@ -1,5 +1,5 @@
import { networks } from '@unlock-protocol/networks'
-import { Web3Service, getErc20Decimals } from '@unlock-protocol/unlock-js'
+import { getErc20Decimals } from '@unlock-protocol/unlock-js'
import { ethers } from 'ethers'
import logger from '../logger'
import GasPrice from './gasPrice'
@@ -17,6 +17,7 @@ import {
} from '../operations/pricingOperations'
import { getSettings as getLockSettings } from '../operations/lockSettingOperations'
import normalizer from './normalizer'
+import { getWeb3Service } from '../initializers'
interface KeyPricingOptions {
recipients: (string | null)[]
@@ -33,7 +34,7 @@ export const getLockKeyPricing = async ({
lockAddress: string
network: number
}) => {
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const provider = web3Service.providerForNetwork(network)
const lockContract = await web3Service.getLockContract(lockAddress, provider)
const [keyPrice, currencyContractAddress] = await Promise.all([
diff --git a/locksmith/src/utils/receipts.ts b/locksmith/src/utils/receipts.ts
index 5b9ba6321d3..a57698b85f7 100644
--- a/locksmith/src/utils/receipts.ts
+++ b/locksmith/src/utils/receipts.ts
@@ -1,5 +1,4 @@
-import networks from '@unlock-protocol/networks'
-import { SubgraphService, Web3Service } from '@unlock-protocol/unlock-js'
+import { SubgraphService } from '@unlock-protocol/unlock-js'
import archiver from 'archiver'
import { uploadZipToS3 } from './s3'
import config from '../config/config'
@@ -7,6 +6,7 @@ import pdfmake from 'pdfmake/build/pdfmake.js'
import pdfFonts from 'pdfmake/build/vfs_fonts.js'
import { TDocumentDefinitions } from 'pdfmake/interfaces'
import { Receipt, ReceiptBase } from '../models'
+import { getWeb3Service } from '../initializers'
pdfmake.vfs = pdfFonts.pdfMake.vfs
@@ -116,7 +116,7 @@ export const zipReceiptsAndSendtos3 = async (
return false
}
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const lock = await web3Service.getLock(lockAddress, network)
const createPDFBuffer = async (data: any) => {
diff --git a/locksmith/src/worker/helpers/renewFiatKey.ts b/locksmith/src/worker/helpers/renewFiatKey.ts
index 3a50bbd112e..207d319f16d 100644
--- a/locksmith/src/worker/helpers/renewFiatKey.ts
+++ b/locksmith/src/worker/helpers/renewFiatKey.ts
@@ -5,8 +5,7 @@ import { logger } from '../../logger'
import { Charge, KeyRenewal, KeySubscription } from '../../models'
import stripe from '../../config/stripe'
import { Op } from 'sequelize'
-import { Web3Service } from '@unlock-protocol/unlock-js'
-import networks from '@unlock-protocol/networks'
+import { getWeb3Service } from '../../initializers'
interface RenewKeyReturned {
keyId?: string
@@ -137,7 +136,7 @@ export async function renewFiatKey({
}
}
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
// Get provider for network
const provider = await web3Service.providerForNetwork(subscription.network)
diff --git a/locksmith/src/worker/helpers/renewKey.ts b/locksmith/src/worker/helpers/renewKey.ts
index 915b9a92fc3..95530e3d9e8 100644
--- a/locksmith/src/worker/helpers/renewKey.ts
+++ b/locksmith/src/worker/helpers/renewKey.ts
@@ -1,5 +1,4 @@
import { ethers, Wallet, Contract } from 'ethers'
-import { Web3Service } from '@unlock-protocol/unlock-js'
import networks from '@unlock-protocol/networks'
import { KeyRenewal } from '../../models'
@@ -7,6 +6,7 @@ import GasPrice from '../../utils/gasPrice'
import Dispatcher from '../../fulfillment/dispatcher'
import logger from '../../logger'
import { getDefiLlamaPrice } from '../../operations/pricingOperations'
+import { getWeb3Service } from '../../initializers'
// multiply factor to increase precision for gas calculations
const BASE_POINT_ACCURACY = 1000
@@ -56,7 +56,7 @@ export const isWorthRenewing = async (
lockAddress: string,
keyId: string
): Promise => {
- const web3Service = new Web3Service(networks)
+ const web3Service = getWeb3Service()
const provider = new ethers.JsonRpcProvider(networks[network].provider)
// locks for which renewals are disabled
diff --git a/locksmith/src/worker/tasks/eventCaster/createEventCasterEvent.ts b/locksmith/src/worker/tasks/eventCaster/createEventCasterEvent.ts
index a682471b5c1..d266ce7a213 100644
--- a/locksmith/src/worker/tasks/eventCaster/createEventCasterEvent.ts
+++ b/locksmith/src/worker/tasks/eventCaster/createEventCasterEvent.ts
@@ -16,7 +16,7 @@ export const CreateEventCasterEventPayload = z.object({
),
eventId: z.string(),
imageUrl: z.string(),
- description: z.string(),
+ description: z.string().nullish(),
})
export const createEventCasterEvent: Task = async (payload) => {
diff --git a/locksmith/src/worker/tasks/eventCaster/rsvpForEventCasterEvent.ts b/locksmith/src/worker/tasks/eventCaster/rsvpForEventCasterEvent.ts
index c04eba32e62..9573c3b6045 100644
--- a/locksmith/src/worker/tasks/eventCaster/rsvpForEventCasterEvent.ts
+++ b/locksmith/src/worker/tasks/eventCaster/rsvpForEventCasterEvent.ts
@@ -12,7 +12,7 @@ export const RsvpForEventCasterEventPayload = z.object({
network: z.number(),
address: z.string(),
}),
- farcasterId: z.string(),
+ farcasterId: z.number(),
})
export const rsvpForEventCasterEvent: Task = async (payload) => {
diff --git a/packages/README.md b/packages/README.md
index 6b135595dbe..bc5208bc26f 100644
--- a/packages/README.md
+++ b/packages/README.md
@@ -20,7 +20,7 @@ We rely on [yarn release workflow](https://yarnpkg.com/features/release-workflow
### Versions
-Yarn use "deffered" version release, which means that we first prepare a file that state which packages should be updated - and how (minor, major, etc). Then the new version number is applied to the package and updated in deps accross the entire repo.
+Yarn use "deferred" version release, which means that we first prepare a file that state which packages should be updated - and how (minor, major, etc). Then the new version number is applied to the package and updated in deps across the entire repo.
Shortcuts commands available from the root repo:
diff --git a/packages/unlock-js/src/unlockService.ts b/packages/unlock-js/src/unlockService.ts
index dc2686b9bf4..d407a07c870 100644
--- a/packages/unlock-js/src/unlockService.ts
+++ b/packages/unlock-js/src/unlockService.ts
@@ -91,7 +91,7 @@ export default class UnlockService {
}
throw new Error(
- `Contract ${address} (${contractName}) not deployed on ${await provider.getNetwork()}, or unknown version ${version}`
+ `Contract ${address} (${contractName}) not deployed on ${(await provider.getNetwork()).chainId}, or unknown version ${version}`
)
}
diff --git a/smart-contracts/contracts/Unlock.sol b/smart-contracts/contracts/Unlock.sol
index dad8165b12e..086ba9b7d62 100644
--- a/smart-contracts/contracts/Unlock.sol
+++ b/smart-contracts/contracts/Unlock.sol
@@ -106,6 +106,9 @@ contract Unlock is UnlockInitializable, UnlockOwnable {
// UDT SwapBurner contract address
address public swapBurnerAddress;
+ // addresse with emply impl used to "burn" lock
+ address public burnedLockImpl;
+
// errors
error Unlock__MANAGER_ONLY();
error Unlock__VERSION_TOO_HIGH();
@@ -151,6 +154,8 @@ contract Unlock is UnlockInitializable, UnlockOwnable {
address indexed newAddress
);
+ event LockBurned(address lockAddress);
+
// Use initialize instead of a constructor to support proxies (for upgradeability via OZ).
function initialize(address _unlockOwner) public initializer {
// We must manually initialize Ownable
@@ -390,6 +395,31 @@ contract Unlock is UnlockInitializable, UnlockOwnable {
return lockAddress;
}
+ /**
+ * Disable a lock
+ * @dev Upgrade to an empty implementation
+ * @param lockAddress the address of the lock to be upgraded
+ * @custom:oz-upgrades-unsafe-allow-reachable delegatecall
+ */
+ function burnLock(address lockAddress) public {
+ if (proxyAdminAddress == address(0)) {
+ revert Unlock__MISSING_PROXY_ADMIN();
+ }
+
+ // check perms
+ if (_isLockManager(lockAddress, msg.sender) != true) {
+ revert Unlock__MANAGER_ONLY();
+ }
+
+ // upgrade to empty implementation
+ ITransparentUpgradeableProxy proxy = ITransparentUpgradeableProxy(
+ lockAddress
+ );
+ proxyAdmin.upgrade(proxy, burnedLockImpl);
+
+ emit LockBurned(lockAddress);
+ }
+
function _isLockManager(
address lockAddress,
address _sender
@@ -629,6 +659,13 @@ contract Unlock is UnlockInitializable, UnlockOwnable {
return globalBaseTokenURI;
}
+ /**
+ * @param implAddress the address of the empty implementation used to disable locks
+ */
+ function setBurnedLockImpl(address implAddress) external onlyOwner {
+ burnedLockImpl = implAddress;
+ }
+
/**
* @dev Redundant with globalTokenSymbol() for backwards compatibility with v3 & v4 locks.
*/
diff --git a/smart-contracts/contracts/interfaces/IPublicLock.sol b/smart-contracts/contracts/interfaces/IPublicLock.sol
index aab7d02c087..66889987cc6 100644
--- a/smart-contracts/contracts/interfaces/IPublicLock.sol
+++ b/smart-contracts/contracts/interfaces/IPublicLock.sol
@@ -21,6 +21,7 @@ interface IPublicLock {
uint value;
address recipient;
address referrer;
+ address protocolReferrer;
address keyManager;
bytes data;
uint additionalPeriods;
diff --git a/smart-contracts/contracts/interfaces/IUnlock.sol b/smart-contracts/contracts/interfaces/IUnlock.sol
index fafedc7d849..46cc4a65dc1 100644
--- a/smart-contracts/contracts/interfaces/IUnlock.sol
+++ b/smart-contracts/contracts/interfaces/IUnlock.sol
@@ -355,4 +355,23 @@ interface IUnlock {
* The address of the UDT Swap and Burn contract
*/
function swapBurnerAddress() external view returns (address);
+
+ /**
+ * Disable an existing lock
+ * @param lockAddress the addres of the lock
+ * @notice after this step, the lock will be unsable
+ */
+ function burnLock(address lockAddress) external;
+
+ /**
+ * The implementation used to disable an existing lock
+ */
+ function burnedLockImpl() external view returns (address);
+
+ /**
+ * Set the implementation that will be used when disabling a lock
+ * @dev `burnLock` will perform a proxy upgrade of the lock to this contract
+ * @param implAddress an empty implementation contract
+ */
+ function setBurnedLockImpl(address implAddress) external;
}
diff --git a/smart-contracts/contracts/mixins/MixinKeys.sol b/smart-contracts/contracts/mixins/MixinKeys.sol
index 184ff87b06d..8d323da2715 100644
--- a/smart-contracts/contracts/mixins/MixinKeys.sol
+++ b/smart-contracts/contracts/mixins/MixinKeys.sol
@@ -84,6 +84,9 @@ contract MixinKeys is MixinErrors, MixinLockCore {
// Mapping owner address to token count
mapping(address => uint256) private _balances;
+ // keep track of how many keys have been burnt to prevent token id conflicts
+ uint internal _burntTokens;
+
/**
* Ensure that the caller is the keyManager of the key
* or that the caller has been approved
@@ -182,7 +185,7 @@ contract MixinKeys is MixinErrors, MixinLockCore {
unchecked {
_totalSupply++;
}
- tokenId = _totalSupply;
+ tokenId = _totalSupply + _burntTokens;
// create the key
_keys[tokenId] = Key(tokenId, expirationTimestamp);
@@ -616,6 +619,7 @@ contract MixinKeys is MixinErrors, MixinLockCore {
return _maxKeysPerAddress;
}
+ // decrease 996 to 995 when adding _burntTokens mappings in v15
// decrease 1000 to 996 when adding new tokens/owners mappings in v10
- uint256[996] private __safe_upgrade_gap;
+ uint256[995] private __safe_upgrade_gap;
}
diff --git a/smart-contracts/contracts/mixins/MixinPurchase.sol b/smart-contracts/contracts/mixins/MixinPurchase.sol
index fe590243288..1fb6d340de7 100644
--- a/smart-contracts/contracts/mixins/MixinPurchase.sol
+++ b/smart-contracts/contracts/mixins/MixinPurchase.sol
@@ -45,23 +45,30 @@ contract MixinPurchase is
// default to 0
uint256 internal _gasRefundValue;
- // Keep track of ERC20 price when purchased
+ // DEPREC: use of these is deprecated, kept for backward storage compatibility!
mapping(uint256 => uint256) internal _originalPrices;
-
- // Keep track of duration when purchased
mapping(uint256 => uint256) internal _originalDurations;
-
- // keep track of token pricing when purchased
mapping(uint256 => address) internal _originalTokens;
+ // keep track of referrer fees
mapping(address => uint) public referrerFees;
+ // keep track of conditions of purchase for key renewals
+ struct RenewalCondition {
+ uint price;
+ uint duration;
+ address tokenAddress;
+ address referrer;
+ }
+ mapping(uint256 => RenewalCondition) internal _renewalConditions;
+
error TransferFailed();
struct PurchaseArgs {
uint value;
address recipient;
address referrer;
+ address protocolReferrer;
address keyManager;
bytes data;
uint additionalPeriods;
@@ -174,16 +181,22 @@ contract MixinPurchase is
* @notice stores values are used to prevent renewal if a key has settings
* has changed
*/
- function _recordTokenTerms(uint _tokenId, uint _keyPrice) internal {
- if (_originalPrices[_tokenId] != _keyPrice) {
- _originalPrices[_tokenId] = _keyPrice;
- }
- if (_originalDurations[_tokenId] != expirationDuration) {
- _originalDurations[_tokenId] = expirationDuration;
- }
- if (_originalTokens[_tokenId] != tokenAddress) {
- _originalTokens[_tokenId] = tokenAddress;
- }
+ function _recordTokenTerms(
+ uint _tokenId,
+ uint _keyPrice,
+ address _referrer
+ ) internal {
+ _renewalConditions[_tokenId] = RenewalCondition(
+ _keyPrice,
+ expirationDuration,
+ tokenAddress,
+ _referrer
+ );
+
+ // clear previous records
+ _originalPrices[_tokenId] = 0;
+ _originalDurations[_tokenId] = 0;
+ _originalTokens[_tokenId] = address(0);
}
/**
@@ -196,7 +209,7 @@ contract MixinPurchase is
) public view returns (bool) {
// check the lock
if (
- _originalDurations[_tokenId] == type(uint).max ||
+ _renewalConditions[_tokenId].duration == type(uint).max ||
tokenAddress == address(0)
) {
revert NON_RENEWABLE_LOCK();
@@ -204,10 +217,15 @@ contract MixinPurchase is
// make sure key duration haven't decreased or price hasn't increase
if (
- _originalPrices[_tokenId] <
- purchasePriceFor(ownerOf(_tokenId), _referrer, "") ||
- _originalDurations[_tokenId] > expirationDuration ||
- _originalTokens[_tokenId] != tokenAddress
+ _originalPrices[_tokenId] != 0 // check if a previous record exists
+ ? _originalPrices[_tokenId] <
+ purchasePriceFor(ownerOf(_tokenId), _referrer, "") ||
+ _originalDurations[_tokenId] > expirationDuration ||
+ _originalTokens[_tokenId] != tokenAddress
+ : _renewalConditions[_tokenId].price <
+ purchasePriceFor(ownerOf(_tokenId), _referrer, "") ||
+ _renewalConditions[_tokenId].duration > expirationDuration ||
+ _renewalConditions[_tokenId].tokenAddress != tokenAddress
) {
revert LOCK_HAS_CHANGED();
}
@@ -262,6 +280,7 @@ contract MixinPurchase is
address _recipient,
address _keyManager,
address _referrer,
+ address _protocolReferrer,
bytes memory _data
) internal returns (uint tokenId, uint pricePaid) {
// create a new key, check for a non-expiring key
@@ -277,15 +296,15 @@ contract MixinPurchase is
pricePaid = purchasePriceFor(_recipient, _referrer, _data);
// store values at purchase time
- _recordTokenTerms(tokenId, pricePaid);
+ _recordTokenTerms(tokenId, pricePaid, _referrer);
// make sure erc20 price is correct
if (tokenAddress != address(0)) {
_checkValue(_value, pricePaid);
}
- // store in unlock
- _recordKeyPurchase(pricePaid, _referrer);
+ // store in unlock and pay gov token reward
+ _recordKeyPurchase(pricePaid, _protocolReferrer);
// fire hook
if (address(onKeyPurchaseHook) != address(0)) {
@@ -316,6 +335,7 @@ contract MixinPurchase is
purchaseArgs[i].recipient,
purchaseArgs[i].keyManager,
purchaseArgs[i].referrer,
+ purchaseArgs[i].protocolReferrer,
purchaseArgs[i].data
);
totalPriceToPay = totalPriceToPay + pricePaid;
@@ -329,8 +349,8 @@ contract MixinPurchase is
// compute total price
totalPriceToPay = totalPriceToPay + pricePaid;
- // process in unlock
- _recordKeyPurchase(pricePaid, purchaseArgs[i].referrer);
+ // process in unlock and pay gov token reward
+ _recordKeyPurchase(pricePaid, purchaseArgs[i].protocolReferrer);
// send what is due to referrer
_payReferrer(purchaseArgs[i].referrer);
@@ -403,6 +423,7 @@ contract MixinPurchase is
_recipients[i],
_keyManagers[i],
_referrers[i],
+ _referrers[i], // here protocol referrer is the same
_data[i]
);
totalPriceToPay = totalPriceToPay + pricePaid;
@@ -484,7 +505,7 @@ contract MixinPurchase is
_transferValue(msg.sender, pricePaid);
// if key params have changed, then update them
- _recordTokenTerms(_tokenId, pricePaid);
+ _recordTokenTerms(_tokenId, pricePaid, _referrer);
// refund gas (if applicable)
_refundGas();
@@ -500,14 +521,19 @@ contract MixinPurchase is
* Renew a given token
* @notice only works for non-free, expiring, ERC20 locks
* @param _tokenId the ID fo the token to renew
- * @param _referrer the address of the person to be granted UDT
+ * @param _referrer the address of the referrer. If a referrer address has already been
+ * specified during the first purchase, this param will be ignored
*/
function renewMembershipFor(uint _tokenId, address _referrer) public {
_lockIsUpToDate();
_isKey(_tokenId);
+ address referrer = _renewalConditions[_tokenId].referrer == address(0)
+ ? _referrer
+ : _renewalConditions[_tokenId].referrer;
+
// check if key is ripe for renewal
- isRenewable(_tokenId, _referrer);
+ isRenewable(_tokenId, referrer);
// extend key duration
_extendKey(_tokenId, 0);
@@ -525,7 +551,7 @@ contract MixinPurchase is
);
// store in unlock
- _recordKeyPurchase(keyPrice, _referrer);
+ _recordKeyPurchase(keyPrice, referrer);
// transfer the tokens
_transferValue(ownerOf(_tokenId), keyPrice);
@@ -534,7 +560,7 @@ contract MixinPurchase is
_refundGas();
// send what is due to referrer
- _payReferrer(_referrer);
+ _payReferrer(referrer);
// pay protocol
_payProtocol(keyPrice);
diff --git a/smart-contracts/contracts/mixins/MixinRefunds.sol b/smart-contracts/contracts/mixins/MixinRefunds.sol
index 76ef1327c93..9674b30238d 100644
--- a/smart-contracts/contracts/mixins/MixinRefunds.sol
+++ b/smart-contracts/contracts/mixins/MixinRefunds.sol
@@ -94,8 +94,7 @@ contract MixinRefunds is
}
// make future reccuring transactions impossible
- _originalDurations[_tokenId] = 0;
- _originalPrices[_tokenId] = 0;
+ _recordTokenTerms(_tokenId, 0, address(0));
// inform the hook if there is one registered
if (address(onKeyCancelHook) != address(0)) {
diff --git a/smart-contracts/contracts/mixins/MixinTransfer.sol b/smart-contracts/contracts/mixins/MixinTransfer.sol
index b07f9fcfccd..4477cf9470c 100644
--- a/smart-contracts/contracts/mixins/MixinTransfer.sol
+++ b/smart-contracts/contracts/mixins/MixinTransfer.sol
@@ -179,6 +179,9 @@ contract MixinTransfer is
// decrease totalSupply
_totalSupply--;
+
+ // increase burnt token counter
+ _burntTokens++;
}
/**
@@ -230,8 +233,7 @@ contract MixinTransfer is
_clearApproval(_tokenId);
// make future reccuring transactions impossible
- _originalDurations[_tokenId] = 0;
- _originalPrices[_tokenId] = 0;
+ _recordTokenTerms(_tokenId, 0, address(0));
// trigger event
emit Transfer(_from, _recipient, _tokenId);
diff --git a/smart-contracts/contracts/utils/EmptyImpl.sol b/smart-contracts/contracts/utils/EmptyImpl.sol
index 206291e8ef5..bbb5a4f84ec 100644
--- a/smart-contracts/contracts/utils/EmptyImpl.sol
+++ b/smart-contracts/contracts/utils/EmptyImpl.sol
@@ -4,4 +4,8 @@ pragma solidity ^0.8.21;
contract EmptyImpl {
constructor() {}
+
+ function name() external returns (string memory) {
+ return "";
+ }
}
diff --git a/smart-contracts/test/Lock/burn.js b/smart-contracts/test/Lock/burn.js
index 31960ab19b6..06c9107087c 100644
--- a/smart-contracts/test/Lock/burn.js
+++ b/smart-contracts/test/Lock/burn.js
@@ -67,6 +67,23 @@ describe('Lock / burn', () => {
compareBigNumbers(await lock.totalSupply(), totalSupply - 1n)
})
+ it('tokenId is not used twice', async () => {
+ const { tokenId: tokenIdBeforeBurn } = await purchaseKey(
+ lock,
+ await keyOwner.getAddress()
+ )
+ const totalSupply = await lock.totalSupply()
+ await lock.connect(keyOwner).burn(tokenIdBeforeBurn)
+ compareBigNumbers(await lock.totalSupply(), totalSupply - 1n)
+ const { tokenId: tokenIdAfterBurn } = await purchaseKey(
+ lock,
+ await keyOwner.getAddress()
+ )
+ assert.notEqual(tokenId, tokenIdAfterBurn)
+ assert.notEqual(tokenIdAfterBurn, tokenId + 1n)
+ compareBigNumbers(await lock.totalSupply(), totalSupply)
+ })
+
it('should work only on existing keys', async () => {
await reverts(lock.burn(123), 'NO_SUCH_KEY')
})
diff --git a/smart-contracts/test/Lock/purchaseMultipleKeys.js b/smart-contracts/test/Lock/purchaseMultipleKeys.js
index 2fea3671c58..b755fb3a6d8 100644
--- a/smart-contracts/test/Lock/purchaseMultipleKeys.js
+++ b/smart-contracts/test/Lock/purchaseMultipleKeys.js
@@ -47,6 +47,7 @@ describe('Lock / purchase multiple keys at once', () => {
recipient: await keyOwner.getAddress(),
keyManager: ADDRESS_ZERO,
referrer: ADDRESS_ZERO,
+ protocolReferrer: ADDRESS_ZERO,
data: '0x',
additionalPeriods: 0,
}))
diff --git a/smart-contracts/test/Lock/purchaseMultiplePeriods.js b/smart-contracts/test/Lock/purchaseMultiplePeriods.js
index c8d29bd45b3..2bc1a2925a7 100644
--- a/smart-contracts/test/Lock/purchaseMultiplePeriods.js
+++ b/smart-contracts/test/Lock/purchaseMultiplePeriods.js
@@ -70,6 +70,7 @@ describe('Lock / purchase multiple periods at once', () => {
recipient: await keyOwner.getAddress(),
keyManager: ADDRESS_ZERO,
referrer: ADDRESS_ZERO,
+ protocolReferrer: ADDRESS_ZERO,
data: '0x',
additionalPeriods: nbPeriods,
},
diff --git a/smart-contracts/test/Lock/purchaseUsingStruct.js b/smart-contracts/test/Lock/purchaseUsingStruct.js
index dfd55def861..da706b4c246 100644
--- a/smart-contracts/test/Lock/purchaseUsingStruct.js
+++ b/smart-contracts/test/Lock/purchaseUsingStruct.js
@@ -82,6 +82,7 @@ describe('Lock / purchase using Struct signature', () => {
value: keyPrice,
recipient: await recipient.getAddress(),
referrer: ADDRESS_ZERO,
+ protocolReferrer: ADDRESS_ZERO,
keyManager: ADDRESS_ZERO,
data: '0x',
additionalPeriods: 0,
diff --git a/smart-contracts/test/Lock/receipts.js b/smart-contracts/test/Lock/receipts.js
index e618d3c2c00..7d86a178dc0 100644
--- a/smart-contracts/test/Lock/receipts.js
+++ b/smart-contracts/test/Lock/receipts.js
@@ -50,6 +50,7 @@ describe('Lock / PaymentReceipt event', () => {
recipient: await keyOwner.getAddress(),
keyManager: ADDRESS_ZERO,
referrer: await referrer.getAddress(),
+ protocolReferrer: ADDRESS_ZERO,
data: '0x',
additionalPeriods: 2n,
},
@@ -58,6 +59,7 @@ describe('Lock / PaymentReceipt event', () => {
recipient: await keyOwner.getAddress(),
keyManager: ADDRESS_ZERO,
referrer: await referrer.getAddress(),
+ protocolReferrer: await referrer.getAddress(),
data: '0x',
additionalPeriods: 3n,
},
diff --git a/smart-contracts/test/Lock/renewMembershipFor.js b/smart-contracts/test/Lock/renewMembershipFor.js
index 7bb0299a6eb..decb147bbbd 100644
--- a/smart-contracts/test/Lock/renewMembershipFor.js
+++ b/smart-contracts/test/Lock/renewMembershipFor.js
@@ -6,6 +6,9 @@ const {
ADDRESS_ZERO,
deployLock,
increaseTimeTo,
+ deployWETH,
+ createMockOracle,
+ deployContracts,
} = require('../helpers')
const { ethers } = require('hardhat')
const { getEvent } = require('@unlock-protocol/hardhat-helpers')
@@ -15,23 +18,24 @@ let dai
const keyPrice = ethers.parseUnits('0.01', 'ether')
const totalPrice = keyPrice * 10n
-const someDai = ethers.parseUnits('10', 'ether')
+const someDai = ethers.parseUnits('100', 'ether')
describe('Lock / Recurring memberships', () => {
- let lockOwner
- let keyOwner
- let randomSigner
+ let deployer, keyOwner, referrer, attacker
+ let up, unlock
beforeEach(async () => {
- ;[lockOwner, keyOwner, randomSigner] = await ethers.getSigners()
- dai = await deployERC20(await lockOwner.getAddress(), true)
+ ;[deployer, keyOwner, referrer, attacker] = await ethers.getSigners()
+ dai = await deployERC20(await deployer.getAddress(), true)
// Mint some dais for testing
await dai.mint(await keyOwner.getAddress(), someDai)
+ // deploy contracts
+ ;({ unlock, up } = await deployContracts())
lock = await deployLock({
tokenAddress: await dai.getAddress(),
- isEthers: true,
+ unlock,
})
// set ERC20 approval for entire scope
@@ -100,14 +104,12 @@ describe('Lock / Recurring memberships', () => {
})
it('reverts if key is valid', async () => {
- await dai.mint(await randomSigner.getAddress(), someDai)
- await dai
- .connect(randomSigner)
- .approve(await lock.getAddress(), totalPrice)
+ await dai.mint(await attacker.getAddress(), someDai)
+ await dai.connect(attacker).approve(await lock.getAddress(), totalPrice)
const { tokenId: newTokenId } = await purchaseKey(
lock,
- await randomSigner.getAddress(),
+ await attacker.getAddress(),
true
)
assert.equal(await lock.isValidKey(newTokenId), true)
@@ -143,10 +145,8 @@ describe('Lock / Recurring memberships', () => {
it('should revert if erc20 token has changed', async () => {
// deploy another token
- const dai2 = await deployERC20(randomSigner, true)
- await dai2
- .connect(randomSigner)
- .mint(await keyOwner.getAddress(), someDai)
+ const dai2 = await deployERC20(attacker, true)
+ await dai2.connect(attacker).mint(await keyOwner.getAddress(), someDai)
// update lock token without changing price
await lock.updateKeyPricing(keyPrice, await dai2.getAddress())
await reverts(
@@ -238,7 +238,7 @@ describe('Lock / Recurring memberships', () => {
.connect(keyOwner)
.transferFrom(
await keyOwner.getAddress(),
- await randomSigner.getAddress(),
+ await attacker.getAddress(),
balanceBefore
)
assert.equal(await dai.balanceOf(await keyOwner.getAddress()), '0')
@@ -264,7 +264,7 @@ describe('Lock / Recurring memberships', () => {
.connect(keyOwner)
.transferFrom(
await keyOwner.getAddress(),
- await randomSigner.getAddress(),
+ await attacker.getAddress(),
tokenId
)
// should fail
@@ -319,20 +319,52 @@ describe('Lock / Recurring memberships', () => {
})
})
- /*
- describe('should grant UDT to referrer', async () => {
- it('referrer has no UDT to start', async () => {
- const actual = new BigNumber(await udt.balanceOf(referrer))
- assert.equal(actual, 0)
- })
+ describe('should remember the referrer set in first purchase', async () => {
+ // 1% in basis points
+ const BASIS_POINTS_DEN = 10000n
+ const generalFee = 1000n
+
+ beforeEach(async () => {
+ // set general referrer fee to 1%
+ await lock.setReferrerFee(ADDRESS_ZERO, generalFee)
+
+ // set ERC20 approval for entire scope
+ await dai.connect(keyOwner).approve(await lock.getAddress(), totalPrice)
- it('referrer has some UDT now', async () => {
- await lock.renewMembershipFor(tokenId, referrer)
- const actual = new BigNumber(await udt.balanceOf(referrer))
- assert.equal(actual, 10)
+ // purchase a key with referrer set
+ const tx = await lock
+ .connect(keyOwner)
+ .purchase(
+ [keyPrice],
+ [await keyOwner.getAddress()],
+ [await referrer.getAddress()],
+ [ADDRESS_ZERO],
+ ['0x']
+ )
+ const receipt = await tx.wait()
+ const { args } = await getEvent(receipt, 'Transfer')
+ ;({ tokenId } = args)
+ })
+ it('referrer has some UP when no address is passed', async () => {
+ const expirationTs = await lock.keyExpirationTimestampFor(tokenId)
+ await increaseTimeTo(expirationTs)
+ const before = await dai.balanceOf(await referrer.getAddress())
+ await lock.renewMembershipFor(tokenId, ADDRESS_ZERO)
+ const actual = await dai.balanceOf(await referrer.getAddress())
+ const amountEarned = actual - before
+ assert.notEqual(amountEarned, 0n)
+ const fee = (keyPrice * generalFee) / BASIS_POINTS_DEN
+ assert.equal(amountEarned, fee)
+ })
+ it('attacker cant bypass existing referrer', async () => {
+ const before = await dai.balanceOf(await attacker.getAddress())
+ const expirationTs = await lock.keyExpirationTimestampFor(tokenId)
+ await increaseTimeTo(expirationTs)
+ await lock.renewMembershipFor(tokenId, await attacker.getAddress())
+ const actual = await dai.balanceOf(await attacker.getAddress())
+ assert.equal(actual - before, 0n)
})
})
- */
it('should call onPurchase if set', async () => {
// set hook
diff --git a/smart-contracts/test/Lock/setReferrerFee.js b/smart-contracts/test/Lock/setReferrerFee.js
index 431dbafbebe..e76f7f35702 100644
--- a/smart-contracts/test/Lock/setReferrerFee.js
+++ b/smart-contracts/test/Lock/setReferrerFee.js
@@ -44,6 +44,7 @@ describe('Lock / setReferrerFee', () => {
value: isErc20 ? keyPrice : 0,
recipient: await keyOwner.getAddress(),
referrer: referrerAddress,
+ protocolReferrer: referrerAddress,
keyManager: ADDRESS_ZERO,
data: '0x',
additionalPeriods: 0,
diff --git a/smart-contracts/test/Lock/upgrades/v15.js b/smart-contracts/test/Lock/upgrades/v15.js
index 1f829824f53..64a9abe9731 100644
--- a/smart-contracts/test/Lock/upgrades/v15.js
+++ b/smart-contracts/test/Lock/upgrades/v15.js
@@ -8,6 +8,7 @@ const {
ADDRESS_ZERO,
getEvents,
} = require('@unlock-protocol/hardhat-helpers')
+const { deployERC20, purchaseKey, increaseTimeTo } = require('../../helpers')
// pass proper root folder to helpers
const dirname = path.join(__dirname, '..')
@@ -18,8 +19,7 @@ const nextVersionNumber = 15
const duration = 60 * 60 * 24 * 30 // 30 days
const currency = ADDRESS_ZERO
-const price = ethers.parseEther('0.01')
-const maxKeys = 20
+const maxKeys = 200
const name = 'A neat upgradeable lock!'
describe('PublicLock upgrade v14 > v15', () => {
@@ -57,7 +57,7 @@ describe('PublicLock upgrade v14 > v15', () => {
lock = await upgrades.deployProxy(PublicLockPast, args)
// allow many keys
- await lock.connect(lockOwner).updateLockConfig(duration, 20, 3)
+ await lock.connect(lockOwner).updateLockConfig(duration, maxKeys, maxKeys)
})
it('past version has correct version number', async () => {
@@ -125,7 +125,7 @@ describe('PublicLock upgrade v14 > v15', () => {
assert.equal(await lock.publicLockVersion(), nextVersionNumber)
assert.equal(await lock.name(), name)
assert.equal(await lock.expirationDuration(), duration)
- assert.equal(await lock.keyPrice(), price)
+ assert.equal(await lock.keyPrice(), keyPrice)
assert.equal(await lock.maxNumberOfKeys(), maxKeys)
assert.equal(await lock.tokenAddress(), currency)
})
@@ -206,4 +206,46 @@ describe('PublicLock upgrade v14 > v15', () => {
})
})
})
+
+ describe('renewal settings', async () => {
+ let tokenId
+ let deployer, lockOwner, keyOwner
+ before(async () => {
+ ;[deployer, lockOwner, keyOwner] = await ethers.getSigners()
+ const token = await deployERC20(deployer)
+
+ // make it erc20
+ await lock
+ .connect(lockOwner)
+ .updateKeyPricing(await lock.keyPrice(), await token.getAddress())
+
+ // set approval
+ const someTokens = ethers.parseEther('100.0')
+ await token.mint(await keyOwner.getAddress(), someTokens)
+ await token.connect(keyOwner).approve(await lock.getAddress(), someTokens)
+ ;({ tokenId } = await purchaseKey(
+ lock,
+ await keyOwner.getAddress(),
+ true
+ ))
+ const expirationTs = await lock.keyExpirationTimestampFor(tokenId)
+ await increaseTimeTo(expirationTs)
+ assert(await lock.isRenewable(tokenId, ADDRESS_ZERO))
+ })
+
+ it('are preserved during upgrade', async () => {
+ // make upgrade
+ lock = await upgrades.upgradeProxy(
+ await lock.getAddress(),
+ PublicLockLatest,
+ {
+ // UNSECURE - but we need the flag as we are resizing the `__gap`
+ unsafeSkipStorageCheck: true,
+ }
+ )
+
+ // isRenewable
+ assert(await lock.isRenewable(tokenId, ADDRESS_ZERO))
+ })
+ })
})
diff --git a/smart-contracts/test/Unlock/burnLock.js b/smart-contracts/test/Unlock/burnLock.js
new file mode 100644
index 00000000000..356704b1877
--- /dev/null
+++ b/smart-contracts/test/Unlock/burnLock.js
@@ -0,0 +1,60 @@
+const assert = require('assert')
+const { ethers } = require('hardhat')
+const {
+ deployContracts,
+ deployLock,
+ reverts,
+ ADDRESS_ZERO,
+} = require('../helpers')
+const { getEvent } = require('@unlock-protocol/hardhat-helpers')
+
+describe('burnLock', () => {
+ let attacker
+ let lock, unlock
+ let emptyImpl
+ beforeEach(async () => {
+ ;[, attacker] = await ethers.getSigners()
+ ;({ unlock } = await deployContracts())
+ lock = await deployLock({ unlock })
+ const EmptyImpl = await ethers.getContractFactory('EmptyImpl')
+ emptyImpl = await EmptyImpl.deploy()
+ })
+ describe('setting empty impl', () => {
+ it('sets the impl correctly', async () => {
+ assert.equal(await unlock.burnedLockImpl(), ADDRESS_ZERO)
+ await unlock.setBurnedLockImpl(await emptyImpl.getAddress())
+ assert.equal(await unlock.burnedLockImpl(), await emptyImpl.getAddress())
+ })
+ it('can only be set by a manager', async () => {
+ await reverts(
+ unlock
+ .connect(attacker)
+ .setBurnedLockImpl(await emptyImpl.getAddress()),
+ 'ONLY_OWNER'
+ )
+ })
+ })
+
+ describe('burning a lock', () => {
+ it('upgrade to an empty implementation', async () => {
+ await unlock.setBurnedLockImpl(await emptyImpl.getAddress())
+ assert.equal(await unlock.burnedLockImpl(), await emptyImpl.getAddress())
+
+ const tx = await unlock.burnLock(await lock.getAddress())
+ const receipt = await tx.wait()
+ assert.equal(await lock.name(), '')
+ await reverts(lock.publicLockVersion())
+
+ const event = await getEvent(receipt, 'LockBurned')
+ assert.notEqual(event, null)
+ assert.equal(event.args.lockAddress, await lock.getAddress())
+ })
+ })
+ describe('only lock manager allowed', async () => {
+ const [, attacker] = await ethers.getSigners()
+ await reverts(
+ unlock.connect(attacker).burnLock(await lock.getAddress()),
+ 'MANAGER_ONLY'
+ )
+ })
+})
diff --git a/smart-contracts/test/Unlock/grantGovernanceTokens.js b/smart-contracts/test/Unlock/grantGovernanceTokens.js
index 96714c2d7f1..738ae4c383b 100644
--- a/smart-contracts/test/Unlock/grantGovernanceTokens.js
+++ b/smart-contracts/test/Unlock/grantGovernanceTokens.js
@@ -14,7 +14,7 @@ const {
const { ADDRESS_ZERO } = require('@unlock-protocol/hardhat-helpers')
let unlock, up, udt, swap, lock, oracle, weth, token
-let deployer, minter, referrer, keyBuyer
+let deployer, minter, protocolReferrer, keyBuyer, referrer, recipient
let keyPrice
const estimateGas = BigInt(252166 * 2)
@@ -41,7 +41,9 @@ describe('UnlockGovernanceToken / granting Tokens', () => {
lockTestCases.forEach((isERC20) => {
describe(`lock is priced in ${isERC20 ? 'erc20' : 'native'} tokens`, () => {
before(async function () {
- ;[deployer, minter, keyBuyer, referrer] = await ethers.getSigners()
+ // here the "protocolReferrer"
+ ;[deployer, minter, keyBuyer, recipient, protocolReferrer, referrer] =
+ await ethers.getSigners()
;({ unlock, up, udt, swap } = await deployContracts())
weth = await deployWETH(deployer)
@@ -106,12 +108,12 @@ describe('UnlockGovernanceToken / granting Tokens', () => {
rates,
})
- // Purchase a valid key for the referrer
+ // Purchase a valid key for the protocolReferrer
await lock
.connect(keyBuyer)
.purchase(
isERC20 ? [keyPrice] : [],
- [await referrer.getAddress()],
+ [await protocolReferrer.getAddress()],
[ADDRESS_ZERO],
[ADDRESS_ZERO],
['0x'],
@@ -155,9 +157,9 @@ describe('UnlockGovernanceToken / granting Tokens', () => {
}
})
- it(`referrer has 0 ${symbol} to start`, async () => {
+ it(`protocolReferrer has 0 ${symbol} to start`, async () => {
const actual = await governanceToken.balanceOf(
- await referrer.getAddress()
+ await protocolReferrer.getAddress()
)
compareBigNumbers(actual, '0')
})
@@ -204,7 +206,7 @@ describe('UnlockGovernanceToken / granting Tokens', () => {
await unlock.setProtocolFee(PROTOCOL_FEE)
balanceReferrerBefore = await governanceToken.balanceOf(
- await referrer.getAddress()
+ await protocolReferrer.getAddress()
)
unlockBalanceBefore = await getBalance(
@@ -213,18 +215,22 @@ describe('UnlockGovernanceToken / granting Tokens', () => {
)
// purchase a key with refferer
- await lock
- .connect(keyBuyer)
- .purchase(
- isERC20 ? [keyPrice] : [],
- [await keyBuyer.getAddress()],
- [await referrer.getAddress()],
- [ADDRESS_ZERO],
- ['0x'],
+ await lock.connect(keyBuyer).purchase(
+ [
{
value: keyPrice,
- }
- )
+ recipient: await recipient.getAddress(),
+ referrer: await referrer.getAddress(),
+ protocolReferrer: await protocolReferrer.getAddress(),
+ keyManager: ADDRESS_ZERO,
+ data: '0x',
+ additionalPeriods: 0,
+ },
+ ],
+ {
+ value: isERC20 ? 0 : keyPrice,
+ }
+ )
})
it('unlock has received protocol fee in ERC20', async () => {
@@ -238,10 +244,97 @@ describe('UnlockGovernanceToken / granting Tokens', () => {
)
})
- it(`referrer has received ${symbol} based on protocol fee`, async () => {
+ it(`protocolReferrer has received ${symbol} based on protocol fee`, async () => {
+ const amountEarned =
+ (await governanceToken.balanceOf(
+ await protocolReferrer.getAddress()
+ )) - balanceReferrerBefore
+ assert.notEqual(amountEarned, 0n)
+
+ const rate = symbol === 'UP' ? UP_WETH_RATE : UDT_WETH_RATE
+ const protocolFee = (keyPrice * PROTOCOL_FEE) / BASIS_POINTS_DEN
+
+ // fee in native tokens
+ const fee = isERC20
+ ? (protocolFee * ERC20_RATE) / 10n ** 18n
+ : protocolFee
+
+ assert.equal(amountEarned, ((fee / 2n) * rate) / 10n ** 18n)
+ })
+ })
+
+ describe(`grant rewards in ${symbol} and referrer fee separately`, () => {
+ let balanceProtocolReferrerBefore,
+ balanceReferrerBefore,
+ unlockBalanceBefore
+ const REFERRER_FEE = 2000n
+ before(async () => {
+ // set protocol fee to 1%
+ await unlock.setProtocolFee(PROTOCOL_FEE)
+
+ // set referrer fee to 20% for all addresses
+ await lock.setReferrerFee(ADDRESS_ZERO, REFERRER_FEE)
+
+ balanceProtocolReferrerBefore = await governanceToken.balanceOf(
+ await protocolReferrer.getAddress()
+ )
+
+ balanceReferrerBefore = await getBalance(
+ await referrer.getAddress(),
+ isERC20 ? await token.getAddress() : null
+ )
+
+ unlockBalanceBefore = await getBalance(
+ await unlock.getAddress(),
+ isERC20 ? await token.getAddress() : null
+ )
+
+ // purchase a key with refferer
+ await lock.connect(keyBuyer).purchase(
+ [
+ {
+ value: keyPrice,
+ recipient: await recipient.getAddress(),
+ referrer: await referrer.getAddress(),
+ protocolReferrer: await protocolReferrer.getAddress(),
+ keyManager: ADDRESS_ZERO,
+ data: '0x',
+ additionalPeriods: 0,
+ },
+ ],
+ {
+ value: isERC20 ? 0 : keyPrice,
+ }
+ )
+ })
+
+ it('unlock has received protocol fee', async () => {
+ const balance = await getBalance(
+ await unlock.getAddress(),
+ isERC20 ? await token.getAddress() : null
+ )
+ assert.equal(
+ balance - unlockBalanceBefore,
+ (keyPrice * PROTOCOL_FEE) / BASIS_POINTS_DEN
+ )
+ })
+
+ it('referrer has received referrer fee', async () => {
+ const balance = await getBalance(
+ await referrer.getAddress(),
+ isERC20 ? await token.getAddress() : null
+ )
+ assert.equal(
+ balance - balanceReferrerBefore,
+ (keyPrice * REFERRER_FEE) / BASIS_POINTS_DEN
+ )
+ })
+
+ it(`protocolReferrer has received ${symbol} based on protocol fee`, async () => {
const amountEarned =
- (await governanceToken.balanceOf(await referrer.getAddress())) -
- balanceReferrerBefore
+ balanceProtocolReferrerBefore -
+ (await governanceToken.balanceOf(await referrer.getAddress()))
+
assert.notEqual(amountEarned, 0n)
const rate = symbol === 'UP' ? UP_WETH_RATE : UDT_WETH_RATE
diff --git a/smart-contracts/test/helpers/lock.js b/smart-contracts/test/helpers/lock.js
index 82f519f9283..9954bfd29a1 100644
--- a/smart-contracts/test/helpers/lock.js
+++ b/smart-contracts/test/helpers/lock.js
@@ -29,6 +29,7 @@ const purchaseKey = async (
recipient: keyOwnerAddress,
keyManager: ADDRESS_ZERO,
referrer: ADDRESS_ZERO,
+ protocolReferrer: ADDRESS_ZERO,
data: '0x',
additionalPeriods: 0,
}
@@ -70,6 +71,7 @@ const purchaseKeys = async (lock, nbOfKeys = 1n, isErc20 = false, signer) => {
recipient: signer.getAddress(),
keyManager: ADDRESS_ZERO,
referrer: ADDRESS_ZERO,
+ protocolReferrer: ADDRESS_ZERO,
data: '0x',
additionalPeriods: 0,
}))
diff --git a/subgraph/README.md b/subgraph/README.md
index 74fed8349b3..227de960204 100644
--- a/subgraph/README.md
+++ b/subgraph/README.md
@@ -24,7 +24,7 @@ The `networks.json` file and `/config` files are generated from our `@unlock-pro
yarn prepare:networks
```
-#### Contrat ABIs
+#### Contract ABIs
Unlock's contracts are upgradable, we parse the multiple ABIs that are required from our `@unlock-protocol/contracts` package.
diff --git a/tests/README.md b/tests/README.md
index 0c339d57866..44e79cac79f 100644
--- a/tests/README.md
+++ b/tests/README.md
@@ -18,7 +18,7 @@ First start a fully provisioned ETH node (with the Unlock contracts deployed and
yarn start:infra
```
-then you nneed to export the subgraph URL, rebuild the networks package and run the test
+then you need to export the subgraph URL, rebuild the networks package and run the test
```shell
export SUBGRAPH_URL=http://localhost:8000/subgraphs/name/testgraph
diff --git a/unlock-app/src/pages/api/auth/[...nextauth].ts b/unlock-app/app/api/auth/[...nextauth]/route.ts
similarity index 80%
rename from unlock-app/src/pages/api/auth/[...nextauth].ts
rename to unlock-app/app/api/auth/[...nextauth]/route.ts
index 6beb9908f8a..65ec13e4bba 100644
--- a/unlock-app/src/pages/api/auth/[...nextauth].ts
+++ b/unlock-app/app/api/auth/[...nextauth]/route.ts
@@ -1,14 +1,15 @@
import GoogleProvider from 'next-auth/providers/google'
import CredentialsProvider from 'next-auth/providers/credentials'
-import { config } from '~/config/app'
-import NextAuth from 'next-auth'
-import { locksmith } from '~/config/locksmith'
+import NextAuth, { NextAuthOptions } from 'next-auth'
+import { config } from '../../../../src/config/app'
+import { locksmith } from '../../../../src/config/locksmith'
-export const authOptions = {
+// Create auth options
+const authOptions: NextAuthOptions = {
secret: config.nexthAuthSecret as string,
pages: {
- error: '/authError',
- signIn: '/authError',
+ error: '/auth-error',
+ signIn: '/google-sign-in',
},
providers: [
GoogleProvider({
@@ -39,7 +40,6 @@ export const authOptions = {
async signIn({ user, account }: { user: any; account: any }) {
user.selectedProvider = account.provider
user.idToken = account.id_token
-
return true
},
async jwt({ token, user }: { token: any; user: any }) {
@@ -47,7 +47,6 @@ export const authOptions = {
token.selectedProvider = user.selectedProvider
token.idToken = user.idToken
}
-
return token
},
async session({ session, token }: { session: any; token: any; user: any }) {
@@ -59,10 +58,11 @@ export const authOptions = {
session.user.token = token.sub
}
}
-
return session
},
},
}
-export default NextAuth(authOptions)
+// Create and export handler
+const handler = NextAuth(authOptions)
+export { handler as GET, handler as POST }
diff --git a/unlock-app/app/auth-error/page.tsx b/unlock-app/app/auth-error/page.tsx
new file mode 100644
index 00000000000..12c8e203529
--- /dev/null
+++ b/unlock-app/app/auth-error/page.tsx
@@ -0,0 +1,24 @@
+import React from 'react'
+import { Metadata } from 'next'
+import { ImageBar } from '~/components/interface/locks/Manage/elements/ImageBar'
+
+export const metadata: Metadata = {
+ title: 'Authentication Error',
+ description: 'There was an error with your authentication. Please try again.',
+}
+
+const AuthErrorPage: React.FC = () => {
+ return (
+
+ <>
+
Authentication Error
+
+ >
+
+ )
+}
+
+export default AuthErrorPage
diff --git a/unlock-app/app/checkout/page.tsx b/unlock-app/app/checkout/page.tsx
index 757146c90f6..2294abcd361 100644
--- a/unlock-app/app/checkout/page.tsx
+++ b/unlock-app/app/checkout/page.tsx
@@ -12,20 +12,42 @@ type Props = {
export async function generateMetadata({
searchParams,
}: Props): Promise {
- const id = searchParams.id
-
- const config = await getConfig(id as string)
-
- return {
- title: config?.title || 'Checkout | Unlock Protocol',
- openGraph: {
- images: [`/og/checkout?id=${id}`],
- },
- other: {
- ...(await fetchMetadata(
- new URL(`/frames/checkout?id=${id}`, appConfig.unlockApp)
- )),
- },
+ const id = searchParams?.id?.trim()
+
+ // Default metadata without frame data
+ const baseMetadata: Metadata = {
+ title: 'Checkout | Unlock Protocol',
+ }
+
+ // Return base metadata if no valid ID is present
+ if (!id || id.length === 0) {
+ return baseMetadata
+ }
+
+ try {
+ const config = await getConfig(id)
+
+ // Return base metadata if config could not be fetched
+ if (!config) {
+ return baseMetadata
+ }
+
+ const metadata: Metadata = {
+ title: config.title || baseMetadata.title,
+ openGraph: {
+ images: [`/og/checkout?id=${id}`],
+ },
+ other: {
+ ...(await fetchMetadata(
+ new URL(`/frames/checkout?id=${id}`, appConfig.unlockApp)
+ )),
+ },
+ }
+
+ return metadata
+ } catch (error) {
+ console.error('Error generating metadata:', error)
+ return baseMetadata
}
}
diff --git a/unlock-app/app/events/[slug]/loading.tsx b/unlock-app/app/events/[slug]/loading.tsx
index d6c23fd5d28..751913d0041 100644
--- a/unlock-app/app/events/[slug]/loading.tsx
+++ b/unlock-app/app/events/[slug]/loading.tsx
@@ -47,8 +47,6 @@ export default function EventsCollectionDetailLoading() {
-
Events
-
diff --git a/unlock-app/next.config.js b/unlock-app/next.config.js
index 6e32785fc27..f068a238f82 100644
--- a/unlock-app/next.config.js
+++ b/unlock-app/next.config.js
@@ -52,6 +52,17 @@ const config = {
destination: '/locks',
permanent: true,
},
+ // redirect to checkout page and preserve path
+ {
+ source: '/alpha/checkout/:path*',
+ destination: '/checkout/:path*',
+ permanent: true,
+ },
+ {
+ source: '/legacy/checkout/:path*',
+ destination: '/checkout/:path*',
+ permanent: true,
+ },
]
},
}
diff --git a/unlock-app/package.json b/unlock-app/package.json
index a0f9920b1d7..0bd9f2c3965 100644
--- a/unlock-app/package.json
+++ b/unlock-app/package.json
@@ -9,21 +9,18 @@
"dependencies": {
"@airstack/airstack-react": "0.6.4",
"@coinbase/waas-sdk-web": "3.3.3",
- "@coinbase/wallet-sdk": "4.1.0",
"@crossmint/client-sdk-react-ui": "1.2.2",
"@decent.xyz/box-common": "3.3.17",
"@enzoferey/ethers-error-parser": "0.2.3",
"@guildxyz/sdk": "2.6.9",
"@headlessui/react": "2.1.9",
- "@hookform/error-message": "2.0.1",
"@hookform/resolvers": "3.9.1",
- "@privy-io/react-auth": "1.89.0",
+ "@privy-io/react-auth": "1.92.7",
"@radix-ui/react-avatar": "1.1.1",
- "@rehooks/local-storage": "2.4.5",
"@sentry/nextjs": "7.119.2",
"@stripe/react-stripe-js": "2.8.1",
- "@stripe/stripe-js": "4.5.0",
- "@tanstack/react-query": "5.56.2",
+ "@stripe/stripe-js": "4.9.0",
+ "@tanstack/react-query": "5.59.19",
"@testing-library/dom": "10.4.0",
"@tw-classed/react": "1.7.0",
"@unlock-protocol/core": "workspace:./packages/core",
@@ -34,15 +31,11 @@
"@unlock-protocol/unlock-js": "workspace:./packages/unlock-js",
"@vercel/og": "0.6.3",
"@vercel/speed-insights": "1.0.14",
- "@walletconnect/ethereum-provider": "2.16.2",
- "@walletconnect/modal": "2.6.2",
"@xstate/react": "4.1.3",
"axios": "1.7.7",
- "blockies-react-svg": "0.0.13",
"calendar-link": "2.7.0",
"csv": "6.3.10",
"dayjs": "1.11.13",
- "deep-object-diff": "1.1.9",
"dotenv": "16.4.5",
"eslint": "9.11.1",
"ethers": "6.13.4",
@@ -55,18 +48,16 @@
"next-auth": "4.24.10",
"node-forge": "1.3.1",
"postmate": "1.5.2",
- "prettier": "3.3.3",
"qr-scanner": "1.4.2",
- "qrcode.react": "4.0.1",
+ "qrcode.react": "4.1.0",
"react-device-detect": "2.2.3",
- "react-dropzone": "14.2.3",
+ "react-dropzone": "14.3.5",
"react-google-autocomplete": "2.7.3",
"react-google-recaptcha": "3.1.0",
"react-gtm-module": "2.0.11",
"react-hook-form": "7.53.1",
"react-hot-toast": "2.4.1",
"react-icons": "5.3.0",
- "react-jwt": "1.2.2",
"react-markdown": "9.0.1",
"react-to-print": "3.0.2",
"react-use": "17.5.1",
@@ -80,8 +71,7 @@
"unified": "11.0.5",
"validator": "13.12.0",
"xstate": "5.14.0",
- "zod": "3.23.8",
- "zod-to-json-schema": "3.23.5"
+ "zod": "3.23.8"
},
"devDependencies": {
"@testing-library/react": "16.0.1",
@@ -101,7 +91,7 @@
"react-test-renderer": "18.3.1",
"tailwindcss": "3.4.14",
"vitest": "2.1.4",
- "vitest-fetch-mock": "0.3.0",
+ "vitest-fetch-mock": "0.4.1",
"vitest-localstorage-mock": "0.1.2"
},
"scripts": {
diff --git a/unlock-app/src/__tests__/hooks/useKeychain.test.ts b/unlock-app/src/__tests__/hooks/useKeychain.test.ts
index 5543307b033..9d8940cbc9d 100644
--- a/unlock-app/src/__tests__/hooks/useKeychain.test.ts
+++ b/unlock-app/src/__tests__/hooks/useKeychain.test.ts
@@ -7,10 +7,8 @@ const mockWeb3Service = {
getCancelAndRefundValueFor: vi.fn(() => Promise.resolve(0.1)),
}
-vi.mock('@unlock-protocol/unlock-js', () => ({
- Web3Service: function Web3Service() {
- return mockWeb3Service
- },
+vi.mock('~/utils/withWeb3Service', () => ({
+ useWeb3Service: () => mockWeb3Service,
}))
describe('useKeychain', () => {
diff --git a/unlock-app/src/__tests__/utils/paop.test.js b/unlock-app/src/__tests__/utils/paop.test.js
index 7e34cfef712..19cc362eee7 100644
--- a/unlock-app/src/__tests__/utils/paop.test.js
+++ b/unlock-app/src/__tests__/utils/paop.test.js
@@ -1,4 +1,4 @@
-import { vi, describe, beforeAll, beforeEach, expect, it } from 'vitest'
+import { vi, describe, beforeEach, expect, it } from 'vitest'
import pingPoap from '../../utils/poap'
describe('pingPoap', () => {
@@ -31,7 +31,7 @@ describe('pingPoap', () => {
})
})
- it('should not fail if fetch failed', () => {
+ it('should not fail if fetch failed', async () => {
expect.assertions(2)
const owner = '0xowner'
const key = {
@@ -42,10 +42,11 @@ describe('pingPoap', () => {
const signature = 'signature'
const timestamp = 123
const consoleSpy = vi.spyOn(global.console, 'error')
- fetch.mockReject(() => {
- throw new Error('fake error message')
- })
- expect(() => pingPoap(key, owner, signature, timestamp)).not.toThrow()
+ fetch.mockReject(new Error('fake error message'))
+
+ await expect(
+ pingPoap(key, owner, signature, timestamp)
+ ).resolves.not.toThrow()
expect(consoleSpy).toHaveBeenCalled()
})
})
diff --git a/unlock-app/src/components/content/certification/CertificationForm.tsx b/unlock-app/src/components/content/certification/CertificationForm.tsx
index 9a3d7d22e09..4d03945ce17 100644
--- a/unlock-app/src/components/content/certification/CertificationForm.tsx
+++ b/unlock-app/src/components/content/certification/CertificationForm.tsx
@@ -19,7 +19,6 @@ import { CryptoIcon } from '@unlock-protocol/crypto-icon'
import { useImageUpload } from '~/hooks/useImageUpload'
import { NetworkWarning } from '~/components/interface/locks/Create/elements/NetworkWarning'
import { getAccountTokenBalance } from '~/hooks/useAccount'
-import { Web3Service } from '@unlock-protocol/unlock-js'
import { useQuery } from '@tanstack/react-query'
import { useRouter } from 'next/navigation'
import { useAvailableNetworks } from '~/utils/networks'
@@ -27,6 +26,7 @@ import Link from 'next/link'
import { BalanceWarning } from '~/components/interface/locks/Create/elements/BalanceWarning'
import { ProtocolFee } from '~/components/interface/locks/Create/elements/ProtocolFee'
import { useAuthenticate } from '~/hooks/useAuthenticate'
+import { useWeb3Service } from '~/utils/withWeb3Service'
// TODO replace with zod, but only once we have replaced Lock and MetadataFormData as well
export interface NewCertificationForm {
@@ -56,6 +56,7 @@ export const CertificationForm = ({ onSubmit }: FormProps) => {
const router = useRouter()
const [selectedNetwork, setSelectedNetwork] = useState()
+ const web3Service = useWeb3Service()
const methods = useForm({
mode: 'onChange',
@@ -112,8 +113,6 @@ export const CertificationForm = ({ onSubmit }: FormProps) => {
const { data: balance, isPending: isLoadingBalance } = useQuery({
queryKey: ['getBalance', account, network, selectedNetwork],
queryFn: async () => {
- const web3Service = new Web3Service(networks)
-
return await getAccountTokenBalance(
web3Service,
account!,
diff --git a/unlock-app/src/components/content/events-collection/EventsCollectionDetailContent.tsx b/unlock-app/src/components/content/events-collection/EventsCollectionDetailContent.tsx
index b4d14b3d248..21024b35d2d 100644
--- a/unlock-app/src/components/content/events-collection/EventsCollectionDetailContent.tsx
+++ b/unlock-app/src/components/content/events-collection/EventsCollectionDetailContent.tsx
@@ -202,7 +202,7 @@ export default function EventsCollectionDetailContent({
diff --git a/unlock-app/src/components/content/events-collection/settings/ManagerForm.tsx b/unlock-app/src/components/content/events-collection/settings/ManagerForm.tsx
index 65acee23fd6..31945f8afc5 100644
--- a/unlock-app/src/components/content/events-collection/settings/ManagerForm.tsx
+++ b/unlock-app/src/components/content/events-collection/settings/ManagerForm.tsx
@@ -38,6 +38,13 @@ interface RenounceModalProps {
onConfirm: () => Promise
}
+interface RemoveModalProps {
+ isOpen: boolean
+ setIsOpen: (open: boolean) => void
+ onConfirm: () => Promise
+ managerAddress: string
+}
+
const RenounceModal = ({
isOpen,
setIsOpen,
@@ -65,54 +72,99 @@ const RenounceModal = ({
}
return (
- <>
-
-
+ )
+}
+
+const RemoveModal = ({
+ isOpen,
+ setIsOpen,
+ onConfirm,
+ managerAddress,
+}: RemoveModalProps) => {
+ const onRemove = async () => {
+ await onConfirm()
+ setIsOpen(false)
+ }
+
+ return (
+
+
+
+

+
+
+
Remove Manager
+
+ Are you sure you want to remove{' '}
+ {' '}
+ as a manager?
+
+
+
+
+
+
+
+
)
}
@@ -124,6 +176,7 @@ const CollectionManagerCard = ({
isRemoving,
}: CollectionManagerCardProps) => {
const [renounceModal, setRenounceModal] = useState(false)
+ const [removeModal, setRemoveModal] = useState(false)
const { account } = useAuthenticate()
const isLoggedUser = account === manager
const isManager = collectionManagers.includes(manager)
@@ -150,6 +203,12 @@ const CollectionManagerCard = ({
setIsOpen={setRenounceModal}
onConfirm={onRenounce}
/>
+ onRemove(manager)}
+ managerAddress={managerAddress}
+ />
{managerAddress ? (
@@ -179,7 +238,7 @@ const CollectionManagerCard = ({
{isManager && (
-