From 746ecd07e92dd9444b8fa8cda5c8f32e236e1938 Mon Sep 17 00:00:00 2001 From: BenKurrek Date: Thu, 18 May 2023 14:51:35 -0400 Subject: [PATCH 01/12] started on new READMEs --- .gitignore | 2 +- package.json | 3 +- packages/core/README.md | 209 +++++++ packages/core/lib/lib/keypom.d.ts | 17 + packages/core/lib/lib/keypom.js | 24 +- packages/core/package.json | 4 +- packages/core/src/lib/keypom.ts | 25 +- packages/core/test/creation.test.js | 312 +++++----- typedoc.json => packages/core/typedoc.json | 2 +- packages/selector/README.md | 664 +++++++++++++++++++++ packages/selector/package.json | 4 +- packages/selector/typedoc.json | 5 + pnpm-lock.yaml | 37 ++ 13 files changed, 1137 insertions(+), 171 deletions(-) create mode 100644 packages/core/README.md rename typedoc.json => packages/core/typedoc.json (84%) create mode 100644 packages/selector/README.md create mode 100644 packages/selector/typedoc.json diff --git a/.gitignore b/.gitignore index b01db286d..4b409bcb0 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ yarn.lock /out notes -doc +docs/ *_links.json diff --git a/package.json b/package.json index 03b800ba4..6c8ee9422 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "husky": "^7.0.4", "rimraf": "^3.0.2", "turbo": "^1.4.5", - "typescript": "^4.9.4" + "typescript": "^4.9.4", + "typedoc": "^0.24.7" } } diff --git a/packages/core/README.md b/packages/core/README.md new file mode 100644 index 000000000..b37efd7fc --- /dev/null +++ b/packages/core/README.md @@ -0,0 +1,209 @@ +

+ + + + + +

Keypom Core SDK

+ +

+ +

+ + + + + + + + + + + + +

+ +The core package serves as a way to interact with Keypom through a set of easy to use methods that abstract away the complexities of the protocol. The package includes ways to: +- Create drops of all kinds +- Claim drops +- Create and use trial accounts +- View information about drops and keys +- Delete drops and refund assets +- Manage user balances + +
+Table of Contents + +- [Installation](#installation) +- [Getting Started](#getting-started) + - [Initializing the SDK](#initializing-the-sdk) + - [View Functions](#view-functions) + - [Creating Drops](#creating-drops) + - [Claiming Linkdrops](#claiming-linkdrops) + - [Deleting Keys and Drops](#Deleting-Keys-and-Drops) + - [Account Balances for Smooth UX](#Account-Balances-for-Smooth-UX) + - [Utility Functions](#Utility-Functions) +- [Contributing](#contributing) + +
+ +--- + +# Installation + +To install the Keypom Core SDK, run the following command: + +```bash +npm install @keypom/core +# or +yarn add @keypom/core +# or +pnpm add @keypom/core +``` + +# Getting Started + +The first thing you must *always* do when using the SDK is to call `initKeypom`. This will initialize the package state and establish a connection to the NEAR blockchain. + +By default, the SDK will create a new [InMemoryKeyStore](https://github.com/near/near-api-js/blob/master/packages/keystores/src/in_memory_key_store.ts) to sign transactions with. Thus, if you don't pass in a `funder` object, you won't be able to sign transactions and can only invoke utility and view methods. Alternatively, if you'd like to use a different keystore, you can pass in a customized `near` object to the initialization function. + +With the SDK, every function that requires transactions to be signed can be carried through in 1 of two ways: +1. Passing in an [Account](https://github.com/near/near-api-js/blob/master/packages/accounts/src/account.ts) object into the function whose keys are kept in the SDK's keystore. +2. Passing in a `funder` object once during initialization whose keys will be kept in the SDK's [InMemoryKeyStore](https://github.com/near/near-api-js/blob/master/packages/keystores/src/in_memory_key_store.ts). + +## View Methods & Utility Functions Only + +If your only purpose is to query information from the chain or use Keypom's utility functions such as `generateKeys`, you don't need to pass in a `near` or `funder` object to `initKeypom`: + +```js +await initKeypom({ + network: "testnet" +}); + +const keys = await generateKeys({ + numKeys: 1 +}) +console.log('keys: ', keys) + +const dropSupply = await getKeyTotalSupply(); +console.log('dropSupply: ', dropSupply) +``` + +## Funder Object + +If you have the private key of an account that you'd like to use to sign transactions with, you can pass in a `funder` object to `initKeypom`. The private key can either be hardcoded or passed in through environment variables / secrets. + +Using this method, you only need to pass the funder object once on initialization and can freely invoke any of the SDK methods moving forward. To update the funder object, you can call `updateFunder` and pass in different information. + +```js +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +const dropSupply = await getKeyTotalSupply(); +console.log('dropSupply: ', dropSupply) + +const {keys} = await createDrop({ + numKeys: 1, + depositPerUseNEAR: 1 +}) +console.log('keys: ', keys) +``` + +## Customized KeyStore & Multiple Signers + +Passing in a custom `near` object when initializing Keypom has several benefits as seen below: +- If you have multiple accounts that will be signing transactions and don't want to keep calling `updateFunder`. +- You don't want to hardcode the private key in the `funder` object. +- You have a keystore containing keys that will be used to sign transactions already in scope. + +In this case, you can pass in an existing `near` object and then pass in `Account` objects when calling the SDK methods. + +```js +let keyStore = new UnencryptedFileSystemKeyStore(credentialsPath); +let nearConfig = { + networkId: NETWORK_ID, + keyStore: keyStore, + nodeUrl: `https://rpc.${NETWORK_ID}.near.org`, + walletUrl: `https://wallet.${NETWORK_ID}.near.org`, + helperUrl: `https://helper.${NETWORK_ID}.near.org`, + explorerUrl: `https://explorer.${NETWORK_ID}.near.org`, +}; +let near = new Near(nearConfig); + + +await initKeypom({ + near +}); + +const dropSupply = await getKeyTotalSupply(); +console.log('dropSupply: ', dropSupply) + +const fundingAccount = new Account(near.connection, funderAccountId); +const {keys} = await createDrop({ + account: fundingAccount, + numKeys: 1, + depositPerUseNEAR: 1 +}) +console.log('keys: ', keys) +``` + +# Costs + +It is important to note that the Keypom contracts are 100% **FEE FREE** and will remain that way for the *forseeable future*. These contracts are a public good and are meant to inspire change in the NEAR ecosystem. + +With that being said, there are several mandatory costs that must be taken into account when using Keypom. These costs are broken down into two categories: per key and per drop. + +> **NOTE:** Creating an empty drop and then adding 100 keys in separate calls will incur the same cost as creating a drop with 100 keys in the same call. + +## Per Drop + +When creating an empty drop, there is only one cost to keep in mind regardless of the drop type: +- Storage cost (**~0.006 $NEAR** for simple drops) + +## Per Key +Whenever keys are added to a drop (either when the drop is first created or at a later date), the costs are outlined below. + +### Key Costs for Simple Drop + +- $NEAR sent whenever the key is used (can be 0). +- Access key allowance (**~0.0187 $NEAR per use**). +- Storage for creating access key (**0.001 $NEAR**). +- Storage cost (**~0.006 $NEAR** for simple drops) + +### Additional Costs for NFT Drops + +Since keys aren't registered for use until **after** the contract has received the NFT, we don't know how much storage the token IDs will use on the contract. To combat this, the Keypom contract will automatically measure the storage used up for storing each token ID in the `nft_on_transfer` function and that $NEAR will be taken from the funder's balance. + +### Additional Costs for FT Drops + +Since accounts claiming FTs may or may not be registered on the Fungible Token contract, Keypom will automatically try to register **all** accounts. This means that the drop creators must front the cost of registering users depending on the `storage_balance_bounds` returned from the FT contract. This applies to every use for every key. + +In addition, Keypom must be registered on the FT contract. If you create a FT drop and are the first person to ever do so for a specific FT contract on Keypom, Keypom will be automatically registered when the drop is created. This is a one time cost and once it is done, no other account will need to register Keypom for that specific FT contract. + +### Additional Costs for FC Drops + +Drop creators have a ton of customization available to them when creation Function Call drops. A cost that they might incur is the attached deposit being sent alongside the function call. Keypom will charge creators for all the attached deposits they specify. + +> **NOTE:** The storage costs are dynamically calculated and will vary depending on the information you store on-chain. + +# Contributing + +First off, thanks for taking the time to contribute! Contributions are what makes the open-source community such an amazing place to learn, inspire, and create. Any contributions you make will benefit everybody else and are **greatly appreciated**. + +Please try to create bug reports that are: + +- _Reproducible._ Include steps to reproduce the problem. +- _Specific._ Include as much detail as possible: which version, what environment, etc. +- _Unique._ Do not duplicate existing opened issues. +- _Scoped to a Single Bug._ One bug per report. + +You can use [markdownlint-cli](https://github.com/igorshubovych/markdownlint-cli) to check for common markdown style inconsistency. + +# License + +This project is licensed under the **GPL License**. \ No newline at end of file diff --git a/packages/core/lib/lib/keypom.d.ts b/packages/core/lib/lib/keypom.d.ts index 5a866cdad..d7e2654e2 100644 --- a/packages/core/lib/lib/keypom.d.ts +++ b/packages/core/lib/lib/keypom.d.ts @@ -20,6 +20,11 @@ export declare const networks: { viewAccountId: string; }; }; +/** + * List of supported Keypom contracts that can be used with the SDK. + * + * @group Keypom SDK Environment + */ export declare const supportedKeypomContracts: { mainnet: { 'v1.keypom.near': boolean; @@ -37,16 +42,28 @@ export declare const supportedKeypomContracts: { 'keypom.test.near': boolean; }; }; +/** + * Official linkdrop claim pages for wallets and other applications + * + * @group Keypom SDK Environment + */ export declare const supportedLinkdropClaimPages: { mainnet: { mynearwallet: string; keypom: string; + meteor: string; }; testnet: { mynearwallet: string; keypom: string; + meteor: string; }; }; +/** + * Recovery mapping contracts used to keep track of trial account IDs for given public keys. + * + * @group Keypom SDK Environment + */ export declare const accountMappingContract: { mainnet: string; testnet: string; diff --git a/packages/core/lib/lib/keypom.js b/packages/core/lib/lib/keypom.js index bc7c35982..7ecd91e84 100644 --- a/packages/core/lib/lib/keypom.js +++ b/packages/core/lib/lib/keypom.js @@ -1,9 +1,4 @@ "use strict"; -//import * as nearAPI from "near-api-js"; -// const { -// KeyPair, -// keyStores: { BrowserLocalStorageKeyStore, InMemoryKeyStore }, -// } = nearAPI; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { @@ -20,8 +15,6 @@ const crypto_1 = require("@near-js/crypto"); const keystores_1 = require("@near-js/keystores"); const keystores_browser_1 = require("@near-js/keystores-browser"); const wallet_account_1 = require("@near-js/wallet-account"); -//import { Account, Connection, Near } from "near-api-js"; -//import { KeyStore } from "near-api-js/lib/key_stores"; const near_seed_phrase_1 = require("near-seed-phrase"); const checks_1 = require("./checks"); const keypom_utils_1 = require("./keypom-utils"); @@ -48,6 +41,11 @@ exports.networks = { viewAccountId: 'test.near', }, }; +/** + * List of supported Keypom contracts that can be used with the SDK. + * + * @group Keypom SDK Environment + */ exports.supportedKeypomContracts = { mainnet: { 'v1.keypom.near': false, @@ -65,16 +63,28 @@ exports.supportedKeypomContracts = { 'keypom.test.near': true, }, }; +/** + * Official linkdrop claim pages for wallets and other applications + * + * @group Keypom SDK Environment + */ exports.supportedLinkdropClaimPages = { mainnet: { mynearwallet: 'https://app.mynearwallet.com/linkdrop/CONTRACT_ID/SECRET_KEY', keypom: 'https://keypom.xyz/claim/CONTRACT_ID#SECRET_KEY', + meteor: 'https://wallet.meteorwallet.app/linkdrop/CONTRACT_ID/SECRET_KEY' }, testnet: { mynearwallet: 'https://testnet.mynearwallet.com/linkdrop/CONTRACT_ID/SECRET_KEY', keypom: 'https://testnet.keypom.xyz/claim/CONTRACT_ID#SECRET_KEY', + meteor: 'https://wallet.meteorwallet.app/linkdrop/CONTRACT_ID/SECRET_KEY' }, }; +/** + * Recovery mapping contracts used to keep track of trial account IDs for given public keys. + * + * @group Keypom SDK Environment + */ exports.accountMappingContract = { mainnet: 'v1.mapping.keypom.near', testnet: 'v1.mapping.keypom.testnet', diff --git a/packages/core/package.json b/packages/core/package.json index 6fad06b13..ce2a5e9ea 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -16,7 +16,9 @@ "test:drop-creation": "yarn build && yarn ava:drop-creation", "test:dummy-creation": "yarn build && yarn ava:dummy-creation", "ava:drop-creation": "ava test/creation.test.js -vs --timeout=5m", - "ava:dummy-creation": "ava test/dummy-creation.test.js -vs --timeout=5m" + "ava:dummy-creation": "ava test/dummy-creation.test.js -vs --timeout=5m", + + "build-docs": "npx typedoc --options typedoc.json" }, "author": "benkurrek, mattlockyer", "license": "MIT", diff --git a/packages/core/src/lib/keypom.ts b/packages/core/src/lib/keypom.ts index 5f2dc06ca..b0bce9645 100644 --- a/packages/core/src/lib/keypom.ts +++ b/packages/core/src/lib/keypom.ts @@ -1,16 +1,8 @@ -//import * as nearAPI from "near-api-js"; -// const { -// KeyPair, -// keyStores: { BrowserLocalStorageKeyStore, InMemoryKeyStore }, -// } = nearAPI; - import { Account, Connection } from '@near-js/accounts'; import { KeyPair } from '@near-js/crypto'; import { KeyStore, InMemoryKeyStore } from '@near-js/keystores'; import { BrowserLocalStorageKeyStore } from '@near-js/keystores-browser'; import { Near } from '@near-js/wallet-account'; -//import { Account, Connection, Near } from "near-api-js"; -//import { KeyStore } from "near-api-js/lib/key_stores"; import { parseSeedPhrase } from 'near-seed-phrase'; import { assert, @@ -51,6 +43,11 @@ export const networks = { }, }; +/** + * List of supported Keypom contracts that can be used with the SDK. + * + * @group Keypom SDK Environment + */ export const supportedKeypomContracts = { mainnet: { 'v1.keypom.near': false, @@ -69,18 +66,30 @@ export const supportedKeypomContracts = { }, }; +/** + * Official linkdrop claim pages for wallets and other applications + * + * @group Keypom SDK Environment + */ export const supportedLinkdropClaimPages = { mainnet: { mynearwallet: 'https://app.mynearwallet.com/linkdrop/CONTRACT_ID/SECRET_KEY', keypom: 'https://keypom.xyz/claim/CONTRACT_ID#SECRET_KEY', + meteor: 'https://wallet.meteorwallet.app/linkdrop/CONTRACT_ID/SECRET_KEY' }, testnet: { mynearwallet: 'https://testnet.mynearwallet.com/linkdrop/CONTRACT_ID/SECRET_KEY', keypom: 'https://testnet.keypom.xyz/claim/CONTRACT_ID#SECRET_KEY', + meteor: 'https://wallet.meteorwallet.app/linkdrop/CONTRACT_ID/SECRET_KEY' }, }; +/** + * Recovery mapping contracts used to keep track of trial account IDs for given public keys. + * + * @group Keypom SDK Environment + */ export const accountMappingContract = { mainnet: 'v1.mapping.keypom.near', testnet: 'v1.mapping.keypom.testnet', diff --git a/packages/core/test/creation.test.js b/packages/core/test/creation.test.js index 198627414..a67c99ff5 100644 --- a/packages/core/test/creation.test.js +++ b/packages/core/test/creation.test.js @@ -10,6 +10,7 @@ const { connect, Near } = require("@near-js/wallet-account"); const keypom = require('../lib'); const { Account } = require('@near-js/accounts'); const { parseNearAmount } = require('@near-js/utils'); +const { getKeyTotalSupply } = require('../lib/lib/views'); const { execute, initKeypom, @@ -37,7 +38,6 @@ test('init', async (t) => { const credentialsPath = path.join(homedir, CREDENTIALS_DIR); let keyStore = new UnencryptedFileSystemKeyStore(credentialsPath); - let nearConfig = { networkId: NETWORK_ID, keyStore: keyStore, @@ -46,177 +46,187 @@ test('init', async (t) => { helperUrl: `https://helper.${NETWORK_ID}.near.org`, explorerUrl: `https://explorer.${NETWORK_ID}.near.org`, }; - let near = new Near(nearConfig); - fundingAccount = new Account(near.connection, funderAccountId); - + + await initKeypom({ near }); + + const dropSupply = await getKeyTotalSupply(); + console.log('dropSupply: ', dropSupply) + + const fundingAccount = new Account(near.connection, funderAccountId); + const {keys} = await createDrop({ + account: fundingAccount, + numKeys: 1, + depositPerUseNEAR: 1 + }) + console.log('keys: ', keys) t.true(true); }); -test('token drop', async (t) => { - const wallets = ['mynearwallet', 'herewallet']; - const dropName = 'My Cool Drop Name'; - const depositPerUseNEAR = 1; - const numKeys = 1; - const usesPerKey = 1; - const masterKey = 'MASTER_KEY'; +// test('token drop', async (t) => { +// const wallets = ['mynearwallet', 'herewallet']; +// const dropName = 'My Cool Drop Name'; +// const depositPerUseNEAR = 1; +// const numKeys = 1; +// const usesPerKey = 1; +// const masterKey = 'MASTER_KEY'; - const {dropId} = await createDrop({ - account: fundingAccount, - numKeys: 0, - config: { - usesPerKey, - usage: { - autoDeleteDrop: true, - autoWithdraw: true, - } - }, - metadata: JSON.stringify({ - dropName, - wallets - }), - fcData: { - methods: [[ - { - receiverId: NETWORK_ID === 'testnet' ? 'v1.social08.testnet' : 'social.near', - methodName: "storage_deposit", - args: JSON.stringify({}), - accountIdField: "account_id", - attachedDeposit: parseNearAmount("0.1") - } - ]] - }, - depositPerUseNEAR, - }); +// const {dropId} = await createDrop({ +// account: fundingAccount, +// numKeys: 0, +// config: { +// usesPerKey, +// usage: { +// autoDeleteDrop: true, +// autoWithdraw: true, +// } +// }, +// metadata: JSON.stringify({ +// dropName, +// wallets +// }), +// fcData: { +// methods: [[ +// { +// receiverId: NETWORK_ID === 'testnet' ? 'v1.social08.testnet' : 'social.near', +// methodName: "storage_deposit", +// args: JSON.stringify({}), +// accountIdField: "account_id", +// attachedDeposit: parseNearAmount("0.1") +// } +// ]] +// }, +// depositPerUseNEAR, +// }); + +// let allSecretKeys = []; +// // Loop through in intervals of 50 until numKeys is reached +// let keysAdded = 0; +// while (keysAdded < numKeys) { +// const keysToAdd = Math.min(50, numKeys - keysAdded); +// const {secretKeys, publicKeys} = await generateKeys({ +// numKeys: keysToAdd, +// rootEntropy: `${masterKey}-${dropId}`, +// autoMetaNonceStart: keysAdded +// }); +// await addKeys({ +// account: fundingAccount, +// dropId, +// publicKeys +// }); +// keysAdded += keysToAdd; + +// allSecretKeys = allSecretKeys.concat(secretKeys); +// } + +// const {contractId} = getEnv(); + +// const baseUrl = NETWORK_ID === 'testnet' ? 'https://testnet.mynearwallet.com/linkdrop' : 'https://localhost:1234/linkdrop'; + +// const secretKeysStripped = allSecretKeys.map((sk) => `${baseUrl}/${contractId}/${sk.split(':')[1]}`); - let allSecretKeys = []; - // Loop through in intervals of 50 until numKeys is reached - let keysAdded = 0; - while (keysAdded < numKeys) { - const keysToAdd = Math.min(50, numKeys - keysAdded); - const {secretKeys, publicKeys} = await generateKeys({ - numKeys: keysToAdd, - rootEntropy: `${masterKey}-${dropId}`, - autoMetaNonceStart: keysAdded - }); - await addKeys({ - account: fundingAccount, - dropId, - publicKeys - }); - keysAdded += keysToAdd; - - allSecretKeys = allSecretKeys.concat(secretKeys); - } - - const {contractId} = getEnv(); - - const baseUrl = NETWORK_ID === 'testnet' ? 'https://testnet.mynearwallet.com/linkdrop' : 'https://localhost:1234/linkdrop'; - - const secretKeysStripped = allSecretKeys.map((sk) => `${baseUrl}/${contractId}/${sk.split(':')[1]}`); - - let stringToWrite = ''; - // Loop through each secret key - var i = 0; - for (const sk of secretKeysStripped) { - stringToWrite += sk + '\n'; - i++; - } - - await writeFile(path.resolve(__dirname, 'token_links.json'), stringToWrite); +// let stringToWrite = ''; +// // Loop through each secret key +// var i = 0; +// for (const sk of secretKeysStripped) { +// stringToWrite += sk + '\n'; +// i++; +// } + +// await writeFile(path.resolve(__dirname, 'token_links.json'), stringToWrite); - t.true(true); -}); +// t.true(true); +// }); -test('NFT drop', async (t) => { - const wallets = ["mynearwallet", "herewallet"]; - const dropName = "My Cool Drop Name"; - const depositPerUseNEAR = 0.1; - const numKeys = 50; - const usesPerKey = 1; - const masterKey = "MASTER_KEY"; +// test('NFT drop', async (t) => { +// const wallets = ["mynearwallet", "herewallet"]; +// const dropName = "My Cool Drop Name"; +// const depositPerUseNEAR = 0.1; +// const numKeys = 50; +// const usesPerKey = 1; +// const masterKey = "MASTER_KEY"; - const nftTitle = "Moon NFT!"; - const nftDescription = "A cool NFT for the best dog in the world."; - const nftMediaIPFSHash = "bafybeibwhlfvlytmttpcofahkukuzh24ckcamklia3vimzd4vkgnydy7nq"; +// const nftTitle = "Moon NFT!"; +// const nftDescription = "A cool NFT for the best dog in the world."; +// const nftMediaIPFSHash = "bafybeibwhlfvlytmttpcofahkukuzh24ckcamklia3vimzd4vkgnydy7nq"; - const {dropId} = await createDrop({ - account: fundingAccount, - numKeys: 0, - metadata: JSON.stringify({ - dropName, - wallets - }), - config: { - usesPerKey - }, - depositPerUseNEAR, - fcData: { - methods: [[ - { - receiverId: `nft-v2.keypom.${viewAccountId}`, - methodName: "nft_mint", - args: "", - dropIdField: "mint_id", - accountIdField: "receiver_id", - attachedDeposit: parseNearAmount("0.008") - } - ]] - } - }) +// const {dropId} = await createDrop({ +// account: fundingAccount, +// numKeys: 0, +// metadata: JSON.stringify({ +// dropName, +// wallets +// }), +// config: { +// usesPerKey +// }, +// depositPerUseNEAR, +// fcData: { +// methods: [[ +// { +// receiverId: `nft-v2.keypom.${viewAccountId}`, +// methodName: "nft_mint", +// args: "", +// dropIdField: "mint_id", +// accountIdField: "receiver_id", +// attachedDeposit: parseNearAmount("0.008") +// } +// ]] +// } +// }) - let allSecretKeys = []; - // Loop through in intervals of 50 until numKeys is reached - let keysAdded = 0; - while (keysAdded < numKeys) { - const keysToAdd = Math.min(50, numKeys - keysAdded); - const {secretKeys, publicKeys} = await generateKeys({ - numKeys: keysToAdd, - rootEntropy: `${masterKey}-${dropId}`, - autoMetaNonceStart: keysAdded - }) - await addKeys({ - account: fundingAccount, - dropId, - publicKeys - }) - keysAdded += keysToAdd; - - allSecretKeys = allSecretKeys.concat(secretKeys); - } - - await keypom.createNFTSeries({ - account: fundingAccount, - dropId, - metadata: { - title: nftTitle, - description: nftDescription, - media: nftMediaIPFSHash - } - }); +// let allSecretKeys = []; +// // Loop through in intervals of 50 until numKeys is reached +// let keysAdded = 0; +// while (keysAdded < numKeys) { +// const keysToAdd = Math.min(50, numKeys - keysAdded); +// const {secretKeys, publicKeys} = await generateKeys({ +// numKeys: keysToAdd, +// rootEntropy: `${masterKey}-${dropId}`, +// autoMetaNonceStart: keysAdded +// }) +// await addKeys({ +// account: fundingAccount, +// dropId, +// publicKeys +// }) +// keysAdded += keysToAdd; - const {contractId} = getEnv(); +// allSecretKeys = allSecretKeys.concat(secretKeys); +// } - const baseUrl = NETWORK_ID === "testnet" ? `https://testnet.keypom-airfoil.pages.dev/claim` : `https://keypom.xyz/claim` +// await keypom.createNFTSeries({ +// account: fundingAccount, +// dropId, +// metadata: { +// title: nftTitle, +// description: nftDescription, +// media: nftMediaIPFSHash +// } +// }); - const secretKeysStripped = allSecretKeys.map((sk) => `${baseUrl}/${contractId}#${sk.split(":")[1]}`) +// const {contractId} = getEnv(); - let stringToWrite = "" - // Loop through each secret key - var i = 0; - for (const sk of secretKeysStripped) { - stringToWrite += sk + "\n"; - i++; - } +// const baseUrl = NETWORK_ID === "testnet" ? `https://testnet.keypom-airfoil.pages.dev/claim` : `https://keypom.xyz/claim` - await writeFile(path.resolve(__dirname, `nft_links.json`), stringToWrite); +// const secretKeysStripped = allSecretKeys.map((sk) => `${baseUrl}/${contractId}#${sk.split(":")[1]}`) - t.true(true); -}); +// let stringToWrite = "" +// // Loop through each secret key +// var i = 0; +// for (const sk of secretKeysStripped) { +// stringToWrite += sk + "\n"; +// i++; +// } + +// await writeFile(path.resolve(__dirname, `nft_links.json`), stringToWrite); + +// t.true(true); +// }); // test('Ticket drops', async (t) => { // const wallets = ["mynearwallet", "herewallet"]; diff --git a/typedoc.json b/packages/core/typedoc.json similarity index 84% rename from typedoc.json rename to packages/core/typedoc.json index c988a2f40..c93dc5db0 100644 --- a/typedoc.json +++ b/packages/core/typedoc.json @@ -1,5 +1,5 @@ { "$schema": "https://typedoc.org/schema.json", "entryPoints": ["./src/index.ts"], - "out": "doc" + "out": "docs" } \ No newline at end of file diff --git a/packages/selector/README.md b/packages/selector/README.md new file mode 100644 index 000000000..5f20e50ea --- /dev/null +++ b/packages/selector/README.md @@ -0,0 +1,664 @@ +
+

+ Keypom JavaScript SDK +

+ Interacting with the Keypom Protocol made seamless. +
+ +
+
+ +Check out our official Keypom [Documentation](https://docs.keypom.xyz/) for tutorials, concepts and more!. + +[![made by BenKurrek](https://img.shields.io/badge/made%20by-BenKurrek-ff1414.svg?style=flat-square)](https://github.com/BenKurrek) +[![made by mattlockyer](https://img.shields.io/badge/made%20by-MattLockyer-ff1414.svg?style=flat-square)](https://github.com/mattlockyer) + + +
+ +
+Table of Contents + +- [About](#about) +- [Installation](#installation) +- [Getting Started](#getting-started) + - [Initializing the SDK](#initializing-the-sdk) + - [View Functions](#view-functions) + - [Creating Drops](#creating-drops) + - [Simple Drop With 10 Random Keys](#creating-a-simple-drop-with-10-random-keys) + - [Simple Drop With Deterministic Keys](#creating-a-simple-drop-with-5-deterministically-generated-keys) + - [Simple Drop With Pre-Created Keys](#creating-a-simple-drop-with-pre-created-keys) + - [Password Protected Keys](#creating-a-simple-drop-with-a-password-protected-key) + - [Claiming Linkdrops](#claiming-linkdrops) + - [Claiming To Existing Account](#claiming-a-linkdrop-to-an-Existing-Account) + - [Claiming To a New Account](#Claiming-a-Linkdrop-and-Onboarding-a-New-User) + - [Claiming Password Protected Drops](#Claiming-a-Password-Protected-Linkdrop) + - [Deleting Keys and Drops](#Deleting-Keys-and-Drops) + - [Deleting Keys](#Delete-Keys) + - [Deleting Drops](#Delete-Drops) + - [Account Balances for Smooth UX](#Account-Balances-for-Smooth-UX) + - [Utility Functions](#Utility-Functions) +- [Tests](#tests) + - [Running the Tests](#Running-the-Tests) +- [Costs](#costs) + - [Per Drop](#per-drop) + - [Per Key](#per-key) +- [How Linkdrops Work](#how-linkdrops-work) +- [Contributing](#contributing) + +
+ +--- + +# About + +> To view our debut talk at NEARCON 2022, click [here](https://www.youtube.com/watch?v=J-BOnfhHV50). +> To read more about the Keypom Protocol, refer to the [official GitHub repository](https://github.com/keypom/keypom#about) + +The Keypom JavaScript SDK is a library that allows developers to easily interact with the Keypom Protocol. The SDK abstracts away all the complex interactions that come with interacting with the protocol. It allows developers to tap into the power of Keypom with as little barrier to entry as possible by providing easy to use plug-and-play functions. + +Developers should be able to focus on building without needing to understand exactly how interactions with the Keypom protocol work. + +The Keypom SDK was built with flexibility in mind. We want to support integrating Keypom whether you're creating a dApp built with the with the [wallet-selector](https://github.com/near/wallet-selector), creating a backend, or if you're simply using a local node script. + +To build the complete TypeDocs locally, run the following command: + +```ts +yarn build-docs && cd doc && python -m http.server 4200 +``` + +Alternatively, you can visit the official Keypom docs which host the type docs found [here](https://docs.keypom.xyz/). + +# Installation + +To install the Keypom SDK, simply run the following command: + +```bash +npm install keypom-js +# or +yarn add keypom-js +# or +pnpm add keypom-js +``` + +This should add the following dependency to your `package.json` where the version number will be the latest SDK release. + +```js +"dependencies": { + "keypom-js": "*.*.*" +}, +``` + + +# Getting Started + +The first thing to do when getting started with the SDK is to call the `initKeypom` function. This will initialize the state and establish a connection to the NEAR blockchain. This *must* be done before using any other function that interacts with the chain. The exception is if you're only using utility functions such as `generateKeys` which does not interact with the blockchain. + +## Initializing the SDK + +When calling `initKeypom`, there are several arguments that can be passed in as outlined below. + +- `near?` ([NEAR](https://github.com/near/near-api-js/blob/master/packages/near-api-js/src/near.ts)): A pre-existing NEAR connection object to use. By default, the SDK will create a new connection based on the `network` passed in. +- `network` (string): The network to connect to, either `mainnet` or `testnet`. +- `funder?` ([Funder](https://github.com/keypom/keypom-js/blob/main/src/lib/types/general.ts#L20-L42)): Object containing important information about the funder's account. If specified, the SDK will use this account to sign all transactions unless otherwise overridden by passing in a `wallet` or `account` argument in the SDK methods. +- `keypomContractId?` (string): Instead of using the most up-to-date, default Keypom contract, you can specify a specific account ID to use. If an older version is specified, some features of the SDK might not be usable. It is important to note that the SDK only works for official Keypom contracts. + +There are several different scenarios that will determine what should be passed into `initKeypom`: +- If you only wish to invoke `view` methods and retrieve information from the Protocol without signing any transactions, no `funder` object is required. +- If the funder changes a lot, you may wish to pass in a custom `near` object that has a `keyStore` containing the keys for each funder. When you then call SDK methods, you can pass in different `account` objects. +- If you're using the SDK on a frontend with wallet-selector, don't pass in a `funder` object and instead pass in a `wallet` object when calling SDK methods. + +## View Functions + +Once the SDK has been initialized, you can start calling methods. The simplest functions to call are those that require no signature and are used to retrieve information from the protocol. A list of view functions available and what they do can be found below. + +- `getKeyBalance` - Returns the balance associated with given key. This is used by the NEAR wallet to display the amount of the linkdrop. +- `getKeyTotalSupply` - Query for the total supply of keys currently on the Keypom contract. +- `getKeys` - Paginate through all active keys on the contract and return a vector of key info. +- `getKeyInformation` - Returns the KeyInfo corresponding to a specific public key. +- `getKeyInformationBatch` - Returns a vector of KeyInfo corresponding to a set of public keys passed in. +- `getDropInformation` - Get information about a specific drop by passing in either a drop ID, public key, or secret key. +- `getKeySupplyForDrop` - Returns the total supply of active keys for a given drop. +- `getKeysForDrop` - Paginate through all keys in a specific drop, returning an array of KeyInfo. +- `getDropSupplyForOwner` - Returns the total supply of active drops for a given account ID +- `getDrops` - Paginate through drops owned by an account. If specified, information for the first 50 keys in each drop can be returned as well. +- `getNftSupplyForDrop` - Return the total supply of token IDs for a given NFT drop. +- `getNftTokenIDsForDrop` - Paginate through token IDs in an NFT drop to return a vector of token IDs. +- `getUserBalance` - Query for a user's current balance on the Keypom contract +- `getContractSourceMetadata` - Returns the source metadata for the Keypom contract that the SDK has been initialized on. This includes valuable information such as which specific version the contract is on and link to exactly which GitHub commit is deployed. + +A quick example of showing how to initialize the SDK and call a view function is shown below: + +```typescript +// Initialize the SDK on testnet. No funder is passed in since we're only doing view calls. +await initKeypom({ + network: "testnet", +}); + +// Query for the Keypom contract's source metadata +const metadata = await getContractSourceMetadata(); + +console.log('metadata: ', metadata) +``` + +## Creating Drops + +The core of Keypom revolves around creating drops. This is where the true power of the protocol comes in. With the SDK, the complex logic and data structures have been simplified and abstracted away from the developer. With this in mind, to create a drop, you need to call the `createDrop` function. It has a suite of arguments depending on what the desired outcome should be: + +- `account?` ([Account](https://github.com/near/near-api-js/blob/master/packages/near-api-js/src/account.ts)) - Valid NEAR account object that if passed in, will be used to sign the txn instead of the funder account. +- `wallet?` ([BrowserWalletBehaviour | Wallet](https://github.com/near/wallet-selector/blob/main/packages/core/src/lib/wallet/wallet.types.ts)) - If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. +- `numKeys` (number) - Specify how many keys should be generated for the drop. If `publicKeys` is not passed in, `numKeys` number of keys are automatically created. The behaviour of this automatic creation depends on if the funder has rootEntropy set OR rootEntropy is passed in. In this case, the keys will be deterministically generated using the drop ID, key nonce, and entropy. Otherwise, each key will be generated randomly. +- `publicKeys?` (string[]) - Pass in a custom set of publicKeys to add to the drop. If this is not passed in, keys will be generated based on the `numKeys` parameter. +- `depositPerUseNEAR?` (number) - Specify how much $NEAR should be contained in each link. Unit in $NEAR (i.e `1` = 1 $NEAR) +- `depositPerUseYocto?` (string) - Specify how much $yoctoNEAR should be contained in each link. Unit in yoctoNEAR (1 yoctoNEAR = 1e-24 $NEAR) +- `dropId?` (string) - Specify a custom drop ID rather than using one from the SDK. If no drop ID is passed in, an ID equal to `Date.now()` will be used. +- `config?` ([DropConfig](https://github.com/keypom/keypom-js/blob/ben/readme/src/lib/types/drops.ts#L61-L99)) - Allows specific drop behaviors to be configured such as the number of uses each key / link will have. +- `metadata?` (string) - Specify a string of metadata to attach to the drop. This can be whatever you would like and is optional. Often this is stringified JSON. +- `simpleData?` ([SimpleData](https://github.com/keypom/keypom-js/blob/main/src/lib/types/drops.ts#L61-L99)) - For creating a simple drop, this contains necessary configurable information about the drop. +- `ftData?` ([FTData](https://github.com/keypom/keypom-js/blob/main/src/lib/types/ft.ts#L1-L23)) - For creating a fungible token drop, this contains necessary configurable information about the drop. +- `nftData?` ([NFTData](https://github.com/keypom/keypom-js/blob/main/src/lib/types/nft.ts#L1-L15)) - For creating a non-fungible token drop, this contains necessary configurable information about the drop. +- `fcData?` ([FCData](https://github.com/keypom/keypom-js/blob/main/src/lib/types/fc.ts#L57-L70)) - For creating a function call drop, this contains necessary configurable information about the drop. +- `rootEntropy?` (string) - Specify a custom entropy to use for generating keys (will overload the funder's rootEntropy if applicable). This parameter only matters if the publicKeys variable is not passed in. +- `basePassword?` (string) - For doing password protected drops, this is the base string that will be used to generate all the passwords. It will be double hashed with the public key and specific key use to generate the password for each key. +- `passwordProtectedUses?` (number[]) - For doing password protected drops, specifies exactly which uses will be password protected. The uses are NOT zero indexed (i.e 1st use = 1). Each use will have a different, unique password generated via double hashing the base password + public key + key use. +- `useBalance?` (boolean) - If the account has a balance within the Keypom contract, set this to true to avoid the need to attach a deposit. If the account doesn't have enough balance, an error will throw. +- `returnTransactions?` (boolean) - If true, the transaction will be returned instead of being signed and sent. This is useful for getting the requiredDeposit from the return value without actually signing the transaction. +- `successUrl?` (string) - When signing with a wallet, a success URl can be included that the user will be redirected to once the transaction has been successfully signed. + +While there are many fields and it may be overwhelming, seeing examples will help clear things up. + +The last thing to note is the return value of `createDrop` since it contains important information that can be used to interact with the drop. The return value is an object with the following fields: +```ts +/** + * Information returned when creating a drop or adding keys via `createDrop` and `addKeys` respectively. + */ +export interface CreateOrAddReturn { + /** The responses to any transactions that were signed and sent to the network. */ + responses?: any, + /** Information about the transactions if `returnTransactions` is specified in the arguments. This will result in the information being returned instead of signed and sent. */ + transactions?: Transaction[], + /** The required deposit that should be attached to the transaction. */ + requiredDeposit?: string, + /** Any keys that were automatically generated. */ + keys?: { + /** Actual KeyPair objects that can be used to sign messages, verify signatures, and get the public and private keys */ + keyPairs: NearKeyPair[]; + /** Set of public keys that were generated */ + publicKeys: string[]; + /** Set of private keys that were generated */ + secretKeys: string[]; + }, + /** The drop ID for the drop that is being interacted with. */ + dropId: string +} +``` + +### Creating a simple drop with 10 random keys + +In this example, a simple $NEAR drop with 10 keys will be created. To start, the Keypom SDK is initialized with a funder object (since a transaction will be signed). This funder object contains no `rootEntropy` field since all the keys should be random. + +The next step is to create the drop with 10 keys. `numKeys` is passed in as well as `depositPerUseNEAR` to indicate that each key should contain 1 $NEAR. + +```js +// Initialize the SDK for the given network and NEAR connection. No entropy passed in so any auto-generated keys will be completely random unless otherwise overwritten. +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +// Create a drop with 10 completely random keys. The return value `keys` contains information about the generated keys +const {keys} = await createDrop({ + numKeys: 10, + depositPerUseNEAR: 1, +}); + +console.log('public keys: ', keys.publicKeys); +console.log('private keys: ', keys.secretKeys); +``` + +### Creating a simple drop with 5 deterministically generated keys + +In this example, a simple $NEAR drop will be created whereby all the keys are deterministically generated based off the funder's `rootEntropy` (think a password). This allows the funder to be able to recover the keys easily assuming they know the password. + +To start, `initKeypom` is called and the funder object is passed in and contains a root entropy set to `my-global-secret-password`. This means that any keys that are *auto-generated* will be based off this entropy rather than being random. + +Once the SDK is initialized, the drop is created with 5 keys and 1 $NEAR per key. To double check if everything worked, the `generateKeys` method can be leveraged where each key can be generated from the `rootEntropy`, the `dropId`, and the corresponding key nonce (starting at 0). This second piece of entropy that is unique to each key is known as `metaEntropy`. We can generated it by setting an array equal to: `["1_0", "1_1", "1_2", "1_3", "1_4"]` where `1` is the drop ID and the second number is the key nonce (separated by an underscore since that's how the SDK does things). What happens behind the scenes is that the root entropy is combined with the meta entropy for each key and hashed to generate the key. + +Using `generateKeys`, the resulting keys can be compared with the ones generated by the SDK and they turn out to be the same. + +```js +// Initialize the SDK for the given network and NEAR connection. Root entropy is passed into the funder account so any generated keys will be based off that entropy. +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey:"d25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1", + rootEntropy: "my-global-secret-password" + } +}); + +// Create a simple drop with 5 keys. Each key will be derived based on the rootEntropy of the funder, drop ID, and key nonce. +const { keys: keysFromDrop, dropId } = await createDrop({ + numKeys: 5, + depositPerUseNEAR: 1, +}); + +// Deterministically Generate the Private Keys: +const nonceDropIdMeta = Array.from({length: 5}, (_, i) => `${dropId}_${i}`); +const manualKeys = await generateKeys({ + numKeys: 5, + rootEntropy: "my-global-secret-password", + metaEntropy: nonceDropIdMeta +}) + +// Get the public and private keys from the keys generated by the drop +const {publicKeys, secretKeys} = keysFromDrop; +// Get the public and private keys from the keys that were manually generated +const {publicKeys: pubKeysGenerated, secretKeys: secretKeysGenerated} = manualKeys; +// These should match! +console.log('secretKeys: ', secretKeys) +console.log('secretKeysGenerated: ', secretKeysGenerated) + +// These should match! +console.log('publicKeys: ', publicKeys) +console.log('pubKeysGenerated: ', pubKeysGenerated) +``` + +### Creating a simple drop with pre-created keys + +This example showcases how you can create a simple drop and pass in keys that are generated ahead of time rather than having them be auto-generated. The first step is always to call `initKeypom`. Once that's finished, the keypairs can be generated by calling `generateKeys` and passing in the number of keys to create. Those public keys can then be passed into `createDrop`. + +```js +// Initialize the SDK for the given network and NEAR connection. No entropy passed in so any auto generated keys will be completely random unless otherwise overwritten. +await initKeypom({ +network: "testnet", +funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" +} +}); + +// Generate 10 random keys +const {publicKeys} = await generateKeys({ + numKeys: 10 +}); + +// Create a drop using the keys that were generated. Since keys are passed in, the return value won't contain information about the keys. +await createDrop({ + publicKeys, + depositPerUseNEAR: 1, +}); +``` + +### Creating a simple drop with a password protected key + +This example shows how you can create a password-protected key. This means that only the person with both the private key *and* the password can claim the $NEAR. The first step is always to call `initKeypom`. After that, a `basePassword` can be passed into `createDrop`. By passing in that parameter, the SDK will enable password protection whereby the password is equal to a hash of `'basePassword + publicKey + keyUse'`. + +```js +// Initialize the SDK for the given network and NEAR connection +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + + +const basePassword = "my-cool-password123"; +// Create a simple drop with 1 $NEAR and pass in a base password to create a unique password for each use of each key +const {keys} = await createDrop({ + numKeys: 1, + depositPerUseNEAR: 1, + basePassword +}); + +// Create the password to pass into claim which is a hash of the basePassword, public key and whichever use we are on +let currentUse = 1; +let passwordForClaim = await hashPassword(basePassword + keys.publicKeys[0] + currentUse.toString()); +``` + +## Claiming Linkdrops + +Once a drop has been created and there are keys available, they can be claimed by calling the SDK's `claim` function. This can be used to either claim the assets to an existing NEAR account or create an entirely new account. The parameters for the function are below. + +- `secretKey` (string) - The private key associated with the Keypom link. This can either contain the `ed25519:` prefix or not. +- `accountId?` (string) - The account ID of an existing account that will be used to claim the drop. +- `newAccountId?` (string) - If passed in, a new account ID will be created and the drop will be claimed to that account. This must be an account that does not exist yet. This must be passed in conjunction with `newPublicKey`. +- `newPublicKey?` (string) - If creating a new account, a public key must be passed in to be used as the full access key for the newly created account. +- `password?` (string) - If a password is required to use the key, it can be passed in. + +As with creating drops, it helps to look at examples to understand the different scenarios whereby calling `claim` makes sense. + +### Claiming a Linkdrop to an Existing Account + +In this example, you'll create a simple $NEAR drop with 1 key. The key will be automatically generated and will be completely random since no entropy is used. The first step is to initialize the SDK and call `createDrop`. The return value will contain `keys` since they're being auto-generated. + +Once the drop is created, the secret key can be used to claim to an existing account `benjiman.testnet`. + +```js +// Initialize the SDK for the given network and NEAR connection +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +// Create a simple drop with 1 $NEAR +const {keys} = await createDrop({ + numKeys: 1, + depositPerUseNEAR: 1, +}); + +// Claim the drop to the passed in account ID +await claim({ + secretKey: keys.secretKeys[0], + accountId: "benjiman.testnet" +}) +``` + +### Claiming a Linkdrop and Onboarding a New User + +This example will show how to onboard a new user by claiming a simple linkdrop. To start, you'll create a simple $NEAR drop with 1 key. The key will be automatically generated and will be completely random since no entropy is used. + +Once the drop is created, `claim` should be called and the new account ID and public key should be passed in. This public key can either be a completely new keypair or the same keypair that was used to claim the linkdrop. In this tutorial, a new keypair is generated. + +```js +// Initialize the SDK for the given network and NEAR connection +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +// Create a simple drop with 1 $NEAR +const {keys} = await createDrop({ + numKeys: 1, + depositPerUseNEAR: 1, +}); + +// create a new keypair which will be used for the new account +const {publicKeys, secretKeys} = await generateKeys({ + numKeys: 1 +}); + +// Claim the drop using the secret key from the drop creation step. The newly created account will have a keypair +// from the generateKeys step. +await claim({ + secretKey: keys.secretKeys[0], + newAccountId: "my-newly-creating-account.testnet", + newPublicKey: publicKeys[0] +}) +``` + +### Claiming a Password Protected Linkdrop + +This example aims to show how a password protected drop can be created and claimed. The first step is always to initialize the SDK. Once that's finished, a base password for the key can be used and passed into `createDrop`. + +When claiming the linkdrop, the password must be passed in otherwise the claim will be unsuccessful. This password is made up of the base password, public key, and current use the key is on (relevant for multi-use keys). + +```js +// Initialize the SDK for the given network and NEAR connection +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +const basePassword = "my-cool-password123"; +// Create a simple drop with 1 $NEAR and pass in a base password to create a unique password for each use of each key +const {keys} = await createDrop({ + numKeys: 1, + depositPerUseNEAR: 1, + basePassword +}); + +// Create the password to pass into claim which is a hash of the basePassword, public key and whichever use we are on +let currentUse = 1; +let passwordForClaim = await hashPassword(basePassword + keys.publicKeys[0] + currentUse.toString()); + +// Claim the drop to the passed in account ID and use the password we generated above. +await claim({ + secretKey: keys.secretKeys[0], + accountId: "benjiman.testnet", + password: passwordForClaim +}) +``` + +## Deleting Keys and Drops + +Often times, not all the keys in your drop will be used. What happens to the excess keys? Keypom allows you to delete keys from a drop and get fully refunded for any unclaimed assets. This is done by calling the SDK's `deleteKeys` and `deleteDrops` respectively. The difference between the two is outlined below. +- `deleteKeys` allows you to delete a set of specific keys from a drop and get refunded for the assets. This does *not* delete the drop as a whole. +- `deleteDrops` allows you to delete a set of drops and all the keys contained within them. It does this by recursively calling `deleteKeys` for each drop until they're empty and then deleting the drop itself. + +The parameters for both functions are outlined below: + +### Delete Keys + +- `account?` ([Account](https://github.com/near/near-api-js/blob/master/packages/near-api-js/src/account.ts)) - Valid NEAR account object that if passed in, will be used to sign the txn instead of the funder account. +- `wallet?` ([BrowserWalletBehaviour | Wallet](https://github.com/near/wallet-selector/blob/main/packages/core/src/lib/wallet/wallet.types.ts)) - If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. +- `publicKeys` (string[] | string) - Specify a set of public keys to delete. If deleting a single publicKey, the string can be passed in without wrapping it in an array. +- `dropId` (string) - Which drop ID do the keys belong to? +- `withdrawBalance?` (boolean) - Whether or not to withdraw any remaining balance on the Keypom contract. + +An example of deleting keys can be seen below where a simple drop with 5 keys is created and one key is deleted. + +```js +// Initialize the SDK for the given network and NEAR connection +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +// Create the simple drop with 5 random keys +const {keys, dropId} = await createDrop({ + numKeys: 5, + depositPerUseNEAR: 1, +}); + +await deleteKeys({ + dropId, + publicKeys: keys.publicKeys[0] // Can be wrapped in an array as well +}) +``` + +### Delete Drops + +- `account?` ([Account](https://github.com/near/near-api-js/blob/master/packages/near-api-js/src/account.ts)) - Valid NEAR account object that if passed in, will be used to sign the txn instead of the funder account. +- `wallet?` ([BrowserWalletBehaviour | Wallet](https://github.com/near/wallet-selector/blob/main/packages/core/src/lib/wallet/wallet.types.ts)) - If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. +- `drops?` ([ProtocolReturnedDrop](https://github.com/keypom/keypom-js/blob/main/src/lib/types/protocol.ts#L29-L60)[]) - If the set of drop information for the drops you want to delete (from `getDropInformation` or `getDrops`) is already known to the client, it can be passed in instead of the drop IDs to reduce computation. +- `dropIds?` (string[]) - Specify a set of drop IDs to delete. +- `withdrawBalance?` (boolean) - Whether or not to withdraw any remaining balance on the Keypom contract. + +An example of deleting drops can be seen below where 5 simple drops are created and then they're all deleted in one call to `deleteDrops`. + +```js +// Initialize the SDK for the given network and NEAR connection +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +// loop to create 5 simple drops each with 5 more keys than the next +for(var i = 0; i < 5; i++) { + // create 10 keys with no entropy (all random) + const {publicKeys} = await generateKeys({ + numKeys: 5 * (i+1) // First drop will have 5, then 10, then 15 etc.. + }); + + // Create the simple + await createDrop({ + publicKeys, + depositPerUseNEAR: 1, + }); +} + +let drops = await getDrops({accountId: "benji_demo.testnet"}); + +await deleteDrops({ + drops +}) + +// Get the number of drops the account has after deletion (should be zero) +const numDrops = await getDropSupply({ + accountId: "benjiman.testnet" +}); + +console.log('numDrops: ', numDrops) +``` + +## Account Balances for Smooth UX + +In order to make the UX of using Keypom seamless, the SDK supports the Protocol's debiting account model. All costs and refunds can go through your account's balance which is stored on the contract. This balance can be topped up or withdrawn at any moment using the SDK's `addToBalance` and `withdrawBalance` functions. + +This account balance system is not used by default and must be explicitly enabled by passing in the `useBalance` flag to any corresponding functions. The benefits of using the account balance system is that for browser based wallets, you can skip redirects. + +A very common scenario is creating a drop with many keys at once. To avoid having to redirect the user many times (since only 100 keys can be added to a drop at once), you can call `createDrop` and pass in `returnTransactions` set to true. This will result in the transaction being returned instead of signed and sent. At this point, you can get the required deposit from the returned object and use that in `addToBalance`. + +At this point, the user will only be redirected once for the call to `addToBalance`. Once they returned, you can call `createDrop` in conjunction with `addKeys` with `useBalance` set to true. + +## Utility Functions + +There are several functions and variables that have been exported in order to make developing easier. Below are a few notable functions: +- `nearAPI` (variable) - Contains a suite of functionalities coming from `near-api-js`. This includes, but is not limited to the KeyPair object, formatting functions, different keystores etc. +- `updateFunder()` - Allows you to update the funder account for the SDK. This is useful if you want to use a different account to sign transactions. +- `useKeypom()` - Returns all the environment variables that are used by the SDK. This includes the funder object, Keypom contract, keystore, NEAR connection etc. +- `hashPassword()` - Generate a sha256 hash of a passed in string. This also supports hex encoded strings. +- `formatNearAmount()` - Converts a human readable NEAR amount (i.e 1.5 $NEAR) to yoctoNEAR. +- `parseNearAmount()` - Converts a yoctoNEAR amount to a human readable NEAR amount (i.e 1500000000000000000000000 yoctoNEAR -> 1.5 $NEAR). +- `generateKeys()` - Generate a desired number of keypairs. These can be created with or without entropy. + +# Tests + +The SDK comes equipped with a number of tests. These can be used as reference for different scenarios that arise with Keypom. To run the tests, you'll need to have a few prerequisites. + +## Running the Tests + +First, you'll need a valid NEAR account's secret key and account ID. These need to exported as environment variables as the tests will be running on testnet and the transactions need to be signed. Export the following environment variables: + +```bash +export TEST_ACCOUNT_ID="YOUR_ACCOUNT_ID" +export TEST_ACCOUNT_PRVKEY="YOUR_SECRET_KEY" +``` + +Once completed, install the dependencies: + +```bash +npm install +``` + +At this point, everything is in order so that the tests can be run. The following command can be used to begin running the tests: + +```bash +npm run test +``` + +If all went well, the following should be outputted once all the tests have run: + +```bash + ✔ delete 1 key from simple drop (3.7s) +requiredDeposit: 1856805594168075000000050 +Receipt: uN5cwkUFXB2gY4LE8vfuCGvA8BcqaTVgoExKQGu2Cct + Log [v1-3.keypom.testnet]: User balance incremented by 1.8568055. Old: 0 new: 1.8568055 + ✔ Create drop and return requiredDeposit so it can be added to balance (10.5s) + ✔ invalid args being passed in + ─ + + 18 tests passed +``` + +# Costs + +It is important to note that the Keypom contracts are 100% **FEE FREE** and will remain that way for the *forseeable future*. These contracts are a public good and are meant to inspire change in the NEAR ecosystem. + +With that being said, there are several mandatory costs that must be taken into account when using Keypom. These costs are broken down into two categories: per key and per drop. + +> **NOTE:** Creating an empty drop and then adding 100 keys in separate calls will incur the same cost as creating a drop with 100 keys in the same call. + +## Per Drop + +When creating an empty drop, there is only one cost to keep in mind regardless of the drop type: +- Storage cost (**~0.006 $NEAR** for simple drops) + +## Per Key +Whenever keys are added to a drop (either when the drop is first created or at a later date), the costs are outlined below. + +### Key Costs for Simple Drop + +- $NEAR sent whenever the key is used (can be 0). +- Access key allowance (**~0.0187 $NEAR per use**). +- Storage for creating access key (**0.001 $NEAR**). +- Storage cost (**~0.006 $NEAR** for simple drops) + +### Additional Costs for NFT Drops + +Since keys aren't registered for use until **after** the contract has received the NFT, we don't know how much storage the token IDs will use on the contract. To combat this, the Keypom contract will automatically measure the storage used up for storing each token ID in the `nft_on_transfer` function and that $NEAR will be taken from the funder's balance. + +### Additional Costs for FT Drops + +Since accounts claiming FTs may or may not be registered on the Fungible Token contract, Keypom will automatically try to register **all** accounts. This means that the drop creators must front the cost of registering users depending on the `storage_balance_bounds` returned from the FT contract. This applies to every use for every key. + +In addition, Keypom must be registered on the FT contract. If you create a FT drop and are the first person to ever do so for a specific FT contract on Keypom, Keypom will be automatically registered when the drop is created. This is a one time cost and once it is done, no other account will need to register Keypom for that specific FT contract. + +### Additional Costs for FC Drops + +Drop creators have a ton of customization available to them when creation Function Call drops. A cost that they might incur is the attached deposit being sent alongside the function call. Keypom will charge creators for all the attached deposits they specify. + +> **NOTE:** The storage costs are dynamically calculated and will vary depending on the information you store on-chain. + +# How Linkdrops Work + +For some background as to how linkdrops works on NEAR: + +*The funder that has an account and some $NEAR:* +- creates a keypair locally `(pubKey1, privKey1)`. The blockchain doesn't know of this key's existence yet since it's all local for now. +- calls `send` on the contract and passes in the `pubKey1` as an argument as well as the desired `balance` for the linkdrop. + - The contract will map the `pubKey1` to the desired `balance` for the linkdrop. + - The contract will then add the `pubKey1` as a **function call access key** with the ability to call `claim` and `create_account_and_claim`. This means that anyone with the `privKey1` that was created locally, can claim this linkdrop. +- Funder will then create a link to send to someone that contains this `privKey1`. The link follows the following format: +``` + wallet.testnet.near.org/linkdrop/{fundingContractAccountId}/{linkdropKeyPairSecretKey}?redirectUrl={redirectUrl} +``` +* `fundingContractAccountId`: The contract accountId that was used to send the funds. +* `linkdropKeyPairSecretKey`: The corresponding secret key to the public key sent to the contract. +* `redirectUrl`: The url that wallet will redirect to after funds are successfully claimed to an existing account. The URL is sent the accountId used to claim the funds as a query param. + +*The receiver of the link that is claiming the linkdrop:* +- Receives the link which includes `privKey1` and sends them to the NEAR wallet. +- Wallet creates a new keypair `(pubKey2, privKey2)` locally. The blockchain doesn't know of this key's existence yet since it's all local for now. +- Receiver will then choose an account ID such as `new_account.near`. +- Wallet will then use the `privKey1` which has access to call `claim` and `create_account_and_claim` in order to call `create_account_and_claim` on the contract. + - It will pass in `pubKey2` which will be used to create a full access key for the new account. +- The contract will create the new account and transfer the funds to it alongside any NFT or fungible tokens pre-loaded. + +# Contributing + +First off, thanks for taking the time to contribute! Contributions are what makes the open-source community such an amazing place to learn, inspire, and create. Any contributions you make will benefit everybody else and are **greatly appreciated**. + +Please try to create bug reports that are: + +- _Reproducible._ Include steps to reproduce the problem. +- _Specific._ Include as much detail as possible: which version, what environment, etc. +- _Unique._ Do not duplicate existing opened issues. +- _Scoped to a Single Bug._ One bug per report. + +You can use [markdownlint-cli](https://github.com/igorshubovych/markdownlint-cli) to check for common markdown style inconsistency. + +# License + +This project is licensed under the **GPL License**. \ No newline at end of file diff --git a/packages/selector/package.json b/packages/selector/package.json index 764996036..ca68338f1 100644 --- a/packages/selector/package.json +++ b/packages/selector/package.json @@ -10,7 +10,9 @@ "lint:js": "eslint -c ../../.eslintrc.js.yml src/**/*.js --no-eslintrc", "lint:js:fix": "eslint -c ../../.eslintrc.js.yml src/**/*.js --no-eslintrc --fix", "lint:ts": "eslint -c ../../.eslintrc.ts.yml src/**/*.ts --no-eslintrc", - "lint:ts:fix": "eslint -c ../../.eslintrc.ts.yml src/**/*.ts --no-eslintrc --fix" + "lint:ts:fix": "eslint -c ../../.eslintrc.ts.yml src/**/*.ts --no-eslintrc --fix", + + "build-docs": "npx typedoc --options typedoc.json" }, "author": "benkurrek, mattlockyer", "license": "MIT", diff --git a/packages/selector/typedoc.json b/packages/selector/typedoc.json new file mode 100644 index 000000000..c93dc5db0 --- /dev/null +++ b/packages/selector/typedoc.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "entryPoints": ["./src/index.ts"], + "out": "docs" +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4a2ff1b25..8e29dadf9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,6 +37,9 @@ importers: turbo: specifier: ^1.4.5 version: 1.4.5 + typedoc: + specifier: ^0.24.7 + version: 0.24.7(typescript@4.9.4) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -1133,6 +1136,10 @@ packages: engines: {node: '>=12'} dev: true + /ansi-sequence-parser@1.1.0: + resolution: {integrity: sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==} + dev: true + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -3111,6 +3118,13 @@ packages: brace-expansion: 2.0.1 dev: true + /minimatch@9.0.0: + resolution: {integrity: sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} @@ -3798,6 +3812,15 @@ packages: vscode-textmate: 8.0.0 dev: true + /shiki@0.14.2: + resolution: {integrity: sha512-ltSZlSLOuSY0M0Y75KA+ieRaZ0Trf5Wl3gutE7jzLuIcWxLp5i/uEnLoQWNvgKXQ5OMpGkJnVMRLAuzjc0LJ2A==} + dependencies: + ansi-sequence-parser: 1.1.0 + jsonc-parser: 3.2.0 + vscode-oniguruma: 1.7.0 + vscode-textmate: 8.0.0 + dev: true + /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: @@ -4325,6 +4348,20 @@ packages: typescript: 4.9.4 dev: true + /typedoc@0.24.7(typescript@4.9.4): + resolution: {integrity: sha512-zzfKDFIZADA+XRIp2rMzLe9xZ6pt12yQOhCr7cD7/PBTjhPmMyMvGrkZ2lPNJitg3Hj1SeiYFNzCsSDrlpxpKw==} + engines: {node: '>= 14.14'} + hasBin: true + peerDependencies: + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x + dependencies: + lunr: 2.3.9 + marked: 4.3.0 + minimatch: 9.0.0 + shiki: 0.14.2 + typescript: 4.9.4 + dev: true + /typescript@4.9.4: resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} engines: {node: '>=4.2.0'} From 5c647c3be805ec848c1683ad5b14a8260d510f58 Mon Sep 17 00:00:00 2001 From: BenKurrek Date: Thu, 18 May 2023 15:00:52 -0400 Subject: [PATCH 02/12] experiment with styles --- packages/core/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/README.md b/packages/core/README.md index b37efd7fc..2c6b1e339 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -10,10 +10,10 @@

- + - + From 66ca7c9bed2c1463e6c63ef7cc4a17f81cc04e5f Mon Sep 17 00:00:00 2001 From: BenKurrek Date: Thu, 18 May 2023 15:10:35 -0400 Subject: [PATCH 03/12] continued style changes --- packages/core/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/README.md b/packages/core/README.md index 2c6b1e339..68c44177c 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -10,13 +10,13 @@

- + - + - + From b862a92d2fc5c67594549df88594896bcdc6a28b Mon Sep 17 00:00:00 2001 From: BenKurrek Date: Thu, 18 May 2023 15:12:19 -0400 Subject: [PATCH 04/12] added community --- packages/core/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/README.md b/packages/core/README.md index 68c44177c..78a7425b3 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -15,11 +15,11 @@ - + - - + +

From 3a51b8e21067087e65614b7fb2ffce68e8aaa581 Mon Sep 17 00:00:00 2001 From: BenKurrek Date: Thu, 18 May 2023 15:22:57 -0400 Subject: [PATCH 05/12] fixed hrefs and moved to clourflare for images --- packages/core/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/core/README.md b/packages/core/README.md index 78a7425b3..40d8cb24f 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -1,8 +1,7 @@

- + - - +

Keypom Core SDK

From 5103ce3d57208f438526831185ce02f921c17225 Mon Sep 17 00:00:00 2001 From: BenKurrek Date: Thu, 18 May 2023 16:19:42 -0400 Subject: [PATCH 06/12] continued work on selector readme, fixed TOC for core, embedded modal options within trial account specs --- packages/core/README.md | 13 +- packages/selector/README.md | 628 ++++----------------------- packages/selector/src/core/setup.ts | 9 +- packages/selector/src/core/types.ts | 24 +- packages/selector/src/core/wallet.ts | 26 +- 5 files changed, 124 insertions(+), 576 deletions(-) diff --git a/packages/core/README.md b/packages/core/README.md index 40d8cb24f..8efcefcd9 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -35,13 +35,12 @@ The core package serves as a way to interact with Keypom through a set of easy t - [Installation](#installation) - [Getting Started](#getting-started) - - [Initializing the SDK](#initializing-the-sdk) - - [View Functions](#view-functions) - - [Creating Drops](#creating-drops) - - [Claiming Linkdrops](#claiming-linkdrops) - - [Deleting Keys and Drops](#Deleting-Keys-and-Drops) - - [Account Balances for Smooth UX](#Account-Balances-for-Smooth-UX) - - [Utility Functions](#Utility-Functions) + - [View Methods & Utility Functions Only](#view-methods--utility-functions-only) + - [Funder Object](#funder-object) + - [Customized KeyStore & Multiple Signers](#customized-keystore--multiple-signers) +- [Costs](#costs) + - [Per Drop](#per-drop) + - [Per Key](#per-key) - [Contributing](#contributing) diff --git a/packages/selector/README.md b/packages/selector/README.md index 5f20e50ea..cbe996da7 100644 --- a/packages/selector/README.md +++ b/packages/selector/README.md @@ -1,304 +1,116 @@ -
-

- Keypom JavaScript SDK -

- Interacting with the Keypom Protocol made seamless. -
- -
-
- -Check out our official Keypom [Documentation](https://docs.keypom.xyz/) for tutorials, concepts and more!. - -[![made by BenKurrek](https://img.shields.io/badge/made%20by-BenKurrek-ff1414.svg?style=flat-square)](https://github.com/BenKurrek) -[![made by mattlockyer](https://img.shields.io/badge/made%20by-MattLockyer-ff1414.svg?style=flat-square)](https://github.com/mattlockyer) - - -
+

+ + + + +

Keypom Wallet Selector

+ +

+ +

+ + + + + + + + + + + + +

+ +The Keypom Wallet Selector is a package that allows apps to be fully compatible with both trial accounts and instant sign in experiences. See the following demos for examples of the user experience. +- Instant Sign-In [Demo](https://www.youtube.com/watch?v=p_NOcYbRlJw&feature=youtu.be) +- Trial Account [Demo](https://www.youtube.com/watch?v=p_NOcYbRlJw)
Table of Contents -- [About](#about) - [Installation](#installation) - [Getting Started](#getting-started) - - [Initializing the SDK](#initializing-the-sdk) - - [View Functions](#view-functions) - - [Creating Drops](#creating-drops) - - [Simple Drop With 10 Random Keys](#creating-a-simple-drop-with-10-random-keys) - - [Simple Drop With Deterministic Keys](#creating-a-simple-drop-with-5-deterministically-generated-keys) - - [Simple Drop With Pre-Created Keys](#creating-a-simple-drop-with-pre-created-keys) - - [Password Protected Keys](#creating-a-simple-drop-with-a-password-protected-key) - - [Claiming Linkdrops](#claiming-linkdrops) - - [Claiming To Existing Account](#claiming-a-linkdrop-to-an-Existing-Account) - - [Claiming To a New Account](#Claiming-a-Linkdrop-and-Onboarding-a-New-User) - - [Claiming Password Protected Drops](#Claiming-a-Password-Protected-Linkdrop) - - [Deleting Keys and Drops](#Deleting-Keys-and-Drops) - - [Deleting Keys](#Delete-Keys) - - [Deleting Drops](#Delete-Drops) - - [Account Balances for Smooth UX](#Account-Balances-for-Smooth-UX) - - [Utility Functions](#Utility-Functions) -- [Tests](#tests) - - [Running the Tests](#Running-the-Tests) -- [Costs](#costs) - - [Per Drop](#per-drop) - - [Per Key](#per-key) -- [How Linkdrops Work](#how-linkdrops-work) + - [Setup Keypom Parameters](#setup-keypom-parameters) +- [Keypom Trial Accounts](#keypom-trial-accounts) +- [Instant Sign-In Experiences](#instant-sign-in-experiences) - [Contributing](#contributing)
--- -# About - -> To view our debut talk at NEARCON 2022, click [here](https://www.youtube.com/watch?v=J-BOnfhHV50). -> To read more about the Keypom Protocol, refer to the [official GitHub repository](https://github.com/keypom/keypom#about) - -The Keypom JavaScript SDK is a library that allows developers to easily interact with the Keypom Protocol. The SDK abstracts away all the complex interactions that come with interacting with the protocol. It allows developers to tap into the power of Keypom with as little barrier to entry as possible by providing easy to use plug-and-play functions. - -Developers should be able to focus on building without needing to understand exactly how interactions with the Keypom protocol work. - -The Keypom SDK was built with flexibility in mind. We want to support integrating Keypom whether you're creating a dApp built with the with the [wallet-selector](https://github.com/near/wallet-selector), creating a backend, or if you're simply using a local node script. - -To build the complete TypeDocs locally, run the following command: - -```ts -yarn build-docs && cd doc && python -m http.server 4200 -``` - -Alternatively, you can visit the official Keypom docs which host the type docs found [here](https://docs.keypom.xyz/). - # Installation -To install the Keypom SDK, simply run the following command: +To install the Keypom Wallet Selector, run the following command: ```bash -npm install keypom-js +npm install @keypom/selector # or -yarn add keypom-js +yarn add @keypom/selector # or -pnpm add keypom-js -``` - -This should add the following dependency to your `package.json` where the version number will be the latest SDK release. - -```js -"dependencies": { - "keypom-js": "*.*.*" -}, +pnpm add @keypom/selector ``` - # Getting Started -The first thing to do when getting started with the SDK is to call the `initKeypom` function. This will initialize the state and establish a connection to the NEAR blockchain. This *must* be done before using any other function that interacts with the chain. The exception is if you're only using utility functions such as `generateKeys` which does not interact with the blockchain. - -## Initializing the SDK - -When calling `initKeypom`, there are several arguments that can be passed in as outlined below. - -- `near?` ([NEAR](https://github.com/near/near-api-js/blob/master/packages/near-api-js/src/near.ts)): A pre-existing NEAR connection object to use. By default, the SDK will create a new connection based on the `network` passed in. -- `network` (string): The network to connect to, either `mainnet` or `testnet`. -- `funder?` ([Funder](https://github.com/keypom/keypom-js/blob/main/src/lib/types/general.ts#L20-L42)): Object containing important information about the funder's account. If specified, the SDK will use this account to sign all transactions unless otherwise overridden by passing in a `wallet` or `account` argument in the SDK methods. -- `keypomContractId?` (string): Instead of using the most up-to-date, default Keypom contract, you can specify a specific account ID to use. If an older version is specified, some features of the SDK might not be usable. It is important to note that the SDK only works for official Keypom contracts. - -There are several different scenarios that will determine what should be passed into `initKeypom`: -- If you only wish to invoke `view` methods and retrieve information from the Protocol without signing any transactions, no `funder` object is required. -- If the funder changes a lot, you may wish to pass in a custom `near` object that has a `keyStore` containing the keys for each funder. When you then call SDK methods, you can pass in different `account` objects. -- If you're using the SDK on a frontend with wallet-selector, don't pass in a `funder` object and instead pass in a `wallet` object when calling SDK methods. +Most apps on NEAR should be compatible with the official [wallet selector](https://github.com/near/wallet-selector) to enable sign-in and sending transactions. For this reason, the Keypom selector has been made to fully support any app that uses the wallet selector. -## View Functions +To get started, navigate to the app's `setupWalletSelector` code where the selector is initialized. Here, you can specify which wallet modules your app should support. Simply add Keypom's `setupKeypom` function to the list of modules and you're good to go! -Once the SDK has been initialized, you can start calling methods. The simplest functions to call are those that require no signature and are used to retrieve information from the protocol. A list of view functions available and what they do can be found below. - -- `getKeyBalance` - Returns the balance associated with given key. This is used by the NEAR wallet to display the amount of the linkdrop. -- `getKeyTotalSupply` - Query for the total supply of keys currently on the Keypom contract. -- `getKeys` - Paginate through all active keys on the contract and return a vector of key info. -- `getKeyInformation` - Returns the KeyInfo corresponding to a specific public key. -- `getKeyInformationBatch` - Returns a vector of KeyInfo corresponding to a set of public keys passed in. -- `getDropInformation` - Get information about a specific drop by passing in either a drop ID, public key, or secret key. -- `getKeySupplyForDrop` - Returns the total supply of active keys for a given drop. -- `getKeysForDrop` - Paginate through all keys in a specific drop, returning an array of KeyInfo. -- `getDropSupplyForOwner` - Returns the total supply of active drops for a given account ID -- `getDrops` - Paginate through drops owned by an account. If specified, information for the first 50 keys in each drop can be returned as well. -- `getNftSupplyForDrop` - Return the total supply of token IDs for a given NFT drop. -- `getNftTokenIDsForDrop` - Paginate through token IDs in an NFT drop to return a vector of token IDs. -- `getUserBalance` - Query for a user's current balance on the Keypom contract -- `getContractSourceMetadata` - Returns the source metadata for the Keypom contract that the SDK has been initialized on. This includes valuable information such as which specific version the contract is on and link to exactly which GitHub commit is deployed. - -A quick example of showing how to initialize the SDK and call a view function is shown below: - -```typescript -// Initialize the SDK on testnet. No funder is passed in since we're only doing view calls. -await initKeypom({ - network: "testnet", +```js +const selector = await setupWalletSelector({ + network: "testnet", + modules: [ + setupMyNearWallet(), + ... + setupSender(), + setupKeypom(PARAMS) + ], }); - -// Query for the Keypom contract's source metadata -const metadata = await getContractSourceMetadata(); - -console.log('metadata: ', metadata) -``` - -## Creating Drops - -The core of Keypom revolves around creating drops. This is where the true power of the protocol comes in. With the SDK, the complex logic and data structures have been simplified and abstracted away from the developer. With this in mind, to create a drop, you need to call the `createDrop` function. It has a suite of arguments depending on what the desired outcome should be: - -- `account?` ([Account](https://github.com/near/near-api-js/blob/master/packages/near-api-js/src/account.ts)) - Valid NEAR account object that if passed in, will be used to sign the txn instead of the funder account. -- `wallet?` ([BrowserWalletBehaviour | Wallet](https://github.com/near/wallet-selector/blob/main/packages/core/src/lib/wallet/wallet.types.ts)) - If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. -- `numKeys` (number) - Specify how many keys should be generated for the drop. If `publicKeys` is not passed in, `numKeys` number of keys are automatically created. The behaviour of this automatic creation depends on if the funder has rootEntropy set OR rootEntropy is passed in. In this case, the keys will be deterministically generated using the drop ID, key nonce, and entropy. Otherwise, each key will be generated randomly. -- `publicKeys?` (string[]) - Pass in a custom set of publicKeys to add to the drop. If this is not passed in, keys will be generated based on the `numKeys` parameter. -- `depositPerUseNEAR?` (number) - Specify how much $NEAR should be contained in each link. Unit in $NEAR (i.e `1` = 1 $NEAR) -- `depositPerUseYocto?` (string) - Specify how much $yoctoNEAR should be contained in each link. Unit in yoctoNEAR (1 yoctoNEAR = 1e-24 $NEAR) -- `dropId?` (string) - Specify a custom drop ID rather than using one from the SDK. If no drop ID is passed in, an ID equal to `Date.now()` will be used. -- `config?` ([DropConfig](https://github.com/keypom/keypom-js/blob/ben/readme/src/lib/types/drops.ts#L61-L99)) - Allows specific drop behaviors to be configured such as the number of uses each key / link will have. -- `metadata?` (string) - Specify a string of metadata to attach to the drop. This can be whatever you would like and is optional. Often this is stringified JSON. -- `simpleData?` ([SimpleData](https://github.com/keypom/keypom-js/blob/main/src/lib/types/drops.ts#L61-L99)) - For creating a simple drop, this contains necessary configurable information about the drop. -- `ftData?` ([FTData](https://github.com/keypom/keypom-js/blob/main/src/lib/types/ft.ts#L1-L23)) - For creating a fungible token drop, this contains necessary configurable information about the drop. -- `nftData?` ([NFTData](https://github.com/keypom/keypom-js/blob/main/src/lib/types/nft.ts#L1-L15)) - For creating a non-fungible token drop, this contains necessary configurable information about the drop. -- `fcData?` ([FCData](https://github.com/keypom/keypom-js/blob/main/src/lib/types/fc.ts#L57-L70)) - For creating a function call drop, this contains necessary configurable information about the drop. -- `rootEntropy?` (string) - Specify a custom entropy to use for generating keys (will overload the funder's rootEntropy if applicable). This parameter only matters if the publicKeys variable is not passed in. -- `basePassword?` (string) - For doing password protected drops, this is the base string that will be used to generate all the passwords. It will be double hashed with the public key and specific key use to generate the password for each key. -- `passwordProtectedUses?` (number[]) - For doing password protected drops, specifies exactly which uses will be password protected. The uses are NOT zero indexed (i.e 1st use = 1). Each use will have a different, unique password generated via double hashing the base password + public key + key use. -- `useBalance?` (boolean) - If the account has a balance within the Keypom contract, set this to true to avoid the need to attach a deposit. If the account doesn't have enough balance, an error will throw. -- `returnTransactions?` (boolean) - If true, the transaction will be returned instead of being signed and sent. This is useful for getting the requiredDeposit from the return value without actually signing the transaction. -- `successUrl?` (string) - When signing with a wallet, a success URl can be included that the user will be redirected to once the transaction has been successfully signed. - -While there are many fields and it may be overwhelming, seeing examples will help clear things up. - -The last thing to note is the return value of `createDrop` since it contains important information that can be used to interact with the drop. The return value is an object with the following fields: -```ts -/** - * Information returned when creating a drop or adding keys via `createDrop` and `addKeys` respectively. - */ -export interface CreateOrAddReturn { - /** The responses to any transactions that were signed and sent to the network. */ - responses?: any, - /** Information about the transactions if `returnTransactions` is specified in the arguments. This will result in the information being returned instead of signed and sent. */ - transactions?: Transaction[], - /** The required deposit that should be attached to the transaction. */ - requiredDeposit?: string, - /** Any keys that were automatically generated. */ - keys?: { - /** Actual KeyPair objects that can be used to sign messages, verify signatures, and get the public and private keys */ - keyPairs: NearKeyPair[]; - /** Set of public keys that were generated */ - publicKeys: string[]; - /** Set of private keys that were generated */ - secretKeys: string[]; - }, - /** The drop ID for the drop that is being interacted with. */ - dropId: string -} ``` -### Creating a simple drop with 10 random keys +## Setup Keypom Parameters -In this example, a simple $NEAR drop with 10 keys will be created. To start, the Keypom SDK is initialized with a funder object (since a transaction will be signed). This funder object contains no `rootEntropy` field since all the keys should be random. +`setupKeypom` is the core of the Keypom wallet selector and is the only function you need to worry about. There are a suite of customizable features that you can make use of to tailor the user experience to your app's needs. At its core, the setup function takes the following parameters: -The next step is to create the drop with 10 keys. `numKeys` is passed in as well as `depositPerUseNEAR` to indicate that each key should contain 1 $NEAR. - -```js -// Initialize the SDK for the given network and NEAR connection. No entropy passed in so any auto-generated keys will be completely random unless otherwise overwritten. -await initKeypom({ - network: "testnet", - funder: { - accountId: "benji_demo.testnet", - secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" - } -}); - -// Create a drop with 10 completely random keys. The return value `keys` contains information about the generated keys -const {keys} = await createDrop({ - numKeys: 10, - depositPerUseNEAR: 1, -}); - -console.log('public keys: ', keys.publicKeys); -console.log('private keys: ', keys.secretKeys); -``` +- `networkId`: Either `testnet` or `mainnet`. +- `signInContractId`: Which contract will be used to sign in users. +- `trialAccountSpecs`: If specified, trial accounts will be supported on the app. These specifications outline two aspects: + 1. How the URL should be constructed for the app to trigger the trial account sign in flow. + 2. Customizable options for the trial account modals including *all* the text such as titles, descriptions, buttons, placeholders etc. In addition, you can specify exactly which off-boarding wallets you'd like to support. +- `instantSignInSpecs`: If specified, trial accounts will be supported on the app. The instant sign in specs dictate how the URL should be constructed for the app to trigger the instant sign in flow. -### Creating a simple drop with 5 deterministically generated keys +# Keypom Trial Accounts -In this example, a simple $NEAR drop will be created whereby all the keys are deterministically generated based off the funder's `rootEntropy` (think a password). This allows the funder to be able to recover the keys easily assuming they know the password. +Keypom Trial Accounts are an exciting new opportunity for Web3 apps to seamlessly onboard users whether they’re completely new to crypto or seasoned veterans. With the click of a link, users require no software, wallet setup, wallet connection, and are *instantly signed into apps* with their trial account, ready to make on-chain transactions. Unlike most other onboarding mechanisms, the entire experience can be embedded *directly in the app* to increase user retention and is entirely on-chain. -To start, `initKeypom` is called and the funder object is passed in and contains a root entropy set to `my-global-secret-password`. This means that any keys that are *auto-generated* will be based off this entropy rather than being random. +This technology is perfect for dApps of all sizes ranging from small indie to large enterprise applications. -Once the SDK is initialized, the drop is created with 5 keys and 1 $NEAR per key. To double check if everything worked, the `generateKeys` method can be leveraged where each key can be generated from the `rootEntropy`, the `dropId`, and the corresponding key nonce (starting at 0). This second piece of entropy that is unique to each key is known as `metaEntropy`. We can generated it by setting an array equal to: `["1_0", "1_1", "1_2", "1_3", "1_4"]` where `1` is the drop ID and the second number is the key nonce (separated by an underscore since that's how the SDK does things). What happens behind the scenes is that the root entropy is combined with the meta entropy for each key and hashed to generate the key. +In order to support trial accounts, your app must have the `setupKeypom` function embedded within the wallet selector with the `trialAccountSpecs` parameter specified. -Using `generateKeys`, the resulting keys can be compared with the ones generated by the SDK and they turn out to be the same. ```js -// Initialize the SDK for the given network and NEAR connection. Root entropy is passed into the funder account so any generated keys will be based off that entropy. await initKeypom({ - network: "testnet", - funder: { - accountId: "benji_demo.testnet", - secretKey:"d25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1", - rootEntropy: "my-global-secret-password" - } + network: "testnet" }); -// Create a simple drop with 5 keys. Each key will be derived based on the rootEntropy of the funder, drop ID, and key nonce. -const { keys: keysFromDrop, dropId } = await createDrop({ - numKeys: 5, - depositPerUseNEAR: 1, -}); - -// Deterministically Generate the Private Keys: -const nonceDropIdMeta = Array.from({length: 5}, (_, i) => `${dropId}_${i}`); -const manualKeys = await generateKeys({ - numKeys: 5, - rootEntropy: "my-global-secret-password", - metaEntropy: nonceDropIdMeta +const keys = await generateKeys({ + numKeys: 1 }) +console.log('keys: ', keys) -// Get the public and private keys from the keys generated by the drop -const {publicKeys, secretKeys} = keysFromDrop; -// Get the public and private keys from the keys that were manually generated -const {publicKeys: pubKeysGenerated, secretKeys: secretKeysGenerated} = manualKeys; -// These should match! -console.log('secretKeys: ', secretKeys) -console.log('secretKeysGenerated: ', secretKeysGenerated) - -// These should match! -console.log('publicKeys: ', publicKeys) -console.log('pubKeysGenerated: ', pubKeysGenerated) +const dropSupply = await getKeyTotalSupply(); +console.log('dropSupply: ', dropSupply) ``` -### Creating a simple drop with pre-created keys - -This example showcases how you can create a simple drop and pass in keys that are generated ahead of time rather than having them be auto-generated. The first step is always to call `initKeypom`. Once that's finished, the keypairs can be generated by calling `generateKeys` and passing in the number of keys to create. Those public keys can then be passed into `createDrop`. - -```js -// Initialize the SDK for the given network and NEAR connection. No entropy passed in so any auto generated keys will be completely random unless otherwise overwritten. -await initKeypom({ -network: "testnet", -funder: { - accountId: "benji_demo.testnet", - secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" -} -}); - -// Generate 10 random keys -const {publicKeys} = await generateKeys({ - numKeys: 10 -}); +## Funder Object -// Create a drop using the keys that were generated. Since keys are passed in, the return value won't contain information about the keys. -await createDrop({ - publicKeys, - depositPerUseNEAR: 1, -}); -``` +If you have the private key of an account that you'd like to use to sign transactions with, you can pass in a `funder` object to `initKeypom`. The private key can either be hardcoded or passed in through environment variables / secrets. -### Creating a simple drop with a password protected key - -This example shows how you can create a password-protected key. This means that only the person with both the private key *and* the password can claim the $NEAR. The first step is always to call `initKeypom`. After that, a `basePassword` can be passed into `createDrop`. By passing in that parameter, the SDK will enable password protection whereby the password is equal to a hash of `'basePassword + publicKey + keyUse'`. +Using this method, you only need to pass the funder object once on initialization and can freely invoke any of the SDK methods moving forward. To update the funder object, you can call `updateFunder` and pass in different information. ```js -// Initialize the SDK for the given network and NEAR connection await initKeypom({ network: "testnet", funder: { @@ -307,279 +119,52 @@ await initKeypom({ } }); +const dropSupply = await getKeyTotalSupply(); +console.log('dropSupply: ', dropSupply) -const basePassword = "my-cool-password123"; -// Create a simple drop with 1 $NEAR and pass in a base password to create a unique password for each use of each key -const {keys} = await createDrop({ - numKeys: 1, - depositPerUseNEAR: 1, - basePassword -}); - -// Create the password to pass into claim which is a hash of the basePassword, public key and whichever use we are on -let currentUse = 1; -let passwordForClaim = await hashPassword(basePassword + keys.publicKeys[0] + currentUse.toString()); -``` - -## Claiming Linkdrops - -Once a drop has been created and there are keys available, they can be claimed by calling the SDK's `claim` function. This can be used to either claim the assets to an existing NEAR account or create an entirely new account. The parameters for the function are below. - -- `secretKey` (string) - The private key associated with the Keypom link. This can either contain the `ed25519:` prefix or not. -- `accountId?` (string) - The account ID of an existing account that will be used to claim the drop. -- `newAccountId?` (string) - If passed in, a new account ID will be created and the drop will be claimed to that account. This must be an account that does not exist yet. This must be passed in conjunction with `newPublicKey`. -- `newPublicKey?` (string) - If creating a new account, a public key must be passed in to be used as the full access key for the newly created account. -- `password?` (string) - If a password is required to use the key, it can be passed in. - -As with creating drops, it helps to look at examples to understand the different scenarios whereby calling `claim` makes sense. - -### Claiming a Linkdrop to an Existing Account - -In this example, you'll create a simple $NEAR drop with 1 key. The key will be automatically generated and will be completely random since no entropy is used. The first step is to initialize the SDK and call `createDrop`. The return value will contain `keys` since they're being auto-generated. - -Once the drop is created, the secret key can be used to claim to an existing account `benjiman.testnet`. - -```js -// Initialize the SDK for the given network and NEAR connection -await initKeypom({ - network: "testnet", - funder: { - accountId: "benji_demo.testnet", - secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" - } -}); - -// Create a simple drop with 1 $NEAR const {keys} = await createDrop({ numKeys: 1, - depositPerUseNEAR: 1, -}); - -// Claim the drop to the passed in account ID -await claim({ - secretKey: keys.secretKeys[0], - accountId: "benjiman.testnet" + depositPerUseNEAR: 1 }) +console.log('keys: ', keys) ``` -### Claiming a Linkdrop and Onboarding a New User +## Customized KeyStore & Multiple Signers -This example will show how to onboard a new user by claiming a simple linkdrop. To start, you'll create a simple $NEAR drop with 1 key. The key will be automatically generated and will be completely random since no entropy is used. +Passing in a custom `near` object when initializing Keypom has several benefits as seen below: +- If you have multiple accounts that will be signing transactions and don't want to keep calling `updateFunder`. +- You don't want to hardcode the private key in the `funder` object. +- You have a keystore containing keys that will be used to sign transactions already in scope. -Once the drop is created, `claim` should be called and the new account ID and public key should be passed in. This public key can either be a completely new keypair or the same keypair that was used to claim the linkdrop. In this tutorial, a new keypair is generated. +In this case, you can pass in an existing `near` object and then pass in `Account` objects when calling the SDK methods. ```js -// Initialize the SDK for the given network and NEAR connection -await initKeypom({ - network: "testnet", - funder: { - accountId: "benji_demo.testnet", - secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" - } -}); +let keyStore = new UnencryptedFileSystemKeyStore(credentialsPath); +let nearConfig = { + networkId: NETWORK_ID, + keyStore: keyStore, + nodeUrl: `https://rpc.${NETWORK_ID}.near.org`, + walletUrl: `https://wallet.${NETWORK_ID}.near.org`, + helperUrl: `https://helper.${NETWORK_ID}.near.org`, + explorerUrl: `https://explorer.${NETWORK_ID}.near.org`, +}; +let near = new Near(nearConfig); -// Create a simple drop with 1 $NEAR -const {keys} = await createDrop({ - numKeys: 1, - depositPerUseNEAR: 1, -}); - -// create a new keypair which will be used for the new account -const {publicKeys, secretKeys} = await generateKeys({ - numKeys: 1 -}); - -// Claim the drop using the secret key from the drop creation step. The newly created account will have a keypair -// from the generateKeys step. -await claim({ - secretKey: keys.secretKeys[0], - newAccountId: "my-newly-creating-account.testnet", - newPublicKey: publicKeys[0] -}) -``` - -### Claiming a Password Protected Linkdrop - -This example aims to show how a password protected drop can be created and claimed. The first step is always to initialize the SDK. Once that's finished, a base password for the key can be used and passed into `createDrop`. -When claiming the linkdrop, the password must be passed in otherwise the claim will be unsuccessful. This password is made up of the base password, public key, and current use the key is on (relevant for multi-use keys). - -```js -// Initialize the SDK for the given network and NEAR connection await initKeypom({ - network: "testnet", - funder: { - accountId: "benji_demo.testnet", - secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" - } + near }); -const basePassword = "my-cool-password123"; -// Create a simple drop with 1 $NEAR and pass in a base password to create a unique password for each use of each key +const dropSupply = await getKeyTotalSupply(); +console.log('dropSupply: ', dropSupply) + +const fundingAccount = new Account(near.connection, funderAccountId); const {keys} = await createDrop({ + account: fundingAccount, numKeys: 1, - depositPerUseNEAR: 1, - basePassword -}); - -// Create the password to pass into claim which is a hash of the basePassword, public key and whichever use we are on -let currentUse = 1; -let passwordForClaim = await hashPassword(basePassword + keys.publicKeys[0] + currentUse.toString()); - -// Claim the drop to the passed in account ID and use the password we generated above. -await claim({ - secretKey: keys.secretKeys[0], - accountId: "benjiman.testnet", - password: passwordForClaim -}) -``` - -## Deleting Keys and Drops - -Often times, not all the keys in your drop will be used. What happens to the excess keys? Keypom allows you to delete keys from a drop and get fully refunded for any unclaimed assets. This is done by calling the SDK's `deleteKeys` and `deleteDrops` respectively. The difference between the two is outlined below. -- `deleteKeys` allows you to delete a set of specific keys from a drop and get refunded for the assets. This does *not* delete the drop as a whole. -- `deleteDrops` allows you to delete a set of drops and all the keys contained within them. It does this by recursively calling `deleteKeys` for each drop until they're empty and then deleting the drop itself. - -The parameters for both functions are outlined below: - -### Delete Keys - -- `account?` ([Account](https://github.com/near/near-api-js/blob/master/packages/near-api-js/src/account.ts)) - Valid NEAR account object that if passed in, will be used to sign the txn instead of the funder account. -- `wallet?` ([BrowserWalletBehaviour | Wallet](https://github.com/near/wallet-selector/blob/main/packages/core/src/lib/wallet/wallet.types.ts)) - If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. -- `publicKeys` (string[] | string) - Specify a set of public keys to delete. If deleting a single publicKey, the string can be passed in without wrapping it in an array. -- `dropId` (string) - Which drop ID do the keys belong to? -- `withdrawBalance?` (boolean) - Whether or not to withdraw any remaining balance on the Keypom contract. - -An example of deleting keys can be seen below where a simple drop with 5 keys is created and one key is deleted. - -```js -// Initialize the SDK for the given network and NEAR connection -await initKeypom({ - network: "testnet", - funder: { - accountId: "benji_demo.testnet", - secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" - } -}); - -// Create the simple drop with 5 random keys -const {keys, dropId} = await createDrop({ - numKeys: 5, - depositPerUseNEAR: 1, -}); - -await deleteKeys({ - dropId, - publicKeys: keys.publicKeys[0] // Can be wrapped in an array as well + depositPerUseNEAR: 1 }) -``` - -### Delete Drops - -- `account?` ([Account](https://github.com/near/near-api-js/blob/master/packages/near-api-js/src/account.ts)) - Valid NEAR account object that if passed in, will be used to sign the txn instead of the funder account. -- `wallet?` ([BrowserWalletBehaviour | Wallet](https://github.com/near/wallet-selector/blob/main/packages/core/src/lib/wallet/wallet.types.ts)) - If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. -- `drops?` ([ProtocolReturnedDrop](https://github.com/keypom/keypom-js/blob/main/src/lib/types/protocol.ts#L29-L60)[]) - If the set of drop information for the drops you want to delete (from `getDropInformation` or `getDrops`) is already known to the client, it can be passed in instead of the drop IDs to reduce computation. -- `dropIds?` (string[]) - Specify a set of drop IDs to delete. -- `withdrawBalance?` (boolean) - Whether or not to withdraw any remaining balance on the Keypom contract. - -An example of deleting drops can be seen below where 5 simple drops are created and then they're all deleted in one call to `deleteDrops`. - -```js -// Initialize the SDK for the given network and NEAR connection -await initKeypom({ - network: "testnet", - funder: { - accountId: "benji_demo.testnet", - secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" - } -}); - -// loop to create 5 simple drops each with 5 more keys than the next -for(var i = 0; i < 5; i++) { - // create 10 keys with no entropy (all random) - const {publicKeys} = await generateKeys({ - numKeys: 5 * (i+1) // First drop will have 5, then 10, then 15 etc.. - }); - - // Create the simple - await createDrop({ - publicKeys, - depositPerUseNEAR: 1, - }); -} - -let drops = await getDrops({accountId: "benji_demo.testnet"}); - -await deleteDrops({ - drops -}) - -// Get the number of drops the account has after deletion (should be zero) -const numDrops = await getDropSupply({ - accountId: "benjiman.testnet" -}); - -console.log('numDrops: ', numDrops) -``` - -## Account Balances for Smooth UX - -In order to make the UX of using Keypom seamless, the SDK supports the Protocol's debiting account model. All costs and refunds can go through your account's balance which is stored on the contract. This balance can be topped up or withdrawn at any moment using the SDK's `addToBalance` and `withdrawBalance` functions. - -This account balance system is not used by default and must be explicitly enabled by passing in the `useBalance` flag to any corresponding functions. The benefits of using the account balance system is that for browser based wallets, you can skip redirects. - -A very common scenario is creating a drop with many keys at once. To avoid having to redirect the user many times (since only 100 keys can be added to a drop at once), you can call `createDrop` and pass in `returnTransactions` set to true. This will result in the transaction being returned instead of signed and sent. At this point, you can get the required deposit from the returned object and use that in `addToBalance`. - -At this point, the user will only be redirected once for the call to `addToBalance`. Once they returned, you can call `createDrop` in conjunction with `addKeys` with `useBalance` set to true. - -## Utility Functions - -There are several functions and variables that have been exported in order to make developing easier. Below are a few notable functions: -- `nearAPI` (variable) - Contains a suite of functionalities coming from `near-api-js`. This includes, but is not limited to the KeyPair object, formatting functions, different keystores etc. -- `updateFunder()` - Allows you to update the funder account for the SDK. This is useful if you want to use a different account to sign transactions. -- `useKeypom()` - Returns all the environment variables that are used by the SDK. This includes the funder object, Keypom contract, keystore, NEAR connection etc. -- `hashPassword()` - Generate a sha256 hash of a passed in string. This also supports hex encoded strings. -- `formatNearAmount()` - Converts a human readable NEAR amount (i.e 1.5 $NEAR) to yoctoNEAR. -- `parseNearAmount()` - Converts a yoctoNEAR amount to a human readable NEAR amount (i.e 1500000000000000000000000 yoctoNEAR -> 1.5 $NEAR). -- `generateKeys()` - Generate a desired number of keypairs. These can be created with or without entropy. - -# Tests - -The SDK comes equipped with a number of tests. These can be used as reference for different scenarios that arise with Keypom. To run the tests, you'll need to have a few prerequisites. - -## Running the Tests - -First, you'll need a valid NEAR account's secret key and account ID. These need to exported as environment variables as the tests will be running on testnet and the transactions need to be signed. Export the following environment variables: - -```bash -export TEST_ACCOUNT_ID="YOUR_ACCOUNT_ID" -export TEST_ACCOUNT_PRVKEY="YOUR_SECRET_KEY" -``` - -Once completed, install the dependencies: - -```bash -npm install -``` - -At this point, everything is in order so that the tests can be run. The following command can be used to begin running the tests: - -```bash -npm run test -``` - -If all went well, the following should be outputted once all the tests have run: - -```bash - ✔ delete 1 key from simple drop (3.7s) -requiredDeposit: 1856805594168075000000050 -Receipt: uN5cwkUFXB2gY4LE8vfuCGvA8BcqaTVgoExKQGu2Cct - Log [v1-3.keypom.testnet]: User balance incremented by 1.8568055. Old: 0 new: 1.8568055 - ✔ Create drop and return requiredDeposit so it can be added to balance (10.5s) - ✔ invalid args being passed in - ─ - - 18 tests passed +console.log('keys: ', keys) ``` # Costs @@ -621,31 +206,6 @@ Drop creators have a ton of customization available to them when creation Functi > **NOTE:** The storage costs are dynamically calculated and will vary depending on the information you store on-chain. -# How Linkdrops Work - -For some background as to how linkdrops works on NEAR: - -*The funder that has an account and some $NEAR:* -- creates a keypair locally `(pubKey1, privKey1)`. The blockchain doesn't know of this key's existence yet since it's all local for now. -- calls `send` on the contract and passes in the `pubKey1` as an argument as well as the desired `balance` for the linkdrop. - - The contract will map the `pubKey1` to the desired `balance` for the linkdrop. - - The contract will then add the `pubKey1` as a **function call access key** with the ability to call `claim` and `create_account_and_claim`. This means that anyone with the `privKey1` that was created locally, can claim this linkdrop. -- Funder will then create a link to send to someone that contains this `privKey1`. The link follows the following format: -``` - wallet.testnet.near.org/linkdrop/{fundingContractAccountId}/{linkdropKeyPairSecretKey}?redirectUrl={redirectUrl} -``` -* `fundingContractAccountId`: The contract accountId that was used to send the funds. -* `linkdropKeyPairSecretKey`: The corresponding secret key to the public key sent to the contract. -* `redirectUrl`: The url that wallet will redirect to after funds are successfully claimed to an existing account. The URL is sent the accountId used to claim the funds as a query param. - -*The receiver of the link that is claiming the linkdrop:* -- Receives the link which includes `privKey1` and sends them to the NEAR wallet. -- Wallet creates a new keypair `(pubKey2, privKey2)` locally. The blockchain doesn't know of this key's existence yet since it's all local for now. -- Receiver will then choose an account ID such as `new_account.near`. -- Wallet will then use the `privKey1` which has access to call `claim` and `create_account_and_claim` in order to call `create_account_and_claim` on the contract. - - It will pass in `pubKey2` which will be used to create a full access key for the new account. -- The contract will create the new account and transfer the funds to it alongside any NFT or fungible tokens pre-loaded. - # Contributing First off, thanks for taking the time to contribute! Contributions are what makes the open-source community such an amazing place to learn, inspire, and create. Any contributions you make will benefit everybody else and are **greatly appreciated**. diff --git a/packages/selector/src/core/setup.ts b/packages/selector/src/core/setup.ts index 2e399943d..e4b1eac22 100644 --- a/packages/selector/src/core/setup.ts +++ b/packages/selector/src/core/setup.ts @@ -90,12 +90,10 @@ const Keypom: WalletBehaviourFactory< }; export function setupKeypom({ - deprecated = false, trialAccountSpecs, instantSignInSpecs, networkId, - signInContractId, - modalOptions + signInContractId }: KeypomParams): WalletModuleFactory { return async () => { if (!signInContractId || !networkId || !(instantSignInSpecs || trialAccountSpecs)) { @@ -107,8 +105,7 @@ export function setupKeypom({ signInContractId, networkId, trialAccountSpecs, - instantSignInSpecs, - modalOptions + instantSignInSpecs }); // CHECK URL / LOCAL STORAGE TO SEE IF A TRIAL ACCOUNT SHOULD BE SIGNED IN @@ -122,7 +119,7 @@ export function setupKeypom({ name: 'Keypom Account', description: null, iconUrl: '', - deprecated, + deprecated: false, available: true, contractId: signInContractId, runOnStartup: shouldSignIn, diff --git a/packages/selector/src/core/types.ts b/packages/selector/src/core/types.ts index 337d24ee5..e0b31cbb4 100644 --- a/packages/selector/src/core/types.ts +++ b/packages/selector/src/core/types.ts @@ -52,17 +52,20 @@ export interface InternalInstantSignInSpecs extends InstantSignInSpecs { moduleId?: string; } -export interface InstantSignInSpecs extends BaseSignInSpecs { - moduleDelimiter: string; +export interface InternalTrialSignInSpecs extends TrialSignInSpecs { + isMappingAccount: boolean; } -export interface TrialSignInSpecs extends BaseSignInSpecs { - isMappingAccount: boolean; +export interface InstantSignInSpecs { + baseUrl: string; + delimiter: string; + moduleDelimiter: string; } -export interface BaseSignInSpecs { +export interface TrialSignInSpecs { baseUrl: string; delimiter: string; + modalOptions: ModalCustomizations; } export interface SignInOptions { @@ -71,12 +74,6 @@ export interface SignInOptions { methodNames?: string[]; } -// export declare type Optional = Omit & Partial>; - -// export interface SignAndSendTransactionsParams { -// transactions: Array>; -// } - export interface KeypomInitializeOptions { keypomWallet: KeypomWallet } @@ -84,11 +81,8 @@ export interface KeypomInitializeOptions { export interface KeypomParams { networkId: NetworkId; signInContractId: string; - trialAccountSpecs: BaseSignInSpecs, + trialAccountSpecs: TrialSignInSpecs, instantSignInSpecs: InstantSignInSpecs, - deprecated?: boolean; - trialSplitDelim?: string; - modalOptions: ModalCustomizations; } export type KeypomWalletInstant = InstantLinkWallet & { diff --git a/packages/selector/src/core/wallet.ts b/packages/selector/src/core/wallet.ts index bf0c059da..763524e9d 100644 --- a/packages/selector/src/core/wallet.ts +++ b/packages/selector/src/core/wallet.ts @@ -10,7 +10,7 @@ import { KeypomTrialModal, setupModal } from '../modal/src'; import { MODAL_TYPE_IDS, ModalCustomizations } from '../modal/src/lib/modal.types'; import { KEYPOM_LOCAL_STORAGE_KEY, addUserToMappingContract, getAccountFromMap, getLocalStorageKeypomEnv, parseInstantSignInUrl, parseTrialUrl, setLocalStorageKeypomEnv, updateKeypomContractIfValid } from '../utils/selector-utils'; import { SUPPORTED_EXT_WALLET_DATA, extSignAndSendTransactions } from './ext_wallets'; -import { BaseSignInSpecs, FAILED_EXECUTION_OUTCOME, InstantSignInSpecs, InternalInstantSignInSpecs, KEYPOM_MODULE_ID, TrialSignInSpecs } from './types'; +import { FAILED_EXECUTION_OUTCOME, InstantSignInSpecs, InternalInstantSignInSpecs, InternalTrialSignInSpecs, KEYPOM_MODULE_ID, TrialSignInSpecs } from './types'; export class KeypomWallet implements InstantLinkWalletBehaviour { accountId?: string; secretKey?: string; @@ -21,23 +21,21 @@ export class KeypomWallet implements InstantLinkWalletBehaviour { near: Near; keyStore: BrowserLocalStorageKeyStore; - trialAccountSpecs?: TrialSignInSpecs; + trialAccountSpecs?: InternalTrialSignInSpecs; instantSignInSpecs?: InternalInstantSignInSpecs; - modal: KeypomTrialModal; + modal?: KeypomTrialModal; public constructor({ signInContractId, networkId, trialAccountSpecs, instantSignInSpecs, - modalOptions }: { signInContractId: string; networkId: string; - trialAccountSpecs?: BaseSignInSpecs; + trialAccountSpecs?: TrialSignInSpecs; instantSignInSpecs?: InstantSignInSpecs; - modalOptions: ModalCustomizations; }) { console.log('Initializing Keypom'); this.signInContractId = signInContractId; @@ -48,18 +46,18 @@ export class KeypomWallet implements InstantLinkWalletBehaviour { deps: { keyStore: this.keyStore }, }); - let trialSpecs: TrialSignInSpecs | undefined = undefined; + let trialSpecs: InternalTrialSignInSpecs | undefined = undefined; if (trialAccountSpecs !== undefined) { trialSpecs = { ...trialAccountSpecs, isMappingAccount: false } + + this.modal = setupModal(trialAccountSpecs!.modalOptions); } this.trialAccountSpecs = trialSpecs; this.instantSignInSpecs = instantSignInSpecs; - - this.modal = setupModal(modalOptions); } getContractId(): string { @@ -88,7 +86,7 @@ export class KeypomWallet implements InstantLinkWalletBehaviour { // If the drop is unclaimed, we should show the unclaimed drop modal if (isUnclaimed === true) { - this.modal.show({ + this.modal!.show({ id: MODAL_TYPE_IDS.BEGIN_TRIAL, meta: { secretKey, @@ -237,7 +235,7 @@ export class KeypomWallet implements InstantLinkWalletBehaviour { console.log(`e: ${JSON.stringify(e)}`); switch (e) { case TRIAL_ERRORS.EXIT_EXPECTED: { - this.modal.show({ + this.modal!.show({ id: MODAL_TYPE_IDS.TRIAL_OVER, meta: { accountId: this.accountId!, @@ -247,11 +245,11 @@ export class KeypomWallet implements InstantLinkWalletBehaviour { break; } case TRIAL_ERRORS.INVALID_ACTION: { - this.modal.show({id: MODAL_TYPE_IDS.ACTION_ERROR}); + this.modal!.show({id: MODAL_TYPE_IDS.ACTION_ERROR}); break; } case TRIAL_ERRORS.INSUFFICIENT_BALANCE: { - this.modal.show({id: MODAL_TYPE_IDS.INSUFFICIENT_BALANCE}); + this.modal!.show({id: MODAL_TYPE_IDS.INSUFFICIENT_BALANCE}); break; } default: { @@ -276,7 +274,7 @@ export class KeypomWallet implements InstantLinkWalletBehaviour { public showModal = (modalType = {id: MODAL_TYPE_IDS.TRIAL_OVER}) => { console.log('modalType for show modal: ', modalType); - this.modal.show(modalType); + this.modal!.show(modalType); }; public checkValidTrialInfo = () => { From 6d13ee4e3a8e86c3f9d64b030924b737cb005bfc Mon Sep 17 00:00:00 2001 From: BenKurrek Date: Tue, 23 May 2023 12:27:17 -0400 Subject: [PATCH 07/12] refactored delimiter and base URL to use markers --- .../trial-accounts/guest-book/keypom-data.js | 8 +-- .../trial-accounts/guest-book/near-wallet.js | 15 ++--- packages/selector/README.md | 65 ++++++++++++++++--- packages/selector/lib/core/setup.d.ts | 2 +- packages/selector/lib/core/setup.js | 15 +++-- packages/selector/lib/core/types.d.ts | 26 ++++---- packages/selector/lib/core/wallet.d.ts | 12 ++-- packages/selector/lib/core/wallet.js | 44 +++++++++---- .../src/lib/components/OffboardingWallets.js | 9 ++- .../lib/modal/src/lib/handleModalType.d.ts | 1 - .../lib/modal/src/lib/modal.types.d.ts | 3 +- packages/selector/lib/tsconfig.tsbuildinfo | 2 +- .../selector/lib/utils/selector-utils.d.ts | 6 +- packages/selector/src/core/setup.ts | 10 +++ packages/selector/src/core/types.ts | 16 +++-- packages/selector/src/core/wallet.ts | 42 ++++++++++-- .../src/lib/components/OffboardingWallets.tsx | 11 +++- .../selector/src/modal/src/lib/modal.types.ts | 3 +- packages/selector/src/utils/selector-utils.ts | 12 ++-- 19 files changed, 208 insertions(+), 94 deletions(-) diff --git a/packages/docs/tutorials/trial-accounts/guest-book/keypom-data.js b/packages/docs/tutorials/trial-accounts/guest-book/keypom-data.js index a041e6087..386ea3f0a 100644 --- a/packages/docs/tutorials/trial-accounts/guest-book/keypom-data.js +++ b/packages/docs/tutorials/trial-accounts/guest-book/keypom-data.js @@ -45,14 +45,14 @@ export const KEYPOM_OPTIONS = { { name: "MyNEARWallet", description: "Secure your account with a Seed Phrase", - iconUrl: "data:image/png;base64,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", - baseRedirectUrl: "https://localhost:1234/linkdrop/", + redirectUrl: "https://localhost:1234/linkdrop/ACCOUNT_ID/SECRET_KEY", + iconUrl: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAMAAABOo35HAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAD8UExURUdwTGx5rpLO8YOYx1Og0ly29X5ezR4mT0tiji4eWJ953KGn1Jxs7qB9xvfD/Us0gduu8yeh4HOq74dD647R91256eSz+j82cbvg/dSj/LuL79Wp6zCf24KN9xANGRANF59d/0W+/taa/8iN/3HL9uOn/z638Bil7l3G84TP+FHB8o5A/0i9/ZjU+47S+vq8/4Qy/S6w8O+x/5Rp/wyg7G2T/s+T/vO2/+qt/1qp/qDV/HyD/ki4+4R7/qnY/tyh/1Gx/ptU/76E/2bJ9Ld8/4t0/pxe+XvN9iOq7rB0/0i88aRk/6ps/z++/naL/mab/mGh/pVM/wub5mGd+fAEOhEAAAAgdFJOUwBEyWKA47EKJhnFluGA6l3H67Du6crdNOXs5q/I65rcQbfB9AAAIABJREFUeNrsnE9r4zoXxidOG9tNQqBvSrLKeKGF7WIz4J0WgSCuDc1s7vf/Mq/+S0d2p7Zkd7i0SsZJh3th+PGcR4+OpP748T3+4yNODofDKY2/SYxgdbhcfl4ul9M3rY9ZpZefbFwu6TeMD8dJwPp5Sb6l9eFIL5zW5TDoWrEc35wEjtOFDWPxjE2aJMkqWa3W6/WevuigPyVJ+tWngTg+HQ58PmSDQlqvt5Eax+jIBv2UY7umyL6u0JiMBK6DpETp4KqmL/ngX9hnwcEJYl8TGIV1EpzOEaNUCUBqFPwPfRX0W8GfFSPGgX255JCcTpwUByVY1WAU/FHwLxRWV3RdIYGtvhIvKqoVI0WriwoGK1CDvLi8JDouse5L8YqT08M2Op+vVFOYl54wJ+5PkppkJUkJZYlipN9RV1Ne69UXmCOT0zY6Xq+4Kip7GEYGmKZVyNF1ghj9whx//ZfltXQYTE/b8xnTUeFr1R82Lm7vwuPh6Cgz9jr+TVx8Mt+zcTgt0w6Ik310xIJVJXxdUaqgsIzH1w6tjlekxrVdpX/FSlb7zW63a+lrt3vazG8JFiqHVa2ewOQLlR70W1oX58XlhSiv7aerKz4xUvd7Rse9pWO32xxm/VfE6To64yt1KyEsgUt8ckT99GDsHUpL6oq9EaKT4+cWY5weNrvfbZtlNwqLfkpcM0o8XtFMhZlRUT7YYDLKEtmhsurQJNO6R0sEL0brk3FRWe3+ydpMDvblzpDtnvYz/SPihIYFzHRFYYE6xMazBnJWYTyrhsri4uqEfSESPX+WdcWnza7NbjemKyYpVob/Ml5Zu9vP0cmME1aBxZXDuSpdKWSGlK0qxUqteSxUphA7hLoOsednWVe8YiV4y34zTYkX9a4bhXejtbgJp8VQcVmJuDA4Gyp7d2K8TFn1oGnJWbEjqO5ywnLE5+iK8mGyEnbFlMV0dWO1GEyLmhWdA1kKrdiTG7y2duPvss3QWx1qVLVLSxZiJwRWdOQTxJXsd9qrGKvMHsznn4JocbNic6B5KWW5wlLMBmbDesjcOzN4KZLj0uKKD7tWcslcVIJgiLbi1fasSYk3p2WUJTsOdsqqHGVBw9I5q7BQcVp0XlxYXKdNa4Tlqkp8/uNNi0UrzupqawsLd8cYqqoXSkHOqu0ED5SF1AshQo1+tRyteM+F1RhGjXy0oiwZLU9txWwdKEhpTKIIjWv1pDUQHGpXW66uUGfTWi8WIk5Pd6Ao5VqNNDCGq7170WIx9IqFqq4iuXNUVyWr95RVDeYsSKqwPEvSkrgQLcXFhHW/STz8T2uqz9DKfHwrPVisMP/GSV0tZdkxvq6qgf6fzu+1hQsoC+mwRQd/Pi5kXOnmt+Jh53fH4mkG220m/gOSh0gpyuBSVVhhuNxRsbRfh+5sCH1LCqpjvNg39kHYrLiIcfEqZHwah5DzM8tbk2glbBbEVgHKqVANMxViJzvApWFd9wOWcng9FSrHQtLpaUJdgFa8euqHheExzeWptRuzMgqzgpaO8bClVVXuhoXSVT0kLCEtwUo+mG2hxwVoxetdNhYW09YkXUFQ3LIMJ1OJGPJyFoiqVVrD6K6VpSdCpS0xlqjEdD8a1hRa8fYs8DiuBUrRpSWF1e/+DbSzrCq0YpaaDjv2mJ9Wutll9w8xNWKGpLT242gl0fnDEsRDylKkqoF2Vu24FoxYcsGjypDQEa3npRVvRllWw8MXXWGPpJVE0bXvWCad2sLCfc9yZkSoqkI3suyljnQrrimOi+Q5mplWuhnp7zKqUm2lo6wQlqGqQygsteDBoAFfuWsdp1Oquu+82dBZyoKuRdhr3kqksMbSov8dja8jtZVsoyFlye6DrSwtLVxbydQA05hqW1qOZ1mrQ1GENGyxx7y0KKzbOFgNz6ajXT5xogO+2j0H4Fm2tNxeqZXgB5SF3JQFBnWtefPW2DJsVLRvR9KKk4GgpV1LSQv0HjDcwh8CpTfCQHPGWJampF1+zrw12rPElDghQXBa2PV3LFc9lrIwbCtbs2ExBMzOo9ZEqCtQUpLFmOfH59lW1emYAN+2rb1snEDrHWm56QE7uAZmQ1iInb3QkaTEgwhgiIgPNCetdNxqpzUmn4kexFhauOdbYDVtdwAr9zzb8JahyqSwCjtkS4vwwX/K82g7T38rnqgs9Rf30S5/xX9QlhO1avNyldVzeKejbKpQSosI46Jhi+Rzxa109DoajFs2ntYfpNWbEHstmrofsmQZFrD5Dk2LCJNnpkWBoXlMPh4Jq4ENG563vLTVC1qgDut+F75/5AiUIfR36er6Wy4URrp5bCsZBavpb2fcRva3+tqCMb7CTg+w6p8qfb8MkeblmpaweOZblFl5nKPRHHuW4fj+FshbeIgXPPBQgSNa8iwpnAjtIjTuToBpyaW0GvPYFlXWPYTWhDnRNJcx1rs8yrC0ZfWOO4CGA5gLkW1ZrJ2skAlBWQPl5CXctpiyfGG12ciVz0lWIjZLa6Osyj3XVtfvG5YmVViGZa11pGUREUpFepDSIjPYlqeyGtXfmpK3sNUAtGj1TmnB3p+7aWiON1jW3klJ6ToEwqKoaNp6iP8KrEa5/di8dbLnRNxrl1Z21JLLRJgd3MMzrrur7E6QeQBYpCRRMkPO8itDtbc4tmNzBgZvw3Kb8AM7PEJbmhXYMESgj0V0yDI1mHNplcdgafkbPKfF9hPHnA0cWPmArGV1acCJtt5+YQH9ynYsgvS6EDllSGnRKB/s8QEGb3Yxxs6Jg5YFtyyArApnbSjPdPcSKQLKUgbveFYe7vFB0WFKf6u3kYhB9wH2ljUrFUrroe1CI6qOGGERhFCfE/8IlVaYsqZ0bNTKB2OVIrBTifJy4cAR3HcWOhKYG0d7M+Fc0vJTlld/C86JIGrpJQ/olaqLTXVtoSqsRGpWOTC5m3DFKTFQ3LVCc7yXstp+f2vUno/JW043XsbSuhq4kDJ07hZurMJAOmBXiloZJi3fBN/CoyNsPzGdsPKxYZmzy8KvsK5F9WUok0LXIqCfbCJDrljlYpRh0krDytBaJ07RluNa8Jj3UV0if5b3pu2DpI6yYMAyjQYrMhD9CpVWHBwdVH/r9xRaIMTbTRoBar9aJWKs+H1XSqxn8JpVJ2dDiQrBKEqAsgKlFbaQhnlrdCVewTa+Vha/X89+iUMM/49EACsKc/IdwfMNBLRIkWtYufb5IGkxZbE7AtMXh9nAefnt6P1ErNfV8iYPxmd2QeKdS3txslpTXPJeU1cg5PRnUK/+BB9LVDNIi+0btu2f3Gg0vZFnbHQPomK3U0Qgra7nj26Is9s/xyOlUxRDZ9d0KLXjlealPCsnQdJK+CZrm80w2imVKLqB/HoKV9W7ooK4okJ1sxCMWUQld2QbFvArupbmrZpVgLL+xy6DZfdwUqzLNS1viWXO9Rptk1E7e1xdtAaVbSHU26oAwT03ZiWZlbQO/ZsPFNbrLbsNH7qd0gzU57fS8VmeX9SkFTj+kH+SbKNanGCTJ7E63vgjCEYsouZBRYm7OzP4kL4WhfXr9XYb3H+ePjfesmYCLd6Jv068bMPEpY/O2Cdm1E40sqrQrUTOy9/iGSxFqwlgpc9vNU9jK5HdAJ4kK3W++vkIt+w7qzmK+v0GC1Qelh44rF//3uTN6CbMuW6j89aPlHdsztH0y7rsArGqxM5q+BF3BW3lK0WLLRD9LV7Aotq6ZzJvNb7RwfS3Rs2JlBaNml7XRpLt8UiorApwykjHhtwOC4ZUKT/KR986lLAorYErdF7r63a0ttbedwOpcRHSdXCXAsYG1fIjDi/28K1DBYvTalvv4OD0t0ZpK/b/JRuMlrMJTdw8CrO7paz8JRSW0FZIx9Ta8hmprZBuCaWVy/1CGLGsuK54lcLdpbJy7zo0sLhvZd77Yg04NHJfntY2Mg1lgnrtPuDrSloS1+NzGgpLJoh7gLIm97dCGuLbI4E79o6/W7hIqVmVtAx969CG1U+nPnOizBC/F6e1itR2DhlY5pjuqO1ZUlovq3BYglbr5fONX38rpCW+juz9HOT0sGzLKqVxleLta1oQFvetW3Zv5+lBbBf+HQvUtuSBoj/VoPH4UqAqc+JnWg4sOSe2QctEfdBmwv1EP9uKOnUeC2gqH/YrSYo9/JKWC4vTus0grAnpNLAQYcJyls9lbmJDKQ2ePl7mgRWUt5yY2ixNK3k+8gPJTsCydSVQKUxSWW+PXhv5fVgib4V2A6f1t/yldRwMDU5TRvAy0aEs0cNMsGbpb8lfntE0y9JKoiM76O4IK7eDOzAshuqNKeshnQmWS6v1tq3x9xP9XYvYsKyOe8nempYsQEXMz+FF82+YVtuG2tZtcd+iyZRYW6nvKctQkuMlmUtZpr/VhvsWpbVdjla6PZZcWQ4qKCrbsdh4K70yvFbW68Cc6N+yUbm0bTit5bQVr6J8uN0ODMtW1hufDn0yPNvd+TWsLf9EqhY+7LNZ2OWTl37/2O7J6LhgAXsLgcVxvc6Yt8zvSWKLxmZJWunzsXRxldzaS9utchsVez94K+v11+uwbwVKq2kFrHY5WjRqlWYjh6jFoFw8A1BvFqvH5yBlDWnLt2Uj9qcbRqvhymr+T9vZtTaOZGG4m51O3M3AsDOEgaEDXhjsxr6JcXxh3AKLHQnFDk68/v//ZavOV51TVfKHpJRkxUl6LubhOW+dKtlO9VG0fGhFrajsxiihfqi8grPLUpphtbhV9lhH4wdN4fjA3Pr88PcPvcahXQZdgRoVserUaHEZiluGGd5P7BD0TqeyFq18xn8YrdHvf4fmXWJd1oNRg7Wj8z8P3WA9zcmsltwqO9JybQMdOD6oEu//lXRY0X6MTIEECi4dYc0F1DzfQdy8v+UJ4bnU4/FDaEGnlZglpH7sog6LaHWGRbjmuZiH/a36JqfGJbGKYDm3PuJDMSHhCdR/bRf6Q9XezuT7rpdZ8/ZK7HDHgutPToL17QNoueUhvxg5tA2zdDm4I2a7fmXIauV53XY/sQ51aMWq3OHduv8QWDOJLIXqh4703Uyfuy6LQzILec3T+TB7P7E+qxaQqmOriNcH0Bo9yEvVeB6cmbTaxcB2HVfSbBYAw2JM7bpyfwuLcImJtRwniQWX6tvQtD4/SNdOG6N6caP7djnc+PJ5gMxq706vuZ+4ZLeYVSSWgzW4W86szK6MXTdrWjt4dHk7nZg1n8/VtBhXI+xvjc/uby3JqmWmaSCxMLaGdotghbUg35UIMs0w1yned2jWfefM0p3pvGUP4qJZwoucGusCJFp+fBv0k/hGDz/0YtDs8dneKqCaDGKWZNdT4tbljrTWdbhMpkJmVT3+OiQtB2um7jnbxY0qQJ1YPcyai1y6i8j2W/t2qZYRqXEovzpYVQ3uFpo1i7YZQv3586cpQW9Wl92/XGaZ6DK5db4/LTmyIrGqcHwELc4sm+ncJESUhoL1FBqurFpP6t0F7QvCjFdwFlqsQWn5MkxWzrtMtyCgJu4yhFmm45onbpXnb1EsWxosa1WBtIaaEwFWvBZUC5uIFdLqDusYVaEqQusXvV7+TOfOk+BYNe2+XYi88mOolIeAT2/ghElwNrOoepnlWR3n84xhmQ6i9fVb3F2N064dkSmzCj8eB3Jr9CDNle7Wd7swD052P9GncBmoDMPM+DTP3/NJtmw8onKZmwi5Fw2kioqOohiGlocFbu1UtxDSPVSeOXqU4TFHLJv14FYN7xVe2i0stcixabXUNViwWJV3a4hKFLNmihdTwifCKDzpUYZHC0zahywtiK19VIDpRMiNu80rJZaj9fsAtBjWTjUMO92ua7Xw7BnwSOqYmpVu2+A6Mbzblxv3fIdly7CAMgxjiA4CYamJb5ZMfgGVXL/80sMsVqtlZmztIJZxgxUCq9LrQc0KcG38uRmgEo1ZyqbJ2aM7LMaVZpfs3cyztPCtFRmvKu5IbbqHCgRag1QiwFJTn2GlmanI6m+W+HWMaCVuHZlW3da5i1TWrFCDHtVmsxmAloMlQTWTXQWKp0kUVSHgf+kd8MfsnJj2XEfcCoTw2ktoRfvtUeMeEqsiq1wZAq1+f6uKzOJdPV2CkxSS59cPVnokXVfccdWv+HmS/iVY+2XYw4q2RTWqQoe7w7QZhhaYtTPrZQ3JcuJHH1hH/7DhdcxFl4w7/5dJa9pp2OdWg8s42yuNisXyoyctb1ayUtZJBXAmhItpdYSFlEItJlH/xIvroNcfd3/+dkevvvKvWEv3RdMaND0DmMW0Nr1oebNyLdXErnCi0RkWD7aLWJ1x64/fvn79fId/7HZZi1e1whRt91FYVRmzerpFZXi2X5jIV8bWDVZ9LAWUkMo1EtJ1Aaz7T/fOrVevVT3WVsUb7rJyjkixWQd39HILzTJNekBjrhOFqxesSK44up4ULoL16etvd/tXvPds072qkiosKqa1kcZBxPK4utNCWJNs/ck1HovesCDobXTlNm3mHhb8x86t2t7ICbcmosCy6b7hA8069KFFZsVa7VSq6yeTvmVYGrtEMNui6m1nMMv915/vKKdqulTSt5ttGdlpUGFlxDocDo933WiNHtKEujAWPc0qLau5jq9owRhgebd0uHupinQbWa8HqXUnXAcgBaxWh45uxbAmqldQeOiER68yLMsScSlk8zpdWwsyhgWViFpVyzTZk/WglKASC6rw4HF1oxVgtXQJA5tVloKq1Dmvp8fjXG1yCSxPqwpuKbVUMxol1maz4XTHqRBjyz2+dKE1ejgPCYyyhzs7wgJSZUlfkuyisrSGBVi+g6jiFWGVqEW0glgqsCCywK1OKe9gRY1CWnxcfwuB1xkWc4IncTWa3YgjNRAKFtGqlrl90ciqWCzMduAEo1NueViZOmOFBJvF1QXWCM2CzEJmx1SxOOafDCxPCzjV0GApXoXZdGepCh1X9GBYqw65hWYlrGwJmktvsxAXSEWtRGnnRtN6GVjgVpXZkpEVYdUa7oeN9srBWt2cWzmzJtqsuBi7Z9Y3gCU1SJXIlqXtRA4Wp3yyHoxQ8RZWCCsK9kDLfXcrLQ9rkYZ5kCgN+K5mMSxGFqqR7Kqj+IJLBAtzq1qmPYPdwrK9aJgHoQLJrMOtuQVmJYjgXOgiNN9MBoClHHOUyriz5+g6xrDAragOw3KwkPWNFCEtcgQVksLr6TZaZFb7KZR6Z5aDNfbv/ir5UqoqlGqsfYuq6jGBhbRyN1PNPFgYs6QAV+HwxG7LLQernU/4brHAi79O+phV+3Os1QpVidkPvKivd5cUVkRLbnpVIlZh58GDqkGsQjpXb7f18lSGhtWCSjBAmqjrortZY4+pRrESwUqFS6mVgWVpFYlaG7V8Pti8Ikj0ZXXjnAhmLfQ5YVDqqYDql1ke1jjQMry4Eo/Y53PY58yiDsJsM5gGy/buB91fHYhVGDek/Oi7AWN1khqkn6FYPc1CYgxprHDRUsi2qVlYwa1CZ9aGOyyn1SFaO4cGS+N6W51ucGv0fTGxXlnBFgttFz/vCsvfLGVa4NhYcCGyY62v3rA8rOBW6LA20jUUei3Im1hhKgyk4Pp29arawbJjop43Ot0n8rNFD1j0MVBAyrHSuPx3ZoKEamyBxbQKfTdHljgFpxUvni0qKcM3h8qN1ZX3qhWsiSq/JsKmYPpf/bsrrJI+6hftGktdcoJFRXlsNYtpFXaJYzZGD3bxvDJinUgsr9bpykqMzGqUPnSNqPkfTjrC2qcfkFyOpSxrnfiyOfFrGyykpefBTaEXz9E8uJJ+VInlI4vduoJWBGvSLK4ZA8ESZPi1DGVZcpNRtpoFtEzPYBpRnALtrowpQc4sxHX6ckUlOlgN+nQBk9arh1l7OrLAalWTXJXtZqFbUS9qbk4c1EYyLQkF1xtVIMXW++mKSiSzCFdDlwy5ZjCz8NPYWqjpyMce9gwscMvcdi4MqDiwbIPlig9JrQDW6XLKs1lGL/u0SdB1N2vvxhgeltWeQOFnO2F/AW7V58zCfqsw97z0grAt3FEsZPUORXg6gVsXaOnMaoSOMo1/1ah/1nSHxQcz4xPJ7eUznsSzs2ZRJRZF1LdT9W3OouLGwU2GDta7w3aJFpnVhPJrDJ7G/gwf/cxiu1gxOeGo4aAPfPefnHwelneL2lHdim7OspIqpHHy4/39Ii0d8E2sUfhBNAv0gIVA9qKXyMWo8M8QwMce+uMSLMotuxq02wwZrzwqYYW0PKwLtDwsB6KhSxNUEoKNqVP4TVdY2RFwuVHTQ8ZFWOBWYe7Qm3VzbpHDnTtOhG/vPNbvp3O0Rt+bhlGFcmzEpsY84cegsOzwRYiVCI8rYHm3HjniDxu7MarMsmqFxDoJqbW7nnOLYZFYGlljZsfmw8w6P66ABbSCVXb/KrCKpsFQgGTWybFar8/RElgtgkXNF3zpDOvV/c+/wtk2kl+91lfA8q+xeTQNVnTXK+MV8joRrTcQy7t1WrfT8rCm7rDEwhFCKyRZD1ivROsVTz7CU48Hjj3942vMgtx6DHtYuRoM+wzgFdegEwraBjDrtPZne245WFODa5EyW1hinc16JRpBL4WIkfkTBn7zch2sT/d/3lVKLLMzGtL9zezMYLxLuK9JrnWrW6Pv0ymgmvqvLQOLk89FH1ivTIUhAROtGP8S/+XrlbA+3VMl4vbVJocq6q5wInS03kLCr5lW9p1cDhZyimuxaTLJz5r1MUtXnsYkHMUtP16uhoW0HKeVeQVI3GCtQsC/265BxPIpn/3kCjZrinKdI7YI0HqZJVwUMEtIf3ctLKjEx41e56R3clCslXglWgGkdzrWbZUIsIDV9KJbIfS7wopNujxerof16SvQStbPqh19W0WstFlrMWvrjhwthBWAYX41TWt+NU0/WFcRen2h8+UWWOiWbbHS2xOrRKt3UYpTfutwZWgFWOQWxDxNkPkkW0y7wnrZnyUEpx9Myz/55wZYQCu8SkZe0hDFO+z5ua7hzXglgYVjkqHlYT1PY2DypSX3hzbrhVGFg8S6ySyitUn7dtW4UzNKvZUmpVk5uVJaDtYzY9K0zrLqCusl8QiBvITn8iMef90Ei93KRLtZ5mSLkONq61vTHK3R92ej1tRY1UiG6THtAYvNoZMtwrrjIlTjn9vMIlq5lbPak1G5rkgJLjdmp+02peVhAa7nJkn6WLJesO4BFvIJGW4jKgL18o87bjTLDaAVrQdDWtEsqHCZuNqiXOstDttvEayp8at5bkI3kavHHma9hHKTQE8oMSl33A4rdSvpGUJgSXvlzi2H1RaKMXWLyjCuxQSUUqyzWVJsJphSTMypo1mf7kdIK4DSeaXbqzWtCY1ZAsqPn5qWg/X8jLQI2rT5nyR+nldXs15UQOkyNJg0KT86wLK01B7y6i1e5di2fcsZvyW9ttv/83Z+PY3kWBSHpdkkZBtlHjYtQr9UlaCkliXUKGuIZClRKQ8QbQlU+f7fZe17/edel9MTXMlWMmmGHqTh1+ceHx9XB0FpASxnW7XV19uyb161TxTZBv9OEkHq2vLHFv7JejsnQ4t2ok5Ze8fKVDOfetEzjd+Ki8rL6pcR1urxMdCa/DSoGC+trC6o641RsmIbAovO3n8PiMqj0srKei8GT4tW7vuervYrlkYBlMe12uEgBm15ZcFLZ4B1b5yTw1UP8iyAlRBWwBNe6LXIfOMKoPXxYW9Y2//nY7+PhtDPn98PkhFU9lXpy7v85CfoarnUcqqJvKzfL98It8BsAKweKfvqTCpoatuYR45nMW3t9dOdOn+QLJrK7ZvVhrq7sayNMNrCBDH52SEqa/PE6Ol+0UsMX08Ea+ul5fhwVTX6uch+S5TxP6/hFhm8FQssa0+ncPUZzyCbQ60tYXBpYKq4/of53xgjLFRWR5TFokScU/NgbWOHsoMXJpCBgscAWCNDC6Koze57X7f7JOpZbbyugrLEBqdQCVGYe2xGZm+4tLyctpZ8FD2wN6+vXFhbMn3bSFRJVEOUhdr6cJEU7pQBTh9hCtnFSCnrWRqVVlZr1sTxj5+1QQW4nLaiWXzju+xBytoGUfE49Z4gBdcQWIbWB4mjENo/yAjS/TOCoroCezdjKIq2ba///e3bz87pCrVFvQscfslBwcdDYPUiQkpSICoANgjWhZtER2tF94Mstq+YtysrK41KGGKFxnV9ff2XhtWhtGqnrbAq8j2QP9sYMIY9Ub0fGsATKIvR6jUNn/EySMYQdWXsSr8abcH1WHeIy0qrphvr5VsoI2qyCcqHFRC9p43KU8KrWgx9g7Bvek2047fHzSAxrE/r7DwyWF2Z0CBUIdQv7VpFWxQaWW0Gsevq9CxaeXGvz4S15VuZ9yglbPkAGlTDYRlaRlQmv/ePU10rs+EJSxhXN7TEpoA5dNJq2zeqrc5vrP0vxMLsJObCOjx7yCpSVnUCZekEoWkZZe0/UVurz55fRbJyjmWEZUSlgRlVaZEhrSWZRKetlKgGKiusfO9pT2cj2FTVcFigLXunzH7fWwXjAssqC0htQFqgKGGYASzU1rKjq2LtaHmNLUM1mA8r7VV9XBWwak4Cy2gLItZ+7/srnq74MiiU3RQKq6y2LdzVIi3CqrZPjwsF9rY8jbKSsgJM20hWp/Asq61Pcwix/4zWwY2vGryyhN0/Y2wwBl+wy2srTlxdWBxJjljWA2AxaTV+DWxIDnWiAlwngWW0Ze/s49vBOLe7rgG2hPphrp0A14IRLITo06ptogdp9TY/g5WVSFXc1wOuxWney91M4iqxErLcDnvnYFdGWIBMGVYQTAtM823NJtE3gh1fGHE9PAmsHiSNaFv5+TulsqxvOVR7XvWtIllZUgBIuCn0w4jawry1rLl18YrLfmIgrKb/oFbVBFQng4W+FUh5Wa2ItVtZbUBROikQQu6DHX46sSZ6YFxay2GwGp4XmjgveGWdFhbSYstgcPcI6FJiAAASE0lEQVRQNIBZaWIGijP3yOJ3zuUJrM6VzXXweEttAKwmmr8tD1aoqSYM4uKEPwmG0Nq4jMWmUOAiuAFdCcQUxhA/2rXpNbGrvXeBdXVuHLNhNdtD80eiFVGWlCeEZXyLnTvTgAUrILRX2I3iI9JUAVtEKy3UVnShprrwSz0EVjKruxXQ6coP4UmVBdpiLXLQlYIO2ccrE0VVawaxcN6lGDNVJGjV4eiH9Db5sJreZpmJinECaZ0UltfWph+wbCVj94PWs4qIkGiDifV2PmRx7IysrMByYTmv2vZUZXn5LHoeWJggrFWtwrmzcr0oqqpVrfAzVxR9ajuBnU1bp/eJ/mCxyx9Db+69FFr5dEVRyZPDsrT4aWrQFZbIkBsEiiteCp2yIKQWpN86FCKWy2xYyW6hYcHKfSBPbvDBt1jZ/mjrmLAOqp6tk2URgykw1Z/6XdM1saN53hlYPqwmHkNnV02wdmlFBR/cXZ78x9AirfhAFVVlHZ0aFqyJ7Y6jcwkfsrzRFdv+kI4rX1l/RuUEFSZRympx+p9w7GgBscfQyeB2MK0sl0a9siyuVAfhZQXtc6ayFgcmkGwGvbSke9ydHtbI0lIrUrmbGVT+ZCINrGWDCKPo+61+5HLOlQVruqj6siKJoUFhyWBYAGt6clhWWyt+kANHXgJ9XbXUrLyiRG8Qd3rpJNpKKmwArMQEelQkZUmUl4F1hh9ib7QFth4OCKEYRc+yWaFVTFHCK4poS7TK561umR7GHFij74skqortcGSQlQEm5d3NGWBdXFxqWuSGBhhCJURR9MOooFGLwCpsM6hh/a5TsAYoa3T1r2jLTLbNTUDlE5a9ZuNzwLrw2jLhARq+X86wqDfxrNUzMnCuonD9Fjh6F81jFqzLBeHkHcuLSpIBNJqytMrZ5ehstADW4wZEFQ4Hv3IplyDImuiP+FFdWbB+zMLWpgp7G/2AkSNRFJFZXPOr88BC34JbioATFsi0wHJBVJiQJeKkhToT9ouifmuosi4AVt/VUVmNdJx8aLDXmUzL0wKbh+8bTijcrKVVJrCDUNGqyPstrqw8WOOblLHTnkHa5EAcS8r1mUwLaYGqrLebUewzOpRQhbctVFbc2HjHz4KFEb6i5UKvkeETKM86h4GWu5lB4bGXlY7oc1IJXm59DLT43qfOh1Vxw/Lbm/QMlrIszxNLKS17WI8nN2n9GMcSETIVBhG+OJxVW2SWWBas0XRBW74qLvuca+EQVo7WGefQ+ZaAATTDJBIxQdjaPSEx5feJqqDniR3ND3nKurzbVtGpoI+fvpIJU1jio6zm30dnpaVshSASXV+UT6nAqMUXzuxs3iJxq8tT1uWC1XxEYBVtsIhflRLm8P580gJaQrV2Z6iK/jYwlA5t6t9cA4Fx9rfb+Xh95SlLZwfaWjWVbLysnLhoHnXKktX5LN7Ran2PwDCFIot8NqjLHZbZSWT9lh/DPGXp7CCdR5HkwHVFUFla8szSsi4P37Ld8YiCHUf/IT8UeMBvx9in086ZVpc9hpPpXRXvnoOkYAL9QljapRCe5VmlBbR+qVan0h1fDnloJ5m+JTUgftIBM0YftYF5yhpdLXp6on0Mze0WF8Bay7vZOaUF+0TjW5jgRTJOaY8SCXIicHL7xIL3W5ljqB2+Cmc4TcTLSUwGwypRWmtZnnNBdLTghiIRO1PUv8M2sWDBwX+NzhgC/4bBG0mlmbAuftykMrskyyBPWGBZa7kuy7tzdQ+EljL3qhX+kEuIY7Y+9r4kP5IGF79/KxcWmJYvZWQ4wmH5ypKynoUKO7PHO1pws7vpinHLp0Xy94cXCXi+gxgwhmBatDqWdPtMAlYp0aykxEEsy/V6Pj0/LfNtKvVoJol2ovE+cRcXhIwV3lH5O/hWLqzLWWxU9JCQ0iq9sNC5jG1Nzktrgr7lTriCHSlCSdBKXvGzV8G0Ze8NzIZlkhbt2yUVVkwKJ3FtnuXaDOLsanTxf/EtkEbRMvOmdbP4w3F13G91+bDMCY+MhSXjUqaM10KYQzkfQGs0Gn3F5TFdujrB16RhZVQpz1dMWf4em1xYbA5lhAuAlfxhRLWG14chtEaX08sjaYW8hSIr4v1PwuEVKylYvzVAWaPxTcRKVgd0FeI7sCo1rTKX1uTqdn6c5QEtPIaAb3f3x9OK5G+LqA3MhgVzSJo+CwpRVSEyBFpISssLXvNojae3t0+3t8fS+qUK51voUja779KpQSSaU8heeJ44AJYO8bKJ+/aoRi5tYCDCkmvgZWh9H39Zzfe3T/o6ntaj/jYdrSMbeUFKVbelBnVpbWXD0uvhXcOPJ6SkrEpuWWYpRHWtgdZ6Ppt+7Qc4ji41q5enp5eX2+Mm0SQIE0ahaFbpLgvVJZzszG/6/yDut+p8WKMrHeJlQxJDf/ccRGWVVeIUmqt8mN9ffSFwjb/Pb180K8PreG35xKQOnYmlT1zdEPrLZPl8WBc/ZjJq26XXVhmCu9/nrO2KuMYLbP5ocenVd377+voE18vr8bR22G/tFHekHasf1CF7xzICnprWAFi4P/TZiuqqlL0toZtBMCyA9fCg4+n99yNwjUbjqZWV1hX88vQFl29dhEjeDn+wDPSoXK3fXufD0n/YMj4frDgrNolrqiszhlpb2rlmf4drNBlPjaxeYALx+fTyhUmENlCIg86+a/HgJ/xFDOHvfRC+5jJvzfJtwNt43Nw5s5L9ZZBpStplkPPS6jJGr4dxMjosqqv7+e0zyOn1+cldL1/xrfZw5dD7GwShq+f7b+N6Q2CZ6kGy4C57wd0qax1CVgRLPzUuPY3j3j5G72zGl05Uz0/P1t2f3CAeTcv0UiSR28r5byZyJ4IcbYgYAuticnMXWneuLRm1DTSUMlRw3Rle0++X4/FkMjLXZDIZj6+m9zON6vn55fnFXd6zvkgLd9M75TpRyKnh6HB3jIu1g2Bpacn+zTJS0sAQMkOIWLgYPoTnw8Prej6fGWT6mpqX2b3mdKvn75nCeqIm/3Kky0/ifmsnxIGB3P0psKpBsLRrrdlJDstYss/K03pAXERcmtfD66vOBHO87m7/197V9CaOBNGwBGEmCkJIOEKcMHK0QpbQ+GD3wVLfkfj/f2e7+rOqus0ANtFqEq82yaz2sPvy6vWrV9VG1OrPtcGqtlA9xq3efCti1SVRnn6LcFgZgjENnDrw8qNoBcUqUswCpEoQfKF/BpD0F8CKVKEVLf1DfTu3rudbUXtYRXcxBjNLqVZxOHCl8k0hyxu0d0d1iLCy3DLwCA0T/KFtMVwn83cg1l3cYvlWVbGCO/uUSx+HPqzp/N2xgcxS1MpTviF4d9cT0irUSAWsZCkMVsJ8hQJ030WoQouVF632PpVn+Rbuf7reKH5MZukDMZVgFThywNTCCi8tVE6yNECGX74EqcC3vgI9v+7QLZRv7aveCuzzYoOZpai1OjR8WcYNc5zJgkBZUktqqWXx0lhZ5QI2aVJ5yBy1Tr4K2xOqxdvRwvlWmE2fk1JvDD3ZxRnMrJc5dIimv4FqLIjAG+cOKZYsUljJcBKWZW2p5bEKAo+5RY7DO9H6VOrel2+lr9hhyl0Gg/Xy8Us2h4KOCaPD0Hc7xGVJxCwNmAh41eFAbJFsBY+FEbvHb/F8i3Gq613jGl6GEItvi0NTsAm0mxK63F2yXocB5cAKSAl7KCaYdWqxwt/rt+yQiwcQfA0Crwg6CIeDBc60cYYh2IUQY7kmOnCrRJJFkcJw+aclttSTCjGrvT2x+cT5VnrNpkfqx2AWRDUWLdoRNrglbJLdDvZYlFmWXbVxDgnNailcj+VbzKKfA6vQ6k3g2AhgvSzeVSFagMyiLUlmcPRexL5B4m4nwIUf5LSQuj+k8nG+db4i9mc8uR6FWVCIBW6g4fvBTVYbHzdwzZJMtIwjLSmzrH8P5gEz61G0XL7V4bvT1R9s1kjMgkIsDiwZtUVImRVpFrWk2DtY6yA8Wix3iAzE4/lWxUuyS1rVkZg1VydiOAllg6Y5wV/hxMEplkMMkaoMx6EXeSZaqKNmaL3d3Ccav/Vp7iCevfPq2FUxvBFRdaOABaPiLZpQSLcEQjxDiP1KKVO+oceUuk46xDRO3eNSvGNCdtH78tH+FtEwshzRVSOBNQfZKhBeZPZFAuUS5zOo16FFaMtQJJl1aoPTah9Ay+VbnX/9n4GrSvsHN3sci1latkjgwEK/okfc0VmITsOa+Cx2HBIbT587slOUL8f51vnCOFaNySzjH2B32zHLjSh46OfR4k10KYi8Y8B0qhXxqk0YiMfzra7q3ZZ3ujUeWDBzDWZUaxaqQ4nSGdwUBoUX1Gfh3tAUYU3L8JQowkH5Fr2+Eu1MjlmGGq28CdkM7gm5yXIpKZH4kjY7tBRRtOzrMMksjVZ2o251aLvvfGWSuB+dWeq3tcsLnMzwsU7BipD7d1KIdbI3JMRK2Yfb0YLOpwqJzYV2h1qviN8aOGRN7E9tnV41XNujrpCGMyU/CyOhJ3FpGwxEohJXt+9v0XyrZ4/SBPKqDKejvlsO0DJWq0li5aYU/iiUUatjoaprFjxQT4rz0rgS83s2knC+1XGnFe75jA2WQctcaYK/Ghl5Uq9WVxTLwcVki4wtyFgs5tZtl8+yK/lWdDRWY4Ol0dKGlJ6EEtt3pFgso4m8Q8JnOWaRyXQbNz43/W/xfOvaNjP4rMnLqM98sttawUo5UjoCI71OD7FSHv7PzFrduCQX51vn3rcDKrDGvkezALSkkXncQIc+Giv8NWax7rDFVovMpaMucXn7zTOSb/kbKuHlBej9LF21Gf3S0fzj11YSVkWtDmdW1BcGWmHNQvlf29sdAla7O27pxftbFdetyjFrfLBAt3JrSMNeJNOsMNyh1KJ4mWF+GzstNmltqV7t7tqCDvkW9aM8n7+MaeAjlZcS2Xgi8bKkXbRHill4wRKtOHlIlODy3ht62dTfT6zsx/LAzxcSCyr2/R5b3x1ab7kxWqV1EQVLsiQ17wnvQJvD1IEYpha2IFuzanp3rSi0rN+CzzGi40R/GVZht37SPcmP9xxEvpTR8gxay5LJmWHiLAzMYkENppVZE1lNH7jLaKav5h75J+SmlVuUtDmXNvlPqUI7el2Z7rDEK1ncOkhmSvt8ViJZpi7LbZk+eAHbvPUHADt3x+6otBzsRNiG1xH05mkXcOeLiTkUrbYXkkwqJG116lRvGKjV+jKkIk/j5Rbk6tFrW6DynXt3ML2/ad4fcpw99WUnH2+5kEVBAmW278fNQ8lNVp/Ae3lvUUiavz/+u9d+qzOvsKEpvN3jmq2ferN7nk1XW1WGDq2SRMpsN6ukDt5zq7cMww6g+bbMd4PegaDzLfPpMu4dbdU+vPPoMnvyGxbAzecNGYKVvdNV6uB9CYq0wLPFNh00ZIM/EfCoDddlb1/C5d6VpP7B+XnqjgeKK1AuvVnLh2DSrd5a8xAx69rw8GRFy9JquRuuKIvp5viphz1ddzzqt/8YAVN2dPaavTz/WUzeVtuyARfhFmeSAU3Zw6xoxBNymlNtLqm0Il8NpZX9b93M9r/trOe815+GCHVZzdbTr8DKwJWL0otWgdRd9galxGiJVAJ4EgYpEPa3yVjzvNfZWctWePa/j/+8ZvOXL3oWIPSluTTXo1oRs5KTQ8otDVXdKmEf8deeTdf6rrCWLv31c7b5KlqZX9j84321DPfAPKd6NatGTqsvATydhFDWapwKxEf4Zvbv0b5JdzbbrL+QVki6cjq5v+azBK5AMrIIkiXq8aEycE1e1xv9rF+nky+Hypw1Ci4U/PHWsExrVjzDd3CJZf4EqEwlLLJskmWJW31fVoyGXTJK30WsWXUqKiXMWj4Nqv/LA9oVtF57L5s3hHEYmRtquPQlHrvwoKklalV/Stb/ZqjMyaivptalbKRbCHGpgyDxn2hxCRrkNFLCkGrxt0NlqvFjqvGSOpZx8QxCy2+V+mtiUI3KqgOCLSA1yb4DUgSvrbYSNbpsWCYyeCCU8lOaW8Cpt+k3QsrhpW9AA2CWXLWguXJtL7IKW4MA1E5xavHdoPKGRhFspRADWkkMV+0WQ+D8g5vA6l97n35XoJCjmb7rS/Y5YMYaRGCTvpY/zb45UKQmgWQ7hRl5dj8wXaPZQr/PQeGTLfQLHn5A+Xl+np/n53nC8x/tAMljWkeBnAAAAABJRU5ErkJggg==" }, { name: "FastAuth", description: "Secure your account with Biometrics", - iconUrl: "data:image/png;base64,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", - baseRedirectUrl: "https://localhost:52766/linkdrop/", + redirectUrl: "amazon.com/SECRET_KEY#ACCOUNT_ID", + iconUrl: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZsAAAGbCAMAAAAlRs3KAAAC/VBMVEUAAAB1gdddWs6cq+JsadRdXalLTJhFRXtTU415iNhOTo5+pe41NXxjYM8qKmscHGuRn+MSGZl0ovJ3eL6EqPEXF19QUcFdnfNlctZZmvNvc9prbdaMsPA1NoYkJHFdXdFSg+08ReFMO9VVTdg3k/Vdk/BHSL1bXac+mPVDlvQcIqFKcupJlfQvL3lRculLS404ivJLRNw9P7dHkPIoKHQ/lPQpLapPm/RGRohmlvF0oPCBg7pFPt4UFFBOQ9AkKag0OK9Ie+04PLJYT9ZeYLtJRsc4OH9LXOE/TuIrL64kJG9dZ+EVHJxDZudFgu5AXuZHk/NHjfE9PMA2OLVQfOtLd+tQjfBrbLZ7fbFGdOs8d+1Dj/JCK9hPT49Jk/JqnvJaVc4jI3EXHptRTclVUcxOS8dUQdhNQ91SO9pZUdBLRt5WR9UgIGlLScVYU80YGFJXTNJGRcMbG1tDfO1BXOVDeexSPttJR8RVRNZDV+MUFEVTUMohIW5BaOhCcuqkoe9Eh+9DgO5CQcBCdetAX+VHT+FCbelBZedPQdxBaulITeBJS99GUeFFU+JAYeZYTtEdHWBKSd8XF04WFkseHmNCWeQTE0JEVeISEj94a+49Pr1WStRQP9xAQL5FivBCb+lFj/IfH2YZGVVBY+YaGlhGlvNEhO4VFUk5O7tGkvNFjPEPDzoRET0tMLDCv/02OLgwM7IqLa00NrZaVM8cIqAcHF4kKagyNbQhJqVCWuQODjVGmvQnK6tEQsIKCi0dHW1MR8tQSsuAcfUYGGmrqPNiXd97bfFKSN9hXNFNS9CvrPQGBiMFDJMTE2ZIRMhfWtsVG6NFRc0/QMfIxf9AlvQICFxQTtUoJ3lpZNU5OcCbmOw0NJrRzv8ZHopoYONcV9UwL4ampPAPFpgSElRRTcJEQacwMbo6Oq1WU9g8PLM+jvIVFV0dIamBfeAoKpM3cOsnKrOOi+ZJSNE7g+9GM9s4VuU7OqJ0cNo1e+83aOlyZ+q7uPkyX+gzT+RLR7VJUHVbAAAAYHRSTlMACZEcgRAaYFcjjy+3ib/zE9xhVFP2lmouhmk/Q3XcXEv+/bL+qGNK9d7Vq8yjfzb+2a2k7em8saKagj/++dCljvvGnHfp0r7s6s2b7u3z3b7u6NrO8+HPcNr59ujU+LDlSLXNAAApKklEQVR42uzYPU7EMBAF4IlQftZEASkNTdxSRdtssdK2aIvcYu4xd5vCtUvEdRACaSRgvSlINsLvu8LzjJ9NAAAAAAAAAAAAAAAAAJCzsjoNbhzd0FcVwXZUjTt7/uInVz8RbMLe+fAqLMIfhDnGw1gXBLfWtxqUv9Gg55eS4Jb2owb+VQhdQ3A79SEIX6I8YLHdjAvKCRLaHa2prO77pq6b/qnK/FSUY+Ar4rSntVS18wdVEVHVw3loMo6naCNfpX6dcIrno5coLHbdvU1uT3myaJKC39HiiuEcflx8IoG7njJUWjRpsStoYc2kKvwLERl3lJuyDTxTGGlR1VGVLxH1uTX5wqK5Lja0oJNX4QRVRzmxhTaH+pIW8/ygnCaxzej31aKZJwy0lMaiuUynbAqbNbSZ1N+RWW1qjHSZTM7n1GxicCyaK7TL4iFqDW0+nQoy6y00E3MoBIloEuKJzB9Gs5WyuAmJhZYSj2RWXGhG/SP9b+/s2rFrE1EcB/BLbFqjRcWaUBTtIOgkhVKkIARRU1G3OOgiRK635QXO5YY7EO4vyNCp4FBwTWiE6OLjkOsQAhHhCCYli4iTEezk0MXna8jvJeba9L0neSl+h66v8Mn39969O9oaHptVGGqSW/N/qgENV5zPi+OhgTiJY317Qwaa4/DhNK7/C5r/xWFpSPhsno6JBuItn9COa8hAc2jGfxhgaY7PUS0yfeHixYsX4rEIV2u4cfyVsdM892c1dXPp2t1U2sWmiTPp1KOFeQ4aXhxvVioN1+/DUfYYHVu4qiPTMNB+rBZOJy8dgeZ7zhHAcWaltobP5rmiQ23hqoWQ8SeoG8vCZnJ+dJqcCI43K5OGt7yXNQUzf9WkMAM4Fn68MDKNEI6/Io+Gu7yNFU29TKWRbUAAB5k4GRuZhsUZw8MFtIbTxl/VlEvU1EmG4ZDgpfhhNGcojVBzGnOSaHxn4F9Q5QUsVyJ3EZEJx7Ey04fTiOJ4i1JoNoGGA8dZVuwVWyRKaSiOibH5N465FNPCM00HmiCOv3pOSms2yfI5fpyzatlEooZOY2GMstVq1nRdNIDjJg9szWZOGMe/IYeGLn9cbLo0tuEav3Zqe6XS3pfdJt5AAzgLB9FsiuP4JyXQdP8PJzdEZwJnWiSq2zahMY0ftaDdDkjI35dN19T7cDLxkIFGaYRxnOWYOE1iHZbnw/GuKPTVAKUhOLi63W6XemkHOwizOOhVNOzwTGDEceqnJAw0SkPDu+XUn2nKhNKQ4GaJyDAJ2tvI7WvORnzoQPu6vi4Bxzkbl9QaseY01HmDQ2jW1oCmL+0vlmkADmpFhw60dRJxnPqKRJrhe86E3dlQGoKD9BrQAM7uRt9pLRVGI47jLcflDTRYnmPXu6WpkUjUXqPBu0ADCYKmy+LguWEDTQpOY0ZOa0Sb41zR1EiPBlVLAZCwU81EDE5rarA1XwsFKTj+rDBNBZYO23Mm6IOBHo39EWrDhoBVsQE47v2/aaTgeA8FHypmEgV2ae7TmuOr8cV6JLrWjW7XgtLQtH+0DAYnHWMHGqWRgeMkFgVbQ2hIxJvjryrxdENo8vk8tTGqpTCbHYwYnPT0QGsAh4YPxxO9gJ6pVOB3wbfnwGdYCoTSdHHQrzCbYNuwDMDJnGBpKhXAEWiOVxelSVToyjSHNWcCXt5QGrAJwmz28qYBOK0LDM0LsBFojnhrTia+04UlNKeuQm0ITTab3w/0JsQGcFrnGZoXgMPRHIk0FVhZbM+p39DGH0oDOEa4Tc224GWbtXGaoeHDkb7XkNbAyjS8zfGvKPBRZySaz2YB56CzwEsDbAyUOQc01IYbRz7N6M0JvdFT4EqAtobFse3tMJtdVzcg6WmGhrc5kml663LuOUAzo409PRrACX32DJpYBxwzBTQCOHJpCoAjdFqrK3DJCTSA86EZcmdT05EOOO4USyM01uDwHL8+lVy6eXMpOTW3yEVT4GiOou8GgIbB+bjTHmrzi9QGcNAcpXkNMiLN8RK3tNi125lO5325WCy/7XzaunMvfhSaF4RmdJz+KEgDrenD+VDdC4beChg6g5Pap3ktBccrPJlPPtjaKr7bIin+SbnTeXD70hFpOJvjTAJNtzjw+MlONMvWAQc/6tIADv9Yy+W+Vd/8fPfmzTuwKZbL79+Wb8ePMtC4m6MazW/q7i60rTIOA7jzC4coykBkIkIHE7zTCxH82Jh6oezOC28U0iaZ69YmSy/WkQwCvfKuNSkhzZaLhsIJJCH9yloObWhCEtO07KwV1i5zSVNbt+Iy7CgtdFD8vydJ/yc5zTnp+5529ZmgF2rAn89z3ryJFgdNpnO7+MefNTTP0pNAs4vT/u1bx77nfISGvTn91zfn/x0OD0NKOKjz+LsPG6PBF6VrzpGiwdbshbP47M8/pF8XsNssQIM4t19+4c2/fD5NcHqbH94bDkNEnOrqDI1PvK9OMzDQg32lfOb8H2jKs5bO/vEn8JS+BPWsaOy0Vdk8+vFNzkcywDxrvQtr8/5w2aZ21kh13lFtzUAEwtico0ODg1ZHJza1SL46CHlWKJomjTYI0tzVdbiIDHtzgMY/74eIOvJZg9z5RJUG/41gaM4RocHWwC2NzQbX0DIcg9GiTy9CdO0WI/w5UhxDa7PbZzaz4xAaD9CQgExJpTJriHNWedAilbpGmJpzxGgMeoMOANLkD2pwIDZjO/wy2gwQm0TH8GjJbYYo4kQawiGt8ZRoBsfCnslOb3gsNCTD+UClNTIcqhuCo0RjiKWL61k7JLteTMdMMhyDJGhjE+5bzT60UXjmqH2eEyE0HoIzFo4Jue2+vr7tXGvXUAhnjdjc+uhYXRrJxQTVM+do0uhtRXsmkShAEomMfctmk+GY9sIRVq2cWQzrrEWaPUADCY915uLxeIoEfi+Eh6qfOXfeqTdovg4MxawdUZpYej2TsO8mkVlP61VxII9WOaDRAqenQuMP5+Pxvt2k4n2WGpzxd/emwdZQz1rb0aPRL9oz9qpksoCjNmsGYZWzmqU21Efpjt3W+JPxVJ808XgMcbA4dQYNQ3GUPkI0lcOzcbFQosGAlU5t1oDGijQszZHS5HZLg9WZqmrOxHfH5TQ+pGF55hwVmt1BW7TjniHOusGkhCPSuBwOdpzys8br9SJNNU7KOzSGOHhUQ5ov/8LXY5q1/wMN4GzFdAqzVqZBHPpZg9bc9pIgTXXiyZC0OLc+kdPg6zHO2lGgeWGXpoA00iSyOkNdHJshWaZhb85AhcaPNLU4Fun7nIkfjslpSNhmDWle/fybs2fOnDl78l2mr/xq3xrE2cLjgGzWhFW3y+xgxyGt8ZZpPEhTayOExhBnKPReFY2jTKM6a+o4/3z2wntnz52fXV5uaWlZXp49f+6s6uX3IdKgTTFWz8aUXHW5nSIM66zBoM15uxRpwGY7PCi9IDhd3ZrSq7HPWn/P0o9nWpZnWzCzyy2f4uONMeyDhqOGV2tVOmUapzqOenN8zV6ggSjRwGnAEpJcfA6+X0ODOAyz1t/b9mAcClMTsPoUekoRptYY67cGUsimDbq9cIDGDTSIQz9rvuswaITGo0ADgfc4ks9zHp+WDJrDJ4Z11qA0zS13UKRKp+UNbQFoBw1t7GnbXja6Mg2EddYGoDVdIo0XaBRtQpKPDO6cxNaUaRhmDSK2ZgFp9qgO5amAfdDUbVBnJLfqDgILOw60pkLjTwKNig3iQG+QBl6tnP3OGuoATf8DlNlL56PXXzj4HFOmwSRw0zCkNcGgk+PAhXXWzNe7gIbEnwcaRZupkORj6rH3cdDMZsShn7VeFRrAOS+/jdCexiQbNNWzAGYkuRogNBrg+K5PTpVoPMZUSpEGzgKDYQnOaWyNrKc0OL29QKOS2bdf0UaAnQbP0NLAoAUDnBjWWYPWTFssoo03p1abbenH1KGxEyUavAOnnzWkUcU5q5EBO02hsKiX2eRWAwHOakUc6uaY2yanJi0WyyTWRsEmPyjBCf3wFqFxIg1Lc5BGFecEOwALDSaxjpOGgybSEBzGWTNfF2kIjvrTJtU3OexHnMFz2BoNcJBGJcvyj1y1p9Gn1WkKeNdZNWjWUhhnzdEGg1ZOA5MmjEm/ffP4ZTkNztp+j9I9PUijVhx8z3tgrVGiwc8I9Cb5oFVo2GYt4myzAE3FxrKdUqbp8w77EWcwdBxOaEizn+bIcZBGPctv47ucA2rNYiM0WVPtATq5yiMNy6xFHIQGbdqVbVJxI9QGcULvwLPGii9EP2tI02hx8ELigAYtq06TwM+kcdACPMpQzhrSYLztfSlFmm7SGrT5+8RrX3IOBwWObNaQpsHifMoAoE5jMGUz6q2xp2O1g7YT4F0uF5iwzpqz3zLd2dmJvencTinRtI75PR7UGZ7/mePwhVhmDWkaHrXjGpIgjWGkVJuiOk1CTpNccfNWF+JQzxrQdE5bOiH4vMmllFpDaCQ48/cDVocY5lnriCANw6ix07SKNvrFQqHhQcPk871RVymMs0aOAUQGbSa9ybhCa8JAgzjhe8M+l0MM86xFkKZhmxe1t3nxSmsrwTHp1zMUg6bLLUXdLi1wuH7L3RIN6nhaU/VphokL4njmm4MOCFNzaFsDNue0b00MaAiOLW0vqNJga3DRgrwbcehnjevtvNvejjj4wFGkQZy5J0HOqYajfvFJRwP56BWtWxPrbi3h6LcS+xg0vA9ojrohzDhcP6GR4Xjz8XqDJn41CnHmN61WfBmGZw7NoJGc1/gdzhvXusFGTKyoYpPJ4qBhbXYCAWLDOmswaEAjx4F3n/G9aUBGajO/5nA7IezNEVvz/G3eaOqGoE2jNBhhAWqDOLRHaVdPu0gjx8HbTllrpDhza76gE8KO09EBNM/f5mTTlStXKjqx9USjg4bJr7h4AsM4a1Z41hiNdXAMqbiMxi/CoM480rDNWmSA0Dx/m/e+7VawUWgNJnk/GgiCC9usuXo7HxmN9XC8xu24pDogpfd7u9BGbI054IQwNwdpnu9Z4N2PbwBNSQc3raETGr63aYsGg5Q4SBMhNAo4k0JfvLRsqVQ8lbSEvV0QxCE0+CIUzUGaAQoa7c/Qx7+6fKOCQ3RiW4kGBw0j2Dg+CGGZNZ+1hwyaEk6X1yjkwAV8tgWjx0NkEKdMQ43DSqP9e8+Xvmq6AZHY4PsbtUFDG/hoAG3omuPqWYHW1MOpXHp6J42t+XyrsQtkKtmlcQCNFjh0g6b9nc2ppsuXoTiS5sTWM/ugwceNGGocd2Tlkd5YDwd1KhRlF8QBGt7KaYHjG3jwmAJF87vOF5tuXK7BiS0mCo0OGt7XkOIwzJoLaIx6NRzMZFdVyjRWLXB8Phoa7T8jONl07bIYyaxdweKotQYvBWZkNvtqjrsHWgNRwrFUpcZm7qEzYIWw4xCa0ZZR6kn7QKsjWtO1a3KcWN6eaYgGbdqiAcChnbXSoJHQNufpGkdaw44jDtroKDXOslYn6Le+unBNhgM6U2nEQRq9rq6N0E9sqGct2EFo6HG8T9ecQKMFjtgaCNCMPteTwKkmsJE3h+BkMwU7JpFZ1wFNfZu2GZChnbUgtoZu1uawNYw4ZjPQiKGQ0fI7UKc3rl2oh2MoFjLlI0EhkbEXbUBTP8nrxIZy1gIdK4INTKib8/Qh0rDhmKE142Uaqlmb/VAbmhNNFyByHFHnylS6mC1kIAl7tqiLmXRKyS3M8CBDNWswaHmbjQHn6ZoVaZhwoDX/Ak05FDiz32j1sLl4oZQ9cbpjsdbFrWKxuLVo0ht0ykkuRcGGCicQARoxlDhzQIN/fxYch/nBxPj4+CjhoXrmLJ/RaNG+birJ1Js1wjMVg98M0Bk1m01iQzNr4qBBaJvTNedxAo0WOA7SGhKszT5ptPrPCD7YuHi1Hg5efJKM6FQj7PBgQ4ETGAAag4Ee5/YU+QYJOw6hefLvrVslnHGaWZt9+yWN3tn8dPGiCg6kjKOqkzc54BC931kjrbERGgacu0u826UBjs/hABpIVXMQh4KGOqeARhmnu8Hm4MXAvpvDw6ABDAPO9Fow4HKx4/icZZqa5hCZ0UOmeXnjopgLGs1abnOG57E4DTXHyfv0QMOE87QfFo0FB2n+nhBlKjiYQ6Y5DosGYZ81HDUuyvP7m7WAzwY0TDjTcP/tZsLB1kxMAA7RwebgiYCChnrRNq5eBRgNZy25BMUpyTR4Q8APrCRNBgoctOmEg4DbzY5DWjNUtsFZk5ykD5HmA6ABHC1nTVjhowSn0aM0x5uBxkSDgzrTm4GAmx2HcwLNEOBgc2TPnMOiOd508yqJprOWg+Jgc1RnjTfbBJMYBpy7C1AbJhykQRxsDoaChnbRblbhXNBi1gQTV8LhG5k13getEcMwa1MWM+9mxnECTQhtZM3B4hwCzYmNX28eAE5udSaKzVGetSgMGv6/b2hxpjeBhhWHIzQhxKnTHMA5BJpjH9/8tQan4RsCJZ2R0nGgkdMaDBrQMONML4ENIw6hGQyVcBSeOXgiUKRhf2vzKwRw0EbttAZpoDl5IVLBkdtI//mRQdOhjRwH0gjOdFvUzYhj5Z7cAxqSKpu9bggOnub1jV9+QRwtj9Km5IgDcFRPa1EH0FTC8syZ8kWD1DhIM1iFU/+0Br8Uadhz6otf9okDaRTHxmFz6uFEyaBh6GdtysvxQSYcq/XJveFBxFE5rbUcMM17QENwUAdxKqE9SgOOYUD5meNyR3tNhAZDPWvTay4+CKHGITT4A3QaeeaMKtOw1wZycLOWb1Y8rfHRhTzSsM3a9EM32lDglGnABiK1kTUHZUYPkObkhihzcLMmJDcDoLP3m9BA1LqZFEw6DMusTT8Mgg01jtv6ZD4s+7Fg6qe1g6J56+MvLl1CHFFH2xsCUz6nX+BBJ1A7ayDDL6zk8kDDjIM21Dgu631Co4gDkeFoToO1uURs2GdNKUJyp5mfmameNT4aDbTtJAUdhnXWxOcNBQ7S1PxYMLkNNgeCpzWk0bI2QCPH0fricySZ3FnyRWdmohCeB5aZqCuytCMk4a/TDifWxUUDlDhu6/05f5ikweagDrZG07z8xe/EpnbWtL/4HBGS+dX7S70+zh10Wc29C5sr+aQwgnOmxawZY75ogA6HtMbvV8BROa2NIo1mtfn9t0sUzaH8mDon5E2GlZ0VmwmocMy0aw7cCwRocCo0aKN0kpaf1pBGu5z8j717i42iCuMAvmu9gEUliAgCYuOFKOIFFFEeVEQF7wQvqC+u8fbQ2tCChLoQWi4Nd9gtZUNSSguhwK4BTCi4abdt9oFsmq5tI7tp+mDDA21NA00JBBIwfrPd9ut2Zs45c3pWZqbnM9EXn/jl+8/Z7xvOZO3ZAzjpjjXk+Rvqzz/hX/g/i+ycWAfYcOAESttb9gMNoXOIE4I00IxffG7PIA7GmpjBJ73E48TgtjYOHB/SHDXyzEGaZ4BGdNts2wY253Q75yeeWBNvw4zTkOMJGcbxJmig0IYaa9g5SCP6abMtgSPwmSO4jOJ0xRv9RnH8CRrEIXxhVz0hwEAT3TZbt0EJjbVvbm+sxTqDQYM4fp9CgziGT2sXnhkvnMb54tatAziYawYHn9g6Ap85/IPPhkhFox9x6IPPqgDQ4OU3HM+cCxBowmtG1lbEocfaL5aItS58R56pc/wKDdqocMiDT6QRXI9nbQIbu8VaDBqHHccfaO8r2484Rw11DhQGmsiamrVpEwmHfZ9jqljr+jcY8rPGmtI1RWVKccZaM3aNyHo/YWO/WOuCF0gYOwdo+gbvvsFij7UL6aGZvHiTUsZi7QcLxNqvXRVsOIlAK0rScMVaMwaa0Loza/t2Ag518GmOWNPCieV4Gv0MOMEETZFKB4oJp7pnHnaNyHK+u2k74AzY2CrWulYXUHGQhqVztBvn9TR9d+ix7TvARq9zfjRrrDHirPBSYy3ku9ZXWwRFaBzi4LMaaQTXW1k7EIfyzLFerHXlnCbj+ELezgSNSocVpyZtNGMX71BsNGLtnFlna0YGnzm7YvFQSBen1B+qgI8dYqljjTL4RBrxdeetHUohjqJjjcEnW+d819Ve2ggLai0cfyjQUd+HMmoc+uBTPA2eBHbs2wc26lizzT6noSsn7ged4TgB+Gnq7o5Ea2uLiDpHSac1pBFfU4EGbNSxZqN9Ts6urn87vCGINsQBmGCBqzMSwYuJSI+c/XqxNgdphNdzWWsAx7Kxxjr43NWV057tCYYGK+itaC8Dmf6q5Y211x1Qd89cfu/82bPn37v8+btFRtrH+9YATmqs2XHw+X1DLLa6s70j7q6ocMU72q8VRSL1q3WvkVSnmlas9cInOxdMn/1SuKnO7XK565rCL82e/rywHzdroIbh2HLwqbxDADyxSEN9fUMkEoshDAGHPCHofXvszHFhVxhcBsoddtWNG+MUM+a8NYCDsWbPwSfgKJX8r8bFREZj7eTF/V+8Ew67VBUOj1sgItI+XLMXaEZJrBm6HZc2vjlz4veOkiY3kgxtnqbpI7fJXLx3717eWLPYhIADhzQhOHoifjrb5QYcLZ2mcXeP+JR2td8GasDG/rGmi0OxgUKcthPx3dluKJd2hR99fqQ/PK/+sXdY51hy8Pm/x1rb0Xhedjbg6OrU1T04ski7unKlFo5d9zmiYi1JQ8EJzxyJzcO3VgIOxhppQmDXWFvBcVpra4vnVSRsSLHmfmAkz5x3oW+Gdc4Oq8bad6I6h44DNJUlFYijpxO+38kfaR/uBRp1rNl5nyMg1lrbXJUlYEPvnPP38r9pe3UjyKhizdb7HO5YQ5r98crdJVBUHEi1ydwn6FsbEadfx9KDz5/TGmvYNbn9H8ivoMda02zuOefKjVo4dt/njCTWoGtc3rzdKhzdRw7nr5yMxTvBxlisnVN1Du/FRCKL/2IitGHrnNYylwe+uQY2bLHWNJ/PZsJKsEntnFE2+DQca61Fbm8eFDNOHZyj+QY2OxEHCmzk4FM71pCm4HDys8UqHG2d81zTAeenYKPqnNG0zzGEk6SpPJzE2c2GU8d1Gpi8duNONc4aGWt6R+lobXZBZSUBR9PmUSfPyvPWoUM7d8pYY+2c1la3LxdsjHVOXZxnz/ba1UODONg5cp+jjVNW2+oqzYVixMG6h8NmVrFiQ4k1sLHti+zGJgR9HT5PLh1HbTOdx2ZncbEaxx77HOFH6bKWa74qsDHeOU1jeAadYFM8PNbkPkcTpyxaVunzeNQ4p6njm/OLjNvMWAs0KbFmj8FnWmKttiXu93oRx0CsnV/OMYS+WazCoU4ILBRrQjunpbOqwMuKk6pTx3EWePXm2kTnYKzJwacuTl/cX+VNxTlMirURngW+LAYbaqzZ/0V2lliL7vf4qgCHI9bcrjEcC4Ita9U49trnCDuttVwKwp0qup2zm3AgqHtprPEFwYdAM6gjJwREnGgJ2KhwQIc++Ky7n2NBULyFG8d+FxORcaJlXn8B4kCxHwjC8zkWBGu3bFHZyH2OJg58HixQoBTHM+f8Aj6bLTLWmHDg7k/lXhWeWAu/5+SwublFjSP3OZo4kXioFIon1sLTeRZrN4CGFmvyRfb+r1G6Qj6w4Yg19wMZHBd0frZ2M9BwxZo9LybSx1kdzQ75+HC4Xh6cXL55cyqOHHzq4UQVG8CBMoiTXHo6M2c+BTU1g9HmxmbESdrIfY4KBzPNx9M5D42BP+lFcxb+3n9PxJJ5kx68i24z7SbQqDsnFUe+yA46/TaBAAfO4emOGXPO9Jw8VXMKZOBOolM9PfMWjaUupG+Wp+Lc9sGniWMtFm8MqHCog8+S0/EvFv7Wm3KvNPicXTKJ0jtTboDNsFiz5z5HwOAzdkn5XovBWDtdcunoxZMa961VNy+cSd4Q3ChPxbH94HMEnQPf2A0CjqFYy8vubNO8kR3q7AekXahz1rry8nKzxZpZ9zk5K6pCfr+hWDtccbKVcI1k8xz9ccFds9YBzrDOkfscPZyIG2yMxFplRWcr8UMTgEPoG8AZbbHGjRNrDwXpOLjPqdzd2Ur+0ATg6I4FZt1QcDDW5OCThFMfLVAah/WZk1sCNLTbcZvf0Pt589nldQZxRvXgMwa3gCMOZfCZm+gaGk71t1MJNpRYky+yI06kqBQah+2Z48nrbKV+aALq7Dxtm4lvKjYy1hhwsHGCTLEGNC1s3zJoXqRjU76BgiNfZB+KUx/NRRxSrHkTNEw41Us0z2oT3ly3AXBSYk3uc0g4sU7lU7G0WKusqgQa1u/nnJ2ha8PQObZ8kZ2vc+CjICFqrFXlJmmYOqdnoa5NKo7c55BxcmDiGSTFGuAUAI2BG9lreibr2hiNtdF9MVF9xNVIjrVSD9Aw38gO1fyIpg3ApHaO3OdQcWJxQqx5vAHoGmMfmqiZ49Q6p21YNQTHjINPE8Zafazd3wg2mjil/uzuFqYb2RGnZt5d2jbDcOQ+h+WZ03061KgRayDj6aiNst3IjjZnl2Xq2CDOaBx88p3WIrF2TyMkW2Aojs8fLIh399WWGf3QRM3JRzRsPlJszB5rJtznrKiP1bfn+RsbgwPBFgiGArkgE9W+Nor4zDl1cpHGPE2xMdo58mKiRIFOd0e2xx9MlL+qJN5e1tKif98a4WuHBJvbH2sWPEpD5URikSL4toFS17pX9PWtqCXfv6qDAzaPaNi8+RXAII4cfBrCgaqPJKs+Sru6WD/WapY8qLbJ+PRy/lAcEww+LbXPGdGN7IhTszBDbeOcuwpsUnDkPiftN7KrP0Wp9fvGOSs/P3+VjLXb8qEJ7Jzq+xyaNlBmizXrTAgoOKxf2G2eqmUzF220Yk2+yC7g6mJq5/y2bLzme51fIQ5b58iLicidw3FaOzVJ+33o6yCTEmtyn5PmWFPj1CzQtHntcorNaB183oZYQ5veOTrXCyg2xFgz0eDToqc12uCzd4G2TaaSaagjB5+icehf2O3Ve7FzcmFhfr45Ys3iL7IjjLEv7J5ZlqFncyQFxxSDT4s+czhjbclU3auGluarcKDkhEB0rOmlWu9TDr1yfn69ECq/kPGZIy8mEnuU7r2P9JcKEzagUmimWLPohMBwrPVOIt5nU5iofhk5+PwfYw2KTOOYciRpo/xjxsGnjfc5F8k0jgmFgKMba/JF9jTuc6BryDXtypEBHJPFmg0nBIM6SEMq55dHAGcg1+TgM/04ycJAIxyiwWZIrMl9TpoHn0hDr2evII7qtCZfZBfdOUjDUK9dXw82ZjmtWf9FdmqsIQ21HruyfhDHPINPC7/IzhBrF+9wMNW0A0dScArNNSGw4ovslM7BrqGV81lonCE4cp+TbhzsGmrNhb4Z3jlmiDW77nOQhl5PKn2DOHKfk97TGgQae028DjKqzpH7HNGxhl3DXpmJvmF75siLiUYw+EQa5sqAw4Be58gX2QXGGtKw1xSwGcAx6+DTHrGGNMw2Bw4kbcw0IbDhi+xtSMMcah9p4kDJfY7IWMOuYS/n0gOIQ37myIuJOHCQhqNevTKAY64Jga32ORBoPPUw2PTjmHNCYPFYQxqOmrZ0vQ6O3OcIeuYADWd9otCY8rRmk31O230O3npy/fEhOHKfI3rwydM1OFIDG8SR+xxhncNPg2+sHzhO7xxrxJrp9jk5GGh8ofaCYmOK05rtLiZCGr6acOX4EByT73OsdZTGQOOs8S8cPA5F6Bw5+OSINaQZaaglcEw7IbDmPgcDjb8efuHgQYw1uc8RE2tCaByZTys2AzpynyMm1oqARkC98k8Sx6wTAgvucwTROCZAqPWfB0wxIbBDrLUKonGMXQqNQ+0ceTERO07RHQ5RNVexOWj205p1Bp/QNcJqIoRaAsc0EwKTz9bInVMkkMbhfBoah9Y58mIixs6pBRqBNSXROCY/rVlk8CmYxjHta0XGVKc1q77ILo4Gf+IcG8SR+xzOZw7SCK3H/jmWxNEffMqLieixBjTCK+NpwGF75siLifRxxNLgwPMYdo52rMmLiWixFkUakTX+5YNJHDn45OscpBFeUyDUCDimusHDnPscpBFdmS8rNqTTmryYSAMnzTR4jKZ1jjnvWzPHhCCdNI6JTxxLlAUmBCYcfKaVxuH85K+EjekmBFaItXTR4DT6v/bOoLWJKIjjs6wKYRHKGojRBZMYpSEhWEIIhuAlhxZKbQUVRNCbeBRE6EWoWBXRjyClICnYq8dc9CRePO2n2IuHNNBAC07WrjGmJumyu5l5O79D6P3HzJvM//WldZLKkYvsg8pBNSFTcv7IIZ/nkLrI/uUUhA0WTuvIjeQ50xGRGmTNbo1WDpMbn7NbfH4JvaF5hdNiM60RyXPCrxpvVEM5NKc1qnkOqomGZL7lyZE8ZyqwoUVF7Y8cyXNIVQ2SqLY8OQTzHHKLz6+oJjqu256cKfOcOF9kx6qJEr3a8uRInkNLDUA678lhnudM2hAwa2h95gr2kRzJc2hVDWLlWyesHPQSv4eJUM0MqLmFw2lD4DfPYacGu5prhuGG4KRtjZ0agJTX1STPoaYGtJLX1STPIaYGwPAKR/Icamq8LzmjlcPoBY9p5XBTA4BdbUxbo/PGZxB5DjM1YM23W8SntcAeJmKmBruaPSRnYIdRnjPtKM1MDc5qrhxZfNJTA2DMt1EOww2BrzyHlZr+N9DfciTPIacGoGK3pa3RVAN66bccyXPIqXGPHFcOxTwn+IvsrNQA1G1Xjo88R72HiYipcY8cptOar8UnJzWgF1AO+Q1BYLs1TmoAjGrbb+Wo9DARRTUAmXlXjup5zp/FJyM1/bigjbDNc056kZ2TGnceQGKc5/wgqwa02kDOuIvsqv7CLt2qQfRa2/eZw/9hIsJV0ydRaiPxzHOIq+mnoKgmlotP8moAkiiH64bAV57D4azxMFEO3cVn8G2NTdW4chRpa9NuCBipAUj15TDNc3wtPnk0tDFytqm0teDzHDZV48pBM2TynJAvsn/mpQblcJ3WfFxkZ6bmt5x45Dns1ExROUw2BJPk4Gsb/EA5MchznjSBIyhH+Tzne/M0sMS0Vc9zck0NmGJV20rnOTmOZ42HscYiz/G5+Mzxm9D+JlGzZ57nhHSRfX3hEvBGu5JXYvE5Iie3cBHYU6/y3BCMv8i+fuM8KECmao/KobIh8NnWHjV1UALLvY7L47+ppxulmU8Bf2PUbJYbguPznPVHuQugDlra5rwhGJKznruhwBTwN2bB9lM59PKcx3uXE6AYRinPcVr7t3Ier18F9dCv5G32ec7eZcX62aCvHclh+yL7XvMMKIpes21fZw6Rh4nYb2nGoaUKNvVp7T8PE6GapnJDwDBGZbRyXKjnOWoXzRFYOn6mtRkvPveaSuzPJmHgwMZsQ7B3Q6VNwKTS4ZTnfMgtKzuejaKn5202eY6y32n+h4XjNIsNQWMhNu1sgFnK2/TynHfDchoLZxUfnI9Hr1fzn3xUTnQPEzUay7E049pJVx2601qjEbeDZhgD7XwiuSH41rh8DmJO344d0rTmf0PwLbsYgzXAZBLpap7WtJbNXs6wvUwbeO0UHIdKnvMKzVwUMwP0esHZJpHnZJfiPQEch2auOc7Mf2E3u1CO7dQ8Di1Z23acGf7CbnZp8cIcCMdjpQvXnN3JeU4Ybe390rI0swmtrfLg2m7ki8/s+0VpZlNgpGo4tkX1gge6Oeyuls/LZDb1UF26tu1E0da63e5S8ZIiF8+jwkpX7ne2tsL9hd3u4cqyKce/r+ZWubXb2QhpWusebi4Wk1IxvjEy6dLNrQ4WUIAbgo+b3c3u6u0LspcJoHzSdzc6G52dnQDynM3Nj4eHK8VyUrwExFzCrKztbnX20Y3PPAfNPD84eP56sVg3ZFoOGiOTeli6vbOxs7//4oS7tTcHb96+WV0tXsgYIISFZqXK6dLdmy/2nz7dwY8xZ87rt73eW/w4WFm5d6VcTso8FglzifNmvVKsoCMsnWc/h+j1egc99PPyzp3bxeJy3UqcFy3RoxtGBqlfR6544N/1DHLR0OXAnykaYljJZNI0zVQqhZ/4tzWnaeJFEARBEARBEARBEARBEARBEARBEASBMr8ADJvUZ0bGgJQAAAAASUVORK5CYII=" } ] } \ No newline at end of file diff --git a/packages/docs/tutorials/trial-accounts/guest-book/near-wallet.js b/packages/docs/tutorials/trial-accounts/guest-book/near-wallet.js index 244464946..ffda62a2c 100644 --- a/packages/docs/tutorials/trial-accounts/guest-book/near-wallet.js +++ b/packages/docs/tutorials/trial-accounts/guest-book/near-wallet.js @@ -44,18 +44,15 @@ export class Wallet { modules: [ setupMyNearWallet({ iconUrl: MyNearIconUrl }), setupKeypom({ + networkId: this.network, + signInContractId: this.createAccessKeyFor, trialAccountSpecs: { - baseUrl: "http://localhost:1234/trial-url#", - delimiter: "/" + url: "http://localhost:1234/trial-url#ACCOUNT_ID/SECRET_KEY", + modalOptions: KEYPOM_OPTIONS }, instantSignInSpecs: { - baseUrl: "http://localhost:1234/instant-url#", - delimiter: "/", - moduleDelimiter: "/" - }, - networkId: this.network, - signInContractId: this.createAccessKeyFor, - modalOptions: KEYPOM_OPTIONS + url: "http://localhost:1234/instant-url#ACCOUNT_ID/SECRET_KEY", + } }) ], }); diff --git a/packages/selector/README.md b/packages/selector/README.md index cbe996da7..3da0e15a7 100644 --- a/packages/selector/README.md +++ b/packages/selector/README.md @@ -72,7 +72,7 @@ const selector = await setupWalletSelector({ ## Setup Keypom Parameters -`setupKeypom` is the core of the Keypom wallet selector and is the only function you need to worry about. There are a suite of customizable features that you can make use of to tailor the user experience to your app's needs. At its core, the setup function takes the following parameters: +`setupKeypom` is the core of the Keypom wallet selector and is the only function you should know about. There are a ton of customizable features that you can make use of to tailor the user experience to your app's needs. At its core, the setup function takes the following parameters: - `networkId`: Either `testnet` or `mainnet`. - `signInContractId`: Which contract will be used to sign in users. @@ -89,21 +89,66 @@ This technology is perfect for dApps of all sizes ranging from small indie to la In order to support trial accounts, your app must have the `setupKeypom` function embedded within the wallet selector with the `trialAccountSpecs` parameter specified. +## Trial Account Specs + +The trial account specifications allows the Keypom wallet selector to support trial accounts on your app. In order to trigger the sign in flow, the user must be on the correct URL. This URL is specified in the specifications as a string and should look like this: ```js -await initKeypom({ - network: "testnet" -}); +https://near.org/#trial-url/ACCOUNT_ID/SECRET_KEY +``` -const keys = await generateKeys({ - numKeys: 1 -}) -console.log('keys: ', keys) +The URL *must* have the `ACCOUNT_ID` and `SECRET_KEY` placeholders. -const dropSupply = await getKeyTotalSupply(); -console.log('dropSupply: ', dropSupply) +As an example, if you wanted your trial users to sign in once they reached `https://near.org/#trial-url/`, and you wanted the account and secret key to be seperated using `/`, your specs should look like this: + +```js +trialAccountSpecs: { + url: "https://near.org/#trial-url/ACCOUNT_ID/SECRET_KEY", +} +``` + +> **NOTE:** The account ID must come first and the secret key must follow the delimiter. For unclaimed trial account linkdrops, the account ID will be the Keypom contract. For claimed trial account linkdrops, the account ID will be the account ID chosen by the user. + +### Modal Options + +The second field in the trial account specs is the `modalOptions`. This contains all the customizable options for the trial account modals as well as the wallets you want to support for user offboarding. + +All of the modal text can be optionally customized but the only *required* field that you must specify in the modal options are the wallets. + +These specs are an object that have three mandatory fields: +- `baseUrl`: The URL of your app. This is the URL that will be used to construct the trial account URL. +- `delimiter`: The delimiter that separates the base URL from the trial account ID. For example, if the base URL is `https://near.org/#trial-url/` and the delimiter is `/`, the trial account URL will be `https://near.org/#trial-url/`. +- `modalOptions`: An object that contains all the customizable options for the trial account modals. See the [Modal Options](#modal-options) section for more information. + +In the following example, + +```js +const NETWORK_ID = "mainnet"; +const CONTRACT_ID = "social.near"; + +const selector = await setupWalletSelector({ + network: NETWORK_ID, + modules: [ + setupMyNearWallet(), + ... + setupSender(), + setupKeypom({ + networkId: NETWORK_ID, + signInContractId: CONTRACT_ID, + trialAccountSpecs: { + baseUrl: "https://near.org/#trial-url/", + delimiter: "/", + modalOptions: KEYPOM_OPTIONS + } + }) + ], +}); ``` +## Offboarding Mechanisms + + + ## Funder Object If you have the private key of an account that you'd like to use to sign transactions with, you can pass in a `funder` object to `initKeypom`. The private key can either be hardcoded or passed in through environment variables / secrets. diff --git a/packages/selector/lib/core/setup.d.ts b/packages/selector/lib/core/setup.d.ts index 6708a6782..7e0200a39 100644 --- a/packages/selector/lib/core/setup.d.ts +++ b/packages/selector/lib/core/setup.d.ts @@ -1,3 +1,3 @@ import type { WalletModuleFactory } from '@near-wallet-selector/core'; import { KeypomParams, KeypomWalletInstant } from './types'; -export declare function setupKeypom({ deprecated, trialAccountSpecs, instantSignInSpecs, networkId, signInContractId, modalOptions }: KeypomParams): WalletModuleFactory; +export declare function setupKeypom({ trialAccountSpecs, instantSignInSpecs, networkId, signInContractId }: KeypomParams): WalletModuleFactory; diff --git a/packages/selector/lib/core/setup.js b/packages/selector/lib/core/setup.js index f1ac3a659..84fef826f 100644 --- a/packages/selector/lib/core/setup.js +++ b/packages/selector/lib/core/setup.js @@ -179,7 +179,7 @@ var Keypom = function (_a) { }; function setupKeypom(_a) { var _this = this; - var _b = _a.deprecated, deprecated = _b === void 0 ? false : _b, trialAccountSpecs = _a.trialAccountSpecs, instantSignInSpecs = _a.instantSignInSpecs, networkId = _a.networkId, signInContractId = _a.signInContractId, modalOptions = _a.modalOptions; + var trialAccountSpecs = _a.trialAccountSpecs, instantSignInSpecs = _a.instantSignInSpecs, networkId = _a.networkId, signInContractId = _a.signInContractId; return function () { return __awaiter(_this, void 0, void 0, function () { var keypomWallet, shouldSignIn; var _this = this; @@ -188,12 +188,19 @@ function setupKeypom(_a) { console.warn('KeypomWallet: signInContractId, networkId and either instant sign in specs or trial account specs are required to use the KeypomWallet.'); return [2 /*return*/, null]; } + if (trialAccountSpecs && !(trialAccountSpecs.url.includes('ACCOUNT_ID') || trialAccountSpecs.url.includes('SECRET_KEY'))) { + console.warn('KeypomWallet: trial account specs must include ACCOUNT_ID and SECRET_KEY in url'); + return [2 /*return*/, null]; + } + if (instantSignInSpecs && !(instantSignInSpecs.url.includes('ACCOUNT_ID') || instantSignInSpecs.url.includes('SECRET_KEY'))) { + console.warn('KeypomWallet: trial account specs must include ACCOUNT_ID'); + return [2 /*return*/, null]; + } keypomWallet = new wallet_1.KeypomWallet({ signInContractId: signInContractId, networkId: networkId, trialAccountSpecs: trialAccountSpecs, - instantSignInSpecs: instantSignInSpecs, - modalOptions: modalOptions + instantSignInSpecs: instantSignInSpecs }); shouldSignIn = keypomWallet.checkValidTrialInfo(); console.log('shouldSignIn: ', shouldSignIn); @@ -204,7 +211,7 @@ function setupKeypom(_a) { name: 'Keypom Account', description: null, iconUrl: '', - deprecated: deprecated, + deprecated: false, available: true, contractId: signInContractId, runOnStartup: shouldSignIn, diff --git a/packages/selector/lib/core/types.d.ts b/packages/selector/lib/core/types.d.ts index 4c964bff3..3ba3e856c 100644 --- a/packages/selector/lib/core/types.d.ts +++ b/packages/selector/lib/core/types.d.ts @@ -7,16 +7,21 @@ export declare const FAILED_EXECUTION_OUTCOME: FinalExecutionOutcome; export declare const KEYPOM_MODULE_ID = "keypom"; export interface InternalInstantSignInSpecs extends InstantSignInSpecs { moduleId?: string; + baseUrl?: string; + delimiter?: string; + moduleDelimiter?: string; } -export interface InstantSignInSpecs extends BaseSignInSpecs { - moduleDelimiter: string; -} -export interface TrialSignInSpecs extends BaseSignInSpecs { +export interface InternalTrialSignInSpecs extends TrialSignInSpecs { isMappingAccount: boolean; + baseUrl?: string; + delimiter?: string; +} +export interface InstantSignInSpecs { + url: string; } -export interface BaseSignInSpecs { - baseUrl: string; - delimiter: string; +export interface TrialSignInSpecs { + url: string; + modalOptions: ModalCustomizations; } export interface SignInOptions { contractId?: string; @@ -29,11 +34,8 @@ export interface KeypomInitializeOptions { export interface KeypomParams { networkId: NetworkId; signInContractId: string; - trialAccountSpecs: BaseSignInSpecs; - instantSignInSpecs: InstantSignInSpecs; - deprecated?: boolean; - trialSplitDelim?: string; - modalOptions: ModalCustomizations; + trialAccountSpecs?: TrialSignInSpecs; + instantSignInSpecs?: InstantSignInSpecs; } export type KeypomWalletInstant = InstantLinkWallet & { networkId: string; diff --git a/packages/selector/lib/core/wallet.d.ts b/packages/selector/lib/core/wallet.d.ts index 5af1c1807..892b5d487 100644 --- a/packages/selector/lib/core/wallet.d.ts +++ b/packages/selector/lib/core/wallet.d.ts @@ -5,8 +5,7 @@ import { Near } from '@near-js/wallet-account'; import { InstantLinkWalletBehaviour, Transaction } from '@near-wallet-selector/core'; import BN from 'bn.js'; import { KeypomTrialModal } from '../modal/src'; -import { ModalCustomizations } from '../modal/src/lib/modal.types'; -import { BaseSignInSpecs, InstantSignInSpecs, InternalInstantSignInSpecs, TrialSignInSpecs } from './types'; +import { InstantSignInSpecs, InternalInstantSignInSpecs, InternalTrialSignInSpecs, TrialSignInSpecs } from './types'; export declare class KeypomWallet implements InstantLinkWalletBehaviour { accountId?: string; secretKey?: string; @@ -14,15 +13,14 @@ export declare class KeypomWallet implements InstantLinkWalletBehaviour { signInContractId: string; near: Near; keyStore: BrowserLocalStorageKeyStore; - trialAccountSpecs?: TrialSignInSpecs; + trialAccountSpecs?: InternalTrialSignInSpecs; instantSignInSpecs?: InternalInstantSignInSpecs; - modal: KeypomTrialModal; - constructor({ signInContractId, networkId, trialAccountSpecs, instantSignInSpecs, modalOptions }: { + modal?: KeypomTrialModal; + constructor({ signInContractId, networkId, trialAccountSpecs, instantSignInSpecs, }: { signInContractId: string; networkId: string; - trialAccountSpecs?: BaseSignInSpecs; + trialAccountSpecs?: TrialSignInSpecs; instantSignInSpecs?: InstantSignInSpecs; - modalOptions: ModalCustomizations; }); getContractId(): string; getAccountId(): string; diff --git a/packages/selector/lib/core/wallet.js b/packages/selector/lib/core/wallet.js index 87cc15490..f5f824dda 100644 --- a/packages/selector/lib/core/wallet.js +++ b/packages/selector/lib/core/wallet.js @@ -62,9 +62,11 @@ var modal_types_1 = require("../modal/src/lib/modal.types"); var selector_utils_1 = require("../utils/selector-utils"); var ext_wallets_1 = require("./ext_wallets"); var types_1 = require("./types"); +var TRIAL_URL_REGEX = new RegExp("(.*)ACCOUNT_ID(.*)SECRET_KEY"); +var INSTANT_URL_REGEX = new RegExp("(.*)ACCOUNT_ID(.*)SECRET_KEY(.*)MODULE_ID"); var KeypomWallet = /** @class */ (function () { function KeypomWallet(_a) { - var signInContractId = _a.signInContractId, networkId = _a.networkId, trialAccountSpecs = _a.trialAccountSpecs, instantSignInSpecs = _a.instantSignInSpecs, modalOptions = _a.modalOptions; + var signInContractId = _a.signInContractId, networkId = _a.networkId, trialAccountSpecs = _a.trialAccountSpecs, instantSignInSpecs = _a.instantSignInSpecs; var _this = this; this.showModal = function (modalType) { if (modalType === void 0) { modalType = { id: modal_types_1.MODAL_TYPE_IDS.TRIAL_OVER }; } @@ -72,8 +74,9 @@ var KeypomWallet = /** @class */ (function () { _this.modal.show(modalType); }; this.checkValidTrialInfo = function () { - var instantSignInData = _this.instantSignInSpecs !== undefined ? (0, selector_utils_1.parseInstantSignInUrl)(_this.instantSignInSpecs) : undefined; - var trialData = _this.trialAccountSpecs !== undefined ? (0, selector_utils_1.parseTrialUrl)(_this.trialAccountSpecs) : undefined; + var _a, _b; + var instantSignInData = ((_a = _this.instantSignInSpecs) === null || _a === void 0 ? void 0 : _a.baseUrl) !== undefined ? (0, selector_utils_1.parseInstantSignInUrl)(_this.instantSignInSpecs) : undefined; + var trialData = ((_b = _this.trialAccountSpecs) === null || _b === void 0 ? void 0 : _b.baseUrl) !== undefined ? (0, selector_utils_1.parseTrialUrl)(_this.trialAccountSpecs) : undefined; return instantSignInData !== undefined || trialData !== undefined || (0, selector_utils_1.getLocalStorageKeypomEnv)() !== null; }; console.log('Initializing Keypom'); @@ -82,11 +85,24 @@ var KeypomWallet = /** @class */ (function () { this.near = new wallet_account_1.Near(__assign(__assign({}, core_1.networks[networkId]), { deps: { keyStore: this.keyStore } })); var trialSpecs = undefined; if (trialAccountSpecs !== undefined) { - trialSpecs = __assign(__assign({}, trialAccountSpecs), { isMappingAccount: false }); + // Get the base URL and delimiter by splitting the URL using ACCOUNT_ID and SECRET_KEY + var matches = trialAccountSpecs.url.match(TRIAL_URL_REGEX); + var baseUrl = matches === null || matches === void 0 ? void 0 : matches[1]; + var delimiter = matches === null || matches === void 0 ? void 0 : matches[2]; + trialSpecs = __assign(__assign({}, trialAccountSpecs), { isMappingAccount: false, baseUrl: baseUrl, delimiter: delimiter }); + this.modal = (0, src_1.setupModal)(trialAccountSpecs.modalOptions); } this.trialAccountSpecs = trialSpecs; - this.instantSignInSpecs = instantSignInSpecs; - this.modal = (0, src_1.setupModal)(modalOptions); + var instantSpecs = undefined; + if (instantSignInSpecs !== undefined) { + // Get the base URL and delimiter by splitting the URL using ACCOUNT_ID and SECRET_KEY + var matches = instantSignInSpecs.url.match(INSTANT_URL_REGEX); + var baseUrl = matches === null || matches === void 0 ? void 0 : matches[1]; + var delimiter = matches === null || matches === void 0 ? void 0 : matches[2]; + var moduleDelimiter = matches === null || matches === void 0 ? void 0 : matches[3]; + instantSpecs = __assign(__assign({}, instantSignInSpecs), { baseUrl: baseUrl, delimiter: delimiter, moduleDelimiter: moduleDelimiter }); + } + this.instantSignInSpecs = instantSpecs; } KeypomWallet.prototype.getContractId = function () { return this.signInContractId; @@ -196,16 +212,17 @@ var KeypomWallet = /** @class */ (function () { }); }; KeypomWallet.prototype.signIn = function () { + var _a, _b; return __awaiter(this, void 0, void 0, function () { - var instantSignInData, trialData, curEnvData, _a, accountId, secretKey, moduleId; - return __generator(this, function (_b) { - switch (_b.label) { + var instantSignInData, trialData, curEnvData, _c, accountId, secretKey, moduleId; + return __generator(this, function (_d) { + switch (_d.label) { case 0: return [4 /*yield*/, (0, core_1.initKeypom)({ network: this.near.connection.networkId })]; case 1: - _b.sent(); - instantSignInData = this.instantSignInSpecs !== undefined ? (0, selector_utils_1.parseInstantSignInUrl)(this.instantSignInSpecs) : undefined; + _d.sent(); + instantSignInData = ((_a = this.instantSignInSpecs) === null || _a === void 0 ? void 0 : _a.baseUrl) !== undefined ? (0, selector_utils_1.parseInstantSignInUrl)(this.instantSignInSpecs) : undefined; console.log('instantSignInData: ', instantSignInData); if (instantSignInData !== undefined) { if (ext_wallets_1.SUPPORTED_EXT_WALLET_DATA[this.near.connection.networkId][instantSignInData.moduleId] === undefined) { @@ -214,14 +231,15 @@ var KeypomWallet = /** @class */ (function () { } return [2 /*return*/, this.signInInstantAccount(instantSignInData.accountId, instantSignInData.secretKey, instantSignInData.moduleId)]; } - trialData = this.trialAccountSpecs !== undefined ? (0, selector_utils_1.parseTrialUrl)(this.trialAccountSpecs) : undefined; + trialData = ((_b = this.trialAccountSpecs) === null || _b === void 0 ? void 0 : _b.baseUrl) !== undefined ? (0, selector_utils_1.parseTrialUrl)(this.trialAccountSpecs) : undefined; + console.log('trialData: ', trialData); if (trialData !== undefined) { return [2 /*return*/, this.signInTrialAccount(trialData.accountId, trialData.secretKey)]; } curEnvData = (0, selector_utils_1.getLocalStorageKeypomEnv)(); // If there is any data in local storage, default to that otherwise return empty array if (curEnvData !== null) { - _a = JSON.parse(curEnvData), accountId = _a.accountId, secretKey = _a.secretKey, moduleId = _a.moduleId; + _c = JSON.parse(curEnvData), accountId = _c.accountId, secretKey = _c.secretKey, moduleId = _c.moduleId; return [2 /*return*/, this.internalSignIn(accountId, secretKey, moduleId)]; } return [2 /*return*/, []]; diff --git a/packages/selector/lib/modal/src/lib/components/OffboardingWallets.js b/packages/selector/lib/modal/src/lib/components/OffboardingWallets.js index f60d44645..fd3f55038 100644 --- a/packages/selector/lib/modal/src/lib/components/OffboardingWallets.js +++ b/packages/selector/lib/modal/src/lib/components/OffboardingWallets.js @@ -10,9 +10,14 @@ var OffboardingWallets = function (_a) { var customizations = _a.customizations, wallets = _a.wallets, accountId = _a.accountId, secretKey = _a.secretKey; function renderOptionsList(walletsToRender) { return walletsToRender.reduce(function (result, wallet, index) { - var name = wallet.name, description = wallet.description, iconUrl = wallet.iconUrl, baseRedirectUrl = wallet.baseRedirectUrl, _a = wallet.delimiter, delimiter = _a === void 0 ? "/" : _a; + var name = wallet.name, description = wallet.description, iconUrl = wallet.iconUrl, redirectUrl = wallet.redirectUrl; + var mapObj = { + ACCOUNT_ID: accountId, + SECRET_KEY: secretKey + }; + var url = redirectUrl.replace(/\b(?:SECRET_KEY|ACCOUNT_ID)\b/gi, function (matched) { return mapObj[matched]; }); result.push(react_1.default.createElement("li", { tabIndex: 0, className: "single-wallet sidebar ".concat(wallet.name), key: wallet.name, onClick: function () { - window.open("".concat(baseRedirectUrl).concat(accountId).concat(delimiter).concat(secretKey), "_blank"); + window.open(url, "_blank"); } }, react_1.default.createElement("div", { className: "icon" }, react_1.default.createElement("img", { src: iconUrl, alt: name })), diff --git a/packages/selector/lib/modal/src/lib/handleModalType.d.ts b/packages/selector/lib/modal/src/lib/handleModalType.d.ts index a4f951e90..299e3f7ea 100644 --- a/packages/selector/lib/modal/src/lib/handleModalType.d.ts +++ b/packages/selector/lib/modal/src/lib/handleModalType.d.ts @@ -1,3 +1,2 @@ -/// import { ModalCustomizations, ModalType } from "./modal.types"; export declare const renderModalType: (modalType: ModalType, options: ModalCustomizations, hide: () => void) => JSX.Element | null; diff --git a/packages/selector/lib/modal/src/lib/modal.types.d.ts b/packages/selector/lib/modal/src/lib/modal.types.d.ts index 5423baefb..04b96e835 100644 --- a/packages/selector/lib/modal/src/lib/modal.types.d.ts +++ b/packages/selector/lib/modal/src/lib/modal.types.d.ts @@ -56,8 +56,7 @@ export interface OffboardingWallet { name: string; description: string; iconUrl: string; - baseRedirectUrl: string; - delimiter?: string; + redirectUrl: string; } export interface MainBodyImage { title: string; diff --git a/packages/selector/lib/tsconfig.tsbuildinfo b/packages/selector/lib/tsconfig.tsbuildinfo index 798d80d3a..45dace276 100644 --- a/packages/selector/lib/tsconfig.tsbuildinfo +++ b/packages/selector/lib/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"program":{"fileNames":["../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.scripthost.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.esnext.intl.d.ts","../../../node_modules/.pnpm/@near-js+crypto@0.0.4/node_modules/@near-js/crypto/lib/constants.d.ts","../../../node_modules/.pnpm/@near-js+types@0.0.4/node_modules/@near-js/types/lib/assignable.d.ts","../../../node_modules/.pnpm/@near-js+types@0.0.4/node_modules/@near-js/types/lib/errors.d.ts","../../../node_modules/.pnpm/@near-js+types@0.0.4/node_modules/@near-js/types/lib/provider/protocol.d.ts","../../../node_modules/.pnpm/@near-js+types@0.0.4/node_modules/@near-js/types/lib/provider/response.d.ts","../../../node_modules/.pnpm/@near-js+types@0.0.4/node_modules/@near-js/types/lib/provider/validator.d.ts","../../../node_modules/.pnpm/@near-js+types@0.0.4/node_modules/@near-js/types/lib/provider/light_client.d.ts","../../../node_modules/.pnpm/@near-js+types@0.0.4/node_modules/@near-js/types/lib/provider/request.d.ts","../../../node_modules/.pnpm/@near-js+types@0.0.4/node_modules/@near-js/types/lib/provider/index.d.ts","../../../node_modules/.pnpm/@near-js+types@0.0.4/node_modules/@near-js/types/lib/index.d.ts","../../../node_modules/.pnpm/@near-js+crypto@0.0.4/node_modules/@near-js/crypto/lib/public_key.d.ts","../../../node_modules/.pnpm/@near-js+crypto@0.0.4/node_modules/@near-js/crypto/lib/key_pair_base.d.ts","../../../node_modules/.pnpm/@near-js+crypto@0.0.4/node_modules/@near-js/crypto/lib/key_pair.d.ts","../../../node_modules/.pnpm/@near-js+crypto@0.0.4/node_modules/@near-js/crypto/lib/key_pair_ed25519.d.ts","../../../node_modules/.pnpm/@near-js+crypto@0.0.4/node_modules/@near-js/crypto/lib/index.d.ts","../../../node_modules/.pnpm/@near-js+keystores@0.0.4/node_modules/@near-js/keystores/lib/keystore.d.ts","../../../node_modules/.pnpm/@near-js+keystores@0.0.4/node_modules/@near-js/keystores/lib/in_memory_key_store.d.ts","../../../node_modules/.pnpm/@near-js+keystores@0.0.4/node_modules/@near-js/keystores/lib/merge_key_store.d.ts","../../../node_modules/.pnpm/@near-js+keystores@0.0.4/node_modules/@near-js/keystores/lib/index.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/key_stores/keystore.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/key_stores/in_memory_key_store.d.ts","../../../node_modules/.pnpm/@near-js+keystores-browser@0.0.4/node_modules/@near-js/keystores-browser/lib/browser_local_storage_key_store.d.ts","../../../node_modules/.pnpm/@near-js+keystores-browser@0.0.4/node_modules/@near-js/keystores-browser/lib/index.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/key_stores/browser_local_storage_key_store.d.ts","../../../node_modules/.pnpm/@near-js+keystores-node@0.0.4/node_modules/@near-js/keystores-node/lib/unencrypted_file_system_keystore.d.ts","../../../node_modules/.pnpm/@near-js+keystores-node@0.0.4/node_modules/@near-js/keystores-node/lib/index.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/key_stores/unencrypted_file_system_keystore.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/key_stores/merge_key_store.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/key_stores/index.d.ts","../../../node_modules/.pnpm/@near-js+utils@0.0.4/node_modules/@near-js/utils/lib/constants.d.ts","../../../node_modules/.pnpm/@near-js+utils@0.0.4/node_modules/@near-js/utils/lib/errors/errors.d.ts","../../../node_modules/.pnpm/@near-js+utils@0.0.4/node_modules/@near-js/utils/lib/errors/rpc_errors.d.ts","../../../node_modules/.pnpm/@near-js+utils@0.0.4/node_modules/@near-js/utils/lib/errors/index.d.ts","../../../node_modules/.pnpm/@near-js+utils@0.0.4/node_modules/@near-js/utils/lib/format.d.ts","../../../node_modules/.pnpm/@near-js+utils@0.0.4/node_modules/@near-js/utils/lib/logging.d.ts","../../../node_modules/.pnpm/@near-js+utils@0.0.4/node_modules/@near-js/utils/lib/provider.d.ts","../../../node_modules/.pnpm/@near-js+utils@0.0.4/node_modules/@near-js/utils/lib/validators.d.ts","../../../node_modules/.pnpm/@near-js+utils@0.0.4/node_modules/@near-js/utils/lib/index.d.ts","../../../node_modules/.pnpm/@near-js+providers@0.0.6/node_modules/@near-js/providers/lib/exponential-backoff.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/assert.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/assert/strict.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/globals.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/async_hooks.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/buffer.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/child_process.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/cluster.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/console.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/constants.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/crypto.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/dgram.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/dns.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/dns/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/domain.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/dom-events.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/events.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/fs.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/fs/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/http.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/http2.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/https.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/inspector.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/module.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/net.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/os.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/path.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/process.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/punycode.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/querystring.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/readline.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/readline/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/repl.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/stream.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/stream/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/stream/web.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/string_decoder.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/test.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/timers.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/timers/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/tls.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/trace_events.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/tty.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/url.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/util.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/v8.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/vm.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/wasi.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/worker_threads.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/zlib.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/globals.global.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/index.d.ts","../../../node_modules/.pnpm/@near-js+transactions@0.2.0/node_modules/@near-js/transactions/lib/delegate.d.ts","../../../node_modules/.pnpm/@near-js+transactions@0.2.0/node_modules/@near-js/transactions/lib/signature.d.ts","../../../node_modules/.pnpm/@near-js+transactions@0.2.0/node_modules/@near-js/transactions/lib/actions.d.ts","../../../node_modules/.pnpm/@near-js+transactions@0.2.0/node_modules/@near-js/transactions/lib/action_creators.d.ts","../../../node_modules/.pnpm/@near-js+transactions@0.2.0/node_modules/@near-js/transactions/lib/schema.d.ts","../../../node_modules/.pnpm/@near-js+transactions@0.2.0/node_modules/@near-js/transactions/lib/create_transaction.d.ts","../../../node_modules/.pnpm/@near-js+signers@0.0.4/node_modules/@near-js/signers/lib/signer.d.ts","../../../node_modules/.pnpm/@near-js+signers@0.0.4/node_modules/@near-js/signers/lib/in_memory_signer.d.ts","../../../node_modules/.pnpm/@near-js+signers@0.0.4/node_modules/@near-js/signers/lib/index.d.ts","../../../node_modules/.pnpm/@near-js+transactions@0.2.0/node_modules/@near-js/transactions/lib/sign.d.ts","../../../node_modules/.pnpm/@near-js+transactions@0.2.0/node_modules/@near-js/transactions/lib/index.d.ts","../../../node_modules/.pnpm/@near-js+providers@0.0.6/node_modules/@near-js/providers/lib/provider.d.ts","../../../node_modules/.pnpm/@near-js+providers@0.0.6/node_modules/@near-js/providers/lib/fetch_json.d.ts","../../../node_modules/.pnpm/@near-js+providers@0.0.6/node_modules/@near-js/providers/lib/json-rpc-provider.d.ts","../../../node_modules/.pnpm/@near-js+providers@0.0.6/node_modules/@near-js/providers/lib/index.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/providers/provider.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/providers/json-rpc-provider.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/providers/index.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/utils/key_pair.d.ts","../../../node_modules/.pnpm/borsh@0.7.0/node_modules/borsh/lib/index.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/utils/serialize.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/utils/web.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/utils/enums.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/utils/format.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/utils/rpc_errors.d.ts","../../../node_modules/.pnpm/@near-js+accounts@0.1.3/node_modules/@near-js/accounts/lib/connection.d.ts","../../../node_modules/.pnpm/@near-js+accounts@0.1.3/node_modules/@near-js/accounts/lib/account.d.ts","../../../node_modules/.pnpm/@near-js+accounts@0.1.3/node_modules/@near-js/accounts/lib/types.d.ts","../../../node_modules/.pnpm/@near-js+accounts@0.1.3/node_modules/@near-js/accounts/lib/account_multisig.d.ts","../../../node_modules/.pnpm/@near-js+accounts@0.1.3/node_modules/@near-js/accounts/lib/account_2fa.d.ts","../../../node_modules/.pnpm/@near-js+accounts@0.1.3/node_modules/@near-js/accounts/lib/account_creator.d.ts","../../../node_modules/.pnpm/@near-js+accounts@0.1.3/node_modules/@near-js/accounts/lib/constants.d.ts","../../../node_modules/.pnpm/@types+json-schema@7.0.11/node_modules/@types/json-schema/index.d.ts","../../../node_modules/.pnpm/near-abi@0.1.1/node_modules/near-abi/lib/index.d.ts","../../../node_modules/.pnpm/@near-js+accounts@0.1.3/node_modules/@near-js/accounts/lib/contract.d.ts","../../../node_modules/.pnpm/uri-js@4.4.1/node_modules/uri-js/dist/es5/uri.all.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/codegen/code.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/codegen/scope.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/codegen/index.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/rules.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/util.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/validate/subschema.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/errors.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/validate/index.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/validate/datatype.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/applicator/additionalitems.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/applicator/items2020.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/applicator/contains.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/applicator/dependencies.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/applicator/propertynames.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/applicator/additionalproperties.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/applicator/not.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/applicator/anyof.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/applicator/oneof.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/applicator/if.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/applicator/index.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/validation/limitnumber.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/validation/multipleof.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/validation/pattern.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/validation/required.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/validation/uniqueitems.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/validation/const.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/validation/enum.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/validation/index.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/format/format.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedproperties.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/unevaluated/unevaluateditems.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/validation/dependentrequired.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/discriminator/types.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/discriminator/index.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/errors.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/types/json-schema.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/types/jtd-schema.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/runtime/validation_error.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/ref_error.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/core.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/resolve.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/index.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/types/index.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/ajv.d.ts","../../../node_modules/.pnpm/@near-js+accounts@0.1.3/node_modules/@near-js/accounts/lib/errors.d.ts","../../../node_modules/.pnpm/@near-js+accounts@0.1.3/node_modules/@near-js/accounts/lib/index.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/utils/errors.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/utils/index.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/transaction.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/validators.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/account.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/account_multisig.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/account_creator.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/connection.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/signer.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/contract.d.ts","../../../node_modules/.pnpm/@near-js+wallet-account@0.0.6/node_modules/@near-js/wallet-account/lib/near.d.ts","../../../node_modules/.pnpm/@near-js+wallet-account@0.0.6/node_modules/@near-js/wallet-account/lib/wallet_account.d.ts","../../../node_modules/.pnpm/@near-js+wallet-account@0.0.6/node_modules/@near-js/wallet-account/lib/index.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/near.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/wallet-account.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/common-index.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/connect.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/constants.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/index.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/provider/provider.service.types.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/provider/provider.service.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/storage/storage.service.types.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/storage/json-storage.service.types.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/storage/json-storage.service.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/storage/web-storage.service.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/logger/logger.service.types.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/logger/logger.service.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/wallet/transactions.types.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/wallet/index.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/translate/translate.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/options.types.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/subscription.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/subscriber.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operator.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/types.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/audit.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/audittime.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/buffer.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/buffercount.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/buffertime.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/buffertoggle.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/bufferwhen.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/catcherror.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/combinelatestall.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/combineall.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/combinelatest.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/combinelatestwith.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/concat.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/concatall.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/concatmap.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/concatmapto.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/concatwith.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/connect.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/count.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/debounce.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/debouncetime.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/defaultifempty.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/delay.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/delaywhen.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/dematerialize.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/distinct.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/distinctuntilchanged.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/distinctuntilkeychanged.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/elementat.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/endwith.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/every.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/exhaustall.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/exhaust.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/exhaustmap.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/expand.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/filter.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/finalize.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/find.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/findindex.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/first.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/subject.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/groupby.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/ignoreelements.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/isempty.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/last.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/map.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/mapto.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/notification.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/materialize.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/max.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/merge.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/mergeall.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/mergemap.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/flatmap.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/mergemapto.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/mergescan.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/mergewith.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/min.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/connectableobservable.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/multicast.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/observeon.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/onerrorresumenextwith.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/pairwise.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/partition.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/pluck.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/publish.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/publishbehavior.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/publishlast.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/publishreplay.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/race.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/racewith.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/reduce.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/repeat.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/repeatwhen.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/retry.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/retrywhen.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/refcount.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/sample.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/sampletime.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/scan.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/sequenceequal.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/share.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/sharereplay.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/single.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/skip.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/skiplast.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/skipuntil.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/skipwhile.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/startwith.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/subscribeon.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/switchall.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/switchmap.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/switchmapto.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/switchscan.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/take.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/takelast.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/takeuntil.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/takewhile.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/tap.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/throttle.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/throttletime.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/throwifempty.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/timeinterval.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/timeout.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/timeoutwith.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/timestamp.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/toarray.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/window.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/windowcount.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/windowtime.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/windowtoggle.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/windowwhen.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/withlatestfrom.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/zip.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/zipall.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/zipwith.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/operators/index.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/action.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/testing/testmessage.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/testing/subscriptionlog.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/testing/subscriptionloggable.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/testing/coldobservable.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/testing/hotobservable.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/asyncscheduler.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/timerhandle.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/asyncaction.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/virtualtimescheduler.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/testing/testscheduler.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/testing/index.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/symbol/observable.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/dom/animationframes.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/behaviorsubject.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/replaysubject.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/asyncsubject.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/asapscheduler.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/asap.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/async.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/queuescheduler.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/queue.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/animationframescheduler.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/animationframe.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/util/identity.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/util/pipe.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/util/noop.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/util/isobservable.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/lastvaluefrom.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/firstvaluefrom.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/util/argumentoutofrangeerror.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/util/emptyerror.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/util/notfounderror.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/util/objectunsubscribederror.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/util/sequenceerror.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/util/unsubscriptionerror.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/bindcallback.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/bindnodecallback.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/anycatcher.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/combinelatest.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/concat.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/connectable.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/defer.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/empty.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/forkjoin.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/from.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/fromevent.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/fromeventpattern.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/generate.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/iif.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/interval.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/merge.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/never.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/of.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/onerrorresumenext.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/pairs.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/partition.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/race.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/range.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/throwerror.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/timer.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/using.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/zip.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduled/scheduled.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/config.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/index.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/store.types.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/event-emitter/event-emitter.types.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/event-emitter/event-emitter.service.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/wallet-selector.types.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/wallet-modules/wallet-modules.service.types.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/wallet-modules/wallet-modules.service.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/index.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/utils.types.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/wallet/wallet.types.d.ts","../../core/lib/lib/balances.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/wallet-selector.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/helpers/waitfor.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/helpers/getactiveaccount.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/helpers/detect-browser.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/helpers/index.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/index.d.ts","../../core/lib/lib/types/general.d.ts","../../core/lib/lib/keypom.d.ts","../../core/lib/lib/claims.d.ts","../../core/lib/lib/types/fc.d.ts","../../core/lib/lib/types/ft.d.ts","../../core/lib/lib/types/nft.d.ts","../../core/lib/lib/types/simple.d.ts","../../core/lib/lib/types/drops.d.ts","../../core/lib/lib/types/protocol.d.ts","../../core/lib/lib/types/params.d.ts","../../core/lib/lib/drops.d.ts","../../core/lib/lib/keypom-utils.d.ts","../../core/lib/lib/keys.d.ts","../../core/lib/lib/sales.d.ts","../../core/lib/lib/trial-accounts/pre-trial.d.ts","../../core/lib/lib/trial-accounts/trial-active.d.ts","../../core/lib/lib/trial-accounts/utils.d.ts","../../core/lib/lib/views.d.ts","../../core/lib/index.d.ts","../../../node_modules/.pnpm/@types+react@18.0.26/node_modules/@types/react/global.d.ts","../../../node_modules/.pnpm/csstype@3.1.2/node_modules/csstype/index.d.ts","../../../node_modules/.pnpm/@types+prop-types@15.7.5/node_modules/@types/prop-types/index.d.ts","../../../node_modules/.pnpm/@types+scheduler@0.16.3/node_modules/@types/scheduler/tracing.d.ts","../../../node_modules/.pnpm/@types+react@18.0.26/node_modules/@types/react/index.d.ts","../src/modal/src/lib/modal.types.ts","../src/modal/src/lib/components/closemodalbutton.tsx","../src/modal/src/lib/components/mainbody.tsx","../src/modal/src/lib/components/begintrial.tsx","../src/modal/src/lib/components/insufficientbalance.tsx","../src/modal/src/lib/components/invalidactions.tsx","../src/modal/src/lib/components/offboardingwallets.tsx","../src/modal/src/lib/components/trialover.tsx","../src/modal/src/lib/handlemodaltype.tsx","../src/modal/src/lib/components/keypommodal.tsx","../src/modal/src/lib/modal.tsx","../src/modal/src/index.ts","../src/core/types.ts","../src/utils/selector-utils.ts","../src/core/ext_wallets.ts","../src/core/wallet.ts","../src/core/setup.ts","../src/index.ts"],"fileInfos":["2dc8c927c9c162a773c6bb3cdc4f3286c23f10eedc67414028f9cb5951610f60",{"version":"8730f4bf322026ff5229336391a18bcaa1f94d4f82416c8b2f3954e2ccaae2ba","affectsGlobalScope":true},"dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6","7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467","8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9","5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06","4b421cbfb3a38a27c279dec1e9112c3d1da296f77a1a85ddadf7e7a425d45d18","1fc5ab7a764205c68fa10d381b08417795fc73111d6dd16b5b1ed36badb743d9",{"version":"3aafcb693fe5b5c3bd277bd4c3a617b53db474fe498fc5df067c5603b1eebde7","affectsGlobalScope":true},{"version":"7fac8cb5fc820bc2a59ae11ef1c5b38d3832c6d0dfaec5acdb5569137d09a481","affectsGlobalScope":true},{"version":"097a57355ded99c68e6df1b738990448e0bf170e606707df5a7c0481ff2427cd","affectsGlobalScope":true},{"version":"adb996790133eb33b33aadb9c09f15c2c575e71fb57a62de8bf74dbf59ec7dfb","affectsGlobalScope":true},{"version":"8cc8c5a3bac513368b0157f3d8b31cfdcfe78b56d3724f30f80ed9715e404af8","affectsGlobalScope":true},{"version":"cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a","affectsGlobalScope":true},{"version":"c5c05907c02476e4bde6b7e76a79ffcd948aedd14b6a8f56e4674221b0417398","affectsGlobalScope":true},{"version":"5f406584aef28a331c36523df688ca3650288d14f39c5d2e555c95f0d2ff8f6f","affectsGlobalScope":true},{"version":"22f230e544b35349cfb3bd9110b6ef37b41c6d6c43c3314a31bd0d9652fcec72","affectsGlobalScope":true},{"version":"7ea0b55f6b315cf9ac2ad622b0a7813315bb6e97bf4bb3fbf8f8affbca7dc695","affectsGlobalScope":true},{"version":"3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93","affectsGlobalScope":true},{"version":"eb26de841c52236d8222f87e9e6a235332e0788af8c87a71e9e210314300410a","affectsGlobalScope":true},{"version":"3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006","affectsGlobalScope":true},{"version":"17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a","affectsGlobalScope":true},{"version":"7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98","affectsGlobalScope":true},{"version":"6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577","affectsGlobalScope":true},{"version":"81cac4cbc92c0c839c70f8ffb94eb61e2d32dc1c3cf6d95844ca099463cf37ea","affectsGlobalScope":true},{"version":"b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e","affectsGlobalScope":true},{"version":"0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a","affectsGlobalScope":true},{"version":"da233fc1c8a377ba9e0bed690a73c290d843c2c3d23a7bd7ec5cd3d7d73ba1e0","affectsGlobalScope":true},{"version":"d154ea5bb7f7f9001ed9153e876b2d5b8f5c2bb9ec02b3ae0d239ec769f1f2ae","affectsGlobalScope":true},{"version":"bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c","affectsGlobalScope":true},{"version":"c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8","affectsGlobalScope":true},{"version":"9d57b2b5d15838ed094aa9ff1299eecef40b190722eb619bac4616657a05f951","affectsGlobalScope":true},{"version":"6c51b5dd26a2c31dbf37f00cfc32b2aa6a92e19c995aefb5b97a3a64f1ac99de","affectsGlobalScope":true},{"version":"6e7997ef61de3132e4d4b2250e75343f487903ddf5370e7ce33cf1b9db9a63ed","affectsGlobalScope":true},{"version":"2ad234885a4240522efccd77de6c7d99eecf9b4de0914adb9a35c0c22433f993","affectsGlobalScope":true},{"version":"5e5e095c4470c8bab227dbbc61374878ecead104c74ab9960d3adcccfee23205","affectsGlobalScope":true},{"version":"09aa50414b80c023553090e2f53827f007a301bc34b0495bfb2c3c08ab9ad1eb","affectsGlobalScope":true},{"version":"d7f680a43f8cd12a6b6122c07c54ba40952b0c8aa140dcfcf32eb9e6cb028596","affectsGlobalScope":true},{"version":"3787b83e297de7c315d55d4a7c546ae28e5f6c0a361b7a1dcec1f1f50a54ef11","affectsGlobalScope":true},{"version":"e7e8e1d368290e9295ef18ca23f405cf40d5456fa9f20db6373a61ca45f75f40","affectsGlobalScope":true},{"version":"faf0221ae0465363c842ce6aa8a0cbda5d9296940a8e26c86e04cc4081eea21e","affectsGlobalScope":true},{"version":"06393d13ea207a1bfe08ec8d7be562549c5e2da8983f2ee074e00002629d1871","affectsGlobalScope":true},{"version":"2768ef564cfc0689a1b76106c421a2909bdff0acbe87da010785adab80efdd5c","affectsGlobalScope":true},{"version":"b248e32ca52e8f5571390a4142558ae4f203ae2f94d5bac38a3084d529ef4e58","affectsGlobalScope":true},{"version":"52d1bb7ab7a3306fd0375c8bff560feed26ed676a5b0457fa8027b563aecb9a4","affectsGlobalScope":true},"96dd7d8c35740c4b60a5d31aa9d1439456ff0b8e808716876892f387be8f9785","8c015f3fb8184e8be0f2bcec559c7b92c5b4ff553063681cc92972d177c3c89b","872e149f661232549ead687aa854068e71a19a4aa81736a9f2edf5c0eb85a850","31d27cc70c0429e339d2c47fd8b871de4e816c3e9ed352e347a8302087de0ba5","327a78827cd4e0766f385efe96bdc7b597e69e95f50d767bcdf91c2c1a12e088","0b1684a97ef593e84839b34421dae2fe5f8706c22c1f63096e3c65c2a7da0d51","c81890e27cc9d73b9ddf0bebe5ce34a5a76caf3648ec01e4be2128819429a09e","aa544e335e56cd64cc50f01857e88dbc69e6638100698e0621af8c3dd2fa705b","8a200ed2ee5606dd599b6e2eb9e20baeb3185b3ab418269ca2864ab2f25405f4","f82fca5c88d74eb7c6fb9cb2c3c9fd4a6ccfbcbc3902f382567a2369ca9bfb1b","b03859cb415663290b09f2a4b16686aa2b742dbd9b9a2ff47cd251a423d982ef","e6f3e9edf1d2c4d8e3873992b887aa29b2e713675688e2f27293fec5e0477dbb","c3c9ab892fbf6562104b0d0a0eb78401b6f9ab587e65110f7b4d1f2b35ae9251","9c37c1ff9e13b5f176fa2be5d95db101b6cb6211caf3d49cc5ea5a9c1458c36e","c45df6062be58cd03feecbbfed22f358a7467ad217ffc5021004b3f190ef8561","84de59d596077b5c3c29d835b9651ea49aabc18f4380d3ad3dffacac7f05161c","42cff4883f23d2cd79ad87928fecb543b6d09b18c5b9d05caf1da8c05b78c706","3dafe4df9af0a9324baa98d78e1f8027bd3a7fe8b0482f93fd31effe87d9e7ae","31f20a575419b1bfe8517c4e143a632f4cf3951ae99bb69724699abaaafc2d5f","42819486e5e72971376fd91085f81b87f1088057ed548febfeef72dcdd256ba4","25cd8b8acd97b5663a327ca8f6182d0097eb1a72cd80be826f0ecf6b8de6df90","db0b7ed051c15cccc1ba0281932314e2a6e7fdf4df0197b7217618be392ab559","8ad4ec63630ea6ff108f4f19cc8e75bd7ccbd48a371e6d2b5b2dd9676af8adac","30fbdefc1a4597eeefcbcf882a975c4b5e3d98332223046dc76160b06a85c938","9fb87cbacfc80e83634b3401484f86fe09e1d4ae72ff241fd1ab45fa328e337b","12d77e5b206440528857e74291e7f5cb10072a63c723d83a3aef2ee5038b4f43","b4d9cfa678c0005bab9af08066f90b2d3079176c5d087f5b19daf224cacacbdb","b08febdd03ef167cdea0a5adb091b23e8d25a6865bf063d95e4086b8b7b66316","2443cf925775612aa2ca54cfa182fa49e30e75f9f40233133f47abdd47001f2d","ba7e43a68d870315615e62684df6a28c8ceb8cff7b14b1593d165a72668e8786","33f430e509cff2dad10931611ed6f3778d0b0db7a54e31726b73b523c05eaa9f","e71a187c3d6e21c61996ffd3e003eafab0e565b10b522dc76bc8ea18662f5bd1","1bec6e2b235fc92823cf6eb0ab18a6fa60efc52ec275530e3ee0bd52e4bd96eb","d8c15d7d3cbb5653a678b4f05ef03fcc0d0f3524f3343745933425d5728c3d58","70cc21568bf3d468d3ef1e084047a4076d865956f9763e1b593ac575cde04bfc","85bacafbdcf019a928e627c29343df9fbd8308cd419c072537edcb3557f1666f","608d781bb900dfac364d7c94ed28dd12449474160b809ea2bf05ce4d3d0c7915","739a6a9135ef64c98991d3353a1ab7aa1da9e556b196f9b14bdcdfb5dc26ea82","45cff3c47fb6c024d6ee26db8478f1defc58c01f3f6722296e978102647c0b99","9ee13abb39c50c2f45b5362dbadc55334e82dfc9789cfc070808e10dc5f60000","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"f749812878fecfa53cfc13b36e5d35086fb6377983a9df44175da83ccc23af1f","affectsGlobalScope":true},"03c04ba2137908b3b6219ecadc3471d4e39bb9030e6404510ee6e87a3b590a2d",{"version":"772ff00e189d93488d1ca6f0f4dfba77bd090a99ed31e19a14bc16fad4078e48","affectsGlobalScope":true},"3d2bcfb9c4591832ec479f830c49c291419caeb19953506bdeef1c0e6ad79b03","ac0c7cb0a4c1bec60be2c0460b3bda1e674eaf2c98312d7b6f16a0bb58718e2d",{"version":"7e2181a6fc140b4525d5a45c204477c37fa78a635558e88552c68f76a4325403","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","0ea59475772c2a8fdeb1f41ad9b02025aff6423003ec7eaf8129ee846f438aee","276b547eeb8eeeee9a446a3bfa6e07d1c0199269bdcf33813abab1281394a9cb","c999f7816955f75b447823e3e4085f699600e2a4a3327907df9af65b0a9c0df6","64361245fe025cbbad90451dd3698f7e6822d465ef568cbee3a4d8ddb52e7cda","8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","9b814e0806922056145bedb096f11b73bdce70cc871f3ccfc4ce00b2cba75718",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"2013a2215691096d953ce7cefbc71a6cd31ef14be092cd003792714c5cd23bde","affectsGlobalScope":true},"60155c38ec392043962a90006153f7e31187b93411f2d8f9b35f595e98b8d75f","2ad6a251b6ef19fd1f8498f83bb7b265033bd52287e1f6569d09544f18806713","bfa08f2c30c475aef1c9451855ba6b2acfdc64f61950a38fae75806d66fb85c2","159807eb55a9439f9a675bd493788190a6203b5f36c315f8c3acbfcb875c7072","fe31b2b31ac5453fc7b8eef32b62017e55b214ceb884f0b177f442af92e84682","dd72576c8ea64d55af46a386068503d3cfcecce84ed7e1cbd4ff4081ba67fafc",{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true},"70a7e8a7880d55396285e4b85ff5bdf3af3083176abe07f944967836f2a43188","3570df7c6f3a976109f55b596a2d88c2f87e0574cd1502272594ee5c4e56d0ef","850e95721334c2aa7697b08782f443ec4286274e5024169d4443933544f359d7",{"version":"74e6cd21f7b5e29fab05060ea24e2b90aa254f16f3f62ccd7055bdb8fc7b2ff5","affectsGlobalScope":true},{"version":"5761c90b0cabdd6bd1f5fb1c3bf942088fdd39e18ed35dbe39b0c34bc733bf13","affectsGlobalScope":true},"1eb6c5569d41e6021832d0a8a71f45fecbc13d03ad7d306da485999148b64955","c05ef0ecf06540ad3039515c10d3b27f9380639ced40f4093fd073e1b5ff21d9","fd25a0d3e6448b61d33e1fe4e0667a1a87a77e53570b65a454937cf2dc92f967","c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","24a68c38b5c66d6a6883624342560d88db670e97824b397e78d9dac121aa8bae","9a134dbb29f0af914d90b23f609b39019d66ed53db7d492ab6b04c67114559da","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","7b3781fbdfddbee8dba55ccee5aa74a7c8d6701ade11d49ab7d8cb1fcefe669e","c4aab2ec3a249f2a4caa9cbdb099752a80daf999b79d85aa3504cdfd6e559476",{"version":"666d3f264db693828f6edc2eb53ae6013e40f6e39278ca209c7a8a99ac91b62f","affectsGlobalScope":true},"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","c764a6cf523d13f2304a23216cd1084e28c041eebabd8aa9b2a9d99866c668c0","1272a5c2bd05961adc473e905332b7a422b00485c10b41c752f7fcf6835e3436","30ef92bf8135ce36ba1231fe41715276f2a40be72a478ddeb862bc16672e8680",{"version":"4ace0a30a70fe5963442d75ea6e69f525671ae76f6e57ab7556c44839b4237e8","affectsGlobalScope":true},{"version":"a6f03dbf03c001fb3ac1c9bea6dde049dfff27ef8886cc4a886374aacf2e997d","affectsGlobalScope":true},"66bfb3de947abf4b117ee849c245425dbe494d6903e28f9ded566e91c9d05d77","c28d4f58131b93d60e087b86148d4e0c9d9b5c49c23ff1a9d1a9594fdedd5d08","c6b5d7f259544c91024ecf2b17138574a3f6ff2476468fafd7f957d2b68d6d98",{"version":"1ec27c4b695590464113276d174f873e260e468ef226b7dc18f9193875fa559d","affectsGlobalScope":true},"33da4ee2ab9fdd9ef8b3fc526d871ce02ae8c825283f5695e7cad507c087b97c",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"71709584ed5ed7d236dc225441ec4634ffc6c718853e04b9c27b9ea121459044","5580a1d4a8ba2e4dc3707bf9c9edb5418efb1edb266cdfe6e8697043de81a1fc","d0effc06bee61a060f05c8e2c1bc3b678f6abb599bc25cccc8c373559256b0d4","b0803819e63c0a3ad2fefdbc79cc62e05f5587a2d3371d7034e8060d4c685415","b17bcdeff24560a49c626216dec5c8ce9fcd0459a6117d0ef0a3a4046feca227","6cd9513718573425df2e650e35902aec2b263958da35e44f4bd681a08c244d89","73597ea751eeeffa5ee09d21d782f8ceaaacb7191a3595add3260149acd3a126","6cdf62786c3da291ba76403823bf5a416a229713a201c7afab6a209d6ad0ba35","9c268f69a7c2f830cfa7380fdba76d77df13b52b6eb0334c6e12e51858abfcac","85076ed6abe9b1ca270a37f808075149bd4061991cd8f100b0aa8b99dcca9931","8d1e87d3319a18ac38842dbf9cdfb323625c8587b91cd410523d6affa946f4b3","aa140c6c1aa389188d6baf736bf2f0c2bc88e7e4b208579cd1937f497a08165c","2fba9b7504d840265f66993e8ccbc34d9646a72f26af15158ae5d254e12c76b2","2b22ea4e7bf1b80a3c546c11c5141060f97b08df7777c94b28c2706d497396fa","3b9a7ba9be7f6cca490ae8ce364fff0f8917d9270ac5e27d699d15b9d81610b4","3fbb19eddd9b4133707c768ee8698a25733e950605c397139dbd2891848237e4","7aad51413f9574a67957ea3059bc1a84d492782b20c29456e25bd0f728322d80","74ce7c180ea286eca088abdf63e3892bad276b893848e9d244c8b57bcd864989","3ed62301cf931ae66d79848f6608cc1a40d1bcfc0cc31f74ff13ef39f386b952","07b3dd0d82a4d06a34a2dcbb0cf9a9955cd2ca214dd99274795a8a5ab52c2fad","041d8523e927de559e8c93bd39bbee2e87b1540b968e87558b1f255e1f11ce91","193a838b209e1d9d8b81257f688e9079f78927131e8ac640497c1357351fff44","909a05730f2a5c4540bd58554e1a02ee25e92b81c21dd455216f088438a8aa5c","5a9210a90f01a8822ddbb24aa7b3af33f128223d3c2e48e0b11cd94e84ffaa54","cf109a52bf4cfe89971090d8fe37d4141278224a93a168d9dc9bc5efb606db01","3a8f7f90b7fd61b1345397f17b6114ae3406a1c062e1dbbca5574ed4f259dcfe","5f98ebbbdf28decb75d9586e829ee3cdcf69310d2ce1fde73d852caeeb1f3340","5753e715f051496f758a741868ee01634da1610cb63396c1f7de8796a436a5c0","a04e634f8f48d8ded602650a4cfbafd654e1331dbaacc754262153eb15601b2d","e63e0c25e0e3d922a648512616edd7f0db696113555726f1af2e4ecd30cff7c0","53a808b167566ea6d4b406390789c76b206c8e5c8da0387ce4bb8271e3e4069b","897bc29b9e9f4f3d3ef191efc7a179f28de01d3d77690df4c50a25cb1a3cba74","da57d6bbe72f1ee71f3a8222666785002d0f2906b2b640ff16a82956f8299d63","f3e604694b624fa3f83f6684185452992088f5efb2cf136b62474aa106d6f1b6","ade17a851fdfda1ccd806b8a42c677b1016adcd79ac9d7d17765d0b5ede4a16f","aa83634f66ecff3d444ba981d9f3f148115176d84f736ba25bc86389b207e294","9f3c5498245c38c9016a369795ec5ef1768d09db63643c8dba9656e5ab294825","2d225e7bda2871c066a7079c88174340950fb604f624f2586d3ea27bb9e5f4ff","6a785f84e63234035e511817dd48ada756d984dd8f9344e56eb8b2bdcd8fd001","c1422d016f7df2ccd3594c06f2923199acd09898f2c42f50ea8159f1f856f618","d48084248e3fc241d87852210cabf78f2aed6ce3ea3e2bdaf070e99531c71de2","0eb6152d37c84d6119295493dfcc20c331c6fda1304a513d159cdaa599dcb78b","237df26f8c326ca00cd9d2deb40214a079749062156386b6d75bdcecc6988a6b","cd44995ee13d5d23df17a10213fed7b483fabfd5ea08f267ab52c07ce0b6b4da","58ce1486f851942bd2d3056b399079bc9cb978ec933fe9833ea417e33eab676e","7557d4d7f19f94341f4413575a3453ba7f6039c9591015bcf4282a8e75414043","a3b2cc16f3ce2d882eca44e1066f57a24751545f2a5e4a153d4de31b4cac9bb5","ac2b3b377d3068bfb6e1cb8889c99098f2c875955e2325315991882a74d92cc8","8deb39d89095469957f73bd194d11f01d9894b8c1f1e27fbf3f6e8122576b336","a38a9c41f433b608a0d37e645a31eecf7233ef3d3fffeb626988d3219f80e32f","8e1428dcba6a984489863935049893631170a37f9584c0479f06e1a5b1f04332","1fce9ecb87a2d3898941c60df617e52e50fb0c03c9b7b2ba8381972448327285","5ef0597b8238443908b2c4bf69149ed3894ac0ddd0515ac583d38c7595b151f1","ac52b775a80badff5f4ac329c5725a26bd5aaadd57afa7ad9e98b4844767312a","6ae5b4a63010c82bf2522b4ecfc29ffe6a8b0c5eea6b2b35120077e9ac54d7a1","dd7109c49f416f218915921d44f0f28975df78e04e437c62e1e1eb3be5e18a35","eee181112e420b345fc78422a6cc32385ede3d27e2eaf8b8c4ad8b2c29e3e52e","25fbe57c8ee3079e2201fe580578fab4f3a78881c98865b7c96233af00bf9624","62cc8477858487b4c4de7d7ae5e745a8ce0015c1592f398b63ee05d6e64ca295","cc2a9ec3cb10e4c0b8738b02c31798fad312d21ef20b6a2f5be1d077e9f5409d","4b4fadcda7d34034737598c07e2dca5d7e1e633cb3ba8dd4d2e6a7782b30b296","360fdc8829a51c5428636f1f83e7db36fef6c5a15ed4411b582d00a1c2bd6e97","1cf0d15e6ab1ecabbf329b906ae8543e6b8955133b7f6655f04d433e3a0597ab","7c9f98fe812643141502b30fb2b5ec56d16aaf94f98580276ae37b7924dd44a4","b3547893f24f59d0a644c52f55901b15a3fa1a115bc5ea9a582911469b9348b7","596e5b88b6ca8399076afcc22af6e6e0c4700c7cd1f420a78d637c3fb44a885e","adddf736e08132c7059ee572b128fdacb1c2650ace80d0f582e93d097ed4fbaf","d4cad9dc13e9c5348637170ddd5d95f7ed5fdfc856ddca40234fa55518bc99a6","d70675ba7ba7d02e52b7070a369957a70827e4b2bca2c1680c38a832e87b61fd","3be71f4ce8988a01e2f5368bdd58e1d60236baf511e4510ee9291c7b3729a27e","423d2ccc38e369a7527988d682fafc40267bcd6688a7473e59c5eea20a29b64f","2f9fde0868ed030277c678b435f63fcf03d27c04301299580a4017963cc04ce6","6b6ed4aa017eb6867cef27257379cfe3e16caf628aceae3f0163dbafcaf891ff","25f1159094dc0bf3a71313a74e0885426af21c5d6564a254004f2cadf9c5b052","cde493e09daad4bb29922fe633f760be9f0e8e2f39cdca999cce3b8690b5e13a","3d7f9eb12aface876f7b535cc89dcd416daf77f0b3573333f16ec0a70bcf902a","b83139ae818dd20f365118f9999335ca4cd84ae518348619adc5728e7e0372d5","c3d608cc3e97d22d1d9589262865d5d786c3ee7b0a2ae9716be08634b79b9a8c","62d26d8ba4fa15ab425c1b57a050ed76c5b0ecbffaa53f182110aa3a02405a07","87a4f46dabe0e415e3d38633e4b2295e9a2673ae841886c90a1ff3e66defb367","1a81526753a454468403c6473b7504c297bd4ee9aa8557f4ebf4092db7712fde","cb771b725fbb72b6abaa649849def3a26f1cdb6f7fd2f86f929d789b154592a5","3c552fca3da55cca6a47644e45e1063bad60e2b16bfaaffb9df82d86afe48261","a15abe49689542786b57db939144b9da2371623c053236bcfe42728f1444c962","3db9223ef1d787b47e08965bdb58c96d330454d9a2a006a3581b434610516d73","b932b100fe0e174ccfd31a63665a67c2ec4ef58cc474637488f0de1680d80941","bb263234068fd7a6168e08f8383adbcc6191fbb89b6823ef5433c6ac766fafa5","b967935627efcdef714f0a07ecedce1641aa4b3a5f57a7b1fe2b7d7afc033c27","8331de9bd5104cf8f6c816c3410950b80cc304b9a24cbe95a8fd811d85c5c046","de73ba1b9157967c7b091a3173db0c0135666e7015d59accf3b2b09a879fea4c","f74e9826587bf4b600656739e68b3d41f51de49b0c28b5933cc8aacbb9243c0e","3f4ea47b7438f0469e74fc5e197801ef0c1da053655167da6b08874acbdc1aea","896f5af4415fe6086799a9f2dcf94eea4bee64e1aba45d3a774196f3eb77dcf5","ff07522afdf5cafac6076861e429ca96c7833c593bcac68b67ae653d3ee51f9b","2c5d8017ec8cb7f5afdf89051b2e822ea425cebfff78a5fe864e62ec48b43d9f","e80bc754edc842893c8762f8d8d74399f9aad317529914a5a561a23dfc49f1ca","a1e4cc074fe4c84876860a8b41a118a47914a31e7feaf29a0cb51387e6cd83aa","0cf150b527bfe9951d5c9942379c1cb40a8aa2b3154e13c4732b26086ec80c0b","440aeab534d0c24fc156f302720585d08795647e6cae0bb7172e0110db8d44b7","5f7fa240fcb0f9bd7af2c2c3e8c4113160efc0ff1e6e00bd8250630a3341847b","545fe6fdfe04ca9b82bdb659dc24e1de4a60456ed802b635ba103a6e53f1ab19","9e755713010e97c315200b9f97c3b4f6faa7e2d8f573601f4b56e9ce462c9340","a2472b2bf9278b244c6dc27e3b91ae22d8f45e22b2371ebe9a4589f0e9c525b9","51a72e9118c898b3d8e2a5db9616bfd8fb0492b30e2c721b8309dc2fecac5049","8961c78b9c29411581a13424749a94a8c5f499086a929dfcf2eaf2a28bd0e1e7","0c238ffad8ac6f4be1be79c909937a723516e5a38cc15377f0511cd48566e3e5","0e658283180165f495b0967bdba03bd1c08daa63677216069adcde752bc4acb2","9a8f42036a42120c39a5d384abe92bd47e187b3a50ed134ad23d12b479af2697","97faf2f5042e998abfd4ae4b65b6e9807ebfb4b3484afeeef2a688ade549ae30","0d53e597adb0c3d1d2db4b5e5324150a509c6b31bfa87be53fba9b0b45ae6a6b","7f70b7f311e3ffeef82c2c7f63b1ae875c139443a91dbf0f9abb236ff331a1aa","36ffedc870284ea24bed3ca6acc45af3965e30fbfb89cdf4908b3b1c0779e48f","492e5e13415337aaf994ff986448e2e91e0c291033ad7d954cbd515a59ef18d1","6f89c63bb9fdd5c03b25a96c5b5fbcae57eb1ca8160e9ee1677059c2b7b7e5f7","fa3d0cd03fa17459d9ddd98b120b4bb084da39f0391cbdce480a6ef74be0cc7a","e3fd84e6470b7e0679c4073ee5ce971d324182486dde5a49b67cae29168b51d2","dd8331d0a5190a4735ce6c152e420230188c4966067a756673c36dd7ba72b10e","d6db3bf60a324f74ed9c1281acc1543734be70ac0ab9a8dc953a1d55f6906720",{"version":"34707bf55a38f69fdaaaaed74907c81a6b186fcb206cc50e6f8862b36c08730e","affectsGlobalScope":true},"0f882d4ae58f431454030289154feb0132e1b00ca5c3197c6b749bd098aed73a","7ff7f4632a6e7b6872fb1843f3c0df495b49840eae2a23c6fbc943f863da8c29","1e352dc6863536f881c894f17c46b5040db7c9423a18957a8fbc001dfe579b78","a78590b0efcef281236e3234520c348d63be1d4561b63b20e6c3b6fc18b37dfb","4d59c6a10b6c79a0927c79efa89b3c9f71d174ec14ec2792076cfd2330d0cf8e","a496f51933422872de22729b7a0233589325a1a1707cccd05cd914098944a202","75b6663bc569724017997481b6b3774065c204b316cb4f5ad7df3b5162d2dce1","06a38095ad4368314366bc08f7cbc0fe274ef7321ec611005d0bdd9c6565e4d5","4599793db9aed9b84677f0ca1cf7ef3c69bb91cda4fe4329cbab778ca4d80a58","ad0028f96921778931fb8419d8de33b10908314fa99699de1702020f69235da1","ccd2a35321c0786bd3808042dc43b960cac13f2cc660ac37a0087e12bc97d2fc","df524ed01de4f19efb44bded628dbba9f840148be4b6cfe096e29d4b01589de3","2e3981b9cee48174ff85ae15019fd72933f7023a4ed05094740f7e6f7775623c","836ebdc3b9e4c006acc4f405b7e558e56d47830e05c40d991b1e27fe8bc91157","2cc6b617c6120ba64b5778ccd4b74c951adc3a3941bb6b39f47d48701c44af39","eca02b99615a8f1652e21399d832618e38bf166c0747c9247349bc901a2f7741","7f7d6d42e5780e86f5b860a6f95179fae06a368b3af28c1c4230397c47021a59","4740a7d11ab3b381be0f269f1903fb3ff226a2fba55a01756b2997e67cd853f2","863dbc4e77f0353e6f9d6bc0e2b4622d5c07ff6f099ff66cafd7924b2ff4dd3f","bf034a18ed7e2a058f9e48c4c2480a124138fbd3586a80c77736a9ec079d12a8","f88758992a0bf13d095520aacd4381fb456ff121fb9aa184e6eb0eecb26cfadc","c249e9ae33bfcad97deec3c73c9ed2656e112fbdf22deace0b39724be6a5dcf0","d8b45924965c0c4fc0b946c0b6d597aa8d5de9cdf5c727e3d39422d17efec438","c6f72b9a53b7819f056268c221d7eeb14c26e2582aa1547b0f6922d65bcfde72","feddabf6ab0eb191e721f0126f3db8688db97c77a1234968bde7a2d70c4ae513","a968efe0db090c2ed75ee8c77162534f7ffde3dfa9d9ee9f79c47784c43df96e","cde0568b836865a24f4ee5859462004a326dfb76d514e6f56c8e78feedebed58","7f5cb3a03588ed46d52a6c2138315d930cd6ffb5c2134247cd07bc23cbea0b5a","7797f4c91491dcb0f21fa318fd8a1014990d5a72f8a32de2af06eb4d4476a3b5","f39fb20b83c3f9853c13d4ac95533760979d3023c0a5affe2c0a62d91ab3afd8","e4fca08aed8afb32bb8643d7469810bc8681115fe398e56a028df9e73b2d867f","8a59503e8c995d688174ab27cd32c3ab6afed7c41cb5282aee1e964f7d7b863d","078966067552650f44ca96c68eddbb8539f30ee48a9ab3f24abdcf0a4037b535","2cd6250c43dba360377481c98d48db6ab1532a7527339edb0deffddc28ba66b1","7a9d600990fbe263a23daebed9ba1bbc5761e45679a7e2b2774a42756ef077a2","66bc155515fbea8c31a4efccbbac44de7c037b01f3aa00b76312cf7252725d30","5703288ddbfc4f7845cdbf80c6af17c8cde2a228757479796c2378b1662fcd48","0dfd353f0c16dd5107a7e0713dc52d0a2538293b0a0eac6000a017f9c0a60b56","9cd683a4663ef4d9c6486f1b8a34c73bdbc344d69490931bfe2fbcada12ab35b","42f6a409bad5259ece69df25d2b8ace2ff2ade45fe6386ee45203bdd9329f971","d3b1a8b87a5e77d70056325e137a0e04d984b991546fdd3c1034ff4102d603c4","2eb162efd6dba5972b9f8f85141d900d09da4fba23864f287f98f9890a05e95f","3f878fb5be9ebe8bd0ac5c22515d42b8b72d3745ef7617e73e9b2548ccbdf54b","e9ed562b7599c8c8c01595891480a30f9945a93a46456d22ee67ebf346b7538a","e7bf975a98cecefe2e8902fb7da9314675ecdce553aea722aaec97327668e18b","3d36f93648518338c875d9f77a8eab52905365483dbb3afe43ed68f1b712b67c","4fa54df9184d291bd78b36f5063372042cd995460e906cb14014e40d1442a326","b4e32bd5e3b493e4ea6b5ec69a4c02aa1fdaa78e1df9a863bb07604de8f9d123","f6bd1aa152ca2b5064e06282ee3137842ae6825b6b09aa89a2ff063b976a56f3","bce2390bb3a76f8bf2ba4397c66db5277bf3e698ee614347e5eb79d7fc0942c6","fbdc8d7cc7daf4101bf567512c67fb990d8fe300e0ba7f213171192177f44aa0","298e0da6d858e39fc0c1eebfa4f5c8af487868c6f2e98c3ef800537d402fb5c3","3b6457fb3866562d279377f923cf3758c80ed7bfcc19414b72a24d0a98188e0c","4fb5d7efb3520b92c1b767ce18968057c5e70886d7fb3416c487231df9275af9","df2303a61eb57b2717d17123e82bc0f3fd60f6e4673cb5506192dfe23c9480bf","b104960f4c5f807535ab43282356b2fe29c5d14a02035c623ac2012be3d5f76c","a35ca245eb852b70b20300546443abb1fcbac6e5066e4baaa092af4ea614d9b5","55da140feab55f10a538a9879a97c4be3df4934cbd679665c91a7263a86095e1","1a39e51e3362aec7d4edec9b317ff83916fe0471f86ddf2d3ef3af5952e87d9e","4b3f36b96f129a8e125c91d41a05f711e73b3285f80bceb3a1aecb13c97c4502","852779920fc4220bc42ec6d3c9b6164e23ea9371a788531b48b4005fe0cb4392","6863aa26d38fb3c96d7b04547d677967d83ebe421a093e4dede6fd48ad23890d","515b97cede17d91c9669cc1c7fb7a8a5f0a5f2d8999f925a5f70b4ebea93723e","08e8e57241f874bdbf69ab2b65cb0ee18b4183d5c9452937da49b934fc679c4b","944af466f063d4bd090ab9d988c620b90a014e919d5f78963f6074a136ea225e","644addd4811636da491c9546654bc005ba8599f23df6d731d91eba86f3137fc2","a9249493114b181814728cbfeb7234738193a4169b654ec4705d48d7a4d25222","aad6f20d6eb01192ae02294361faa6e1f320d72447b56f433db853bbe80b15ca","876fbedec2f494eb6f834ce8636b07d581c657d205d81a3ba894eff0facc6b84","58527aa45f11c9b259a6a9d78b397f35020bfbb104f4d3bb177039b5c18146bd","91b8b61d45b5d22f3458a4ac82e03b464a0926bab795a920fe0eca805ec476eb","2744532f8fb960eb78497ac660db719f503a10c801f87131d26fd9cbef75dcef","6884287c54891ac19cfbe056f3ed29cab1732a00dec69bd3b140ce62c11783c6","223fdd3984d951378c7febea213b287ee04ee013f065a27905c3d75df85144c4","cb46657d3237f80742d5701ebcced8f6e5cf8938442354387d6c77d7048dfae6","3965c8ef8150ca688978430a13db460d29a50afc50c97315c723722b6f763369","661f322e45545a554e4ffc38db6c4068a66e1323baf66acb0d8a9fa28195a669","9d787416f04d0867e8a46c317056f6ad365e328074c73fa3a1612285fa24465d","ce978e20a6f26f606b535f0d6deb384ae6a73f8d0bd0dfca0925f5317cad1f25","f2d3567210ca4d559d8297d6c4402599c93e3bc7485054192d38db5e132fbc0a","50d22a2dfdbf2dda7b333edf980566feb3f61813695c8f3b52fc866c8d969404","bdb95f4b6e845ec1c0ae95eb448c55a68a2752473e1d2107348abe40421cc202","ea546a7ed9eaa71ba78d4d392509dadea4bafed283269dd6c4b09e7d8824e986","4ec0f2a141a9ae7d3557b8efe630ac2021bc3a9ac61238b59293f4cf2f196e82","b2db743c71652e03c52d51445af58d0af3316231faa92b66018b29c7ba975f6c","0863a5876c85fbaffbb8ec8aeda8b5042deb6932616139706d2b82cde9d3f7c7","12f8b72e3c3a333814f4fa87d5b9a7ef1ece703f3b7ec7919ad2ffb58c48c1db","ba9c46725e2a0bd9df59d3a1e801cc60f90db3ef7817131c53945dce2b8c0c56","281d373eeabf80c4851f8de991e6abe4d385c30379d80897bbc3df3dcac99cee","624c5dce95672d9dcca40d9d9d82ef855f5f902292f43aa265cc8fd963c6ce84","8a48d9c6184992d1c3ed5daa55f83d708c37582916926a5555a900608f804b60","605dd288c636cf9b5317fe76dec75d3c7fb855fdcd3ee8cb4fea7d7091ca6fb4","95addea67857d4e568a02e429b15458cec203876b2ea5f5ea18ccfeeb91b8ce0","b5a615b0ad865ffa562980a10bda162ac1744fd363b4edc2cfc664222071cbcf","bbccd721363897950a55ce09529503f25a69522e5c91a22679b66e941e5f8654","d3a1e70795c38d7851b6e4f3b441c5ffdae171d6e2576a2204b7d79059aeea66","d7b8d41887c5fccfe19802c4336d34348b752abf0d98839575699d71deff60be","063fe3004728b8516a4d799ee16f9a71801ba24e0443dd98638cef1bd4353a7c","0267341e780d4967cbd069ea57db7aa4e1fdfe74702ab0366a7a4c1da0ca332b","ec5a0291f1bcbd2662640e7a6ae0a632ce8f0fd55c02236bb43203f38436ca36","7ffd42ac60bedb9b97e7c35b48af9f71b0a2289f3324f414826eeaea937d144b","b20bc124abd8ee572d0d756713ff987b116cdae908a6fcbc40e80d4b999f56b4","a599f3f450ad62c3fdc0c3fd25cddcc9332ffb44327087947d48914a8da81364","645dff895168aa82350c9aa60aa0b3621b84289fef043be842f45a9c6c0ac6e2","f068ff5b7fb3bdc5380e0c677e21de829bd25cdac63a9b083fdc220fcb225280","09d2fdca6ea6c135897a26976ad3c0db724adaf23ef4e38ad852b1d8efef1ae6","15de5b7739bf7e40213a200853bf78455ee5958af08eda786605a54a7f25ade6","aa31b69fc0094a66e771e189d387ffed138b53b211903f96ca3737792f69abdf","37862e711637ebd927907a82cbf0143ea30e95eb165df554926c43936b1d77a9","89e253db2c2cc9a510c521f14dd2b1aae4de2556ee5159ad8d118d3587e3a880","3d0a172cee184a0f4111a7bd7fbb8729af3f54b30c06a2677d85c20ea9c811ab","d6a07e5e8dee6dc63c7ecd9c21756babf097e1537fbc91ddfec17328a063f65d","6fdc88b1287c276b55b7f7c4c7b49587813c763eea9751ce0baf0a7e61cd5d89","6a02443704052768bd021f24783aa104b02ae4444e9b735317bf13c6b857a11e","37987b0fe9800cf25473c882ce07bccdab2763c5681c1a2d16816aead46aa8d1","c84c03c721154068e1a60d83e9e85819bd3ef70b824ac2edc498aa31c06e5781","f4e5b4def2ccccfe43c0905074695c349230505faf6ae74a28b0c1090acfda7d","c96fb6a0c1e879f95634ab0ff439cbb6fff6227b26bbf0153bef9ed0aabba60d","db936079fe6396aad9bf7ad0479ffc9220cec808a26a745baebb5f9e2ef9dbc7","06bc0b9cc7bf0b92534f1517fe5adde1f23f60cc6cc5c59f8e1c65db48a40067","919a753b0cbb12ccc606c62e2d34884d75a48ba19b1dda497c72621b11dac088","2c27e33ee0bf722988da00abd582cc9b806ce3fd9153a864800a339ad13f3fcf","92d7b3a5aa5dc872e54cbad2a7094b3ea4f72c7901de1d07b4c334ff658297f0","7a52922b38e9686d5bdc6e75774929eec6688d26c1dfe4a03ddec77ede468e87","aa5efca2833d89b55248f1889a6433dab1b1f41768e9a75f8ce35f9bf56c5ec4","f3cb934699bea498259de69c44a4f93b461f079d72cddb041587afd9312efb6e","006855ddea8674d084173a768f88519dc154be94eba5e2120262a33709832b9b","17dd843a266f99ca4b3a1257538bd1cc69dc5c7f2f23c3891f0430615b8c9c1c","5430364886c721a30475253356162b6c27871718094cb3e69e2bcea71a17e533","1218398da7c8dc4add10bdb3aa2856aad54b123d847eaf574d1d694ac269bfb5","07886b8104556bcc9314b90cd2043f2286e54c1f6ba2ebbc953e1e43232e12be","b637cd92688a6cdf4f8f184ff529dc2bc7f15692828e2c0c66a60e6972f400c7","7061e83d6792897077bcac039fccf7325234004769f591c63a8cf8478bf551bb","51a74c09c3d3fc62fcfefed0a193c3d6388e3e0f8a574bb9d5c5b7cdaa32453a","277a358d61376fce7ac3392402909c96cf6a0a613146549fc0165ccff953e012","50614c808e099a1d4413786f3783d9eeaaa74b267f2c87fcf8a893287e91c301","f4cb6530f248e87cefa74ef623206fec805f6252f885f8e14ef3d1a5872cef2d","38c332caadd8391566552395d592076470a5e7423f70964620eabf05c02907cd","eb17b5bf1fc763a644c21d76572c0e41e351c3f6dfcde649428d5d829f7294d2","cb124162c87b29ff5121e3ee5bb29c782f101e0135d6c2644ab1b31d530a435e","406d6f5d3707c488362fb40d1c1f8a7b0a42b70554b427160185d93e430228f5","2e9776410c5bc290d9432a9215c67398a273e514a79b9e15f32ecddfde8a03be","313ff8df074b81d3e4f088ff3a3a06df3d9b0d0c7f55469ccc2ac887ecb6b867","c718475bca06806cc243e77777641cb67ba68f2c57321a4773ebb47760a3bcf2","96e6bf811343caab5112b68880905c5d20d9257054afac6c18e718a4c549ed27","a2793bc73ba63ca7d259cb0f0b61d0023820170d08a1f9715006c8042d060165","d5011b38165771fdf75a9a06d6d379a1fc7edd7eb695ebdc52319fb6e3c6d81f","88417fb19d339304e9616a38ea513251047c9e300c81f9467fc317df8a582e71","3e8e2d132f726dddbda57819f5391504e585cb3beab6b32203064e7e40618583","6e23627cd3f10418b5b2db102fdcf557b75f2837f266d88afac6b18f333bb1bc","866046dcea88f23d766a65487ee7870c4cf8285a4c75407c80a5c26ed250ef8d","019f4f1cbc781cc15c6173f8be5ef907405722194ab297127b3c3426e5368339","41f4413eac08210dfc1b1cdb5891ad08b05c79f5038bdf8c06e4aedaa85b943d","c79f1c8b51d8475dde8d2973f740f43ca34b1f0a95d93649cd76c1ee20abba19","35f0d2bd2c5c05c0cb19095bf5b7c44365b1c88efe6285370855b90417277a64","8264b129f4c4eb4799703f8e5ee2223a184d1cdbfc782158b1f40a88a4435a1f","527ddda6f8be1279f3294714534c49d6e90f238cea325519882ebf88d7ec5bd2","b23877792e8bd00271d0ec5d401b68e4228540a4316de3d9dfb697b955c161a4","35b2eb1de01633db90d41abe93730b29984856fcc840b4c2801bfd3761a2097b","95f0c9127b879c2fc7e31f8e09ff45bb4aae302e60f4b9ceaf4d9ee6bc51ec66","2a6b4655a6edce9e07c7d826848f72533c9991d40bc36e3f85558ad20e87ce2d","6e3d29fdc96ebbb2ac672d2dae710c689c1ea0d0e9469e0847616f3c38fd085f","d505055b8fadd42da235c85947911d8d198ad70c5f5775991e7821d4f89c90f5","8b5a5852099dca7d7e7a7cef6d681dc1586aafacdb963ca180fe5cabbfa3a24b","0d1aa3341d1ad2064adada71c5d01a2f572e4aac09410e5616d90894105a0eb9","52494ca5a884da3bf11b8165ab31429715f0970d9c6383240c5666f4bd713e01","162fafa2291749df2ab4516854aa781fcee1d9fca2ecd85fb48ae794c0700ce2","b4b9b51ee6f6309cda2e539245235a8caeca2b1d6bf12b5e5c162d17333c450f","d2ffe8356f060b88c1c5cf1fa874a4b779fb87fd1977084876e8be9eab6bf485","c76053984b39150d00ade365b096a8bc21a4a7f2ee9e0a926711b00f8e7bf701","956b510767e3d6f362ea5800510635197723737af5d19ae07ee987ea4a90bfa5","cd1a8ff61f5063d7e6e2094e25d35c90b499961b63911f2f4ae0ff5555c2b4d7","1cf09b5945779e9bc75c4dcd805fb149c28fc90da3335186ef620647a3c540e1","9cdc0b9a313090ec45b34ea1eb02fbace433f509e753634b043e9b83038261e6","c93474cff0088351a65d3cad24037874a26a5371a48528563e56efe31cb3d8bb","b4580df8ea7f62d7b06588001952bf69426e6b03cf3d2569f5f608e45f29ba08","de27f7bb9be9d8a2b4557ec6503b8a315f74d598ce9a0ab81b5ed5610e1a8e81","fe3c378dcefa7ed8b21bd6822f5d7838b1119836da75ae1e1fb485d27b8ffb62","7365bf3333d4277b6fe374ed055624e5ec080dbb919e2d78f1cb75a3f1a4b4f6","a5fbf3bc5c16ab5c84465ba7a043a4bee4c2b20bd3633d50d80118a3844edbaf","0923e4ac8c894ad507bd2daee0df66b699de88467201381ece011ba5a080e1ff","e4f6626f827ea509255647e1b6db82145a2eb1a6b46202655e7d9bb19145c33b","26e23972c40f378f0301d8d7025ea895557c2865a1a31c8ea9c3fff0dbc27075","818469e2f1c49f6cf6f220a81df013daf6e4dc4af7f9c0890ca63ce06d7d7299","26e8bcdc1ee444d9d7f9af007e956fd0c2011302670fdfd2c08aa63d71dffa05","9a4e44028bdad7131c8bc4d2dd6b11c96c73720984ef0fa5862770ac924f698e","73b70caa5e573babbd422dadbdd9fffe7d0561fa5dde7390f7eacba7928353c1","2acb15ad887e646d3f2e124a113aae2dbd9b4e8613577fd6342a7ddcded72586","3d862d4a5666b98df230fc886f09ac21d840a858cb2a7ea75dfa7ec0522d242a","6c5e3ab92fe672d2b0e2344a775270852e6572497b0ed92ba86d79133662d7e7","be5fdd78c5818f3a1f91c5ba49505c30289b3a343dd527fcd322e7294f82b570","25bc80fdce8d0c51cc70575e64f0cd4bbc07c29574dfd850eb0e7058e71f9412","323974a3499d92ba680a148ca92581725e6c9b9ad05426bcfdfeb253a0adb1b0","3cc4f399212b85dca0c166ab18b3e0885288e9b9da8cce00de221d4cadf18b22","260e66327b06d86eb77c1c52197aadc42e209044ccdf19c863302926f15c8b66","0d5f2f526a48952639da8e5d8cfaaa36ccbbe20cd97ae2f430cf67869a98b508","b582de0d5211b094b4faccc7994cbebd056d583a86f4388e311b4c3f5c9a57e4","a4af2de09e21ab4f9ca9458e542d394dca9c9e686d0acc017bc4491d18deb772","1274ebf1c348d8e12d554e5258f05216a9c3f4d85204ffdd520f51e4a56b5e9c","e8cbabb226fdf636af1a1f0140bf400a9d3a2e5f2126ed505f2e3f8986b3b2cc","80435054a4a72f618ef7ee1a668a2f2c4da712fe3f20d832c1bd5c1f6acf53af","11b364fcf5eba1a4ed92c14e4003a29494e0ba4d55a38473f814caaa14a21b43","e71202e1d8bcab6956fd128491486d3c9c4f95c58db2866893a466936e31e7fb","0e55be2971162e3d0f33ea83ab96ebee30a35721cf65eeb16bf9a06b8571cd45","7f8729b3fbc68075334bcafd1452d312986353432f849722d43581ddaf8b14b6","4c0f2095ec85a8fe9ebd082eb3e325ac14ee8accac78e0724ba890d3d02c2fb9","9ea560b1581b82cbcc5d6b4b621f5ada0434a9632b803fd19be85b407ab7d9aa","c1be2db530e1b24787e68070db08b66cd37d891a0402bee37be47fc24507dbb6","4dff787c8641b954abb6e7776c9dbc0bb22366d1f90f6e971dff847ab0479138","e1efc6e6f6d3ce363341a12ab46952b0ec4360878b500aae5ad16cd502ee78f7","fe3d0dc9bceadd3a4a3f9a49dbeba73b514278b4a77344246002725fd8567e35","e7098ac93067e40b98755ef2e35600e71913abc664d23bb0697720d0d95b0cd6","f6386b7e85b62f9b50956c51a159a0c3dd69198499e721cbfd878fb9f10f84ea","6733ae88d1a77972531eed2e88411b276dc684cb7a47c70a8e73e4eb39859c31","d8b640b08f9cd0461f2cac988ad0daedb4fc04cbc9aed2453a94c4755688bf1a","b4150a5abf6127a391c7c6255bb594d099c7e930aca49651603eeeef99d58adf","dff74648f275fcf2376638677b7bda57475e88dfd53d0ac711e72b5ae85b7dbb","77b43f667dbfd9b7501a1ba845365cc2f230e5d0522343d63cd6adbdaaf40713","98ab2bc7ff8c63f5b75a9d5d88206aaf78ccfc86afa083a4302b570555872578",{"version":"bbdf156fea2fabed31a569445835aeedcc33643d404fcbaa54541f06c109df3f","affectsGlobalScope":true},"4c68749a564a6facdf675416d75789ee5a557afda8960e0803cf6711fa569288","6a386ff939f180ae8ef064699d8b7b6e62bc2731a62d7fbf5e02589383838dea","f5a8b384f182b3851cec3596ccc96cb7464f8d3469f48c74bf2befb782a19de5",{"version":"ef8a481f9f2205fcc287eef2b4e461d2fc16bc8a0e49a844681f2f742d69747e","affectsGlobalScope":true},{"version":"b23b805c53e117db52997390a764de47b1cb9818f30e9d3db7b07355884d8020","signature":"742ae8d94da4ca2eca431d10d30cc2306e1efc0323a071c8b8ac535581ab1389"},{"version":"8025c4b8c5d721421177ac56419d39394432889937914a5ab158a20f3f6f28f5","signature":"6901479dfa7356ba0b2dda1a12a8e0087bfd289cfa3bebe57a076794f0bf7db8"},{"version":"548e72b5d47fdae5308e67002f65e2ed8aa405b1a6e7aebee024c6267a51f312","signature":"b1e10333665e91484e064a4a2284d607b03a3346ce5ccd0202d954bd129c4cf4"},{"version":"5b9156330e60f94dce65641f29048f51d4abb597b79b0228f7be6c9a838656b3","signature":"a1351756ae8ded14746c8b4dd2b85a4b865b0d599b96e394ec68b38d324a52ed"},{"version":"1807c089826349aebd31514da009d0d940109225fc6276db4314c6fc0771c24e","signature":"46c76e9a01fd041a5f3316889939284ad8875e94e3219b9bc75fba0c471443f6"},{"version":"bc9fe2a6615ca8ee0871fd5c192e027b4c22968b58c34cc37682626e775b9737","signature":"0088b3227452b76a5c46ec899715e6be615cac84b7149e839f59875f0672f4bc"},{"version":"7fc7a5e8a00a759896c3a981bef51a721e54daa6e97396ec6a602877515f5abb","signature":"47ba9b1dd6f06248dee228a6700523f53224f9acf675c4b6adf01262be377939"},{"version":"ba1d3521c26f1d35ffc108cd888362a1ad2f0dd0f992d55a9f31ec7a169eb80a","signature":"48b8472ba07168bfe4644abb9c09490170d1eed5cef7b2d8a49e4b0a2537f1b2"},{"version":"0178eb9e68d00e473f8c95ac6864bb5696cfc8e7d5a3b1e4bfa98d882f9db660","signature":"5a530a0b37ac88582c108d9e278868fe087454968e7cec3dc1e3c1e76f97fa78"},{"version":"832a0a430bd3e48cb2bf5339f45e4e04504fe5509180bd7909ac94d311b03b21","signature":"1faf70174771b0d0cabd91bb32bda6f75e97d1a17466822d79717a184efbf246"},{"version":"0a7efaea8c9950f51f8edf63461ecff8faa5ac2439b263ee3a5d98f22966016b","signature":"7f81e4c3dc410ab7bb82569e427c2eb4272d2f9c99f12363894de4d5339953b6"},{"version":"43b7d9ea83657be2450276b06213db6e5d463717a807770c0a4a7b993bc24325","signature":"29fcfc078cc217e65f8bac67f1f1efa9a34e9688f660c0e403770136b7391384"},{"version":"ad74396a9a9e3173b222331d924f5b5c818f55530f3a1fa377fd25511a708fb7","signature":"cb8b15fe251e274543eda5fcae3c46f9505c53cd5d94d58fdbef23883ea7c4c1"},{"version":"fa6cd36bf3eb7a2acc9710ed2c9520c3f55518ca04dfe4a11f2726783e9b4783","signature":"ff286eb7fb7c24d887a1bc1137ed27b01a50376d2f29e9cc45102c96eb3e6116"},{"version":"82d613bb356f13249a402e40cd27e28bb2e4d4d8fbd32f7ab45bccffbb414c62","signature":"5c42af92e1e1c879f812fab5b8c2e6bd65051b7d350927c2d09034cd52bcf1ba"},{"version":"fda45b770454968c640c5d8cf9a056533fbbe18fd69b61b0fdb5fafd17f0e3b1","signature":"052209e22173e3127d8d0f448782d82f20d0be603dd6fe289afdae383c9364e5"},{"version":"80ed54b5bcbcad245dd6b5618525b9d51f5e6e0e6f2574313bc7906e3fe2b747","signature":"1c82edeabfb6c5bb47333e308001786e87b03f9d279be571a0417e561a757a06"},{"version":"67020fe59243728b17e5568df770ad65fa8aaf21e5dc10bbcc5b534d94c7c2a5","signature":"bb043c0cb3e385c27c8dad2410592d23ca01847ed627cfe8b64b5cd97c598f6d"}],"options":{"declaration":true,"esModuleInterop":true,"jsx":2,"module":1,"noImplicitAny":false,"outDir":"./","skipLibCheck":true,"strict":true,"target":1},"fileIdsList":[[55,60,131,138,149,164],[55,131,149,164,165,167],[60,131,164,165],[55,131,149,164,165,166],[131,147,153],[131],[131,165,172],[131,218],[131,164,165,166,167,168,169,170,173,219],[46,56,57,58,59,131],[57,131],[56,131],[56,57,131],[46,55,131],[60,64,131],[67,131],[70,131],[60,61,131],[61,62,63,131],[60,131],[84,131,150,151,152],[55,131,149,150,151],[55,131,149],[60,64,131,145],[131,145,146],[60,131,138,139,140,141],[55,60,131,139,140],[60,131,141,143],[55,60,131,141],[131,139,140,141,142,143,144,148],[55,60,131,138,139,140,141],[131,139,141,143,147],[55,60,131],[47,48,54,131],[49,50,51,52,53,131],[49,50,51,131],[49,131],[76,77,131],[55,131],[75,78,79,80,81,82,131],[131,231,232],[60,64,131,147,220],[55,60,64,131,149,220,231],[131,156,249,250,251,441,444,447,448,451,455],[131,441],[131,452,453,454],[131,250],[131,442],[131,240,241,242,243,244,245,246,247,442,443,446],[131,246],[131,154,223,239,240],[131,154,223],[131,242,243],[131,242],[131,249,445],[131,240,242,249,251,441,443,444],[131,249,440],[131,444],[131,250,251,441,447,449],[131,248,449],[131,156,239,248,251,441,447,448],[85,131],[88,131],[89,94,122,131],[90,101,102,109,119,130,131],[90,91,101,109,131],[92,131],[93,94,102,110,131],[94,119,127,131],[95,97,101,109,131],[96,131],[97,98,131],[101,131],[99,101,131],[101,102,103,119,130,131],[101,102,103,116,119,122,131],[131,135],[97,101,104,109,119,130,131],[101,102,104,105,109,119,127,130,131],[104,106,119,127,130,131],[85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137],[101,107,131],[108,130,131],[97,101,109,119,131],[110,131],[111,131],[88,112,131],[113,129,131,135],[114,131],[115,131],[101,116,117,131],[116,118,131,133],[89,101,119,120,121,122,131],[89,119,121,131],[119,120,131],[122,131],[123,131],[119,131],[101,125,126,131],[125,126,131],[94,109,119,127,131],[128,131],[109,129,131],[89,104,115,130,131],[94,131],[119,131,132],[131,133],[131,134],[89,94,101,103,112,119,130,131,133,135],[119,131,136],[131,476,477,478,479],[131,177,178,182,209,210,212,213,214,216,217],[131,175,176],[131,175],[131,177,217],[131,177,178,214,215,217],[131,217],[131,174,217,218],[131,177,178,216,217],[131,177,178,180,181,216,217],[131,177,178,179,216,217],[131,177,178,182,209,210,211,212,213,216,217],[131,174,177,178,182,214,216],[131,182,217],[131,184,185,186,187,188,189,190,191,192,193,217],[131,207,217],[131,183,194,202,203,204,205,206,208],[131,187,217],[131,195,196,197,198,199,200,201,217],[131,138],[131,171],[131,220],[131,156,157,222,223,224,225,226,227,228,229,230,234,235],[131,234],[83,131],[74,131,236,237,238],[68,131],[64,131],[65,66,69,72,73,131],[71,131],[131,233],[131,154,155],[55,131,153],[55,83,131,153],[131,147],[60,131,149],[55,83,131,220],[131,157,159,160,161,162,163,221],[131,158],[131,153],[131,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,268,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,308,309,310,311,312,313,314,315,316,317,318,319,321,322,323,324,325,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,375,384,386,387,388,389,390,391,393,394,396,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439],[131,297],[131,253,256],[131,255],[131,255,256],[131,252,253,254,256],[131,253,255,256,413],[131,256],[131,252,255,297],[131,255,256,413],[131,255,421],[131,253,255,256],[131,265],[131,288],[131,309],[131,255,256,297],[131,256,304],[131,255,256,297,315],[131,255,256,315],[131,256,356],[131,256,297],[131,252,256,374],[131,252,256,375],[131,397],[131,381,383],[131,392],[131,381],[131,252,256,374,381,382],[131,374,375,383],[131,395],[131,252,256,381,382,383],[131,254,255,256],[131,252,256],[131,253,255,375,376,377,378],[131,297,375,376,377,378],[131,375,377],[131,255,376,377,379,380,384],[131,252,255],[131,256,399],[131,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,298,299,300,301,302,303,305,306,307,308,309,310,311,312,313,314,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372],[131,385],[131,450,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474],[131,220,449],[131,458],[131,220,449,456,460,461,462,463,464,465,466],[55,60,131,149,220,233,449,457,460,461,462,464,466],[55,131,233,457],[131,220,449,465,466],[131,220,449,464,466],[131,456],[131,460,461,462,463],[60,64,131,149,220,233,456],[131,149,220,449,457,458,464,465],[131,457,458,465],[60,131,149,158,220,233,456,475,493,494],[131,456,481,493,496],[55,131,456,492,496],[55,60,68,131,220,233,456,475,481,492,493,494,495],[131,496,497],[131,481,491],[131,475,480,481,483],[131,480],[131,480,481,483],[131,480,481,489],[131,480,481,482],[131,480,481],[131,480,481,483,487],[131,480,481,484,485,486,488],[131,480,481,490],[83,131,149,475,493],[233,456],[456,493],[55,456,492,496],[55,68,220,233,456,481,492,493],[496,497],[481,491],[480,481],[480],[481],[149,493]],"referencedMap":[[165,1],[168,2],[169,3],[167,4],[164,5],[170,6],[173,7],[219,8],[220,9],[166,6],[46,6],[60,10],[58,11],[57,12],[59,13],[56,14],[67,15],[68,16],[71,17],[70,15],[62,18],[64,19],[61,20],[63,18],[84,6],[151,6],[153,21],[152,22],[150,23],[146,24],[147,25],[145,20],[142,26],[141,27],[144,28],[139,29],[149,30],[143,31],[148,32],[140,33],[47,6],[48,6],[55,34],[54,35],[52,36],[49,6],[53,37],[50,37],[51,6],[75,6],[76,6],[78,38],[77,39],[79,6],[83,40],[80,39],[81,39],[82,39],[233,41],[231,42],[232,43],[456,44],[454,6],[453,45],[455,46],[452,6],[251,47],[443,48],[442,6],[447,49],[247,50],[246,6],[241,51],[240,52],[244,53],[243,6],[242,6],[245,54],[446,55],[445,56],[441,57],[250,6],[448,6],[451,58],[444,59],[249,60],[248,6],[449,61],[171,6],[85,62],[86,62],[88,63],[89,64],[90,65],[91,66],[92,67],[93,68],[94,69],[95,70],[96,71],[97,72],[98,72],[100,73],[99,74],[101,73],[102,75],[103,76],[87,77],[137,6],[104,78],[105,79],[106,80],[138,81],[107,82],[108,83],[109,84],[110,85],[111,86],[112,87],[113,88],[114,89],[115,90],[116,91],[117,91],[118,92],[119,93],[121,94],[120,95],[122,96],[123,97],[124,98],[125,99],[126,100],[127,101],[128,102],[129,103],[130,104],[131,105],[132,106],[133,107],[134,108],[135,109],[136,110],[478,6],[476,6],[480,111],[479,6],[218,112],[175,6],[177,113],[176,114],[181,115],[216,116],[213,117],[215,118],[178,117],[179,119],[183,119],[182,120],[180,121],[214,122],[212,117],[217,123],[210,6],[211,6],[184,124],[189,117],[191,117],[186,117],[187,124],[193,117],[194,125],[185,117],[190,117],[192,117],[188,117],[208,126],[207,117],[209,127],[203,117],[205,117],[204,117],[200,117],[206,128],[201,117],[202,129],[195,117],[196,117],[197,117],[198,117],[199,117],[158,130],[477,6],[172,131],[225,132],[227,132],[226,132],[236,133],[237,134],[228,132],[238,135],[230,132],[239,136],[69,137],[66,138],[74,139],[65,138],[73,138],[72,140],[234,141],[156,142],[155,143],[154,144],[229,145],[223,146],[161,39],[221,147],[162,135],[222,148],[157,20],[163,135],[159,149],[160,150],[224,135],[235,141],[440,151],[413,6],[391,152],[389,152],[439,153],[404,154],[403,154],[304,155],[255,156],[411,155],[412,155],[414,157],[415,155],[416,158],[315,159],[417,155],[388,155],[418,155],[419,160],[420,155],[421,154],[422,161],[423,155],[424,155],[425,155],[426,155],[427,154],[428,155],[429,155],[430,155],[431,155],[432,162],[433,155],[434,155],[435,155],[436,155],[437,155],[254,153],[257,158],[258,158],[259,158],[260,158],[261,158],[262,158],[263,158],[264,155],[266,163],[267,158],[265,158],[268,158],[269,158],[270,158],[271,158],[272,158],[273,158],[274,155],[275,158],[276,158],[277,158],[278,158],[279,158],[280,155],[281,158],[282,158],[283,158],[284,158],[285,158],[286,158],[287,155],[289,164],[288,158],[290,158],[291,158],[292,158],[293,158],[294,162],[295,155],[296,155],[310,165],[298,166],[299,158],[300,158],[301,155],[302,158],[303,158],[305,167],[306,158],[307,158],[308,158],[309,158],[311,158],[312,158],[313,158],[314,158],[316,168],[317,158],[318,158],[319,158],[320,155],[321,158],[322,169],[323,169],[324,169],[325,155],[326,158],[327,158],[328,158],[333,158],[329,158],[330,155],[331,158],[332,155],[334,158],[335,158],[336,158],[337,158],[338,158],[339,158],[340,155],[341,158],[342,158],[343,158],[344,158],[345,158],[346,158],[347,158],[348,158],[349,158],[350,158],[351,158],[352,158],[353,158],[354,158],[355,158],[356,158],[357,170],[358,158],[359,158],[360,158],[361,158],[362,158],[363,158],[364,155],[365,155],[366,155],[367,155],[368,155],[369,158],[370,158],[371,158],[372,158],[390,171],[438,155],[375,172],[374,173],[398,174],[397,175],[393,176],[392,175],[394,177],[383,178],[381,179],[396,180],[395,177],[382,6],[384,181],[297,182],[253,183],[252,158],[387,6],[379,184],[380,185],[377,6],[378,186],[376,158],[385,187],[256,188],[405,6],[406,6],[399,6],[402,154],[401,6],[407,6],[408,6],[400,189],[409,6],[410,6],[373,190],[386,191],[1,6],[9,6],[13,6],[12,6],[3,6],[14,6],[15,6],[16,6],[17,6],[18,6],[19,6],[20,6],[21,6],[4,6],[5,6],[25,6],[22,6],[23,6],[24,6],[26,6],[27,6],[28,6],[6,6],[29,6],[30,6],[31,6],[32,6],[7,6],[36,6],[33,6],[34,6],[35,6],[37,6],[8,6],[38,6],[43,6],[44,6],[39,6],[40,6],[41,6],[42,6],[2,6],[45,6],[11,6],[10,6],[174,6],[475,192],[450,193],[459,194],[467,195],[468,196],[458,197],[469,198],[470,193],[471,199],[472,200],[473,200],[464,201],[460,194],[461,6],[457,202],[462,6],[466,203],[465,194],[463,6],[474,204],[495,205],[497,206],[493,207],[496,208],[498,209],[492,210],[484,211],[482,212],[485,213],[486,213],[490,214],[483,215],[487,216],[488,217],[489,218],[491,219],[481,6],[494,220]],"exportedModulesMap":[[165,1],[168,2],[169,3],[167,4],[164,5],[170,6],[173,7],[219,8],[220,9],[166,6],[46,6],[60,10],[58,11],[57,12],[59,13],[56,14],[67,15],[68,16],[71,17],[70,15],[62,18],[64,19],[61,20],[63,18],[84,6],[151,6],[153,21],[152,22],[150,23],[146,24],[147,25],[145,20],[142,26],[141,27],[144,28],[139,29],[149,30],[143,31],[148,32],[140,33],[47,6],[48,6],[55,34],[54,35],[52,36],[49,6],[53,37],[50,37],[51,6],[75,6],[76,6],[78,38],[77,39],[79,6],[83,40],[80,39],[81,39],[82,39],[233,41],[231,42],[232,43],[456,44],[454,6],[453,45],[455,46],[452,6],[251,47],[443,48],[442,6],[447,49],[247,50],[246,6],[241,51],[240,52],[244,53],[243,6],[242,6],[245,54],[446,55],[445,56],[441,57],[250,6],[448,6],[451,58],[444,59],[249,60],[248,6],[449,61],[171,6],[85,62],[86,62],[88,63],[89,64],[90,65],[91,66],[92,67],[93,68],[94,69],[95,70],[96,71],[97,72],[98,72],[100,73],[99,74],[101,73],[102,75],[103,76],[87,77],[137,6],[104,78],[105,79],[106,80],[138,81],[107,82],[108,83],[109,84],[110,85],[111,86],[112,87],[113,88],[114,89],[115,90],[116,91],[117,91],[118,92],[119,93],[121,94],[120,95],[122,96],[123,97],[124,98],[125,99],[126,100],[127,101],[128,102],[129,103],[130,104],[131,105],[132,106],[133,107],[134,108],[135,109],[136,110],[478,6],[476,6],[480,111],[479,6],[218,112],[175,6],[177,113],[176,114],[181,115],[216,116],[213,117],[215,118],[178,117],[179,119],[183,119],[182,120],[180,121],[214,122],[212,117],[217,123],[210,6],[211,6],[184,124],[189,117],[191,117],[186,117],[187,124],[193,117],[194,125],[185,117],[190,117],[192,117],[188,117],[208,126],[207,117],[209,127],[203,117],[205,117],[204,117],[200,117],[206,128],[201,117],[202,129],[195,117],[196,117],[197,117],[198,117],[199,117],[158,130],[477,6],[172,131],[225,132],[227,132],[226,132],[236,133],[237,134],[228,132],[238,135],[230,132],[239,136],[69,137],[66,138],[74,139],[65,138],[73,138],[72,140],[234,141],[156,142],[155,143],[154,144],[229,145],[223,146],[161,39],[221,147],[162,135],[222,148],[157,20],[163,135],[159,149],[160,150],[224,135],[235,141],[440,151],[413,6],[391,152],[389,152],[439,153],[404,154],[403,154],[304,155],[255,156],[411,155],[412,155],[414,157],[415,155],[416,158],[315,159],[417,155],[388,155],[418,155],[419,160],[420,155],[421,154],[422,161],[423,155],[424,155],[425,155],[426,155],[427,154],[428,155],[429,155],[430,155],[431,155],[432,162],[433,155],[434,155],[435,155],[436,155],[437,155],[254,153],[257,158],[258,158],[259,158],[260,158],[261,158],[262,158],[263,158],[264,155],[266,163],[267,158],[265,158],[268,158],[269,158],[270,158],[271,158],[272,158],[273,158],[274,155],[275,158],[276,158],[277,158],[278,158],[279,158],[280,155],[281,158],[282,158],[283,158],[284,158],[285,158],[286,158],[287,155],[289,164],[288,158],[290,158],[291,158],[292,158],[293,158],[294,162],[295,155],[296,155],[310,165],[298,166],[299,158],[300,158],[301,155],[302,158],[303,158],[305,167],[306,158],[307,158],[308,158],[309,158],[311,158],[312,158],[313,158],[314,158],[316,168],[317,158],[318,158],[319,158],[320,155],[321,158],[322,169],[323,169],[324,169],[325,155],[326,158],[327,158],[328,158],[333,158],[329,158],[330,155],[331,158],[332,155],[334,158],[335,158],[336,158],[337,158],[338,158],[339,158],[340,155],[341,158],[342,158],[343,158],[344,158],[345,158],[346,158],[347,158],[348,158],[349,158],[350,158],[351,158],[352,158],[353,158],[354,158],[355,158],[356,158],[357,170],[358,158],[359,158],[360,158],[361,158],[362,158],[363,158],[364,155],[365,155],[366,155],[367,155],[368,155],[369,158],[370,158],[371,158],[372,158],[390,171],[438,155],[375,172],[374,173],[398,174],[397,175],[393,176],[392,175],[394,177],[383,178],[381,179],[396,180],[395,177],[382,6],[384,181],[297,182],[253,183],[252,158],[387,6],[379,184],[380,185],[377,6],[378,186],[376,158],[385,187],[256,188],[405,6],[406,6],[399,6],[402,154],[401,6],[407,6],[408,6],[400,189],[409,6],[410,6],[373,190],[386,191],[1,6],[9,6],[13,6],[12,6],[3,6],[14,6],[15,6],[16,6],[17,6],[18,6],[19,6],[20,6],[21,6],[4,6],[5,6],[25,6],[22,6],[23,6],[24,6],[26,6],[27,6],[28,6],[6,6],[29,6],[30,6],[31,6],[32,6],[7,6],[36,6],[33,6],[34,6],[35,6],[37,6],[8,6],[38,6],[43,6],[44,6],[39,6],[40,6],[41,6],[42,6],[2,6],[45,6],[11,6],[10,6],[174,6],[475,192],[450,193],[459,194],[467,195],[468,196],[458,197],[469,198],[470,193],[471,199],[472,200],[473,200],[464,201],[460,194],[461,6],[457,202],[462,6],[466,203],[465,194],[463,6],[474,204],[495,221],[497,222],[493,223],[496,224],[498,225],[492,226],[484,227],[482,228],[485,227],[486,227],[490,227],[483,227],[487,227],[488,227],[489,229],[491,229],[494,230]],"semanticDiagnosticsPerFile":[165,168,169,167,164,170,173,219,220,166,46,60,58,57,59,56,67,68,71,70,62,64,61,63,84,151,153,152,150,146,147,145,142,141,144,139,149,143,148,140,47,48,55,54,52,49,53,50,51,75,76,78,77,79,83,80,81,82,233,231,232,456,454,453,455,452,251,443,442,447,247,246,241,240,244,243,242,245,446,445,441,250,448,451,444,249,248,449,171,85,86,88,89,90,91,92,93,94,95,96,97,98,100,99,101,102,103,87,137,104,105,106,138,107,108,109,110,111,112,113,114,115,116,117,118,119,121,120,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,478,476,480,479,218,175,177,176,181,216,213,215,178,179,183,182,180,214,212,217,210,211,184,189,191,186,187,193,194,185,190,192,188,208,207,209,203,205,204,200,206,201,202,195,196,197,198,199,158,477,172,225,227,226,236,237,228,238,230,239,69,66,74,65,73,72,234,156,155,154,229,223,161,221,162,222,157,163,159,160,224,235,440,413,391,389,439,404,403,304,255,411,412,414,415,416,315,417,388,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,254,257,258,259,260,261,262,263,264,266,267,265,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,289,288,290,291,292,293,294,295,296,310,298,299,300,301,302,303,305,306,307,308,309,311,312,313,314,316,317,318,319,320,321,322,323,324,325,326,327,328,333,329,330,331,332,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,390,438,375,374,398,397,393,392,394,383,381,396,395,382,384,297,253,252,387,379,380,377,378,376,385,256,405,406,399,402,401,407,408,400,409,410,373,386,1,9,13,12,3,14,15,16,17,18,19,20,21,4,5,25,22,23,24,26,27,28,6,29,30,31,32,7,36,33,34,35,37,8,38,43,44,39,40,41,42,2,45,11,10,174,475,450,459,467,468,458,469,470,471,472,473,464,460,461,457,462,466,465,463,474,495,497,493,496,498,492,484,482,485,486,490,483,487,488,489,491,481,494]},"version":"4.9.4"} \ No newline at end of file +{"program":{"fileNames":["../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.scripthost.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib/lib.esnext.intl.d.ts","../../../node_modules/.pnpm/@near-js+crypto@0.0.4/node_modules/@near-js/crypto/lib/constants.d.ts","../../../node_modules/.pnpm/@near-js+types@0.0.4/node_modules/@near-js/types/lib/assignable.d.ts","../../../node_modules/.pnpm/@near-js+types@0.0.4/node_modules/@near-js/types/lib/errors.d.ts","../../../node_modules/.pnpm/@near-js+types@0.0.4/node_modules/@near-js/types/lib/provider/protocol.d.ts","../../../node_modules/.pnpm/@near-js+types@0.0.4/node_modules/@near-js/types/lib/provider/response.d.ts","../../../node_modules/.pnpm/@near-js+types@0.0.4/node_modules/@near-js/types/lib/provider/validator.d.ts","../../../node_modules/.pnpm/@near-js+types@0.0.4/node_modules/@near-js/types/lib/provider/light_client.d.ts","../../../node_modules/.pnpm/@near-js+types@0.0.4/node_modules/@near-js/types/lib/provider/request.d.ts","../../../node_modules/.pnpm/@near-js+types@0.0.4/node_modules/@near-js/types/lib/provider/index.d.ts","../../../node_modules/.pnpm/@near-js+types@0.0.4/node_modules/@near-js/types/lib/index.d.ts","../../../node_modules/.pnpm/@near-js+crypto@0.0.4/node_modules/@near-js/crypto/lib/public_key.d.ts","../../../node_modules/.pnpm/@near-js+crypto@0.0.4/node_modules/@near-js/crypto/lib/key_pair_base.d.ts","../../../node_modules/.pnpm/@near-js+crypto@0.0.4/node_modules/@near-js/crypto/lib/key_pair.d.ts","../../../node_modules/.pnpm/@near-js+crypto@0.0.4/node_modules/@near-js/crypto/lib/key_pair_ed25519.d.ts","../../../node_modules/.pnpm/@near-js+crypto@0.0.4/node_modules/@near-js/crypto/lib/index.d.ts","../../../node_modules/.pnpm/@near-js+keystores@0.0.4/node_modules/@near-js/keystores/lib/keystore.d.ts","../../../node_modules/.pnpm/@near-js+keystores@0.0.4/node_modules/@near-js/keystores/lib/in_memory_key_store.d.ts","../../../node_modules/.pnpm/@near-js+keystores@0.0.4/node_modules/@near-js/keystores/lib/merge_key_store.d.ts","../../../node_modules/.pnpm/@near-js+keystores@0.0.4/node_modules/@near-js/keystores/lib/index.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/key_stores/keystore.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/key_stores/in_memory_key_store.d.ts","../../../node_modules/.pnpm/@near-js+keystores-browser@0.0.4/node_modules/@near-js/keystores-browser/lib/browser_local_storage_key_store.d.ts","../../../node_modules/.pnpm/@near-js+keystores-browser@0.0.4/node_modules/@near-js/keystores-browser/lib/index.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/key_stores/browser_local_storage_key_store.d.ts","../../../node_modules/.pnpm/@near-js+keystores-node@0.0.4/node_modules/@near-js/keystores-node/lib/unencrypted_file_system_keystore.d.ts","../../../node_modules/.pnpm/@near-js+keystores-node@0.0.4/node_modules/@near-js/keystores-node/lib/index.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/key_stores/unencrypted_file_system_keystore.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/key_stores/merge_key_store.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/key_stores/index.d.ts","../../../node_modules/.pnpm/@near-js+utils@0.0.4/node_modules/@near-js/utils/lib/constants.d.ts","../../../node_modules/.pnpm/@near-js+utils@0.0.4/node_modules/@near-js/utils/lib/errors/errors.d.ts","../../../node_modules/.pnpm/@near-js+utils@0.0.4/node_modules/@near-js/utils/lib/errors/rpc_errors.d.ts","../../../node_modules/.pnpm/@near-js+utils@0.0.4/node_modules/@near-js/utils/lib/errors/index.d.ts","../../../node_modules/.pnpm/@near-js+utils@0.0.4/node_modules/@near-js/utils/lib/format.d.ts","../../../node_modules/.pnpm/@near-js+utils@0.0.4/node_modules/@near-js/utils/lib/logging.d.ts","../../../node_modules/.pnpm/@near-js+utils@0.0.4/node_modules/@near-js/utils/lib/provider.d.ts","../../../node_modules/.pnpm/@near-js+utils@0.0.4/node_modules/@near-js/utils/lib/validators.d.ts","../../../node_modules/.pnpm/@near-js+utils@0.0.4/node_modules/@near-js/utils/lib/index.d.ts","../../../node_modules/.pnpm/@near-js+providers@0.0.6/node_modules/@near-js/providers/lib/exponential-backoff.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/assert.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/assert/strict.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/globals.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/async_hooks.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/buffer.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/child_process.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/cluster.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/console.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/constants.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/crypto.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/dgram.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/dns.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/dns/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/domain.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/dom-events.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/events.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/fs.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/fs/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/http.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/http2.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/https.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/inspector.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/module.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/net.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/os.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/path.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/process.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/punycode.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/querystring.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/readline.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/readline/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/repl.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/stream.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/stream/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/stream/web.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/string_decoder.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/test.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/timers.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/timers/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/tls.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/trace_events.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/tty.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/url.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/util.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/v8.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/vm.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/wasi.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/worker_threads.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/zlib.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/globals.global.d.ts","../../../node_modules/.pnpm/@types+node@20.1.4/node_modules/@types/node/index.d.ts","../../../node_modules/.pnpm/@near-js+transactions@0.2.0/node_modules/@near-js/transactions/lib/delegate.d.ts","../../../node_modules/.pnpm/@near-js+transactions@0.2.0/node_modules/@near-js/transactions/lib/signature.d.ts","../../../node_modules/.pnpm/@near-js+transactions@0.2.0/node_modules/@near-js/transactions/lib/actions.d.ts","../../../node_modules/.pnpm/@near-js+transactions@0.2.0/node_modules/@near-js/transactions/lib/action_creators.d.ts","../../../node_modules/.pnpm/@near-js+transactions@0.2.0/node_modules/@near-js/transactions/lib/schema.d.ts","../../../node_modules/.pnpm/@near-js+transactions@0.2.0/node_modules/@near-js/transactions/lib/create_transaction.d.ts","../../../node_modules/.pnpm/@near-js+signers@0.0.4/node_modules/@near-js/signers/lib/signer.d.ts","../../../node_modules/.pnpm/@near-js+signers@0.0.4/node_modules/@near-js/signers/lib/in_memory_signer.d.ts","../../../node_modules/.pnpm/@near-js+signers@0.0.4/node_modules/@near-js/signers/lib/index.d.ts","../../../node_modules/.pnpm/@near-js+transactions@0.2.0/node_modules/@near-js/transactions/lib/sign.d.ts","../../../node_modules/.pnpm/@near-js+transactions@0.2.0/node_modules/@near-js/transactions/lib/index.d.ts","../../../node_modules/.pnpm/@near-js+providers@0.0.6/node_modules/@near-js/providers/lib/provider.d.ts","../../../node_modules/.pnpm/@near-js+providers@0.0.6/node_modules/@near-js/providers/lib/fetch_json.d.ts","../../../node_modules/.pnpm/@near-js+providers@0.0.6/node_modules/@near-js/providers/lib/json-rpc-provider.d.ts","../../../node_modules/.pnpm/@near-js+providers@0.0.6/node_modules/@near-js/providers/lib/index.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/providers/provider.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/providers/json-rpc-provider.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/providers/index.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/utils/key_pair.d.ts","../../../node_modules/.pnpm/borsh@0.7.0/node_modules/borsh/lib/index.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/utils/serialize.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/utils/web.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/utils/enums.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/utils/format.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/utils/rpc_errors.d.ts","../../../node_modules/.pnpm/@near-js+accounts@0.1.3/node_modules/@near-js/accounts/lib/connection.d.ts","../../../node_modules/.pnpm/@near-js+accounts@0.1.3/node_modules/@near-js/accounts/lib/account.d.ts","../../../node_modules/.pnpm/@near-js+accounts@0.1.3/node_modules/@near-js/accounts/lib/types.d.ts","../../../node_modules/.pnpm/@near-js+accounts@0.1.3/node_modules/@near-js/accounts/lib/account_multisig.d.ts","../../../node_modules/.pnpm/@near-js+accounts@0.1.3/node_modules/@near-js/accounts/lib/account_2fa.d.ts","../../../node_modules/.pnpm/@near-js+accounts@0.1.3/node_modules/@near-js/accounts/lib/account_creator.d.ts","../../../node_modules/.pnpm/@near-js+accounts@0.1.3/node_modules/@near-js/accounts/lib/constants.d.ts","../../../node_modules/.pnpm/@types+json-schema@7.0.11/node_modules/@types/json-schema/index.d.ts","../../../node_modules/.pnpm/near-abi@0.1.1/node_modules/near-abi/lib/index.d.ts","../../../node_modules/.pnpm/@near-js+accounts@0.1.3/node_modules/@near-js/accounts/lib/contract.d.ts","../../../node_modules/.pnpm/uri-js@4.4.1/node_modules/uri-js/dist/es5/uri.all.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/codegen/code.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/codegen/scope.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/codegen/index.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/rules.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/util.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/validate/subschema.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/errors.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/validate/index.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/validate/datatype.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/applicator/additionalitems.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/applicator/items2020.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/applicator/contains.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/applicator/dependencies.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/applicator/propertynames.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/applicator/additionalproperties.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/applicator/not.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/applicator/anyof.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/applicator/oneof.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/applicator/if.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/applicator/index.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/validation/limitnumber.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/validation/multipleof.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/validation/pattern.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/validation/required.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/validation/uniqueitems.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/validation/const.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/validation/enum.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/validation/index.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/format/format.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedproperties.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/unevaluated/unevaluateditems.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/validation/dependentrequired.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/discriminator/types.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/discriminator/index.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/vocabularies/errors.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/types/json-schema.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/types/jtd-schema.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/runtime/validation_error.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/ref_error.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/core.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/resolve.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/compile/index.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/types/index.d.ts","../../../node_modules/.pnpm/ajv@8.12.0/node_modules/ajv/dist/ajv.d.ts","../../../node_modules/.pnpm/@near-js+accounts@0.1.3/node_modules/@near-js/accounts/lib/errors.d.ts","../../../node_modules/.pnpm/@near-js+accounts@0.1.3/node_modules/@near-js/accounts/lib/index.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/utils/errors.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/utils/index.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/transaction.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/validators.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/account.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/account_multisig.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/account_creator.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/connection.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/signer.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/contract.d.ts","../../../node_modules/.pnpm/@near-js+wallet-account@0.0.6/node_modules/@near-js/wallet-account/lib/near.d.ts","../../../node_modules/.pnpm/@near-js+wallet-account@0.0.6/node_modules/@near-js/wallet-account/lib/wallet_account.d.ts","../../../node_modules/.pnpm/@near-js+wallet-account@0.0.6/node_modules/@near-js/wallet-account/lib/index.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/near.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/wallet-account.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/common-index.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/connect.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/constants.d.ts","../../../node_modules/.pnpm/near-api-js@2.1.3/node_modules/near-api-js/lib/index.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/provider/provider.service.types.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/provider/provider.service.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/storage/storage.service.types.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/storage/json-storage.service.types.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/storage/json-storage.service.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/storage/web-storage.service.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/logger/logger.service.types.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/logger/logger.service.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/wallet/transactions.types.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/wallet/index.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/translate/translate.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/options.types.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/subscription.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/subscriber.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operator.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/types.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/audit.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/audittime.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/buffer.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/buffercount.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/buffertime.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/buffertoggle.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/bufferwhen.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/catcherror.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/combinelatestall.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/combineall.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/combinelatest.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/combinelatestwith.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/concat.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/concatall.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/concatmap.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/concatmapto.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/concatwith.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/connect.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/count.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/debounce.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/debouncetime.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/defaultifempty.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/delay.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/delaywhen.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/dematerialize.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/distinct.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/distinctuntilchanged.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/distinctuntilkeychanged.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/elementat.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/endwith.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/every.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/exhaustall.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/exhaust.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/exhaustmap.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/expand.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/filter.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/finalize.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/find.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/findindex.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/first.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/subject.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/groupby.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/ignoreelements.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/isempty.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/last.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/map.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/mapto.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/notification.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/materialize.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/max.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/merge.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/mergeall.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/mergemap.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/flatmap.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/mergemapto.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/mergescan.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/mergewith.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/min.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/connectableobservable.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/multicast.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/observeon.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/onerrorresumenextwith.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/pairwise.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/partition.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/pluck.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/publish.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/publishbehavior.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/publishlast.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/publishreplay.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/race.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/racewith.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/reduce.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/repeat.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/repeatwhen.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/retry.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/retrywhen.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/refcount.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/sample.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/sampletime.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/scan.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/sequenceequal.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/share.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/sharereplay.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/single.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/skip.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/skiplast.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/skipuntil.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/skipwhile.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/startwith.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/subscribeon.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/switchall.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/switchmap.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/switchmapto.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/switchscan.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/take.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/takelast.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/takeuntil.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/takewhile.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/tap.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/throttle.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/throttletime.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/throwifempty.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/timeinterval.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/timeout.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/timeoutwith.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/timestamp.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/toarray.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/window.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/windowcount.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/windowtime.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/windowtoggle.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/windowwhen.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/withlatestfrom.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/zip.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/zipall.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/operators/zipwith.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/operators/index.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/action.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/testing/testmessage.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/testing/subscriptionlog.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/testing/subscriptionloggable.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/testing/coldobservable.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/testing/hotobservable.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/asyncscheduler.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/timerhandle.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/asyncaction.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/virtualtimescheduler.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/testing/testscheduler.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/testing/index.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/symbol/observable.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/dom/animationframes.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/behaviorsubject.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/replaysubject.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/asyncsubject.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/asapscheduler.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/asap.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/async.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/queuescheduler.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/queue.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/animationframescheduler.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduler/animationframe.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/util/identity.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/util/pipe.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/util/noop.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/util/isobservable.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/lastvaluefrom.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/firstvaluefrom.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/util/argumentoutofrangeerror.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/util/emptyerror.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/util/notfounderror.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/util/objectunsubscribederror.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/util/sequenceerror.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/util/unsubscriptionerror.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/bindcallback.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/bindnodecallback.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/anycatcher.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/combinelatest.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/concat.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/connectable.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/defer.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/empty.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/forkjoin.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/from.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/fromevent.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/fromeventpattern.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/generate.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/iif.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/interval.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/merge.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/never.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/of.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/onerrorresumenext.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/pairs.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/partition.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/race.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/range.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/throwerror.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/timer.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/using.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/observable/zip.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/scheduled/scheduled.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/internal/config.d.ts","../../../node_modules/.pnpm/rxjs@7.8.1/node_modules/rxjs/dist/types/index.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/store.types.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/event-emitter/event-emitter.types.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/event-emitter/event-emitter.service.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/wallet-selector.types.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/wallet-modules/wallet-modules.service.types.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/wallet-modules/wallet-modules.service.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/services/index.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/utils.types.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/wallet/wallet.types.d.ts","../../core/lib/lib/balances.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/wallet-selector.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/helpers/waitfor.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/helpers/getactiveaccount.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/helpers/detect-browser.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/lib/helpers/index.d.ts","../../../node_modules/.pnpm/@near-wallet-selector+core@8.0.3_near-api-js@2.1.3/node_modules/@near-wallet-selector/core/index.d.ts","../../core/lib/lib/types/general.d.ts","../../core/lib/lib/keypom.d.ts","../../core/lib/lib/claims.d.ts","../../core/lib/lib/types/fc.d.ts","../../core/lib/lib/types/ft.d.ts","../../core/lib/lib/types/nft.d.ts","../../core/lib/lib/types/simple.d.ts","../../core/lib/lib/types/drops.d.ts","../../core/lib/lib/types/protocol.d.ts","../../core/lib/lib/types/params.d.ts","../../core/lib/lib/drops.d.ts","../../core/lib/lib/keypom-utils.d.ts","../../core/lib/lib/keys.d.ts","../../core/lib/lib/sales.d.ts","../../core/lib/lib/trial-accounts/pre-trial.d.ts","../../core/lib/lib/trial-accounts/trial-active.d.ts","../../core/lib/lib/trial-accounts/utils.d.ts","../../core/lib/lib/views.d.ts","../../core/lib/index.d.ts","../../../node_modules/.pnpm/@types+react@18.0.26/node_modules/@types/react/global.d.ts","../../../node_modules/.pnpm/csstype@3.1.2/node_modules/csstype/index.d.ts","../../../node_modules/.pnpm/@types+prop-types@15.7.5/node_modules/@types/prop-types/index.d.ts","../../../node_modules/.pnpm/@types+scheduler@0.16.3/node_modules/@types/scheduler/tracing.d.ts","../../../node_modules/.pnpm/@types+react@18.0.26/node_modules/@types/react/index.d.ts","../src/modal/src/lib/modal.types.ts","../src/modal/src/lib/components/closemodalbutton.tsx","../src/modal/src/lib/components/mainbody.tsx","../src/modal/src/lib/components/begintrial.tsx","../src/modal/src/lib/components/insufficientbalance.tsx","../src/modal/src/lib/components/invalidactions.tsx","../src/modal/src/lib/components/offboardingwallets.tsx","../src/modal/src/lib/components/trialover.tsx","../src/modal/src/lib/handlemodaltype.tsx","../src/modal/src/lib/components/keypommodal.tsx","../src/modal/src/lib/modal.tsx","../src/modal/src/index.ts","../src/core/types.ts","../src/utils/selector-utils.ts","../src/core/ext_wallets.ts","../src/core/wallet.ts","../src/core/setup.ts","../src/index.ts"],"fileInfos":["2dc8c927c9c162a773c6bb3cdc4f3286c23f10eedc67414028f9cb5951610f60",{"version":"8730f4bf322026ff5229336391a18bcaa1f94d4f82416c8b2f3954e2ccaae2ba","affectsGlobalScope":true},"dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6","7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467","8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9","5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06","4b421cbfb3a38a27c279dec1e9112c3d1da296f77a1a85ddadf7e7a425d45d18","1fc5ab7a764205c68fa10d381b08417795fc73111d6dd16b5b1ed36badb743d9",{"version":"3aafcb693fe5b5c3bd277bd4c3a617b53db474fe498fc5df067c5603b1eebde7","affectsGlobalScope":true},{"version":"7fac8cb5fc820bc2a59ae11ef1c5b38d3832c6d0dfaec5acdb5569137d09a481","affectsGlobalScope":true},{"version":"097a57355ded99c68e6df1b738990448e0bf170e606707df5a7c0481ff2427cd","affectsGlobalScope":true},{"version":"adb996790133eb33b33aadb9c09f15c2c575e71fb57a62de8bf74dbf59ec7dfb","affectsGlobalScope":true},{"version":"8cc8c5a3bac513368b0157f3d8b31cfdcfe78b56d3724f30f80ed9715e404af8","affectsGlobalScope":true},{"version":"cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a","affectsGlobalScope":true},{"version":"c5c05907c02476e4bde6b7e76a79ffcd948aedd14b6a8f56e4674221b0417398","affectsGlobalScope":true},{"version":"5f406584aef28a331c36523df688ca3650288d14f39c5d2e555c95f0d2ff8f6f","affectsGlobalScope":true},{"version":"22f230e544b35349cfb3bd9110b6ef37b41c6d6c43c3314a31bd0d9652fcec72","affectsGlobalScope":true},{"version":"7ea0b55f6b315cf9ac2ad622b0a7813315bb6e97bf4bb3fbf8f8affbca7dc695","affectsGlobalScope":true},{"version":"3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93","affectsGlobalScope":true},{"version":"eb26de841c52236d8222f87e9e6a235332e0788af8c87a71e9e210314300410a","affectsGlobalScope":true},{"version":"3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006","affectsGlobalScope":true},{"version":"17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a","affectsGlobalScope":true},{"version":"7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98","affectsGlobalScope":true},{"version":"6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577","affectsGlobalScope":true},{"version":"81cac4cbc92c0c839c70f8ffb94eb61e2d32dc1c3cf6d95844ca099463cf37ea","affectsGlobalScope":true},{"version":"b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e","affectsGlobalScope":true},{"version":"0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a","affectsGlobalScope":true},{"version":"da233fc1c8a377ba9e0bed690a73c290d843c2c3d23a7bd7ec5cd3d7d73ba1e0","affectsGlobalScope":true},{"version":"d154ea5bb7f7f9001ed9153e876b2d5b8f5c2bb9ec02b3ae0d239ec769f1f2ae","affectsGlobalScope":true},{"version":"bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c","affectsGlobalScope":true},{"version":"c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8","affectsGlobalScope":true},{"version":"9d57b2b5d15838ed094aa9ff1299eecef40b190722eb619bac4616657a05f951","affectsGlobalScope":true},{"version":"6c51b5dd26a2c31dbf37f00cfc32b2aa6a92e19c995aefb5b97a3a64f1ac99de","affectsGlobalScope":true},{"version":"6e7997ef61de3132e4d4b2250e75343f487903ddf5370e7ce33cf1b9db9a63ed","affectsGlobalScope":true},{"version":"2ad234885a4240522efccd77de6c7d99eecf9b4de0914adb9a35c0c22433f993","affectsGlobalScope":true},{"version":"5e5e095c4470c8bab227dbbc61374878ecead104c74ab9960d3adcccfee23205","affectsGlobalScope":true},{"version":"09aa50414b80c023553090e2f53827f007a301bc34b0495bfb2c3c08ab9ad1eb","affectsGlobalScope":true},{"version":"d7f680a43f8cd12a6b6122c07c54ba40952b0c8aa140dcfcf32eb9e6cb028596","affectsGlobalScope":true},{"version":"3787b83e297de7c315d55d4a7c546ae28e5f6c0a361b7a1dcec1f1f50a54ef11","affectsGlobalScope":true},{"version":"e7e8e1d368290e9295ef18ca23f405cf40d5456fa9f20db6373a61ca45f75f40","affectsGlobalScope":true},{"version":"faf0221ae0465363c842ce6aa8a0cbda5d9296940a8e26c86e04cc4081eea21e","affectsGlobalScope":true},{"version":"06393d13ea207a1bfe08ec8d7be562549c5e2da8983f2ee074e00002629d1871","affectsGlobalScope":true},{"version":"2768ef564cfc0689a1b76106c421a2909bdff0acbe87da010785adab80efdd5c","affectsGlobalScope":true},{"version":"b248e32ca52e8f5571390a4142558ae4f203ae2f94d5bac38a3084d529ef4e58","affectsGlobalScope":true},{"version":"52d1bb7ab7a3306fd0375c8bff560feed26ed676a5b0457fa8027b563aecb9a4","affectsGlobalScope":true},"96dd7d8c35740c4b60a5d31aa9d1439456ff0b8e808716876892f387be8f9785","8c015f3fb8184e8be0f2bcec559c7b92c5b4ff553063681cc92972d177c3c89b","872e149f661232549ead687aa854068e71a19a4aa81736a9f2edf5c0eb85a850","31d27cc70c0429e339d2c47fd8b871de4e816c3e9ed352e347a8302087de0ba5","327a78827cd4e0766f385efe96bdc7b597e69e95f50d767bcdf91c2c1a12e088","0b1684a97ef593e84839b34421dae2fe5f8706c22c1f63096e3c65c2a7da0d51","c81890e27cc9d73b9ddf0bebe5ce34a5a76caf3648ec01e4be2128819429a09e","aa544e335e56cd64cc50f01857e88dbc69e6638100698e0621af8c3dd2fa705b","8a200ed2ee5606dd599b6e2eb9e20baeb3185b3ab418269ca2864ab2f25405f4","f82fca5c88d74eb7c6fb9cb2c3c9fd4a6ccfbcbc3902f382567a2369ca9bfb1b","b03859cb415663290b09f2a4b16686aa2b742dbd9b9a2ff47cd251a423d982ef","e6f3e9edf1d2c4d8e3873992b887aa29b2e713675688e2f27293fec5e0477dbb","c3c9ab892fbf6562104b0d0a0eb78401b6f9ab587e65110f7b4d1f2b35ae9251","9c37c1ff9e13b5f176fa2be5d95db101b6cb6211caf3d49cc5ea5a9c1458c36e","c45df6062be58cd03feecbbfed22f358a7467ad217ffc5021004b3f190ef8561","84de59d596077b5c3c29d835b9651ea49aabc18f4380d3ad3dffacac7f05161c","42cff4883f23d2cd79ad87928fecb543b6d09b18c5b9d05caf1da8c05b78c706","3dafe4df9af0a9324baa98d78e1f8027bd3a7fe8b0482f93fd31effe87d9e7ae","31f20a575419b1bfe8517c4e143a632f4cf3951ae99bb69724699abaaafc2d5f","42819486e5e72971376fd91085f81b87f1088057ed548febfeef72dcdd256ba4","25cd8b8acd97b5663a327ca8f6182d0097eb1a72cd80be826f0ecf6b8de6df90","db0b7ed051c15cccc1ba0281932314e2a6e7fdf4df0197b7217618be392ab559","8ad4ec63630ea6ff108f4f19cc8e75bd7ccbd48a371e6d2b5b2dd9676af8adac","30fbdefc1a4597eeefcbcf882a975c4b5e3d98332223046dc76160b06a85c938","9fb87cbacfc80e83634b3401484f86fe09e1d4ae72ff241fd1ab45fa328e337b","12d77e5b206440528857e74291e7f5cb10072a63c723d83a3aef2ee5038b4f43","b4d9cfa678c0005bab9af08066f90b2d3079176c5d087f5b19daf224cacacbdb","b08febdd03ef167cdea0a5adb091b23e8d25a6865bf063d95e4086b8b7b66316","2443cf925775612aa2ca54cfa182fa49e30e75f9f40233133f47abdd47001f2d","ba7e43a68d870315615e62684df6a28c8ceb8cff7b14b1593d165a72668e8786","33f430e509cff2dad10931611ed6f3778d0b0db7a54e31726b73b523c05eaa9f","e71a187c3d6e21c61996ffd3e003eafab0e565b10b522dc76bc8ea18662f5bd1","1bec6e2b235fc92823cf6eb0ab18a6fa60efc52ec275530e3ee0bd52e4bd96eb","d8c15d7d3cbb5653a678b4f05ef03fcc0d0f3524f3343745933425d5728c3d58","70cc21568bf3d468d3ef1e084047a4076d865956f9763e1b593ac575cde04bfc","85bacafbdcf019a928e627c29343df9fbd8308cd419c072537edcb3557f1666f","608d781bb900dfac364d7c94ed28dd12449474160b809ea2bf05ce4d3d0c7915","739a6a9135ef64c98991d3353a1ab7aa1da9e556b196f9b14bdcdfb5dc26ea82","45cff3c47fb6c024d6ee26db8478f1defc58c01f3f6722296e978102647c0b99","9ee13abb39c50c2f45b5362dbadc55334e82dfc9789cfc070808e10dc5f60000","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"f749812878fecfa53cfc13b36e5d35086fb6377983a9df44175da83ccc23af1f","affectsGlobalScope":true},"03c04ba2137908b3b6219ecadc3471d4e39bb9030e6404510ee6e87a3b590a2d",{"version":"772ff00e189d93488d1ca6f0f4dfba77bd090a99ed31e19a14bc16fad4078e48","affectsGlobalScope":true},"3d2bcfb9c4591832ec479f830c49c291419caeb19953506bdeef1c0e6ad79b03","ac0c7cb0a4c1bec60be2c0460b3bda1e674eaf2c98312d7b6f16a0bb58718e2d",{"version":"7e2181a6fc140b4525d5a45c204477c37fa78a635558e88552c68f76a4325403","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","0ea59475772c2a8fdeb1f41ad9b02025aff6423003ec7eaf8129ee846f438aee","276b547eeb8eeeee9a446a3bfa6e07d1c0199269bdcf33813abab1281394a9cb","c999f7816955f75b447823e3e4085f699600e2a4a3327907df9af65b0a9c0df6","64361245fe025cbbad90451dd3698f7e6822d465ef568cbee3a4d8ddb52e7cda","8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","9b814e0806922056145bedb096f11b73bdce70cc871f3ccfc4ce00b2cba75718",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"2013a2215691096d953ce7cefbc71a6cd31ef14be092cd003792714c5cd23bde","affectsGlobalScope":true},"60155c38ec392043962a90006153f7e31187b93411f2d8f9b35f595e98b8d75f","2ad6a251b6ef19fd1f8498f83bb7b265033bd52287e1f6569d09544f18806713","bfa08f2c30c475aef1c9451855ba6b2acfdc64f61950a38fae75806d66fb85c2","159807eb55a9439f9a675bd493788190a6203b5f36c315f8c3acbfcb875c7072","fe31b2b31ac5453fc7b8eef32b62017e55b214ceb884f0b177f442af92e84682","dd72576c8ea64d55af46a386068503d3cfcecce84ed7e1cbd4ff4081ba67fafc",{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true},"70a7e8a7880d55396285e4b85ff5bdf3af3083176abe07f944967836f2a43188","3570df7c6f3a976109f55b596a2d88c2f87e0574cd1502272594ee5c4e56d0ef","850e95721334c2aa7697b08782f443ec4286274e5024169d4443933544f359d7",{"version":"74e6cd21f7b5e29fab05060ea24e2b90aa254f16f3f62ccd7055bdb8fc7b2ff5","affectsGlobalScope":true},{"version":"5761c90b0cabdd6bd1f5fb1c3bf942088fdd39e18ed35dbe39b0c34bc733bf13","affectsGlobalScope":true},"1eb6c5569d41e6021832d0a8a71f45fecbc13d03ad7d306da485999148b64955","c05ef0ecf06540ad3039515c10d3b27f9380639ced40f4093fd073e1b5ff21d9","fd25a0d3e6448b61d33e1fe4e0667a1a87a77e53570b65a454937cf2dc92f967","c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","24a68c38b5c66d6a6883624342560d88db670e97824b397e78d9dac121aa8bae","9a134dbb29f0af914d90b23f609b39019d66ed53db7d492ab6b04c67114559da","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","7b3781fbdfddbee8dba55ccee5aa74a7c8d6701ade11d49ab7d8cb1fcefe669e","c4aab2ec3a249f2a4caa9cbdb099752a80daf999b79d85aa3504cdfd6e559476",{"version":"666d3f264db693828f6edc2eb53ae6013e40f6e39278ca209c7a8a99ac91b62f","affectsGlobalScope":true},"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","c764a6cf523d13f2304a23216cd1084e28c041eebabd8aa9b2a9d99866c668c0","1272a5c2bd05961adc473e905332b7a422b00485c10b41c752f7fcf6835e3436","30ef92bf8135ce36ba1231fe41715276f2a40be72a478ddeb862bc16672e8680",{"version":"4ace0a30a70fe5963442d75ea6e69f525671ae76f6e57ab7556c44839b4237e8","affectsGlobalScope":true},{"version":"a6f03dbf03c001fb3ac1c9bea6dde049dfff27ef8886cc4a886374aacf2e997d","affectsGlobalScope":true},"66bfb3de947abf4b117ee849c245425dbe494d6903e28f9ded566e91c9d05d77","c28d4f58131b93d60e087b86148d4e0c9d9b5c49c23ff1a9d1a9594fdedd5d08","c6b5d7f259544c91024ecf2b17138574a3f6ff2476468fafd7f957d2b68d6d98",{"version":"1ec27c4b695590464113276d174f873e260e468ef226b7dc18f9193875fa559d","affectsGlobalScope":true},"33da4ee2ab9fdd9ef8b3fc526d871ce02ae8c825283f5695e7cad507c087b97c",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"71709584ed5ed7d236dc225441ec4634ffc6c718853e04b9c27b9ea121459044","5580a1d4a8ba2e4dc3707bf9c9edb5418efb1edb266cdfe6e8697043de81a1fc","d0effc06bee61a060f05c8e2c1bc3b678f6abb599bc25cccc8c373559256b0d4","b0803819e63c0a3ad2fefdbc79cc62e05f5587a2d3371d7034e8060d4c685415","b17bcdeff24560a49c626216dec5c8ce9fcd0459a6117d0ef0a3a4046feca227","6cd9513718573425df2e650e35902aec2b263958da35e44f4bd681a08c244d89","73597ea751eeeffa5ee09d21d782f8ceaaacb7191a3595add3260149acd3a126","6cdf62786c3da291ba76403823bf5a416a229713a201c7afab6a209d6ad0ba35","9c268f69a7c2f830cfa7380fdba76d77df13b52b6eb0334c6e12e51858abfcac","85076ed6abe9b1ca270a37f808075149bd4061991cd8f100b0aa8b99dcca9931","8d1e87d3319a18ac38842dbf9cdfb323625c8587b91cd410523d6affa946f4b3","aa140c6c1aa389188d6baf736bf2f0c2bc88e7e4b208579cd1937f497a08165c","2fba9b7504d840265f66993e8ccbc34d9646a72f26af15158ae5d254e12c76b2","2b22ea4e7bf1b80a3c546c11c5141060f97b08df7777c94b28c2706d497396fa","3b9a7ba9be7f6cca490ae8ce364fff0f8917d9270ac5e27d699d15b9d81610b4","3fbb19eddd9b4133707c768ee8698a25733e950605c397139dbd2891848237e4","7aad51413f9574a67957ea3059bc1a84d492782b20c29456e25bd0f728322d80","74ce7c180ea286eca088abdf63e3892bad276b893848e9d244c8b57bcd864989","3ed62301cf931ae66d79848f6608cc1a40d1bcfc0cc31f74ff13ef39f386b952","07b3dd0d82a4d06a34a2dcbb0cf9a9955cd2ca214dd99274795a8a5ab52c2fad","041d8523e927de559e8c93bd39bbee2e87b1540b968e87558b1f255e1f11ce91","193a838b209e1d9d8b81257f688e9079f78927131e8ac640497c1357351fff44","909a05730f2a5c4540bd58554e1a02ee25e92b81c21dd455216f088438a8aa5c","5a9210a90f01a8822ddbb24aa7b3af33f128223d3c2e48e0b11cd94e84ffaa54","cf109a52bf4cfe89971090d8fe37d4141278224a93a168d9dc9bc5efb606db01","3a8f7f90b7fd61b1345397f17b6114ae3406a1c062e1dbbca5574ed4f259dcfe","5f98ebbbdf28decb75d9586e829ee3cdcf69310d2ce1fde73d852caeeb1f3340","5753e715f051496f758a741868ee01634da1610cb63396c1f7de8796a436a5c0","a04e634f8f48d8ded602650a4cfbafd654e1331dbaacc754262153eb15601b2d","e63e0c25e0e3d922a648512616edd7f0db696113555726f1af2e4ecd30cff7c0","53a808b167566ea6d4b406390789c76b206c8e5c8da0387ce4bb8271e3e4069b","897bc29b9e9f4f3d3ef191efc7a179f28de01d3d77690df4c50a25cb1a3cba74","da57d6bbe72f1ee71f3a8222666785002d0f2906b2b640ff16a82956f8299d63","f3e604694b624fa3f83f6684185452992088f5efb2cf136b62474aa106d6f1b6","ade17a851fdfda1ccd806b8a42c677b1016adcd79ac9d7d17765d0b5ede4a16f","aa83634f66ecff3d444ba981d9f3f148115176d84f736ba25bc86389b207e294","9f3c5498245c38c9016a369795ec5ef1768d09db63643c8dba9656e5ab294825","2d225e7bda2871c066a7079c88174340950fb604f624f2586d3ea27bb9e5f4ff","6a785f84e63234035e511817dd48ada756d984dd8f9344e56eb8b2bdcd8fd001","c1422d016f7df2ccd3594c06f2923199acd09898f2c42f50ea8159f1f856f618","d48084248e3fc241d87852210cabf78f2aed6ce3ea3e2bdaf070e99531c71de2","0eb6152d37c84d6119295493dfcc20c331c6fda1304a513d159cdaa599dcb78b","237df26f8c326ca00cd9d2deb40214a079749062156386b6d75bdcecc6988a6b","cd44995ee13d5d23df17a10213fed7b483fabfd5ea08f267ab52c07ce0b6b4da","58ce1486f851942bd2d3056b399079bc9cb978ec933fe9833ea417e33eab676e","7557d4d7f19f94341f4413575a3453ba7f6039c9591015bcf4282a8e75414043","a3b2cc16f3ce2d882eca44e1066f57a24751545f2a5e4a153d4de31b4cac9bb5","ac2b3b377d3068bfb6e1cb8889c99098f2c875955e2325315991882a74d92cc8","8deb39d89095469957f73bd194d11f01d9894b8c1f1e27fbf3f6e8122576b336","a38a9c41f433b608a0d37e645a31eecf7233ef3d3fffeb626988d3219f80e32f","8e1428dcba6a984489863935049893631170a37f9584c0479f06e1a5b1f04332","1fce9ecb87a2d3898941c60df617e52e50fb0c03c9b7b2ba8381972448327285","5ef0597b8238443908b2c4bf69149ed3894ac0ddd0515ac583d38c7595b151f1","ac52b775a80badff5f4ac329c5725a26bd5aaadd57afa7ad9e98b4844767312a","6ae5b4a63010c82bf2522b4ecfc29ffe6a8b0c5eea6b2b35120077e9ac54d7a1","dd7109c49f416f218915921d44f0f28975df78e04e437c62e1e1eb3be5e18a35","eee181112e420b345fc78422a6cc32385ede3d27e2eaf8b8c4ad8b2c29e3e52e","25fbe57c8ee3079e2201fe580578fab4f3a78881c98865b7c96233af00bf9624","62cc8477858487b4c4de7d7ae5e745a8ce0015c1592f398b63ee05d6e64ca295","cc2a9ec3cb10e4c0b8738b02c31798fad312d21ef20b6a2f5be1d077e9f5409d","4b4fadcda7d34034737598c07e2dca5d7e1e633cb3ba8dd4d2e6a7782b30b296","360fdc8829a51c5428636f1f83e7db36fef6c5a15ed4411b582d00a1c2bd6e97","1cf0d15e6ab1ecabbf329b906ae8543e6b8955133b7f6655f04d433e3a0597ab","7c9f98fe812643141502b30fb2b5ec56d16aaf94f98580276ae37b7924dd44a4","b3547893f24f59d0a644c52f55901b15a3fa1a115bc5ea9a582911469b9348b7","596e5b88b6ca8399076afcc22af6e6e0c4700c7cd1f420a78d637c3fb44a885e","adddf736e08132c7059ee572b128fdacb1c2650ace80d0f582e93d097ed4fbaf","d4cad9dc13e9c5348637170ddd5d95f7ed5fdfc856ddca40234fa55518bc99a6","d70675ba7ba7d02e52b7070a369957a70827e4b2bca2c1680c38a832e87b61fd","3be71f4ce8988a01e2f5368bdd58e1d60236baf511e4510ee9291c7b3729a27e","423d2ccc38e369a7527988d682fafc40267bcd6688a7473e59c5eea20a29b64f","2f9fde0868ed030277c678b435f63fcf03d27c04301299580a4017963cc04ce6","6b6ed4aa017eb6867cef27257379cfe3e16caf628aceae3f0163dbafcaf891ff","25f1159094dc0bf3a71313a74e0885426af21c5d6564a254004f2cadf9c5b052","cde493e09daad4bb29922fe633f760be9f0e8e2f39cdca999cce3b8690b5e13a","3d7f9eb12aface876f7b535cc89dcd416daf77f0b3573333f16ec0a70bcf902a","b83139ae818dd20f365118f9999335ca4cd84ae518348619adc5728e7e0372d5","c3d608cc3e97d22d1d9589262865d5d786c3ee7b0a2ae9716be08634b79b9a8c","62d26d8ba4fa15ab425c1b57a050ed76c5b0ecbffaa53f182110aa3a02405a07","87a4f46dabe0e415e3d38633e4b2295e9a2673ae841886c90a1ff3e66defb367","1a81526753a454468403c6473b7504c297bd4ee9aa8557f4ebf4092db7712fde","cb771b725fbb72b6abaa649849def3a26f1cdb6f7fd2f86f929d789b154592a5","3c552fca3da55cca6a47644e45e1063bad60e2b16bfaaffb9df82d86afe48261","a15abe49689542786b57db939144b9da2371623c053236bcfe42728f1444c962","3db9223ef1d787b47e08965bdb58c96d330454d9a2a006a3581b434610516d73","b932b100fe0e174ccfd31a63665a67c2ec4ef58cc474637488f0de1680d80941","bb263234068fd7a6168e08f8383adbcc6191fbb89b6823ef5433c6ac766fafa5","b967935627efcdef714f0a07ecedce1641aa4b3a5f57a7b1fe2b7d7afc033c27","8331de9bd5104cf8f6c816c3410950b80cc304b9a24cbe95a8fd811d85c5c046","de73ba1b9157967c7b091a3173db0c0135666e7015d59accf3b2b09a879fea4c","f74e9826587bf4b600656739e68b3d41f51de49b0c28b5933cc8aacbb9243c0e","3f4ea47b7438f0469e74fc5e197801ef0c1da053655167da6b08874acbdc1aea","896f5af4415fe6086799a9f2dcf94eea4bee64e1aba45d3a774196f3eb77dcf5","ff07522afdf5cafac6076861e429ca96c7833c593bcac68b67ae653d3ee51f9b","2c5d8017ec8cb7f5afdf89051b2e822ea425cebfff78a5fe864e62ec48b43d9f","e80bc754edc842893c8762f8d8d74399f9aad317529914a5a561a23dfc49f1ca","a1e4cc074fe4c84876860a8b41a118a47914a31e7feaf29a0cb51387e6cd83aa","0cf150b527bfe9951d5c9942379c1cb40a8aa2b3154e13c4732b26086ec80c0b","440aeab534d0c24fc156f302720585d08795647e6cae0bb7172e0110db8d44b7","5f7fa240fcb0f9bd7af2c2c3e8c4113160efc0ff1e6e00bd8250630a3341847b","545fe6fdfe04ca9b82bdb659dc24e1de4a60456ed802b635ba103a6e53f1ab19","9e755713010e97c315200b9f97c3b4f6faa7e2d8f573601f4b56e9ce462c9340","a2472b2bf9278b244c6dc27e3b91ae22d8f45e22b2371ebe9a4589f0e9c525b9","51a72e9118c898b3d8e2a5db9616bfd8fb0492b30e2c721b8309dc2fecac5049","8961c78b9c29411581a13424749a94a8c5f499086a929dfcf2eaf2a28bd0e1e7","0c238ffad8ac6f4be1be79c909937a723516e5a38cc15377f0511cd48566e3e5","0e658283180165f495b0967bdba03bd1c08daa63677216069adcde752bc4acb2","9a8f42036a42120c39a5d384abe92bd47e187b3a50ed134ad23d12b479af2697","97faf2f5042e998abfd4ae4b65b6e9807ebfb4b3484afeeef2a688ade549ae30","0d53e597adb0c3d1d2db4b5e5324150a509c6b31bfa87be53fba9b0b45ae6a6b","7f70b7f311e3ffeef82c2c7f63b1ae875c139443a91dbf0f9abb236ff331a1aa","36ffedc870284ea24bed3ca6acc45af3965e30fbfb89cdf4908b3b1c0779e48f","492e5e13415337aaf994ff986448e2e91e0c291033ad7d954cbd515a59ef18d1","6f89c63bb9fdd5c03b25a96c5b5fbcae57eb1ca8160e9ee1677059c2b7b7e5f7","fa3d0cd03fa17459d9ddd98b120b4bb084da39f0391cbdce480a6ef74be0cc7a","e3fd84e6470b7e0679c4073ee5ce971d324182486dde5a49b67cae29168b51d2","dd8331d0a5190a4735ce6c152e420230188c4966067a756673c36dd7ba72b10e","d6db3bf60a324f74ed9c1281acc1543734be70ac0ab9a8dc953a1d55f6906720",{"version":"34707bf55a38f69fdaaaaed74907c81a6b186fcb206cc50e6f8862b36c08730e","affectsGlobalScope":true},"0f882d4ae58f431454030289154feb0132e1b00ca5c3197c6b749bd098aed73a","7ff7f4632a6e7b6872fb1843f3c0df495b49840eae2a23c6fbc943f863da8c29","1e352dc6863536f881c894f17c46b5040db7c9423a18957a8fbc001dfe579b78","a78590b0efcef281236e3234520c348d63be1d4561b63b20e6c3b6fc18b37dfb","4d59c6a10b6c79a0927c79efa89b3c9f71d174ec14ec2792076cfd2330d0cf8e","a496f51933422872de22729b7a0233589325a1a1707cccd05cd914098944a202","75b6663bc569724017997481b6b3774065c204b316cb4f5ad7df3b5162d2dce1","06a38095ad4368314366bc08f7cbc0fe274ef7321ec611005d0bdd9c6565e4d5","4599793db9aed9b84677f0ca1cf7ef3c69bb91cda4fe4329cbab778ca4d80a58","ad0028f96921778931fb8419d8de33b10908314fa99699de1702020f69235da1","ccd2a35321c0786bd3808042dc43b960cac13f2cc660ac37a0087e12bc97d2fc","df524ed01de4f19efb44bded628dbba9f840148be4b6cfe096e29d4b01589de3","2e3981b9cee48174ff85ae15019fd72933f7023a4ed05094740f7e6f7775623c","836ebdc3b9e4c006acc4f405b7e558e56d47830e05c40d991b1e27fe8bc91157","2cc6b617c6120ba64b5778ccd4b74c951adc3a3941bb6b39f47d48701c44af39","eca02b99615a8f1652e21399d832618e38bf166c0747c9247349bc901a2f7741","7f7d6d42e5780e86f5b860a6f95179fae06a368b3af28c1c4230397c47021a59","4740a7d11ab3b381be0f269f1903fb3ff226a2fba55a01756b2997e67cd853f2","863dbc4e77f0353e6f9d6bc0e2b4622d5c07ff6f099ff66cafd7924b2ff4dd3f","bf034a18ed7e2a058f9e48c4c2480a124138fbd3586a80c77736a9ec079d12a8","f88758992a0bf13d095520aacd4381fb456ff121fb9aa184e6eb0eecb26cfadc","c249e9ae33bfcad97deec3c73c9ed2656e112fbdf22deace0b39724be6a5dcf0","d8b45924965c0c4fc0b946c0b6d597aa8d5de9cdf5c727e3d39422d17efec438","c6f72b9a53b7819f056268c221d7eeb14c26e2582aa1547b0f6922d65bcfde72","feddabf6ab0eb191e721f0126f3db8688db97c77a1234968bde7a2d70c4ae513","a968efe0db090c2ed75ee8c77162534f7ffde3dfa9d9ee9f79c47784c43df96e","cde0568b836865a24f4ee5859462004a326dfb76d514e6f56c8e78feedebed58","7f5cb3a03588ed46d52a6c2138315d930cd6ffb5c2134247cd07bc23cbea0b5a","7797f4c91491dcb0f21fa318fd8a1014990d5a72f8a32de2af06eb4d4476a3b5","f39fb20b83c3f9853c13d4ac95533760979d3023c0a5affe2c0a62d91ab3afd8","e4fca08aed8afb32bb8643d7469810bc8681115fe398e56a028df9e73b2d867f","8a59503e8c995d688174ab27cd32c3ab6afed7c41cb5282aee1e964f7d7b863d","078966067552650f44ca96c68eddbb8539f30ee48a9ab3f24abdcf0a4037b535","2cd6250c43dba360377481c98d48db6ab1532a7527339edb0deffddc28ba66b1","7a9d600990fbe263a23daebed9ba1bbc5761e45679a7e2b2774a42756ef077a2","66bc155515fbea8c31a4efccbbac44de7c037b01f3aa00b76312cf7252725d30","5703288ddbfc4f7845cdbf80c6af17c8cde2a228757479796c2378b1662fcd48","0dfd353f0c16dd5107a7e0713dc52d0a2538293b0a0eac6000a017f9c0a60b56","9cd683a4663ef4d9c6486f1b8a34c73bdbc344d69490931bfe2fbcada12ab35b","42f6a409bad5259ece69df25d2b8ace2ff2ade45fe6386ee45203bdd9329f971","d3b1a8b87a5e77d70056325e137a0e04d984b991546fdd3c1034ff4102d603c4","2eb162efd6dba5972b9f8f85141d900d09da4fba23864f287f98f9890a05e95f","3f878fb5be9ebe8bd0ac5c22515d42b8b72d3745ef7617e73e9b2548ccbdf54b","e9ed562b7599c8c8c01595891480a30f9945a93a46456d22ee67ebf346b7538a","e7bf975a98cecefe2e8902fb7da9314675ecdce553aea722aaec97327668e18b","3d36f93648518338c875d9f77a8eab52905365483dbb3afe43ed68f1b712b67c","4fa54df9184d291bd78b36f5063372042cd995460e906cb14014e40d1442a326","b4e32bd5e3b493e4ea6b5ec69a4c02aa1fdaa78e1df9a863bb07604de8f9d123","f6bd1aa152ca2b5064e06282ee3137842ae6825b6b09aa89a2ff063b976a56f3","bce2390bb3a76f8bf2ba4397c66db5277bf3e698ee614347e5eb79d7fc0942c6","fbdc8d7cc7daf4101bf567512c67fb990d8fe300e0ba7f213171192177f44aa0","298e0da6d858e39fc0c1eebfa4f5c8af487868c6f2e98c3ef800537d402fb5c3","3b6457fb3866562d279377f923cf3758c80ed7bfcc19414b72a24d0a98188e0c","4fb5d7efb3520b92c1b767ce18968057c5e70886d7fb3416c487231df9275af9","df2303a61eb57b2717d17123e82bc0f3fd60f6e4673cb5506192dfe23c9480bf","b104960f4c5f807535ab43282356b2fe29c5d14a02035c623ac2012be3d5f76c","a35ca245eb852b70b20300546443abb1fcbac6e5066e4baaa092af4ea614d9b5","55da140feab55f10a538a9879a97c4be3df4934cbd679665c91a7263a86095e1","1a39e51e3362aec7d4edec9b317ff83916fe0471f86ddf2d3ef3af5952e87d9e","4b3f36b96f129a8e125c91d41a05f711e73b3285f80bceb3a1aecb13c97c4502","852779920fc4220bc42ec6d3c9b6164e23ea9371a788531b48b4005fe0cb4392","6863aa26d38fb3c96d7b04547d677967d83ebe421a093e4dede6fd48ad23890d","515b97cede17d91c9669cc1c7fb7a8a5f0a5f2d8999f925a5f70b4ebea93723e","08e8e57241f874bdbf69ab2b65cb0ee18b4183d5c9452937da49b934fc679c4b","944af466f063d4bd090ab9d988c620b90a014e919d5f78963f6074a136ea225e","644addd4811636da491c9546654bc005ba8599f23df6d731d91eba86f3137fc2","a9249493114b181814728cbfeb7234738193a4169b654ec4705d48d7a4d25222","aad6f20d6eb01192ae02294361faa6e1f320d72447b56f433db853bbe80b15ca","876fbedec2f494eb6f834ce8636b07d581c657d205d81a3ba894eff0facc6b84","58527aa45f11c9b259a6a9d78b397f35020bfbb104f4d3bb177039b5c18146bd","91b8b61d45b5d22f3458a4ac82e03b464a0926bab795a920fe0eca805ec476eb","2744532f8fb960eb78497ac660db719f503a10c801f87131d26fd9cbef75dcef","6884287c54891ac19cfbe056f3ed29cab1732a00dec69bd3b140ce62c11783c6","223fdd3984d951378c7febea213b287ee04ee013f065a27905c3d75df85144c4","cb46657d3237f80742d5701ebcced8f6e5cf8938442354387d6c77d7048dfae6","3965c8ef8150ca688978430a13db460d29a50afc50c97315c723722b6f763369","661f322e45545a554e4ffc38db6c4068a66e1323baf66acb0d8a9fa28195a669","9d787416f04d0867e8a46c317056f6ad365e328074c73fa3a1612285fa24465d","ce978e20a6f26f606b535f0d6deb384ae6a73f8d0bd0dfca0925f5317cad1f25","f2d3567210ca4d559d8297d6c4402599c93e3bc7485054192d38db5e132fbc0a","50d22a2dfdbf2dda7b333edf980566feb3f61813695c8f3b52fc866c8d969404","bdb95f4b6e845ec1c0ae95eb448c55a68a2752473e1d2107348abe40421cc202","ea546a7ed9eaa71ba78d4d392509dadea4bafed283269dd6c4b09e7d8824e986","4ec0f2a141a9ae7d3557b8efe630ac2021bc3a9ac61238b59293f4cf2f196e82","b2db743c71652e03c52d51445af58d0af3316231faa92b66018b29c7ba975f6c","0863a5876c85fbaffbb8ec8aeda8b5042deb6932616139706d2b82cde9d3f7c7","12f8b72e3c3a333814f4fa87d5b9a7ef1ece703f3b7ec7919ad2ffb58c48c1db","ba9c46725e2a0bd9df59d3a1e801cc60f90db3ef7817131c53945dce2b8c0c56","281d373eeabf80c4851f8de991e6abe4d385c30379d80897bbc3df3dcac99cee","624c5dce95672d9dcca40d9d9d82ef855f5f902292f43aa265cc8fd963c6ce84","8a48d9c6184992d1c3ed5daa55f83d708c37582916926a5555a900608f804b60","605dd288c636cf9b5317fe76dec75d3c7fb855fdcd3ee8cb4fea7d7091ca6fb4","95addea67857d4e568a02e429b15458cec203876b2ea5f5ea18ccfeeb91b8ce0","b5a615b0ad865ffa562980a10bda162ac1744fd363b4edc2cfc664222071cbcf","bbccd721363897950a55ce09529503f25a69522e5c91a22679b66e941e5f8654","d3a1e70795c38d7851b6e4f3b441c5ffdae171d6e2576a2204b7d79059aeea66","d7b8d41887c5fccfe19802c4336d34348b752abf0d98839575699d71deff60be","063fe3004728b8516a4d799ee16f9a71801ba24e0443dd98638cef1bd4353a7c","0267341e780d4967cbd069ea57db7aa4e1fdfe74702ab0366a7a4c1da0ca332b","ec5a0291f1bcbd2662640e7a6ae0a632ce8f0fd55c02236bb43203f38436ca36","7ffd42ac60bedb9b97e7c35b48af9f71b0a2289f3324f414826eeaea937d144b","b20bc124abd8ee572d0d756713ff987b116cdae908a6fcbc40e80d4b999f56b4","a599f3f450ad62c3fdc0c3fd25cddcc9332ffb44327087947d48914a8da81364","645dff895168aa82350c9aa60aa0b3621b84289fef043be842f45a9c6c0ac6e2","f068ff5b7fb3bdc5380e0c677e21de829bd25cdac63a9b083fdc220fcb225280","09d2fdca6ea6c135897a26976ad3c0db724adaf23ef4e38ad852b1d8efef1ae6","15de5b7739bf7e40213a200853bf78455ee5958af08eda786605a54a7f25ade6","aa31b69fc0094a66e771e189d387ffed138b53b211903f96ca3737792f69abdf","37862e711637ebd927907a82cbf0143ea30e95eb165df554926c43936b1d77a9","89e253db2c2cc9a510c521f14dd2b1aae4de2556ee5159ad8d118d3587e3a880","3d0a172cee184a0f4111a7bd7fbb8729af3f54b30c06a2677d85c20ea9c811ab","d6a07e5e8dee6dc63c7ecd9c21756babf097e1537fbc91ddfec17328a063f65d","6fdc88b1287c276b55b7f7c4c7b49587813c763eea9751ce0baf0a7e61cd5d89","6a02443704052768bd021f24783aa104b02ae4444e9b735317bf13c6b857a11e","37987b0fe9800cf25473c882ce07bccdab2763c5681c1a2d16816aead46aa8d1","c84c03c721154068e1a60d83e9e85819bd3ef70b824ac2edc498aa31c06e5781","f4e5b4def2ccccfe43c0905074695c349230505faf6ae74a28b0c1090acfda7d","c96fb6a0c1e879f95634ab0ff439cbb6fff6227b26bbf0153bef9ed0aabba60d","db936079fe6396aad9bf7ad0479ffc9220cec808a26a745baebb5f9e2ef9dbc7","06bc0b9cc7bf0b92534f1517fe5adde1f23f60cc6cc5c59f8e1c65db48a40067","919a753b0cbb12ccc606c62e2d34884d75a48ba19b1dda497c72621b11dac088","2c27e33ee0bf722988da00abd582cc9b806ce3fd9153a864800a339ad13f3fcf","92d7b3a5aa5dc872e54cbad2a7094b3ea4f72c7901de1d07b4c334ff658297f0","7a52922b38e9686d5bdc6e75774929eec6688d26c1dfe4a03ddec77ede468e87","aa5efca2833d89b55248f1889a6433dab1b1f41768e9a75f8ce35f9bf56c5ec4","f3cb934699bea498259de69c44a4f93b461f079d72cddb041587afd9312efb6e","006855ddea8674d084173a768f88519dc154be94eba5e2120262a33709832b9b","17dd843a266f99ca4b3a1257538bd1cc69dc5c7f2f23c3891f0430615b8c9c1c","5430364886c721a30475253356162b6c27871718094cb3e69e2bcea71a17e533","1218398da7c8dc4add10bdb3aa2856aad54b123d847eaf574d1d694ac269bfb5","07886b8104556bcc9314b90cd2043f2286e54c1f6ba2ebbc953e1e43232e12be","b637cd92688a6cdf4f8f184ff529dc2bc7f15692828e2c0c66a60e6972f400c7","7061e83d6792897077bcac039fccf7325234004769f591c63a8cf8478bf551bb","51a74c09c3d3fc62fcfefed0a193c3d6388e3e0f8a574bb9d5c5b7cdaa32453a","277a358d61376fce7ac3392402909c96cf6a0a613146549fc0165ccff953e012","50614c808e099a1d4413786f3783d9eeaaa74b267f2c87fcf8a893287e91c301","f4cb6530f248e87cefa74ef623206fec805f6252f885f8e14ef3d1a5872cef2d","38c332caadd8391566552395d592076470a5e7423f70964620eabf05c02907cd","eb17b5bf1fc763a644c21d76572c0e41e351c3f6dfcde649428d5d829f7294d2","cb124162c87b29ff5121e3ee5bb29c782f101e0135d6c2644ab1b31d530a435e","406d6f5d3707c488362fb40d1c1f8a7b0a42b70554b427160185d93e430228f5","2e9776410c5bc290d9432a9215c67398a273e514a79b9e15f32ecddfde8a03be","313ff8df074b81d3e4f088ff3a3a06df3d9b0d0c7f55469ccc2ac887ecb6b867","c718475bca06806cc243e77777641cb67ba68f2c57321a4773ebb47760a3bcf2","96e6bf811343caab5112b68880905c5d20d9257054afac6c18e718a4c549ed27","a2793bc73ba63ca7d259cb0f0b61d0023820170d08a1f9715006c8042d060165","d5011b38165771fdf75a9a06d6d379a1fc7edd7eb695ebdc52319fb6e3c6d81f","88417fb19d339304e9616a38ea513251047c9e300c81f9467fc317df8a582e71","3e8e2d132f726dddbda57819f5391504e585cb3beab6b32203064e7e40618583","6e23627cd3f10418b5b2db102fdcf557b75f2837f266d88afac6b18f333bb1bc","866046dcea88f23d766a65487ee7870c4cf8285a4c75407c80a5c26ed250ef8d","019f4f1cbc781cc15c6173f8be5ef907405722194ab297127b3c3426e5368339","41f4413eac08210dfc1b1cdb5891ad08b05c79f5038bdf8c06e4aedaa85b943d","c79f1c8b51d8475dde8d2973f740f43ca34b1f0a95d93649cd76c1ee20abba19","35f0d2bd2c5c05c0cb19095bf5b7c44365b1c88efe6285370855b90417277a64","8264b129f4c4eb4799703f8e5ee2223a184d1cdbfc782158b1f40a88a4435a1f","527ddda6f8be1279f3294714534c49d6e90f238cea325519882ebf88d7ec5bd2","b23877792e8bd00271d0ec5d401b68e4228540a4316de3d9dfb697b955c161a4","35b2eb1de01633db90d41abe93730b29984856fcc840b4c2801bfd3761a2097b","95f0c9127b879c2fc7e31f8e09ff45bb4aae302e60f4b9ceaf4d9ee6bc51ec66","2a6b4655a6edce9e07c7d826848f72533c9991d40bc36e3f85558ad20e87ce2d","6e3d29fdc96ebbb2ac672d2dae710c689c1ea0d0e9469e0847616f3c38fd085f","d505055b8fadd42da235c85947911d8d198ad70c5f5775991e7821d4f89c90f5","8b5a5852099dca7d7e7a7cef6d681dc1586aafacdb963ca180fe5cabbfa3a24b","0d1aa3341d1ad2064adada71c5d01a2f572e4aac09410e5616d90894105a0eb9","52494ca5a884da3bf11b8165ab31429715f0970d9c6383240c5666f4bd713e01","162fafa2291749df2ab4516854aa781fcee1d9fca2ecd85fb48ae794c0700ce2","b4b9b51ee6f6309cda2e539245235a8caeca2b1d6bf12b5e5c162d17333c450f","d2ffe8356f060b88c1c5cf1fa874a4b779fb87fd1977084876e8be9eab6bf485","c76053984b39150d00ade365b096a8bc21a4a7f2ee9e0a926711b00f8e7bf701","956b510767e3d6f362ea5800510635197723737af5d19ae07ee987ea4a90bfa5","cd1a8ff61f5063d7e6e2094e25d35c90b499961b63911f2f4ae0ff5555c2b4d7","1cf09b5945779e9bc75c4dcd805fb149c28fc90da3335186ef620647a3c540e1","9cdc0b9a313090ec45b34ea1eb02fbace433f509e753634b043e9b83038261e6","c93474cff0088351a65d3cad24037874a26a5371a48528563e56efe31cb3d8bb","b4580df8ea7f62d7b06588001952bf69426e6b03cf3d2569f5f608e45f29ba08","de27f7bb9be9d8a2b4557ec6503b8a315f74d598ce9a0ab81b5ed5610e1a8e81","fe3c378dcefa7ed8b21bd6822f5d7838b1119836da75ae1e1fb485d27b8ffb62","7365bf3333d4277b6fe374ed055624e5ec080dbb919e2d78f1cb75a3f1a4b4f6","a5fbf3bc5c16ab5c84465ba7a043a4bee4c2b20bd3633d50d80118a3844edbaf","0923e4ac8c894ad507bd2daee0df66b699de88467201381ece011ba5a080e1ff","e4f6626f827ea509255647e1b6db82145a2eb1a6b46202655e7d9bb19145c33b","26e23972c40f378f0301d8d7025ea895557c2865a1a31c8ea9c3fff0dbc27075","818469e2f1c49f6cf6f220a81df013daf6e4dc4af7f9c0890ca63ce06d7d7299","26e8bcdc1ee444d9d7f9af007e956fd0c2011302670fdfd2c08aa63d71dffa05","9a4e44028bdad7131c8bc4d2dd6b11c96c73720984ef0fa5862770ac924f698e","73b70caa5e573babbd422dadbdd9fffe7d0561fa5dde7390f7eacba7928353c1","2acb15ad887e646d3f2e124a113aae2dbd9b4e8613577fd6342a7ddcded72586","3d862d4a5666b98df230fc886f09ac21d840a858cb2a7ea75dfa7ec0522d242a","6c5e3ab92fe672d2b0e2344a775270852e6572497b0ed92ba86d79133662d7e7","be5fdd78c5818f3a1f91c5ba49505c30289b3a343dd527fcd322e7294f82b570","25bc80fdce8d0c51cc70575e64f0cd4bbc07c29574dfd850eb0e7058e71f9412","323974a3499d92ba680a148ca92581725e6c9b9ad05426bcfdfeb253a0adb1b0","3cc4f399212b85dca0c166ab18b3e0885288e9b9da8cce00de221d4cadf18b22","260e66327b06d86eb77c1c52197aadc42e209044ccdf19c863302926f15c8b66","0d5f2f526a48952639da8e5d8cfaaa36ccbbe20cd97ae2f430cf67869a98b508","b582de0d5211b094b4faccc7994cbebd056d583a86f4388e311b4c3f5c9a57e4","a4af2de09e21ab4f9ca9458e542d394dca9c9e686d0acc017bc4491d18deb772","1274ebf1c348d8e12d554e5258f05216a9c3f4d85204ffdd520f51e4a56b5e9c","e8cbabb226fdf636af1a1f0140bf400a9d3a2e5f2126ed505f2e3f8986b3b2cc","80435054a4a72f618ef7ee1a668a2f2c4da712fe3f20d832c1bd5c1f6acf53af","3f176d426b9c989b0a78dce995d57e7630ded5bdd1f0e671cf9c11af4d90bd83","e71202e1d8bcab6956fd128491486d3c9c4f95c58db2866893a466936e31e7fb","0e55be2971162e3d0f33ea83ab96ebee30a35721cf65eeb16bf9a06b8571cd45","7f8729b3fbc68075334bcafd1452d312986353432f849722d43581ddaf8b14b6","4c0f2095ec85a8fe9ebd082eb3e325ac14ee8accac78e0724ba890d3d02c2fb9","9ea560b1581b82cbcc5d6b4b621f5ada0434a9632b803fd19be85b407ab7d9aa","c1be2db530e1b24787e68070db08b66cd37d891a0402bee37be47fc24507dbb6","4dff787c8641b954abb6e7776c9dbc0bb22366d1f90f6e971dff847ab0479138","e1efc6e6f6d3ce363341a12ab46952b0ec4360878b500aae5ad16cd502ee78f7","fe3d0dc9bceadd3a4a3f9a49dbeba73b514278b4a77344246002725fd8567e35","e7098ac93067e40b98755ef2e35600e71913abc664d23bb0697720d0d95b0cd6","f6386b7e85b62f9b50956c51a159a0c3dd69198499e721cbfd878fb9f10f84ea","6733ae88d1a77972531eed2e88411b276dc684cb7a47c70a8e73e4eb39859c31","d8b640b08f9cd0461f2cac988ad0daedb4fc04cbc9aed2453a94c4755688bf1a","b4150a5abf6127a391c7c6255bb594d099c7e930aca49651603eeeef99d58adf","dff74648f275fcf2376638677b7bda57475e88dfd53d0ac711e72b5ae85b7dbb","77b43f667dbfd9b7501a1ba845365cc2f230e5d0522343d63cd6adbdaaf40713","98ab2bc7ff8c63f5b75a9d5d88206aaf78ccfc86afa083a4302b570555872578",{"version":"bbdf156fea2fabed31a569445835aeedcc33643d404fcbaa54541f06c109df3f","affectsGlobalScope":true},"4c68749a564a6facdf675416d75789ee5a557afda8960e0803cf6711fa569288","6a386ff939f180ae8ef064699d8b7b6e62bc2731a62d7fbf5e02589383838dea","f5a8b384f182b3851cec3596ccc96cb7464f8d3469f48c74bf2befb782a19de5",{"version":"ef8a481f9f2205fcc287eef2b4e461d2fc16bc8a0e49a844681f2f742d69747e","affectsGlobalScope":true},{"version":"2c40f394d89f4d52a24074262b878d7574ba2a8e340b764376b07bd64914b96b","signature":"cc557b7f18646effdd0129635de78fceff574075ed02340952e5a6f93b587513"},{"version":"8025c4b8c5d721421177ac56419d39394432889937914a5ab158a20f3f6f28f5","signature":"6901479dfa7356ba0b2dda1a12a8e0087bfd289cfa3bebe57a076794f0bf7db8"},{"version":"548e72b5d47fdae5308e67002f65e2ed8aa405b1a6e7aebee024c6267a51f312","signature":"b1e10333665e91484e064a4a2284d607b03a3346ce5ccd0202d954bd129c4cf4"},{"version":"5b9156330e60f94dce65641f29048f51d4abb597b79b0228f7be6c9a838656b3","signature":"a1351756ae8ded14746c8b4dd2b85a4b865b0d599b96e394ec68b38d324a52ed"},{"version":"1807c089826349aebd31514da009d0d940109225fc6276db4314c6fc0771c24e","signature":"46c76e9a01fd041a5f3316889939284ad8875e94e3219b9bc75fba0c471443f6"},{"version":"bc9fe2a6615ca8ee0871fd5c192e027b4c22968b58c34cc37682626e775b9737","signature":"0088b3227452b76a5c46ec899715e6be615cac84b7149e839f59875f0672f4bc"},{"version":"25653c05d95a7660a14d0acf053390099c5a3133fa90745f15f5d42cd902d050","signature":"47ba9b1dd6f06248dee228a6700523f53224f9acf675c4b6adf01262be377939"},{"version":"ba1d3521c26f1d35ffc108cd888362a1ad2f0dd0f992d55a9f31ec7a169eb80a","signature":"48b8472ba07168bfe4644abb9c09490170d1eed5cef7b2d8a49e4b0a2537f1b2"},{"version":"0178eb9e68d00e473f8c95ac6864bb5696cfc8e7d5a3b1e4bfa98d882f9db660","signature":"5a530a0b37ac88582c108d9e278868fe087454968e7cec3dc1e3c1e76f97fa78"},{"version":"832a0a430bd3e48cb2bf5339f45e4e04504fe5509180bd7909ac94d311b03b21","signature":"1faf70174771b0d0cabd91bb32bda6f75e97d1a17466822d79717a184efbf246"},{"version":"0a7efaea8c9950f51f8edf63461ecff8faa5ac2439b263ee3a5d98f22966016b","signature":"7f81e4c3dc410ab7bb82569e427c2eb4272d2f9c99f12363894de4d5339953b6"},{"version":"43b7d9ea83657be2450276b06213db6e5d463717a807770c0a4a7b993bc24325","signature":"29fcfc078cc217e65f8bac67f1f1efa9a34e9688f660c0e403770136b7391384"},{"version":"b5b3644a27a309fab91df05e91162729af73d7ff13ff55ebaaba18ddd9101653","signature":"e1e32795005ab924b790da7b9ca505f10419f805abd9d65146ad66b2de8b843a"},{"version":"e9789d9675a8ced5f3f6daf69b2f82d2e31b0809c31413a7fc1ace0a41a53df5","signature":"5af3cc4acabefbc633ad99f217d767a11d3ee8adbbc839ff560690f8a643826f"},{"version":"82d613bb356f13249a402e40cd27e28bb2e4d4d8fbd32f7ab45bccffbb414c62","signature":"5c42af92e1e1c879f812fab5b8c2e6bd65051b7d350927c2d09034cd52bcf1ba"},{"version":"2a744b1ffc6efb0084118b091d4350b2cf95082778681dfee1b990abb5785ae8","signature":"2bb709cfb8588d10b3a2779df21ce32ceea212680594fb5fbebe2e93eed9f3d9"},{"version":"8f2b47156d612681c2f597ddf99799967e6667cc1cf2c8967d15e1860f50387c","signature":"4e9e37244d689be1fe690f7d88e953ed385734c3d03673ebeb86d0f0990ed256"},{"version":"67020fe59243728b17e5568df770ad65fa8aaf21e5dc10bbcc5b534d94c7c2a5","signature":"bb043c0cb3e385c27c8dad2410592d23ca01847ed627cfe8b64b5cd97c598f6d"}],"options":{"declaration":true,"esModuleInterop":true,"jsx":2,"module":1,"noImplicitAny":false,"outDir":"./","skipLibCheck":true,"strict":true,"target":1},"fileIdsList":[[55,60,131,138,149,164],[55,131,149,164,165,167],[60,131,164,165],[55,131,149,164,165,166],[131,147,153],[131],[131,165,172],[131,218],[131,164,165,166,167,168,169,170,173,219],[46,56,57,58,59,131],[57,131],[56,131],[56,57,131],[46,55,131],[60,64,131],[67,131],[70,131],[60,61,131],[61,62,63,131],[60,131],[84,131,150,151,152],[55,131,149,150,151],[55,131,149],[60,64,131,145],[131,145,146],[60,131,138,139,140,141],[55,60,131,139,140],[60,131,141,143],[55,60,131,141],[131,139,140,141,142,143,144,148],[55,60,131,138,139,140,141],[131,139,141,143,147],[55,60,131],[47,48,54,131],[49,50,51,52,53,131],[49,50,51,131],[49,131],[76,77,131],[55,131],[75,78,79,80,81,82,131],[131,231,232],[60,64,131,147,220],[55,60,64,131,149,220,231],[131,156,249,250,251,441,444,447,448,451,455],[131,441],[131,452,453,454],[131,250],[131,442],[131,240,241,242,243,244,245,246,247,442,443,446],[131,246],[131,154,223,239,240],[131,154,223],[131,242,243],[131,242],[131,249,445],[131,240,242,249,251,441,443,444],[131,249,440],[131,444],[131,250,251,441,447,449],[131,248,449],[131,156,239,248,251,441,447,448],[85,131],[88,131],[89,94,122,131],[90,101,102,109,119,130,131],[90,91,101,109,131],[92,131],[93,94,102,110,131],[94,119,127,131],[95,97,101,109,131],[96,131],[97,98,131],[101,131],[99,101,131],[101,102,103,119,130,131],[101,102,103,116,119,122,131],[131,135],[97,101,104,109,119,130,131],[101,102,104,105,109,119,127,130,131],[104,106,119,127,130,131],[85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137],[101,107,131],[108,130,131],[97,101,109,119,131],[110,131],[111,131],[88,112,131],[113,129,131,135],[114,131],[115,131],[101,116,117,131],[116,118,131,133],[89,101,119,120,121,122,131],[89,119,121,131],[119,120,131],[122,131],[123,131],[119,131],[101,125,126,131],[125,126,131],[94,109,119,127,131],[128,131],[109,129,131],[89,104,115,130,131],[94,131],[119,131,132],[131,133],[131,134],[89,94,101,103,112,119,130,131,133,135],[119,131,136],[131,476,477,478,479],[131,177,178,182,209,210,212,213,214,216,217],[131,175,176],[131,175],[131,177,217],[131,177,178,214,215,217],[131,217],[131,174,217,218],[131,177,178,216,217],[131,177,178,180,181,216,217],[131,177,178,179,216,217],[131,177,178,182,209,210,211,212,213,216,217],[131,174,177,178,182,214,216],[131,182,217],[131,184,185,186,187,188,189,190,191,192,193,217],[131,207,217],[131,183,194,202,203,204,205,206,208],[131,187,217],[131,195,196,197,198,199,200,201,217],[131,138],[131,171],[131,220],[131,156,157,222,223,224,225,226,227,228,229,230,234,235],[131,234],[83,131],[74,131,236,237,238],[68,131],[64,131],[65,66,69,72,73,131],[71,131],[131,233],[131,154,155],[55,131,153],[55,83,131,153],[131,147],[60,131,149],[55,83,131,220],[131,157,159,160,161,162,163,221],[131,158],[131,153],[131,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,268,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,308,309,310,311,312,313,314,315,316,317,318,319,321,322,323,324,325,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,375,384,386,387,388,389,390,391,393,394,396,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439],[131,297],[131,253,256],[131,255],[131,255,256],[131,252,253,254,256],[131,253,255,256,413],[131,256],[131,252,255,297],[131,255,256,413],[131,255,421],[131,253,255,256],[131,265],[131,288],[131,309],[131,255,256,297],[131,256,304],[131,255,256,297,315],[131,255,256,315],[131,256,356],[131,256,297],[131,252,256,374],[131,252,256,375],[131,397],[131,381,383],[131,392],[131,381],[131,252,256,374,381,382],[131,374,375,383],[131,395],[131,252,256,381,382,383],[131,254,255,256],[131,252,256],[131,253,255,375,376,377,378],[131,297,375,376,377,378],[131,375,377],[131,255,376,377,379,380,384],[131,252,255],[131,256,399],[131,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,298,299,300,301,302,303,305,306,307,308,309,310,311,312,313,314,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372],[131,385],[131,450,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474],[131,220,449],[131,458],[131,220,449,456,460,461,462,463,464,465,466],[55,60,131,149,220,233,449,457,460,461,462,464,466],[55,131,233,457],[131,220,449,465,466],[131,220,449,464,466],[131,456],[131,460,461,462,463],[60,64,131,149,220,233,456],[131,149,220,449,457,458,464,465],[131,457,458,465],[60,131,149,158,220,233,456,475,493,494],[131,456,481,493,496],[55,131,456,492,496],[55,60,68,131,220,233,456,475,481,492,493,494,495],[131,496,497],[131,481,491],[131,475,480,481,483],[131,480],[131,480,481,483],[131,480,481,489],[131,480,481,482],[131,480,481],[131,480,481,483,487],[131,480,481,484,485,486,488],[131,480,481,490],[83,131,149,475,493],[233,456],[456,493],[55,456,492,496],[55,68,220,233,456,492,493],[496,497],[481,491],[480,481],[480],[481],[149,493]],"referencedMap":[[165,1],[168,2],[169,3],[167,4],[164,5],[170,6],[173,7],[219,8],[220,9],[166,6],[46,6],[60,10],[58,11],[57,12],[59,13],[56,14],[67,15],[68,16],[71,17],[70,15],[62,18],[64,19],[61,20],[63,18],[84,6],[151,6],[153,21],[152,22],[150,23],[146,24],[147,25],[145,20],[142,26],[141,27],[144,28],[139,29],[149,30],[143,31],[148,32],[140,33],[47,6],[48,6],[55,34],[54,35],[52,36],[49,6],[53,37],[50,37],[51,6],[75,6],[76,6],[78,38],[77,39],[79,6],[83,40],[80,39],[81,39],[82,39],[233,41],[231,42],[232,43],[456,44],[454,6],[453,45],[455,46],[452,6],[251,47],[443,48],[442,6],[447,49],[247,50],[246,6],[241,51],[240,52],[244,53],[243,6],[242,6],[245,54],[446,55],[445,56],[441,57],[250,6],[448,6],[451,58],[444,59],[249,60],[248,6],[449,61],[171,6],[85,62],[86,62],[88,63],[89,64],[90,65],[91,66],[92,67],[93,68],[94,69],[95,70],[96,71],[97,72],[98,72],[100,73],[99,74],[101,73],[102,75],[103,76],[87,77],[137,6],[104,78],[105,79],[106,80],[138,81],[107,82],[108,83],[109,84],[110,85],[111,86],[112,87],[113,88],[114,89],[115,90],[116,91],[117,91],[118,92],[119,93],[121,94],[120,95],[122,96],[123,97],[124,98],[125,99],[126,100],[127,101],[128,102],[129,103],[130,104],[131,105],[132,106],[133,107],[134,108],[135,109],[136,110],[478,6],[476,6],[480,111],[479,6],[218,112],[175,6],[177,113],[176,114],[181,115],[216,116],[213,117],[215,118],[178,117],[179,119],[183,119],[182,120],[180,121],[214,122],[212,117],[217,123],[210,6],[211,6],[184,124],[189,117],[191,117],[186,117],[187,124],[193,117],[194,125],[185,117],[190,117],[192,117],[188,117],[208,126],[207,117],[209,127],[203,117],[205,117],[204,117],[200,117],[206,128],[201,117],[202,129],[195,117],[196,117],[197,117],[198,117],[199,117],[158,130],[477,6],[172,131],[225,132],[227,132],[226,132],[236,133],[237,134],[228,132],[238,135],[230,132],[239,136],[69,137],[66,138],[74,139],[65,138],[73,138],[72,140],[234,141],[156,142],[155,143],[154,144],[229,145],[223,146],[161,39],[221,147],[162,135],[222,148],[157,20],[163,135],[159,149],[160,150],[224,135],[235,141],[440,151],[413,6],[391,152],[389,152],[439,153],[404,154],[403,154],[304,155],[255,156],[411,155],[412,155],[414,157],[415,155],[416,158],[315,159],[417,155],[388,155],[418,155],[419,160],[420,155],[421,154],[422,161],[423,155],[424,155],[425,155],[426,155],[427,154],[428,155],[429,155],[430,155],[431,155],[432,162],[433,155],[434,155],[435,155],[436,155],[437,155],[254,153],[257,158],[258,158],[259,158],[260,158],[261,158],[262,158],[263,158],[264,155],[266,163],[267,158],[265,158],[268,158],[269,158],[270,158],[271,158],[272,158],[273,158],[274,155],[275,158],[276,158],[277,158],[278,158],[279,158],[280,155],[281,158],[282,158],[283,158],[284,158],[285,158],[286,158],[287,155],[289,164],[288,158],[290,158],[291,158],[292,158],[293,158],[294,162],[295,155],[296,155],[310,165],[298,166],[299,158],[300,158],[301,155],[302,158],[303,158],[305,167],[306,158],[307,158],[308,158],[309,158],[311,158],[312,158],[313,158],[314,158],[316,168],[317,158],[318,158],[319,158],[320,155],[321,158],[322,169],[323,169],[324,169],[325,155],[326,158],[327,158],[328,158],[333,158],[329,158],[330,155],[331,158],[332,155],[334,158],[335,158],[336,158],[337,158],[338,158],[339,158],[340,155],[341,158],[342,158],[343,158],[344,158],[345,158],[346,158],[347,158],[348,158],[349,158],[350,158],[351,158],[352,158],[353,158],[354,158],[355,158],[356,158],[357,170],[358,158],[359,158],[360,158],[361,158],[362,158],[363,158],[364,155],[365,155],[366,155],[367,155],[368,155],[369,158],[370,158],[371,158],[372,158],[390,171],[438,155],[375,172],[374,173],[398,174],[397,175],[393,176],[392,175],[394,177],[383,178],[381,179],[396,180],[395,177],[382,6],[384,181],[297,182],[253,183],[252,158],[387,6],[379,184],[380,185],[377,6],[378,186],[376,158],[385,187],[256,188],[405,6],[406,6],[399,6],[402,154],[401,6],[407,6],[408,6],[400,189],[409,6],[410,6],[373,190],[386,191],[1,6],[9,6],[13,6],[12,6],[3,6],[14,6],[15,6],[16,6],[17,6],[18,6],[19,6],[20,6],[21,6],[4,6],[5,6],[25,6],[22,6],[23,6],[24,6],[26,6],[27,6],[28,6],[6,6],[29,6],[30,6],[31,6],[32,6],[7,6],[36,6],[33,6],[34,6],[35,6],[37,6],[8,6],[38,6],[43,6],[44,6],[39,6],[40,6],[41,6],[42,6],[2,6],[45,6],[11,6],[10,6],[174,6],[475,192],[450,193],[459,194],[467,195],[468,196],[458,197],[469,198],[470,193],[471,199],[472,200],[473,200],[464,201],[460,194],[461,6],[457,202],[462,6],[466,203],[465,194],[463,6],[474,204],[495,205],[497,206],[493,207],[496,208],[498,209],[492,210],[484,211],[482,212],[485,213],[486,213],[490,214],[483,215],[487,216],[488,217],[489,218],[491,219],[481,6],[494,220]],"exportedModulesMap":[[165,1],[168,2],[169,3],[167,4],[164,5],[170,6],[173,7],[219,8],[220,9],[166,6],[46,6],[60,10],[58,11],[57,12],[59,13],[56,14],[67,15],[68,16],[71,17],[70,15],[62,18],[64,19],[61,20],[63,18],[84,6],[151,6],[153,21],[152,22],[150,23],[146,24],[147,25],[145,20],[142,26],[141,27],[144,28],[139,29],[149,30],[143,31],[148,32],[140,33],[47,6],[48,6],[55,34],[54,35],[52,36],[49,6],[53,37],[50,37],[51,6],[75,6],[76,6],[78,38],[77,39],[79,6],[83,40],[80,39],[81,39],[82,39],[233,41],[231,42],[232,43],[456,44],[454,6],[453,45],[455,46],[452,6],[251,47],[443,48],[442,6],[447,49],[247,50],[246,6],[241,51],[240,52],[244,53],[243,6],[242,6],[245,54],[446,55],[445,56],[441,57],[250,6],[448,6],[451,58],[444,59],[249,60],[248,6],[449,61],[171,6],[85,62],[86,62],[88,63],[89,64],[90,65],[91,66],[92,67],[93,68],[94,69],[95,70],[96,71],[97,72],[98,72],[100,73],[99,74],[101,73],[102,75],[103,76],[87,77],[137,6],[104,78],[105,79],[106,80],[138,81],[107,82],[108,83],[109,84],[110,85],[111,86],[112,87],[113,88],[114,89],[115,90],[116,91],[117,91],[118,92],[119,93],[121,94],[120,95],[122,96],[123,97],[124,98],[125,99],[126,100],[127,101],[128,102],[129,103],[130,104],[131,105],[132,106],[133,107],[134,108],[135,109],[136,110],[478,6],[476,6],[480,111],[479,6],[218,112],[175,6],[177,113],[176,114],[181,115],[216,116],[213,117],[215,118],[178,117],[179,119],[183,119],[182,120],[180,121],[214,122],[212,117],[217,123],[210,6],[211,6],[184,124],[189,117],[191,117],[186,117],[187,124],[193,117],[194,125],[185,117],[190,117],[192,117],[188,117],[208,126],[207,117],[209,127],[203,117],[205,117],[204,117],[200,117],[206,128],[201,117],[202,129],[195,117],[196,117],[197,117],[198,117],[199,117],[158,130],[477,6],[172,131],[225,132],[227,132],[226,132],[236,133],[237,134],[228,132],[238,135],[230,132],[239,136],[69,137],[66,138],[74,139],[65,138],[73,138],[72,140],[234,141],[156,142],[155,143],[154,144],[229,145],[223,146],[161,39],[221,147],[162,135],[222,148],[157,20],[163,135],[159,149],[160,150],[224,135],[235,141],[440,151],[413,6],[391,152],[389,152],[439,153],[404,154],[403,154],[304,155],[255,156],[411,155],[412,155],[414,157],[415,155],[416,158],[315,159],[417,155],[388,155],[418,155],[419,160],[420,155],[421,154],[422,161],[423,155],[424,155],[425,155],[426,155],[427,154],[428,155],[429,155],[430,155],[431,155],[432,162],[433,155],[434,155],[435,155],[436,155],[437,155],[254,153],[257,158],[258,158],[259,158],[260,158],[261,158],[262,158],[263,158],[264,155],[266,163],[267,158],[265,158],[268,158],[269,158],[270,158],[271,158],[272,158],[273,158],[274,155],[275,158],[276,158],[277,158],[278,158],[279,158],[280,155],[281,158],[282,158],[283,158],[284,158],[285,158],[286,158],[287,155],[289,164],[288,158],[290,158],[291,158],[292,158],[293,158],[294,162],[295,155],[296,155],[310,165],[298,166],[299,158],[300,158],[301,155],[302,158],[303,158],[305,167],[306,158],[307,158],[308,158],[309,158],[311,158],[312,158],[313,158],[314,158],[316,168],[317,158],[318,158],[319,158],[320,155],[321,158],[322,169],[323,169],[324,169],[325,155],[326,158],[327,158],[328,158],[333,158],[329,158],[330,155],[331,158],[332,155],[334,158],[335,158],[336,158],[337,158],[338,158],[339,158],[340,155],[341,158],[342,158],[343,158],[344,158],[345,158],[346,158],[347,158],[348,158],[349,158],[350,158],[351,158],[352,158],[353,158],[354,158],[355,158],[356,158],[357,170],[358,158],[359,158],[360,158],[361,158],[362,158],[363,158],[364,155],[365,155],[366,155],[367,155],[368,155],[369,158],[370,158],[371,158],[372,158],[390,171],[438,155],[375,172],[374,173],[398,174],[397,175],[393,176],[392,175],[394,177],[383,178],[381,179],[396,180],[395,177],[382,6],[384,181],[297,182],[253,183],[252,158],[387,6],[379,184],[380,185],[377,6],[378,186],[376,158],[385,187],[256,188],[405,6],[406,6],[399,6],[402,154],[401,6],[407,6],[408,6],[400,189],[409,6],[410,6],[373,190],[386,191],[1,6],[9,6],[13,6],[12,6],[3,6],[14,6],[15,6],[16,6],[17,6],[18,6],[19,6],[20,6],[21,6],[4,6],[5,6],[25,6],[22,6],[23,6],[24,6],[26,6],[27,6],[28,6],[6,6],[29,6],[30,6],[31,6],[32,6],[7,6],[36,6],[33,6],[34,6],[35,6],[37,6],[8,6],[38,6],[43,6],[44,6],[39,6],[40,6],[41,6],[42,6],[2,6],[45,6],[11,6],[10,6],[174,6],[475,192],[450,193],[459,194],[467,195],[468,196],[458,197],[469,198],[470,193],[471,199],[472,200],[473,200],[464,201],[460,194],[461,6],[457,202],[462,6],[466,203],[465,194],[463,6],[474,204],[495,221],[497,222],[493,223],[496,224],[498,225],[492,226],[484,227],[482,228],[485,227],[486,227],[490,227],[483,227],[487,227],[488,227],[489,229],[491,229],[494,230]],"semanticDiagnosticsPerFile":[165,168,169,167,164,170,173,219,220,166,46,60,58,57,59,56,67,68,71,70,62,64,61,63,84,151,153,152,150,146,147,145,142,141,144,139,149,143,148,140,47,48,55,54,52,49,53,50,51,75,76,78,77,79,83,80,81,82,233,231,232,456,454,453,455,452,251,443,442,447,247,246,241,240,244,243,242,245,446,445,441,250,448,451,444,249,248,449,171,85,86,88,89,90,91,92,93,94,95,96,97,98,100,99,101,102,103,87,137,104,105,106,138,107,108,109,110,111,112,113,114,115,116,117,118,119,121,120,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,478,476,480,479,218,175,177,176,181,216,213,215,178,179,183,182,180,214,212,217,210,211,184,189,191,186,187,193,194,185,190,192,188,208,207,209,203,205,204,200,206,201,202,195,196,197,198,199,158,477,172,225,227,226,236,237,228,238,230,239,69,66,74,65,73,72,234,156,155,154,229,223,161,221,162,222,157,163,159,160,224,235,440,413,391,389,439,404,403,304,255,411,412,414,415,416,315,417,388,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,254,257,258,259,260,261,262,263,264,266,267,265,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,289,288,290,291,292,293,294,295,296,310,298,299,300,301,302,303,305,306,307,308,309,311,312,313,314,316,317,318,319,320,321,322,323,324,325,326,327,328,333,329,330,331,332,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,390,438,375,374,398,397,393,392,394,383,381,396,395,382,384,297,253,252,387,379,380,377,378,376,385,256,405,406,399,402,401,407,408,400,409,410,373,386,1,9,13,12,3,14,15,16,17,18,19,20,21,4,5,25,22,23,24,26,27,28,6,29,30,31,32,7,36,33,34,35,37,8,38,43,44,39,40,41,42,2,45,11,10,174,475,450,459,467,468,458,469,470,471,472,473,464,460,461,457,462,466,465,463,474,495,497,493,496,498,492,484,482,485,486,490,483,487,488,489,491,481,494]},"version":"4.9.4"} \ No newline at end of file diff --git a/packages/selector/lib/utils/selector-utils.d.ts b/packages/selector/lib/utils/selector-utils.d.ts index 4b70951cb..5e15842a0 100644 --- a/packages/selector/lib/utils/selector-utils.d.ts +++ b/packages/selector/lib/utils/selector-utils.d.ts @@ -1,4 +1,4 @@ -import { InstantSignInSpecs, TrialSignInSpecs } from '../core/types'; +import { InternalInstantSignInSpecs, InternalTrialSignInSpecs } from '../core/types'; import { Action } from '@near-js/transactions'; export declare const KEYPOM_LOCAL_STORAGE_KEY = "keypom-wallet-selector"; export declare const getLocalStorageKeypomEnv: () => string | null; @@ -13,11 +13,11 @@ export declare const getAccountFromMap: (secretKey: any) => Promise; export declare const keyHasPermissionForTransaction: (accessKey: any, receiverId: string, actions: Action[]) => Promise; export declare const addUserToMappingContract: (accountId: any, secretKey: any) => Promise; export declare const updateKeypomContractIfValid: (keypomContractId: any) => boolean; -export declare const parseTrialUrl: (trialSpecs: TrialSignInSpecs) => { +export declare const parseTrialUrl: (trialSpecs: InternalTrialSignInSpecs) => { accountId: string; secretKey: string; } | undefined; -export declare const parseInstantSignInUrl: (instantSignInSpecs: InstantSignInSpecs) => { +export declare const parseInstantSignInUrl: (instantSignInSpecs: InternalInstantSignInSpecs) => { accountId: string; secretKey: string; moduleId: string; diff --git a/packages/selector/src/core/setup.ts b/packages/selector/src/core/setup.ts index e4b1eac22..af4a92379 100644 --- a/packages/selector/src/core/setup.ts +++ b/packages/selector/src/core/setup.ts @@ -100,6 +100,16 @@ export function setupKeypom({ console.warn('KeypomWallet: signInContractId, networkId and either instant sign in specs or trial account specs are required to use the KeypomWallet.'); return null; } + + if (trialAccountSpecs && !(trialAccountSpecs.url.includes('ACCOUNT_ID') || trialAccountSpecs.url.includes('SECRET_KEY'))) { + console.warn('KeypomWallet: trial account specs must include ACCOUNT_ID and SECRET_KEY in url'); + return null; + } + + if (instantSignInSpecs && !(instantSignInSpecs.url.includes('ACCOUNT_ID') || instantSignInSpecs.url.includes('SECRET_KEY'))) { + console.warn('KeypomWallet: trial account specs must include ACCOUNT_ID'); + return null; + } const keypomWallet = new KeypomWallet({ signInContractId, diff --git a/packages/selector/src/core/types.ts b/packages/selector/src/core/types.ts index e0b31cbb4..3ff9f4e70 100644 --- a/packages/selector/src/core/types.ts +++ b/packages/selector/src/core/types.ts @@ -50,21 +50,23 @@ export const KEYPOM_MODULE_ID = 'keypom'; export interface InternalInstantSignInSpecs extends InstantSignInSpecs { moduleId?: string; + baseUrl?: string; + delimiter?: string; + moduleDelimiter?: string; } export interface InternalTrialSignInSpecs extends TrialSignInSpecs { isMappingAccount: boolean; + baseUrl?: string; + delimiter?: string; } export interface InstantSignInSpecs { - baseUrl: string; - delimiter: string; - moduleDelimiter: string; + url: string; } export interface TrialSignInSpecs { - baseUrl: string; - delimiter: string; + url: string; modalOptions: ModalCustomizations; } @@ -81,8 +83,8 @@ export interface KeypomInitializeOptions { export interface KeypomParams { networkId: NetworkId; signInContractId: string; - trialAccountSpecs: TrialSignInSpecs, - instantSignInSpecs: InstantSignInSpecs, + trialAccountSpecs?: TrialSignInSpecs, + instantSignInSpecs?: InstantSignInSpecs, } export type KeypomWalletInstant = InstantLinkWallet & { diff --git a/packages/selector/src/core/wallet.ts b/packages/selector/src/core/wallet.ts index 763524e9d..ac08d08d5 100644 --- a/packages/selector/src/core/wallet.ts +++ b/packages/selector/src/core/wallet.ts @@ -11,6 +11,10 @@ import { MODAL_TYPE_IDS, ModalCustomizations } from '../modal/src/lib/modal.type import { KEYPOM_LOCAL_STORAGE_KEY, addUserToMappingContract, getAccountFromMap, getLocalStorageKeypomEnv, parseInstantSignInUrl, parseTrialUrl, setLocalStorageKeypomEnv, updateKeypomContractIfValid } from '../utils/selector-utils'; import { SUPPORTED_EXT_WALLET_DATA, extSignAndSendTransactions } from './ext_wallets'; import { FAILED_EXECUTION_OUTCOME, InstantSignInSpecs, InternalInstantSignInSpecs, InternalTrialSignInSpecs, KEYPOM_MODULE_ID, TrialSignInSpecs } from './types'; + +const TRIAL_URL_REGEX = new RegExp(`(.*)ACCOUNT_ID(.*)SECRET_KEY`); +const INSTANT_URL_REGEX = new RegExp(`(.*)ACCOUNT_ID(.*)SECRET_KEY(.*)MODULE_ID`); + export class KeypomWallet implements InstantLinkWalletBehaviour { accountId?: string; secretKey?: string; @@ -48,16 +52,39 @@ export class KeypomWallet implements InstantLinkWalletBehaviour { let trialSpecs: InternalTrialSignInSpecs | undefined = undefined; if (trialAccountSpecs !== undefined) { + // Get the base URL and delimiter by splitting the URL using ACCOUNT_ID and SECRET_KEY + const matches = trialAccountSpecs.url.match(TRIAL_URL_REGEX); + const baseUrl = matches?.[1]!; + const delimiter = matches?.[2]!; + trialSpecs = { ...trialAccountSpecs, - isMappingAccount: false + isMappingAccount: false, + baseUrl, + delimiter } this.modal = setupModal(trialAccountSpecs!.modalOptions); } - this.trialAccountSpecs = trialSpecs; - this.instantSignInSpecs = instantSignInSpecs; + + let instantSpecs: InternalInstantSignInSpecs | undefined = undefined; + if (instantSignInSpecs !== undefined) { + // Get the base URL and delimiter by splitting the URL using ACCOUNT_ID and SECRET_KEY + const matches = instantSignInSpecs.url.match(INSTANT_URL_REGEX); + const baseUrl = matches?.[1]!; + const delimiter = matches?.[2]!; + const moduleDelimiter = matches?.[3]!; + + instantSpecs = { + ...instantSignInSpecs, + baseUrl, + delimiter, + moduleDelimiter + } + } + + this.instantSignInSpecs = instantSpecs; } getContractId(): string { @@ -153,7 +180,7 @@ export class KeypomWallet implements InstantLinkWalletBehaviour { network: this.near.connection.networkId }); - let instantSignInData = this.instantSignInSpecs !== undefined ? parseInstantSignInUrl(this.instantSignInSpecs) : undefined; + let instantSignInData = this.instantSignInSpecs?.baseUrl !== undefined ? parseInstantSignInUrl(this.instantSignInSpecs) : undefined; console.log('instantSignInData: ', instantSignInData) if (instantSignInData !== undefined) { if (SUPPORTED_EXT_WALLET_DATA[this.near.connection.networkId!][instantSignInData.moduleId] === undefined) { @@ -164,7 +191,8 @@ export class KeypomWallet implements InstantLinkWalletBehaviour { return this.signInInstantAccount(instantSignInData.accountId, instantSignInData.secretKey, instantSignInData.moduleId); } - let trialData = this.trialAccountSpecs !== undefined ? parseTrialUrl(this.trialAccountSpecs) : undefined; + let trialData = this.trialAccountSpecs?.baseUrl !== undefined ? parseTrialUrl(this.trialAccountSpecs) : undefined; + console.log('trialData: ', trialData) if (trialData !== undefined) { return this.signInTrialAccount(trialData.accountId, trialData.secretKey); } @@ -278,8 +306,8 @@ export class KeypomWallet implements InstantLinkWalletBehaviour { }; public checkValidTrialInfo = () => { - let instantSignInData = this.instantSignInSpecs !== undefined ? parseInstantSignInUrl(this.instantSignInSpecs) : undefined; - let trialData = this.trialAccountSpecs !== undefined ? parseTrialUrl(this.trialAccountSpecs) : undefined; + let instantSignInData = this.instantSignInSpecs?.baseUrl !== undefined ? parseInstantSignInUrl(this.instantSignInSpecs) : undefined; + let trialData = this.trialAccountSpecs?.baseUrl !== undefined ? parseTrialUrl(this.trialAccountSpecs) : undefined; return instantSignInData !== undefined || trialData !== undefined || getLocalStorageKeypomEnv() !== null; }; diff --git a/packages/selector/src/modal/src/lib/components/OffboardingWallets.tsx b/packages/selector/src/modal/src/lib/components/OffboardingWallets.tsx index 287780781..93b9cbe25 100644 --- a/packages/selector/src/modal/src/lib/components/OffboardingWallets.tsx +++ b/packages/selector/src/modal/src/lib/components/OffboardingWallets.tsx @@ -25,10 +25,15 @@ export const OffboardingWallets: React.FC = ({ name, description, iconUrl, - baseRedirectUrl, - delimiter = "/", + redirectUrl } = wallet; + const mapObj = { + ACCOUNT_ID: accountId, + SECRET_KEY: secretKey + }; + const url = redirectUrl.replace(/\b(?:SECRET_KEY|ACCOUNT_ID)\b/gi, matched => mapObj[matched]); + result.push(
  • = ({ key={wallet.name} onClick={() => { window.open( - `${baseRedirectUrl}${accountId}${delimiter}${secretKey}`, + url, "_blank" ); }} diff --git a/packages/selector/src/modal/src/lib/modal.types.ts b/packages/selector/src/modal/src/lib/modal.types.ts index 214735cbb..70f91e649 100644 --- a/packages/selector/src/modal/src/lib/modal.types.ts +++ b/packages/selector/src/modal/src/lib/modal.types.ts @@ -64,8 +64,7 @@ export interface OffboardingWallet { name: string; description: string; iconUrl: string; - baseRedirectUrl: string; - delimiter?: string; + redirectUrl: string; } export interface MainBodyImage { diff --git a/packages/selector/src/utils/selector-utils.ts b/packages/selector/src/utils/selector-utils.ts index 8e4b720f0..aa9e39e42 100644 --- a/packages/selector/src/utils/selector-utils.ts +++ b/packages/selector/src/utils/selector-utils.ts @@ -1,6 +1,6 @@ import { accountMappingContract, getEnv, getPubFromSecret, supportedKeypomContracts, trialCallMethod, updateKeypomContractId } from '@keypom/core'; import { parseNearAmount } from '@near-js/utils'; -import { InstantSignInSpecs, TrialSignInSpecs } from '../core/types'; +import { InstantSignInSpecs, InternalInstantSignInSpecs, InternalTrialSignInSpecs, TrialSignInSpecs } from '../core/types'; import { Action } from '@near-js/transactions'; export const KEYPOM_LOCAL_STORAGE_KEY = 'keypom-wallet-selector'; @@ -101,18 +101,18 @@ export const updateKeypomContractIfValid = (keypomContractId) => { return false; }; -export const parseTrialUrl = (trialSpecs: TrialSignInSpecs) => { +export const parseTrialUrl = (trialSpecs: InternalTrialSignInSpecs) => { const {baseUrl, delimiter} = trialSpecs; console.log(`Parse trial URL with base: ${baseUrl} and delim: ${delimiter}`); - const split = window.location.href.split(baseUrl); + const split = window.location.href.split(baseUrl!); if (split.length !== 2) { return; } const trialInfo = split[1]; - const [accountId, secretKey] = trialInfo.split(delimiter); + const [accountId, secretKey] = trialInfo.split(delimiter!); if (!accountId || !secretKey) { return; @@ -124,12 +124,12 @@ export const parseTrialUrl = (trialSpecs: TrialSignInSpecs) => { }; }; -export const parseInstantSignInUrl = (instantSignInSpecs: InstantSignInSpecs) => { +export const parseInstantSignInUrl = (instantSignInSpecs: InternalInstantSignInSpecs) => { const {baseUrl, delimiter, moduleDelimiter} = instantSignInSpecs; console.log(`Parse instant sign in URL with base: ${baseUrl} delim: ${delimiter} and module delim: ${moduleDelimiter}`); - const split = window.location.href.split(baseUrl); + const split = window.location.href.split(baseUrl!); if (split.length !== 2) { return; From 3d86394828b0d487e5f7d920b6bdc47c41508abf Mon Sep 17 00:00:00 2001 From: BenKurrek Date: Wed, 24 May 2023 09:13:12 -0400 Subject: [PATCH 08/12] continue work on readme --- packages/selector/README.md | 116 +++++++++++++++++++++++++++++++++++- 1 file changed, 114 insertions(+), 2 deletions(-) diff --git a/packages/selector/README.md b/packages/selector/README.md index 3da0e15a7..7dbdf26d5 100644 --- a/packages/selector/README.md +++ b/packages/selector/README.md @@ -99,7 +99,7 @@ https://near.org/#trial-url/ACCOUNT_ID/SECRET_KEY The URL *must* have the `ACCOUNT_ID` and `SECRET_KEY` placeholders. -As an example, if you wanted your trial users to sign in once they reached `https://near.org/#trial-url/`, and you wanted the account and secret key to be seperated using `/`, your specs should look like this: +As an example, if you wanted your trial users to sign in once they reached `https://near.org/#trial-url/`, and you wanted the account and secret key to be separated using `/`, your specs should look like this: ```js trialAccountSpecs: { @@ -107,13 +107,125 @@ trialAccountSpecs: { } ``` +Alternatively, you could swap the `/` delimiter with a `#` instead: + +```js +trialAccountSpecs: { + url: "https://near.org/#trial-url/ACCOUNT_ID#SECRET_KEY", +} +``` + > **NOTE:** The account ID must come first and the secret key must follow the delimiter. For unclaimed trial account linkdrops, the account ID will be the Keypom contract. For claimed trial account linkdrops, the account ID will be the account ID chosen by the user. ### Modal Options The second field in the trial account specs is the `modalOptions`. This contains all the customizable options for the trial account modals as well as the wallets you want to support for user offboarding. -All of the modal text can be optionally customized but the only *required* field that you must specify in the modal options are the wallets. +```js +export interface ModalCustomizations { + wallets: OffboardingWallet[]; + theme?: Theme; + beginTrial?: BeginTrialCustomizations, + trialOver?: TrialOverCustomizations, + invalidAction?: InvalidActionCustomizations, + insufficientBalance?: InsufficientBalanceCustomizations, +} +``` + +#### Wallets + +The only required field is `wallets`. This should be a list of valid domains that support trial account offboarding. Each of the wallets in the list will be displayed as a button once the trial is over. + +```js +export interface OffboardingWallet { + name: string; + description: string; + iconUrl: string; + redirectUrl: string; +} +``` + +For each wallet, you can specify a name to display, a description, an image (in the form of a URL), and where to redirect the user to once the button is clicked. The redirect URL follows the same format as the trial account URL and should look like this: + +```js +https://app.mynearwallet.com/linkdrop/ACCOUNT_ID/SECRET_KEY +``` + +The URL *must* have the `ACCOUNT_ID` and `SECRET_KEY` placeholders. + +#### Theme And CSS + +The modal used by Keypom uses the same CSS as the official wallet selector modal behind the scenes. To learn how to customize the theme to match your app, see the selector's [documentation](https://github.com/near/wallet-selector/tree/main/packages/modal-ui#react--vue). + +If you only wish to change the theme between light and dark mode, you can pass in a `theme` field in the modal options. This field should be either `light` or `dark`. + +#### Modal Text + +In addition to the modal style, you have complete control over the text that is displayed at each stage of the claiming process. To see the default text, see the [Default Text](#modal-default-text) section. + +For the trial account creation process, there are currently 3 modals that can be customized: + +1. Landing page: what the user sees when they first click the link + +```bash +landing?: { + title?: string; + body?: string; + fieldPlaceholder?: string; + buttonText?: string; + subText?: { + landing?: string; + invalidAccountId?: string; + accountIdTaken?: string; + accountIdAvailable?: string; + } +}, +``` + +2. Claiming: while the account is being created: +```bash +claiming?: { + title?: string; + body?: string; +}, +``` + +3. Claimed: once the account has been created: +```bash +claimed?: { + title?: string; + body?: string; + buttonText?: string; +} +``` + +The next stage that can be customized is what the user sees once their trial is over and they need to choose a wallet to offboard to. + +```bash +trialOver?: { + mainBody?: { + title?: string; + body?: string; + imageOne?: { + title: string; + body: string; + }, + imageTwo?: { + title: string; + body: string; + }, + button?: { + url?: string; + newTab?: boolean; + text?: string; + } + }, + offboardingOptions?: { + title?: string; + } +} +``` + These specs are an object that have three mandatory fields: - `baseUrl`: The URL of your app. This is the URL that will be used to construct the trial account URL. From 337c567c6a09507dc8b8e8518e839a8dfceabea7 Mon Sep 17 00:00:00 2001 From: BenKurrek Date: Wed, 24 May 2023 14:42:46 -0400 Subject: [PATCH 09/12] finished first pass at both READMEs --- packages/core/README.md | 6 +- packages/selector/README.md | 192 +++++++++++++++++------------------- 2 files changed, 92 insertions(+), 106 deletions(-) diff --git a/packages/core/README.md b/packages/core/README.md index 8efcefcd9..82cd6af8c 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -30,9 +30,7 @@ The core package serves as a way to interact with Keypom through a set of easy t - Delete drops and refund assets - Manage user balances -
    -Table of Contents - +# Table of Contents - [Installation](#installation) - [Getting Started](#getting-started) - [View Methods & Utility Functions Only](#view-methods--utility-functions-only) @@ -43,8 +41,6 @@ The core package serves as a way to interact with Keypom through a set of easy t - [Per Key](#per-key) - [Contributing](#contributing) -
    - --- # Installation diff --git a/packages/selector/README.md b/packages/selector/README.md index 7dbdf26d5..bb605391e 100644 --- a/packages/selector/README.md +++ b/packages/selector/README.md @@ -26,18 +26,18 @@ The Keypom Wallet Selector is a package that allows apps to be fully compatible - Instant Sign-In [Demo](https://www.youtube.com/watch?v=p_NOcYbRlJw&feature=youtu.be) - Trial Account [Demo](https://www.youtube.com/watch?v=p_NOcYbRlJw) -
    -Table of Contents - +# Table of Contents - [Installation](#installation) - [Getting Started](#getting-started) - [Setup Keypom Parameters](#setup-keypom-parameters) - [Keypom Trial Accounts](#keypom-trial-accounts) -- [Instant Sign-In Experiences](#instant-sign-in-experiences) + - [Trial Account Specs](#trial-account-specs) + - [Modal Options](#modal-options) + - [Example Trial Account Integration](#example-trial-account-integration) +- [Keypom Instant Sign In Experiences](#keypom-instant-sign-in-experiences) + - [Instant Sign In Specs](#instant-sign-in-specs) - [Contributing](#contributing) -
    - --- # Installation @@ -87,6 +87,8 @@ Keypom Trial Accounts are an exciting new opportunity for Web3 apps to seamlessl This technology is perfect for dApps of all sizes ranging from small indie to large enterprise applications. +- Trial Account [Demo](https://www.youtube.com/watch?v=p_NOcYbRlJw) + In order to support trial accounts, your app must have the `setupKeypom` function embedded within the wallet selector with the `trialAccountSpecs` parameter specified. ## Trial Account Specs @@ -117,7 +119,7 @@ trialAccountSpecs: { > **NOTE:** The account ID must come first and the secret key must follow the delimiter. For unclaimed trial account linkdrops, the account ID will be the Keypom contract. For claimed trial account linkdrops, the account ID will be the account ID chosen by the user. -### Modal Options +## Modal Options The second field in the trial account specs is the `modalOptions`. This contains all the customizable options for the trial account modals as well as the wallets you want to support for user offboarding. @@ -153,13 +155,13 @@ https://app.mynearwallet.com/linkdrop/ACCOUNT_ID/SECRET_KEY The URL *must* have the `ACCOUNT_ID` and `SECRET_KEY` placeholders. -#### Theme And CSS +### Theme And CSS The modal used by Keypom uses the same CSS as the official wallet selector modal behind the scenes. To learn how to customize the theme to match your app, see the selector's [documentation](https://github.com/near/wallet-selector/tree/main/packages/modal-ui#react--vue). If you only wish to change the theme between light and dark mode, you can pass in a `theme` field in the modal options. This field should be either `light` or `dark`. -#### Modal Text +### Modal Text In addition to the modal style, you have complete control over the text that is displayed at each stage of the claiming process. To see the default text, see the [Default Text](#modal-default-text) section. @@ -226,17 +228,34 @@ trialOver?: { } ``` +You can change the titles, descriptions, button text / behaviour and more to tailor the experience to your app. Finally, you can change the text for when the user tries to perform an invalid action, or tries to spend more $NEAR than the account has available. + + +## Example Trial Account Integration -These specs are an object that have three mandatory fields: -- `baseUrl`: The URL of your app. This is the URL that will be used to construct the trial account URL. -- `delimiter`: The delimiter that separates the base URL from the trial account ID. For example, if the base URL is `https://near.org/#trial-url/` and the delimiter is `/`, the trial account URL will be `https://near.org/#trial-url/`. -- `modalOptions`: An object that contains all the customizable options for the trial account modals. See the [Modal Options](#modal-options) section for more information. +In the following example, you'll see how the trial account flow can be fully integrated into an application. The app has the domain `https://example.com` and the trial account modals should show up once the user lands on `https://example.com/trial-accounts`. In addition, the app doesn't want to expose the secret key in their analytics so they'll separate the account ID and secret key using a `#` instead of a `/`. -In the following example, +The app will also support MyNEARWallet offboarding and will change the default text for the landing modal when the trial begins. ```js -const NETWORK_ID = "mainnet"; -const CONTRACT_ID = "social.near"; +const NETWORK_ID = "testnet"; +const CONTRACT_ID = "example.near"; + +export const KEYPOM_OPTIONS = { + beginTrial: { + landing: { + title: "Welcome To My Cool Example App!", + }, + }, + wallets: [ + { + name: "MyNEARWallet", + description: "Secure your account with a Seed Phrase", + redirectUrl: "https://testnet.mynearwallet.com/linkdrop/ACCOUNT_ID/SECRET_KEY", + iconUrl: "INSERT_ICON_URL_HERE" + }, + ] +} const selector = await setupWalletSelector({ network: NETWORK_ID, @@ -248,8 +267,7 @@ const selector = await setupWalletSelector({ networkId: NETWORK_ID, signInContractId: CONTRACT_ID, trialAccountSpecs: { - baseUrl: "https://near.org/#trial-url/", - delimiter: "/", + url: "https://example.com/trial-accounts/ACCOUNT_ID#SECRET_KEY", modalOptions: KEYPOM_OPTIONS } }) @@ -257,111 +275,83 @@ const selector = await setupWalletSelector({ }); ``` -## Offboarding Mechanisms - - +# Keypom Instant Sign In Experiences -## Funder Object +Instant sign in experiences are a great way to reduce friction for users signing into applications. Currently, the sign in flow for a new user is as follows: +1. User creates an account. +2. They navigate to an application. +3. Sign-in is clicked. +4. The wallet selector modal is opened and the user needs to scroll to find their wallet. +5. The user clicks their wallet and is redirected to the wallet's website to approve a transaction. +6. The user is redirected back to the app and is signed in. -If you have the private key of an account that you'd like to use to sign transactions with, you can pass in a `funder` object to `initKeypom`. The private key can either be hardcoded or passed in through environment variables / secrets. +As NEAR pushes to abstract the crypto complexities and jargon away from the end user, this current approach is not scalable. Not only is there a huge amount of clicks and redirects which leads to a loss in conversion, but the user is also expected to know which wallet they own. This is a huge barrier to entry as often times, the wallet logic will be abstracted from the user as seen with SWEAT. -Using this method, you only need to pass the funder object once on initialization and can freely invoke any of the SDK methods moving forward. To update the funder object, you can call `updateFunder` and pass in different information. +The flow that Keypom offers is as follows: +1. User creates an account. +2. User clicks discovers an application from their wallet. +3. User is instantly signed in and can start using the application. -```js -await initKeypom({ - network: "testnet", - funder: { - accountId: "benji_demo.testnet", - secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" - } -}); +This flow is much more seamless and removes all the redirects and wallet selector modal friction. -const dropSupply = await getKeyTotalSupply(); -console.log('dropSupply: ', dropSupply) - -const {keys} = await createDrop({ - numKeys: 1, - depositPerUseNEAR: 1 -}) -console.log('keys: ', keys) -``` +- Instant Sign-In [Demo](https://www.youtube.com/watch?v=p_NOcYbRlJw&feature=youtu.be) -## Customized KeyStore & Multiple Signers +In order to support instant sign in, your app must have the `setupKeypom` function embedded within the wallet selector with the `instantSignInSpecs` parameter specified. -Passing in a custom `near` object when initializing Keypom has several benefits as seen below: -- If you have multiple accounts that will be signing transactions and don't want to keep calling `updateFunder`. -- You don't want to hardcode the private key in the `funder` object. -- You have a keystore containing keys that will be used to sign transactions already in scope. +## Instant Sign In Specs -In this case, you can pass in an existing `near` object and then pass in `Account` objects when calling the SDK methods. +The instant sign in specifications allows the Keypom wallet selector to support instant sign on experiences for your app. In order to trigger the sign in flow, the user must be on the correct URL. This URL is specified in the specifications as a string and should look like this: ```js -let keyStore = new UnencryptedFileSystemKeyStore(credentialsPath); -let nearConfig = { - networkId: NETWORK_ID, - keyStore: keyStore, - nodeUrl: `https://rpc.${NETWORK_ID}.near.org`, - walletUrl: `https://wallet.${NETWORK_ID}.near.org`, - helperUrl: `https://helper.${NETWORK_ID}.near.org`, - explorerUrl: `https://explorer.${NETWORK_ID}.near.org`, -}; -let near = new Near(nearConfig); - - -await initKeypom({ - near -}); - -const dropSupply = await getKeyTotalSupply(); -console.log('dropSupply: ', dropSupply) - -const fundingAccount = new Account(near.connection, funderAccountId); -const {keys} = await createDrop({ - account: fundingAccount, - numKeys: 1, - depositPerUseNEAR: 1 -}) -console.log('keys: ', keys) +https://near.org/#trial-url/ACCOUNT_ID/SECRET_KEY/MODULE_ID ``` -# Costs - -It is important to note that the Keypom contracts are 100% **FEE FREE** and will remain that way for the *forseeable future*. These contracts are a public good and are meant to inspire change in the NEAR ecosystem. - -With that being said, there are several mandatory costs that must be taken into account when using Keypom. These costs are broken down into two categories: per key and per drop. - -> **NOTE:** Creating an empty drop and then adding 100 keys in separate calls will incur the same cost as creating a drop with 100 keys in the same call. +The URL *must* have the `ACCOUNT_ID`, `SECRET_KEY`, and `MODULE_ID` placeholders. -## Per Drop +Behind the scenes, Keypom will take the secret key and use it to sign transactions on behalf of the account whenever they perform an action. Since this key is limited access, there needs to be a way to approve any transaction that requires full access. This is why the `MODULE_ID` field is present. This is the ID of the wallet that the user will be redirected to in order to approve any full access key required transactions. -When creating an empty drop, there is only one cost to keep in mind regardless of the drop type: -- Storage cost (**~0.006 $NEAR** for simple drops) +Currently, Keypom supports: +- MyNEARWallet: `my-near-wallet`, +- NEAR Wallet: `near-wallet`, +- SWEAT Wallet: `sweat-wallet` -## Per Key -Whenever keys are added to a drop (either when the drop is first created or at a later date), the costs are outlined below. +As an example, if you wanted to support instant sign in for users once they reached `https://near.org/#instant-url/`, and you wanted the account and secret key to be separated using `#`, but the module ID and secret key to be separated by `/`, your specs should look like this: -### Key Costs for Simple Drop - -- $NEAR sent whenever the key is used (can be 0). -- Access key allowance (**~0.0187 $NEAR per use**). -- Storage for creating access key (**0.001 $NEAR**). -- Storage cost (**~0.006 $NEAR** for simple drops) - -### Additional Costs for NFT Drops - -Since keys aren't registered for use until **after** the contract has received the NFT, we don't know how much storage the token IDs will use on the contract. To combat this, the Keypom contract will automatically measure the storage used up for storing each token ID in the `nft_on_transfer` function and that $NEAR will be taken from the funder's balance. +```js +instantSignInSpecs: { + url: "https://near.org/#instant-url/ACCOUNT_ID#SECRET_KEY/MODULE_ID", +} +``` -### Additional Costs for FT Drops +> **NOTE:** The account ID must come first followed by the secret key and then finally the module ID. -Since accounts claiming FTs may or may not be registered on the Fungible Token contract, Keypom will automatically try to register **all** accounts. This means that the drop creators must front the cost of registering users depending on the `storage_balance_bounds` returned from the FT contract. This applies to every use for every key. +The wallet selector would then look as follows. -In addition, Keypom must be registered on the FT contract. If you create a FT drop and are the first person to ever do so for a specific FT contract on Keypom, Keypom will be automatically registered when the drop is created. This is a one time cost and once it is done, no other account will need to register Keypom for that specific FT contract. +```js +const selector = await setupWalletSelector({ + network: NETWORK_ID, + modules: [ + setupMyNearWallet(), + ... + setupSender(), + setupKeypom({ + networkId: NETWORK_ID, + signInContractId: CONTRACT_ID, + instantSignInSpecs: { + url: "https://near.org/#instant-url/ACCOUNT_ID#SECRET_KEY/MODULE_ID" + } + }) + ], +}); +``` -### Additional Costs for FC Drops +From this point onwards, any app or wallet could create a limited access key for the contract that your app is using and then redirect the user to your instant sign in URL. An example could be that that account `benjiman.near` wants to use the `near.org` app and the contract being used there is `social.near`. Benji came from MyNEARWallet and so the URL would be: -Drop creators have a ton of customization available to them when creation Function Call drops. A cost that they might incur is the attached deposit being sent alongside the function call. Keypom will charge creators for all the attached deposits they specify. +``` +https://near.org/#instant-url/benjiman.near#3C6rhKRWLFmho9bQo32EUmk9Ldx47paRSMUdaoR551EtcaNSPziave55HJosi71tfWSRQjjRrL4exfaBi9o7XKUG/my-near-wallet +``` -> **NOTE:** The storage costs are dynamically calculated and will vary depending on the information you store on-chain. +At this point, Benji would be instantly signed into `near.org` and can start using the app. If anything requires a full access key, he would be redirected to MyNEARWallet to approve the transaction and come back. # Contributing From 68b93e8a4b108b8b7acae8439525631999fced60 Mon Sep 17 00:00:00 2001 From: BenKurrek Date: Wed, 24 May 2023 14:56:05 -0400 Subject: [PATCH 10/12] added readme for main repo --- README.md | 666 +++--------------------------------------------------- 1 file changed, 31 insertions(+), 635 deletions(-) diff --git a/README.md b/README.md index 5f20e50ea..4e35d41b7 100644 --- a/README.md +++ b/README.md @@ -1,650 +1,46 @@ -
    -

    - Keypom JavaScript SDK -

    - Interacting with the Keypom Protocol made seamless. -
    - -
    -
    - -Check out our official Keypom [Documentation](https://docs.keypom.xyz/) for tutorials, concepts and more!. - -[![made by BenKurrek](https://img.shields.io/badge/made%20by-BenKurrek-ff1414.svg?style=flat-square)](https://github.com/BenKurrek) -[![made by mattlockyer](https://img.shields.io/badge/made%20by-MattLockyer-ff1414.svg?style=flat-square)](https://github.com/mattlockyer) - - -
    - -
    -Table of Contents - -- [About](#about) -- [Installation](#installation) -- [Getting Started](#getting-started) - - [Initializing the SDK](#initializing-the-sdk) - - [View Functions](#view-functions) - - [Creating Drops](#creating-drops) - - [Simple Drop With 10 Random Keys](#creating-a-simple-drop-with-10-random-keys) - - [Simple Drop With Deterministic Keys](#creating-a-simple-drop-with-5-deterministically-generated-keys) - - [Simple Drop With Pre-Created Keys](#creating-a-simple-drop-with-pre-created-keys) - - [Password Protected Keys](#creating-a-simple-drop-with-a-password-protected-key) - - [Claiming Linkdrops](#claiming-linkdrops) - - [Claiming To Existing Account](#claiming-a-linkdrop-to-an-Existing-Account) - - [Claiming To a New Account](#Claiming-a-Linkdrop-and-Onboarding-a-New-User) - - [Claiming Password Protected Drops](#Claiming-a-Password-Protected-Linkdrop) - - [Deleting Keys and Drops](#Deleting-Keys-and-Drops) - - [Deleting Keys](#Delete-Keys) - - [Deleting Drops](#Delete-Drops) - - [Account Balances for Smooth UX](#Account-Balances-for-Smooth-UX) - - [Utility Functions](#Utility-Functions) -- [Tests](#tests) - - [Running the Tests](#Running-the-Tests) -- [Costs](#costs) - - [Per Drop](#per-drop) - - [Per Key](#per-key) -- [How Linkdrops Work](#how-linkdrops-work) -- [Contributing](#contributing) - -
    +

    + + + + +

    Keypom JavaScript SDK

    + +

    + +

    + + + + + + + + + + + + +

    --- -# About -> To view our debut talk at NEARCON 2022, click [here](https://www.youtube.com/watch?v=J-BOnfhHV50). +> To view our Eth DENVER talk, click [here](https://youtu.be/oHj-GjFi6g4). > To read more about the Keypom Protocol, refer to the [official GitHub repository](https://github.com/keypom/keypom#about) -The Keypom JavaScript SDK is a library that allows developers to easily interact with the Keypom Protocol. The SDK abstracts away all the complex interactions that come with interacting with the protocol. It allows developers to tap into the power of Keypom with as little barrier to entry as possible by providing easy to use plug-and-play functions. - -Developers should be able to focus on building without needing to understand exactly how interactions with the Keypom protocol work. - -The Keypom SDK was built with flexibility in mind. We want to support integrating Keypom whether you're creating a dApp built with the with the [wallet-selector](https://github.com/near/wallet-selector), creating a backend, or if you're simply using a local node script. - -To build the complete TypeDocs locally, run the following command: - -```ts -yarn build-docs && cd doc && python -m http.server 4200 -``` - -Alternatively, you can visit the official Keypom docs which host the type docs found [here](https://docs.keypom.xyz/). - -# Installation - -To install the Keypom SDK, simply run the following command: - -```bash -npm install keypom-js -# or -yarn add keypom-js -# or -pnpm add keypom-js -``` - -This should add the following dependency to your `package.json` where the version number will be the latest SDK release. - -```js -"dependencies": { - "keypom-js": "*.*.*" -}, -``` - - # Getting Started -The first thing to do when getting started with the SDK is to call the `initKeypom` function. This will initialize the state and establish a connection to the NEAR blockchain. This *must* be done before using any other function that interacts with the chain. The exception is if you're only using utility functions such as `generateKeys` which does not interact with the blockchain. - -## Initializing the SDK - -When calling `initKeypom`, there are several arguments that can be passed in as outlined below. - -- `near?` ([NEAR](https://github.com/near/near-api-js/blob/master/packages/near-api-js/src/near.ts)): A pre-existing NEAR connection object to use. By default, the SDK will create a new connection based on the `network` passed in. -- `network` (string): The network to connect to, either `mainnet` or `testnet`. -- `funder?` ([Funder](https://github.com/keypom/keypom-js/blob/main/src/lib/types/general.ts#L20-L42)): Object containing important information about the funder's account. If specified, the SDK will use this account to sign all transactions unless otherwise overridden by passing in a `wallet` or `account` argument in the SDK methods. -- `keypomContractId?` (string): Instead of using the most up-to-date, default Keypom contract, you can specify a specific account ID to use. If an older version is specified, some features of the SDK might not be usable. It is important to note that the SDK only works for official Keypom contracts. - -There are several different scenarios that will determine what should be passed into `initKeypom`: -- If you only wish to invoke `view` methods and retrieve information from the Protocol without signing any transactions, no `funder` object is required. -- If the funder changes a lot, you may wish to pass in a custom `near` object that has a `keyStore` containing the keys for each funder. When you then call SDK methods, you can pass in different `account` objects. -- If you're using the SDK on a frontend with wallet-selector, don't pass in a `funder` object and instead pass in a `wallet` object when calling SDK methods. - -## View Functions - -Once the SDK has been initialized, you can start calling methods. The simplest functions to call are those that require no signature and are used to retrieve information from the protocol. A list of view functions available and what they do can be found below. - -- `getKeyBalance` - Returns the balance associated with given key. This is used by the NEAR wallet to display the amount of the linkdrop. -- `getKeyTotalSupply` - Query for the total supply of keys currently on the Keypom contract. -- `getKeys` - Paginate through all active keys on the contract and return a vector of key info. -- `getKeyInformation` - Returns the KeyInfo corresponding to a specific public key. -- `getKeyInformationBatch` - Returns a vector of KeyInfo corresponding to a set of public keys passed in. -- `getDropInformation` - Get information about a specific drop by passing in either a drop ID, public key, or secret key. -- `getKeySupplyForDrop` - Returns the total supply of active keys for a given drop. -- `getKeysForDrop` - Paginate through all keys in a specific drop, returning an array of KeyInfo. -- `getDropSupplyForOwner` - Returns the total supply of active drops for a given account ID -- `getDrops` - Paginate through drops owned by an account. If specified, information for the first 50 keys in each drop can be returned as well. -- `getNftSupplyForDrop` - Return the total supply of token IDs for a given NFT drop. -- `getNftTokenIDsForDrop` - Paginate through token IDs in an NFT drop to return a vector of token IDs. -- `getUserBalance` - Query for a user's current balance on the Keypom contract -- `getContractSourceMetadata` - Returns the source metadata for the Keypom contract that the SDK has been initialized on. This includes valuable information such as which specific version the contract is on and link to exactly which GitHub commit is deployed. - -A quick example of showing how to initialize the SDK and call a view function is shown below: - -```typescript -// Initialize the SDK on testnet. No funder is passed in since we're only doing view calls. -await initKeypom({ - network: "testnet", -}); - -// Query for the Keypom contract's source metadata -const metadata = await getContractSourceMetadata(); - -console.log('metadata: ', metadata) -``` - -## Creating Drops - -The core of Keypom revolves around creating drops. This is where the true power of the protocol comes in. With the SDK, the complex logic and data structures have been simplified and abstracted away from the developer. With this in mind, to create a drop, you need to call the `createDrop` function. It has a suite of arguments depending on what the desired outcome should be: - -- `account?` ([Account](https://github.com/near/near-api-js/blob/master/packages/near-api-js/src/account.ts)) - Valid NEAR account object that if passed in, will be used to sign the txn instead of the funder account. -- `wallet?` ([BrowserWalletBehaviour | Wallet](https://github.com/near/wallet-selector/blob/main/packages/core/src/lib/wallet/wallet.types.ts)) - If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. -- `numKeys` (number) - Specify how many keys should be generated for the drop. If `publicKeys` is not passed in, `numKeys` number of keys are automatically created. The behaviour of this automatic creation depends on if the funder has rootEntropy set OR rootEntropy is passed in. In this case, the keys will be deterministically generated using the drop ID, key nonce, and entropy. Otherwise, each key will be generated randomly. -- `publicKeys?` (string[]) - Pass in a custom set of publicKeys to add to the drop. If this is not passed in, keys will be generated based on the `numKeys` parameter. -- `depositPerUseNEAR?` (number) - Specify how much $NEAR should be contained in each link. Unit in $NEAR (i.e `1` = 1 $NEAR) -- `depositPerUseYocto?` (string) - Specify how much $yoctoNEAR should be contained in each link. Unit in yoctoNEAR (1 yoctoNEAR = 1e-24 $NEAR) -- `dropId?` (string) - Specify a custom drop ID rather than using one from the SDK. If no drop ID is passed in, an ID equal to `Date.now()` will be used. -- `config?` ([DropConfig](https://github.com/keypom/keypom-js/blob/ben/readme/src/lib/types/drops.ts#L61-L99)) - Allows specific drop behaviors to be configured such as the number of uses each key / link will have. -- `metadata?` (string) - Specify a string of metadata to attach to the drop. This can be whatever you would like and is optional. Often this is stringified JSON. -- `simpleData?` ([SimpleData](https://github.com/keypom/keypom-js/blob/main/src/lib/types/drops.ts#L61-L99)) - For creating a simple drop, this contains necessary configurable information about the drop. -- `ftData?` ([FTData](https://github.com/keypom/keypom-js/blob/main/src/lib/types/ft.ts#L1-L23)) - For creating a fungible token drop, this contains necessary configurable information about the drop. -- `nftData?` ([NFTData](https://github.com/keypom/keypom-js/blob/main/src/lib/types/nft.ts#L1-L15)) - For creating a non-fungible token drop, this contains necessary configurable information about the drop. -- `fcData?` ([FCData](https://github.com/keypom/keypom-js/blob/main/src/lib/types/fc.ts#L57-L70)) - For creating a function call drop, this contains necessary configurable information about the drop. -- `rootEntropy?` (string) - Specify a custom entropy to use for generating keys (will overload the funder's rootEntropy if applicable). This parameter only matters if the publicKeys variable is not passed in. -- `basePassword?` (string) - For doing password protected drops, this is the base string that will be used to generate all the passwords. It will be double hashed with the public key and specific key use to generate the password for each key. -- `passwordProtectedUses?` (number[]) - For doing password protected drops, specifies exactly which uses will be password protected. The uses are NOT zero indexed (i.e 1st use = 1). Each use will have a different, unique password generated via double hashing the base password + public key + key use. -- `useBalance?` (boolean) - If the account has a balance within the Keypom contract, set this to true to avoid the need to attach a deposit. If the account doesn't have enough balance, an error will throw. -- `returnTransactions?` (boolean) - If true, the transaction will be returned instead of being signed and sent. This is useful for getting the requiredDeposit from the return value without actually signing the transaction. -- `successUrl?` (string) - When signing with a wallet, a success URl can be included that the user will be redirected to once the transaction has been successfully signed. - -While there are many fields and it may be overwhelming, seeing examples will help clear things up. - -The last thing to note is the return value of `createDrop` since it contains important information that can be used to interact with the drop. The return value is an object with the following fields: -```ts -/** - * Information returned when creating a drop or adding keys via `createDrop` and `addKeys` respectively. - */ -export interface CreateOrAddReturn { - /** The responses to any transactions that were signed and sent to the network. */ - responses?: any, - /** Information about the transactions if `returnTransactions` is specified in the arguments. This will result in the information being returned instead of signed and sent. */ - transactions?: Transaction[], - /** The required deposit that should be attached to the transaction. */ - requiredDeposit?: string, - /** Any keys that were automatically generated. */ - keys?: { - /** Actual KeyPair objects that can be used to sign messages, verify signatures, and get the public and private keys */ - keyPairs: NearKeyPair[]; - /** Set of public keys that were generated */ - publicKeys: string[]; - /** Set of private keys that were generated */ - secretKeys: string[]; - }, - /** The drop ID for the drop that is being interacted with. */ - dropId: string -} -``` - -### Creating a simple drop with 10 random keys - -In this example, a simple $NEAR drop with 10 keys will be created. To start, the Keypom SDK is initialized with a funder object (since a transaction will be signed). This funder object contains no `rootEntropy` field since all the keys should be random. - -The next step is to create the drop with 10 keys. `numKeys` is passed in as well as `depositPerUseNEAR` to indicate that each key should contain 1 $NEAR. - -```js -// Initialize the SDK for the given network and NEAR connection. No entropy passed in so any auto-generated keys will be completely random unless otherwise overwritten. -await initKeypom({ - network: "testnet", - funder: { - accountId: "benji_demo.testnet", - secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" - } -}); - -// Create a drop with 10 completely random keys. The return value `keys` contains information about the generated keys -const {keys} = await createDrop({ - numKeys: 10, - depositPerUseNEAR: 1, -}); - -console.log('public keys: ', keys.publicKeys); -console.log('private keys: ', keys.secretKeys); -``` - -### Creating a simple drop with 5 deterministically generated keys - -In this example, a simple $NEAR drop will be created whereby all the keys are deterministically generated based off the funder's `rootEntropy` (think a password). This allows the funder to be able to recover the keys easily assuming they know the password. - -To start, `initKeypom` is called and the funder object is passed in and contains a root entropy set to `my-global-secret-password`. This means that any keys that are *auto-generated* will be based off this entropy rather than being random. - -Once the SDK is initialized, the drop is created with 5 keys and 1 $NEAR per key. To double check if everything worked, the `generateKeys` method can be leveraged where each key can be generated from the `rootEntropy`, the `dropId`, and the corresponding key nonce (starting at 0). This second piece of entropy that is unique to each key is known as `metaEntropy`. We can generated it by setting an array equal to: `["1_0", "1_1", "1_2", "1_3", "1_4"]` where `1` is the drop ID and the second number is the key nonce (separated by an underscore since that's how the SDK does things). What happens behind the scenes is that the root entropy is combined with the meta entropy for each key and hashed to generate the key. - -Using `generateKeys`, the resulting keys can be compared with the ones generated by the SDK and they turn out to be the same. - -```js -// Initialize the SDK for the given network and NEAR connection. Root entropy is passed into the funder account so any generated keys will be based off that entropy. -await initKeypom({ - network: "testnet", - funder: { - accountId: "benji_demo.testnet", - secretKey:"d25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1", - rootEntropy: "my-global-secret-password" - } -}); - -// Create a simple drop with 5 keys. Each key will be derived based on the rootEntropy of the funder, drop ID, and key nonce. -const { keys: keysFromDrop, dropId } = await createDrop({ - numKeys: 5, - depositPerUseNEAR: 1, -}); - -// Deterministically Generate the Private Keys: -const nonceDropIdMeta = Array.from({length: 5}, (_, i) => `${dropId}_${i}`); -const manualKeys = await generateKeys({ - numKeys: 5, - rootEntropy: "my-global-secret-password", - metaEntropy: nonceDropIdMeta -}) - -// Get the public and private keys from the keys generated by the drop -const {publicKeys, secretKeys} = keysFromDrop; -// Get the public and private keys from the keys that were manually generated -const {publicKeys: pubKeysGenerated, secretKeys: secretKeysGenerated} = manualKeys; -// These should match! -console.log('secretKeys: ', secretKeys) -console.log('secretKeysGenerated: ', secretKeysGenerated) - -// These should match! -console.log('publicKeys: ', publicKeys) -console.log('pubKeysGenerated: ', pubKeysGenerated) -``` - -### Creating a simple drop with pre-created keys - -This example showcases how you can create a simple drop and pass in keys that are generated ahead of time rather than having them be auto-generated. The first step is always to call `initKeypom`. Once that's finished, the keypairs can be generated by calling `generateKeys` and passing in the number of keys to create. Those public keys can then be passed into `createDrop`. - -```js -// Initialize the SDK for the given network and NEAR connection. No entropy passed in so any auto generated keys will be completely random unless otherwise overwritten. -await initKeypom({ -network: "testnet", -funder: { - accountId: "benji_demo.testnet", - secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" -} -}); - -// Generate 10 random keys -const {publicKeys} = await generateKeys({ - numKeys: 10 -}); - -// Create a drop using the keys that were generated. Since keys are passed in, the return value won't contain information about the keys. -await createDrop({ - publicKeys, - depositPerUseNEAR: 1, -}); -``` - -### Creating a simple drop with a password protected key - -This example shows how you can create a password-protected key. This means that only the person with both the private key *and* the password can claim the $NEAR. The first step is always to call `initKeypom`. After that, a `basePassword` can be passed into `createDrop`. By passing in that parameter, the SDK will enable password protection whereby the password is equal to a hash of `'basePassword + publicKey + keyUse'`. - -```js -// Initialize the SDK for the given network and NEAR connection -await initKeypom({ - network: "testnet", - funder: { - accountId: "benji_demo.testnet", - secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" - } -}); - - -const basePassword = "my-cool-password123"; -// Create a simple drop with 1 $NEAR and pass in a base password to create a unique password for each use of each key -const {keys} = await createDrop({ - numKeys: 1, - depositPerUseNEAR: 1, - basePassword -}); - -// Create the password to pass into claim which is a hash of the basePassword, public key and whichever use we are on -let currentUse = 1; -let passwordForClaim = await hashPassword(basePassword + keys.publicKeys[0] + currentUse.toString()); -``` - -## Claiming Linkdrops - -Once a drop has been created and there are keys available, they can be claimed by calling the SDK's `claim` function. This can be used to either claim the assets to an existing NEAR account or create an entirely new account. The parameters for the function are below. - -- `secretKey` (string) - The private key associated with the Keypom link. This can either contain the `ed25519:` prefix or not. -- `accountId?` (string) - The account ID of an existing account that will be used to claim the drop. -- `newAccountId?` (string) - If passed in, a new account ID will be created and the drop will be claimed to that account. This must be an account that does not exist yet. This must be passed in conjunction with `newPublicKey`. -- `newPublicKey?` (string) - If creating a new account, a public key must be passed in to be used as the full access key for the newly created account. -- `password?` (string) - If a password is required to use the key, it can be passed in. - -As with creating drops, it helps to look at examples to understand the different scenarios whereby calling `claim` makes sense. - -### Claiming a Linkdrop to an Existing Account - -In this example, you'll create a simple $NEAR drop with 1 key. The key will be automatically generated and will be completely random since no entropy is used. The first step is to initialize the SDK and call `createDrop`. The return value will contain `keys` since they're being auto-generated. - -Once the drop is created, the secret key can be used to claim to an existing account `benjiman.testnet`. - -```js -// Initialize the SDK for the given network and NEAR connection -await initKeypom({ - network: "testnet", - funder: { - accountId: "benji_demo.testnet", - secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" - } -}); - -// Create a simple drop with 1 $NEAR -const {keys} = await createDrop({ - numKeys: 1, - depositPerUseNEAR: 1, -}); - -// Claim the drop to the passed in account ID -await claim({ - secretKey: keys.secretKeys[0], - accountId: "benjiman.testnet" -}) -``` - -### Claiming a Linkdrop and Onboarding a New User - -This example will show how to onboard a new user by claiming a simple linkdrop. To start, you'll create a simple $NEAR drop with 1 key. The key will be automatically generated and will be completely random since no entropy is used. - -Once the drop is created, `claim` should be called and the new account ID and public key should be passed in. This public key can either be a completely new keypair or the same keypair that was used to claim the linkdrop. In this tutorial, a new keypair is generated. - -```js -// Initialize the SDK for the given network and NEAR connection -await initKeypom({ - network: "testnet", - funder: { - accountId: "benji_demo.testnet", - secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" - } -}); - -// Create a simple drop with 1 $NEAR -const {keys} = await createDrop({ - numKeys: 1, - depositPerUseNEAR: 1, -}); - -// create a new keypair which will be used for the new account -const {publicKeys, secretKeys} = await generateKeys({ - numKeys: 1 -}); - -// Claim the drop using the secret key from the drop creation step. The newly created account will have a keypair -// from the generateKeys step. -await claim({ - secretKey: keys.secretKeys[0], - newAccountId: "my-newly-creating-account.testnet", - newPublicKey: publicKeys[0] -}) -``` - -### Claiming a Password Protected Linkdrop - -This example aims to show how a password protected drop can be created and claimed. The first step is always to initialize the SDK. Once that's finished, a base password for the key can be used and passed into `createDrop`. - -When claiming the linkdrop, the password must be passed in otherwise the claim will be unsuccessful. This password is made up of the base password, public key, and current use the key is on (relevant for multi-use keys). - -```js -// Initialize the SDK for the given network and NEAR connection -await initKeypom({ - network: "testnet", - funder: { - accountId: "benji_demo.testnet", - secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" - } -}); - -const basePassword = "my-cool-password123"; -// Create a simple drop with 1 $NEAR and pass in a base password to create a unique password for each use of each key -const {keys} = await createDrop({ - numKeys: 1, - depositPerUseNEAR: 1, - basePassword -}); - -// Create the password to pass into claim which is a hash of the basePassword, public key and whichever use we are on -let currentUse = 1; -let passwordForClaim = await hashPassword(basePassword + keys.publicKeys[0] + currentUse.toString()); - -// Claim the drop to the passed in account ID and use the password we generated above. -await claim({ - secretKey: keys.secretKeys[0], - accountId: "benjiman.testnet", - password: passwordForClaim -}) -``` - -## Deleting Keys and Drops - -Often times, not all the keys in your drop will be used. What happens to the excess keys? Keypom allows you to delete keys from a drop and get fully refunded for any unclaimed assets. This is done by calling the SDK's `deleteKeys` and `deleteDrops` respectively. The difference between the two is outlined below. -- `deleteKeys` allows you to delete a set of specific keys from a drop and get refunded for the assets. This does *not* delete the drop as a whole. -- `deleteDrops` allows you to delete a set of drops and all the keys contained within them. It does this by recursively calling `deleteKeys` for each drop until they're empty and then deleting the drop itself. - -The parameters for both functions are outlined below: - -### Delete Keys - -- `account?` ([Account](https://github.com/near/near-api-js/blob/master/packages/near-api-js/src/account.ts)) - Valid NEAR account object that if passed in, will be used to sign the txn instead of the funder account. -- `wallet?` ([BrowserWalletBehaviour | Wallet](https://github.com/near/wallet-selector/blob/main/packages/core/src/lib/wallet/wallet.types.ts)) - If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. -- `publicKeys` (string[] | string) - Specify a set of public keys to delete. If deleting a single publicKey, the string can be passed in without wrapping it in an array. -- `dropId` (string) - Which drop ID do the keys belong to? -- `withdrawBalance?` (boolean) - Whether or not to withdraw any remaining balance on the Keypom contract. - -An example of deleting keys can be seen below where a simple drop with 5 keys is created and one key is deleted. - -```js -// Initialize the SDK for the given network and NEAR connection -await initKeypom({ - network: "testnet", - funder: { - accountId: "benji_demo.testnet", - secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" - } -}); - -// Create the simple drop with 5 random keys -const {keys, dropId} = await createDrop({ - numKeys: 5, - depositPerUseNEAR: 1, -}); - -await deleteKeys({ - dropId, - publicKeys: keys.publicKeys[0] // Can be wrapped in an array as well -}) -``` - -### Delete Drops - -- `account?` ([Account](https://github.com/near/near-api-js/blob/master/packages/near-api-js/src/account.ts)) - Valid NEAR account object that if passed in, will be used to sign the txn instead of the funder account. -- `wallet?` ([BrowserWalletBehaviour | Wallet](https://github.com/near/wallet-selector/blob/main/packages/core/src/lib/wallet/wallet.types.ts)) - If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. -- `drops?` ([ProtocolReturnedDrop](https://github.com/keypom/keypom-js/blob/main/src/lib/types/protocol.ts#L29-L60)[]) - If the set of drop information for the drops you want to delete (from `getDropInformation` or `getDrops`) is already known to the client, it can be passed in instead of the drop IDs to reduce computation. -- `dropIds?` (string[]) - Specify a set of drop IDs to delete. -- `withdrawBalance?` (boolean) - Whether or not to withdraw any remaining balance on the Keypom contract. - -An example of deleting drops can be seen below where 5 simple drops are created and then they're all deleted in one call to `deleteDrops`. - -```js -// Initialize the SDK for the given network and NEAR connection -await initKeypom({ - network: "testnet", - funder: { - accountId: "benji_demo.testnet", - secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" - } -}); - -// loop to create 5 simple drops each with 5 more keys than the next -for(var i = 0; i < 5; i++) { - // create 10 keys with no entropy (all random) - const {publicKeys} = await generateKeys({ - numKeys: 5 * (i+1) // First drop will have 5, then 10, then 15 etc.. - }); - - // Create the simple - await createDrop({ - publicKeys, - depositPerUseNEAR: 1, - }); -} - -let drops = await getDrops({accountId: "benji_demo.testnet"}); - -await deleteDrops({ - drops -}) - -// Get the number of drops the account has after deletion (should be zero) -const numDrops = await getDropSupply({ - accountId: "benjiman.testnet" -}); - -console.log('numDrops: ', numDrops) -``` - -## Account Balances for Smooth UX - -In order to make the UX of using Keypom seamless, the SDK supports the Protocol's debiting account model. All costs and refunds can go through your account's balance which is stored on the contract. This balance can be topped up or withdrawn at any moment using the SDK's `addToBalance` and `withdrawBalance` functions. - -This account balance system is not used by default and must be explicitly enabled by passing in the `useBalance` flag to any corresponding functions. The benefits of using the account balance system is that for browser based wallets, you can skip redirects. - -A very common scenario is creating a drop with many keys at once. To avoid having to redirect the user many times (since only 100 keys can be added to a drop at once), you can call `createDrop` and pass in `returnTransactions` set to true. This will result in the transaction being returned instead of signed and sent. At this point, you can get the required deposit from the returned object and use that in `addToBalance`. - -At this point, the user will only be redirected once for the call to `addToBalance`. Once they returned, you can call `createDrop` in conjunction with `addKeys` with `useBalance` set to true. - -## Utility Functions - -There are several functions and variables that have been exported in order to make developing easier. Below are a few notable functions: -- `nearAPI` (variable) - Contains a suite of functionalities coming from `near-api-js`. This includes, but is not limited to the KeyPair object, formatting functions, different keystores etc. -- `updateFunder()` - Allows you to update the funder account for the SDK. This is useful if you want to use a different account to sign transactions. -- `useKeypom()` - Returns all the environment variables that are used by the SDK. This includes the funder object, Keypom contract, keystore, NEAR connection etc. -- `hashPassword()` - Generate a sha256 hash of a passed in string. This also supports hex encoded strings. -- `formatNearAmount()` - Converts a human readable NEAR amount (i.e 1.5 $NEAR) to yoctoNEAR. -- `parseNearAmount()` - Converts a yoctoNEAR amount to a human readable NEAR amount (i.e 1500000000000000000000000 yoctoNEAR -> 1.5 $NEAR). -- `generateKeys()` - Generate a desired number of keypairs. These can be created with or without entropy. - -# Tests - -The SDK comes equipped with a number of tests. These can be used as reference for different scenarios that arise with Keypom. To run the tests, you'll need to have a few prerequisites. - -## Running the Tests - -First, you'll need a valid NEAR account's secret key and account ID. These need to exported as environment variables as the tests will be running on testnet and the transactions need to be signed. Export the following environment variables: - -```bash -export TEST_ACCOUNT_ID="YOUR_ACCOUNT_ID" -export TEST_ACCOUNT_PRVKEY="YOUR_SECRET_KEY" -``` - -Once completed, install the dependencies: - -```bash -npm install -``` - -At this point, everything is in order so that the tests can be run. The following command can be used to begin running the tests: - -```bash -npm run test -``` - -If all went well, the following should be outputted once all the tests have run: - -```bash - ✔ delete 1 key from simple drop (3.7s) -requiredDeposit: 1856805594168075000000050 -Receipt: uN5cwkUFXB2gY4LE8vfuCGvA8BcqaTVgoExKQGu2Cct - Log [v1-3.keypom.testnet]: User balance incremented by 1.8568055. Old: 0 new: 1.8568055 - ✔ Create drop and return requiredDeposit so it can be added to balance (10.5s) - ✔ invalid args being passed in - ─ - - 18 tests passed -``` - -# Costs - -It is important to note that the Keypom contracts are 100% **FEE FREE** and will remain that way for the *forseeable future*. These contracts are a public good and are meant to inspire change in the NEAR ecosystem. - -With that being said, there are several mandatory costs that must be taken into account when using Keypom. These costs are broken down into two categories: per key and per drop. - -> **NOTE:** Creating an empty drop and then adding 100 keys in separate calls will incur the same cost as creating a drop with 100 keys in the same call. - -## Per Drop - -When creating an empty drop, there is only one cost to keep in mind regardless of the drop type: -- Storage cost (**~0.006 $NEAR** for simple drops) - -## Per Key -Whenever keys are added to a drop (either when the drop is first created or at a later date), the costs are outlined below. - -### Key Costs for Simple Drop - -- $NEAR sent whenever the key is used (can be 0). -- Access key allowance (**~0.0187 $NEAR per use**). -- Storage for creating access key (**0.001 $NEAR**). -- Storage cost (**~0.006 $NEAR** for simple drops) - -### Additional Costs for NFT Drops - -Since keys aren't registered for use until **after** the contract has received the NFT, we don't know how much storage the token IDs will use on the contract. To combat this, the Keypom contract will automatically measure the storage used up for storing each token ID in the `nft_on_transfer` function and that $NEAR will be taken from the funder's balance. - -### Additional Costs for FT Drops - -Since accounts claiming FTs may or may not be registered on the Fungible Token contract, Keypom will automatically try to register **all** accounts. This means that the drop creators must front the cost of registering users depending on the `storage_balance_bounds` returned from the FT contract. This applies to every use for every key. - -In addition, Keypom must be registered on the FT contract. If you create a FT drop and are the first person to ever do so for a specific FT contract on Keypom, Keypom will be automatically registered when the drop is created. This is a one time cost and once it is done, no other account will need to register Keypom for that specific FT contract. - -### Additional Costs for FC Drops - -Drop creators have a ton of customization available to them when creation Function Call drops. A cost that they might incur is the attached deposit being sent alongside the function call. Keypom will charge creators for all the attached deposits they specify. - -> **NOTE:** The storage costs are dynamically calculated and will vary depending on the information you store on-chain. +The Keypom SDK comes in two parts: +1. The Core SDK +2. The Keypom Wallet Selector -# How Linkdrops Work +To get started with the Core SDK, refer to our [starting guide](https://github.com/keypom/keypom-js/tree/main/packages/core/README.md). -For some background as to how linkdrops works on NEAR: +Similarly, a getting started guide for the Keypom Wallet Selector can be found [here](https://github.com/keypom/keypom-js/tree/main/packages/selector/README.md). -*The funder that has an account and some $NEAR:* -- creates a keypair locally `(pubKey1, privKey1)`. The blockchain doesn't know of this key's existence yet since it's all local for now. -- calls `send` on the contract and passes in the `pubKey1` as an argument as well as the desired `balance` for the linkdrop. - - The contract will map the `pubKey1` to the desired `balance` for the linkdrop. - - The contract will then add the `pubKey1` as a **function call access key** with the ability to call `claim` and `create_account_and_claim`. This means that anyone with the `privKey1` that was created locally, can claim this linkdrop. -- Funder will then create a link to send to someone that contains this `privKey1`. The link follows the following format: -``` - wallet.testnet.near.org/linkdrop/{fundingContractAccountId}/{linkdropKeyPairSecretKey}?redirectUrl={redirectUrl} -``` -* `fundingContractAccountId`: The contract accountId that was used to send the funds. -* `linkdropKeyPairSecretKey`: The corresponding secret key to the public key sent to the contract. -* `redirectUrl`: The url that wallet will redirect to after funds are successfully claimed to an existing account. The URL is sent the accountId used to claim the funds as a query param. +# Documentation -*The receiver of the link that is claiming the linkdrop:* -- Receives the link which includes `privKey1` and sends them to the NEAR wallet. -- Wallet creates a new keypair `(pubKey2, privKey2)` locally. The blockchain doesn't know of this key's existence yet since it's all local for now. -- Receiver will then choose an account ID such as `new_account.near`. -- Wallet will then use the `privKey1` which has access to call `claim` and `create_account_and_claim` in order to call `create_account_and_claim` on the contract. - - It will pass in `pubKey2` which will be used to create a full access key for the new account. -- The contract will create the new account and transfer the funds to it alongside any NFT or fungible tokens pre-loaded. +Visit our [documentation](https://docs.keypom.xyz/) for more information on the Keypom Protocol and the Keypom SDK. # Contributing From b5d2589e9050bec31cc3137426d6d4c8d7cef6c8 Mon Sep 17 00:00:00 2001 From: BenKurrek Date: Wed, 24 May 2023 14:57:38 -0400 Subject: [PATCH 11/12] removed docs package --- packages/docs/package.json | 38 ---- .../scripts/near-api-js/fc-near-example.js | 92 --------- .../scripts/near-api-js/ft-near-example.js | 125 ------------ .../scripts/near-api-js/nft-near-example.js | 111 ---------- .../near-api-js/simple-near-example.js | 66 ------ packages/docs/scripts/package.json | 32 --- packages/docs/scripts/sdk/fc-example.js | 84 -------- packages/docs/scripts/sdk/ft-example.js | 84 -------- packages/docs/scripts/sdk/nft-example.js | 86 -------- packages/docs/scripts/sdk/simple-example.js | 60 ------ packages/docs/scripts/utils/general.js | 28 --- .../tutorials/ticket-app-skeleton/.gitignore | 31 --- .../tutorials/ticket-app-skeleton/App.css | 38 ---- .../ticket-app-skeleton/components/qrcode.js | 22 -- .../ticket-app-skeleton/components/scanner.js | 51 ----- .../ticket-app-skeleton/css/global.css | 189 ------------------ .../tutorials/ticket-app-skeleton/index.css | 13 -- .../tutorials/ticket-app-skeleton/index.html | 4 - .../tutorials/ticket-app-skeleton/index.js | 48 ----- .../ticket-app-skeleton/package.json | 51 ----- .../ticket-app-skeleton/state/App.js | 28 --- .../ticket-app-skeleton/state/keyInfo.js | 13 -- .../static/img/green-check.png | Bin 104273 -> 0 bytes .../ticket-app-skeleton/static/img/red-x.png | Bin 17780 -> 0 bytes .../tutorials/ticket-app-skeleton/styles.css | 141 ------------- .../ticket-app-skeleton/utils/allowEntry.js | 14 -- .../utils/createTickDrop.js | 31 --- .../ticket-app-skeleton/utils/testTickDrop.js | 27 --- packages/docs/tutorials/ticket-app/.gitignore | 31 --- packages/docs/tutorials/ticket-app/App.css | 38 ---- .../tutorials/ticket-app/components/qrcode.js | 22 -- .../ticket-app/components/scanner.js | 151 -------------- .../docs/tutorials/ticket-app/css/global.css | 189 ------------------ packages/docs/tutorials/ticket-app/index.css | 13 -- packages/docs/tutorials/ticket-app/index.html | 4 - packages/docs/tutorials/ticket-app/index.js | 48 ----- .../docs/tutorials/ticket-app/package.json | 51 ----- .../docs/tutorials/ticket-app/state/App.js | 137 ------------- .../tutorials/ticket-app/state/keyInfo.js | 47 ----- .../ticket-app/static/img/green-check.png | Bin 104273 -> 0 bytes .../tutorials/ticket-app/static/img/red-x.png | Bin 17780 -> 0 bytes packages/docs/tutorials/ticket-app/styles.css | 141 ------------- .../tutorials/ticket-app/utils/allowEntry.js | 53 ----- .../ticket-app/utils/createTickDrop.js | 104 ---------- .../ticket-app/utils/testTickDrop.js | 76 ------- .../trial-accounts/create-trial-drop.js | 108 ---------- .../ext-wasm/trial-accounts.wasm | Bin 31626 -> 0 bytes .../trial-accounts/guest-book/.gitignore | 31 --- .../trial-accounts/guest-book/App.js | 61 ------ .../guest-book/components/Form.jsx | 44 ---- .../guest-book/components/Messages.jsx | 21 -- .../guest-book/components/SignIn.jsx | 22 -- .../trial-accounts/guest-book/contract.env | 1 - .../trial-accounts/guest-book/favicon.ico | Bin 8719 -> 0 bytes .../trial-accounts/guest-book/global.scss | 128 ------------ .../trial-accounts/guest-book/index.html | 26 --- .../trial-accounts/guest-book/index.js | 25 --- .../trial-accounts/guest-book/keypom-data.js | 58 ------ .../guest-book/near-interface.js | 24 --- .../trial-accounts/guest-book/near-wallet.js | 130 ------------ .../trial-accounts/guest-book/package.json | 66 ------ .../trial-accounts/guest-book/start.sh | 24 --- 62 files changed, 3381 deletions(-) delete mode 100644 packages/docs/package.json delete mode 100644 packages/docs/scripts/near-api-js/fc-near-example.js delete mode 100644 packages/docs/scripts/near-api-js/ft-near-example.js delete mode 100644 packages/docs/scripts/near-api-js/nft-near-example.js delete mode 100644 packages/docs/scripts/near-api-js/simple-near-example.js delete mode 100644 packages/docs/scripts/package.json delete mode 100644 packages/docs/scripts/sdk/fc-example.js delete mode 100644 packages/docs/scripts/sdk/ft-example.js delete mode 100644 packages/docs/scripts/sdk/nft-example.js delete mode 100644 packages/docs/scripts/sdk/simple-example.js delete mode 100644 packages/docs/scripts/utils/general.js delete mode 100644 packages/docs/tutorials/ticket-app-skeleton/.gitignore delete mode 100644 packages/docs/tutorials/ticket-app-skeleton/App.css delete mode 100644 packages/docs/tutorials/ticket-app-skeleton/components/qrcode.js delete mode 100644 packages/docs/tutorials/ticket-app-skeleton/components/scanner.js delete mode 100644 packages/docs/tutorials/ticket-app-skeleton/css/global.css delete mode 100644 packages/docs/tutorials/ticket-app-skeleton/index.css delete mode 100644 packages/docs/tutorials/ticket-app-skeleton/index.html delete mode 100644 packages/docs/tutorials/ticket-app-skeleton/index.js delete mode 100644 packages/docs/tutorials/ticket-app-skeleton/package.json delete mode 100644 packages/docs/tutorials/ticket-app-skeleton/state/App.js delete mode 100644 packages/docs/tutorials/ticket-app-skeleton/state/keyInfo.js delete mode 100644 packages/docs/tutorials/ticket-app-skeleton/static/img/green-check.png delete mode 100644 packages/docs/tutorials/ticket-app-skeleton/static/img/red-x.png delete mode 100644 packages/docs/tutorials/ticket-app-skeleton/styles.css delete mode 100644 packages/docs/tutorials/ticket-app-skeleton/utils/allowEntry.js delete mode 100644 packages/docs/tutorials/ticket-app-skeleton/utils/createTickDrop.js delete mode 100644 packages/docs/tutorials/ticket-app-skeleton/utils/testTickDrop.js delete mode 100644 packages/docs/tutorials/ticket-app/.gitignore delete mode 100644 packages/docs/tutorials/ticket-app/App.css delete mode 100644 packages/docs/tutorials/ticket-app/components/qrcode.js delete mode 100644 packages/docs/tutorials/ticket-app/components/scanner.js delete mode 100644 packages/docs/tutorials/ticket-app/css/global.css delete mode 100644 packages/docs/tutorials/ticket-app/index.css delete mode 100644 packages/docs/tutorials/ticket-app/index.html delete mode 100644 packages/docs/tutorials/ticket-app/index.js delete mode 100644 packages/docs/tutorials/ticket-app/package.json delete mode 100644 packages/docs/tutorials/ticket-app/state/App.js delete mode 100644 packages/docs/tutorials/ticket-app/state/keyInfo.js delete mode 100644 packages/docs/tutorials/ticket-app/static/img/green-check.png delete mode 100644 packages/docs/tutorials/ticket-app/static/img/red-x.png delete mode 100644 packages/docs/tutorials/ticket-app/styles.css delete mode 100644 packages/docs/tutorials/ticket-app/utils/allowEntry.js delete mode 100644 packages/docs/tutorials/ticket-app/utils/createTickDrop.js delete mode 100644 packages/docs/tutorials/ticket-app/utils/testTickDrop.js delete mode 100644 packages/docs/tutorials/trial-accounts/create-trial-drop.js delete mode 100755 packages/docs/tutorials/trial-accounts/ext-wasm/trial-accounts.wasm delete mode 100644 packages/docs/tutorials/trial-accounts/guest-book/.gitignore delete mode 100644 packages/docs/tutorials/trial-accounts/guest-book/App.js delete mode 100644 packages/docs/tutorials/trial-accounts/guest-book/components/Form.jsx delete mode 100644 packages/docs/tutorials/trial-accounts/guest-book/components/Messages.jsx delete mode 100644 packages/docs/tutorials/trial-accounts/guest-book/components/SignIn.jsx delete mode 100644 packages/docs/tutorials/trial-accounts/guest-book/contract.env delete mode 100644 packages/docs/tutorials/trial-accounts/guest-book/favicon.ico delete mode 100644 packages/docs/tutorials/trial-accounts/guest-book/global.scss delete mode 100644 packages/docs/tutorials/trial-accounts/guest-book/index.html delete mode 100644 packages/docs/tutorials/trial-accounts/guest-book/index.js delete mode 100644 packages/docs/tutorials/trial-accounts/guest-book/keypom-data.js delete mode 100644 packages/docs/tutorials/trial-accounts/guest-book/near-interface.js delete mode 100644 packages/docs/tutorials/trial-accounts/guest-book/near-wallet.js delete mode 100644 packages/docs/tutorials/trial-accounts/guest-book/package.json delete mode 100755 packages/docs/tutorials/trial-accounts/guest-book/start.sh diff --git a/packages/docs/package.json b/packages/docs/package.json deleted file mode 100644 index 20961b64f..000000000 --- a/packages/docs/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "@keypom/docs", - "version": "1.0.0-rc.2", - "description": "Examples and Tutorials used in the Keypom Documentation", - "main": "lib/index.js", - "scripts": { - "preinstall": "npx only-allow pnpm" - }, - "author": "benkurrek, mattlockyer", - "license": "MIT", - "dependencies": { - "@keypom/core": "workspace:*", - "@keypom/selector": "workspace:*", - "bn.js": "^5.2.1" - }, - "ava": { - "require": [ - "dotenv/config" - ] - }, - "devDependencies": { - "typedoc": "^0.23.24", - "typescript": "^4.8.4", - "ava": "^4.3.3", - "dotenv": "^10.0.0", - "@near-js/accounts": "^0.1.3", - "@near-js/crypto": "^0.0.4", - "@near-js/types": "^0.0.4", - "@near-js/wallet-account": "^0.0.6", - "@near-js/utils": "^0.0.4", - "@near-js/keystores-browser": "^0.0.4", - "@near-js/keystores-node": "^0.0.4", - "@near-wallet-selector/core": "^8.0.3", - "react": "^18.2.0", - "react-dom": "18.2.0", - "@types/react": "^18.0.26" - } -} diff --git a/packages/docs/scripts/near-api-js/fc-near-example.js b/packages/docs/scripts/near-api-js/fc-near-example.js deleted file mode 100644 index 5bb900495..000000000 --- a/packages/docs/scripts/near-api-js/fc-near-example.js +++ /dev/null @@ -1,92 +0,0 @@ -const { parseNearAmount, formatNearAmount } = require("near-api-js/lib/utils/format"); -const { KeyPair, keyStores, connect } = require("near-api-js"); -const path = require("path"); -const homedir = require("os").homedir(); - -async function fcDropNear(){ - // Initiate connection to the NEAR blockchain. - const network = "testnet" - const CREDENTIALS_DIR = ".near-credentials"; - const credentialsPath = path.join(homedir, CREDENTIALS_DIR); - const YOUR_ACCOUNT = "keypom-docs-demo.testnet"; - const NFT_TOKEN_ID = "near-api-token-" + Date.now().toString(); - const NFT_CONTRACT = "nft.examples.testnet"; - const KEYPOM_CONTRACT = "v2.keypom.testnet" - - let keyStore = new keyStores.UnencryptedFileSystemKeyStore(credentialsPath); - - let nearConfig = { - networkId: network, - keyStore: keyStore, - nodeUrl: `https://rpc.${network}.near.org`, - walletUrl: `https://wallet.${network}.near.org`, - helperUrl: `https://helper.${network}.near.org`, - explorerUrl: `https://explorer.${network}.near.org`, - }; - - let near = await connect(nearConfig); - const fundingAccount = await near.account(YOUR_ACCOUNT); - - // Keep track of an array of the keyPairs we create and the public keys to pass into the contract - let keyPairs = []; - let pubKeys = []; - // Generate keypairs and store them into the arrays defined above - let keyPair = await KeyPair.fromRandom('ed25519'); - keyPairs.push(keyPair); - pubKeys.push(keyPair.publicKey.toString()); - - - // Create FC drop with pubkkeys from above and fc data - // Note that the user is responsible for error checking when using NEAR-API-JS - // The SDK automatically does error checking; ensuring valid configurations, enough attached deposit, drop existence etc. - try { - // With our function call for this drop, we wish to allow the user to lazy mint an NFT - await fundingAccount.functionCall( - KEYPOM_CONTRACT, - 'create_drop', - { - public_keys: pubKeys, - deposit_per_use: parseNearAmount("0.1"), - fc: { - // 2D array of function calls. In this case, there is 1 function call to make for a key use - // By default, if only one array of methods is present, this array of function calls will be used for all key uses - methods: [ - // Array of functions for Key use 1. - [{ - receiver_id: NFT_CONTRACT, - method_name: "nft_mint", - args: JSON.stringify({ - token_id: NFT_TOKEN_ID, - metadata: { - title: "My Keypom NFT", - description: "Keypom is lit fam", - media: "https://bafybeiftczwrtyr3k7a2k4vutd3amkwsmaqyhrdzlhvpt33dyjivufqusq.ipfs.dweb.link/goteam-gif.gif", - } - }), - account_id_field: "receiver_id", - // Attached deposit of 1 $NEAR for when the receiver makes this function call - attached_deposit: parseNearAmount("1"), - }] - ] - } - }, - "300000000000000", - // Attcned depot of 1.5 $NEAR for creating the drop - parseNearAmount("1.5") - ); - } catch(e) { - console.log('error creating drop: ', e); - } - - var dropInfo = {}; - // Creating list of pk's and linkdrops; copied from orignal simple-create.js - for(var i = 0; i < keyPairs.length; i++) { - // For keyPairs.length > 1, change URL secret key to keyPair.secretKey[i] - let linkdropUrl = `https://wallet.testnet.near.org/linkdrop/${KEYPOM_CONTRACT}/${keyPair.secretKey}`; - dropInfo[pubKeys[i]] = linkdropUrl; - } - // Write file of all pk's and their respective linkdrops - console.log('Public Keys and Linkdrops: ', dropInfo) - console.log(`Keypom Contract Explorer Link: explorer.${network}.near.org/accounts/${KEYPOM_CONTRACT}.com`) -} -fcDropNear() diff --git a/packages/docs/scripts/near-api-js/ft-near-example.js b/packages/docs/scripts/near-api-js/ft-near-example.js deleted file mode 100644 index 8acc993bb..000000000 --- a/packages/docs/scripts/near-api-js/ft-near-example.js +++ /dev/null @@ -1,125 +0,0 @@ -const { parseNearAmount, formatNearAmount } = require("near-api-js/lib/utils/format"); -const { KeyPair, keyStores, connect } = require("near-api-js"); -const { getRecentDropId } = require("../utils/general.js") -const path = require("path"); -const homedir = require("os").homedir(); -const { BN } = require("bn.js"); - - -async function ftDropNear(){ - // Initiate connection to the NEAR testnet blockchain. - const network = "testnet" - const CREDENTIALS_DIR = ".near-credentials"; - const credentialsPath = path.join(homedir, CREDENTIALS_DIR); - const YOUR_ACCOUNT = "keypom-docs-demo.testnet"; - const FT_CONTRACT = "ft.keypom.testnet"; - const KEYPOM_CONTRACT = "v2.keypom.testnet"; - - let keyStore = new keyStores.UnencryptedFileSystemKeyStore(credentialsPath); - - let nearConfig = { - networkId: network, - keyStore: keyStore, - nodeUrl: `https://rpc.${network}.near.org`, - walletUrl: `https://wallet.${network}.near.org`, - helperUrl: `https://helper.${network}.near.org`, - explorerUrl: `https://explorer.${network}.near.org`, - }; - - let near = await connect(nearConfig); - const fundingAccount = await near.account(YOUR_ACCOUNT); - - // Get amount of FTs to transfer. In this scenario, we've assumed it to be 1 for one single use key. - let amountToTransfer = parseNearAmount("1") - let funderFungibleTokenBal = await fundingAccount.viewFunction( - FT_CONTRACT, - 'ft_balance_of', - { - account_id: YOUR_ACCOUNT - } - ); - - // Check if the owner has enough FT balance to fund drop - if (new BN(funderFungibleTokenBal).lte(new BN(amountToTransfer))){ - throw new Error('funder does not have enough Fungible Tokens for this drop. Top up and try again.'); - } - - // Keep track of an array of the keyPairs we create and public keys to pass into the contract - let keyPairs = []; - let pubKeys = []; - // Generate keypairs and store them in the arrays defined above - let keyPair = await KeyPair.fromRandom('ed25519'); - keyPairs.push(keyPair); - pubKeys.push(keyPair.publicKey.toString()); - - // Create drop with FT data - // Note that the user is responsible for error checking when using NEAR-API-JS - // The SDK automatically does error checking; ensuring valid configurations, enough attached deposit, drop existence etc. - try { - await fundingAccount.functionCall( - KEYPOM_CONTRACT, - 'create_drop', - { - public_keys: pubKeys, - deposit_per_use: parseNearAmount("1"), - ft: { - contract_id: FT_CONTRACT, - sender_id: YOUR_ACCOUNT, - // This balance per use is balance of FTs per use. - // parseNearAmount is used for conveience to convert to 10^24 - balance_per_use: parseNearAmount("1") - } - }, - "300000000000000", - // Attached deposit of 1.5 $NEAR - parseNearAmount("1.5") - ); - } catch(e) { - console.log('error creating drop: ', e); - } - - // Pay storage deposit and trasnfer FTs to Keypom contract. - try { - await fundingAccount.functionCall( - FT_CONTRACT, - 'storage_deposit', - { - account_id: YOUR_ACCOUNT, - }, - "300000000000000", - // We are using 0.1 $NEAR to pay the storage deposit to include our account ID in their registered list of users. - // Realistically, this will be more than enough and will be refunded the excess - parseNearAmount("0.1") - ); - - // Get the drop ID of the drop that we just created. This is for the message in the NFT transfer - let dropId = await getRecentDropId(fundingAccount, YOUR_ACCOUNT, KEYPOM_CONTRACT); - - console.log(dropId) - await fundingAccount.functionCall( - FT_CONTRACT, - 'ft_transfer_call', - { - receiver_id: KEYPOM_CONTRACT, - amount: (amountToTransfer.toString()), - msg: dropId.toString() - }, - "300000000000000", - // Attached deposit of 0.1 $NEAR - "1" - ); - } catch(e) { - console.log('error sending FTs', e); - } - var dropInfo = {}; - // Creating list of pk's and linkdrops; copied from orignal simple-create.js - for(var i = 0; i < keyPairs.length; i++) { - // For keyPairs.length > 1, change URL secret key to keyPair.secretKey[i] - let linkdropUrl = `https://wallet.testnet.near.org/linkdrop/${KEYPOM_CONTRACT}/${keyPair.secretKey}`; - dropInfo[pubKeys[i]] = linkdropUrl; - } - // Write file of all pk's and their respective linkdrops - console.log('Public Keys and Linkdrops: ', dropInfo) - console.log(`Keypom Contract Explorer Link: explorer.${network}.near.org/accounts/${KEYPOM_CONTRACT}.com`) -} -ftDropNear() \ No newline at end of file diff --git a/packages/docs/scripts/near-api-js/nft-near-example.js b/packages/docs/scripts/near-api-js/nft-near-example.js deleted file mode 100644 index 2fbcb6980..000000000 --- a/packages/docs/scripts/near-api-js/nft-near-example.js +++ /dev/null @@ -1,111 +0,0 @@ -const { parseNearAmount, formatNearAmount } = require("near-api-js/lib/utils/format"); -const { KeyPair, keyStores, connect } = require("near-api-js"); -const { getRecentDropId } = require("../utils/general.js") -const path = require("path"); -const homedir = require("os").homedir(); - -async function nftDropNear(){ - // Initiate connection to the NEAR testnet blockchain. - const network = "testnet" - const CREDENTIALS_DIR = ".near-credentials"; - const credentialsPath = path.join(homedir, CREDENTIALS_DIR); - const YOUR_ACCOUNT = "keypom-docs-demo.testnet"; - const NFT_TOKEN_ID = "near-api-token-" + Date.now().toString(); - const NFT_CONTRACT = "nft.examples.testnet"; - const KEYPOM_CONTRACT = "v2.keypom.testnet"; - - let keyStore = new keyStores.UnencryptedFileSystemKeyStore(credentialsPath); - - let nearConfig = { - networkId: network, - keyStore: keyStore, - nodeUrl: `https://rpc.${network}.near.org`, - walletUrl: `https://wallet.${network}.near.org`, - helperUrl: `https://helper.${network}.near.org`, - explorerUrl: `https://explorer.${network}.near.org`, - }; - - let near = await connect(nearConfig); - const fundingAccount = await near.account(YOUR_ACCOUNT); - - // Mint 1 NFT for the funder from the NFT contract outlined in the NFT_DATA - await fundingAccount.functionCall( - NFT_CONTRACT, - 'nft_mint', - { - receiver_id: YOUR_ACCOUNT, - metadata: { - title: "My Keypom NFT", - description: "Keypom is lit fam :D", - media: "https://bafybeiftczwrtyr3k7a2k4vutd3amkwsmaqyhrdzlhvpt33dyjivufqusq.ipfs.dweb.link/goteam-gif.gif", - }, - token_id: NFT_TOKEN_ID, - }, - "300000000000000", - // Attached deposit of 0.1 $NEAR - parseNearAmount("0.1") - ); - - // Keep track of an array of the key pairs we create and the public keys we pass into the contract - let keyPairs = []; - let pubKeys = []; - // Generate keypairs and store them into the arrays defined above - let keyPair = await KeyPair.fromRandom('ed25519'); - keyPairs.push(keyPair); - pubKeys.push(keyPair.publicKey.toString()); - - // Create drop with NFT data and transfer NFTs to Keypom - // Note that the user is responsible for error checking when using NEAR-API-JS - // The SDK automatically does error checking; ensuring valid configurations, enough attached deposit, drop existence etc. - try { - await fundingAccount.functionCall( - KEYPOM_CONTRACT, - 'create_drop', - { - public_keys: pubKeys, - deposit_per_use: parseNearAmount("1"), - nft: { - // Who will be sending the NFTs to the Keypom contract - sender_id: YOUR_ACCOUNT, - // NFT Contract Id that the tokens will come from - contract_id: NFT_CONTRACT - } - }, - "300000000000000", - // Attached deposit of 1 $NEAR - parseNearAmount("1") - ); - - // Get the drop ID of the drop that we just created. This is for the message in the NFT transfer - let dropId = await getRecentDropId(fundingAccount, YOUR_ACCOUNT, KEYPOM_CONTRACT); - - // Transfer the NFT to the Keypom contract. - // This gives Keypom the ownership and thus the ability to give it to the recipient when they use the linkdrop - await fundingAccount.functionCall( - NFT_CONTRACT, - 'nft_transfer_call', - { - receiver_id: KEYPOM_CONTRACT, - token_id: NFT_TOKEN_ID, - msg: dropId.toString() - }, - "300000000000000", - // Attached deposit of 1 $NEAR - "1" - ); - } catch(e) { - console.log('error creating drop: ', e); - } - var dropInfo = {}; - // Creating list of pk's and linkdrops; copied from orignal simple-create.js - for(var i = 0; i < keyPairs.length; i++) { - // For keyPairs.length > 1, change URL secret key to keyPair.secretKey[i] - let linkdropUrl = `https://wallet.testnet.near.org/linkdrop/${KEYPOM_CONTRACT}/${keyPair.secretKey}`; - dropInfo[pubKeys[i]] = linkdropUrl; - } - // Write file of all pk's and their respective linkdrops - console.log('Public Keys and Linkdrops: ', dropInfo) - console.log(`Keypom Contract Explorer Link: explorer.${network}.near.org/accounts/${KEYPOM_CONTRACT}.com`) -} - -nftDropNear() \ No newline at end of file diff --git a/packages/docs/scripts/near-api-js/simple-near-example.js b/packages/docs/scripts/near-api-js/simple-near-example.js deleted file mode 100644 index 0575105ac..000000000 --- a/packages/docs/scripts/near-api-js/simple-near-example.js +++ /dev/null @@ -1,66 +0,0 @@ -const { parseNearAmount, formatNearAmount } = require("near-api-js/lib/utils/format"); -const { KeyPair, keyStores, connect } = require("near-api-js"); -const path = require("path"); -const homedir = require("os").homedir(); - -async function simpleDropNear(){ - // Initiate connection to the NEAR blockchain. - const network = "testnet" - const CREDENTIALS_DIR = ".near-credentials"; - const credentialsPath = path.join(homedir, CREDENTIALS_DIR); - const YOUR_ACCOUNT = "keypom-docs-demo.testnet"; - const KEYPOM_CONTRACT = "v2.keypom.testnet" - - - let keyStore = new keyStores.UnencryptedFileSystemKeyStore(credentialsPath); - - let nearConfig = { - networkId: network, - keyStore: keyStore, - nodeUrl: `https://rpc.${network}.near.org`, - walletUrl: `https://wallet.${network}.near.org`, - helperUrl: `https://helper.${network}.near.org`, - explorerUrl: `https://explorer.${network}.near.org`, - }; - - let near = await connect(nearConfig); - const fundingAccount = await near.account(YOUR_ACCOUNT); - - // Keep track of an array of the key pairs we create and the public keys we pass into the contract - let keyPairs = []; - let pubKeys = []; - // Generate keypairs and store them into the arrays defined above - let keyPair = await KeyPair.fromRandom('ed25519'); - keyPairs.push(keyPair); - pubKeys.push(keyPair.publicKey.toString()); - - // Create drop with pub keys, deposit_per_use - // Note that the user is responsible for error checking when using NEAR-API-JS - // The SDK automatically does error checking; ensuring valid configurations, enough attached deposit, drop existence etc. - try { - await fundingAccount.functionCall( - KEYPOM_CONTRACT, - 'create_drop', - { - public_keys: pubKeys, - deposit_per_use: parseNearAmount('1'), - }, - "300000000000000", - // Generous attached deposit of 1.5 $NEAR - parseNearAmount("1.5") - ); - } catch(e) { - console.log('error creating drop: ', e); - } - var dropInfo = {}; - // Creating list of pk's and linkdrops; copied from orignal simple-create.js - for(var i = 0; i < keyPairs.length; i++) { - // For keyPairs.length > 1, change URL secret key to keyPair.secretKey[i] - let linkdropUrl = `https://wallet.testnet.near.org/linkdrop/${KEYPOM_CONTRACT}/${keyPair.secretKey}`; - dropInfo[pubKeys[i]] = linkdropUrl; - } - // Write file of all pk's and their respective linkdrops - console.log('Public Keys and Linkdrops: ', dropInfo) - console.log(`Keypom Contract Explorer Link: explorer.${network}.near.org/accounts/${KEYPOM_CONTRACT}.com`) -} -simpleDropNear() \ No newline at end of file diff --git a/packages/docs/scripts/package.json b/packages/docs/scripts/package.json deleted file mode 100644 index d34917dea..000000000 --- a/packages/docs/scripts/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "keypom-js", - "version": "0.0.14", - "description": "Keypom JS SDK", - "main": "./lib/index.js", - "scripts": { - "test": "yarn build && yarn ava", - "ava": "ava test/ws.test.js -vs --timeout=5m", - "build": "npx tsc", - "publish": "npx tsc && npm publish", - "fc-keypom": "node keypom-js-sdk/fc-example.js", - "ft-keypom": "node keypom-js-sdk/ft-example.js", - "nft-keypom": "node keypom-js-sdk/nft-example.js", - "simple-keypom": "node keypom-js-sdk/simple-example.js", - "fc-near": "node near-api-js/fc-near-example.js", - "ft-near": "node near-api-js/ft-near-example.js", - "nft-near": "node near-api-js/nft-near-example.js", - "simple-near": "node near-api-js/simple-near-example.js", - "testing-import" : "node near-api-js/testing.js" - - }, - "author": "mattlockyer", - "license": "MIT", - "dependencies": { - "keypom-js": "^1.4.9" - }, - "ava": { - "require": [ - "dotenv/config" - ] - } -} diff --git a/packages/docs/scripts/sdk/fc-example.js b/packages/docs/scripts/sdk/fc-example.js deleted file mode 100644 index 2535d6843..000000000 --- a/packages/docs/scripts/sdk/fc-example.js +++ /dev/null @@ -1,84 +0,0 @@ -const { parseNearAmount, formatNearAmount } = require("near-api-js/lib/utils/format"); -const { initKeypom, createDrop, getEnv, formatLinkdropUrl } = require("keypom-js"); -const { KeyPair, keyStores, connect } = require("near-api-js"); -const path = require("path"); -const homedir = require("os").homedir(); - -async function fcDropKeypom(){ - // Initiate connection to the NEAR blockchain. - const network = "testnet" - const CREDENTIALS_DIR = ".near-credentials"; - const credentialsPath = path.join(homedir, CREDENTIALS_DIR); - const YOUR_ACCOUNT = "keypom-docs-demo.testnet"; - const NFT_TOKEN_ID = "keypom-token-" + Date.now().toString(); - const NFT_CONTRACT = "nft.examples.testnet"; - - let keyStore = new keyStores.UnencryptedFileSystemKeyStore(credentialsPath); - - let nearConfig = { - networkId: network, - keyStore: keyStore, - nodeUrl: `https://rpc.${network}.near.org`, - walletUrl: `https://wallet.${network}.near.org`, - helperUrl: `https://helper.${network}.near.org`, - explorerUrl: `https://explorer.${network}.near.org`, - }; - - let near = await connect(nearConfig); - const fundingAccount = await near.account(YOUR_ACCOUNT); - - // If a NEAR connection is not passed in and is not already running, initKeypom will create a new connection - // Here we are connecting to the testnet network - await initKeypom({ - near, - network - }); - - // Note that the SDK does error checks to ensure all the information passed in will succeed when creating a drop. - // If any information is not valid, the SDK will panic and the drop will NOT be created. - // These checks include, but are not limited to, valid configurations, enough attached deposit, and drop existence. - const {keys} = await createDrop({ - account: fundingAccount, - numKeys: 1, - depositPerUseNEAR: "1", - // With our function call for this drop, we wish to allow the user to lazy mint an NFT - fcData: { - // 2D array of function calls. In this case, there is 1 function call to make for a key use - // By default, if only one array of methods is present, this array of function calls will be used for all key uses - methods: [ - // Array of functions for Key use 1. - [{ - receiverId: NFT_CONTRACT, - methodName: "nft_mint", - args: JSON.stringify({ - // Change this token_id if it already exists -> check explorer transaction - token_id: NFT_TOKEN_ID, - metadata: { - title: "My Keypom NFT", - description: "Keypom is lit fam", - media: "https://bafybeiftczwrtyr3k7a2k4vutd3amkwsmaqyhrdzlhvpt33dyjivufqusq.ipfs.dweb.link/goteam-gif.gif", - } - }), - accountIdField: "receiver_id", - // Attached deposit of 1 $NEAR for when the receiver makes this function call - attachedDeposit: parseNearAmount("1") - }] - ] - }, - }); - pubKeys = keys.publicKeys - - const {contractId: KEYPOM_CONTRACT} = getEnv() - // Creating list of pk's and linkdrops; copied from orignal simple-create.js - let linkdropUrl = formatLinkdropUrl({ - customURL: "https://testnet.mynearwallet.com/linkdrop/CONTRACT_ID/SECRET_KEY", - secretKeys: keys.secretKeys, - contractId: KEYPOM_CONTRACT - }) - // Write file of all pk's and their respective linkdrops - console.log('Public Keys: ', pubKeys) - console.log('Linkdrops: ', linkdropUrl) - console.log(`Keypom Contract Explorer Link: explorer.${network}.near.org/accounts/${KEYPOM_CONTRACT}.com`) - -} -fcDropKeypom() \ No newline at end of file diff --git a/packages/docs/scripts/sdk/ft-example.js b/packages/docs/scripts/sdk/ft-example.js deleted file mode 100644 index 66872f296..000000000 --- a/packages/docs/scripts/sdk/ft-example.js +++ /dev/null @@ -1,84 +0,0 @@ -const { parseNearAmount, formatNearAmount } = require("near-api-js/lib/utils/format"); -const { initKeypom, createDrop, getEnv, formatLinkdropUrl } = require("keypom-js"); -const { KeyPair, keyStores, connect } = require("near-api-js"); -const path = require("path"); -const homedir = require("os").homedir(); -const { BN } = require("bn.js"); - -async function ftDropKeypom(){ - // Initiate connection to the NEAR testnet blockchain. - const network = "testnet" - const CREDENTIALS_DIR = ".near-credentials"; - const credentialsPath = path.join(homedir, CREDENTIALS_DIR); - const YOUR_ACCOUNT = "keypom-docs-demo.testnet"; - const FT_CONTRACT = "ft.keypom.testnet"; - - let keyStore = new keyStores.UnencryptedFileSystemKeyStore(credentialsPath); - - let nearConfig = { - networkId: network, - keyStore: keyStore, - nodeUrl: `https://rpc.${network}.near.org`, - walletUrl: `https://wallet.${network}.near.org`, - helperUrl: `https://helper.${network}.near.org`, - explorerUrl: `https://explorer.${network}.near.org`, - }; - - let near = await connect(nearConfig); - const fundingAccount = await near.account(YOUR_ACCOUNT); - - // Get amount of FTs to transfer. In this scenario, we've assumed it to be 1 for one single use key. - let amountToTransfer = parseNearAmount("1") - let funderFungibleTokenBal = await fundingAccount.viewFunction( - FT_CONTRACT, - 'ft_balance_of', - { - account_id: YOUR_ACCOUNT - } - ); - - // Check if the owner has enough FT balance to fund drop - if (new BN(funderFungibleTokenBal).lte(new BN(amountToTransfer))){ - throw new Error('funder does not have enough Fungible Tokens for this drop. Top up and try again.'); - } - - // Initiate Keypom, while passing in the existing NEAR testnet connection so it does not create a new one - await initKeypom({ - near, - network, - }); - - // Creates the FT drop based on data from config file. Keys are automatically generated within the function based on `NUM_KEYS`. Since there is no entropy, all keys are completely random. - // Note that the SDK does error checks to ensure all the information passed in will succeed when creating a drop. - // If any information is not valid, the SDK will panic and the drop will NOT be created. - // These checks include, but are not limited to, valid configurations, enough attached deposit, and drop existence. - const { keys } = await createDrop({ - account: fundingAccount, - numKeys: 1, - depositPerUseNEAR: 1, - ftData: { - contractId: FT_CONTRACT, - senderId: YOUR_ACCOUNT, - // This balance per use is balance of human readable FTs per use. - amount: "1" - // Alternatively, you could use absoluteAmount, which is dependant on the decimals value of the FT - // ex. if decimals of an ft = 8, then 1 FT token would be absoluteAmount = 100000000 - }, - }); - pubKeys = keys.publicKeys - - const {contractId: KEYPOM_CONTRACT} = getEnv() - // Creating list of pk's and linkdrops; copied from orignal simple-create.js - let linkdropUrl = formatLinkdropUrl({ - customURL: "https://testnet.mynearwallet.com/linkdrop/CONTRACT_ID/SECRET_KEY", - secretKeys: keys.secretKeys, - contractId: KEYPOM_CONTRACT - }) - // Write file of all pk's and their respective linkdrops - console.log('Public Keys: ', pubKeys) - console.log('Linkdrops: ', linkdropUrl) - console.log(`Keypom Contract Explorer Link: explorer.${network}.near.org/accounts/${KEYPOM_CONTRACT}.com`) - // Note that Keypom createDrop will auto-register you onto the contract if you are not yet registered. -} - -ftDropKeypom() \ No newline at end of file diff --git a/packages/docs/scripts/sdk/nft-example.js b/packages/docs/scripts/sdk/nft-example.js deleted file mode 100644 index 27eb30666..000000000 --- a/packages/docs/scripts/sdk/nft-example.js +++ /dev/null @@ -1,86 +0,0 @@ -const { parseNearAmount, formatNearAmount } = require("near-api-js/lib/utils/format"); -const { KeyPair, keyStores, connect } = require("near-api-js"); -const { initKeypom, createDrop, getEnv, formatLinkdropUrl } = require("keypom-js"); -const path = require("path"); -const homedir = require("os").homedir(); - -async function nftDropKeypom(){ - // Initiate connection to NEAR testnet blockchain - const network = "testnet" - const CREDENTIALS_DIR = ".near-credentials"; - const credentialsPath = path.join(homedir, CREDENTIALS_DIR); - const YOUR_ACCOUNT = "keypom-docs-demo.testnet"; - const NFT_TOKEN_ID = "keypom-token-" + Date.now().toString(); - const NFT_CONTRACT = "nft.examples.testnet"; - - let keyStore = new keyStores.UnencryptedFileSystemKeyStore(credentialsPath); - - let nearConfig = { - networkId: network, - keyStore: keyStore, - nodeUrl: `https://rpc.${network}.near.org`, - walletUrl: `https://wallet.${network}.near.org`, - helperUrl: `https://helper.${network}.near.org`, - explorerUrl: `https://explorer.${network}.near.org`, - }; - - let near = await connect(nearConfig); - const fundingAccount = await near.account(YOUR_ACCOUNT); - - // Mint 1 NFT for the funder from the NFT contract outlined in the NFT_DATA - await fundingAccount.functionCall( - NFT_CONTRACT, - 'nft_mint', - { - receiver_id: YOUR_ACCOUNT, - metadata: { - title: "My First Keypom NFT", - description: "NFT from my first NFT Drop!", - media: "https://bafybeiftczwrtyr3k7a2k4vutd3amkwsmaqyhrdzlhvpt33dyjivufqusq.ipfs.dweb.link/goteam-gif.gif", - }, - token_id: NFT_TOKEN_ID, - }, - "300000000000000", - // Cost to cover storage of NFT - parseNearAmount("0.1") - ); - - // Initiate Keypom using existing NEAR testnet connection - await initKeypom({ - near, - network, - }); - - // Create drop with nft data - // Note that the SDK does error checks to ensure all the information passed in will succeed when creating a drop. - // If any information is not valid, the SDK will panic and the drop will NOT be created. - // These checks include, but are not limited to, valid configurations, enough attached deposit, and drop existence. - const { keys } = await createDrop({ - account: fundingAccount, - numKeys: 1, - depositPerUseNEAR: "1", - nftData: { - // NFT Contract Id that the tokens will come from - contractId: NFT_CONTRACT, - // Who will be sending the NFTs to the Keypom contract - senderId: YOUR_ACCOUNT, - // List of tokenIDs - tokenIds: [NFT_TOKEN_ID] - } - }); - pubKeys = keys.publicKeys - - const {contractId: KEYPOM_CONTRACT} = getEnv() - // Creating list of pk's and linkdrops; copied from orignal simple-create.js - let linkdropUrl = formatLinkdropUrl({ - customURL: "https://testnet.mynearwallet.com/linkdrop/CONTRACT_ID/SECRET_KEY", - secretKeys: keys.secretKeys, - contractId: KEYPOM_CONTRACT - }) - // Write file of all pk's and their respective linkdrops - console.log('Public Keys: ', pubKeys) - console.log('Linkdrops: ', linkdropUrl) - console.log(`Keypom Contract Explorer Link: explorer.${network}.near.org/accounts/${KEYPOM_CONTRACT}.com`) - -} -nftDropKeypom() \ No newline at end of file diff --git a/packages/docs/scripts/sdk/simple-example.js b/packages/docs/scripts/sdk/simple-example.js deleted file mode 100644 index 297287282..000000000 --- a/packages/docs/scripts/sdk/simple-example.js +++ /dev/null @@ -1,60 +0,0 @@ -const { link } = require("fs"); -const { initKeypom, createDrop, getEnv, formatLinkdropUrl } = require("keypom-js"); -const { KeyPair, keyStores, connect } = require("near-api-js"); -const path = require("path"); -const homedir = require("os").homedir(); - - -async function simpleDropKeypom(){ - // Initiate connection to the NEAR blockchain. - const network = "testnet" - const CREDENTIALS_DIR = ".near-credentials"; - const credentialsPath = path.join(homedir, CREDENTIALS_DIR); - const YOUR_ACCOUNT = "keypom-docs-demo.testnet"; - - let keyStore = new keyStores.UnencryptedFileSystemKeyStore(credentialsPath); - - let nearConfig = { - networkId: network, - keyStore: keyStore, - nodeUrl: `https://rpc.${network}.near.org`, - walletUrl: `https://wallet.${network}.near.org`, - helperUrl: `https://helper.${network}.near.org`, - explorerUrl: `https://explorer.${network}.near.org`, - }; - - let near = await connect(nearConfig); - const fundingAccount = await near.account(YOUR_ACCOUNT); - - // If a NEAR connection is not passed in and is not already running, initKeypom will create a new connection - // Here we are connecting to the testnet network - await initKeypom({ - near, - network - }); - - // Note that the SDK does error checks to ensure all the information passed in will succeed when creating a drop. - // If any information is not valid, the SDK will panic and the drop will NOT be created. - // These checks include, but are not limited to, valid configurations, enough attached deposit, and drop existence. - const {keys} = await createDrop({ - account: fundingAccount, - numKeys: 1, - depositPerUseNEAR: "1", - }); - pubKeys = keys.publicKeys - - const {contractId: KEYPOM_CONTRACT} = getEnv() - // Creating list of pk's and linkdrops; copied from orignal simple-create.js - let linkdropUrl = formatLinkdropUrl({ - customURL: "https://testnet.mynearwallet.com/linkdrop/CONTRACT_ID/SECRET_KEY", - secretKeys: keys.secretKeys, - contractId: KEYPOM_CONTRACT - }) - // Write file of all pk's and their respective linkdrops - console.log('Public Keys: ', pubKeys) - console.log('Linkdrops: ', linkdropUrl) - console.log(`Keypom Contract Explorer Link: explorer.${network}.near.org/accounts/${KEYPOM_CONTRACT}.com`) - -} - -simpleDropKeypom() \ No newline at end of file diff --git a/packages/docs/scripts/utils/general.js b/packages/docs/scripts/utils/general.js deleted file mode 100644 index ba94a3d62..000000000 --- a/packages/docs/scripts/utils/general.js +++ /dev/null @@ -1,28 +0,0 @@ -const { BN } = require("bn.js"); -const { parseNearAmount, formatNearAmount } = require("near-api-js/lib/utils/format"); -const { connect, KeyPair, keyStores, utils } = require("near-api-js"); -const path = require("path"); -const homedir = require("os").homedir(); - -/// How much Gas each each cross contract call with cost to be converted to a receipt -const GAS_PER_CCC = 5000000000000; // 5 TGas -const RECEIPT_GAS_COST = 2500000000000; // 2.5 TGas -const YOCTO_PER_GAS = 100000000; // 100 million -const ATTACHED_GAS_FROM_WALLET = 100000000000000; // 100 TGas - -/// How much yoctoNEAR it costs to store 1 access key -const ACCESS_KEY_STORAGE = new BN("1000000000000000000000"); - -// Estimate the amount of allowance required for a given attached gas. -const getRecentDropId = async (fundingAccountObject, accountId, keypomContract) => { - let dropSupplyForOwner = await fundingAccountObject.viewFunction(keypomContract, 'get_drop_supply_for_owner', {account_id: accountId}); - console.log('dropSupplyForOwner: ', dropSupplyForOwner) - let dropsForOwner = await fundingAccountObject.viewFunction(keypomContract, 'get_drops_for_owner', { account_id: accountId, from_index: (dropSupplyForOwner - 1).toString() }); - console.log('dropsForOwner: ', dropsForOwner) - - return dropsForOwner[dropsForOwner.length - 1].drop_id; -}; - -module.exports = { - getRecentDropId, -}; \ No newline at end of file diff --git a/packages/docs/tutorials/ticket-app-skeleton/.gitignore b/packages/docs/tutorials/ticket-app-skeleton/.gitignore deleted file mode 100644 index c0ebfc127..000000000 --- a/packages/docs/tutorials/ticket-app-skeleton/.gitignore +++ /dev/null @@ -1,31 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. -# Developer note: near.gitignore will be renamed to .gitignore upon project creation -# dependencies -node_modules -/.pnp -.pnp.js - -# build -/out -/dist - -# keys -/neardev - -# testing -/coverage - -# production -/build - -# misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local -/.cache - -npm-debug.log* -yarn-debug.log* -yarn-error.log* diff --git a/packages/docs/tutorials/ticket-app-skeleton/App.css b/packages/docs/tutorials/ticket-app-skeleton/App.css deleted file mode 100644 index 74b5e0534..000000000 --- a/packages/docs/tutorials/ticket-app-skeleton/App.css +++ /dev/null @@ -1,38 +0,0 @@ -.App { - text-align: center; -} - -.App-logo { - height: 40vmin; - pointer-events: none; -} - -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } -} - -.App-header { - background-color: #282c34; - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: white; -} - -.App-link { - color: #61dafb; -} - -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} diff --git a/packages/docs/tutorials/ticket-app-skeleton/components/qrcode.js b/packages/docs/tutorials/ticket-app-skeleton/components/qrcode.js deleted file mode 100644 index 543070d89..000000000 --- a/packages/docs/tutorials/ticket-app-skeleton/components/qrcode.js +++ /dev/null @@ -1,22 +0,0 @@ -import { useState, useEffect } from "react"; -import { QRCodeCanvas } from "qrcode.react"; - -const QrCode = ({ link }) => { - const qrcode = ( - - ); - return ( -
    -
    {qrcode}
    -
    - ); -}; - -export default QrCode; \ No newline at end of file diff --git a/packages/docs/tutorials/ticket-app-skeleton/components/scanner.js b/packages/docs/tutorials/ticket-app-skeleton/components/scanner.js deleted file mode 100644 index b16ee2986..000000000 --- a/packages/docs/tutorials/ticket-app-skeleton/components/scanner.js +++ /dev/null @@ -1,51 +0,0 @@ -import React from "react"; -import { useZxing } from "react-zxing"; -import { initKeypom, claim, hashPassword, getPubFromSecret, getKeyInformation } from "keypom-js"; -import * as nearAPI from "near-api-js"; -import { useState, useEffect } from "react"; -import logo from "../static/img/green-check.png" -import xLogo from "../static/img/red-x.png" -import "../styles.css"; -import { allowEntry } from "../utils/allowEntry"; -const { keyStores, connect } = nearAPI; - -export const Scanner = () => { - - // Scanner and getting results of scan - const { ref } = useZxing({ - onResult(result) { - - }, - }); - - // Functions that only run when scanner is mounted - // connect to NEAR, initKeypom, and get password - useEffect(() => { - - }, []) - - // Claiming the drop using password - useEffect(() => { - function timeout(delay) { - - } - - async function scannerClaim(){ - - } - - }, [masterStatus.data]) - - switch (masterStatus.stage) { - case Stage.preClaim: - - case Stage.claiming: - - case Stage.successClaim: - - case Stage.failClaim: - - default: - - } -}; diff --git a/packages/docs/tutorials/ticket-app-skeleton/css/global.css b/packages/docs/tutorials/ticket-app-skeleton/css/global.css deleted file mode 100644 index 86d5d1222..000000000 --- a/packages/docs/tutorials/ticket-app-skeleton/css/global.css +++ /dev/null @@ -1,189 +0,0 @@ -* { - box-sizing: border-box; -} - -html { - --bg: #efefef; - --fg: #1e1e1e; - --gray: #555; - --light-gray: #ccc; - --shadow: #e6e6e6; - --success: rgb(90, 206, 132); - --primary: #FF585D; - --secondary: #0072CE; - - background-color: var(--bg); - color: var(--fg); - font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif; - font-size: calc(0.9em + 0.5vw); - line-height: 1.3; -} - -body { - margin: 0; - padding: 1em; -} - -main { - margin: 0 auto; - max-width: 26em; - text-align: justify; -} - -h1 { - background-image: url(../img/logo-black.svg); - background-position: center 1em; - background-repeat: no-repeat; - background-size: auto 1.5em; - margin-top: 0; - padding: 3.5em 0 0.5em; - text-align: center; -} - -a, -.link { - color: var(--primary); - text-decoration: none; -} -a:hover, -a:focus, -.link:hover, -.link:focus { - text-decoration: underline; -} -a:active, -.link:active { - color: var(--secondary); -} - -button, input { - font: inherit; - outline: none; -} - -button { - background-color: var(--secondary); - border-radius: 5px; - border: none; - color: #efefef; - cursor: pointer; - padding: 0.3em 0.75em; - transition: transform 30ms; -} -button:hover, button:focus { - box-shadow: 0 0 10em rgba(255, 255, 255, 0.2) inset; -} -button:active { - box-shadow: 0 0 10em rgba(0, 0, 0, 0.1) inset; -} -button.link { - background: none; - border: none; - box-shadow: none; - display: inline; -} -[disabled] button, button[disabled] { - box-shadow: none; - background-color: var(--light-gray); - color: gray; - cursor: not-allowed; - transform: none; -} -[disabled] button { - text-indent: -900em; - width: 2em; - position: relative; -} -[disabled] button:after { - content: " "; - display: block; - width: 0.8em; - height: 0.8em; - border-radius: 50%; - border: 2px solid #fff; - border-color: var(--fg) transparent var(--fg) transparent; - animation: loader 1.2s linear infinite; - position: absolute; - top: 0.45em; - right: 0.5em; -} -@keyframes loader { - 0% { transform: rotate(0deg) } - 100% { transform: rotate(360deg) } -} - -fieldset { - border: none; - padding: 2em 0; -} - -input { - background-color: var(--shadow); - border: none; - border-radius: 5px 0 0 5px; - caret-color: var(--primary); - color: inherit; - padding: 0.25em 1em; -} -input::selection { - background-color: var(--secondary); - color: #efefef; -} -input:focus { - box-shadow: 0 0 10em rgba(0, 0, 0, 0.02) inset; -} - -code { - color: var(--gray); -} - -li { - padding-bottom: 1em; -} - -aside { - animation: notify ease-in-out 10s; - background-color: var(--shadow); - border-radius: 5px; - bottom: 0; - font-size: 0.8em; - margin: 1em; - padding: 1em; - position: fixed; - transform: translateY(10em); - right: 0; -} -aside footer { - display: flex; - font-size: 0.9em; - justify-content: space-between; - margin-top: 0.5em; -} -aside footer *:first-child { - color: var(--success); -} -aside footer *:last-child { - color: var(--gray); -} -@keyframes notify { - 0% { transform: translateY(10em) } - 5% { transform: translateY(0) } - 95% { transform: translateY(0) } - 100% { transform: translateY(10em) } -} - -@media (prefers-color-scheme: dark) { - html { - --bg: #1e1e1e; - --fg: #efefef; - --gray: #aaa; - --shadow: #2a2a2a; - --light-gray: #444; - } - h1 { - background-image: url(../img/logo-white.svg); - } - input:focus { - box-shadow: 0 0 10em rgba(255, 255, 255, 0.02) inset; - } -} diff --git a/packages/docs/tutorials/ticket-app-skeleton/index.css b/packages/docs/tutorials/ticket-app-skeleton/index.css deleted file mode 100644 index ec2585e8c..000000000 --- a/packages/docs/tutorials/ticket-app-skeleton/index.css +++ /dev/null @@ -1,13 +0,0 @@ -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; -} diff --git a/packages/docs/tutorials/ticket-app-skeleton/index.html b/packages/docs/tutorials/ticket-app-skeleton/index.html deleted file mode 100644 index 00f013eb3..000000000 --- a/packages/docs/tutorials/ticket-app-skeleton/index.html +++ /dev/null @@ -1,4 +0,0 @@ - -
    - - \ No newline at end of file diff --git a/packages/docs/tutorials/ticket-app-skeleton/index.js b/packages/docs/tutorials/ticket-app-skeleton/index.js deleted file mode 100644 index 1e235402f..000000000 --- a/packages/docs/tutorials/ticket-app-skeleton/index.js +++ /dev/null @@ -1,48 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom/client'; -import './index.css'; -import App from './state/App'; -import { BrowserRouter } from "react-router-dom"; -import { Buffer } from "buffer"; global.Buffer = Buffer; - -// CREATED WITH V1-4 30 uses with pw and every 2nd minting nft -//ed25519:4Yc94z2jETj2c4iMRuAexRZsYadYtXBoHsmUuN9XUtwj -// https://testnet.mynearwallet.com/linkdrop/v1-4.keypom.testnet/t5PWmHyFh5bKFpycSzEApJ4GMjofGZM3pvYpzkNkm6Wa1cDMaotfbYQ67Jwjtrqp9hu8aa1j32Zf9BJEzK1CMLM - -// CREATED WITH V1-4, 1000 uses simple drop no pw -// Public Keys and Linkdrops: { -// 'ed25519:GUeRZniVhEA4DRfikBoiZFZyEdzja3jo3jFLvyLeRd32' -//'https://wallet.testnet.near.org/linkdrop/v1-4.keypom.testnet/4aJGvd5za9nTWJcZBVAgEyaaU6kymPSyoXhtJLfNNx5XA1aWSXxDAqBnrPDBcm7PT5hCwk8L3nDExBYWKoB7HEix' - - -const root = ReactDOM.createRoot(document.getElementById('root')); -root.render( - // - - - , - // -); - -// If you want to start measuring performance in your app, pass a function -// to log results (for example: reportWebVitals(console.log)) -// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals - - -// 10 keys, 2 each with null 1st and nft mint second. tabbed entry indicates key in use or depleted -// --- 'ed25519:6Ug2EqRAFSPk5o18aMc7F27EUJjtYwqgKcQvWobUtHZC': 'https://testnet.mynearwallet.com/linkdrop/v1-4.keypom.testnet/qKfzzz2y15p91HzSh5xxZA6GGx2V3DmNEAzgtbo5HZVn7PsqaRj6g3P6i5KQ28bKy2R2E61WA5f6jXzNJFmKziN', -// --- 'ed25519:6V4PTNFKgqQet3b5ckB1wwEtT389CDD5rik4SVMTu6kP': 'https://testnet.mynearwallet.com/linkdrop/v1-4.keypom.testnet/rtQ9LyqNcbGGJknZeZDk7w37dApUk1GnHCVRb7d5AaqxuytMUf6bh6HQsE3C2uWCakFaa2Z4QJipkFs6WwZafB5', -// 'ed25519:sBb3B1FsjxFHFJCWfMKchyaZWsSsK1U52iwvF9EXmCk': 'https://testnet.mynearwallet.com/linkdrop/v1-4.keypom.testnet/3yCwKjw6jSMk4Dbn939mpLVrGBDH4mFd7yRcS8M5Us1LgEhwePMXQ7XczASt7L6qYDHBnvmP1wWnGcF6sgZzo28Y', -// 'ed25519:FUteBnVMTquBS2Fq8NL4krcCX4Bbj7opiLGSnnHHbYvB': 'https://testnet.mynearwallet.com/linkdrop/v1-4.keypom.testnet/rwT4ZetJdHdBhGnV7iMD8zqJ4o9bjjBwNJYFcV32CgaQBXDNbHMcp3Df4rP3iCER28ZwrFhKNDaTGhJYPCoFNaT', -// 'ed25519:DW6Ux6XJhYLajej5VB8svyZ5MGeCMozeazxRSuA4CHtm': 'https://testnet.mynearwallet.com/linkdrop/v1-4.keypom.testnet/c5B7yjwTHwkquKjYT5z2hGvXsHS3kdKvy2v5NChdJVaQGeJfTsMhs3VM7tfq28f7FqLBNZNJSUQB2nUuesRMmCu', -// 'ed25519:2nbNNfo1tm5pcMniq8r6HSkq2gLhK9M1iCwGZ59JPhQF': 'https://testnet.mynearwallet.com/linkdrop/v1-4.keypom.testnet/5QN4aFbfMwAtm8ubasKX6VbqH7i4K33HznfLTpRpQYKv9oG2dBNbRg1pYooYbC7kSbJ3qgA6pSySwEha71XvN5oH', -// 'ed25519:FY7Ws3yW7TmbEhJGkpcM8tx4Lowt5Z6wqC9z8fJYXUGS': 'https://testnet.mynearwallet.com/linkdrop/v1-4.keypom.testnet/2Uj5a2e9AjWG6p8SqMNCEJGKAW5QiVjtgmqGShDWYE3GY5oYWz9mzC19vPyLUmAXNuhxCN9r6TF3D6vhdYTahVUn', -// 'ed25519:Gd7v5NaL2fCwNsMdDiRiwtXBBhe9LHo1CSoRCDs1unev': 'https://testnet.mynearwallet.com/linkdrop/v1-4.keypom.testnet/3J744n3zT29Dc4GzrnGbdNiwMM5cZv9eJdCd6WxAbJQy48RSfMWvnzbwcn6tgBYYPYtqcEeGhxU4pVdjmCx3yBZc', -// 'ed25519:DULssBcpvFpnMQ4sPnGrpqSrqyuTnHErFTzNfJERvf7e': 'https://testnet.mynearwallet.com/linkdrop/v1-4.keypom.testnet/25J9zdomMM9uDttmJRefwJwSpKsv7VRccvbqym8QEUu3PnjiRhye5h8U9hUdnq7bp72x56eABLNXYaThqVNVeWnL', -// 'ed25519:3CSopDVtq4uGno5tAes3Ld1tBE8jM1qJmMTsYt86PMxy': 'https://testnet.mynearwallet.com/linkdrop/v1-4.keypom.testnet/3JPaXXbdiDr3JVXx6qR1bce2byrTbgBeVKzYCWZ7jSwuKgangetNiYG5NY4NtUzxbaV1LDLtqqDoMuvE19zNa9jb' - - - -// OLD -// https://wallet.testnet.near.org/linkdrop/v1-3.keypom.testnet/2TJ9RbP3UtNyJGTD9EKdabavTMSJC97hcnGQjXwbC7uRPn7TZaUspoXEKzFEThgyJqatyCVung3yySQGGEBumXd2 -// curPks: [ 'ed25519:4X3TdmDCEuVg6ifBoU3v3r75XqUk6w37HiapucsQ497W' ] diff --git a/packages/docs/tutorials/ticket-app-skeleton/package.json b/packages/docs/tutorials/ticket-app-skeleton/package.json deleted file mode 100644 index fb6fd7762..000000000 --- a/packages/docs/tutorials/ticket-app-skeleton/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "ticket-app", - "version": "1.0.0", - "main": "index.js", - "scripts": { - "start": "parcel index.html --open", - "build": "parcel build index.html --public-url ./", - "create-ticket-drop": "node utils/createTickDrop.js", - "test-ticket-drop": "node utils/testTickDrop.js" - }, - "dependencies": { - "keypom-js": "1.4.3", - "parcel": "^2.6.0", - "qrcode.react": "^3.1.0", - "react-router-dom": "^6.8.2", - "react-zxing": "^1.1.3" - }, - "devDependencies": { - "@babel/core": "~7.18.2", - "@babel/preset-env": "~7.18.2", - "@babel/preset-react": "~7.17.12", - "assert": "^2.0.0", - "buffer": "^5.5.0", - "crypto-browserify": "^3.12.0", - "env-cmd": "~10.1.0", - "events": "^3.1.0", - "nodemon": "~2.0.16", - "os-browserify": "^0.3.0", - "process": "^0.11.10", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "stream-browserify": "^3.0.0", - "ts-node": "^10.8.0", - "typescript": "^4.7.2" - }, - "resolutions": { - "@babel/preset-env": "7.13.8" - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - } -} diff --git a/packages/docs/tutorials/ticket-app-skeleton/state/App.js b/packages/docs/tutorials/ticket-app-skeleton/state/App.js deleted file mode 100644 index 2e427e90c..000000000 --- a/packages/docs/tutorials/ticket-app-skeleton/state/App.js +++ /dev/null @@ -1,28 +0,0 @@ -import QrCode from "../components/qrcode"; -import KeyInfo from "./keyInfo"; -// import "./styles.css"; -import React from "react"; -import { useState, useEffect } from "react"; -import { BrowserRouter, Route, Routes } from 'react-router-dom'; -import * as nearAPI from "near-api-js"; -import { Scanner } from "../components/scanner"; -import "../styles.css"; -import { initKeypom, formatLinkdropUrl } from "keypom-js"; -const { keyStores, connect } = nearAPI; - - -async function connectNear(privateKey, contractId){ - -} - -async function setup(){ - -} - - -function App() { - -} - -export default App -// ReactDOM.render(, document.getElementById("root")); diff --git a/packages/docs/tutorials/ticket-app-skeleton/state/keyInfo.js b/packages/docs/tutorials/ticket-app-skeleton/state/keyInfo.js deleted file mode 100644 index 141f46346..000000000 --- a/packages/docs/tutorials/ticket-app-skeleton/state/keyInfo.js +++ /dev/null @@ -1,13 +0,0 @@ -import { initKeypom, getPubFromSecret, getKeyInformation, getDropInformation } from "keypom-js"; -import React from 'react' -import * as nearAPI from "near-api-js"; -import { useState, useEffect } from "react"; -const { keyStores, connect } = nearAPI; - - -const KeyInfo = ({ contractId, privKey, curUse, setCurUse, pubKey, setPubkey }) => { - -} - -export default KeyInfo - diff --git a/packages/docs/tutorials/ticket-app-skeleton/static/img/green-check.png b/packages/docs/tutorials/ticket-app-skeleton/static/img/green-check.png deleted file mode 100644 index 287c73d3f4fe6fca74685a7a18e724f1709fcda9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104273 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�x??G@{(b9;amr5Q%QXoXcHl+Vhk?X`e;R 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 z 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 { - const qrcode = ( - - ); - return ( -
    -
    {qrcode}
    -
    - ); -}; - -export default QrCode; \ No newline at end of file diff --git a/packages/docs/tutorials/ticket-app/components/scanner.js b/packages/docs/tutorials/ticket-app/components/scanner.js deleted file mode 100644 index d50eba7f0..000000000 --- a/packages/docs/tutorials/ticket-app/components/scanner.js +++ /dev/null @@ -1,151 +0,0 @@ -import React from "react"; -import { useZxing } from "react-zxing"; -import { initKeypom, claim, hashPassword, getPubFromSecret, getKeyInformation } from "keypom-js"; -import * as nearAPI from "near-api-js"; -import { useState, useEffect } from "react"; -import logo from "../static/img/green-check.png" -import xLogo from "../static/img/red-x.png" -import "../styles.css"; -import { allowEntry } from "../utils/allowEntry"; -const { keyStores, connect } = nearAPI; - -export const Scanner = () => { - // Stage enum - const Stage = { - preClaim: "Pre-claim", - claiming: "Claiming", - successClaim: "Success", - failClaim: "Fail" - } - - // Data enum - const Data = { - empty: "Empty", - captured: "Captured", - } - - // State Variables - const [result, setResult] = useState(""); - const [splitRes, setSplitRes] = useState([]); - const [resPrivKey, setResPrivkey] = useState("") - const [password, setPassword] = useState("NULL") - const [masterStatus, setMasterStatus] = useState({ stage: Stage.preClaim, data: Data.empty }) - - // Scanner and getting results of scan - const { ref } = useZxing({ - onResult(result) { - setResult(result.getText()); - setSplitRes([...result.getText().split("/")]); - setResPrivkey(result.getText().split("/")[1]) - - //indicate new data - let tempMaster = { - stage: Stage.claiming, - data: Data.captured - } - setMasterStatus(tempMaster) - }, - }); - - // Functions that only run when scanner is mounted - // Get password - useEffect(() => { - let PASSWORD = "NULL" - PASSWORD = prompt("Enter base password for drop") - setPassword(PASSWORD) - }, []) - - // Claiming the drop using password - useEffect(() => { - function timeout(delay) { - return new Promise(res => setTimeout(res, delay)); - } - - async function scannerClaim() { - let isAllowedIn = await allowEntry({ - privKey: resPrivKey, - basePassword: password - }) - - // Successful Claim - if (isAllowedIn) { - setMasterStatus({ - stage: Stage.successClaim, - data: Data.captured - }) - } else { // Failed Claim - setMasterStatus({ - stage: Stage.failClaim, - data: Data.captured - }) - } - - // Wait 3s, then flip go back to pre-claim - await timeout(3000) - setMasterStatus({ - stage: Stage.preClaim, - data: Data.empty - }) - } - // Only claim if there is data present - if (masterStatus.data === Data.captured) { - scannerClaim() - } - - }, [masterStatus.data]) - - switch (masterStatus.stage) { - case Stage.preClaim: - return ( - <> -
    -
    -

    Scan a linkdrop QR code to claim

    -

    To re-enter password, refresh the page

    -
    - - ); - case Stage.claiming: - return ( - <> -
    -
    -

    Claiming

    -

    Note this should take a few seconds

    -
    - - ); - case Stage.successClaim: - return ( - <> -
    -
    -

    Claimed!

    - green check -
    - - ); - case Stage.failClaim: - return ( - <> -
    -
    -

    Could Not Be Claimed!

    -

    Ensure Password is Correct

    -

    To re-enter password, refresh the page

    - red x -
    - - ); - default: - let errorMsg = `Error: masterState.stage is ${masterStatus.stage}` - return ( - <> -
    -

    {errorMsg}

    - red x -
    - - ); - } -}; diff --git a/packages/docs/tutorials/ticket-app/css/global.css b/packages/docs/tutorials/ticket-app/css/global.css deleted file mode 100644 index 86d5d1222..000000000 --- a/packages/docs/tutorials/ticket-app/css/global.css +++ /dev/null @@ -1,189 +0,0 @@ -* { - box-sizing: border-box; -} - -html { - --bg: #efefef; - --fg: #1e1e1e; - --gray: #555; - --light-gray: #ccc; - --shadow: #e6e6e6; - --success: rgb(90, 206, 132); - --primary: #FF585D; - --secondary: #0072CE; - - background-color: var(--bg); - color: var(--fg); - font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif; - font-size: calc(0.9em + 0.5vw); - line-height: 1.3; -} - -body { - margin: 0; - padding: 1em; -} - -main { - margin: 0 auto; - max-width: 26em; - text-align: justify; -} - -h1 { - background-image: url(../img/logo-black.svg); - background-position: center 1em; - background-repeat: no-repeat; - background-size: auto 1.5em; - margin-top: 0; - padding: 3.5em 0 0.5em; - text-align: center; -} - -a, -.link { - color: var(--primary); - text-decoration: none; -} -a:hover, -a:focus, -.link:hover, -.link:focus { - text-decoration: underline; -} -a:active, -.link:active { - color: var(--secondary); -} - -button, input { - font: inherit; - outline: none; -} - -button { - background-color: var(--secondary); - border-radius: 5px; - border: none; - color: #efefef; - cursor: pointer; - padding: 0.3em 0.75em; - transition: transform 30ms; -} -button:hover, button:focus { - box-shadow: 0 0 10em rgba(255, 255, 255, 0.2) inset; -} -button:active { - box-shadow: 0 0 10em rgba(0, 0, 0, 0.1) inset; -} -button.link { - background: none; - border: none; - box-shadow: none; - display: inline; -} -[disabled] button, button[disabled] { - box-shadow: none; - background-color: var(--light-gray); - color: gray; - cursor: not-allowed; - transform: none; -} -[disabled] button { - text-indent: -900em; - width: 2em; - position: relative; -} -[disabled] button:after { - content: " "; - display: block; - width: 0.8em; - height: 0.8em; - border-radius: 50%; - border: 2px solid #fff; - border-color: var(--fg) transparent var(--fg) transparent; - animation: loader 1.2s linear infinite; - position: absolute; - top: 0.45em; - right: 0.5em; -} -@keyframes loader { - 0% { transform: rotate(0deg) } - 100% { transform: rotate(360deg) } -} - -fieldset { - border: none; - padding: 2em 0; -} - -input { - background-color: var(--shadow); - border: none; - border-radius: 5px 0 0 5px; - caret-color: var(--primary); - color: inherit; - padding: 0.25em 1em; -} -input::selection { - background-color: var(--secondary); - color: #efefef; -} -input:focus { - box-shadow: 0 0 10em rgba(0, 0, 0, 0.02) inset; -} - -code { - color: var(--gray); -} - -li { - padding-bottom: 1em; -} - -aside { - animation: notify ease-in-out 10s; - background-color: var(--shadow); - border-radius: 5px; - bottom: 0; - font-size: 0.8em; - margin: 1em; - padding: 1em; - position: fixed; - transform: translateY(10em); - right: 0; -} -aside footer { - display: flex; - font-size: 0.9em; - justify-content: space-between; - margin-top: 0.5em; -} -aside footer *:first-child { - color: var(--success); -} -aside footer *:last-child { - color: var(--gray); -} -@keyframes notify { - 0% { transform: translateY(10em) } - 5% { transform: translateY(0) } - 95% { transform: translateY(0) } - 100% { transform: translateY(10em) } -} - -@media (prefers-color-scheme: dark) { - html { - --bg: #1e1e1e; - --fg: #efefef; - --gray: #aaa; - --shadow: #2a2a2a; - --light-gray: #444; - } - h1 { - background-image: url(../img/logo-white.svg); - } - input:focus { - box-shadow: 0 0 10em rgba(255, 255, 255, 0.02) inset; - } -} diff --git a/packages/docs/tutorials/ticket-app/index.css b/packages/docs/tutorials/ticket-app/index.css deleted file mode 100644 index ec2585e8c..000000000 --- a/packages/docs/tutorials/ticket-app/index.css +++ /dev/null @@ -1,13 +0,0 @@ -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; -} diff --git a/packages/docs/tutorials/ticket-app/index.html b/packages/docs/tutorials/ticket-app/index.html deleted file mode 100644 index 00f013eb3..000000000 --- a/packages/docs/tutorials/ticket-app/index.html +++ /dev/null @@ -1,4 +0,0 @@ - -
    - - \ No newline at end of file diff --git a/packages/docs/tutorials/ticket-app/index.js b/packages/docs/tutorials/ticket-app/index.js deleted file mode 100644 index 1e235402f..000000000 --- a/packages/docs/tutorials/ticket-app/index.js +++ /dev/null @@ -1,48 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom/client'; -import './index.css'; -import App from './state/App'; -import { BrowserRouter } from "react-router-dom"; -import { Buffer } from "buffer"; global.Buffer = Buffer; - -// CREATED WITH V1-4 30 uses with pw and every 2nd minting nft -//ed25519:4Yc94z2jETj2c4iMRuAexRZsYadYtXBoHsmUuN9XUtwj -// https://testnet.mynearwallet.com/linkdrop/v1-4.keypom.testnet/t5PWmHyFh5bKFpycSzEApJ4GMjofGZM3pvYpzkNkm6Wa1cDMaotfbYQ67Jwjtrqp9hu8aa1j32Zf9BJEzK1CMLM - -// CREATED WITH V1-4, 1000 uses simple drop no pw -// Public Keys and Linkdrops: { -// 'ed25519:GUeRZniVhEA4DRfikBoiZFZyEdzja3jo3jFLvyLeRd32' -//'https://wallet.testnet.near.org/linkdrop/v1-4.keypom.testnet/4aJGvd5za9nTWJcZBVAgEyaaU6kymPSyoXhtJLfNNx5XA1aWSXxDAqBnrPDBcm7PT5hCwk8L3nDExBYWKoB7HEix' - - -const root = ReactDOM.createRoot(document.getElementById('root')); -root.render( - // - - - , - // -); - -// If you want to start measuring performance in your app, pass a function -// to log results (for example: reportWebVitals(console.log)) -// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals - - -// 10 keys, 2 each with null 1st and nft mint second. tabbed entry indicates key in use or depleted -// --- 'ed25519:6Ug2EqRAFSPk5o18aMc7F27EUJjtYwqgKcQvWobUtHZC': 'https://testnet.mynearwallet.com/linkdrop/v1-4.keypom.testnet/qKfzzz2y15p91HzSh5xxZA6GGx2V3DmNEAzgtbo5HZVn7PsqaRj6g3P6i5KQ28bKy2R2E61WA5f6jXzNJFmKziN', -// --- 'ed25519:6V4PTNFKgqQet3b5ckB1wwEtT389CDD5rik4SVMTu6kP': 'https://testnet.mynearwallet.com/linkdrop/v1-4.keypom.testnet/rtQ9LyqNcbGGJknZeZDk7w37dApUk1GnHCVRb7d5AaqxuytMUf6bh6HQsE3C2uWCakFaa2Z4QJipkFs6WwZafB5', -// 'ed25519:sBb3B1FsjxFHFJCWfMKchyaZWsSsK1U52iwvF9EXmCk': 'https://testnet.mynearwallet.com/linkdrop/v1-4.keypom.testnet/3yCwKjw6jSMk4Dbn939mpLVrGBDH4mFd7yRcS8M5Us1LgEhwePMXQ7XczASt7L6qYDHBnvmP1wWnGcF6sgZzo28Y', -// 'ed25519:FUteBnVMTquBS2Fq8NL4krcCX4Bbj7opiLGSnnHHbYvB': 'https://testnet.mynearwallet.com/linkdrop/v1-4.keypom.testnet/rwT4ZetJdHdBhGnV7iMD8zqJ4o9bjjBwNJYFcV32CgaQBXDNbHMcp3Df4rP3iCER28ZwrFhKNDaTGhJYPCoFNaT', -// 'ed25519:DW6Ux6XJhYLajej5VB8svyZ5MGeCMozeazxRSuA4CHtm': 'https://testnet.mynearwallet.com/linkdrop/v1-4.keypom.testnet/c5B7yjwTHwkquKjYT5z2hGvXsHS3kdKvy2v5NChdJVaQGeJfTsMhs3VM7tfq28f7FqLBNZNJSUQB2nUuesRMmCu', -// 'ed25519:2nbNNfo1tm5pcMniq8r6HSkq2gLhK9M1iCwGZ59JPhQF': 'https://testnet.mynearwallet.com/linkdrop/v1-4.keypom.testnet/5QN4aFbfMwAtm8ubasKX6VbqH7i4K33HznfLTpRpQYKv9oG2dBNbRg1pYooYbC7kSbJ3qgA6pSySwEha71XvN5oH', -// 'ed25519:FY7Ws3yW7TmbEhJGkpcM8tx4Lowt5Z6wqC9z8fJYXUGS': 'https://testnet.mynearwallet.com/linkdrop/v1-4.keypom.testnet/2Uj5a2e9AjWG6p8SqMNCEJGKAW5QiVjtgmqGShDWYE3GY5oYWz9mzC19vPyLUmAXNuhxCN9r6TF3D6vhdYTahVUn', -// 'ed25519:Gd7v5NaL2fCwNsMdDiRiwtXBBhe9LHo1CSoRCDs1unev': 'https://testnet.mynearwallet.com/linkdrop/v1-4.keypom.testnet/3J744n3zT29Dc4GzrnGbdNiwMM5cZv9eJdCd6WxAbJQy48RSfMWvnzbwcn6tgBYYPYtqcEeGhxU4pVdjmCx3yBZc', -// 'ed25519:DULssBcpvFpnMQ4sPnGrpqSrqyuTnHErFTzNfJERvf7e': 'https://testnet.mynearwallet.com/linkdrop/v1-4.keypom.testnet/25J9zdomMM9uDttmJRefwJwSpKsv7VRccvbqym8QEUu3PnjiRhye5h8U9hUdnq7bp72x56eABLNXYaThqVNVeWnL', -// 'ed25519:3CSopDVtq4uGno5tAes3Ld1tBE8jM1qJmMTsYt86PMxy': 'https://testnet.mynearwallet.com/linkdrop/v1-4.keypom.testnet/3JPaXXbdiDr3JVXx6qR1bce2byrTbgBeVKzYCWZ7jSwuKgangetNiYG5NY4NtUzxbaV1LDLtqqDoMuvE19zNa9jb' - - - -// OLD -// https://wallet.testnet.near.org/linkdrop/v1-3.keypom.testnet/2TJ9RbP3UtNyJGTD9EKdabavTMSJC97hcnGQjXwbC7uRPn7TZaUspoXEKzFEThgyJqatyCVung3yySQGGEBumXd2 -// curPks: [ 'ed25519:4X3TdmDCEuVg6ifBoU3v3r75XqUk6w37HiapucsQ497W' ] diff --git a/packages/docs/tutorials/ticket-app/package.json b/packages/docs/tutorials/ticket-app/package.json deleted file mode 100644 index fb6fd7762..000000000 --- a/packages/docs/tutorials/ticket-app/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "ticket-app", - "version": "1.0.0", - "main": "index.js", - "scripts": { - "start": "parcel index.html --open", - "build": "parcel build index.html --public-url ./", - "create-ticket-drop": "node utils/createTickDrop.js", - "test-ticket-drop": "node utils/testTickDrop.js" - }, - "dependencies": { - "keypom-js": "1.4.3", - "parcel": "^2.6.0", - "qrcode.react": "^3.1.0", - "react-router-dom": "^6.8.2", - "react-zxing": "^1.1.3" - }, - "devDependencies": { - "@babel/core": "~7.18.2", - "@babel/preset-env": "~7.18.2", - "@babel/preset-react": "~7.17.12", - "assert": "^2.0.0", - "buffer": "^5.5.0", - "crypto-browserify": "^3.12.0", - "env-cmd": "~10.1.0", - "events": "^3.1.0", - "nodemon": "~2.0.16", - "os-browserify": "^0.3.0", - "process": "^0.11.10", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "stream-browserify": "^3.0.0", - "ts-node": "^10.8.0", - "typescript": "^4.7.2" - }, - "resolutions": { - "@babel/preset-env": "7.13.8" - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - } -} diff --git a/packages/docs/tutorials/ticket-app/state/App.js b/packages/docs/tutorials/ticket-app/state/App.js deleted file mode 100644 index cdaa7b5f3..000000000 --- a/packages/docs/tutorials/ticket-app/state/App.js +++ /dev/null @@ -1,137 +0,0 @@ -import QrCode from "../components/qrcode"; -import KeyInfo from "./keyInfo"; -// import "./styles.css"; -import React from "react"; -import { useState, useEffect } from "react"; -import { BrowserRouter, Route, Routes } from 'react-router-dom'; -import * as nearAPI from "near-api-js"; -import { Scanner } from "../components/scanner"; -import "../styles.css"; -import { initKeypom, formatLinkdropUrl } from "keypom-js"; -const { keyStores, connect } = nearAPI; - -const NETWORK_ID = "testnet"; -async function connectNear(privateKey, contractId){ - const myKeyStore = new keyStores.BrowserLocalStorageKeyStore(); - const connectionConfig = { - networkId: NETWORK_ID, - keyStore: myKeyStore, - nodeUrl: `https://rpc.${NETWORK_ID}.near.org`, - walletUrl: `https://wallet.${NETWORK_ID}.near.org`, - helperUrl: `https://helper.${NETWORK_ID}.near.org`, - explorerUrl: `https://explorer.${NETWORK_ID}.near.org`, - }; - - const nearConnection = await connect(connectionConfig); - await initKeypom({ - near: nearConnection, - network: NETWORK_ID, - keypomContractId: contractId - }); -} - - -let contractId; -let privKey; -let qrText; -function setup() { - // Setting contract id, priv key and link state variables. - const urlSplit = window.location.href.split("/"); - - if (urlSplit.length > 3) { - contractId = urlSplit[3] - privKey = urlSplit[4] - qrText = `${contractId}/${privKey}` - } - - if (contractId) { - connectNear(contractId) - } -} - -setup() - -function App() { - //state variables - const [curUse, setCurUse] = useState(0); - const [pubKey, setPubKey] = useState(""); - - const homepath = `/${contractId}/${privKey}` - const scannerpath = `/${contractId}/scanner` - - // rendering stuff - if(curUse == 1){ - // QR code - console.log("scenario 1, QR code") - return ( -
    - - } /> - -

    🎟️This is your ticket🔑

    -

    Screenshot and show me at the door

    -

    - -

    - - }/> -
    -
    - ); - } - else if(curUse==2){ - // Direct user to claim POAP - let link = formatLinkdropUrl({ - customURL: "https://testnet.mynearwallet.com/linkdrop/CONTRACT_ID/SECRET_KEY", - secretKeys: privKey - }); - return ( -
    - ); - } - else if(curUse==0 && !contractId && !privKey){ - // Event Landing Page - return ( -
    -

    Welcome to the Keypom Party!

    -
    Drinks are on the house tonight!
    - - } /> - }> - -
    - ); - } - else if(curUse==0){ - // Key has been depleted, show resources for NEAR - return ( -
    - - } /> - -

    Now that you have a wallet...

    - - - }/> -
    -
    - ); - } - - -} - -export default App -// ReactDOM.render(, document.getElementById("root")); diff --git a/packages/docs/tutorials/ticket-app/state/keyInfo.js b/packages/docs/tutorials/ticket-app/state/keyInfo.js deleted file mode 100644 index 957c28054..000000000 --- a/packages/docs/tutorials/ticket-app/state/keyInfo.js +++ /dev/null @@ -1,47 +0,0 @@ -import { initKeypom, getPubFromSecret, getKeyInformation, getDropInformation } from "keypom-js"; -import React from 'react' -import * as nearAPI from "near-api-js"; -import { useState, useEffect } from "react"; -const { keyStores, connect } = nearAPI; - - -const KeyInfo = ({ contractId, privKey, curUse, setCurUse, pubKey, setPubKey }) => { - - // These functions will run anytime the component is re-rendered - useEffect(() => { - async function getUsesRemaining(privKey){ - let tempKey = await getPubFromSecret(privKey) - setPubKey(tempKey) - const resKeyInfo = await getKeyInformation({publicKey: tempKey}) - if(resKeyInfo){ - setCurUse(resKeyInfo.cur_key_use) - } - else{ - setCurUse(0) - } - } - async function main(privKey){ - await getUsesRemaining(privKey) - } - main(privKey) - - }); - - if(curUse==1){ - console.log(pubKey) - return ( -
    -
    Public Key: {pubKey}
    -
    Current Key Use: {curUse}
    -
    - ) - } - else{ - console.log(curUse) - return - } - -} - -export default KeyInfo - diff --git a/packages/docs/tutorials/ticket-app/static/img/green-check.png b/packages/docs/tutorials/ticket-app/static/img/green-check.png deleted file mode 100644 index 287c73d3f4fe6fca74685a7a18e724f1709fcda9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104273 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�x??G@{(b9;amr5Q%QXoXcHl+Vhk?X`e;R z=bb^eE?4>AMPEz)P;Ro{azPwp0Xj0FHFRUH-wnBt|2@+HKbRW3k!I`Uvl6vxwm=2~ z4Z+{RP6(}NY<^)zqzdl-tAgQw>MM6`$Y-QgI)K=O*#@h_T9V1VH#|S1zi?yva?Ac6 zA3XiDF0`6@Ex{B=gvU6v_4C+rx*v$n54_g#=jVKQA zvobFyJki3^{akvX#7!YEHCh@P{^9n6VG(tWmHYjRP&`Alu}SWRUd6Vxc$Zo5PcFLc4TAke~VbFakAv4FwuKx#0JkQL-U*QcYDT~iac1LAM z?b8t~yW>&uFbm~EA`$=E#=m)}ZqdA`DKWtkeY(=z*w$!`Z0!>{x)Q-(NmP(#<}sK4rIXU4y-bY$NLu z)=u@Xa9h8(wKZXr8Jh+Y!H%}e9TG>(gs4>j+28Salob{(ePNB`M-^#ECN{eMV0&!3 zlaDRjkBK%R!nYxat!EfUKwmW^Z&}wT8cP$;3LnM~K0tRbkEF?LRVK(3xp~qf)v5y@ zv+Nc}#p?#WU`Ns!K`s$6?e3w!LzbG+RK8L^{joAs7a?8q(L@8`{;_nMz{y;(n)dk+ zZ)im`->)QyQ1k(j9U1Gg&#vqM0CHrkLBCbO!+YFECLIVNXGaXeaz&>Z`Z}S}bNZ|l zzwCffK>!KZ5?MwSCs9(KwCdv*hyLpsCW0e;e6A?9tRFQ$0$?0AD39!as&2iOSdj^t zLJ_TXw(|C_?W;BFp}bFffBmls!4A%GH9oKgXy$!StbeN8t|N_PT@q5^lnr=q8Rv=rvka{ycCwj%vLg z>mN5;o(?-cjjc}Bi5gZ?AtAkE16&$R37{e@hQZPcf@O)bl4(SA)3ZH%I>xVR|g zhWgU3WwebM2=8g4k;;sT){R1#prtA^6|4h)-_opnXo9mskXa~2 zGfc*nSiH3K0J9Q-3M&#T-FLbN^1bp5T3MY}%9sj5!)I@xwQyUn(W$O2uo6OX9vOei zo-8FeYX|W*dwFp)w|h5UWJiy6ZaHWh`4OIzrS-o(vhQL64q?=t@1r(q<_7|nv$a6-97c#Es? zDpK1=<9+g=Cj(xZ77F8cOVAP(AnShWWdk2(8Nz`&Mv(wd7Rzs%RyH#&33AZh3u3RW@%1WZrjYalrDrdMIn;}!#oD95*a~cutAc2n zQ$+UrHi9aRTYWbQR2*OktozkMR8ap83pIu${oju65nv{bmcokEG=U4V>ZZ?RAe zyzlfysXLR-BEMR37%lXiFB$2Mn4KWaykYh=JCXelQ}X=(|F&0})!7C!$%G!25`TSz zat4GfB)dN<%BiUybum&oBPLj;dlEVL%;_b1Ag?B+&?`Yv3HmB@l-em#uwC3vSyt7_ zR<~%6eC?JKtt{WFm|5{fnU1I^*K+}&Q)qV27z1rpcX?9q7cn)QDnK@M+dzGi2vOLPDF{M@3i z!rOb7wyjgB&0@K>f0KY3$iZIJC3&GR4kExY7;VD!&c&)C-DZ33iN$_VGoPt=PTb=7 z_i&xXUbUTxQhf($EnkvUk8tdkVV^$e-YJ>EsCbyX!9;#ORQk!X@pty1!h&KqhRq4# z)^+bswuXnGJx(wc+44F0dI8yHZe+c*&+AjLgrXIE!21|u=B({uw)z0|Tuf|!u;YX5 zBtvk74AE~?eztq{!{$yYRJ$114Nvm6Z?vyW6N!*kG3lBrcbJS5RPX&71B(SzlT|bF zEDZZV3@h=>4n=ukbAM{)?#6=my0;oG6%Ach(MxVWB2`bLf+tJK*;qUScoe5C(ag6; zndg!B@DT}hMdFchPAH+rf%+on{L$IZZ!2$V8UY%(Efh;~@ml;C#|un2)RXqmfCp#A zw?B7f1Os2f((nHozn*eOAt2Q~4M^qp|J$YTJnVXdp2Qon%=FVoU+q2$GUB<@jt#1^ zS^fld!C3arEPfD}0nQ%HpeHKg7AxXEnk%zY=Js}b*&f9#+&=yXy+IfTF6LoWR2cVq zF?giZ&`(vI4&~oE;LNtjV(Cz(jh3U2e{|_9CezppqYZxpk0dk5D;ohpJC)ez&*}JK zPWhgI<997Ubxyv0DY&O|hRHi%5riA>_vn>esU^;}B-j)rf0XkMuMR#Oo$1BbHn$7Ir?D!Z$#(6Emr9CLu2F zze0&&n{foBQ#;OsDyJw$ULQLoy*1P-!1JK)cK@k6aLak|xO3fNQ`R#npC-VN#zTLg z(*xu)%@tM~D{t6udmr4c@i!=8&0F!$x7m)VH@tr`U$3ZhZ1Hr9lIt|h9!k7FARJ6| zIV9%0J|7p@YZZ^<;|N4q7WmJ!JmS{0VZ^F!ToC{>4=GjE1XWyt$9O2vAal0+H&3ED zmF0B&)ak*K3XtRoO5-1@ZO8772>RQ92K z8)Sg?wBKyVf-Upp!0038{i%# zGb1;c=O&rD)_2InsZ>_e3c6O-Y?vv|MM-EVhDIM@II>X|J8M9NUS_u$XB3RnQ9su* zpTb+ZM41M}G?d|;eF9cy_jOwdpiB43Q-=lx?T`Z|$t$G-)XKulvnN!PO!fLRxA>!4ONgFxRXEg+F!vFx7 zq$ZNKwxWR8Hw)KVZ)IAW#+m@F5SlNa%+Eit`*a(o7_bmzuzb{6y?C(H|GN6v2G<;1 z}t~+5ZfevaFuThOik`Q7T z#|(8Y1M;IfVOHZK?ERZCknF z@+i*28*lLC21MnH7FhnJ-TLgkC`!Y^NOXeiDJ>PFS5xnbT7V`^4Vy_uX)&S4n`Ve1 zKTZm@Kb?DZ^CwliV`jWiC4Bzv02&)AD+zv8%aB>fVKR1JGavA?4ya|^$EL>*wr4u} zf9|N$8o9$UzXksW*dRjDFM_-0Yv(t_d;%fo{U2xqX}N$orondads{TFHE+I&Nl&B) zYT1`zB4q;`3f?%)A|}68lSNniL6rH0vA0yW&^O8)AFH$2ad>9!dO=_ZZG-}bqHwhVEoYkA zVSb`Um@~4e!hQTJWQKVOSdN0fbkus-;7l)53E1SHU=7mvb<7S*THv(;{HLS$ac>bvx3B$2^m8SRSilu;V_9?jl-nlv?kmDI3=Jga|S)P z#dRwp_ETy{nJMQl0s^%PWC_&NfU+gHL2tp?v@M1)1BfhN?izYd<pm6-%`-;(Kx ze|e*GWmnB+Cl@Tq@~-p(nX8Urm$3@s^0aD)O^JRlTgE};ZnG$QJ8#~{tF2c9{b)E2 zj@Ema)Ly;|x|JWk_+`k4)|Dchb0w3DzpRWf~bG9p3C}p5wetcpU^jN4@ zjB)hI5bMY9)d&bhwM>xR9U`rnG1kNMJ7~NviloaAUKpLPP%|}dx>$G#kL)-71b|_`w-gM+^6 z5fhNO+uz>nEPN2142cFSv^!WU+0@(hYg?0+EfkbtVpS6po90DXMTe|qb1itA4^!b* zQeML6n*yoTyRvKZxW##3_*KtCxk#URzXxT%w5-x{tH7`|nj0pvIy({z#&cnsqchr0 zh1>X(YB8t5WJ=TFRu0UwUkI5nc_Z22!WWKGG`=#gSo0pEO&vav-$2aV_(qxu6P8r= zaevbU=^JSDu}kQAC@59nn%ISw_>vpJ1Zx22jPRXx-H~N(9|LB2!%Xge`K>mXNPJO?$q`T#i??g1Q{T=%fX(8Y9}`5> z-I1HERg7D>$Rj2FdDB5CuR?jU&Xn?J-7zsQ9Fqmk0`|TcBHh`BdOy4DT~~;Hz;uhn zwNCXGw}L?_W4RzLV`8Ku&ZgnT?QiL=K(lY8HPfU^24f6N!gYFn$yajhJWiKbR$9x@d zX|KUs@%EHBq<}%(3{BTXmn96#vPckuKK?gQ$2;gn1GLs-Vc*}S_$pGOTsV2Y(3aPC zP-vEC$_s>k|K59llyPl%boD?Wm(YIyjXrppL0d z#;Q1NgXq%a;3#y#eH!ySV2rxMpTrNCI7-8REBl%OeZk277Wi9p%hJ-!Ruq2FdqCPU zH#`<5*BTA&ZO4&r5vE5bu#|7KeSU^Qc|5MQ5Zn!oC^#G!3@$W0__!1Llrm;%l)z%r zT``yN(W0LZhQ19=)z{ZF;k9U6YI}6D#7-pVAZ~F4Jq}&CB#11Oi`meS1S$?*%1t!IN6&{`ttn;ZmH0W2wUowLrSde`<3Zl`fF(BN5LkQ}k_TlzV4-HOk-3AjFdVwXxS-0S?66ASh1Mb12 z4M<~ShAMD18leai#O4JxJ0t z?UKzQue1zLP*L%}7mGV~N!33Y+#=U2;@0kMg@GiP$}BE=^Y+A6+9JD!+hO zK4y6->%XW0xWc3se)UjM$mqc4h7MYf*WKpb^=upQ;arSzxjR_w555E@o~1DPV#`Cu zuq7!Phy8G^S0MFruFW5_D%q6J&)ofZjX^SfCl;D#L`yW)#43vhKm>Avu!v!?I(R*bB?Ue+X zr}1nuiyNnQw_)Db@aXt6Ilxvn?*aMcNi)sI@REf0{65vBcu6S2Yuse6(XqaX$5>-2 zDiyzF<+ae(bQ7%YV0=1yNwcA#xzy@oPU7S@L$&*WF{qZ3{rg_R^_LPr4MNWYlzb!% zNkenM>lc8u7x|WMk0J~NE>(_ydz7CD){8iw*2Fu18}W(uUV2KEPypJ4u>28=uKS@^ zaJz$u7L-0fyDnwoY?Lg+sYZUsAJr$|eCMk;`3G)zikH9^w;X2r^^13M6?fi+)mr0m z%sBpn<0K(n4`u>&6^uKTXiuct_Hy z2}!<}Ll@XlnSu&3bjE7bReU+=A%AQ6rw@J-gKk;JP)Ff4V+eSM;CA2FaRX+8o2uc; zA>TdyFNFMvXi5wzv1wKXCPgb$wcqOtxlCkdfrX+z#6+v|b*_p0A<}3vpa0q^g%yg# zqqk{zEww(V;K%9W9S74kp-2T{0x!%}(c4g7j87<_5Yj!NSFZseIf0H=aOA4g(mWnL zvElU{5?~OCf=Ut7-i}=!FtZQ%^sMJpdzLkt_T^e05JjUe3=&U2iC#B*fO129m=j18 zG@BSW3MDA5=(oDyz9@3h@#(Lsd8FN-OPgOI-fIf#R;bLq0T>gOc^}7DsRW=o>k{|6VYGKY7?5s+iam}E5x`>CjUqQkdZcQ#wbj|jdlIUi`O4+nd?^6>S!4a6M`vDS+ zwG;5i-RDWBElRLcXj?^@#9)44?~WgUa>Tw)jaeu$%q{K|cM1auVBQSw1V`l)Dj>5b zD*3?vS=hmX$jQt&miMD4U+;QJYFK1lTgnG8eSA0(FJf15T5z|JDc~FP_QCm8-H_|+ zg7a(W7qtBoJA5zuwun1Q65mLU7nnmU(B`IeR)l=pj7U$Fa7%RalN?m)4rGP04Q2?o zMiY&aHI%x=dRWlh4aRL;B#cFfun3%3hUA3>p-Jfc1Ao@}_+FubjYA5C)9b<1>$xH( zZI*j-%Ui`LV)hHE4qzW%3maT(C|TU2*iZt0EHjff=qP=P*Fi2%tzb z21b4B>;rdI&6*aS!XH^@f#%F+?g|PCxRsAus`A~O=t;r^DBtdFhWBcib(!&?Wzm12 z)tH=By$yu}`|EJ*@&uR;_S?i3XY#J3!0;vKP@_Ghq$#S3gYa%yAqMCu zlb68;O&^B$r79{O=P*G}1Z3199x};Yy2_qVvxgV7yo}jYOrr?Qdw7UuZ2vHp5vYGx zMr1-D=$_kiB-c>&fKL7>3~l>XGvP)!B&jtJH-dLSuLmO>YE>GCH_!Wl>7wj9k8;ct zQ9Jv@azPB14Pl?DEy|+E*H&`xRY7>VeYsj?3LM|Ph(P~D0q`;KCv5L-tSwQsqR}=d z&ME~;P_cRKVnZU1wAt9t4#XBhW5=L3cel&^I=Awiav_0asJwBqDpG=CqE@YC;X~jB zv2=kOQky~es*6X2q_gP=&kgkfPFeG#@Y)0?EWpWM?WjxN)s5X^-*d%uC~bUetz9JY zPR%98dsJBCM~A%lnYh8yf1&yyEHVA-cUnV2fSk(Yglb@1Bu@lv*U%E?CA6!o;_(K6 zEh7(t0;ASFm-+vBqcesG>E|#>`FpMnw?ds1*86I!5qGu{^r)7>^rozl`L+6wnQ;6m zlRPUARpEJA`O|K_DaAr1P3pCe&;;%!>;3cSJIG+^|Jreh`U3;!mgaFXaP)XuS)=9^ z(M^xXE=eJW8nloX(qt!v?|hSd3Gw7Y?2(krBJu@kzI#deda`!3b>FEWt-~rP#nEjT zw2hWlkgTWt8z1-+-Wmle2W?Fya@%Io#3WOSYf^f;UHrdo=8+b_DKYNZMOakBX zD3|&aZ3s_Oi*{ek^(EW?_!rv}L3r-G; zyWkmQ?IJj9>tNG>*uIA@iF_L^r_7=r3C-Wbs$f5VQ&%}AYyK=M5U!#~BYksqDfFHi zN@L>($sO_&Hu4yMLvC__A3jOY*RRXxlH+Pz`_MBe#5}AaA&^!|MiMJwUIdgSDM3%7 zBCW>l*_4wbNxYvwg(?r0Foh9_1(gX{?tAY=u@bdvH}uTT^IBelj^zAtd%@ur3{y9` zv`hmPXlVg!rb#k~=XcMMa{Rmw`rsnx9^)wcp9t}b8U>sJJ3=yRM`YpO@$|HmC8?f} zg$h@y9Q*|Ba>bF>9x)@plCD-#Z>7VoGEhPYnVShtd1&9sML5pT#)cYRmI?Q|TIj-o zBAP0+eAksmI4L`iJt#+G4PF%3fVJH(<%?^i#?67%!NG#!{nUfpgyQIb{rfb_!QxXA zKWRE$b@Od;m@S)d7WMsj*S>ecrS*gGgtAb_sni7Sr^kNy`JI4*mnV20Qou+;TbbhhO%rc`Hiu zBCnrzE$X}*9VsiPdI#c=LNTvF`T~2I5|}GOIY0CxvqSlu;0=v;bd$nep);=?&-?|m zN?yiHKU;dhH8S3L>ata`!?bF_?%$m#&>Yd7c>#O{{O|nB;%r*R+uXOKT{SaVbg=%F zvaN^c9wQxLg3R$vh)l%nJoU=To6eJ$o!ym?LW#J@Gn1(j{D1W8{YBroxcdSm9>~Qq z=QOlJiagi#-S4N(ekv=jGnth36Q2qjA$D{@%8e1mH>(Z5C|PICq~}O1(~DtfNPI@8 z#%J*AP?+TCFY&ZJ^%u|e;rYHMd5{1aM^o#pHp22F>G8JgkPst;{NaDYSAkb1N^KT? znRQ<+(Dyp_@e{N|B$x(JQUkBFZ*+=ZetzF%H-39H4H84-?lA-O+#m$*zr9LVfBoaq zQ<7fEv0Bz|NSmIix!f1wJ4Dsr`}Ka$na&)jm`v_Or!!x6{tNAiL|!hJHTB13PK}g> zfvYptnOV?@3&6F4XGbpD@7*q3STXr~k)2It3@Akj7Eh>4_bzX1O+FF0O^nP^d zo)P({-`bSSdXc);;2m(|`qn1wiq$EYfeI2!mkZuCEiOWdS1sk7Uq`z7*v^^Uz>F-T|-iu*7&nFvWU=)L9_bGiJqhlVbC3a@$U&PTweI+D9Q zzxbm2dhV#po>eYY45vgdQ8Sc&bZL+mIgDsFH+PY?T=&Iz;@D436;w^AY0;u8R{%>T%BQ8mo*arT$w5blI>jo!?1fXJb9RJy+kd_Ou1s?B+0E zrTMQtcbC>K)9rTU-(UIu$ORAg?@a|H`g5f6M!6YT(Bt>iSFhL(@E9~(EMLdgqyGmp zb4Ms@fBmGA{xp(4!`Awe4T%ne`=x8BS8n#q<3zlbGud+#?i^yeYpo&7iCw(6ba-_~ zKG!Ji6+d z^aS16hZ-ercqJtIF|g#{W@8G)J+wGZ_ZGT-Y^>8medT$XJ@*s+TdXy|>*`TBR!8*V zPo2o?>Q{XW>-A|W>BG~SnY$MJ-C*7roXkkR_lfpy%IRNpK&3(GT7V@zrY~QS zoU#Q_gK(ukVQR(^f`RmA=a=2w*A`m+x~K>NUWdJYnUl}|&Sb1W-`3wdGMlqnsAIf# zn)fS;sgb+JT0wCY5@#cRSHyW}odQpC?R42|oocSYC$L1W5kdPFWBti=I{Zd&h)Mh) z7dskbEQH}OQQW0!?#_2u^S2f}Q6`UP$*#UeO-dxyH822<0eB7T&q4Nq-xdb1?ky*X z+W*SzOxMW_lgD{Y$=_5z1U_36hXC64Q!-jofo)EjiJGZ04X_6D@9UO8UWzqM)qb1j zhxqh$Trvzb#)8#ZK!hFl?115XrR{rj16`Rsr{gH3|B zo_Xw}&B~nA(N!VFjrktbo>7vvP^GyC2$n_m#RUqlZq=fmJ&!&(H^nmp5*vuwylLc9 z%rJacd{b$qQlotW7B=+F6A=mTeHd)tMD-gjgWg!`O7?8|%iLsu)yT^m&X=);{iwwj zM?S;8{_=H1r}(32&ma~;eASp&EiRy`NmB_I{L{)8ZIj->|L*QE4_fwLd%kj_OpJZq z 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 x_Rwb0BJYzcxZld>N { - const [messages, setMessages] = useState([]); - - useEffect(() => { - guestBook.getMessages().then(setMessages); - }, []); - - onSubmit = async (e) => { - e.preventDefault(); - - const { fieldset, message, donation } = e.target.elements; - - fieldset.disabled = true; - - await guestBook.addMessage(message.value, donation.value) - const messages = await guestBook.getMessages() - - setMessages(messages); - message.value = ''; - donation.value = '0'; - fieldset.disabled = false; - message.focus(); - }; - - const signIn = () => { wallet.signIn() } - - const signOut = () => { wallet.signOut() } - - return ( -
    - - - - - -

    📖 NEAR Guest Book

    { isSignedIn - ? - : - }
    - -
    - { isSignedIn - ?
    - : - } - -
    - - { !!messages.length && } - -
    - ); -}; - -export default App; \ No newline at end of file diff --git a/packages/docs/tutorials/trial-accounts/guest-book/components/Form.jsx b/packages/docs/tutorials/trial-accounts/guest-book/components/Form.jsx deleted file mode 100644 index 2fd8bd06a..000000000 --- a/packages/docs/tutorials/trial-accounts/guest-book/components/Form.jsx +++ /dev/null @@ -1,44 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; - -export default function Form({ onSubmit, currentAccountId }) { - return ( - -
    -

    Sign the guest book, { currentAccountId }!

    -

    - - -

    -

    - - - -

    - -
    - - ); -} - -Form.propTypes = { - onSubmit: PropTypes.func.isRequired, - currentUser: PropTypes.shape({ - accountId: PropTypes.string.isRequired, - balance: PropTypes.string.isRequired - }) -}; \ No newline at end of file diff --git a/packages/docs/tutorials/trial-accounts/guest-book/components/Messages.jsx b/packages/docs/tutorials/trial-accounts/guest-book/components/Messages.jsx deleted file mode 100644 index 91d9e0de0..000000000 --- a/packages/docs/tutorials/trial-accounts/guest-book/components/Messages.jsx +++ /dev/null @@ -1,21 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; - -export default function Messages({ messages }) { - return ( - <> -

    Messages

    - {messages.map((message, i) => - // TODO: format as cards, add timestamp -

    - {message.sender}:
    - {message.text} -

    - )} - - ); -} - -Messages.propTypes = { - messages: PropTypes.array -}; diff --git a/packages/docs/tutorials/trial-accounts/guest-book/components/SignIn.jsx b/packages/docs/tutorials/trial-accounts/guest-book/components/SignIn.jsx deleted file mode 100644 index bd96bb5f0..000000000 --- a/packages/docs/tutorials/trial-accounts/guest-book/components/SignIn.jsx +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; - -export default function SignIn() { - return ( - <> -

    - This app demonstrates a key element of NEAR’s UX: once an app has - permission to make calls on behalf of a user (that is, once a user - signs in), the app can make calls to the blockchain for them without - prompting extra confirmation. So you’ll see that if you don’t - include a donation, your message gets posted right to the guest book. -

    -

    - But, if you do add a donation, then NEAR will double-check that - you’re ok with sending money to this app. -

    -

    - Go ahead and sign in to try it out! -

    - - ); -} diff --git a/packages/docs/tutorials/trial-accounts/guest-book/contract.env b/packages/docs/tutorials/trial-accounts/guest-book/contract.env deleted file mode 100644 index f2bf058c8..000000000 --- a/packages/docs/tutorials/trial-accounts/guest-book/contract.env +++ /dev/null @@ -1 +0,0 @@ -CONTRACT_NAME=guest-book.examples.keypom.testnet \ No newline at end of file diff --git a/packages/docs/tutorials/trial-accounts/guest-book/favicon.ico b/packages/docs/tutorials/trial-accounts/guest-book/favicon.ico deleted file mode 100644 index 405779a1cc361265f678d13fc1a759128392bdc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8719 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 diff --git a/packages/docs/tutorials/trial-accounts/guest-book/global.scss b/packages/docs/tutorials/trial-accounts/guest-book/global.scss deleted file mode 100644 index ccd586cf9..000000000 --- a/packages/docs/tutorials/trial-accounts/guest-book/global.scss +++ /dev/null @@ -1,128 +0,0 @@ -* { - box-sizing: border-box; -} - -html { - --bg: #f4f4f4; - --fg: #25282A; - --gray: #888; - --royal: #0072CE; - --blue: #6AD1E3; - --primary: #93b0df; - --secondary: var(--royal); - --tertiary: #FF585D; - - background-color: var(--bg); - color: var(--fg); - font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif; - font-size: calc(.65em + 0.7vw); - line-height: 1.3; - - ::selection { - background: var(--secondary); - color: var(--bg); - } - - @media (prefers-color-scheme: light) { - --bg: #25282A; - --fg: #fff; - --secondary: var(--blue); - - ::selection { - background: var(--secondary); - color: var(--fg); - } - } -} - -body { - margin: 0 auto; - padding: 0 1em; - max-width: 40em; -} - -fieldset { - border: none; - margin: 0; - padding: 0; -} - -.highlight { - align-items: center; - display: flex; - margin-bottom: 0.5em; - width: 100%; - label { - margin-right: 0.5em; - } - input { - caret-color: var(--secondary); - } -} - -label { - color: var(--gray); -} - -button, .highlight { - border-radius: 5px; - border-color: var(--primary); - border: 0.1em solid var(--primary); - padding: 0.5em 1em; - - &:hover, &:focus, &:focus-within { - border-color: var(--secondary); - } -} - -input { - border: none; - flex: 1; - &:read-only { - color: var(--primary) - } -} - -input[type="number"] { - text-align: center; - border-bottom: 0.1em solid var(--primary); - margin: 0 1em; - width: 4em; - padding-left: 0.5em; - &:hover, &:focus { - border-color: var(--secondary); - } -} - -button, input { - background: transparent; - color: inherit; - cursor: pointer; - font: inherit; - outline: none; -} - -button { - position: relative; - transition: top 50ms; - &:hover, &:focus { - top: -1px; - } - background: var(--primary); - - &:active { - background: var(--secondary); - border-color: var(--secondary); - top: 1px; - } -} - -.is-premium { - border-left: 0.25em solid var(--secondary); - padding-left: 0.25em; - margin-left: -0.5em; -} - -table button{ - margin-left: 1rem; -} \ No newline at end of file diff --git a/packages/docs/tutorials/trial-accounts/guest-book/index.html b/packages/docs/tutorials/trial-accounts/guest-book/index.html deleted file mode 100644 index 0ec2cfeaf..000000000 --- a/packages/docs/tutorials/trial-accounts/guest-book/index.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - NEAR Guest Book - - - - - - - - -
    - - - - diff --git a/packages/docs/tutorials/trial-accounts/guest-book/index.js b/packages/docs/tutorials/trial-accounts/guest-book/index.js deleted file mode 100644 index d6691a9d7..000000000 --- a/packages/docs/tutorials/trial-accounts/guest-book/index.js +++ /dev/null @@ -1,25 +0,0 @@ -// React -import React from 'react'; -import ReactDOM from 'react-dom'; -import App from './App'; - -// NEAR -import { GuestBook } from './near-interface'; -import { Wallet } from './near-wallet'; - -// When creating the wallet you can choose to create an access key, so the user -// can skip signing non-payable methods when talking wth the contract -const wallet = new Wallet({ createAccessKeyFor: process.env.CONTRACT_NAME }) - -// Abstract the logic of interacting with the contract to simplify your flow -const guestBook = new GuestBook({ contractId: process.env.CONTRACT_NAME, walletToUse: wallet }); - -// Setup on page load -window.onload = async () => { - const isSignedIn = await wallet.startUp() - - ReactDOM.render( - , - document.getElementById('root') - ); -} \ No newline at end of file diff --git a/packages/docs/tutorials/trial-accounts/guest-book/keypom-data.js b/packages/docs/tutorials/trial-accounts/guest-book/keypom-data.js deleted file mode 100644 index 386ea3f0a..000000000 --- a/packages/docs/tutorials/trial-accounts/guest-book/keypom-data.js +++ /dev/null @@ -1,58 +0,0 @@ -export const KEYPOM_OPTIONS = { - beginTrial: { - landing: { - title: "Create an Account", - body: "To start, enter a username.", - fieldPlaceholder: "Account ID", - buttonText: "Create", - }, - claiming: { - title: "Creating Account", - body: "Your account is being created. Please wait...", - }, - claimed: { - title: "You're all set!🎉", - body: "Your account has been successfully created.", - buttonText: "Continue to app" - } - }, - trialOver: { - mainBody: { - title: "Your trial has ended", - body: "Choose a wallet provider and onboard fully into the NEAR ecosystem.", - imageOne: { - title: "Secure Your Digital Assets", - body: "Now that your trial is over, secure your account with an official wallet provider!" - }, - imageTwo: { - title: "Log In to Any NEAR App", - body: "Once your account is secured, you can use any app on NEAR!" - } - }, - offboardingOptions: { - title: "Choose a Wallet", - } - }, - invalidAction: { - title: "Invalid Action", - body: "Your trial does not allow you to perform this action. For more information, please contact the site administrator." - }, - insufficientBalance: { - title: "Insufficient Balance", - body: "Your account does not have enough balance for the action you are trying to perform. Please try again with a different action. For more information, please contact the site administrator." - }, - wallets: [ - { - name: "MyNEARWallet", - description: "Secure your account with a Seed Phrase", - redirectUrl: "https://localhost:1234/linkdrop/ACCOUNT_ID/SECRET_KEY", - iconUrl: "data:image/png;base64,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" - }, - { - name: "FastAuth", - description: "Secure your account with Biometrics", - redirectUrl: "amazon.com/SECRET_KEY#ACCOUNT_ID", - iconUrl: "data:image/png;base64,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" - } - ] -} \ No newline at end of file diff --git a/packages/docs/tutorials/trial-accounts/guest-book/near-interface.js b/packages/docs/tutorials/trial-accounts/guest-book/near-interface.js deleted file mode 100644 index c5dd2ccff..000000000 --- a/packages/docs/tutorials/trial-accounts/guest-book/near-interface.js +++ /dev/null @@ -1,24 +0,0 @@ -/* Talking with a contract often involves transforming data, we recommend you to encapsulate that logic into a class */ -import { parseNearAmount } from '@near-js/utils'; - -export class GuestBook { - - constructor({ contractId, walletToUse }) { - this.contractId = contractId; - this.wallet = walletToUse - } - - async getMessages() { - let totalMessages = await this.wallet.viewMethod({ contractId: this.contractId, method: "total_messages" }); - const messagesPerPage = 5; - const messages = await this.wallet.viewMethod({ contractId: this.contractId, method: "get_messages", args: {limit: messagesPerPage, from_index: (totalMessages - messagesPerPage)} }) - console.log(messages) - return messages - } - - async addMessage(message, donation) { - const deposit = parseNearAmount(donation); - return await this.wallet.callMethod({ contractId: this.contractId, method: "add_message", args: { text: message }, deposit }); - } - -} \ No newline at end of file diff --git a/packages/docs/tutorials/trial-accounts/guest-book/near-wallet.js b/packages/docs/tutorials/trial-accounts/guest-book/near-wallet.js deleted file mode 100644 index ffda62a2c..000000000 --- a/packages/docs/tutorials/trial-accounts/guest-book/near-wallet.js +++ /dev/null @@ -1,130 +0,0 @@ -/* A helper file that simplifies using the wallet selector */ - -// near api js - -// wallet selector UI -import '@near-wallet-selector/modal-ui/styles.css'; -//import './components/modal/src/lib/components/styles.css'; -import MyNearIconUrl from '@near-wallet-selector/my-near-wallet/assets/my-near-wallet-icon.png'; - -// wallet selector options -import { setupWalletSelector } from '@near-wallet-selector/core'; -import { setupKeypom } from '@keypom/selector'; -import { JsonRpcProvider } from '@near-js/providers'; -import { - getTransactionLastResult, -} from '@near-js/utils'; -import { setupMyNearWallet } from '@near-wallet-selector/my-near-wallet'; -import { setupModal } from '@near-wallet-selector/modal-ui'; -import { KEYPOM_OPTIONS } from './keypom-data'; - -const THIRTY_TGAS = '30000000000000'; -const NO_DEPOSIT = '0'; - -// Wallet that simplifies using the wallet selector -export class Wallet { - walletSelector; - wallet; - network; - createAccessKeyFor; - - constructor({ createAccessKeyFor = undefined, network = 'testnet' }) { - // Login to a wallet passing a contractId will create a local - // key, so the user skips signing non-payable transactions. - // Omitting the accountId will result in the user being - // asked to sign all transactions. - this.createAccessKeyFor = createAccessKeyFor - this.network = network - } - - // To be called when the website loads - async startUp() { - this.walletSelector = await setupWalletSelector({ - network: this.network, - modules: [ - setupMyNearWallet({ iconUrl: MyNearIconUrl }), - setupKeypom({ - networkId: this.network, - signInContractId: this.createAccessKeyFor, - trialAccountSpecs: { - url: "http://localhost:1234/trial-url#ACCOUNT_ID/SECRET_KEY", - modalOptions: KEYPOM_OPTIONS - }, - instantSignInSpecs: { - url: "http://localhost:1234/instant-url#ACCOUNT_ID/SECRET_KEY", - } - }) - ], - }); - - const isSignedIn = this.walletSelector.isSignedIn(); - - if (isSignedIn) { - this.wallet = await this.walletSelector.wallet(); - this.accountId = this.walletSelector.store.getState().accounts[0].accountId; - } - - return isSignedIn; - } - - // Sign-in method - signIn() { - const description = 'Please select a wallet to sign in.'; - const modal = setupModal(this.walletSelector, { contractId: this.createAccessKeyFor, description }); - modal.show(); - } - - // Sign-out method - signOut() { - this.wallet.signOut(); - this.wallet = this.accountId = this.createAccessKeyFor = null; - window.location.replace(window.location.origin + window.location.pathname); - } - - // Make a read-only call to retrieve information from the network - async viewMethod({ contractId, method, args = {} }) { - const { network } = this.walletSelector.options; - const provider = new JsonRpcProvider({ url: network.nodeUrl }); - - let res = await provider.query({ - request_type: 'call_function', - account_id: contractId, - method_name: method, - args_base64: Buffer.from(JSON.stringify(args)).toString('base64'), - finality: 'optimistic', - }); - return JSON.parse(Buffer.from(res.result).toString()); - } - - // Call a method that changes the contract's state - async callMethod({ contractId, method, args = {}, gas = THIRTY_TGAS, deposit = NO_DEPOSIT }) { - // Sign a transaction with the "FunctionCall" action - const outcome = await this.wallet.signAndSendTransaction({ - signerId: this.accountId, - receiverId: contractId, - actions: [ - { - type: 'FunctionCall', - params: { - methodName: method, - args, - gas, - deposit, - }, - }, - ], - }); - - return getTransactionLastResult(outcome) - } - - // Get transaction result from the network - async getTransactionResult(txhash) { - const { network } = this.walletSelector.options; - const provider = new JsonRpcProvider({ url: network.nodeUrl }); - - // Retrieve transaction result from the network - const transaction = await provider.txStatus(txhash, 'unnused'); - return getTransactionLastResult(transaction); - } -} \ No newline at end of file diff --git a/packages/docs/tutorials/trial-accounts/guest-book/package.json b/packages/docs/tutorials/trial-accounts/guest-book/package.json deleted file mode 100644 index 8d6461f2b..000000000 --- a/packages/docs/tutorials/trial-accounts/guest-book/package.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "name": "guest-book-keypom-demo", - "version": "1.0.0", - "license": "(MIT AND Apache-2.0)", - "scripts": { - "start": "rm -rf .parcel-cache && ./start.sh" - }, - "devDependencies": { - "@babel/core": "^7.18.2", - "@babel/preset-env": "^7.18.2", - "@babel/preset-react": "^7.17.12", - "@parcel/transformer-sass": "^2.8.0", - "@types/node": "^18.6.2", - "buffer": "^5.5.0", - "crypto-browserify": "^3.12.0", - "env-cmd": "^10.1.0", - "events": "^3.1.0", - "https-browserify": "^1.0.0", - "nodemon": "^2.0.16", - "parcel": "^2.6.0", - "path-browserify": "^1.0.1", - "process": "^0.11.10", - "punycode": "^1.4.1", - "querystring-es3": "^0.2.1", - "react-test-renderer": "^18.1.0", - "stream-browserify": "^3.0.0", - "stream-http": "^3.1.0", - "ts-node": "^10.8.0", - "typescript": "^4.7.2", - "url": "^0.11.0", - "util": "^0.12.5" - }, - "dependencies": { - "@near-wallet-selector/core": "^8.1.0", - "@near-wallet-selector/modal-ui": "^8.1.0", - "@near-wallet-selector/my-near-wallet": "^8.1.0", - "@near-js/accounts": "^0.1.3", - "@near-js/crypto": "^0.0.4", - "@near-js/types": "^0.0.4", - "@near-js/wallet-account": "^0.0.6", - "@near-js/utils": "^0.0.4", - "@near-js/keystores-browser": "^0.0.4", - "@near-js/keystores-node": "^0.0.4", - "@near-js/providers": "^0.0.6", - "near-api-js": "^2.1.3", - "prop-types": "^15.8.1", - "react": "^18.1.0", - "react-dom": "^18.1.0", - "regenerator-runtime": "^0.13.9" - }, - "resolutions": { - "@babel/preset-env": "7.13.8" - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - } -} diff --git a/packages/docs/tutorials/trial-accounts/guest-book/start.sh b/packages/docs/tutorials/trial-accounts/guest-book/start.sh deleted file mode 100755 index be99c6aac..000000000 --- a/packages/docs/tutorials/trial-accounts/guest-book/start.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -GREEN='\033[1;32m' -NC='\033[0m' # No Color - -CONTRACT_ACCOUNT_FILE="contract.env" - -start () { - echo The app is starting! - env-cmd -f $CONTRACT_ACCOUNT_FILE parcel index.html --open -} - -alert () { - echo "======================================================" - echo "It looks like you forgot to deploy your contract" - echo ">> Run ${GREEN}'npm run deploy'${NC} from the 'root' directory" - echo "======================================================" -} - -if [ -f "$CONTRACT_ACCOUNT_FILE" ]; then - start -else - alert -fi From e86904d4e6130b97fcf4a131e109f2c62bde893c Mon Sep 17 00:00:00 2001 From: BenKurrek Date: Wed, 24 May 2023 14:59:45 -0400 Subject: [PATCH 12/12] revert tests --- packages/core/test/creation.test.js | 509 +++++++++++++--------------- 1 file changed, 244 insertions(+), 265 deletions(-) diff --git a/packages/core/test/creation.test.js b/packages/core/test/creation.test.js index a67c99ff5..af60e13fd 100644 --- a/packages/core/test/creation.test.js +++ b/packages/core/test/creation.test.js @@ -10,7 +10,6 @@ const { connect, Near } = require("@near-js/wallet-account"); const keypom = require('../lib'); const { Account } = require('@near-js/accounts'); const { parseNearAmount } = require('@near-js/utils'); -const { getKeyTotalSupply } = require('../lib/lib/views'); const { execute, initKeypom, @@ -26,8 +25,8 @@ const { addToBalance } = keypom; -const NETWORK_ID = 'mainnet'; -const funderAccountId = 'keypom.near'; +const NETWORK_ID = 'testnet'; +const funderAccountId = 'benjiman.testnet'; const viewAccountId = NETWORK_ID == 'mainnet' ? 'near' : 'testnet'; /// all tests @@ -38,6 +37,7 @@ test('init', async (t) => { const credentialsPath = path.join(homedir, CREDENTIALS_DIR); let keyStore = new UnencryptedFileSystemKeyStore(credentialsPath); + let nearConfig = { networkId: NETWORK_ID, keyStore: keyStore, @@ -46,277 +46,256 @@ test('init', async (t) => { helperUrl: `https://helper.${NETWORK_ID}.near.org`, explorerUrl: `https://explorer.${NETWORK_ID}.near.org`, }; + let near = new Near(nearConfig); - - + fundingAccount = new Account(near.connection, funderAccountId); + await initKeypom({ near }); + + t.true(true); +}); + +test('token drop', async (t) => { + const wallets = ['mynearwallet', 'herewallet']; + const dropName = 'My Cool Drop Name'; + const depositPerUseNEAR = 1; + const numKeys = 1; + const usesPerKey = 1; + const masterKey = 'MASTER_KEY'; + + const {dropId} = await createDrop({ + account: fundingAccount, + numKeys: 0, + config: { + usesPerKey, + usage: { + autoDeleteDrop: true, + autoWithdraw: true, + } + }, + metadata: JSON.stringify({ + dropName, + wallets + }), + depositPerUseNEAR, + }); + + let allSecretKeys = []; + // Loop through in intervals of 50 until numKeys is reached + let keysAdded = 0; + while (keysAdded < numKeys) { + const keysToAdd = Math.min(50, numKeys - keysAdded); + const {secretKeys, publicKeys} = await generateKeys({ + numKeys: keysToAdd, + rootEntropy: `${masterKey}-${dropId}`, + autoMetaNonceStart: keysAdded + }); + await addKeys({ + account: fundingAccount, + dropId, + publicKeys + }); + keysAdded += keysToAdd; + + allSecretKeys = allSecretKeys.concat(secretKeys); + } + + const {contractId} = getEnv(); + + const baseUrl = NETWORK_ID === 'testnet' ? 'https://testnet.keypom-airfoil.pages.dev/claim' : 'https://keypom.xyz/claim'; - const dropSupply = await getKeyTotalSupply(); - console.log('dropSupply: ', dropSupply) + const secretKeysStripped = allSecretKeys.map((sk) => `${baseUrl}/${contractId}/${sk.split(':')[1]}`); + + let stringToWrite = ''; + // Loop through each secret key + var i = 0; + for (const sk of secretKeysStripped) { + stringToWrite += sk + '\n'; + i++; + } + + await writeFile(path.resolve(__dirname, 'token_links.json'), stringToWrite); - const fundingAccount = new Account(near.connection, funderAccountId); - const {keys} = await createDrop({ + t.true(true); +}); + +test('NFT drop', async (t) => { + const wallets = ["mynearwallet", "herewallet"]; + const dropName = "My Cool Drop Name"; + const depositPerUseNEAR = 0.1; + const numKeys = 50; + const usesPerKey = 1; + const masterKey = "MASTER_KEY"; + + const nftTitle = "Moon NFT!"; + const nftDescription = "A cool NFT for the best dog in the world."; + const nftMediaIPFSHash = "bafybeibwhlfvlytmttpcofahkukuzh24ckcamklia3vimzd4vkgnydy7nq"; + + const {dropId} = await createDrop({ account: fundingAccount, - numKeys: 1, - depositPerUseNEAR: 1 + numKeys: 0, + metadata: JSON.stringify({ + dropName, + wallets + }), + config: { + usesPerKey + }, + depositPerUseNEAR, + fcData: { + methods: [[ + { + receiverId: `nft-v2.keypom.${viewAccountId}`, + methodName: "nft_mint", + args: "", + dropIdField: "mint_id", + accountIdField: "receiver_id", + attachedDeposit: parseNearAmount("0.008") + } + ]] + } }) - console.log('keys: ', keys) - t.true(true); + let allSecretKeys = []; + // Loop through in intervals of 50 until numKeys is reached + let keysAdded = 0; + while (keysAdded < numKeys) { + const keysToAdd = Math.min(50, numKeys - keysAdded); + const {secretKeys, publicKeys} = await generateKeys({ + numKeys: keysToAdd, + rootEntropy: `${masterKey}-${dropId}`, + autoMetaNonceStart: keysAdded + }) + await addKeys({ + account: fundingAccount, + dropId, + publicKeys + }) + keysAdded += keysToAdd; + + allSecretKeys = allSecretKeys.concat(secretKeys); + } + + await keypom.createNFTSeries({ + account: fundingAccount, + dropId, + metadata: { + title: nftTitle, + description: nftDescription, + media: nftMediaIPFSHash + } + }); + + const {contractId} = getEnv(); + + const baseUrl = NETWORK_ID === "testnet" ? `https://testnet.keypom-airfoil.pages.dev/claim` : `https://keypom.xyz/claim` + + const secretKeysStripped = allSecretKeys.map((sk) => `${baseUrl}/${contractId}#${sk.split(":")[1]}`) + + let stringToWrite = "" + // Loop through each secret key + var i = 0; + for (const sk of secretKeysStripped) { + stringToWrite += sk + "\n"; + i++; + } + + await writeFile(path.resolve(__dirname, `nft_links.json`), stringToWrite); + + t.true(true); }); -// test('token drop', async (t) => { -// const wallets = ['mynearwallet', 'herewallet']; -// const dropName = 'My Cool Drop Name'; -// const depositPerUseNEAR = 1; -// const numKeys = 1; -// const usesPerKey = 1; -// const masterKey = 'MASTER_KEY'; - -// const {dropId} = await createDrop({ -// account: fundingAccount, -// numKeys: 0, -// config: { -// usesPerKey, -// usage: { -// autoDeleteDrop: true, -// autoWithdraw: true, -// } -// }, -// metadata: JSON.stringify({ -// dropName, -// wallets -// }), -// fcData: { -// methods: [[ -// { -// receiverId: NETWORK_ID === 'testnet' ? 'v1.social08.testnet' : 'social.near', -// methodName: "storage_deposit", -// args: JSON.stringify({}), -// accountIdField: "account_id", -// attachedDeposit: parseNearAmount("0.1") -// } -// ]] -// }, -// depositPerUseNEAR, -// }); - -// let allSecretKeys = []; -// // Loop through in intervals of 50 until numKeys is reached -// let keysAdded = 0; -// while (keysAdded < numKeys) { -// const keysToAdd = Math.min(50, numKeys - keysAdded); -// const {secretKeys, publicKeys} = await generateKeys({ -// numKeys: keysToAdd, -// rootEntropy: `${masterKey}-${dropId}`, -// autoMetaNonceStart: keysAdded -// }); -// await addKeys({ -// account: fundingAccount, -// dropId, -// publicKeys -// }); -// keysAdded += keysToAdd; - -// allSecretKeys = allSecretKeys.concat(secretKeys); -// } - -// const {contractId} = getEnv(); - -// const baseUrl = NETWORK_ID === 'testnet' ? 'https://testnet.mynearwallet.com/linkdrop' : 'https://localhost:1234/linkdrop'; - -// const secretKeysStripped = allSecretKeys.map((sk) => `${baseUrl}/${contractId}/${sk.split(':')[1]}`); - -// let stringToWrite = ''; -// // Loop through each secret key -// var i = 0; -// for (const sk of secretKeysStripped) { -// stringToWrite += sk + '\n'; -// i++; -// } - -// await writeFile(path.resolve(__dirname, 'token_links.json'), stringToWrite); - -// t.true(true); -// }); - -// test('NFT drop', async (t) => { -// const wallets = ["mynearwallet", "herewallet"]; -// const dropName = "My Cool Drop Name"; -// const depositPerUseNEAR = 0.1; -// const numKeys = 50; -// const usesPerKey = 1; -// const masterKey = "MASTER_KEY"; - -// const nftTitle = "Moon NFT!"; -// const nftDescription = "A cool NFT for the best dog in the world."; -// const nftMediaIPFSHash = "bafybeibwhlfvlytmttpcofahkukuzh24ckcamklia3vimzd4vkgnydy7nq"; - -// const {dropId} = await createDrop({ -// account: fundingAccount, -// numKeys: 0, -// metadata: JSON.stringify({ -// dropName, -// wallets -// }), -// config: { -// usesPerKey -// }, -// depositPerUseNEAR, -// fcData: { -// methods: [[ -// { -// receiverId: `nft-v2.keypom.${viewAccountId}`, -// methodName: "nft_mint", -// args: "", -// dropIdField: "mint_id", -// accountIdField: "receiver_id", -// attachedDeposit: parseNearAmount("0.008") -// } -// ]] -// } -// }) - -// let allSecretKeys = []; -// // Loop through in intervals of 50 until numKeys is reached -// let keysAdded = 0; -// while (keysAdded < numKeys) { -// const keysToAdd = Math.min(50, numKeys - keysAdded); -// const {secretKeys, publicKeys} = await generateKeys({ -// numKeys: keysToAdd, -// rootEntropy: `${masterKey}-${dropId}`, -// autoMetaNonceStart: keysAdded -// }) -// await addKeys({ -// account: fundingAccount, -// dropId, -// publicKeys -// }) -// keysAdded += keysToAdd; - -// allSecretKeys = allSecretKeys.concat(secretKeys); -// } - -// await keypom.createNFTSeries({ -// account: fundingAccount, -// dropId, -// metadata: { -// title: nftTitle, -// description: nftDescription, -// media: nftMediaIPFSHash -// } -// }); - -// const {contractId} = getEnv(); - -// const baseUrl = NETWORK_ID === "testnet" ? `https://testnet.keypom-airfoil.pages.dev/claim` : `https://keypom.xyz/claim` - -// const secretKeysStripped = allSecretKeys.map((sk) => `${baseUrl}/${contractId}#${sk.split(":")[1]}`) - -// let stringToWrite = "" -// // Loop through each secret key -// var i = 0; -// for (const sk of secretKeysStripped) { -// stringToWrite += sk + "\n"; -// i++; -// } - -// await writeFile(path.resolve(__dirname, `nft_links.json`), stringToWrite); - -// t.true(true); -// }); - -// test('Ticket drops', async (t) => { -// const wallets = ["mynearwallet", "herewallet"]; -// const dropName = "My Cool Drop Name"; -// const depositPerUseNEAR = 0.1; -// const numKeys = 50; -// const usesPerKey = 3; -// const masterKey = "MASTER_KEY"; +test('Ticket drops', async (t) => { + const wallets = ["mynearwallet", "herewallet"]; + const dropName = "My Cool Drop Name"; + const depositPerUseNEAR = 0.1; + const numKeys = 50; + const usesPerKey = 3; + const masterKey = "MASTER_KEY"; -// const eventPassword = "event-password"; -// const nftTitle = "Moon NFT!"; -// const nftDescription = "A cool NFT for the best dog in the world."; -// const nftMediaIPFSHash = "bafybeibwhlfvlytmttpcofahkukuzh24ckcamklia3vimzd4vkgnydy7nq"; - -// const {dropId} = await createDrop({ -// account: fundingAccount, -// numKeys: 0, -// metadata: JSON.stringify({ -// dropName, -// wallets -// }), -// config: { -// usesPerKey -// }, -// depositPerUseNEAR, -// fcData: { -// methods: [ -// null, -// null, -// [ -// { -// receiverId: `nft-v2.keypom.${viewAccountId}`, -// methodName: "nft_mint", -// args: "", -// dropIdField: "mint_id", -// accountIdField: "receiver_id", -// attachedDeposit: parseNearAmount("0.008") -// } -// ] -// ] -// } -// }) - -// let allSecretKeys = []; -// // Loop through in intervals of 50 until numKeys is reached -// let keysAdded = 0; -// while (keysAdded < numKeys) { -// const keysToAdd = Math.min(50, numKeys - keysAdded); -// const {secretKeys, publicKeys} = await generateKeys({ -// numKeys: keysToAdd, -// rootEntropy: `${masterKey}-${dropId}`, -// autoMetaNonceStart: keysAdded -// }) -// await addKeys({ -// account: fundingAccount, -// dropId, -// publicKeys, -// basePassword: eventPassword, -// passwordProtectedUses: [2] -// }) -// keysAdded += keysToAdd; - -// allSecretKeys = allSecretKeys.concat(secretKeys); -// } - -// await keypom.createNFTSeries({ -// account: fundingAccount, -// dropId, -// metadata: { -// title: nftTitle, -// description: nftDescription, -// media: nftMediaIPFSHash -// } -// }); - -// const {contractId} = getEnv(); - -// const baseUrl = NETWORK_ID === "testnet" ? `https://testnet.keypom-airfoil.pages.dev/claim` : `https://keypom.xyz/claim` - -// const secretKeysStripped = allSecretKeys.map((sk) => `${baseUrl}/${contractId}#${sk.split(":")[1]}`) - -// let stringToWrite = "" -// // Loop through each secret key -// var i = 0; -// for (const sk of secretKeysStripped) { -// stringToWrite += sk + "\n"; -// i++; -// } - -// await writeFile(path.resolve(__dirname, `ticket_links.json`), stringToWrite); - -// t.true(true); -// }); \ No newline at end of file + const eventPassword = "event-password"; + const nftTitle = "Moon NFT!"; + const nftDescription = "A cool NFT for the best dog in the world."; + const nftMediaIPFSHash = "bafybeibwhlfvlytmttpcofahkukuzh24ckcamklia3vimzd4vkgnydy7nq"; + + const {dropId} = await createDrop({ + account: fundingAccount, + numKeys: 0, + metadata: JSON.stringify({ + dropName, + wallets + }), + config: { + usesPerKey + }, + depositPerUseNEAR, + fcData: { + methods: [ + null, + null, + [ + { + receiverId: `nft-v2.keypom.${viewAccountId}`, + methodName: "nft_mint", + args: "", + dropIdField: "mint_id", + accountIdField: "receiver_id", + attachedDeposit: parseNearAmount("0.008") + } + ] + ] + } + }) + + let allSecretKeys = []; + // Loop through in intervals of 50 until numKeys is reached + let keysAdded = 0; + while (keysAdded < numKeys) { + const keysToAdd = Math.min(50, numKeys - keysAdded); + const {secretKeys, publicKeys} = await generateKeys({ + numKeys: keysToAdd, + rootEntropy: `${masterKey}-${dropId}`, + autoMetaNonceStart: keysAdded + }) + await addKeys({ + account: fundingAccount, + dropId, + publicKeys, + basePassword: eventPassword, + passwordProtectedUses: [2] + }) + keysAdded += keysToAdd; + + allSecretKeys = allSecretKeys.concat(secretKeys); + } + + await keypom.createNFTSeries({ + account: fundingAccount, + dropId, + metadata: { + title: nftTitle, + description: nftDescription, + media: nftMediaIPFSHash + } + }); + + const {contractId} = getEnv(); + + const baseUrl = NETWORK_ID === "testnet" ? `https://testnet.keypom-airfoil.pages.dev/claim` : `https://keypom.xyz/claim` + + const secretKeysStripped = allSecretKeys.map((sk) => `${baseUrl}/${contractId}#${sk.split(":")[1]}`) + + let stringToWrite = "" + // Loop through each secret key + var i = 0; + for (const sk of secretKeysStripped) { + stringToWrite += sk + "\n"; + i++; + } + + await writeFile(path.resolve(__dirname, `ticket_links.json`), stringToWrite); + + t.true(true); +}); \ No newline at end of file